diff --git a/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java b/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java index 53f929577..a14981a02 100644 --- a/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java +++ b/src/main/java/club/joylink/rtss/services/VirtualRealityIbpService.java @@ -79,14 +79,22 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { MapConfig config = simulation.getRepository().getConfig(); VirtualRealityIbp.IbpElement element = ibp.getByCode(buttonCode); + if (VirtualRealityIbp.Type.KEY.equals(element.getType())) { + element.setOn(!element.isOn()); + return; + } List stands = chooseStands(station, element, config); boolean change = false; VirtualRealityIbp.SquareButton button = null; - if (element instanceof VirtualRealityIbp.SquareButton) { + if (VirtualRealityIbp.Type.BUTTON.equals(element.getType())) { button = (VirtualRealityIbp.SquareButton) element; if (!button.isPressed()) change = true; button.setPressed(true); + if (button.getMean() == null) { + button.setOn(true); + return; + } } switch (element.getMean()) { case KC: @@ -139,6 +147,9 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { case PRERESET_Z: element.setOn(true); break; + case SD: + ibp.queryByType(VirtualRealityIbp.Type.LIGHT).forEach(light -> light.setOn(true)); + break; default: throw BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.exception(String.format("不正确的按钮类型[%s]", element.getMean())); } @@ -157,11 +168,15 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { Station station = simulation.getRepository().getByCode(stationCode, Station.class); VirtualRealityIbp ibp = makeSureIbpExistAndCollectStatus(simulation, station); VirtualRealityIbp.IbpElement element = ibp.getByCode(buttonCode); + BusinessExceptionAssertEnum.SYSTEM_EXCEPTION.assertTrue(VirtualRealityIbp.Type.BUTTON.equals(element.getType()), "元素非按钮"); VirtualRealityIbp.SquareButton button = (VirtualRealityIbp.SquareButton) element; button.setPressed(false); - if (!button.getMean().equals(VirtualRealityIbp.Mean.AXLE_PRE_RESET)) { + if (!VirtualRealityIbp.Mean.AXLE_PRE_RESET.equals(button.getMean())) { button.setOn(false); } + if (VirtualRealityIbp.Mean.SD.equals(button.getMean())) { + ibp.queryByType(VirtualRealityIbp.Type.LIGHT).forEach(light -> light.setOn(false)); + } } @Override @@ -204,7 +219,7 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { VirtualRealityIbp ibp = station.getVrIbp(); if (ibp == null) continue; - List buttons = ibp.queryByType(VirtualRealityIbp.Mean.PRERESET_Z); + List buttons = ibp.queryByMean(VirtualRealityIbp.Mean.PRERESET_Z); if (CollectionUtils.isEmpty(buttons)) continue; VirtualRealityIbp.SquareButton preResetButton = @@ -212,7 +227,7 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { if (!preResetButton.isPressed()) continue; LocalDateTime now = LocalDateTime.now(); - for (VirtualRealityIbp.IbpElement ibpElement : ibp.queryByType(VirtualRealityIbp.Mean.AXLE_PRE_RESET)) { + for (VirtualRealityIbp.IbpElement ibpElement : ibp.queryByMean(VirtualRealityIbp.Mean.AXLE_PRE_RESET)) { VirtualRealityIbp.SquareButton button = (VirtualRealityIbp.SquareButton) ibpElement; if (!button.isPressed()) continue; @@ -255,6 +270,8 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { MapConfig config = repository.getConfig(); for (VirtualRealityIbp.IbpElement element : vrIbp.getElementList()) { List stands = chooseStands(station, element, config); + if (element.getMean() == null) + continue; switch (element.getMean()) { case KC: case XXYS: @@ -267,6 +284,7 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService { case AXLE_RESET: case PRERESET_Z: case ALARM: + case SD: break; case kcLight: element.setOn(stands.stream().anyMatch(Stand::isIbpHoldTrain)); diff --git a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java index 501db448b..6fc350954 100644 --- a/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java +++ b/src/main/java/club/joylink/rtss/simulation/cbtc/data/vr/VirtualRealityIbp.java @@ -23,36 +23,34 @@ public class VirtualRealityIbp { public VirtualRealityIbp(IbpData ibpData) { if (!CollectionUtils.isEmpty(ibpData.getDrawData().getSquareButtonList())) { for (IbpData.SquareButtonVO vo : ibpData.getDrawData().getSquareButtonList()) { - if (vo.getMean() == null) - continue; SquareButton button = new SquareButton(vo.getCode(), vo.getMean(), false, vo.getSectionCode(), vo.getDirection()); addElement(button); } } if (!CollectionUtils.isEmpty(ibpData.getDrawData().getCircularLampList())) { for (IbpData.CircularLampVO vo : ibpData.getDrawData().getCircularLampList()) { - if (vo.getMean() == null) - continue; - addElement(new IbpElement(vo.getCode(), vo.getMean(), false, vo.getDirection())); + addElement(new IbpElement(vo.getCode(), Type.LIGHT, vo.getMean(), false, vo.getDirection())); } } if (!CollectionUtils.isEmpty(ibpData.getDrawData().getAlarmList())) { for (IbpData.AlarmVO vo : ibpData.getDrawData().getAlarmList()) { - addElement(new IbpElement(vo.getCode(), Mean.ALARM, false, vo.getDirection())); + addElement(new IbpElement(vo.getCode(), Type.ALARM, Mean.ALARM, false, vo.getDirection())); } } if (!CollectionUtils.isEmpty(ibpData.getDrawData().getKeyList())) { for (IbpData.KeyVO vo : ibpData.getDrawData().getKeyList()) { - if (vo.getMean() == null) - continue; - addElement(new IbpElement(vo.getCode(), vo.getMean(), false, vo.getMean().equals(Mean.SXYS))); + if (vo.getMean() == null) { + addElement(new IbpElement(vo.getCode(), Type.KEY, vo.getMean(), false, null)); + } else { + addElement(new IbpElement(vo.getCode(), Type.KEY, vo.getMean(), false, vo.getMean().equals(Mean.SXYS))); + } } } } public void reset() { - this.queryByType(Mean.SXYS).forEach(element -> element.setOn(false)); - this.queryByType(Mean.XXYS).forEach(element -> element.setOn(false)); + this.queryByMean(Mean.SXYS).forEach(element -> element.setOn(false)); + this.queryByMean(Mean.XXYS).forEach(element -> element.setOn(false)); } public void addElement(IbpElement element) { @@ -63,10 +61,14 @@ public class VirtualRealityIbp { return (T) elementMap.get(code); } - public List queryByType(Mean mean) { + public List queryByMean(Mean mean) { return elementMap.values().stream().filter(element -> mean.equals(element.getMean())).collect(Collectors.toList()); } + public List queryByType(Type type) { + return elementMap.values().stream().filter(element -> type.equals(element.getType())).collect(Collectors.toList()); + } + public List query(Mean mean, Boolean up) { return elementMap.values().stream() .filter(element -> mean.equals(element.getMean()) && Objects.equals(element.getUp(), up)) @@ -82,14 +84,17 @@ public class VirtualRealityIbp { public class IbpElement { private String code; + private Type type; + private Mean mean; private boolean on; private Boolean up; - public IbpElement(String code, Mean mean, boolean on, Boolean up) { + public IbpElement(String code, Type type, Mean mean, boolean on, Boolean up) { this.code = code; + this.type = type; this.mean = mean; this.on = on; this.up = up; @@ -113,11 +118,20 @@ public class VirtualRealityIbp { private String sectionCode; public SquareButton(String code, Mean mean, boolean status, String sectionCode, Boolean up) { - super(code, mean, status, up); + super(code, Type.BUTTON, mean, status, up); this.sectionCode = sectionCode; } } + /** 元素类型 */ + public enum Type { + LIGHT, + BUTTON, + KEY, + ALARM, + } + + /** 元素意义 */ public enum Mean { //------------------ 信号 ------------------ /** @@ -175,5 +189,7 @@ public class VirtualRealityIbp { jjtcLight, gmLight, kmLight, + //------------------ 按钮 ------------------ + SD, } }