From 05bff5b7413a83aade55fcc6eb63ae44bc9bb3c9 Mon Sep 17 00:00:00 2001
From: aix <vip_xiaobin810@163.com>
Date: Thu, 15 Aug 2024 20:20:37 +0800
Subject: [PATCH] 拍照录像接口调整

---
 src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java |  105 +++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 90 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
index 3cee5df..322dc99 100644
--- a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
+++ b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.dji.sample.common.error.CommonErrorEnum;
 import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.common.util.SpringBeanUtils;
 import com.dji.sample.component.mqtt.model.*;
 import com.dji.sample.component.mqtt.service.IMessageSenderService;
 import com.dji.sample.component.redis.RedisConst;
@@ -13,10 +14,7 @@
 import com.dji.sample.control.model.dto.PointDTO;
 import com.dji.sample.control.model.dto.ResultNotifyDTO;
 import com.dji.sample.control.model.dto.TakeoffProgressReceiver;
-import com.dji.sample.control.model.enums.DroneAuthorityEnum;
-import com.dji.sample.control.model.enums.DroneControlMethodEnum;
-import com.dji.sample.control.model.enums.FlyToStatusEnum;
-import com.dji.sample.control.model.enums.RemoteDebugMethodEnum;
+import com.dji.sample.control.model.enums.*;
 import com.dji.sample.control.model.param.*;
 import com.dji.sample.control.service.IControlService;
 import com.dji.sample.manage.model.dto.DeviceDTO;
@@ -35,6 +33,7 @@
 import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.messaging.MessageHeaders;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.util.*;
 
@@ -102,6 +101,16 @@
             RedisOpsUtils.setWithExpire(serviceIdentifier + RedisConst.DELIMITER + bid, sn,
                     RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND);
         }
+
+        //当执行返航指令时,删除图斑redis
+        if (serviceIdentifier == "return_home"){
+            if (RedisOpsUtils.checkExist("tuban:" + sn)){
+                RedisOpsUtils.del("tuban:" + sn);
+            }
+        }
+
+
+
         return ResponseResult.success();
     }
 
@@ -189,7 +198,7 @@
     }
 
     @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_FLY_TO_POINT_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS)
-    public CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) {
+    public CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) throws Exception {
         String dockSn = receiver.getGateway();
 
         Optional<DeviceDTO> deviceOpt = deviceRedisService.getDeviceOnline(dockSn);
@@ -207,26 +216,32 @@
                                 eventsReceiver.getStatus().getMessage() : eventsReceiver.getResult().getErrorMsg())
                         .result(eventsReceiver.getResult().getErrorCode())
                         .build());
-
+        //当飞向目标点成功后
         if (eventsReceiver.getStatus().equals(FlyToStatusEnum.WAYLINE_OK)) {
             JSONObject jsonObject = (JSONObject) RedisOpsUtils.get("tuban:" + dockSn);
             if (jsonObject != null) {
                 List<PointPOJO> targetList = (List<PointPOJO>) jsonObject.get("targetList");
                 int curIndex = (Integer) jsonObject.get("curIndex");
-                flyToNextPoint(targetList, curIndex, dockSn);
+                String payloadIndex = jsonObject.getString("payloadIndex");
+                flyToNextPoint(targetList, curIndex+1, dockSn, payloadIndex);
             }
         }
         return receiver;
     }
 
-    private ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn) {
-        curIndex = curIndex + 1;
+    @Override
+    public ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn, String payloadIndex) throws Exception {
         //当无人机状态为人工时再发布下一个命令
         while (true) {
             Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(sn);
             DeviceModeCodeEnum deviceMode = deviceService.getDeviceMode(dockOpt.get().getChildDeviceSn());
 
             if (DeviceModeCodeEnum.MANUAL == deviceMode) {
+
+                //执行拍照
+                ResponseResult responseResult = takePhoto(sn, payloadIndex);
+
+                //发布飞行指令
                 if (curIndex == targetList.size()) {
                     //当前是最后一个点,返航
                     ResponseResult returnHome = controlDockDebug(sn, "return_home", null);
@@ -234,8 +249,7 @@
                     RedisOpsUtils.del("tuban:" + sn);
 
                     return returnHome;
-                }
-                else {
+                } else {
                     //当前不是最后一个点,飞行到下一个点
                     FlyToPointParam flyToPointParam = new FlyToPointParam();
                     flyToPointParam.setMaxSpeed(14);
@@ -248,20 +262,62 @@
                     pointDTOS.add(pointDTO);
                     flyToPointParam.setPoints(pointDTOS);
 
-
+                    //发布下一个飞行指令
                     ResponseResult flyToRes = flyToPoint(sn, flyToPointParam);
                     if (flyToRes.getCode() == ResponseResult.CODE_SUCCESS) {
                         JSONObject jsonObject = new JSONObject();
                         jsonObject.put("targetList", targetList);
                         jsonObject.put("curIndex", curIndex);
+                        jsonObject.put("payloadIndex",payloadIndex);
                         RedisOpsUtils.set("tuban:" + sn, jsonObject);
                     }
                     return flyToRes;
 
-
                 }
             }
         }
+    }
+
+    @Override
+    public ResponseResult takePhoto(String sn, String payloadIndex) throws Exception {
+
+        //获取负载控制权
+        DronePayloadParam dronePayloadParam = new DronePayloadParam();
+        dronePayloadParam.setPayloadIndex(payloadIndex);
+
+        ResponseResult seizeAuthorityRes = seizeAuthority(sn, DroneAuthorityEnum.PAYLOAD, dronePayloadParam);
+
+        //切换为相机模式
+        if (seizeAuthorityRes.getCode() != ResponseResult.CODE_SUCCESS) {
+            return seizeAuthorityRes;
+        }
+
+        PayloadCommandsParam payloadCommandsParam = new PayloadCommandsParam();
+
+//            DronePayloadParam switchParam = new DronePayloadParam();
+//            switchParam.setCameraMode(CameraModeEnum.PHOTO);
+//            switchParam.setPayloadIndex(payloadIndex);
+
+//            payloadCommandsParam.setSn(sn);
+//            payloadCommandsParam.setCmd(PayloadCommandsEnum.CAMERA_MODE_SWitCH);
+//            payloadCommandsParam.setData(switchParam);
+//
+//            ResponseResult switchModeRes = payloadCommands(payloadCommandsParam);
+
+//            if (switchModeRes.getCode() != ResponseResult.CODE_SUCCESS){
+//                return  switchModeRes;
+//            }
+        //拍照
+        payloadCommandsParam.setCmd(PayloadCommandsEnum.CAMERA_PHOTO_TAKE);
+        DronePayloadParam takePhotoParam = new DronePayloadParam();
+        takePhotoParam.setPayloadIndex(payloadIndex);
+
+        payloadCommandsParam.setData(takePhotoParam);
+        payloadCommandsParam.setSn(sn);
+
+        ResponseResult responseResult = payloadCommands(payloadCommandsParam);
+
+        return responseResult;
     }
 
 
@@ -281,8 +337,9 @@
     @Override
     public ResponseResult takeoffToPoint(String sn, TakeoffToPointParam param) {
         checkTakeoffCondition(sn);
-
-        param.setFlightId(UUID.randomUUID().toString());
+        if (!StringUtils.hasText(param.getFlightId())){
+            param.setFlightId(UUID.randomUUID().toString());
+        }
         ServiceReply reply = messageSenderService.publishServicesTopic(sn, DroneControlMethodEnum.TAKE_OFF_TO_POINT.getMethod(), param, param.getFlightId());
         return ResponseResult.CODE_SUCCESS != reply.getResult() ?
                 ResponseResult.error("无人机起飞失败 " + reply.getResult())
@@ -360,6 +417,24 @@
     }
 
     @Override
+    public ResponseResult payloadCommands(PayloadCommandsParam param, String bid) throws Exception {
+        param.getCmd().getClazz()
+                .getDeclaredConstructor(DronePayloadParam.class)
+                .newInstance(param.getData())
+                .checkCondition(param.getSn());
+
+        Long timestamp = System.currentTimeMillis();
+
+        //拍照事件存redis
+        RedisOpsUtils.hashSet(RedisConst.COMMANDS_PREFIX + param.getSn() + RedisConst.DELIMITER + bid,bid,timestamp);
+
+        ServiceReply serviceReply = messageSenderService.publishServicesTopic(param.getSn(), param.getCmd().getCmd(), param.getData(),bid,timestamp);
+        return ResponseResult.CODE_SUCCESS != serviceReply.getResult() ?
+                ResponseResult.error(serviceReply.getResult(), "错误码:" + serviceReply.getResult())
+                : ResponseResult.success(bid);
+    }
+
+    @Override
     public ResponseResult requestsConfig(String sn, String method, RequestsParam param) {
         ServiceReply serviceReply = messageSenderService.publishRequestsTopic(sn, method, param);
         return ResponseResult.CODE_SUCCESS != serviceReply.getResult() ?

--
Gitblit v1.9.3