diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java index fb3cff006..ffa576fb6 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/Operation.java @@ -853,7 +853,15 @@ public class Operation { /** * 发辅助按钮操作 */ - ASSIST_PRESS_DELIVER_ASSIST + ASSIST_PRESS_DELIVER_ASSIST, + /** + * 按下闭塞按钮 + */ + ASSIST_PRESS_BLOCK, + /** + * 按下复原按钮 + */ + ASSIST_PRESS_RESTORE } /** diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java index 8c4fa3da2..dd8c1ab28 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/operation/handler/StationDirectionOperateHandler.java @@ -78,4 +78,30 @@ public class StationDirectionOperateHandler { stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.DELIVER_ASSIST , Boolean.TRUE, stationDirectionService.turnAssistValid, stationDirectionService.deliverAssistThen); } + + /** + * 点击闭塞按钮,只做按钮的按下操作 + * + * @param simulation 仿真数据 + * @param stationCode 车站编码 + * @param labelEnum 运行方向 + */ + @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_BLOCK) + public void pressBlockBtn(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum) { + stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.BLOCK + , Boolean.TRUE, null, null); + } + + /** + * 按下复原按钮 + * + * @param simulation 仿真数据 + * @param stationCode 车站编码 + * @param labelEnum 运行方向 + */ + @OperateHandlerMapping(type = Operation.Type.ASSIST_PRESS_RESTORE) + public void pressRestoreBtn(Simulation simulation, String stationCode, DirectionLabelEnum labelEnum) { + stationDirectionService.changeButtonAspect(simulation, stationCode, labelEnum, StationDirection.ButtonTypeEnum.BLOCK + , Boolean.TRUE, null, stationDirectionService.turnRestoreThen); + } } diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java index 5eeeb9967..e759c8aae 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/ATS/service/assist/StationDirectionService.java @@ -109,7 +109,6 @@ public class StationDirectionService { } }; - /** * 接、发辅助按钮操作校验 */ @@ -119,6 +118,7 @@ public class StationDirectionService { } }; + /** * 总辅助后续操作 */ @@ -151,6 +151,48 @@ public class StationDirectionService { stationDirection.getRemain().set(StationDirection.DEFAULT_DELIVER_DELAY_TIME); }; + /** + * 复原按钮操作验证 + */ + public ButtonValidInterface turnRestoreValid = (simulation, stationDirection) -> { + + }; + + /** + * 恢复按钮后续操作 + */ + public ButtonThenInterface turnRestoreThen = (simulation, stationDirection) -> { + try { + // 只有半自动闭塞、接车方向可以操作 + if (StationDirection.DirectionRunModel.S.equals(stationDirection.getRunModel()) + && StationDirection.ReceiveAndDeliverModel.R.equals(stationDirection.getRunStatus())) { + // 将本方向接发车状态恢复 + stationDirection.reset(); + // 接车进路方向朝向 + boolean right = stationDirection.getReceiveRouteList().stream().findFirst().stream().anyMatch(Route::isRight); + // 寻找车站位置,用于获取邻站 + List stationList = simulation.getRepository().getStationList(); + int index = stationList.indexOf(stationDirection.getStation()); + // 范围内 + if (index != 0 && index != stationList.size() - 1) { + index = right ? index + 1 : index - 1; + Station adjacentStation = stationList.get(index); + if (adjacentStation != null) { + adjacentStation.getStationDirectionMap().values() + .stream() + .filter(sd -> StationDirection.DirectionRunModel.S.equals(sd.getRunModel())) + .filter(sd -> sd.getDeliverRouteList().stream().anyMatch(route -> route.isRight() == right)) + .forEach(sd -> sd.reset()); + } + + } + } + } finally { + // 恢复完成后,恢复按钮需要自动弹起 + stationDirection.setRestoreStatus(false); + } + }; + /** * 获取当前车站实体 * diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java index 2e454ae20..367a4ec58 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/map/StationDirection.java @@ -49,6 +49,11 @@ public class StationDirection extends MapNamedElement { */ private AtomicInteger remain = new AtomicInteger(0); + /** + * 所属模式(自动闭塞、半自动闭塞) + */ + private DirectionRunModel runModel; + /** * 处于接、发状态 */ @@ -94,6 +99,16 @@ public class StationDirection extends MapNamedElement { */ private boolean deliverAssistStatus; + /** + * 闭塞 + */ + private boolean blockStatus; + + /** + * 恢复 + */ + private boolean restoreStatus; + /** * 接车进路,以指示灯为起点的进路 */ @@ -109,10 +124,10 @@ public class StationDirection extends MapNamedElement { */ private List
sectionList; - public StationDirection(String code, String name, DirectionLabelEnum labelEnum) { this(code, name); this.labelEnum = labelEnum; + this.runModel = getDefaultDirectionRunModel(); this.runStatus = this.getDefaultReceiveAndDeliver(); } @@ -134,34 +149,12 @@ public class StationDirection extends MapNamedElement { * 刷新接、发车灯颜色 */ public void refreshAspectStatus() { - // 进路锁闭判断接发状态 - // 接车进路锁闭 - boolean receiveRouteBlock = this.receiveRouteList.stream().anyMatch(Route::isLock); - // 发车进路锁闭 - boolean deliverRouteBlock = this.deliverRouteList.stream().anyMatch(Route::isLock); - // 接发状态 - this.runStatus = receiveRouteBlock ? ReceiveAndDeliverModel.R : this.runStatus; - this.runStatus = deliverRouteBlock ? ReceiveAndDeliverModel.D : this.runStatus; - // 接车进路锁闭亮红灯、否则默认 - IndicatorStatusEnum receiveAspect; - // 发车进路锁闭亮红灯、否则默认 - IndicatorStatusEnum deliverAspect; - // 进路区段占用判断点灯颜色 - if (ReceiveAndDeliverModel.R.equals(this.runStatus)) { - deliverAspect = IndicatorStatusEnum.F; - // 接车进路锁闭 - receiveAspect = judgeSignalLock() ? IndicatorStatusEnum.O : IndicatorStatusEnum.F; - } else if (ReceiveAndDeliverModel.D.equals(this.runStatus)) { - receiveAspect = IndicatorStatusEnum.F; - // 发车进路锁闭 - deliverAspect = judgeSignalLock() ? IndicatorStatusEnum.O : IndicatorStatusEnum.F; - } else { - receiveAspect = this.receiveAspect; - deliverAspect = this.receiveAspect; + // 自动模式 + if (DirectionRunModel.A.equals(this.runModel)) { + automaticModelAspectStatus(); + } else { // 半自动 + semiAutomaticModelAspectStatus(); } - // 赋值点灯信息 - this.deliverAspect = deliverAspect; - this.receiveAspect = receiveAspect; } /** @@ -218,6 +211,14 @@ public class StationDirection extends MapNamedElement { case MAIN_ASSIST: this.mainAssistStatus = pressDown; break; + // 复原 + case RESTORE: + this.restoreStatus = pressDown; + break; + // 闭塞 + case BLOCK: + this.blockStatus = pressDown; + break; } } @@ -229,6 +230,7 @@ public class StationDirection extends MapNamedElement { this.mainAssistStatus = false; this.receiveAssistStatus = false; this.deliverAssistStatus = false; + this.blockStatus = false; this.receiveAspect = IndicatorStatusEnum.F; this.deliverAspect = IndicatorStatusEnum.F; this.sectionAspect = IndicatorStatusEnum.F; @@ -242,8 +244,21 @@ public class StationDirection extends MapNamedElement { // X、S方向为接车方向默认亮起 if (DirectionLabelEnum.X.equals(labelEnum) || DirectionLabelEnum.S.equals(labelEnum)) { return ReceiveAndDeliverModel.R; - } else { // 其他方向默认发车灯亮起 + } else if (DirectionLabelEnum.XF.equals(labelEnum) || DirectionLabelEnum.SF.equals(labelEnum)) { // SF、XF方向默认发车灯亮起 return ReceiveAndDeliverModel.D; + } else { // SD、XD方向默认发车灯亮起 + return ReceiveAndDeliverModel.N; + } + } + + /** + * 默认运行模式 + */ + private DirectionRunModel getDefaultDirectionRunModel() { + if (DirectionLabelEnum.XD.equals(labelEnum) || DirectionLabelEnum.SD.equals(labelEnum)) { + return DirectionRunModel.S; + } else { // SD、XD + return DirectionRunModel.A; } } @@ -283,11 +298,83 @@ public class StationDirection extends MapNamedElement { return isReady; } + /** + * 自动模式下的接发车判断 + */ + private void automaticModelAspectStatus() { + // 进路锁闭判断接发状态 + // 接车进路锁闭 + boolean receiveRouteBlock = this.receiveRouteList.stream().anyMatch(Route::isLock); + // 发车进路锁闭 + boolean deliverRouteBlock = this.deliverRouteList.stream().anyMatch(Route::isLock); + // 接发状态 + this.runStatus = receiveRouteBlock ? ReceiveAndDeliverModel.R : this.runStatus; + this.runStatus = deliverRouteBlock ? ReceiveAndDeliverModel.D : this.runStatus; + // 接车进路锁闭亮红灯、否则默认 + IndicatorStatusEnum receiveAspect; + // 发车进路锁闭亮红灯、否则默认 + IndicatorStatusEnum deliverAspect; + // 进路区段占用判断点灯颜色 + if (ReceiveAndDeliverModel.R.equals(this.runStatus)) { + deliverAspect = IndicatorStatusEnum.F; + // 接车进路锁闭 + receiveAspect = judgeSignalLock() ? IndicatorStatusEnum.O : IndicatorStatusEnum.F; + } else if (ReceiveAndDeliverModel.D.equals(this.runStatus)) { + receiveAspect = IndicatorStatusEnum.F; + // 发车进路锁闭 + deliverAspect = judgeSignalLock() ? IndicatorStatusEnum.O : IndicatorStatusEnum.F; + } else { + receiveAspect = this.receiveAspect; + deliverAspect = this.receiveAspect; + } + // 赋值点灯信息 + this.deliverAspect = deliverAspect; + this.receiveAspect = receiveAspect; + } + + /** + * 半自动闭塞,不会自动恢复 + */ + private void semiAutomaticModelAspectStatus() { + // 只有当状态为空时才做判断 + if (ReceiveAndDeliverModel.N.equals(this.runStatus)) { + // 进路锁闭判断接发状态 + // 接车进路锁闭 + boolean receiveRouteBlock = this.receiveRouteList.stream().anyMatch(Route::isLock); + if (receiveRouteBlock) { + // 接发状态 + this.runStatus = ReceiveAndDeliverModel.R; + } else { + // 发车进路锁闭 + boolean deliverRouteBlock = this.deliverRouteList.stream().anyMatch(Route::isLock); + this.runStatus = deliverRouteBlock ? ReceiveAndDeliverModel.D : this.runStatus; + } + } + // 点灯 + if (ReceiveAndDeliverModel.R.equals(this.runStatus)) { // 接车方向 + if (IndicatorStatusEnum.F.equals(this.receiveAspect) && IndicatorStatusEnum.O.equals(this.sectionAspect)) { + receiveAspect = IndicatorStatusEnum.O; + } + } else if (ReceiveAndDeliverModel.D.equals(this.runStatus)) { // 发车方向 + // 进入区间后、标为占用且不主动恢复 + if (IndicatorStatusEnum.F.equals(this.deliverAspect) && IndicatorStatusEnum.O.equals(this.sectionAspect)) { + this.deliverAspect = IndicatorStatusEnum.O; + } + } else if (ReceiveAndDeliverModel.N.equals(this.runStatus)) { + this.deliverAspect = IndicatorStatusEnum.F; + this.receiveAspect = IndicatorStatusEnum.F; + } + } + public enum ReceiveAndDeliverModel { // 接 R, // 发 D, + // 全 + A, + // 无 + N } public enum IndicatorStatusEnum { @@ -306,6 +393,19 @@ public class StationDirection extends MapNamedElement { DELIVER_ASSIST, // 改方 CHANGE_DIRECTION, + // 复原 + RESTORE, + // 闭塞 + BLOCK, NO; } + + public enum DirectionRunModel { + // 自动 + A, + // 半自动 + S, + // 非自动 + N + } }