package com.dji.sample.control.service.impl; import com.dji.sample.common.util.SpringBeanUtilsTest; import com.dji.sample.control.model.param.DronePayloadParam; import com.dji.sample.manage.model.dto.DeviceDTO; import com.dji.sample.manage.service.IDevicePayloadService; import com.dji.sample.manage.service.IDeviceRedisService; import com.dji.sdk.cloudapi.device.OsdCamera; import com.dji.sdk.cloudapi.device.OsdDockDrone; import java.util.Optional; /** * @author sean * @version 1.4 * @date 2023/4/23 */ public abstract class PayloadCommandsHandler { DronePayloadParam param; OsdCamera osdCamera; PayloadCommandsHandler(DronePayloadParam param) { this.param = param; } public boolean valid() { return true; } public boolean canPublish(String deviceSn) { Optional deviceOpt = SpringBeanUtilsTest.getBean(IDeviceRedisService.class) .getDeviceOsd(deviceSn, OsdDockDrone.class); if (deviceOpt.isEmpty()) { throw new RuntimeException("The device is offline."); } osdCamera = deviceOpt.get().getCameras().stream() .filter(osdCamera -> param.getPayloadIndex().equals(osdCamera.getPayloadIndex().toString())) .findAny() .orElseThrow(() -> new RuntimeException("Did not receive osd information about the camera, please check the cache data.")); return true; } private String checkDockOnline(String dockSn) { Optional deviceOpt = SpringBeanUtilsTest.getBean(IDeviceRedisService.class).getDeviceOnline(dockSn); if (deviceOpt.isEmpty()) { throw new RuntimeException("The dock is offline."); } return deviceOpt.get().getChildDeviceSn(); } private void checkDeviceOnline(String deviceSn) { boolean isOnline = SpringBeanUtilsTest.getBean(IDeviceRedisService.class).checkDeviceOnline(deviceSn); if (!isOnline) { throw new RuntimeException("The device is offline."); } } private void checkAuthority(String deviceSn) { boolean hasAuthority = SpringBeanUtilsTest.getBean(IDevicePayloadService.class) .checkAuthorityPayload(deviceSn, param.getPayloadIndex()); if (!hasAuthority) { throw new RuntimeException("The device does not have payload control authority."); } } public final void checkCondition(String dockSn) { if (!valid()) { throw new RuntimeException("illegal argument"); } String deviceSn = checkDockOnline(dockSn); checkDeviceOnline(deviceSn); checkAuthority(deviceSn); if (!canPublish(deviceSn)) { throw new RuntimeException("The current state of the drone does not support this function, please try again later."); } } }