diff --git a/src/main/java/com/tuoheng/machine/impl/dji/action/drc/DjiExitAction.java b/src/main/java/com/tuoheng/machine/impl/dji/action/drc/DjiExitAction.java index 2c3134b..812cb48 100644 --- a/src/main/java/com/tuoheng/machine/impl/dji/action/drc/DjiExitAction.java +++ b/src/main/java/com/tuoheng/machine/impl/dji/action/drc/DjiExitAction.java @@ -22,10 +22,10 @@ public class DjiExitAction extends ExitAction { @Override public void execute(StateContext context) { String machineId = (String) context.getExtendedState().getVariables().get("machineId"); - log.info("[DJI] {} 退出DRC模式: %s 判断外部命令是否成功", machineId); + log.info("[DJI] {} 退出DRC模式: %s 外部命令执行", machineId); /** - * 发生命令的结果是失败,或者超时了,这边需要抛出异常 + * DjiExitAction 执行远程方法,远程方法执行成功则不抛出异常,否则抛出异常 */ - throw new RuntimeException(""); + } } diff --git a/src/main/java/com/tuoheng/machine/impl/dji/guard/drc/DjiCanExitGuard.java b/src/main/java/com/tuoheng/machine/impl/dji/guard/drc/DjiCanExitGuard.java index b3665c6..4cce288 100644 --- a/src/main/java/com/tuoheng/machine/impl/dji/guard/drc/DjiCanExitGuard.java +++ b/src/main/java/com/tuoheng/machine/impl/dji/guard/drc/DjiCanExitGuard.java @@ -23,8 +23,8 @@ public class DjiCanExitGuard extends CanExitGuard { @Override public boolean evaluate(StateContext context) { String machineId = (String) context.getExtendedState().getVariables().get("machineId"); - log.info("[DJI] {} 退出DRC模式: %s 执行外部命令", machineId); - // 外部命令执行成功返回true,执行失败返回false + log.info("[DJI] {} 退出DRC模式: %s 判断是否具备执行条件", machineId); + //具备执行添加返回true,不具备执行条件返回false return true; } } diff --git a/src/main/java/com/tuoheng/machine/impl/dji/listener/DjiDrcListener.java b/src/main/java/com/tuoheng/machine/impl/dji/listener/DjiDrcListener.java index b5c0319..d1e33d1 100644 --- a/src/main/java/com/tuoheng/machine/impl/dji/listener/DjiDrcListener.java +++ b/src/main/java/com/tuoheng/machine/impl/dji/listener/DjiDrcListener.java @@ -2,11 +2,20 @@ package com.tuoheng.machine.impl.dji.listener; import com.tuoheng.machine.events.DrcEvent; import com.tuoheng.machine.listener.DefaultDrcListener; +import com.tuoheng.machine.service.DrcMachineService; import com.tuoheng.machine.status.DrcState; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.statemachine.StateContext; +import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.state.State; +import org.springframework.statemachine.transition.Transition; import org.springframework.stereotype.Component; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; + /** * DJI平台DRC状态监听器 */ @@ -14,6 +23,11 @@ import org.springframework.stereotype.Component; @Slf4j public class DjiDrcListener extends DefaultDrcListener { + + @Autowired + @Lazy + DrcMachineService drcMachineService; + @Override public String getName() { return "DJI-DRC"; @@ -24,4 +38,35 @@ public class DjiDrcListener extends DefaultDrcListener { log.debug("[{}] 大疆进入状态: {}", getName(), state.getId()); } + + public void transitionEnded(Transition transition) { + if (transition.getSource() != null && transition.getTarget() != null) { + log.debug("[{}] 转换结束: {} -> {}", + getName(), transition.getSource().getId(), transition.getTarget().getId()); + } + // 获取状态机 + } + + @Override + public void stateContext(StateContext stateContext) { + // 默认不处理 + // 只处理状态进入阶段 + if (stateContext.getStage() == StateContext.Stage.STATE_ENTRY) { + DrcState currentState = stateContext.getTarget() != null ? + stateContext.getTarget().getId() : null; + // 当进入 EXITING 状态时,自动发送 EXITED 事件 + if (currentState == DrcState.EXITING) { + StateMachine stateMachine = stateContext.getStateMachine(); + String machineId = (String) stateMachine.getExtendedState() + .getVariables().get("machineId"); + + log.info("[{}] 进入 EXITING 状态,准备自动转换到 EXITED, 机巢ID: {}", + getName(), machineId); + /** + * 这个地方可以直接调用 drcMachineService 转换状态 + */ + drcMachineService.sendEvent(machineId, DrcEvent.EXITED); + } + } + } } diff --git a/src/test/java/com/tuoheng/machine/DrcStateMachineTest.java b/src/test/java/com/tuoheng/machine/DrcStateMachineTest.java index ae1d152..e222440 100644 --- a/src/test/java/com/tuoheng/machine/DrcStateMachineTest.java +++ b/src/test/java/com/tuoheng/machine/DrcStateMachineTest.java @@ -63,16 +63,20 @@ public class DrcStateMachineTest { log.debug(drcMachineService.getCurrentStates("airport-001")); /** - * 变成退出中;这个时候需要在 DjiCanExitGuard 中编写退出的代码(调用三方接口) - * DjiExitAction 里面判断状态是否真的变化了 + * 变成退出中;这个时候需要在 + * DjiCanExitGuard 判断是否可以执行 + * DjiExitAction 执行远程方法,远程方法执行成功则不抛出异常,否则抛出异常 */ log.debug(String.valueOf(drcMachineService.sendEvent(sn,DrcEvent.EXITING))); /** * 打印一下当前的状态 + * 修改 stateContext 里面的实现,就可以跳过某些状态 */ log.debug(drcMachineService.getCurrentStates("airport-001")); +; + // log.debug(String.valueOf(drcMachineService.sendEvent(sn,DrcEvent.EXITED))); // // log.debug(drcMachineService.getCurrentStates("airport-001"));