新仿真运行流程调整

新仿真逻辑——计算机联锁模块数据构建.
This commit is contained in:
walker-sheng 2021-03-25 18:23:24 +08:00
parent 354f676238
commit 98fed5f681
21 changed files with 420 additions and 62 deletions

View File

@ -65,8 +65,6 @@ public class SimulationV1Controller {
@ApiIgnore @RequestAttribute(name = AuthenticateInterceptor.LOGIN_INFO_KEY) @ApiIgnore @RequestAttribute(name = AuthenticateInterceptor.LOGIN_INFO_KEY)
LoginUserInfoVO loginUserInfoVO) { LoginUserInfoVO loginUserInfoVO) {
String simulation = this.groupSimulationService.simulation(mapId, prdType, loginUserInfoVO); String simulation = this.groupSimulationService.simulation(mapId, prdType, loginUserInfoVO);
long end = System.currentTimeMillis();
System.out.println(end);
return simulation; return simulation;
} }

View File

@ -87,7 +87,7 @@ public class RoutingGenerator {
Set<Section> leftDirectionList = new HashSet<>(); Set<Section> leftDirectionList = new HashSet<>();
sectionDirectionSectionsMap.put(this.buildSectionDirectionKey(section, false), leftDirectionList); sectionDirectionSectionsMap.put(this.buildSectionDirectionKey(section, false), leftDirectionList);
this.queryAdjoinSections(section, false, leftDirectionList); this.queryAdjoinSections(section, false, leftDirectionList);
System.out.println(String.format("区段[%s][右向]邻接区段为[%s],[左向]邻接区段为[%s]", log.debug(String.format("区段[%s][右向]邻接区段为[%s],[左向]邻接区段为[%s]",
section.debugStr(), section.debugStr(),
String.join(",",rightDirectionList.stream().map(Section::debugStr).collect(Collectors.toList())), String.join(",",rightDirectionList.stream().map(Section::debugStr).collect(Collectors.toList())),
String.join(",", leftDirectionList.stream().map(Section::debugStr).collect(Collectors.toList())))); String.join(",", leftDirectionList.stream().map(Section::debugStr).collect(Collectors.toList()))));

View File

@ -112,7 +112,6 @@ public class LicenseServiceImpl implements LicenseService {
FileSystemResource fileSystemResource = new FileSystemResource(License_File_Path); FileSystemResource fileSystemResource = new FileSystemResource(License_File_Path);
if (!fileSystemResource.exists()) { if (!fileSystemResource.exists()) {
File parentFile = fileSystemResource.getFile().getParentFile(); File parentFile = fileSystemResource.getFile().getParentFile();
System.out.println(parentFile.getAbsolutePath());
if (!parentFile.exists()) { if (!parentFile.exists()) {
// 创建目录 // 创建目录
boolean mkdirs = parentFile.mkdirs(); boolean mkdirs = parentFile.mkdirs();

View File

@ -63,11 +63,7 @@ public class AsrService {
conn.getOutputStream().close(); conn.getOutputStream().close();
String result = ConnUtil.getResponseString(conn); String result = ConnUtil.getResponseString(conn);
params.put("speech", "base64Encode(getFileContent(FILENAME))"); params.put("speech", "base64Encode(getFileContent(FILENAME))");
System.out.println("url is : " + ASR_URL);
System.out.println("params is :" + params.toString());
return result; return result;
} }

View File

@ -28,7 +28,7 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
*/ */
private LocalDateTime systemTime; private LocalDateTime systemTime;
private static final int SYSTEM_TIME_RATE = 1; private static final int SYSTEM_TIME_RATE = 20;
private final AtomicBoolean mainLogicRunning = new AtomicBoolean(false); private final AtomicBoolean mainLogicRunning = new AtomicBoolean(false);
/** /**
* 实际运行间隔单位ns * 实际运行间隔单位ns
@ -67,7 +67,7 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
private Map<String, String> destinationMap = new HashMap<>(); private Map<String, String> destinationMap = new HashMap<>();
private static final PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("{", "}"); private static final PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("{", "}");
private List<SimulationSubscribeMessageService> subscribeMessageServiceList; private List<SimulationSubscribeMessageService> subscribeMessageServiceList;
private SimulationMessagePublisher publisher; private SimulationMessagePublisher messagePublisher;
/** /**
* 消息推送线程池 * 消息推送线程池
*/ */
@ -92,16 +92,21 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
} }
private void runAsSpeed() { private void runAsSpeed() {
if (this.future == null) { if (this.future != null) {
ScheduledFuture<?> scheduledFuture = EXECUTOR.scheduleAtFixedRate(()->this.logic(), if (!this.future.cancel(false)) {
SYSTEM_TIME_RATE, SYSTEM_TIME_RATE, TimeUnit.MILLISECONDS); log.warn(String.format("仿真[%s]无法取消任务", this.id));
this.future = scheduledFuture; }
} }
long period = TimeUnit.MILLISECONDS.toNanos(SYSTEM_TIME_RATE) / this.speed;
ScheduledFuture<?> scheduledFuture = EXECUTOR.scheduleAtFixedRate(()->this.logic(),
0, period, TimeUnit.NANOSECONDS);
this.future = scheduledFuture;
this.updateTimeUpdateSpeed(this.speed); this.updateTimeUpdateSpeed(this.speed);
} }
private void updateTimeUpdateSpeed(int speed) { private void updateTimeUpdateSpeed(int speed) {
this.timeAdd = TimeUnit.MILLISECONDS.toNanos(SYSTEM_TIME_RATE) * speed; // this.timeAdd = TimeUnit.MILLISECONDS.toNanos(SYSTEM_TIME_RATE) * speed;
this.timeAdd = TimeUnit.MILLISECONDS.toNanos(SYSTEM_TIME_RATE);
} }
private void logic() { private void logic() {
@ -112,25 +117,37 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
try { try {
this.mainLogicRunning.set(true); this.mainLogicRunning.set(true);
this.systemTime = this.systemTime.plusNanos(timeAdd); this.systemTime = this.systemTime.plusNanos(timeAdd);
for (SimulationScheduledJob scheduledJob : this.scheduledJobMap.values()) {
if (scheduledJob.isTimeToRun(this.systemTime)) {
scheduledJob.run();
scheduledJob.updateNextRunTime(this.systemTime);
}
}
for (SimulationDelayJob delayJob : this.delayJobMap.values()) { for (SimulationDelayJob delayJob : this.delayJobMap.values()) {
if (delayJob.isTimeToRun(systemTime)) { if (delayJob.isTimeToRun(systemTime)) {
EXECUTOR.execute(delayJob); EXECUTOR.execute(delayJob);
this.delayJobMap.remove(delayJob.getId()); this.delayJobMap.remove(delayJob.getId());
} }
} }
for (SimulationScheduledJob scheduledJob : this.scheduledJobMap.values()) {
if (scheduledJob.isTimeToRun(this.systemTime)) {
// 系统时间更新随着速度增大而增大可能几倍于有些定时任务的频率根据计算将执行频率补上
// int n = 1;
// if (!scheduledJob.isFixed()) {
// n = scheduledJob.calculateRunTimes(timeAdd);
// }
// if (n <= 1) {
// scheduledJob.run();
// } else {
// for (int i = 0; i < n; i++) {
// scheduledJob.run();
// }
// }
scheduledJob.run();
scheduledJob.updateNextRunTime(this.systemTime);
}
}
} catch (Throwable e) { } catch (Throwable e) {
this.runError(e); this.runError(e);
log.error(String.format("仿真[%s]主线程逻辑执行异常,仿真停止运行", this.id), e); log.error(String.format("仿真[%s]主线程逻辑执行异常,仿真停止运行", this.id), e);
} finally { } finally {
this.mainLogicRunning.set(false); this.mainLogicRunning.set(false);
long take = System.nanoTime() - start; long take = System.nanoTime() - start;
log.debug(String.format("仿真[%s]执行时长: %sms", TimeUnit.NANOSECONDS.toMillis(take))); // log.debug(String.format("仿真[%s]执行时长: %sms", this.id, TimeUnit.NANOSECONDS.toMillis(take)));
} }
} }
@ -271,7 +288,9 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
this.speed = speed; this.speed = speed;
int state = this.state.get(); int state = this.state.get();
this.pause(); this.pause();
this.updateTimeUpdateSpeed(this.speed); log.debug(String.format("仿真[%s]更新速度为:[%s]", this.id, speed));
// this.updateTimeUpdateSpeed(this.speed);
this.runAsSpeed();
for (SimulationScheduledJob job : this.scheduledJobMap.values()) { for (SimulationScheduledJob job : this.scheduledJobMap.values()) {
job.updateRunPeriod(speed); job.updateRunPeriod(speed);
} }
@ -367,8 +386,8 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
return this.simulationUserMap.remove(id); return this.simulationUserMap.remove(id);
} }
public void setPublisher(SimulationMessagePublisher publisher) { public void setMessagePublisher(SimulationMessagePublisher messagePublisher) {
this.publisher = publisher; this.messagePublisher = messagePublisher;
} }
public void publishMessage(String destination, Object message) { public void publishMessage(String destination, Object message) {
@ -391,12 +410,12 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
public void publishMessageToUser0(String userId, String destination, Object message) { public void publishMessageToUser0(String userId, String destination, Object message) {
if (userId != null && message != null) { if (userId != null && message != null) {
Message_Executor.execute(() -> this.publisher.publishToUser(userId, destination, message)); Message_Executor.execute(() -> this.messagePublisher.publishToUser(userId, destination, message));
} }
} }
private void checkPublisherExist() { private void checkPublisherExist() {
if (this.publisher == null) { if (this.messagePublisher == null) {
throw new UnsupportedOperationException(String.format("仿真[%s]没有消息发布对象:publisher = null.无法发布消息", this.id)); throw new UnsupportedOperationException(String.format("仿真[%s]没有消息发布对象:publisher = null.无法发布消息", this.id));
} }
} }

View File

@ -24,7 +24,7 @@ public class SimulationManager {
BusinessExceptionAssertEnum.DATA_ALREADY_EXIST.assertNotTrue(simulationCache.containsKey(simulation.getId()), BusinessExceptionAssertEnum.DATA_ALREADY_EXIST.assertNotTrue(simulationCache.containsKey(simulation.getId()),
String.format("已经存在id为[%s]的仿真[%s]", simulation.getId(), simulation.debugStr())); String.format("已经存在id为[%s]的仿真[%s]", simulation.getId(), simulation.debugStr()));
simulationCache.put(simulation.getId(), simulation); simulationCache.put(simulation.getId(), simulation);
simulation.setPublisher(this.defaultMessagePublisher); // 设置默认的消息发布器 simulation.setMessagePublisher(this.defaultMessagePublisher); // 设置默认的消息发布器
return simulation; return simulation;
} }

View File

@ -2,6 +2,7 @@ package club.joylink.rtss.simulation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -42,6 +43,7 @@ final class SimulationScheduledJob implements Runnable {
this.updateRunPeriod(1); this.updateRunPeriod(1);
} }
int i = 0;
public SimulationScheduledJob(Simulation simulation, String name, SimulationJob job, int rate) { public SimulationScheduledJob(Simulation simulation, String name, SimulationJob job, int rate) {
this(simulation, name, job, rate, false); this(simulation, name, job, rate, false);
} }
@ -58,6 +60,10 @@ final class SimulationScheduledJob implements Runnable {
} }
} }
public boolean isFixed() {
return fixed;
}
public void updateRunPeriod(int speed) { public void updateRunPeriod(int speed) {
if (this.fixed) { if (this.fixed) {
this.runPeriod = TimeUnit.MILLISECONDS.toNanos(this.rate) * speed; this.runPeriod = TimeUnit.MILLISECONDS.toNanos(this.rate) * speed;
@ -72,10 +78,27 @@ final class SimulationScheduledJob implements Runnable {
} }
public void updateNextRunTime(LocalDateTime systemTime) { public void updateNextRunTime(LocalDateTime systemTime) {
this.nextRunTime = systemTime.plusNanos(this.runPeriod); if (this.nextRunTime != null) {
// 弥补非整数倍的情况
long l = Duration.between(this.nextRunTime, systemTime).toNanos();
long l1 = l % this.runPeriod;
long add = this.runPeriod - l1;
this.nextRunTime = systemTime.plusNanos(add);
} else {
this.nextRunTime = systemTime.plusNanos(this.runPeriod);
}
} }
public String getName() { public String getName() {
return name; return name;
} }
/**
*
* @param interval 单位ns
* @return
*/
public int calculateRunTimes(long interval) {
return (int) (interval / TimeUnit.MILLISECONDS.toNanos(this.rate));
}
} }

View File

@ -197,12 +197,10 @@ public class Simulation {
public synchronized void runAdd() { public synchronized void runAdd() {
this.runCount += 1; this.runCount += 1;
// System.out.println(String.format("add, result:%s", this.runCount));
} }
public synchronized void runOver() { public synchronized void runOver() {
this.runCount -= 1; this.runCount -= 1;
// System.out.println(String.format("over, result:%s", this.runCount));
} }
public boolean isJointSimulation() { public boolean isJointSimulation() {

View File

@ -78,7 +78,6 @@ public class GzbSignalServiceImpl implements RealDeviceService {
if (!br0 && !br1 && br2 && !br3 && br4) { // 黄红灯已开 if (!br0 && !br1 && br2 && !br3 && br4) { // 黄红灯已开
return; return;
} }
System.out.println("控制真实信号机开黄红灯");
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, false, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel);
@ -87,7 +86,6 @@ public class GzbSignalServiceImpl implements RealDeviceService {
if (!br0 && !br1 && !br2 && !br3 && br4) { // 红灯已开 if (!br0 && !br1 && !br2 && !br3 && br4) { // 红灯已开
return; return;
} }
System.out.println("控制真实信号机开红灯");
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, false, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel);
@ -96,7 +94,6 @@ public class GzbSignalServiceImpl implements RealDeviceService {
if (br0 && br1 && !br2 && !br3 && br4) { // 绿灯已开 if (br0 && br1 && !br2 && !br3 && br4) { // 绿灯已开
return; return;
} }
System.out.println("控制真实信号机开绿灯");
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, true, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, true, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, true, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, true, channel);
@ -105,7 +102,6 @@ public class GzbSignalServiceImpl implements RealDeviceService {
if (br0 && !br1 && !br2 && !br3 && br4) { // 黄灯已开 if (br0 && !br1 && !br2 && !br3 && br4) { // 黄灯已开
return; return;
} }
System.out.println("控制真实信号机开黄灯");
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, false, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, true, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, true, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel);
@ -114,7 +110,6 @@ public class GzbSignalServiceImpl implements RealDeviceService {
if (!br4) { // 已灭灯 if (!br4) { // 已灭灯
return; return;
} }
System.out.println("控制真实信号机灭灯");
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, true, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW8(), bw8, true, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW9(), bw9, false, channel);
this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel); this.plcGatewayService.checkEqualAndWriteSingleCoil(baseAddr, config.getW10(), bw10, false, channel);

View File

@ -114,21 +114,10 @@ public class PassengerFlowSimulateService {
log.debug(String.format("仿真[%s]没有客流数据,不初始化客流", simulation.debugStr())); log.debug(String.format("仿真[%s]没有客流数据,不初始化客流", simulation.debugStr()));
return; return;
} }
// MapPassengerFlowWithBLOBs passengerFlowEntity = this.mapPassengerFlowDataService.queryMapPassengerFlowData(mapId);
// if (Objects.isNull(passengerFlowEntity)) {
// log.debug(String.format("仿真[%s]没有客流数据,不初始化客流", simulation.debugStr()));
// return;
// }
// long start = System.currentTimeMillis();
//
// PassengerFlowData passengerFlowData = this.mapPassengerFlowDataService.buildPassengerFlowSimulationBo(passengerFlowEntity);
// 初始化客流数据 // 初始化客流数据
Map<String, StandPassengerFlow> standPassengerFlowMap = this.loadStandPassengerFlow(simulation, passengerFlowData); Map<String, StandPassengerFlow> standPassengerFlowMap = this.loadStandPassengerFlow(simulation, passengerFlowData);
Map<String, TrainPassengerFlow> trainPassengerFlowMap = this.loadTrainPassengerFlow(simulation, passengerFlowData); Map<String, TrainPassengerFlow> trainPassengerFlowMap = this.loadTrainPassengerFlow(simulation, passengerFlowData);
long end = System.currentTimeMillis();
System.out.println(String.format("仿真客流初始化共用时:%sms", (end - start)));
PassengerFlowSimulationData data = new PassengerFlowSimulationData( PassengerFlowSimulationData data = new PassengerFlowSimulationData(
simulation.getGroup(), simulation.getGroup(),
passengerFlowData, passengerFlowData,

View File

@ -0,0 +1,16 @@
package club.joylink.rtss.simulation.event;
import club.joylink.rtss.simulation.Simulation;
import lombok.Getter;
@Getter
public class SimulationErrorEvent extends SimulationEvent {
private Throwable e;
public SimulationErrorEvent(Object source, Simulation simulation, Throwable e) {
super(source, simulation);
this.e = e;
}
}

View File

@ -1,10 +1,13 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import lombok.Getter;
import java.util.List; import java.util.List;
/** /**
* 侧防 * 侧防
*/ */
@Getter
public class CilFls { public class CilFls {
String id; String id;
@ -16,9 +19,24 @@ public class CilFls {
List<FlsElement> secondLevelList; List<FlsElement> secondLevelList;
public CilFls(String id, String name) {
this.id = id;
this.name = name;
}
public static class FlsElement { public static class FlsElement {
CilSwitchPosition pp; // 防护道岔 CilSwitchPosition pp; // 防护道岔
CilSignal ps; // 防护信号 CilSignal ps; // 防护信号
CilSwitchPosition pae; // 侧防区域元件 CilSwitchPosition pae; // 侧防区域元件
public FlsElement(CilSwitchPosition pp, CilSwitchPosition pae) {
this.pp = pp;
this.pae = pae;
}
public FlsElement(CilSignal ps, CilSwitchPosition pae) {
this.ps = ps;
this.pae = pae;
}
} }
} }

View File

@ -0,0 +1,14 @@
package club.joylink.rtss.simulation.rt.CIL.bo;
import java.util.List;
public class CilOverlap extends CilDevice {
CilSection releaseSection;
List<CilRoutePathElement> pathElementList;
int releaseTime;
public CilOverlap(String id, String name) {
super(id, name);
}
}

View File

@ -11,16 +11,36 @@ public class CilRepository extends SimulationRepository {
Map<String, CilSection> sectionMap; Map<String, CilSection> sectionMap;
Map<String, CilSwitch> switchMap; Map<String, CilSwitch> switchMap;
Map<String, CilSignal> signalMap; Map<String, CilSignal> signalMap;
Map<String, CilStand> standMap;
Map<String, CilPsd> psdMap;
Map<String, CilEsp> espMap;
Map<String, CilRoute> routeMap;
Map<String, CilAutoSignal> autoSignalMap;
/**
* key-id
*/
Map<String, CilFls> flsMap;
Map<String, CilOverlap> overlapMap;
Map<String, CilServer> cilServerMap;
public CilRepository() { public CilRepository() {
super(NAME); super(NAME);
this.sectionMap = new HashMap<>(); this.sectionMap = new HashMap<>();
this.switchMap = new HashMap<>(); this.switchMap = new HashMap<>();
this.signalMap = new HashMap<>(); this.signalMap = new HashMap<>();
this.standMap = new HashMap<>();
this.psdMap = new HashMap<>();
this.espMap = new HashMap<>();
this.routeMap = new HashMap<>();
this.autoSignalMap = new HashMap<>();
this.flsMap = new HashMap<>();
this.overlapMap = new HashMap<>();
this.cilServerMap = new HashMap<>();
} }
@Override @Override
public void initState() { public void initState() {
} }
} }

View File

@ -1,28 +1,259 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum; import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.vo.client.map.MapSwitchVO;
import club.joylink.rtss.vo.client.map.MapVO; import club.joylink.rtss.vo.client.map.MapVO;
import club.joylink.rtss.vo.client.map.newmap.MapGraphDataNewVO; import club.joylink.rtss.vo.client.map.newmap.*;
import club.joylink.rtss.vo.client.map.newmap.MapSectionNewVO; import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
public class CilRepositoryBuilder { public class CilRepositoryBuilder {
public static CilRepository buildFrom(MapVO mapVO) { public static CilRepository buildFrom(MapVO mapVO) {
CilRepository cilRepository = new CilRepository(); CilRepository cilRepository = new CilRepository();
MapGraphDataNewVO graphDataNew = mapVO.getGraphDataNew(); MapGraphDataNewVO graphDataNew = mapVO.getGraphDataNew();
MapLogicDataNewVO logicDataNew = mapVO.getLogicDataNew();
buildSections(graphDataNew.getSectionList(), cilRepository.sectionMap); buildSections(graphDataNew.getSectionList(), cilRepository.sectionMap);
buildSwitches(graphDataNew.getSwitchList(), cilRepository.switchMap);
buildSignals(graphDataNew.getSignalList(), cilRepository.signalMap);
buildStands(graphDataNew.getStationStandList(), cilRepository.standMap);
buildPsds(graphDataNew.getPsdList(), cilRepository.psdMap);
buildEsps(graphDataNew.getEspList(), cilRepository.espMap);
buildFls(logicDataNew.getFlankProtectionList(), cilRepository.flsMap, cilRepository.sectionMap, cilRepository.switchMap, cilRepository.signalMap);
buildOverlaps(logicDataNew.getOverlapList(), cilRepository.overlapMap, cilRepository.signalMap, cilRepository.sectionMap, cilRepository.switchMap, cilRepository.flsMap);
buildAutoSignals(logicDataNew.getAutoSignalList(), cilRepository.autoSignalMap);
buildRoutes(logicDataNew.getRouteList(), cilRepository.routeMap, cilRepository.signalMap, cilRepository.sectionMap, cilRepository.switchMap, cilRepository.flsMap, cilRepository.overlapMap);
return cilRepository; return cilRepository;
} }
private static void buildSections(List<MapSectionNewVO> sectionList, Map<String, CilSection> sectionMap) { private static void buildSections(List<MapSectionNewVO> sectionList, Map<String, CilSection> sectionMap) {
for (MapSectionNewVO sectionNewVO : sectionList) { for (MapSectionNewVO sectionNewVO : sectionList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(sectionMap.containsKey(sectionNewVO.getCode()), BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(sectionMap.containsKey(sectionNewVO.getCode()),
String.format("存在重复的区段id:[%s]", sectionNewVO.getCode())); String.format("存在id重复的区段:[%s]", sectionNewVO.getCode()));
CilSection cilSection = new CilSection(sectionNewVO.getCode(), sectionNewVO.getName()); CilSection cilSection = new CilSection(sectionNewVO.getCode(), sectionNewVO.getName());
sectionMap.put(cilSection.getId(), cilSection); sectionMap.put(cilSection.getId(), cilSection);
} }
} }
private static void buildSwitches(List<MapSwitchVO> switchList, Map<String, CilSwitch> switchMap) {
for (MapSwitchVO switchVO : switchList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(switchMap.containsKey(switchVO.getCode()),
String.format("存在id重复的道岔:[%s]", switchVO.getCode()));
CilSwitch cilSwitch = new CilSwitch(switchVO.getCode(), switchVO.getName());
switchMap.put(cilSwitch.getId(), cilSwitch);
}
}
private static void buildSignals(List<MapSignalNewVO> signalList, Map<String, CilSignal> signalMap) {
for (MapSignalNewVO signalNewVO : signalList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(signalMap.containsKey(signalNewVO.getCode()),
String.format("存在id重复的信号机:[%s]", signalNewVO.getCode()));
CilSignal cilSignal = new CilSignal(signalNewVO.getCode(), signalNewVO.getUniqueName());
signalMap.put(cilSignal.getId(), cilSignal);
}
}
private static void buildStands(List<MapStationStandNewVO> stationStandList, Map<String, CilStand> standMap) {
for (MapStationStandNewVO standNewVO : stationStandList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(standMap.containsKey(standNewVO.getCode()),
String.format("存在id重复的站台:[%s]", standNewVO.getCode()));
CilStand cilStand = new CilStand(standNewVO.getCode(), standNewVO.getName());
standMap.put(cilStand.getId(), cilStand);
}
}
private static void buildPsds(List<MapPSDVO> psdList, Map<String, CilPsd> psdMap) {
for (MapPSDVO psdVO : psdList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(psdMap.containsKey(psdVO.getCode()),
String.format("存在id重复的屏蔽门:[%s]", psdVO.getCode()));
CilPsd cilPsd = new CilPsd(psdVO.getCode(), psdVO.getName());
psdMap.put(cilPsd.getId(), cilPsd);
}
}
private static void buildEsps(List<MapESPVO> espList, Map<String, CilEsp> espMap) {
for (MapESPVO espVO : espList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(espMap.containsKey(espVO.getCode()),
String.format("存在id重复的紧急停车按钮:[%s]", espVO.getCode()));
CilEsp cilEsp = new CilEsp(espVO.getCode(), espVO.getName());
espMap.put(cilEsp.getId(), cilEsp);
}
}
private static void buildFls(List<MapRouteFlankProtectionNewVO> flankProtectionList,
Map<String, CilFls> flsMap, Map<String, CilSection> sectionMap,
Map<String, CilSwitch> switchMap, Map<String, CilSignal> signalMap) {
if (CollectionUtils.isEmpty(flankProtectionList)) {
return;
}
for (MapRouteFlankProtectionNewVO flankProtectionNewVO : flankProtectionList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(flsMap.containsKey(flankProtectionNewVO.getCode()),
String.format("存在id重复的进路侧防:[%s]", flankProtectionNewVO.getCode()));
CilFls cilFls = new CilFls(flankProtectionNewVO.getCode(), flankProtectionNewVO.getName());
flsMap.put(cilFls.id, cilFls);
MapCISwitchVO source = flankProtectionNewVO.getSource();
CilSwitchPosition switchPosition = new CilSwitchPosition(switchMap.get(source.getSwitchCode()), source.isNormal());
cilFls.target = switchPosition;
List<MapRouteFlankProtectionNewVO.Level> level1List = flankProtectionNewVO.getLevel1List();
List<CilFls.FlsElement> firstLevelList = buildFlsElement(level1List, switchMap, signalMap);
cilFls.firstLevelList = firstLevelList;
List<MapRouteFlankProtectionNewVO.Level> level2List = flankProtectionNewVO.getLevel2List();
List<CilFls.FlsElement> secondLevelList = buildFlsElement(level2List, switchMap, signalMap);
cilFls.firstLevelList = secondLevelList;
}
}
private static List<CilFls.FlsElement> buildFlsElement(List<MapRouteFlankProtectionNewVO.Level> level1List, Map<String, CilSwitch> switchMap, Map<String, CilSignal> signalMap) {
List<CilFls.FlsElement> list = new ArrayList<>();
for (MapRouteFlankProtectionNewVO.Level level : level1List) {
MapCISwitchVO protectSwitch = level.getProtectSwitch();
MapCISwitchVO areaSwitch = level.getAreaSwitch();
CilFls.FlsElement flsElement;
if (protectSwitch != null) {
CilSwitchPosition pp = new CilSwitchPosition(switchMap.get(protectSwitch.getSwitchCode()), protectSwitch.isNormal());
if (areaSwitch != null) {
flsElement = new CilFls.FlsElement(pp,
new CilSwitchPosition(switchMap.get(areaSwitch.getSwitchCode()), areaSwitch.isNormal()));
} else {
flsElement = new CilFls.FlsElement(pp, null);
}
} else {
CilSignal cilSignal = signalMap.get(level.getProtectSignal());
if (areaSwitch != null) {
flsElement = new CilFls.FlsElement(cilSignal,
new CilSwitchPosition(switchMap.get(areaSwitch.getSwitchCode()), areaSwitch.isNormal()));
} else {
flsElement = new CilFls.FlsElement(cilSignal, null);
}
}
list.add(flsElement);
}
return list;
}
private static void buildAutoSignals(List<MapAutoSignalNewVO> autoSignalList, Map<String, CilAutoSignal> autoSignalMap) {
if (CollectionUtils.isEmpty(autoSignalList)) {
return;
}
}
private static void buildOverlaps(List<MapOverlapVO> overlapList, Map<String, CilOverlap> overlapMap,
Map<String, CilSignal> signalMap, Map<String, CilSection> sectionMap,
Map<String, CilSwitch> switchMap, Map<String, CilFls> flsMap) {
for (MapOverlapVO overlapVO : overlapList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(overlapMap.containsKey(overlapVO.getCode()),
String.format("存在id重复的延续保护:[%s]", overlapVO.getCode()));
CilOverlap cilOverlap = new CilOverlap(overlapVO.getCode(), overlapVO.getName());
overlapMap.put(cilOverlap.id, cilOverlap);
CilSection cilSection = sectionMap.get(overlapVO.getUnlockSectionCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(cilSection,
String.format("不存在id为[%s]的区段", overlapVO.getUnlockSectionCode()));
cilOverlap.releaseSection = cilSection;
cilOverlap.releaseTime = overlapVO.getUnlockTime();
CilSignal cilSignal = signalMap.get(overlapVO.getSignalCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(cilSignal,
String.format("不存在id为[%s]的信号机", overlapVO.getSignalCode()));
cilOverlap.pathElementList = buildPathElementList(cilSignal, overlapVO.getPathList(), sectionMap, switchMap, flsMap);
}
}
private static void buildRoutes(List<MapRouteNewVO> routeList, Map<String, CilRoute> routeMap,
Map<String, CilSignal> signalMap, Map<String, CilSection> sectionMap,
Map<String, CilSwitch> switchMap, Map<String, CilFls> flsMap,
Map<String, CilOverlap> overlapMap) {
for (MapRouteNewVO routeNewVO : routeList) {
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(routeMap.containsKey(routeNewVO.getCode()),
String.format("存在id重复的进路:[%s]", routeNewVO.getCode()));
CilRoute cilRoute = new CilRoute(routeNewVO.getCode(), routeNewVO.getName());
routeMap.put(cilRoute.getId(), cilRoute);
CilSignal start = signalMap.get(routeNewVO.getStartSignalCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(start,String.format("不存在id为[%s]的信号机", routeNewVO.getStartSignalCode()));
CilSignal end = signalMap.get(routeNewVO.getEndSignalCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(end,String.format("不存在id为[%s]的信号机", routeNewVO.getStartSignalCode()));
cilRoute.start = start;
cilRoute.end = end;
cilRoute.pathElement = buildPathElement(start, routeNewVO.getRouteSectionList(),
routeNewVO.getRouteSwitchList(), routeNewVO.getFlsList(), sectionMap, switchMap, flsMap);
CilOverlap cilOverlap = overlapMap.get(routeNewVO.getOverlapCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(cilOverlap,
String.format("不存在id为[%s]的延续保护进路", routeNewVO.getOverlapCode()));
cilRoute.overlap = cilOverlap;
cilRoute.arc = routeNewVO.isArc();
cilRoute.flt = routeNewVO.isFlt();
// 扣车站台
List<CilStand> standList = new ArrayList<>();
List<String> holdStandList = routeNewVO.getHoldStandList();
if (!CollectionUtils.isEmpty(holdStandList)) {
for (String standCode : holdStandList) {
}
}
cilRoute.standList = standList;
// 屏蔽门
List<CilPsd> psdList = new ArrayList<>();
List<String> psdCodeList = routeNewVO.getPsdList();
if (!CollectionUtils.isEmpty(psdCodeList)) {
for (String psdCode : psdCodeList) {
}
}
}
}
private static List<CilRoutePathElement> buildPathElementList(CilSignal cilSignal, List<MapSectionPathVO> pathList,
Map<String, CilSection> sectionMap,
Map<String, CilSwitch> switchMap,
Map<String, CilFls> flsMap) {
Objects.requireNonNull(cilSignal);
List<CilRoutePathElement> list = new ArrayList<>();
for (MapSectionPathVO pathVO : pathList) {
list.add(buildPathElement(cilSignal,
pathVO.getSectionList(), pathVO.getSwitchPositionList(), pathVO.getFlsList(),
sectionMap, switchMap, flsMap));
}
return list;
}
private static CilRoutePathElement buildPathElement(CilSignal start, List<String> sectionCodeList,
List<MapCISwitchVO> ciSwitchList, List<String> flsList,
Map<String, CilSection> sectionMap,
Map<String, CilSwitch> switchMap,
Map<String, CilFls> flsMap) {
CilRoutePathElement pathElement = new CilRoutePathElement();
List<CilSection> sectionList = new ArrayList<>();
for (String code : sectionCodeList) {
CilSection cilSection = sectionMap.get(code);
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(cilSection,
String.format("不存在id为[%s]的区段", code));
sectionList.add(cilSection);
}
List<CilSwitchPosition> switchPositionList = new ArrayList<>();
for (MapCISwitchVO ciSwitchVO : ciSwitchList) {
CilSwitch cilSwitch = switchMap.get(ciSwitchVO.getSwitchCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(cilSwitch,
String.format("不存在id为[%s]的道岔", ciSwitchVO.getSwitchCode()));
switchPositionList.add(new CilSwitchPosition(cilSwitch, ciSwitchVO.isNormal()));
}
pathElement.start = start;
pathElement.right = start.right;
pathElement.sectionList = sectionList;
pathElement.switchPositionList = switchPositionList;
// 侧防
List<CilFls> cilFlsList = new ArrayList<>();
if (!CollectionUtils.isEmpty(flsList)) {
for (String flsId : flsList) {
CilFls cilFls = flsMap.get(flsId);
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(cilFls,
String.format("不存在id为[%s]的侧防"));
cilFlsList.add(cilFls);
}
}
pathElement.flsList = cilFlsList;
return pathElement;
}
} }

View File

@ -1,12 +1,34 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import java.util.List;
public class CilRoute extends CilDevice { public class CilRoute extends CilDevice {
int type; // 进路类型
public static final int TYPE_ATP = 1;
public static final int TYPE_GROUND = 2;
public static final int TYPE_GUIDE = 3;
public static final int TYPE_TB = 4;
CilSignal start; CilSignal start;
CilSignal end; CilSignal end;
CilRoutePathElement pathElement;
CilOverlap overlap;
boolean ars; // ATS自排
boolean arc; // 自动追踪/联锁自动触发
boolean flt; // 车队/自动进路
List<CilPsd> psdList;
List<CilEsp> espList;
List<CilStand> standList; // 站台扣车
List<CilRoute> conflictingRouteList;
int signalAspect; // 信号机显示(进路联锁规定)
public static final int SA_RED = 1;
public static final int SA_GREEN = 2;
public static final int SA_YELLOW = 3;
public static final int SA_GUIDE = 4;//引导信号黄红灯显示
int signalState;// 进路信号状态(当前实际状态)
CilPath path;
public CilRoute(String id, String name) { public CilRoute(String id, String name) {
super(id, name); super(id, name);

View File

@ -2,14 +2,15 @@ package club.joylink.rtss.simulation.rt.CIL.bo;
import java.util.List; import java.util.List;
public class CilPath { public class CilRoutePathElement {
boolean right; boolean right;
CilSignal start;
// 区段
List<CilSection> sectionList; List<CilSection> sectionList;
// 道岔位置
List<CilSection> logicSectionList;
List<CilSwitchPosition> switchPositionList; List<CilSwitchPosition> switchPositionList;
// 侧防
List<CilFls> flsList;
} }

View File

@ -7,6 +7,8 @@ public class CilSection extends CilDevice {
CilSection parent; CilSection parent;
List<CilSection> logicList; List<CilSection> logicList;
CilSwitch belongSwitch; CilSwitch belongSwitch;
CilSignal leftSignal;
CilSignal rightSignal;
int axcOccupy; int axcOccupy;

View File

@ -1,7 +1,13 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import java.util.List;
public class CilSignal extends CilDevice { public class CilSignal extends CilDevice {
boolean right;
List<CilSection> approachList;
List<CilSection> ctcApproachList;
int state; int state;
int logic; int logic;
int blockade; int blockade;

View File

@ -1,8 +1,19 @@
package club.joylink.rtss.simulation.rt.CIL.bo; package club.joylink.rtss.simulation.rt.CIL.bo;
import java.util.Objects;
public class CilSwitchPosition { public class CilSwitchPosition {
CilSwitch cilSwitch; CilSwitch cilSwitch;
int position; int position;
public CilSwitchPosition(CilSwitch cilSwitch, int position) {
Objects.requireNonNull(cilSwitch, String.format("道岔不能为null"));
this.cilSwitch = cilSwitch;
this.position = position;
}
public CilSwitchPosition(CilSwitch cilSwitch, boolean normal) {
this(cilSwitch, normal ? CilSwitch.NORMAL : CilSwitch.REVERSE);
}
} }

View File

@ -23,11 +23,11 @@ public class SrSignal extends SrDevice {
int offset; int offset;
int state = CLOSE; int state = CLOSE;
public static final int CLOSE = 1; // 关闭 public static final int CLOSE = 0; // 关闭
public static final int RED = 2; // 红灯信号(禁止信号) public static final int RED = 1; // 红灯信号(禁止信号)
public static final int GREEN = 3; // 绿灯信号(直向通行) public static final int GREEN = 2; // 绿灯信号(直向通行)
public static final int YELLOW = 4; // 黄灯信号(侧向通行) public static final int YELLOW = 3; // 黄灯信号(侧向通行)
public static final int GUIDE = 5; // 引导信号(正线为黄红) public static final int GUIDE = 4; // 引导信号(正线为黄红)
AtomicInteger command = new AtomicInteger(NONE); AtomicInteger command = new AtomicInteger(NONE);
public static final int NONE = 0; public static final int NONE = 0;