package com.dji.sample.control.controller; import com.dji.sample.common.model.ResponseResult; import com.dji.sample.component.redis.RedisConst; import com.dji.sample.component.redis.RedisOpsUtils; 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.log.aspect.SysLogAnnotation; import com.dji.sample.manage.model.dto.CapacityCameraDTO; import com.dji.sample.manage.model.dto.DeviceDTO; import com.dji.sample.manage.model.enums.DeviceModeCodeEnum; import com.dji.sample.manage.model.param.DeviceQueryParam; import com.dji.sample.manage.model.receiver.OsdCameraReceiver; import com.dji.sample.manage.model.receiver.OsdDockReceiver; import com.dji.sample.manage.model.receiver.OsdSubDeviceReceiver; import com.dji.sample.manage.service.ICapacityCameraService; import com.dji.sample.manage.service.IDeviceService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; import java.util.Objects; import java.util.Optional; /** * @author sean * @version 1.2 * @date 2022/7/29 */ @RestController @Slf4j @RequestMapping("${url.control.prefix}${url.control.version}/devices") public class DockController { @Autowired private IControlService controlService; @Autowired private ICapacityCameraService capacityCameraService; @Autowired private IDeviceService deviceService; @PostMapping("/{sn}/jobs/{service_identifier}") @SysLogAnnotation(operModul = "机场控制", operType = "控制指令", operDesc = "控制指令") public ResponseResult createControlJob(@PathVariable String sn, @PathVariable("service_identifier") String serviceIdentifier, @RequestBody(required = false) RemoteDebugParam param) { return controlService.controlDockDebug(sn, serviceIdentifier, param); } @PostMapping("/{sn}/jobs/fly-to-point") @SysLogAnnotation(operModul = "机场控制", operType = "控制指令", operDesc = "起飞") public ResponseResult flyToPoint(@PathVariable String sn, @Valid @RequestBody FlyToPointParam param) { return controlService.flyToPoint(sn, param); } @DeleteMapping("/{sn}/jobs/fly-to-point") @SysLogAnnotation(operModul = "机场控制", operType = "控制指令", operDesc = "停止起飞") public ResponseResult flyToPointStop(@PathVariable String sn) { return controlService.flyToPointStop(sn); } @PostMapping("/{sn}/jobs/takeoff-to-point") @SysLogAnnotation(operModul = "机场控制", operType = "控制指令", operDesc = "一键起飞") public ResponseResult takeoffToPoint(@PathVariable String sn, @Valid @RequestBody TakeoffToPointParam param) { return controlService.takeoffToPoint(sn, param); } @PostMapping("/{sn}/authority/flight") public ResponseResult seizeFlightAuthority(@PathVariable String sn) { return controlService.seizeAuthority(sn, DroneAuthorityEnum.FLIGHT, null); } @PostMapping("/{sn}/authority/payload") @SysLogAnnotation(operModul = "机场控制", operType = "控制指令", operDesc = "负载控制") public ResponseResult seizePayloadAuthority(@PathVariable String sn, @Valid @RequestBody DronePayloadParam param) { return controlService.seizeAuthority(sn, DroneAuthorityEnum.PAYLOAD, param); } @PostMapping("/{sn}/payload/commands") @SysLogAnnotation(operModul = "机场控制", operType = "控制指令", operDesc = "相机模式开关") public ResponseResult payloadCommands(@PathVariable String sn, @Valid @RequestBody PayloadCommandsParam param) throws Exception { param.setSn(sn); return controlService.payloadCommands(param); } @GetMapping("/{sn}/payload/photoAndVideoCmd/{type}") @SysLogAnnotation(operModul = "云台拍照录像控制", operType = "控制指令", operDesc = "云台拍照录像控制") public ResponseResult photoAndVideoCmd(@PathVariable String sn, @PathVariable String type) throws Exception { List list = deviceService.getDevicesByParams(DeviceQueryParam.builder().deviceSn(sn).build()); if (list.isEmpty()) { return ResponseResult.error("机场离线!"); } DeviceDTO deviceDTO = list.get(0); //无人机设备相机信息 String key = RedisConst.OSD_PREFIX + deviceDTO.getChildDeviceSn(); OsdSubDeviceReceiver redisData = (OsdSubDeviceReceiver) RedisOpsUtils.get(key); log.info("无人机设备相机信息osd:{}",redisData); if (null == redisData) { return ResponseResult.error("无人机设备离线!"); } //无人机osd信息 List osdCameraReceiverList = redisData.getCameras(); OsdCameraReceiver cameraDTO = osdCameraReceiverList.get(0); //获取负载控制 ResponseResult result = getPayload(sn,cameraDTO); log.info("获取负载:{}",result); if (result.getCode() != 0) { return result; } PayloadCommandsParam param = new PayloadCommandsParam(); param.setSn(sn); DronePayloadParam data = new DronePayloadParam(); data.setPayloadIndex(cameraDTO.getPayloadIndex()); //拍照 switch (type) { case "photo": if (!Objects.equals(cameraDTO.getCameraMode().getMode(), CameraModeEnum.PHOTO.getMode())) { //切换模式 ResponseResult swResult = switchingMode(sn, CameraModeEnum.PHOTO, cameraDTO); log.info("摄像头切换状态:{}", swResult); } param.setCmd(PayloadCommandsEnum.CAMERA_PHOTO_TAKE); param.setData(data); break; case "video_start": {//开始录像 if (Objects.equals(cameraDTO.getCameraMode().getMode(), CameraModeEnum.PHOTO.getMode())) { //切换模式 ResponseResult swResult = switchingMode(sn, CameraModeEnum.VIDEO, cameraDTO); log.info("摄像头切换状态:{}", swResult); } param.setCmd(PayloadCommandsEnum.CAMERA_RECORDING_START); param.setData(data); break; } case "video_stop": {//结束录像 if (Objects.equals(cameraDTO.getCameraMode().getMode(), CameraModeEnum.PHOTO.getMode())) { //切换模式 ResponseResult swResult = switchingMode(sn, CameraModeEnum.VIDEO, cameraDTO); log.info("摄像头切换状态:{}", swResult); } param.setCmd(PayloadCommandsEnum.CAMERA_RECORDING_STOP); param.setData(data); break; } default: return ResponseResult.error(-1, "未知类型!"); } return controlService.payloadCommands(param); } /** * 获取负载权限 * @param sn 无人机设备号 * @return */ private ResponseResult getPayload(String sn,OsdCameraReceiver cameraDTO) { DronePayloadParam param = new DronePayloadParam(); param.setPayloadIndex(cameraDTO.getPayloadIndex()); return controlService.seizeAuthority(sn, DroneAuthorityEnum.PAYLOAD, param);//获取无人机负载权限 } /** * 负载模式切换 * @param sn 无人机设备号 * @param mode 模式 相机或者录像模式 * @param cameraDTO 相机数据 * @return * @throws Exception */ private ResponseResult switchingMode(String sn, CameraModeEnum mode, OsdCameraReceiver cameraDTO) throws Exception { PayloadCommandsParam param = new PayloadCommandsParam(); param.setSn(sn); param.setCmd(PayloadCommandsEnum.CAMERA_MODE_SWitCH); DronePayloadParam data = new DronePayloadParam(); data.setPayloadIndex(cameraDTO.getPayloadIndex()); data.setCameraMode(mode); param.setData(data); return controlService.payloadCommands(param); } }