diff --git a/src/main/java/com/tuoheng/machine/example/MachineFrameworkUsageExample.java b/src/main/java/com/tuoheng/machine/example/MachineFrameworkUsageExample.java index fede3c7..9167062 100644 --- a/src/main/java/com/tuoheng/machine/example/MachineFrameworkUsageExample.java +++ b/src/main/java/com/tuoheng/machine/example/MachineFrameworkUsageExample.java @@ -48,10 +48,12 @@ public class MachineFrameworkUsageExample { // 创建新状态 MachineStates newStates = new MachineStates(); - newStates.setDroneState(DroneState.PREPARING); - newStates.setAirportState(AirportState.STANDBY); + newStates.setDroneState(DroneState.FLYING); + newStates.setAirportState(AirportState.ONLINE); newStates.setCoverState(CoverState.OPENED); newStates.setDrcState(DrcState.EXITED); + newStates.setDebugModeState(DebugModeState.UNKNOWN); + newStates.setStopState(StopState.EXITED); // 更新状态 commandManager.updateMachineStates(sn, newStates); @@ -204,10 +206,12 @@ public class MachineFrameworkUsageExample { // 2. 设置初始状态 MachineStates initialStates = new MachineStates(); - initialStates.setDroneState(DroneState.PREPARING); - initialStates.setAirportState(AirportState.STANDBY); + initialStates.setDroneState(DroneState.FLYING); + initialStates.setAirportState(AirportState.ONLINE); initialStates.setCoverState(CoverState.OPENED); initialStates.setDrcState(DrcState.EXITED); + initialStates.setDebugModeState(DebugModeState.UNKNOWN); + initialStates.setStopState(StopState.EXITED); commandManager.updateMachineStates(sn, initialStates); // 3. 检查是否可以起飞 diff --git a/src/main/java/com/tuoheng/machine/state/AirportState.java b/src/main/java/com/tuoheng/machine/state/AirportState.java index f85463c..0e7ab9b 100644 --- a/src/main/java/com/tuoheng/machine/state/AirportState.java +++ b/src/main/java/com/tuoheng/machine/state/AirportState.java @@ -15,32 +15,7 @@ public enum AirportState { OFFLINE, /** - * 在线(父状态) + * 在线 */ - ONLINE, - - /** - * 待机 - */ - STANDBY, - - /** - * 进入调试模式中 - */ - ENTERING_DEBUG_MODE, - - /** - * 调试模式 - */ - DEBUG_MODE, - - /** - * 退出调试模式中 - */ - EXITING_DEBUG_MODE, - - /** - * 重启中 - */ - REBOOTING + ONLINE } diff --git a/src/main/java/com/tuoheng/machine/state/CoverState.java b/src/main/java/com/tuoheng/machine/state/CoverState.java index 716a0f0..0012213 100644 --- a/src/main/java/com/tuoheng/machine/state/CoverState.java +++ b/src/main/java/com/tuoheng/machine/state/CoverState.java @@ -14,23 +14,9 @@ public enum CoverState { */ CLOSED, - /** - * 舱门打开中 - */ - OPENING, - /** * 舱门已打开 */ OPENED, - /** - * 舱门关闭中 - */ - CLOSING, - - /** - * 舱门状态异常 - */ - ERROR } diff --git a/src/main/java/com/tuoheng/machine/state/DebugModeState.java b/src/main/java/com/tuoheng/machine/state/DebugModeState.java new file mode 100644 index 0000000..bf6cb3a --- /dev/null +++ b/src/main/java/com/tuoheng/machine/state/DebugModeState.java @@ -0,0 +1,21 @@ +package com.tuoheng.machine.state; + +/** + * 调试模式状态枚举 + */ +public enum DebugModeState { + /** + * 未知状态 + */ + UNKNOWN, + + /** + * 调试模式 + */ + ENTERED, + + /** + * 退出调试模式 + */ + EXITED_DEBUG +} diff --git a/src/main/java/com/tuoheng/machine/state/DrcState.java b/src/main/java/com/tuoheng/machine/state/DrcState.java index 4607a35..2b86ee7 100644 --- a/src/main/java/com/tuoheng/machine/state/DrcState.java +++ b/src/main/java/com/tuoheng/machine/state/DrcState.java @@ -14,18 +14,11 @@ public enum DrcState { */ EXITED, - /** - * 进入中(正在进入DRC模式) - */ - ENTERING, /** * 进入状态(已进入DRC模式) */ ENTERED, - /** - * 退出中(正在退出DRC模式) - */ - EXITING + } diff --git a/src/main/java/com/tuoheng/machine/state/DroneState.java b/src/main/java/com/tuoheng/machine/state/DroneState.java index ce84bf6..3bd4da0 100644 --- a/src/main/java/com/tuoheng/machine/state/DroneState.java +++ b/src/main/java/com/tuoheng/machine/state/DroneState.java @@ -5,87 +5,30 @@ package com.tuoheng.machine.state; * 分为:准备中 -> 飞行中 -> 返航 三个大状态 */ public enum DroneState { + /** * 未知状态(服务器重启后的初始状态,等待第一次心跳同步) */ UNKNOWN, - /** * 离线 */ OFFLINE, - // ==================== 准备阶段 ==================== - /** - * 准备中 - */ - PREPARING, - - // ==================== 飞行阶段(父状态) ==================== - /** - * 飞行中(父状态) - */ - FLYING_PARENT, - /** * 飞行中 */ FLYING, - /** - * 急停(飞行阶段) - */ - EMERGENCY_STOP, - /** * 到达目的地 */ ARRIVED, - // ==================== 返航阶段(父状态) ==================== - /** - * 返航(父状态) - */ - RETURNING_PARENT, - /** * 返航中 */ RETURNING, - /** - * 急停(返航阶段) - */ - RETURN_EMERGENCY_STOP, - /** - * 返航完成 - */ - RETURN_COMPLETED, - - // ==================== 指点操作(可在飞行和返航阶段使用) ==================== - /** - * 指点操作(父状态) - */ - POINTING_PARENT, - - /** - * 准备指点 - */ - POINT_PREPARING, - - /** - * 指点飞行中 - */ - POINT_FLYING, - - /** - * 指点完成 - */ - POINT_COMPLETED, - - /** - * 指点被取消 - */ - POINT_CANCELLED } diff --git a/src/main/java/com/tuoheng/machine/state/MachineStates.java b/src/main/java/com/tuoheng/machine/state/MachineStates.java index 2399644..4140349 100644 --- a/src/main/java/com/tuoheng/machine/state/MachineStates.java +++ b/src/main/java/com/tuoheng/machine/state/MachineStates.java @@ -5,7 +5,7 @@ import lombok.Data; import lombok.NoArgsConstructor; /** - * 设备的四套大状态 + * 设备的六套大状态 */ @Data @NoArgsConstructor @@ -31,10 +31,20 @@ public class MachineStates { */ private DrcState drcState = DrcState.UNKNOWN; + /** + * 调试模式状态 + */ + private DebugModeState debugModeState = DebugModeState.UNKNOWN; + + /** + * 急停状态 + */ + private StopState stopState = StopState.UNKNOWN; + /** * 复制当前状态 */ public MachineStates copy() { - return new MachineStates(droneState, airportState, coverState, drcState); + return new MachineStates(droneState, airportState, coverState, drcState, debugModeState, stopState); } } diff --git a/src/main/java/com/tuoheng/machine/state/StopState.java b/src/main/java/com/tuoheng/machine/state/StopState.java new file mode 100644 index 0000000..127426e --- /dev/null +++ b/src/main/java/com/tuoheng/machine/state/StopState.java @@ -0,0 +1,22 @@ +package com.tuoheng.machine.state; + +/** + * 急停状态 + */ +public enum StopState { + /** + * 未知状态(服务器重启后的初始状态,等待第一次心跳同步) + */ + UNKNOWN, + + /** + * 退出状态 + */ + EXITED, + + /** + * 进入状态 + */ + ENTERED, + +} diff --git a/src/main/java/com/tuoheng/machine/vendor/dji/DjiVendorConfig.java b/src/main/java/com/tuoheng/machine/vendor/dji/DjiVendorConfig.java index 72103f5..e9406aa 100644 --- a/src/main/java/com/tuoheng/machine/vendor/dji/DjiVendorConfig.java +++ b/src/main/java/com/tuoheng/machine/vendor/dji/DjiVendorConfig.java @@ -46,49 +46,49 @@ public class DjiVendorConfig implements VendorConfig { DroneState droneState = currentStates.getDroneState(); AirportState airportState = currentStates.getAirportState(); CoverState coverState = currentStates.getCoverState(); + DebugModeState debugModeState = currentStates.getDebugModeState(); + StopState stopState = currentStates.getStopState(); switch (commandType) { case TAKE_OFF: - // 准备中状态可以起飞 - return droneState == DroneState.PREPARING; + // 未知状态或离线状态且未急停时可以起飞 + return (droneState == DroneState.UNKNOWN || droneState == DroneState.OFFLINE) && + stopState != StopState.ENTERED; case LAND: - // 飞行中、到达目的地、急停状态可以降落 - return droneState == DroneState.FLYING || - droneState == DroneState.ARRIVED || - droneState == DroneState.EMERGENCY_STOP; + // 飞行中、到达目的地状态可以降落(急停状态不能降落) + return (droneState == DroneState.FLYING || droneState == DroneState.ARRIVED) && + stopState != StopState.ENTERED; case RETURN_HOME: - // 飞行中、到达目的地、急停、指点飞行中可以返航 - return droneState == DroneState.FLYING || - droneState == DroneState.ARRIVED || - droneState == DroneState.EMERGENCY_STOP || - droneState == DroneState.POINT_FLYING; + // 飞行中、到达目的地可以返航(急停状态不能返航) + return (droneState == DroneState.FLYING || droneState == DroneState.ARRIVED) && + stopState != StopState.ENTERED; case EMERGENCY_STOP: - // 飞行中、返航中、指点飞行中可以急停 - return droneState == DroneState.FLYING || - droneState == DroneState.RETURNING || - droneState == DroneState.POINT_FLYING; + // 飞行中、返航中可以急停(未处于急停状态) + return (droneState == DroneState.FLYING || droneState == DroneState.RETURNING) && + stopState != StopState.ENTERED; case RESUME_FLIGHT: // 急停状态可以继续飞行 - return droneState == DroneState.EMERGENCY_STOP || - droneState == DroneState.RETURN_EMERGENCY_STOP; + return stopState == StopState.ENTERED; case POINT_FLY: - // 飞行中、到达目的地、返航中可以指点飞行 - return droneState == DroneState.FLYING || + // 飞行中、到达目的地、返航中可以指点飞行(未急停) + return (droneState == DroneState.FLYING || droneState == DroneState.ARRIVED || - droneState == DroneState.RETURNING; + droneState == DroneState.RETURNING) && + stopState != StopState.ENTERED; case CANCEL_POINT: - // 指点飞行中可以取消指点 - return droneState == DroneState.POINT_FLYING; + // 飞行中可以取消指点 + return droneState == DroneState.FLYING; case START_MISSION: - // 准备中状态可以开始航线任务 - return droneState == DroneState.PREPARING; + // 未知状态或离线状态且未急停时可以开始航线任务 + return (droneState == DroneState.UNKNOWN || droneState == DroneState.OFFLINE) && + stopState != StopState.ENTERED; case OPEN_COVER: // 舱门关闭状态可以打开 @@ -99,17 +99,17 @@ public class DjiVendorConfig implements VendorConfig { return coverState == CoverState.OPENED; case ENTER_DEBUG_MODE: - // 待机状态可以进入调试模式 - return airportState == AirportState.STANDBY; + // 在线状态且未处于调试模式时可以进入调试模式 + return airportState == AirportState.ONLINE && + debugModeState == DebugModeState.UNKNOWN; case EXIT_DEBUG_MODE: // 调试模式可以退出 - return airportState == AirportState.DEBUG_MODE; + return debugModeState == DebugModeState.ENTERED; case REBOOT_AIRPORT: // 在线状态可以重启 - return airportState == AirportState.ONLINE || - airportState == AirportState.STANDBY; + return airportState == AirportState.ONLINE; default: return false;