package com.dji.sdk.cloudapi.debug.api; import com.dji.sdk.annotations.CloudSDKVersion; import com.dji.sdk.cloudapi.debug.*; import com.dji.sdk.common.BaseModel; import com.dji.sdk.common.Common; import com.dji.sdk.common.SpringBeanUtils; import com.dji.sdk.config.version.CloudSDKVersionEnum; import com.dji.sdk.config.version.GatewayManager; import com.dji.sdk.config.version.GatewayTypeEnum; import com.dji.sdk.exception.CloudSDKException; import com.dji.sdk.mqtt.ChannelName; import com.dji.sdk.mqtt.MqttReply; import com.dji.sdk.mqtt.events.EventsDataRequest; import com.dji.sdk.mqtt.events.TopicEventsRequest; import com.dji.sdk.mqtt.events.TopicEventsResponse; import com.dji.sdk.mqtt.services.ServicesPublish; import com.dji.sdk.mqtt.services.ServicesReplyData; import com.dji.sdk.mqtt.services.TopicServicesResponse; import com.fasterxml.jackson.core.type.TypeReference; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import javax.annotation.Resource; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * @author sean * @version 1.7 * @date 2023/6/29 */ public abstract class AbstractDebugService { @Resource private ServicesPublish servicesPublish; /** * Open the debug mode * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> debugModeOpen(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.DEBUG_MODE_OPEN.getMethod()); } /** * Close the debug mode * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> debugModeClose(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.DEBUG_MODE_CLOSE.getMethod()); } /** * Open the supplement light * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> supplementLightOpen(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.SUPPLEMENT_LIGHT_OPEN.getMethod()); } /** * Close the supplement light * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> supplementLightClose(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.SUPPLEMENT_LIGHT_CLOSE.getMethod()); } /** * Maintenance state switch of battery * @param gateway * @param request data * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> batteryMaintenanceSwitch(GatewayManager gateway, BatteryMaintenanceSwitchRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.BATTERY_MAINTENANCE_SWITCH.getMethod(), request); } /** * Air conditioner working mode switch of dock * @param gateway * @param request data * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> airConditionerModeSwitch(GatewayManager gateway, AirConditionerModeSwitchRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.AIR_CONDITIONER_MODE_SWITCH.getMethod(), request); } /** * Sound and light alarm switch of dock * @param gateway * @param request data * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> alarmStateSwitch(GatewayManager gateway, AlarmStateSwitchRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.ALARM_STATE_SWITCH.getMethod(), request); } /** * Battery storage mode switch of dock * @param gateway * @param request data * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> batteryStoreModeSwitch(GatewayManager gateway, BatteryStoreModeSwitchRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.BATTERY_STORE_MODE_SWITCH.getMethod(), request); } /** * Reboot the dock * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> deviceReboot(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.DEVICE_REBOOT.getMethod()); } /** * Power on the aircraft * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> droneOpen(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.DRONE_OPEN.getMethod()); } /** * Power off the aircraft * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> droneClose(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.DRONE_CLOSE.getMethod()); } /** * Format the dock data * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> deviceFormat(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.DEVICE_FORMAT.getMethod()); } /** * Format the aircraft data * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> droneFormat(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.DRONE_FORMAT.getMethod()); } /** * Open the dock cover * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> coverOpen(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.COVER_OPEN.getMethod()); } /** * Close the dock cover * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> coverClose(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.COVER_CLOSE.getMethod()); } /** * Open the putter * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = {GatewayTypeEnum.RC, GatewayTypeEnum.DOCK2}) public TopicServicesResponse> putterOpen(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.PUTTER_OPEN.getMethod()); } /** * Close the putter * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = {GatewayTypeEnum.RC, GatewayTypeEnum.DOCK2}) public TopicServicesResponse> putterClose(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.PUTTER_CLOSE.getMethod()); } /** * Turn on charging * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> chargeOpen(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.CHARGE_OPEN.getMethod()); } /** * Turn off charging * @param gateway * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> chargeClose(GatewayManager gateway) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.CHARGE_CLOSE.getMethod()); } /** * Switch of 4G enhancement mode * @param gateway * @param request data * @return services_reply */ @CloudSDKVersion(exclude = GatewayTypeEnum.RC) public TopicServicesResponse> sdrWorkmodeSwitch(GatewayManager gateway, SdrWorkmodeSwitchRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.SDR_WORKMODE_SWITCH.getMethod(), request); } /** * Common interface for remote debugging * @param gateway * @param methodEnum * @param request data * @return services_reply */ public TopicServicesResponse> remoteDebug(GatewayManager gateway, DebugMethodEnum methodEnum, BaseModel request) { try { List clazz = new ArrayList<>(); List args = new ArrayList<>(); clazz.add(GatewayManager.class); args.add(gateway); if (Objects.nonNull(request)) { clazz.add(request.getClass()); args.add(request); } AbstractDebugService abstractDebugService = SpringBeanUtils.getBean(this.getClass()); Method method = abstractDebugService.getClass().getDeclaredMethod(Common.convertSnake(methodEnum.getMethod()), clazz.toArray(Class[]::new)); return (TopicServicesResponse>) method.invoke(abstractDebugService, args.toArray()); } catch (NoSuchMethodException | IllegalAccessException e) { throw new CloudSDKException(e); } catch (InvocationTargetException e) { throw new CloudSDKException(e.getTargetException()); } } /** * Inform of remote debug progress * @param request data * @param headers The headers for a {@link Message}. * @return events_reply */ @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, outputChannel = ChannelName.OUTBOUND_EVENTS) public TopicEventsResponse remoteDebugProgress(TopicEventsRequest> request, MessageHeaders headers) { throw new UnsupportedOperationException("remoteDebugProgress not implemented"); } /** * esim activation * @param gateway gateway device * @param request data * @return services_reply */ @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2) public TopicServicesResponse> esimActivate(GatewayManager gateway, EsimActivateRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.ESIM_ACTIVATE.getMethod(), request); } /** * esim and sim switching * @param gateway gateway device * @param request data * @return services_reply */ @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2) public TopicServicesResponse> simSlotSwitch(GatewayManager gateway, SimSlotSwitchRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.SIM_SLOT_SWITCH.getMethod(), request); } /** * esim operator switching * @param gateway gateway device * @param request data * @return services_reply */ @CloudSDKVersion(since = CloudSDKVersionEnum.V1_0_1, include = GatewayTypeEnum.DOCK2) public TopicServicesResponse> esimOperatorSwitch(GatewayManager gateway, EsimOperatorSwitchRequest request) { return servicesPublish.publish( new TypeReference() {}, gateway.getGatewaySn(), DebugMethodEnum.ESIM_OPERATOR_SWITCH.getMethod(), request); } }