From 55be62c63d9faedb48d47dd1c18cf1a74e3eea6c Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Wed, 15 Nov 2023 17:15:35 +0800
Subject: [PATCH] 图斑多点飞行,拍照

---
 src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java    |    4 +-
 src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java           |    3 +
 src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java |   22 ++++-------
 src/main/java/com/dji/sample/control/service/IControlService.java            |   12 +++++
 src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java         |    2 
 src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java    |   63 ++++++++++++++++++++++++++-----
 6 files changed, 78 insertions(+), 28 deletions(-)

diff --git a/src/main/java/com/dji/sample/control/service/IControlService.java b/src/main/java/com/dji/sample/control/service/IControlService.java
index ac49f0e..dfe0a7c 100644
--- a/src/main/java/com/dji/sample/control/service/IControlService.java
+++ b/src/main/java/com/dji/sample/control/service/IControlService.java
@@ -43,7 +43,7 @@
      * @param headers
      * @return
      */
-    CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers);
+    CommonTopicReceiver handleFlyToPointProgress(CommonTopicReceiver receiver, MessageHeaders headers) throws Exception;
 
     /**
      * Control the drone to take off.
@@ -63,6 +63,7 @@
 
     /**
      * Seize the control authority of the drone or the payload control authority.
+     * 抢占无人机控制权限或有效载荷控制权限
      * @param sn
      * @param authority
      * @param param
@@ -79,4 +80,13 @@
 
     ResponseResult requestsConfig(String sn,String method, RequestsParam param);
 
+    /**
+     * 拍照
+     * @param sn
+     * @param payloadIndex
+     * @return
+     * @throws Exception
+     */
+     ResponseResult takePhoto(String sn,String payloadIndex) throws Exception;
+
 }
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..c186883 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;
@@ -189,7 +187,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);
@@ -213,13 +211,14 @@
             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, dockSn, payloadIndex);
             }
         }
         return receiver;
     }
 
-    private ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn) {
+    private ResponseResult flyToNextPoint(List<PointPOJO> targetList, int curIndex, String sn, String payloadIndex) throws Exception {
         curIndex = curIndex + 1;
         //当无人机状态为人工时再发布下一个命令
         while (true) {
@@ -234,8 +233,7 @@
                     RedisOpsUtils.del("tuban:" + sn);
 
                     return returnHome;
-                }
-                else {
+                } else {
                     //当前不是最后一个点,飞行到下一个点
                     FlyToPointParam flyToPointParam = new FlyToPointParam();
                     flyToPointParam.setMaxSpeed(14);
@@ -248,22 +246,67 @@
                     pointDTOS.add(pointDTO);
                     flyToPointParam.setPoints(pointDTOS);
 
+                    //执行拍照
+                    ResponseResult responseResult = takePhoto(sn, payloadIndex);
 
+                    //发布下一个飞行指令
                     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;
+    }
+
 
     private void checkTakeoffCondition(String dockSn) {
         Optional<DeviceDTO> dockOpt = deviceRedisService.getDeviceOnline(dockSn);
diff --git a/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java b/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
index 455ef03..58e73d7 100644
--- a/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
+++ b/src/main/java/com/dji/sample/wayline/controller/WaylineJobController.java
@@ -191,7 +191,7 @@
      */
     @PostMapping("/{sn}/jobs/{device_sn}/flyByArea")
     @SysLogAnnotation(operModul = "根据区域飞行", operType = "根据区域飞行", operDesc = "根据区域飞行")
-    public ResponseResult flyByArea(@PathVariable(name = "sn") String sn, @RequestBody FlyAreaParam flyAreaParam,@PathVariable(name = "device_sn")String deviceSn) {
-        return waylineJobService.flyByArea(sn, flyAreaParam,deviceSn);
+    public ResponseResult flyByArea(@PathVariable(name = "sn") String sn, @RequestBody FlyAreaParam flyAreaParam,@PathVariable(name = "device_sn")String deviceSn)throws Exception {
+            return waylineJobService.flyByArea(sn, flyAreaParam,deviceSn);
     }
 }
diff --git a/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java b/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java
index d477347..29798bc 100644
--- a/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java
+++ b/src/main/java/com/dji/sample/wayline/model/param/FlyAreaParam.java
@@ -18,4 +18,7 @@
     private  Double radius;
     @JsonProperty(value = "jsonPath")
     private String jsonPath;
+
+    @JsonProperty(value = "payloadIndex")
+    private String payloadIndex;
 }
diff --git a/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java b/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java
index f99ab2c..66093fe 100644
--- a/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java
+++ b/src/main/java/com/dji/sample/wayline/service/IWaylineJobService.java
@@ -168,7 +168,7 @@
 
     void updateJobCollect(WaylineJobEntity waylineJob);
 
-    ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam,String deviceSn);
+    ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam,String deviceSn) throws Exception;
 
     /**
      * 判断是否有下一次任务
diff --git a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
index a009206..0d2d1a7 100644
--- a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
+++ b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
@@ -12,14 +12,16 @@
 import com.dji.sample.common.model.Pagination;
 import com.dji.sample.common.model.PaginationData;
 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;
 import com.dji.sample.component.redis.RedisOpsUtils;
 import com.dji.sample.control.model.dto.PointDTO;
-import com.dji.sample.control.model.param.DrcModeParam;
-import com.dji.sample.control.model.param.FlyToPointParam;
-import com.dji.sample.control.model.param.TakeoffToPointParam;
+import com.dji.sample.control.model.enums.CameraModeEnum;
+import com.dji.sample.control.model.enums.DroneAuthorityEnum;
+import com.dji.sample.control.model.enums.PayloadCommandsEnum;
+import com.dji.sample.control.model.param.*;
 import com.dji.sample.control.service.IControlService;
 import com.dji.sample.control.service.IDrcService;
 import com.dji.sample.geo.entity.GeoJson;
@@ -701,7 +703,7 @@
     }
 
     @Override
-    public ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam, String deviceSn) {
+    public ResponseResult flyByArea(String sn, FlyAreaParam flyAreaParam, String deviceSn) throws Exception {
 
         //获取所有中心点
 //        List<PointPOJO> targetList = GeoUtils.caculatePointList(flyAreaParam);
@@ -738,25 +740,17 @@
 
                 if (flyToRes.getCode() == ResponseResult.CODE_SUCCESS) {
                     //第一个点指令飞行成功后,把数组存到redis中
-                    /**
-                     * {
-                     *      targetList:[],
-                     *      curIndex:
-                     * }
-                     */
-
                     JSONObject jsonObject = new JSONObject();
                     jsonObject.put("targetList",targetList);
+                    jsonObject.put("payloadIndex",flyAreaParam.getPayloadIndex());
                     jsonObject.put("curIndex",0);
-
-
                     RedisOpsUtils.set("tuban:"+sn,jsonObject);
                 }
                 break;
             }
         }
 
-        return ResponseResult.success();
+        return ResponseResult.success(targetList);
     }
 
     public TakeoffToPointParam buildTakeoffToPointParam(PointPOJO dockPoint) {

--
Gitblit v1.9.3