package com.dji.sample.wayline.service.impl; import com.dji.sample.common.model.CustomClaim; import com.dji.sample.component.oss.model.OssConfiguration; import com.dji.sample.live.service.LiveService; import com.dji.sample.wayline.model.dto.WaylineJobDTO; import com.dji.sample.wayline.model.enums.WaylineJobStatusEnum; import com.dji.sample.wayline.model.param.*; import com.dji.sample.wayline.service.IWaylineFileService; import com.dji.sample.wayline.service.IWaylineJobService; import com.dji.sample.wayline.service.WayLineService; import com.dji.sdk.cloudapi.device.ExitWaylineWhenRcLostEnum; import com.dji.sdk.cloudapi.livestream.api.AbstractLivestreamService; import com.dji.sdk.cloudapi.wayline.*; import com.dji.sdk.common.HttpResultResponse; import com.dji.sdk.common.SDKManager; import com.dji.sdk.mqtt.services.ServicesReplyData; import com.dji.sdk.mqtt.services.TopicServicesResponse; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.net.URL; import java.sql.SQLException; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Objects; import java.util.Optional; import java.util.UUID; /** * @author wmm * @version 0.1 * @date 2024/5/8 */ @Service @Slf4j public class WayLineServiceImpl implements WayLineService { @Autowired private SDKWaylineService waylineService; @Autowired private ObjectMapper mapper; @Autowired private IWaylineFileService waylineFileService; @Autowired private IWaylineJobService waylineJobService; @Override public HttpResultResponse flighttaskCreate(String sn, FlighttaskCreateParam param) { TopicServicesResponse response = waylineService.flighttaskCreate(SDKManager.getDeviceSDK(sn),mapper.convertValue(param, FlighttaskCreateRequest.class)); ServicesReplyData reply = response.getData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The flight task failed to create. " + reply.getResult()); } @Override public HttpResultResponse flighttaskPrepare(String sn, FlighttaskPrepareParam param, CustomClaim customClaim) { // get wayline file Optional waylineFile = waylineFileService.getWaylineByWaylineId(param.getFileId()); if (waylineFile.isEmpty()) { throw new RuntimeException("Wayline file doesn't exist."); } param.setFlightId(UUID.randomUUID().toString()); param.setBid(UUID.randomUUID().toString()); // get file url URL url = waylineFileService.getObjectUrl(waylineFile.get().getObjectKey()); FlighttaskPrepareRequest flightTask = new FlighttaskPrepareRequest() .setFlightId(param.getFlightId()) .setExecuteTime(param.getExecuteTime()) .setTaskType(param.getTaskType()) // .setWaylineType(param.getWaylineType()) .setRthAltitude(param.getRthAltitude()) .setOutOfControlAction(param.getOutOfControlAction()) .setExitWaylineWhenRcLost(ExitWaylineWhenRcLostEnum.EXECUTE_RC_LOST_ACTION) .setFile(new FlighttaskFile() .setUrl(url.toString().replace(OssConfiguration.endpoint,OssConfiguration.endpointSpare)) .setFingerprint(waylineFile.get().getSign())); if (TaskTypeEnum.CONDITIONAL == param.getTaskType()) { if (Objects.isNull(param.getReadyConditions())) { throw new IllegalArgumentException(); } flightTask.setReadyConditions(param.getReadyConditions()); flightTask.setExecutableConditions(param.getExecutableConditions()); } TopicServicesResponse serviceReply = waylineService.flighttaskPrepare( SDKManager.getDeviceSDK(sn), flightTask,param.getBid()); if (!serviceReply.getData().getResult().isSuccess()) { log.info("Prepare task ====> Error code: {}", serviceReply.getData().getResult()); } //update job info to dbs Optional waylineJobOpt = waylineJobService.createWaylineJob(param,sn, param.getWorkspaceId(), customClaim.getUsername(), null, null,flightTask.getFlightId()); if (waylineJobOpt.isEmpty()) { throw new RuntimeException("Failed to create wayline job."); } // WaylineJobDTO waylineJob = waylineJobOpt.get(); ServicesReplyData reply = serviceReply.getData(); // ServicesReplyData reply = new ServicesReplyData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The flight task failed to prepare. " + reply.getResult()); } @Override public HttpResultResponse flighttaskExecute(String sn, FlighttaskExecuteParam param) { FlighttaskExecuteRequest flightTask = new FlighttaskExecuteRequest() .setFlightId(param.getFlightId()); TopicServicesResponse response = waylineService.flighttaskExecute(SDKManager.getDeviceSDK(sn),flightTask,param.getBid()); ServicesReplyData reply = response.getData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The flight task failed to execute. " + reply.getResult()); } @Override public HttpResultResponse flighttaskUndo(String sn, FlighttaskUndoParam param) { TopicServicesResponse response = waylineService.flighttaskUndo(SDKManager.getDeviceSDK(sn),mapper.convertValue(param, FlighttaskUndoRequest.class)); ServicesReplyData reply = response.getData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The flight task failed to undo. " + reply.getResult()); } @Override public HttpResultResponse flighttaskPause(String sn) { TopicServicesResponse response = waylineService.flighttaskPause(SDKManager.getDeviceSDK(sn)); ServicesReplyData reply = response.getData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The flight task failed to pause. " + reply.getResult()); } @Override public HttpResultResponse flighttaskRecovery(String sn) { TopicServicesResponse response = waylineService.flighttaskRecovery(SDKManager.getDeviceSDK(sn)); ServicesReplyData reply = response.getData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The flight task failed to recovery. " + reply.getResult()); } @Override public HttpResultResponse returnHome(String sn) { TopicServicesResponse response = waylineService.returnHome(SDKManager.getDeviceSDK(sn)); ServicesReplyData reply = response.getData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The home failed to return. " + reply.getResult()); } @Override public HttpResultResponse returnHomeCancel(String sn) { TopicServicesResponse response = waylineService.returnHomeCancel(SDKManager.getDeviceSDK(sn)); ServicesReplyData reply = response.getData(); return reply.getResult().isSuccess() ? HttpResultResponse.success() : HttpResultResponse.error("The return home failed to cancel. " + reply.getResult()); } }