Merge remote-tracking branch 'origin/test'

This commit is contained in:
tiger_zhou 2023-05-31 16:07:29 +08:00
commit 35b9f0cca2
28 changed files with 1087 additions and 338 deletions

View File

@ -109,4 +109,14 @@ public class SimulationTrainingV2Controller {
public void jumpToStep(@PathVariable String group, @PathVariable Long stepId){
training2Service.jumpToStep(group, stepId);
}
/**
* 实训开始准备给实训参与人员发送准备开始执行
* @param group 仿真ID
* @param user 操作人
*/
@PostMapping("/{group}/prepare/start")
public void prepareStart(@PathVariable String group, @RequestAttribute AccountVO user, ScriptBO.Mode mode) {
training2Service.prepareStart(group, user, mode);
}
}

View File

@ -154,7 +154,7 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService {
VirtualRealityIbp.SquareButton button = (VirtualRealityIbp.SquareButton) element;
if (!button.isEffective()) {
button.setEffective(true);
button.setPressTime(LocalDateTime.now());
button.setPressTime(simulation.getCorrectSystemTime());
}
break;
}
@ -263,13 +263,16 @@ public class VirtualRealityIbpService implements IVirtualRealityIbpService {
if (ibp == null)
continue;
List<VirtualRealityIbp.IbpElement> buttons = ibp.queryByMean(VirtualRealityIbp.Mean.PRERESET_Z);
if (CollectionUtils.isEmpty(buttons))
continue;
VirtualRealityIbp.SquareButton preResetButton =
(VirtualRealityIbp.SquareButton) buttons.get(0);
if (!preResetButton.isPressed())
continue;
LocalDateTime now = LocalDateTime.now();
if (CollectionUtils.isEmpty(buttons)) { // 如果没有按钮判断车站是否有预处理倒计时时间 20230530 wei
if (station.getPreResetValidDuration().get() <= 0) {
continue;
}
} else {
VirtualRealityIbp.SquareButton preResetButton = (VirtualRealityIbp.SquareButton) buttons.get(0);
if (!preResetButton.isPressed())
continue;
}
LocalDateTime now = simulation.getCorrectSystemTime();
for (VirtualRealityIbp.IbpElement ibpElement : ibp.queryByMean(VirtualRealityIbp.Mean.AXLE_PRE_RESET)) {
VirtualRealityIbp.SquareButton button = (VirtualRealityIbp.SquareButton) ibpElement;
if (!button.isPressed() || !button.isEffective())

View File

@ -214,12 +214,16 @@ public class PaperUserService {
rsp.setCommonScore(scoreCommon);
rsp.setTrainingScore(scoreTraining);
rsp.setPassScore(composition.getPassScore());
this.publishUserExam();
return rsp;
}
private void publishUserExam() {
// UserExam ue = new UserExam();
// ue.setExamId();
// ue.setUserId(user.getAccount());
//TODO 需要将 UserExam 发送 {@link UserExamService.submit 方法}
// this.applicationContext.publishEvent(new UserExamRecordEvent(userExam));
return rsp;
}
/**

View File

@ -472,6 +472,7 @@ public class Training2PublishService {
List<PublishedTraining2WithBLOBs> training2WithBLOBsList = publishedDao.selectByExampleWithBLOBs(example);
Map<Long, List<PublishedTraining2WithBLOBs>> mapTrainingMap = training2WithBLOBsList.stream().peek(t -> {
t.setId(null);
t.setMapId(null);
t.setUpdateTime(null);
t.setCreateTime(null);
}).collect(Collectors.groupingBy(PublishedTraining2WithBLOBs::getMapId));

View File

@ -4,6 +4,7 @@ import club.joylink.rtss.dao.DraftTraining2DAO;
import club.joylink.rtss.dao.PublishedTraining2DAO;
import club.joylink.rtss.entity.training2.DraftTraining2WithBLOBs;
import club.joylink.rtss.entity.training2.PublishedTraining2WithBLOBs;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.services.training2.index.IndexAlgorithmService;
import club.joylink.rtss.simulation.cbtc.ATS.ATSMessageCollectAndDispatcher;
import club.joylink.rtss.simulation.cbtc.ATS.operation.AtsOperationDispatcher;
@ -274,7 +275,7 @@ public class Training2Service {
// 创建者退出则清理实训
if (simulation.getCreator().getId().equals(user.getId())) {
training2.finish();
removeTrainingJob(simulation);
trainingStatusMessage(simulation, 0);
}
} else {
return List.of();
@ -522,6 +523,7 @@ public class Training2Service {
throw new SimulationException(SimulationExceptionType.Data_Not_Exist, "实训不存在");
}
Simulation simulation = groupSimulationCache.getSimulationByGroup(group);
loadTrainingPre(simulation);
// 重置仿真状态
// groupSimulationService.planOver(group);
simulationService.reset(group);
@ -553,10 +555,27 @@ public class Training2Service {
} catch (Exception e) {
log.error("loadTrainingToStep is error", e);
training2.finish();
removeTrainingJob(simulation);
}
}
/**
* 实训准备开始
* @param group 仿真号
* @param user 操作人
*/
public void prepareStart(String group, AccountVO user, ScriptBO.Mode mode) {
Simulation simulation = groupSimulationCache.getSimulationByGroup(group);
BusinessExceptionAssertEnum.DATA_ERROR.assertTrue(simulation.getTraining2() != null, "未加载实训");
Map<String, Object> messageMap = new HashMap<>();
messageMap.put("id", simulation.getTraining2().getId());
messageMap.put("mode", mode);
SocketMessageVO<Map<String, Object>> message = SocketMessageFactory.build(
WebSocketMessageType.Simulation_Training_Prepare_Start, simulation.getId(), messageMap);
Set<String> userIdSet = simulation.getSimulationUserIds().stream()
.filter(id -> !Objects.equals(id, user.getId().toString())).collect(Collectors.toSet());
stompMessageService.sendToUser(userIdSet, message);
}
/**
* 实训时创建仿真对象
*/
@ -585,6 +604,7 @@ public class Training2Service {
* 加载实训数据
*/
private void loadTraining(Simulation simulation, DraftTraining2WithBLOBs draftTraining2, LoginUserInfoVO loginUserInfoVO) {
loadTrainingPre(simulation);
// 没有背景不做加载加载的时候不做背景加载开始的时候重新加载背景即可
if (!StringUtils.isEmpty(draftTraining2.getBgSceneJson())) {
groupSimulationService.loadScenes(simulation.getId(), draftTraining2.getBgSceneJson());
@ -605,6 +625,17 @@ public class Training2Service {
simulationLifeCycleService.pause(simulation);
}
/**
* 仿真加载实训时前置清空方法
* @param simulation 仿真
*/
private void loadTrainingPre(Simulation simulation) {
if (simulation.getTraining2() != null) { // 如果仿真存在旧的实训
removeTrainingJob(simulation);
clearJumpStep(simulation);
}
}
/**
* 判断实训步骤是否完成
*/
@ -656,7 +687,7 @@ public class Training2Service {
}
}
// 发送步骤提示信息,需要跳过步骤不发消息
if (!step.isPrompt() && !simulation.getTraining2().isJumpStep(step)) {
if (!step.isPrompt() && !simulation.getTraining2().haveJumpStep()) {
step.setPrompt(true); // 标识已发送过消息
applicationContext.publishEvent(new SimulationStepTipEvent(this, simulation, step));
}
@ -911,6 +942,10 @@ public class Training2Service {
addTrainingJob(simulation, training2);
// 启动仿真
simulationLifeCycleService.resume(simulation);
// 发送开始消息,跳转不发送消息
if (!training2.haveJumpStep()) {
trainingStatusMessage(simulation, 1);
}
}
/**
@ -918,7 +953,19 @@ public class Training2Service {
*/
private void clearJumpStep(Simulation simulation) {
simulation.updateSpeed(Simulation.MIN_SPEED);
simulation.getTraining2().setJumpToStep(null);
simulation.getTraining2().finish();
if (simulation.getTraining2() != null) {
simulation.getTraining2().setJumpToStep(null);
simulation.getTraining2().finish();
}
}
/**
* 实训状态消息
* @param simulation 仿真
* @param status 状态
*/
private void trainingStatusMessage(Simulation simulation, int status) {
SocketMessageVO<Integer> message = SocketMessageFactory.build(WebSocketMessageType.Simulation_Training_Status, simulation.getId(), status);
stompMessageService.sendToUser(simulation.getSimulationUserIds(), message);
}
}

View File

@ -185,8 +185,11 @@ public class SimulationManager {
String oldMemberId = simulationUser.getMemberId();
if (oldMemberId != null) {
SimulationMember old = simulation.getSimulationMemberById(oldMemberId);
this.memberPlayChange(simulation, old, null);
if (Objects.equals(old.getUserId(), userId)) { // 这里做同用户对比防止角色替换时置NULL问题
this.memberPlayChange(simulation, old, null);
}
}
log.info("memberId:" + memberId + ";userId:" + userId);
this.memberPlayChange(simulation, simulationMember, simulationUser);
} else {
this.memberPlayChange(simulation, simulationMember, null);

View File

@ -507,6 +507,7 @@ public class AtsStationService {
}
station.setInterlockMachineStarting(true);
station.setRestartTime(LocalTime.now());
station.setPowerUnlockButtonShow(true);
Station.Fault.INTERLOCK_FAULT.fix(station); //恢复联锁机故障
SimulationDataRepository repository = simulation.getRepository();
//该站范围内区段故障锁闭

View File

@ -17,24 +17,25 @@ import javax.annotation.Resource;
public class TrainPositionService {
@Resource
TrainPositionTimeOverService timeOverService;
@Resource
TrainPositionTimeOverService timeOverService;
/**
* 初始化或更新列车的位置
* @param mapName
* @param json
*/
/**
* 初始化或更新列车的位置
*
* @param mapName
* @param json
*/
public void initTrainOrUpdate(String mapName,String json){
TrainPosition tp = JsonUtils.read(json, TrainPosition.class);
tp.setReceiveTime(System.currentTimeMillis());
log.debug(json);
public void initTrainOrUpdate(String mapName, String json) {
TrainPosition tp = JsonUtils.read(json, TrainPosition.class);
tp.setReceiveTime(System.currentTimeMillis());
log.debug(json);
// SocketMessageVO<TrainPosition> vo = SocketMessageFactory.buildBasic(WebSocketMessageType.YJDDZH_TRAIN_POSITION,tp);
// this.messageService.send(vo);
this.timeOverService.addTrainAccept(mapName,tp);
this.timeOverService.addTrainAccept(mapName, tp);
}
}
}

View File

@ -555,6 +555,7 @@ public class CiApiServiceImpl2 implements CiApiService {
|| Simulation.FunctionalType.EXAM.equals(simulation.getBuildParams().getFunctionalType()))
? true : deviceStation.getRestartTime().plusMinutes(8).isAfter(LocalTime.now()));
if (hasCTCFlag || powerOnFlag) {
deviceStation.setPowerUnlockButtonShow(false);
List<Section> sections = simulation.getRepository().getSectionList();
sections.stream().filter(section -> Objects.equals(section.getDeviceStation(), deviceStation)).forEach(Section::faultUnlock);
return;

View File

@ -303,12 +303,17 @@ public class Simulation extends club.joylink.rtss.simulation.Simulation<Simulati
SimulationBuildParams buildParams = this.getBuildParams();
List<ConversationGroupVO> conversationGroupVOList = buildParams.getMap().getGraphDataNew()
.getConversationGroupMap().get(buildParams.getWorkParamVO().getType());
Map<Long, ConversationGroup> groupMap = conversationGroupVOList.stream().filter(ConversationGroupVO::isValid)
.map(g ->{
ConversationGroup group = new ConversationGroup(this, g);
group.initGroupType();
return group;
}).collect(Collectors.toMap(ConversationGroup::getId, group -> group));
Map<Long, ConversationGroup> groupMap = null;
if (CollectionUtils.isEmpty(conversationGroupVOList)) {
groupMap = new HashMap<>();
} else {
groupMap = conversationGroupVOList.stream().filter(ConversationGroupVO::isValid)
.map(g ->{
ConversationGroup group = new ConversationGroup(this, g);
group.initGroupType();
return group;
}).collect(Collectors.toMap(ConversationGroup::getId, group -> group));
}
overCoverConversationGroupMap(groupMap);
}

View File

@ -7,6 +7,7 @@ import club.joylink.rtss.simulation.cbtc.data.map.*;
import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition;
import club.joylink.rtss.simulation.cbtc.data.support.StationTurnBackStrategyOption;
import club.joylink.rtss.simulation.cbtc.data.vr.*;
import club.joylink.rtss.vo.map.MapCISwitchVO;
import club.joylink.rtss.vo.map.MapGraphDataNewVO;
import club.joylink.rtss.vo.map.MapVO;
import club.joylink.rtss.vo.map.RealLineConfigVO;
@ -114,6 +115,8 @@ public class MapDeviceBuilder {
MapDeviceBuilder.buildCatenary(graphData, elementMap, errMsgList, mapDataBuildResult.getCatenaryMap());
//应答器
MapDeviceBuilder.buildResponderDataRef(graphData, elementMap, errMsgList, mapDataBuildResult.getSectionRespondersMap());
// 设置信号机引导关键道岔信息
initSignalGuideKeySwitch(graphData, elementMap, errMsgList);
if (mapDataBuildResult.getErrMsgList().isEmpty()) {
Map<String, Set<Section>> sectionArriveMap = MapDeviceBuilder.buildNormalStandTrackAdjoinSections(mapDataBuildResult.getDeviceMap());
mapDataBuildResult.setSectionArriveNearMap(sectionArriveMap);
@ -1568,4 +1571,26 @@ public class MapDeviceBuilder {
private static boolean isCross(String type) {
return Objects.equals(type, BusinessConsts.Section.SectionType.Type05);
}
/**
* 初始化信号机的引导关键道岔设置作用于引导信号的开放
* @param graphData 地图信息
* @param elementMap 设备信息
* @param errMsgList 错误提示信息
*/
private static void initSignalGuideKeySwitch(MapGraphDataNewVO graphData, Map<String, MapElement> elementMap, List<String> errMsgList) {
graphData.getSignalList().stream().filter(s -> !CollectionUtils.isEmpty(s.getGuideKeySwitchList())).forEach(s -> {
List<SwitchElement> switchElementList = new ArrayList<>(s.getGuideKeySwitchList().size());
for (MapCISwitchVO ciSwitchVO : s.getGuideKeySwitchList()) {
Switch aSwitch = (Switch) elementMap.get(ciSwitchVO.getSwitchCode());
if (Objects.isNull(aSwitch)) {
errMsgList.add(String.format("编码为[%s]的道岔不存在", ciSwitchVO.getSwitchCode()));
} else {
switchElementList.add(new SwitchElement(aSwitch, ciSwitchVO.isNormal()));
}
}
Signal signal = (Signal) elementMap.get(s.getCode());
signal.setGuideKeySwitchList(switchElementList);
});
}
}

View File

@ -159,6 +159,11 @@ public class Signal extends DelayUnlockDevice {
*/
private List<Signal> replaceSignals;
/**
* 信号机引导关键道岔列表
*/
private List<SwitchElement> guideKeySwitchList;
// ------------------状态属性---------------------
private int mode;

View File

@ -241,6 +241,11 @@ public class Station extends MayOutOfOrderDevice {
*/
private OperationModeApplication operationModeApplication;
/**
* 上电解锁按钮显示状态
*/
private boolean powerUnlockButtonShow;
@Override
public void reset() {
super.reset();
@ -270,6 +275,7 @@ public class Station extends MayOutOfOrderDevice {
planControl = true;
routeSetMode = RouteSetMode.Plan_Set_Route;
operationMode = OperationMode.Center;
powerUnlockButtonShow = false;
}
public List<Stand> getStandOf(boolean right) {

View File

@ -112,6 +112,16 @@ public class StationStatus extends DeviceStatus {
*/
private Station.OperationMode operationMode;
/**
* 车站故障状态
*/
private String fault;
/**
* 上电解锁按钮状态
*/
private Boolean powerUnlockButtonShow;
public StationStatus(Station station) {
super(station.getCode(), station.getDeviceType());
controlMode = station.getControlMode();
@ -135,6 +145,7 @@ public class StationStatus extends DeviceStatus {
planControl = station.isPlanControl();
routeSetMode = station.getRouteSetMode();
operationMode = station.getOperationMode();
powerUnlockButtonShow = station.isPowerUnlockButtonShow();
}
@Override
@ -242,6 +253,17 @@ public class StationStatus extends DeviceStatus {
this.operationMode = station.getOperationMode();
status.setOperationMode(station.getOperationMode());
}
String fault = station.getFault() == null ? null : station.getFault().toString();
if (!Objects.equals(this.fault, fault)) {
this.fault = fault;
status.setFault(fault);
change = true;
}
if (!Objects.equals(powerUnlockButtonShow, station.isPowerUnlockButtonShow())) {
this.powerUnlockButtonShow = station.isPowerUnlockButtonShow();
status.setPowerUnlockButtonShow(station.isPowerUnlockButtonShow());
change = true;
}
return change;
}
@ -266,6 +288,8 @@ public class StationStatus extends DeviceStatus {
statusVO.setPlanControl(planControl);
statusVO.setRouteSetMode(routeSetMode);
statusVO.setOperationMode(operationMode);
statusVO.setFault(fault);
statusVO.setPowerUnlockButtonShow(powerUnlockButtonShow);
return statusVO;
}
}

View File

@ -96,6 +96,17 @@ public class StationStatusVO extends DeviceStatusVO {
private Station.OperationMode operationMode;
/**
* 车站故障状态
*/
private String fault;
/**
* 上电解锁按钮显示状态
*/
@JsonSerialize(using = Boolean2NumSerializer.class)
private Boolean powerUnlockButtonShow;
public StationStatusVO(Station station) {
super(station.getCode(), station.getDeviceType());
}

View File

@ -0,0 +1,41 @@
package club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gxsd;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.PlcGatewayService;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.RealDeviceService;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.PlcGateway;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.RealDeviceConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gzb.GzbSignalConfig;
import club.joylink.rtss.vo.client.project.gzb.GzbSignalConfigVO;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@Slf4j
public abstract class GxsdService implements RealDeviceService {
@Autowired
@Getter
protected PlcGatewayService plcGatewayService;
@Override
public void init(Simulation simulation, RealDeviceConfig deviceConfig) {
//设置plc 继电器的工作模式此配置不在configVo中体现
PlcGateway plcGateway = simulation.getPlcGateway();
Channel channel = plcGateway.getChannel();
log.info("设置plc继电器...");
this.plcGatewayService.writeSingleCoil(0, 14, true, channel);
}
/**
* 检测继电器
*/
public boolean checkElectricRelay(ByteBuf signalStatus) {
boolean rReplay = RealDeviceConfig.getBitOf(signalStatus, 6);
// boolean outReplay = RealDeviceConfig.getBitOf(signalStatus, 14);
log.info("读取继电器... val:" + rReplay);
return rReplay;
}
}

View File

@ -0,0 +1,32 @@
package club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gxsd;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.RealDeviceConfig;
import club.joylink.rtss.util.JsonUtils;
import club.joylink.rtss.vo.client.project.ProjectDeviceVO;
import club.joylink.rtss.vo.client.project.gxsd.GxsdSignalConfigVO;
import club.joylink.rtss.vo.client.project.gzb.GzbSignalConfigVO;
import java.util.Objects;
import lombok.Getter;
@Getter
public class GxsdSignalConfig extends RealDeviceConfig {
private GxsdSignalConfigVO config;
public GxsdSignalConfig(ProjectDeviceVO deviceVO) {
super(deviceVO);
if (Objects.nonNull(deviceVO.getConfig())) {
this.config = JsonUtils.read(deviceVO.getConfig(), GxsdSignalConfigVO.class);
}
}
@Override
public String findDeviceCode() {
return config.findDeviceCode();
}
public static void main(String[] args) {
GxsdSignalConfigVO vo = new GxsdSignalConfigVO();
System.out.println(JsonUtils.writeValueAsString(vo));
}
}

View File

@ -0,0 +1,126 @@
package club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gxsd;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.constant.SignalAspect;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySignal;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySignal.Fault;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.PlcGatewayService;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.RealDeviceService;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.PlcGateway;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.RealDeviceConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gzb.GzbSignalConfig;
import club.joylink.rtss.vo.client.project.gxsd.GxsdSignalConfigVO;
import club.joylink.rtss.vo.client.project.gzb.GzbSignalConfigVO;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import java.util.Objects;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class GxsdSignalServiceImpl extends GxsdService {
@Override
public boolean canHandle(RealDeviceConfig deviceConfig) {
return deviceConfig instanceof GxsdSignalConfig;
}
@Override
public void init(Simulation simulation, RealDeviceConfig deviceConfig) {
super.init(simulation, deviceConfig);
GxsdSignalConfig switchConfig = (GxsdSignalConfig) deviceConfig;
GxsdSignalConfigVO config = switchConfig.getConfig();
PlcGateway plcGateway = simulation.getPlcGateway();
Channel channel = plcGateway.getChannel();
int baseAddr = plcGateway.getConfig().getAddr() + config.getAddr();
this.plcGatewayService.writeSingleCoil(baseAddr, config.getW5(), true, channel);
this.plcGatewayService.writeSingleCoil(baseAddr, config.getW3(), false, channel);
this.plcGatewayService.writeSingleCoil(baseAddr, config.getW4(), false, channel);
this.plcGatewayService.writeSingleCoil(baseAddr, config.getW7(), false, channel);
}
@Override
public void handle(Simulation simulation, RealDeviceConfig deviceConfig, ByteBuf byteBuf) {
PlcGateway plcGateway = simulation.queryPlcGatewayDevice();
GxsdSignalConfig switchConfig = (GxsdSignalConfig) deviceConfig;
VirtualRealitySignal vrSignal = ((VirtualRealitySignal) switchConfig.getMapElement());
if (Objects.isNull(vrSignal)) {
return;
}
GxsdSignalConfigVO config = switchConfig.getConfig();
Channel channel = plcGateway.getChannel();
int baseAddr = plcGateway.getConfig().getAddr() + config.getAddr();
ByteBuf signalStatus = RealDeviceConfig.getDeviceCoilStatus(byteBuf, config.getAddr(), config.getQuantity());
boolean br0 = RealDeviceConfig.getBitOf(signalStatus, config.getR1());//红灯
boolean br3 = RealDeviceConfig.getBitOf(signalStatus, config.getR3());//绿灯或黄灯
boolean w3 = RealDeviceConfig.getBitOf(signalStatus, config.getW3()); //输出 绿灯
boolean w4 = RealDeviceConfig.getBitOf(signalStatus, config.getW4()); //输出 黄灯
boolean w5 = RealDeviceConfig.getBitOf(signalStatus, config.getW5()); //输出 灭灯 开启 默认就是红灯
boolean w7 = RealDeviceConfig.getBitOf(signalStatus, config.getW7()); //输出 红黄灯
SignalAspect aspect = null;
if (br0 && w5) {
aspect = SignalAspect.No;
} else if (br0) {
aspect = SignalAspect.R;
} else if (br3 && w3) {
aspect = SignalAspect.G;
} else if (br3 && w4) {
aspect = SignalAspect.Y;
} else if (w7) {
aspect = SignalAspect.RY;
}
log.info("当前信号灯状态 读红[{}],读绿黄[{}],写红[{}],写黄[{}],写灭灯[{}],写红黄[{}]", br0, br3, w3, w4, w5, w7);
if (Objects.nonNull(aspect)) {
vrSignal.apply(aspect);
}
if (!this.checkElectricRelay(signalStatus)) {
return;
}
if (!vrSignal.isTurning()) {
return;
}
switch (vrSignal.getCommand()) {
case RY: {
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW3(), w3, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW4(), w4, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW5(), w5, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW7(), w7, true, channel);
break;
}
case G: {
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW3(), w3, true, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW4(), w4, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW5(), w5, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW7(), w7, false, channel);
break;
}
case Y: {
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW3(), w3, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW4(), w4, true, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW5(), w5, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW7(), w7, false, channel);
break;
}
case R:
case No: {
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW3(), w3, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW4(), w4, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW5(), w5, true, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW7(), w7, false, channel);
break;
}
}
}
}

View File

@ -0,0 +1,97 @@
package club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gxsd;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.RealDeviceConfig;
import club.joylink.rtss.util.JsonUtils;
import club.joylink.rtss.vo.client.project.ProjectDeviceVO;
import club.joylink.rtss.vo.client.project.gxsd.GxsdSignalConfigVO;
import club.joylink.rtss.vo.client.project.gxsd.GxsdSwitchConfigVO;
import club.joylink.rtss.vo.client.project.gzb.GzbSwitchConfigVO;
import java.time.LocalDateTime;
import java.util.Objects;
import lombok.Getter;
@Getter
public class GxsdSwitchConfig extends RealDeviceConfig {
private GxsdSwitchConfigVO config;
/**
* 下令定操
*/
private boolean turnToN;
/**
* 下令反操
*/
private boolean turnToP;
/**
* 定反操继电器接通时刻 3s后断开继电器防止继电器长期接通
*/
private LocalDateTime startTime;
public GxsdSwitchConfig(ProjectDeviceVO deviceVO) {
super(deviceVO);
if (Objects.nonNull(deviceVO.getConfig())) {
this.config = JsonUtils.read(deviceVO.getConfig(), GxsdSwitchConfigVO.class);
}
}
@Override
public String findDeviceCode() {
return config.findDeviceCode();
}
/**
* 请求转向定位
*
* @return 是否可以操作继电器以转向定位
*/
public boolean turnToN() {
if (turnToN) {
return false;
} else {
turnToN = true;
turnToP = false;
startTime = LocalDateTime.now();
return true;
}
}
/**
* 请求转向反位
*
* @return 是否可以操作继电器以转向反位
*/
public boolean turnToP() {
if (turnToP) {
return false;
} else {
turnToN = false;
turnToP = true;
startTime = LocalDateTime.now();
return true;
}
}
/**
* 定反操的继电器操作是否可以结束
*/
public boolean isEnd() {
return startTime == null || LocalDateTime.now().isAfter(startTime.plusSeconds(3));
}
/**
* 同步道岔状态表示以限定此时道岔可以进行的操作 此方法是为了防止类似以下情况通过仿真将道岔操到定位再手摇道岔到反位则此时仿真中道岔表示为反位 只能执行定操又因此处记录上一次操作也是定操不予执行导致死循环仿真中无法再操作道岔了
*/
public void sync(boolean r_db, boolean r_fb) {
if (r_db) {
turnToN = true;
turnToP = false;
} else if (r_fb) {
turnToN = false;
turnToP = true;
}
}
}

View File

@ -0,0 +1,118 @@
package club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gxsd;
import club.joylink.rtss.simulation.cbtc.Simulation;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySignal;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySwitch;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.PlcGatewayService;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.PlcGateway;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.RealDeviceConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gzb.GzbSignalConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.say.SaySwitchConfig;
import club.joylink.rtss.vo.client.project.gxsd.GxsdSwitchConfigVO;
import club.joylink.rtss.vo.client.project.say.SaySwitchConfigVO;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import java.util.Objects;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class GxsdSwitchServiceImpl extends GxsdService {
@Override
public boolean canHandle(RealDeviceConfig deviceConfig) {
return deviceConfig instanceof GxsdSwitchConfig;
}
@Override
public void init(Simulation simulation, RealDeviceConfig deviceConfig) {
super.init(simulation, deviceConfig);
PlcGateway plcGateway = simulation.queryPlcGatewayDevice();
if (plcGateway == null) {
return;
}
GxsdSwitchConfig switchConfig = (GxsdSwitchConfig) deviceConfig;
GxsdSwitchConfigVO configVO = switchConfig.getConfig();
int baseAddr = plcGateway.getConfig().getAddr() + configVO.getAddr();
Channel channel = plcGateway.getChannel();
plcGatewayService.writeSingleCoil(baseAddr, configVO.getWdc(), false, channel);
plcGatewayService.writeSingleCoil(baseAddr, configVO.getWfc(), false, channel);
plcGatewayService.writeSingleCoil(baseAddr, configVO.getWsj(), false, channel);
}
@Override
public void handle(Simulation simulation, RealDeviceConfig deviceConfig, ByteBuf byteBuf) {
PlcGateway plcGateway = simulation.queryPlcGatewayDevice();
if (plcGateway == null) {
return;
}
GxsdSwitchConfig config = (GxsdSwitchConfig) deviceConfig;
GxsdSwitchConfigVO configVO = config.getConfig();
ByteBuf deviceStatus = RealDeviceConfig.getDeviceCoilStatus(byteBuf, configVO.getAddr(), configVO.getQuantity());
int baseAddr = plcGateway.getConfig().getAddr() + configVO.getAddr();
Channel channel = plcGateway.getChannel();
VirtualRealitySwitch vrSwitch = (VirtualRealitySwitch) config.getMapElement();
if (vrSwitch == null) {
release(deviceStatus, baseAddr, configVO, channel); //防止定反操继电器长时间接通
return;
}
boolean r_db = RealDeviceConfig.getBitOf(deviceStatus, configVO.getRdc());
boolean r_fb = RealDeviceConfig.getBitOf(deviceStatus, configVO.getRfc());
vrSwitch.apply(r_db, r_fb);
if (!this.checkElectricRelay(deviceStatus)) {
return;
}
//以下操作实体设备的逻辑中防止继电器长期接通的逻辑将定反操视为技能共用3秒冷却技能持续时间也是3秒
if (config.isEnd()) { //此判断既可视为操作是否冷却也可视为持续时间是否耗尽
config.sync(r_db, r_fb);
release(deviceStatus, baseAddr, configVO, channel); //操作持续时间耗尽后断开所有继电器
if (vrSwitch.isTurning()) {
switch (vrSwitch.getCommand()) {
case NP:
if (config.turnToN()) {
turnToN(deviceStatus, baseAddr, configVO, channel);
}
break;
case RP:
if (config.turnToP()) {
turnToP(deviceStatus, baseAddr, configVO, channel);
}
break;
}
}
}
}
private void turnToN(ByteBuf deviceStatus, int baseAddr, GxsdSwitchConfigVO configVO, Channel channel) {
boolean w_sb = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWsj());
boolean w_dc = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWdc());
boolean w_fc = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWfc());
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWsj(), w_sb, true, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWdc(), w_dc, true, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWfc(), w_fc, false, channel);
}
private void turnToP(ByteBuf deviceStatus, int baseAddr, GxsdSwitchConfigVO configVO, Channel channel) {
boolean w_sb = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWsj());
boolean w_dc = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWdc());
boolean w_fc = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWfc());
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWsj(), w_sb, true, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWdc(), w_dc, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWfc(), w_fc, true, channel);
}
private void release(ByteBuf deviceStatus, int baseAddr, GxsdSwitchConfigVO configVO, Channel channel) {
boolean w_sb = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWsj());
boolean w_dc = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWdc());
boolean w_fc = RealDeviceConfig.getBitOf(deviceStatus, configVO.getWfc());
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWsj(), w_sb, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWdc(), w_dc, false, channel);
plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, configVO.getWfc(), w_fc, false, channel);
}
}

View File

@ -377,6 +377,14 @@ public enum WebSocketMessageType {
/**
* ------------ 新实训消息 -----------
*/
/**
* 实训准备开始其他成员加载实训内容消息
*/
Simulation_Training_Prepare_Start,
/**
* 实训开始结束状态
*/
Simulation_Training_Status,
/**
* 步骤开始时提示信息
*/
@ -395,7 +403,7 @@ public enum WebSocketMessageType {
/**
* 实训完成
*/
Simulation_Training_Finish
Simulation_Training_Finish,
/** ------------ 新实训消息 ----------- */
;
}

View File

@ -155,12 +155,14 @@ public class SocketMessageFactory {
break;
}
// 20220819
case Simulation_Training_Prepare_Start:
case Simulation_Training_Step_Tip:
case Simulation_Training_Step_Finish:
case Simulation_Training_Audio_MATCH_RESULT:
// case Simulation_Training_Operate_Error:
// case Simulation_Training_Operate_Finish:
case Simulation_Training_Finish: {
case Simulation_Training_Finish:
case Simulation_Training_Status: {
topicList.add(String.format(WebSocketSubscribeTopic.AssistantSimulation, group));
topicList.add(String.format(WebSocketSubscribeTopic.Simulation, group));
topicList.add(String.format(WebSocketSubscribeTopic.Sandbox3D, group));

View File

@ -5,6 +5,8 @@ import club.joylink.rtss.entity.ProjectDevice;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.PlcGateway;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.device.RealDeviceConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gxsd.GxsdSignalConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gxsd.GxsdSwitchConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gzb.GzbSignalConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.gzb.GzbSwitchConfig;
import club.joylink.rtss.simulation.cbtc.device.real.modbustcp.heb.device.*;
@ -47,349 +49,377 @@ import java.util.Objects;
@NoArgsConstructor
public class ProjectDeviceVO {
private Long id;
/**
* 所属项目
*/
private Long id;
/**
* 所属项目
*/
// @NotBlank(message = "所属项目编码不能为空")
private String project;
private String project;
/**
* 设备编号或名称一个项目下唯一
*/
@NotBlank(message = "设备编号(或名称)不能为空")
private String code;
/**
* 设备编号或名称一个项目下唯一
*/
@NotBlank(message = "设备编号(或名称)不能为空")
private String code;
/**
* 设备类型
*/
private ProjectDeviceType type;
/**
* 设备类型
*/
private ProjectDeviceType type;
/**
* 创建人
*/
private Long creator;
/**
* 创建人
*/
private Long creator;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 设备网关映射配置
*/
private String config;
/**
* 设备网关映射配置
*/
private String config;
public ProjectDeviceVO(ProjectDevice device) {
this.id = device.getId();
this.project = device.getProjectCode();
this.code = device.getCode();
this.type = ProjectDeviceType.valueOf(device.getType());
this.creator = device.getCreator();
this.createTime = device.getCreateTime();
this.config = device.getConfig();
public ProjectDeviceVO(ProjectDevice device) {
this.id = device.getId();
this.project = device.getProjectCode();
this.code = device.getCode();
this.type = ProjectDeviceType.valueOf(device.getType());
this.creator = device.getCreator();
this.createTime = device.getCreateTime();
this.config = device.getConfig();
}
public static List<ProjectDeviceVO> convert2VOList(List<ProjectDevice> list) {
List<ProjectDeviceVO> voList = new ArrayList<>();
if (!CollectionUtils.isEmpty(list)) {
list.forEach(projectDevice -> voList.add(new ProjectDeviceVO(projectDevice)));
}
return voList;
}
public static List<ProjectDeviceVO> convert2VOList(List<ProjectDevice> list) {
List<ProjectDeviceVO> voList = new ArrayList<>();
if (!CollectionUtils.isEmpty(list)) {
list.forEach(projectDevice -> voList.add(new ProjectDeviceVO(projectDevice)));
public static List<RealDeviceConfig> convert2RealDeviceList(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
if (!CollectionUtils.isEmpty(voList)) {
String project = voList.get(0).getProject();
String projectCode = StringUtils.hasText(project) ? project.toUpperCase() : "";
switch (projectCode) {
case "XTY": {
return xtyDeviceConfigConvert(voList);
}
return voList;
}
public static List<RealDeviceConfig> convert2RealDeviceList(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
if (!CollectionUtils.isEmpty(voList)) {
String project = voList.get(0).getProject();
switch (project) {
case "XTY": {
return xtyDeviceConfigConvert(voList);
}
case "GZB": {
return gzbDeviceConfigConvert(voList);
}
case "HEB": {
return heb1DeviceConfigConvert(voList);
}
case "SDY": {
return sdyDeviceConfigConvert(voList);
}
case "RICHOR_JOINT": {
return zjdDeviceConfigConvert(voList);
}
case "SR_SANDBOX": {
return srSandboxDeviceConfigConvert(voList);
}
case "RICHOR_HHCJ": {
return hhcjDeviceConfigConvert(voList);
}
case "SAY": {
return sayDeviceConfigConvert(voList);
}
}
case "GZB": {
return gzbDeviceConfigConvert(voList);
}
return list;
}
private static List<RealDeviceConfig> sayDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case IBP:
list.add(new SayIbpConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
case PSD:
list.add(new SayPsdConfig(deviceVO));
break;
case SIGNAL:
list.add(new SaySignalConfig(deviceVO));
break;
case SWITCH:
list.add(new SaySwitchConfig(deviceVO));
break;
case SECTION:
list.add(new SaySectionConfig(deviceVO));
break;
}
case "HEB": {
return heb1DeviceConfigConvert(voList);
}
return list;
}
private static List<RealDeviceConfig> hhcjDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case IBP:
list.add(new HhcjIbpConfig(deviceVO));
break;
case PSD:
list.add(new HhcjPsdConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
}
case "SDY": {
return sdyDeviceConfigConvert(voList);
}
return list;
}
private static List<RealDeviceConfig> srSandboxDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case UDP_LOW:
list.add(new UDPLowConfig(deviceVO));
break;
case UDP_CLIENT:
list.add(new UDPClientConfig(deviceVO));
break;
case SIGNAL:
list.add(new SrSignalConfig(deviceVO));
break;
case SECTION:
list.add(new SrSectionConfig(deviceVO));
break;
case SWITCH:
list.add(new SrSwitchConfig(deviceVO));
break;
case TRAIN:
list.add(new SrTrainConfig(deviceVO));
break;
}
case "RICHOR_JOINT": {
return zjdDeviceConfigConvert(voList);
}
return list;
}
private static List<RealDeviceConfig> zjdDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case IBP:
list.add(new ZjdIbpConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
case PSD:
list.add(new ZjdPsdConfig(deviceVO));
break;
case PSL:
list.add(new ZjdPslConfig(deviceVO));
break;
}
case "SR_SANDBOX": {
return srSandboxDeviceConfigConvert(voList);
}
return list;
}
private static List<RealDeviceConfig> sdyDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case PSD:
list.add(new SdyPsdConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
case PSL:
list.add(new SdyPslConfig(deviceVO));
break;
}
case "RICHOR_HHCJ": {
return hhcjDeviceConfigConvert(voList);
}
return list;
}
private static List<RealDeviceConfig> heb1DeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case SWITCH:
list.add(new Heb1SwitchConfig(deviceVO));
break;
case SIGNAL:
list.add(new Heb1SignalConfig(deviceVO));
break;
case PSC:
list.add(new Heb1PscConfig(deviceVO));
break;
case PSL:
list.add(new Heb1PslConfig(deviceVO));
break;
case IBP:
list.add(new Heb1IbpConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
default: {
log.warn(String.format("设备[%s]不是PLC可连接控制设备", deviceVO));
break;
}
}
case "SAY": {
return sayDeviceConfigConvert(voList);
}
return list;
}
private static List<RealDeviceConfig> gzbDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case SWITCH:
list.add(new GzbSwitchConfig(deviceVO));
break;
case SIGNAL:
list.add(new GzbSignalConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
default: {
log.warn(String.format("设备[%s]不是PLC可连接控制设备", deviceVO));
break;
}
}
case "GXSD": {
return gxsdDeviceConfigConvert(voList);
}
return list;
}
}
private static List<RealDeviceConfig> xtyDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case PSD:
list.add(new XtyPsdConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
}
return list;
}
private static List<RealDeviceConfig> gxsdDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case SWITCH:
list.add(new GxsdSwitchConfig(deviceVO));
break;
case SIGNAL:
list.add(new GxsdSignalConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
default: {
log.warn(String.format("设备[%s]不是PLC可连接控制设备", deviceVO));
break;
}
return list;
}
}
return list;
}
@JsonIgnore
public ProjectDevice buildDB() {
ProjectDevice device = new ProjectDevice();
device.setProjectCode(this.getProject());
device.setCode(this.getCode());
device.setType(this.getType().name());
return device;
private static List<RealDeviceConfig> sayDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case IBP:
list.add(new SayIbpConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
case PSD:
list.add(new SayPsdConfig(deviceVO));
break;
case SIGNAL:
list.add(new SaySignalConfig(deviceVO));
break;
case SWITCH:
list.add(new SaySwitchConfig(deviceVO));
break;
case SECTION:
list.add(new SaySectionConfig(deviceVO));
break;
}
}
return list;
}
@Override
public String toString() {
return "ProjectDeviceVO{" +
"project=" + project +
", code='" + code + '\'' +
", type=" + type +
'}';
private static List<RealDeviceConfig> hhcjDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case IBP:
list.add(new HhcjIbpConfig(deviceVO));
break;
case PSD:
list.add(new HhcjPsdConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
}
}
return list;
}
public LwConfigVO buildLwConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.LW), "设备不是[现地工作站]");
return JsonUtils.read(this.config, LwConfigVO.class);
private static List<RealDeviceConfig> srSandboxDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case UDP_LOW:
list.add(new UDPLowConfig(deviceVO));
break;
case UDP_CLIENT:
list.add(new UDPClientConfig(deviceVO));
break;
case SIGNAL:
list.add(new SrSignalConfig(deviceVO));
break;
case SECTION:
list.add(new SrSectionConfig(deviceVO));
break;
case SWITCH:
list.add(new SrSwitchConfig(deviceVO));
break;
case TRAIN:
list.add(new SrTrainConfig(deviceVO));
break;
}
}
return list;
}
public VrIbpConfigVO buildVrIbpConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.IBP), "设备不是[IBP盘]");
return JsonUtils.read(this.config, VrIbpConfigVO.class);
private static List<RealDeviceConfig> zjdDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case IBP:
list.add(new ZjdIbpConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
case PSD:
list.add(new ZjdPsdConfig(deviceVO));
break;
case PSL:
list.add(new ZjdPslConfig(deviceVO));
break;
}
}
return list;
}
public LswConfigVO buildLswConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.LSW), "设备不是[大屏工作站]");
return JsonUtils.read(this.config, LswConfigVO.class);
private static List<RealDeviceConfig> sdyDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case PSD:
list.add(new SdyPsdConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
case PSL:
list.add(new SdyPslConfig(deviceVO));
break;
}
}
return list;
}
public RelationLoginConfigVO buildRelationLoginConfig() {
if (StringUtils.isEmpty(this.config)) {
return null;
private static List<RealDeviceConfig> heb1DeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case SWITCH:
list.add(new Heb1SwitchConfig(deviceVO));
break;
case SIGNAL:
list.add(new Heb1SignalConfig(deviceVO));
break;
case PSC:
list.add(new Heb1PscConfig(deviceVO));
break;
case PSL:
list.add(new Heb1PslConfig(deviceVO));
break;
case IBP:
list.add(new Heb1IbpConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
default: {
log.warn(String.format("设备[%s]不是PLC可连接控制设备", deviceVO));
break;
}
return JsonUtils.read(this.config, RelationLoginConfigVO.class);
}
}
return list;
}
public SwitchConfigVO buildSwitchConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.SWITCH), "设备不是[道岔]");
return JsonUtils.read(this.config, SwitchConfigVO.class);
private static List<RealDeviceConfig> gzbDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case SWITCH:
list.add(new GzbSwitchConfig(deviceVO));
break;
case SIGNAL:
list.add(new GzbSignalConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
default: {
log.warn(String.format("设备[%s]不是PLC可连接控制设备", deviceVO));
break;
}
}
}
return list;
}
public PslConfigVO buildPslConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.PSL), "设备不是[端头屏蔽门控制盒]");
return JsonUtils.read(this.config, PslConfigVO.class);
private static List<RealDeviceConfig> xtyDeviceConfigConvert(List<ProjectDeviceVO> voList) {
List<RealDeviceConfig> list = new ArrayList<>();
for (ProjectDeviceVO deviceVO : voList) {
switch (deviceVO.getType()) {
case PSD:
list.add(new XtyPsdConfig(deviceVO));
break;
case PLC_GATEWAY:
list.add(new PlcGateway(deviceVO));
break;
}
}
return list;
}
public IbpConfigVO buildIbpConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.IBP), "设备不是[IBP]");
return JsonUtils.read(this.config, IbpConfigVO.class);
}
@JsonIgnore
public ProjectDevice buildDB() {
ProjectDevice device = new ProjectDevice();
device.setProjectCode(this.getProject());
device.setCode(this.getCode());
device.setType(this.getType().name());
return device;
}
public PscConfigVO buildPscConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.PSC), "设备不是[PSC]");
return JsonUtils.read(this.config, PscConfigVO.class);
}
@Override
public String toString() {
return "ProjectDeviceVO{" +
"project=" + project +
", code='" + code + '\'' +
", type=" + type +
'}';
}
public PlcGatewayConfigVO buildPlcGatewayConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.PLC_GATEWAY), "设备不是[PLC网关]");
return JsonUtils.read(this.config, PlcGatewayConfigVO.class);
public LwConfigVO buildLwConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.LW), "设备不是[现地工作站]");
return JsonUtils.read(this.config, LwConfigVO.class);
}
public VrIbpConfigVO buildVrIbpConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.IBP), "设备不是[IBP盘]");
return JsonUtils.read(this.config, VrIbpConfigVO.class);
}
public LswConfigVO buildLswConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.LSW), "设备不是[大屏工作站]");
return JsonUtils.read(this.config, LswConfigVO.class);
}
public RelationLoginConfigVO buildRelationLoginConfig() {
if (StringUtils.isEmpty(this.config)) {
return null;
}
return JsonUtils.read(this.config, RelationLoginConfigVO.class);
}
public SwitchConfigVO buildSwitchConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.SWITCH), "设备不是[道岔]");
return JsonUtils.read(this.config, SwitchConfigVO.class);
}
public PslConfigVO buildPslConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.PSL),
"设备不是[端头屏蔽门控制盒]");
return JsonUtils.read(this.config, PslConfigVO.class);
}
public IbpConfigVO buildIbpConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.IBP), "设备不是[IBP]");
return JsonUtils.read(this.config, IbpConfigVO.class);
}
public PscConfigVO buildPscConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.PSC), "设备不是[PSC]");
return JsonUtils.read(this.config, PscConfigVO.class);
}
public PlcGatewayConfigVO buildPlcGatewayConfig() {
BusinessExceptionAssertEnum
.SYSTEM_EXCEPTION
.assertTrue(Objects.equals(this.getType(), ProjectDeviceType.PLC_GATEWAY),
"设备不是[PLC网关]");
return JsonUtils.read(this.config, PlcGatewayConfigVO.class);
}
}

View File

@ -0,0 +1,53 @@
package club.joylink.rtss.vo.client.project.gxsd;
import club.joylink.rtss.vo.client.project.RealConfigVO;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
/**
*广西水利电力职业技术学院项目信号机配置
*/
public class GxsdSignalConfigVO extends RealConfigVO {
/**
* 信号输入位 红灯
*/
private Integer r1 = 1;
/**
* 信号输入位 绿灯或黄灯
*/
private Integer r3 = 3;
/**
* 信号输出控制位 绿灯
*/
private Integer w3 = 11;
/**
* 信号输出控制位 黄灯
*/
private Integer w4 = 12;
/**
* 信号输出控制位 灭灯 开启 默认就是红灯
*/
private Integer w5 = 13;
/**
* 信号输出控制位 红黄灯
*/
private Integer w7 = 15;
public GxsdSignalConfigVO() {
super(0, 16);
}
@Override
public String findDeviceCode() {
return null;
}
}

View File

@ -0,0 +1,56 @@
package club.joylink.rtss.vo.client.project.gxsd;
import club.joylink.rtss.vo.client.project.RealConfigVO;
import lombok.Getter;
import lombok.Setter;
/**
* 广西水利电力职业技术学院项目道岔配置
*/
@Getter
@Setter
public class GxsdSwitchConfigVO extends RealConfigVO {
/**
* 设置定反位锁机
* 道岔定位/反位
* 设置锁接
* 设置道岔定位/反位3秒后取消定反操
* 道岔到位 取消锁接
*/
/**
* 读反位
*/
private Integer rfc = 0;
/**
* 读定位
*/
private Integer rdc = 2;
/**
* 写反操
*/
private Integer wfc = 10;
/**
* 写定操
*/
private Integer wdc = 9;
/**
* 锁接
*/
private Integer wsj = 8;
public GxsdSwitchConfigVO() {
super(0, 16);
}
@Override
public String findDeviceCode() {
return null;
}
}

View File

@ -254,6 +254,12 @@ public class MapGraphDataNewVO {
*/
private Map<Simulation.Type, List<MapClientVO>> mapClientVOMap = new HashMap<>();
/**
* 上电解锁按钮
*/
private List<MapPowerUnlockButtonVO> powerUnLockButtonList;
public MapGraphDataNewVO() {
this.bigScreenConfig = new BigScreenConfig();
this.generateConfig = new MapCiGenerateConfig();
@ -288,6 +294,7 @@ public class MapGraphDataNewVO {
this.arrowList = new ArrayList<>();
this.directionRodList = new ArrayList<>();
this.responderList = new ArrayList<>();
this.powerUnLockButtonList = new ArrayList<>();
}
public static MapGraphDataNewVO parse(String graphData) {

View File

@ -0,0 +1,26 @@
package club.joylink.rtss.vo.map.graph;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* 上电解锁按钮
*/
@Getter
@Setter
public class MapPowerUnlockButtonVO {
@NotBlank(message = "code不能为空")
private String code;
private String name;
/**
* 所属设备集中站code
*/
private String stationCode;
private Point position;
}

View File

@ -1,6 +1,7 @@
package club.joylink.rtss.vo.map.graph;
import club.joylink.rtss.simulation.cbtc.data.map.Signal;
import club.joylink.rtss.vo.map.MapCISwitchVO;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
@ -202,6 +203,11 @@ public class MapSignalNewVO {
*/
private String srCode;
/**
* 引导关键道岔列表
*/
private List<MapCISwitchVO> guideKeySwitchList;
@JsonIgnore
public boolean isShunting() {
return Signal.SignalType.SHUNTING.equals(this.type);