Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
joylink_zhangsai 2021-06-17 14:59:59 +08:00
commit f7910e91cc
41 changed files with 506 additions and 217 deletions

View File

@ -102,7 +102,7 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
public void updateState(int state) {
this.state.set(state);
this.fireWatcher();
this.fireWatcher("state", this.state);
}
public void loadModule() {
@ -556,14 +556,19 @@ public abstract class Simulation<U extends SimulationUser, M extends Simulation
watchable.simulation = this;
watcherMap.forEach((typeName, watcher) -> {
if (typeName.equals(watchable.getClass().getTypeName())) {
watchable.register(watcher);
watchable.register(watcher, null);
}
});
}
public void watch(Watchable watchable, Watcher watcher) {
watchable.simulation = this;
watchable.register(watcher);
watchable.register(watcher, null);
}
public void watchField(Watcher watcher, Watchable watchable, List<String> fieldList) {
watchable.simulation = this;
watchable.register(watcher, fieldList);
}
public void saveOperation(Operation memberOperation) {

View File

@ -23,7 +23,7 @@ public abstract class SimulationTriggerMessagePublisher extends SimulationMessag
public abstract Object buildMessage(Watchable watchable);
@Override
public void handleStateChange(Simulation simulation, Watchable watchable) {
public void handleFieldChange(Simulation simulation, Watchable watchable, String field, Object val) {
List<String> destinationList = this.getNeedBuildDestination(watchable);
if (!destinationList.isEmpty()) {
Object message = this.buildMessage(watchable);

View File

@ -6,16 +6,28 @@ import java.util.Objects;
public abstract class Watchable {
Simulation simulation;
List<Watcher> watcherList = new ArrayList<>();
List<FieldWatcher> watcherList = new ArrayList<>();
public void register(Watcher watcher) {
public void register(Watcher watcher, List<String> fieldList) {
Objects.requireNonNull(watcher);
this.watcherList.add(watcher);
this.watcherList.add(new FieldWatcher(watcher, fieldList));
}
public void fireWatcher() {
for (Watcher watcher : this.watcherList) {
watcher.handleStateChange(simulation, this);
public void fireWatcher(String field, Object val) {
for (FieldWatcher fieldWatcher : this.watcherList) {
if (fieldWatcher.fieldList == null || fieldWatcher.fieldList.contains(field)) {
fieldWatcher.watcher.handleFieldChange(simulation, this, field, val);
}
}
}
private class FieldWatcher{
Watcher watcher;
List<String> fieldList;
public FieldWatcher(Watcher watcher, List<String> fieldList) {
this.watcher = watcher;
this.fieldList = fieldList;
}
}
}

View File

@ -1,5 +1,5 @@
package club.joylink.rtss.simulation;
public interface Watcher<W extends Watchable> {
void handleStateChange(Simulation simulation, W watchable);
void handleFieldChange(Simulation simulation, W watchable, String filed, Object val);
}

View File

@ -157,10 +157,7 @@ public class AtsRouteService {
Signal signal = simulation.getRepository().getByCode(signalCode, Signal.class);
List<Route> routeList = signal.getRouteList();
if (!CollectionUtils.isEmpty(routeList)) {
for (Route route : routeList) {
if (!route.isArs()) {
continue;
}
routeList.stream().filter(Route::isArs).forEach(route -> {
if (route.isFleetMode()) {
throw new SimulationException(SimulationExceptionType.Operation_Conflict,
String.format("进路[%s(%s)]自动通过已开启,不能设置自动追踪", route.getName(), route.getCode()));
@ -171,9 +168,11 @@ public class AtsRouteService {
if (simulation.getRepository().getConfig().isSignalHumanControlBeforeSetAtsControlOrCIAutoTrigger()) {
BusinessExceptionAssertEnum.OPERATION_NOT_SUPPORTED.assertTrue(signal.isHumanControl(), String.format("信号机[%s]需处于人工控", signal.getCode()));
}
});
for (Route route : routeList) {
route.setAtsControl(false);
route.setCiControl(true);
break;
if (route.isArs())
route.setCiControl(true);
}
}
}

View File

@ -303,6 +303,7 @@ public class AtsStationService {
List<Route> routeList = repository.getRouteList();
for (Route route : routeList) {
if (Objects.equals(route.getInterlockStation(), station)) {
route.setAtsControl(false);
if (!route.isArs() || route.isFleetMode() || route.isCiControl()) {
continue;
}

View File

@ -467,12 +467,31 @@ public class Route extends MapNamedElement {
public boolean isCiTrigger() {
List<SectionPath> approachPathList = this.start.getApproachPathList();
for (SectionPath sectionPath : approachPathList) {
//检查区段占用
List<Section> sectionList = sectionPath.getSectionList();
boolean sectionOccupied = false;
for (Section section : sectionList) {
if (section.isOccupiedOn(this.getStart().isRight())) {
return true;
sectionOccupied = true;
break;
}
}
if (!sectionOccupied)
continue;
//检查道岔位置
if (CollectionUtils.isEmpty(sectionPath.getSwitchList())) {
boolean switchOnPosition = true;
for (SwitchElement switchElement : sectionPath.getSwitchList()) {
if (!switchElement.isOnPosition()) {
switchOnPosition = false;
break;
}
}
if (!switchOnPosition)
continue;
}
return true;
}
return false;
}

View File

@ -8,6 +8,9 @@ import org.springframework.stereotype.Component;
public class AtsTrainRouteService {
public void triggerRouteForTrain(AtsRepository atsRepository, AtsTrain atsTrain) {
if (!atsRepository.getConfig().isArsOpen()) { // 列车进路触发服务是否开启
return;
}
if (atsTrain.isPlanTrain()) { // 计划车
this.triggerForPlanTrain(atsRepository, atsTrain);
} else if (atsTrain.isHeadTrain()) { // 头码车

View File

@ -0,0 +1,26 @@
package club.joylink.rtss.simulation.rt.ATS;
import club.joylink.rtss.simulation.rt.ATS.bo.AtsRepository;
import club.joylink.rtss.simulation.rt.ATS.bo.AtsTrain;
import org.springframework.stereotype.Component;
/**
* ATS列车追踪服务
*/
@Component
public class AtsTrainTraceService {
public void traceTrain(AtsRepository atsRepository) {
for (AtsTrain atsTrain : atsRepository.getTrainMap().values()) {
if (atsTrain.isCtc()) {
continue;
}
String axcSectionId = atsTrain.getAxcSectionId();
if (axcSectionId == null) { // 没有实际列车
continue;
}
}
}
}

View File

@ -0,0 +1,9 @@
package club.joylink.rtss.simulation.rt.ATS.bo;
import lombok.Getter;
@Getter
public class AtsConfig {
boolean arsOpen;
}

View File

@ -4,8 +4,8 @@ import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.SimulationRepository;
import club.joylink.rtss.simulation.cbtc.data.map.Station;
import club.joylink.rtss.simulation.rt.ATS.bo.plan.AtsRunPlan;
import club.joylink.rtss.simulation.rt.ATS.bo.plan.AtsStationPlan;
import club.joylink.rtss.simulation.rt.ATS.bo.plan.AtsTripPlan;
import club.joylink.rtss.simulation.rt.RtSimulation;
import lombok.Getter;
import java.util.HashMap;
@ -15,6 +15,8 @@ import java.util.Map;
public class AtsRepository extends SimulationRepository {
public static final String NAME = "ATS";
AtsConfig config;
AtsRunPlan runPlan;
Map<String, AtsRoute> routeMap = new HashMap<>();
@ -23,21 +25,27 @@ public class AtsRepository extends SimulationRepository {
Map<String, AtsSignal> signalMap = new HashMap<>();
Map<String, AtsStand> standMap = new HashMap<>();
Map<String, Station> stationMap = new HashMap<>();
Map<String, AtsStationPlan> stationPlanMap = new HashMap<>();
Map<String, AtsSwitch> switchMap = new HashMap<>();
Map<String, AtsTrain> trainMap = new HashMap<>();
Map<String, AtsTripPlan> tripPlanMap = new HashMap<>();
Map<String, AtsUnitPath> unitPathMap = new HashMap<>();
public AtsRepository() {
super(NAME);
}
public static AtsRepository getInstanceFrom(RtSimulation simulation) {
return simulation.getRepository(NAME, AtsRepository.class);
}
@Override
public void initState() {
}
public void setRunPlan(AtsRunPlan atsRunPlan) {
this.runPlan = atsRunPlan;
}
public AtsRunPlan getRunPlan() {
return runPlan;
}

View File

@ -1,6 +1,7 @@
package club.joylink.rtss.simulation.rt.ATS.bo;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.rt.ATS.bo.plan.AtsRunPlanBuilder;
import club.joylink.rtss.vo.map.*;
import java.util.List;

View File

@ -28,7 +28,7 @@ public class AtsSection extends AtsDevice {
if (this.occupy != occ) {
this.occupy = occ;
this.stateList.set(1, this.convert(this.occupy));
this.fireWatcher();
this.fireWatcher("occupy", this.occupy);
return true;
}
return false;
@ -38,7 +38,7 @@ public class AtsSection extends AtsDevice {
if (this.ctOccupy != ctOcc) {
this.ctOccupy = ctOcc;
this.stateList.set(2, this.convert(this.ctOccupy));
this.fireWatcher();
this.fireWatcher("ctOccupy", this.ctOccupy);
return true;
}
return false;
@ -48,7 +48,7 @@ public class AtsSection extends AtsDevice {
if (this.rl != rl) {
this.rl = rl;
this.stateList.set(3, this.convert(this.rl));
this.fireWatcher();
this.fireWatcher("rl", this.rl);
return true;
}
return false;
@ -58,7 +58,7 @@ public class AtsSection extends AtsDevice {
if (this.lr != lr) {
this.lr = lr;
this.stateList.set(4, this.convert(this.lr));
this.fireWatcher();
this.fireWatcher("lr", this.lr);
return true;
}
return false;
@ -68,7 +68,7 @@ public class AtsSection extends AtsDevice {
if (this.ol != ol) {
this.ol = ol;
this.stateList.set(5, this.convert(this.ol));
this.fireWatcher();
this.fireWatcher("ol", this.ol);
return true;
}
return false;
@ -78,7 +78,7 @@ public class AtsSection extends AtsDevice {
if (this.delayTime != delayTime) {
this.delayTime = delayTime;
this.stateList.set(6, this.delayTime);
this.fireWatcher();
this.fireWatcher("delayTime", this.delayTime);
return true;
}
return false;

View File

@ -34,7 +34,7 @@ public class AtsSignal extends AtsDevice {
if (this.signalAspect != signalAspect) {
this.signalAspect = signalAspect;
this.stateList.set(1, this.signalAspect);
this.fireWatcher();
this.fireWatcher("signalAspect", this.signalAspect);
return true;
}
return false;
@ -44,7 +44,7 @@ public class AtsSignal extends AtsDevice {
if (this.logic != logic) {
this.logic = logic;
this.stateList.set(2, this.convert(this.logic));
this.fireWatcher();
this.fireWatcher("logic", this.logic);
return true;
}
return false;
@ -54,7 +54,7 @@ public class AtsSignal extends AtsDevice {
if (this.forceLight != forceLight) {
this.forceLight = forceLight;
this.stateList.set(3, this.convert(this.forceLight));
this.fireWatcher();
this.fireWatcher("forceLight", this.forceLight);
return true;
}
return false;
@ -64,7 +64,7 @@ public class AtsSignal extends AtsDevice {
if (this.bl != bl) {
this.bl = bl;
this.stateList.set(4, this.convert(this.bl));
this.fireWatcher();
this.fireWatcher("bl", this.bl);
return true;
}
return false;
@ -74,7 +74,7 @@ public class AtsSignal extends AtsDevice {
if (this.rbl != rbl) {
this.rbl = rbl;
this.stateList.set(5, this.convert(this.rbl));
this.fireWatcher();
this.fireWatcher("rbl", this.rbl);
return true;
}
return false;
@ -84,7 +84,7 @@ public class AtsSignal extends AtsDevice {
if (this.level != level) {
this.level = level;
this.stateList.set(6, this.level);
this.fireWatcher();
this.fireWatcher("level", this.level);
return true;
}
return false;
@ -94,7 +94,7 @@ public class AtsSignal extends AtsDevice {
if (!Objects.equals(this.lrId, lrId)) {
this.lrId = lrId;
this.stateList.set(7, this.lrId);
this.fireWatcher();
this.fireWatcher("lrId", this.lrId);
return true;
}
return false;
@ -104,7 +104,7 @@ public class AtsSignal extends AtsDevice {
if (this.delayTime != delayTime) {
this.delayTime = delayTime;
this.stateList.set(8, this.delayTime);
this.fireWatcher();
this.fireWatcher("delayTime", this.delayTime);
return true;
}
return false;
@ -114,7 +114,7 @@ public class AtsSignal extends AtsDevice {
if (this.guideTime != guideTime) {
this.guideTime = guideTime;
this.stateList.set(9, this.guideTime);
this.fireWatcher();
this.fireWatcher("guideTime", this.guideTime);
return true;
}
return false;

View File

@ -30,7 +30,7 @@ public class AtsSwitch extends AtsDevice {
if (this.position != position) {
this.position = position;
this.stateList.set(1, this.position);
this.fireWatcher();
this.fireWatcher("position", this.position);
return true;
}
return false;
@ -40,7 +40,7 @@ public class AtsSwitch extends AtsDevice {
if (this.bl != bl) {
this.bl = bl;
this.stateList.set(2, this.convert(this.bl));
this.fireWatcher();
this.fireWatcher("bl", this.bl);
return true;
}
return false;
@ -50,7 +50,7 @@ public class AtsSwitch extends AtsDevice {
if (this.sl != sl) {
this.sl = sl;
this.stateList.set(3, this.convert(this.sl));
this.fireWatcher();
this.fireWatcher("sl", this.sl);
return true;
}
return false;
@ -60,7 +60,7 @@ public class AtsSwitch extends AtsDevice {
if (this.rl != rl) {
this.rl = rl;
this.stateList.set(4, this.convert(this.rl));
this.fireWatcher();
this.fireWatcher("rl", this.rl);
return true;
}
return false;
@ -70,7 +70,7 @@ public class AtsSwitch extends AtsDevice {
if (this.ol != ol) {
this.ol = ol;
this.stateList.set(5, this.convert(this.ol));
this.fireWatcher();
this.fireWatcher("ol", this.ol);
return true;
}
return false;
@ -80,7 +80,7 @@ public class AtsSwitch extends AtsDevice {
if (this.fl != fl) {
this.fl = fl;
this.stateList.set(6, this.convert(this.fl));
this.fireWatcher();
this.fireWatcher("fl", this.fl);
return true;
}
return false;

View File

@ -19,9 +19,11 @@ public class AtsTrain extends AtsDevice {
public static final int DIRECTION_N = 0; // 未知
public static final int DIRECTION_R = 1; //
public static final int DIRECTION_L = -1; //
boolean ctc; // 是否连续通信列车
String sectionId; // 轨道区段计轴区段或道岔区段
int offset; // 轨道区段偏移
String logicSectionId; // 逻辑区段逻辑区段或道岔计轴区段或岔心
String axcSectionId; // 所在计轴id
String trainWindowId; // 所在车次窗id
String sn;// 服务号/表号
String tn;// 车次号/圈数
String dn;// 目的地号

View File

@ -3,9 +3,9 @@ package club.joylink.rtss.simulation.rt.ATS.bo.plan;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import lombok.Getter;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;
import java.util.*;
@Getter
public class AtsRunPlan {
@ -27,11 +27,17 @@ public class AtsRunPlan {
*/
Map<String, List<AtsTripPlan>> endTripMap;
public AtsRunPlan() {
this.serviceMap = new HashMap<>();
this.tripPlanMap = new HashMap<>();
this.endTripMap = new HashMap<>();
}
public AtsTripPlan queryNextTripPlanOfPlan(AtsTripPlan atsTripPlan) {
return this.queryNextTripPlanOfEnd(atsTripPlan.getEndSectionId(), atsTripPlan.getEndTime());
}
public AtsTripPlan queryNextTripPlanOfEnd(String endId, LocalTime time) {
public AtsTripPlan queryNextTripPlanOfEnd(String endId, LocalDateTime time) {
List<AtsTripPlan> tripPlanList = this.endTripMap.get(endId);
AtsTripPlan next = null;
if (tripPlanList != null) {
@ -53,4 +59,32 @@ public class AtsRunPlan {
}
public void save(AtsTripPlan atsTripPlan) {
String stNumber = atsTripPlan.getStNumber();
BusinessExceptionAssertEnum.DATA_ERROR.assertNotTrue(this.tripPlanMap.containsKey(stNumber));
this.tripPlanMap.put(stNumber, atsTripPlan);
List<AtsTripPlan> tripPlanList = this.serviceMap.get(atsTripPlan.sn);
if (tripPlanList == null) {
tripPlanList = new ArrayList<>();
this.serviceMap.put(atsTripPlan.sn, tripPlanList);
}
tripPlanList.add(atsTripPlan);
List<AtsTripPlan> endPlanList = this.endTripMap.get(atsTripPlan.getStartSectionId());
if (endPlanList == null) {
endPlanList = new ArrayList<>();
this.endTripMap.put(atsTripPlan.getStartSectionId(), endPlanList);
}
endPlanList.add(atsTripPlan);
}
public void sort() {
this.serviceMap.forEach((sn, list) -> {
list.sort(Comparator.comparing(AtsTripPlan::getStartTime));
});
this.endTripMap.forEach((stn, list) -> {
list.sort(Comparator.comparing(AtsTripPlan::getStartTime));
});
}
}

View File

@ -0,0 +1,74 @@
package club.joylink.rtss.simulation.rt.ATS.bo.plan;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.rt.repo.CommonRepository;
import club.joylink.rtss.vo.client.runplan.RunPlanTripTimeVO;
import club.joylink.rtss.vo.client.runplan.RunPlanTripVO;
import club.joylink.rtss.vo.client.runplan.RunPlanVO;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
public class AtsRunPlanBuilder {
public static AtsRunPlan buildFrom(RunPlanVO runPlanVO, LocalDate date, CommonRepository commonRepo) {
AtsRunPlan atsRunPlan = new AtsRunPlan();
List<RunPlanTripVO> tripList = runPlanVO.getTripList();
for (RunPlanTripVO tripVO : tripList) {
AtsTripPlan atsTripPlan = buildAtsTripPlan(tripVO, date, commonRepo);
atsRunPlan.save(atsTripPlan);
}
atsRunPlan.sort();
return atsRunPlan;
}
private static AtsTripPlan buildAtsTripPlan(RunPlanTripVO tripVO, LocalDate date, CommonRepository commonRepo) {
AtsTripPlan tripPlan = new AtsTripPlan();
tripPlan.sn = tripVO.getServiceNumber();
tripPlan.tn = tripVO.getTripNumber();
tripPlan.dn = tripVO.getDestinationCode();
tripPlan.in = tripVO.getIsInbound();
tripPlan.out = tripVO.getIsOutbound();
tripPlan.spare = tripVO.getIsBackUp();
commonRepo.getSectionById(tripVO.getStartSectionCode());
commonRepo.getSectionById(tripVO.getEndSectionCode());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(tripVO.getStartTime());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(tripVO.getEndTime());
tripPlan.startSectionId = tripVO.getStartSectionCode();
tripPlan.startTime = handleRunPlanDataTime(date, tripVO.getStartTime());
tripPlan.endSectionId = tripVO.getEndSectionCode();
tripPlan.endTime = handleRunPlanDataTime(date, tripVO.getEndTime());
tripPlan.stationPlanList = buildStationPlanList(tripVO, date, commonRepo);
return tripPlan;
}
private static ZoneOffset zoneOffset = ZoneOffset.ofHours(0);
private static List<AtsStationPlan> buildStationPlanList(RunPlanTripVO tripVO, LocalDate date, CommonRepository commonRepo) {
List<RunPlanTripTimeVO> timeList = tripVO.getTimeList();
List<AtsStationPlan> list = new ArrayList<>();
for (RunPlanTripTimeVO tripTimeVO : timeList) {
commonRepo.getStationById(tripTimeVO.getStationCode());
commonRepo.getSectionById(tripTimeVO.getSectionCode());
AtsStationPlan atsStationPlan = new AtsStationPlan();
atsStationPlan.stationId = tripTimeVO.getStationCode();
atsStationPlan.sectionId = tripTimeVO.getSectionCode();
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(tripTimeVO.getArrivalTime());
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(tripTimeVO.getDepartureTime());
atsStationPlan.arriveTime = handleRunPlanDataTime(date, tripTimeVO.getArrivalTime());
atsStationPlan.leaveTime = handleRunPlanDataTime(date, tripTimeVO.getDepartureTime());
atsStationPlan.parkTime = (int) (atsStationPlan.leaveTime.toEpochSecond(zoneOffset) - atsStationPlan.arriveTime.toEpochSecond(zoneOffset));
list.add(atsStationPlan);
}
return list;
}
private static LocalDateTime handleRunPlanDataTime(LocalDate date, LocalTime startTime) {
return date.atTime(startTime).plusHours(2);
}
}

View File

@ -2,13 +2,13 @@ package club.joylink.rtss.simulation.rt.ATS.bo.plan;
import lombok.Getter;
import java.time.LocalTime;
import java.time.LocalDateTime;
@Getter
public class AtsStationPlan {
String stationId;
String sectionId;
LocalTime arriveTime;// 到站时间
LocalTime leaveTime;// 出发时间
LocalDateTime arriveTime;// 到站时间
LocalDateTime leaveTime;// 出发时间
int parkTime;// 停靠时长
}

View File

@ -3,7 +3,7 @@ package club.joylink.rtss.simulation.rt.ATS.bo.plan;
import lombok.Getter;
import org.springframework.util.StringUtils;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@ -14,16 +14,18 @@ public class AtsTripPlan {
boolean in;// 回库
boolean out;// 出库
boolean spare;// 备用
String startStationId;
String startSectionId;
LocalTime startTime;
String endStationId;
LocalDateTime startTime;
String endSectionId;
LocalTime endTime;
LocalDateTime endTime;
List<AtsStationPlan> stationPlanList;
boolean depart; // 是否已经发车
public static String buildSTNumber(String sn, String tn) {
return String.format("%s%s", StringUtils.hasText(sn)?sn:"", StringUtils.hasText(tn)?tn:"");
}
public String getStNumber() {
return buildSTNumber(this.sn, this.tn);
}
}

View File

@ -10,8 +10,9 @@ import org.springframework.stereotype.Component;
@Component
public class CilSectionAtsWatcher implements Watcher<CilSection> {
@Override
public void handleStateChange(Simulation simulation, CilSection watchable) {
public void handleFieldChange(Simulation simulation, CilSection watchable, String filed, Object val) {
AtsRepository repository = (AtsRepository) simulation.getRepository(AtsRepository.NAME, AtsRepository.class);
AtsMessagePublisher messagePublisher = (AtsMessagePublisher) simulation.getMessagePublisher(AtsMessagePublisher.NAME, AtsMessagePublisher.class);
AtsSection atsSection = repository.getSectionById(watchable.getId());

View File

@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
@Component
public class CilSignalAtsWatcher implements Watcher<CilSignal> {
@Override
public void handleStateChange(Simulation simulation, CilSignal watchable) {
public void handleFieldChange(Simulation simulation, CilSignal watchable, String filed, Object val) {
AtsRepository repository = (AtsRepository) simulation.getRepository(AtsRepository.NAME, AtsRepository.class);
AtsMessagePublisher messagePublisher = (AtsMessagePublisher) simulation.getMessagePublisher(AtsMessagePublisher.NAME, AtsMessagePublisher.class);
AtsSignal atsSignal = repository.getSignalById(watchable.getId());

View File

@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
@Component
public class CilSwitchAtsWatcher implements Watcher<CilSwitch> {
@Override
public void handleStateChange(Simulation simulation, CilSwitch watchable) {
public void handleFieldChange(Simulation simulation, CilSwitch watchable, String filed, Object val) {
AtsRepository repository = (AtsRepository) simulation.getRepository(AtsRepository.NAME, AtsRepository.class);
AtsMessagePublisher messagePublisher = (AtsMessagePublisher) simulation.getMessagePublisher(AtsMessagePublisher.NAME, AtsMessagePublisher.class);
AtsSwitch atsSwitch = repository.getSwitchById(watchable.getId());

View File

@ -7,6 +7,7 @@ import club.joylink.rtss.simulation.rt.SRD.bo.SrTrain;
import club.joylink.rtss.simulation.rt.SRD.bo.SrdRepository;
import club.joylink.rtss.simulation.rt.SRD.bo.TrackPosition;
import club.joylink.rtss.simulation.rt.repo.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
@ -17,6 +18,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
@Slf4j
@Component
public class CilRouteLogicService {
@ -44,7 +46,11 @@ public class CilRouteLogicService {
.sorted(Comparator.comparing(commonRoute -> commonRoute.getPathElement().getReverseSwitchCount()))
.findFirst().get();
if (!cilRepository.isSupervised(route.getId())) {
this.setRoute(rtSimulation, route.getId());
try {
this.setRoute(rtSimulation, route.getId());
} catch (Exception e) {
log.error("联锁自动触发进路失败:", e);
}
}
break;
}

View File

@ -24,19 +24,18 @@ public class CilSection extends CilDevice {
@Override
public void init() {
axcOccupy = false;
routeId = null;
rl = false;
lr = false;
ol = false;
delayTime = 0;
this.fireWatcher();
this.updateAxcOccupy(false);
this.updateRouteId(null);
this.updateRl(false);
this.updateLr(false);
this.updateOl(false);
this.updateDelayTime(0);
}
private boolean updateAxcOccupy(boolean axcOccupy) {
if (this.axcOccupy != axcOccupy) {
this.axcOccupy = axcOccupy;
this.fireWatcher();
this.fireWatcher("axcOccupy", this.axcOccupy);
return true;
}
return false;
@ -45,7 +44,7 @@ public class CilSection extends CilDevice {
private boolean updateRouteId(String routeId) {
if (!Objects.equals(this.routeId, routeId)) {
this.routeId = routeId;
this.fireWatcher();
this.fireWatcher("routeId", this.routeId);
return true;
}
return false;
@ -54,7 +53,7 @@ public class CilSection extends CilDevice {
private boolean updateRl(boolean rl) {
if (this.rl != rl) {
this.rl = rl;
this.fireWatcher();
this.fireWatcher("rl", this.rl);
return true;
}
return false;
@ -63,7 +62,7 @@ public class CilSection extends CilDevice {
private boolean updateOl(boolean ol) {
if (this.ol != ol) {
this.ol = ol;
this.fireWatcher();
this.fireWatcher("ol", this.ol);
return true;
}
return false;
@ -72,7 +71,7 @@ public class CilSection extends CilDevice {
private boolean updateLr(boolean lr) {
if (this.lr != lr) {
this.lr = lr;
this.fireWatcher();
this.fireWatcher("lr", this.lr);
return true;
}
return false;
@ -81,7 +80,7 @@ public class CilSection extends CilDevice {
private boolean updateDelayTime(int delayTime) {
if (this.delayTime != delayTime) {
this.delayTime = delayTime;
this.fireWatcher();
this.fireWatcher("delayTime", this.delayTime);
return true;
}
return false;

View File

@ -45,24 +45,23 @@ public class CilSignal extends CilDevice {
@Override
public void init() {
signalAspect = SrSignal.H;
logic = false;
forceLight = false;
bl = false;
rbl = false;
uta = false;
level = LEVEL_1;
fl = false;
routeId = null;
delayTime = 0;
guideTime = 0;
this.fireWatcher();
this.updateSignalAspect(SrSignal.H);
this.updateLogic(false);
this.updateForceLight(false);
this.updateBl(false);
this.updateRbl(false);
this.updateUta(false);
this.updateLevel(LEVEL_1);
this.updateFl(false);
this.updateRouteId(null);
this.updateDelayTime(0);
this.updateGuideTime(0);
}
private boolean updateSignalAspect(int signalAspect) {
if (this.signalAspect != signalAspect) {
this.signalAspect = signalAspect;
this.fireWatcher();
this.fireWatcher("signalAspect", this.signalAspect);
return true;
}
return false;
@ -71,7 +70,7 @@ public class CilSignal extends CilDevice {
private boolean updateLogic(boolean logic) {
if (this.logic != logic) {
this.logic = logic;
this.fireWatcher();
this.fireWatcher("logic", this.logic);
return true;
}
return false;
@ -80,7 +79,7 @@ public class CilSignal extends CilDevice {
private boolean updateForceLight(boolean forceLight) {
if (this.forceLight != forceLight) {
this.forceLight = forceLight;
this.fireWatcher();
this.fireWatcher("forceLight", this.forceLight);
return true;
}
return false;
@ -89,7 +88,7 @@ public class CilSignal extends CilDevice {
private boolean updateBl(boolean bl) {
if (this.bl != bl) {
this.bl = bl;
this.fireWatcher();
this.fireWatcher("bl", this.bl);
return true;
}
return false;
@ -98,7 +97,16 @@ public class CilSignal extends CilDevice {
private boolean updateRbl(boolean rbl) {
if (this.rbl != rbl) {
this.rbl = rbl;
this.fireWatcher();
this.fireWatcher("rbl", this.rbl);
return true;
}
return false;
}
private boolean updateUta(boolean uta) {
if (this.uta != uta) {
this.uta = uta;
this.fireWatcher("uta", this.uta);
return true;
}
return false;
@ -107,7 +115,7 @@ public class CilSignal extends CilDevice {
private boolean updateFl(boolean fl) {
if (this.fl != fl) {
this.fl = fl;
this.fireWatcher();
this.fireWatcher("fl", this.fl);
return true;
}
return false;
@ -116,7 +124,7 @@ public class CilSignal extends CilDevice {
private boolean updateLevel(int level) {
if (this.level != level) {
this.level = level;
this.fireWatcher();
this.fireWatcher("level", this.level);
return true;
}
return false;
@ -125,7 +133,7 @@ public class CilSignal extends CilDevice {
private boolean updateRouteId(String routeId) {
if (!Objects.equals(this.routeId, routeId)) {
this.routeId = routeId;
this.fireWatcher();
this.fireWatcher("routeId", this.routeId);
return true;
}
return false;
@ -134,7 +142,7 @@ public class CilSignal extends CilDevice {
private boolean updateDelayTime(int delayTime) {
if (this.delayTime != delayTime) {
this.delayTime = delayTime;
this.fireWatcher();
this.fireWatcher("delayTime", this.delayTime);
return true;
}
return false;
@ -143,7 +151,7 @@ public class CilSignal extends CilDevice {
private boolean updateGuideTime(int guideTime) {
if (this.guideTime != guideTime) {
this.guideTime = guideTime;
this.fireWatcher();
this.fireWatcher("guideTime", this.guideTime);
return true;
}
return false;

View File

@ -33,22 +33,21 @@ public class CilSwitch extends CilDevice {
@Override
public void init() {
position = NORMAL;
routeUseToPosition = NONE;
bl = false;
sl = false;
this.routeId = null;
rl = false;
ol = false;
fl = false;
mgl = false;
this.fireWatcher();
this.updatePosition(NORMAL);
this.updateRouteUseToPosition(NONE);
this.updateBl(false);
this.updateSl(false);
this.updateRouteId(null);
this.updateRl(false);
this.updateOl(false);
this.updateFl(false);
this.updateMgl(false);
}
private boolean updatePosition(int position) {
if (this.position != position) {
this.position = position;
this.fireWatcher();
this.fireWatcher("position", this.position);
return true;
}
return false;
@ -57,7 +56,7 @@ public class CilSwitch extends CilDevice {
private boolean updateRouteUseToPosition(int routeUseToPosition) {
if (this.routeUseToPosition != routeUseToPosition) {
this.routeUseToPosition = routeUseToPosition;
this.fireWatcher();
this.fireWatcher("routeUseToPosition", this.routeUseToPosition);
return true;
}
return false;
@ -66,7 +65,7 @@ public class CilSwitch extends CilDevice {
private boolean updateBl(boolean bl) {
if (this.bl != bl) {
this.bl = bl;
this.fireWatcher();
this.fireWatcher("bl", this.bl);
return true;
}
return false;
@ -75,7 +74,7 @@ public class CilSwitch extends CilDevice {
private boolean updateSl(boolean sl) {
if (this.sl != sl) {
this.sl = sl;
this.fireWatcher();
this.fireWatcher("sl", this.sl);
return true;
}
return false;
@ -84,7 +83,7 @@ public class CilSwitch extends CilDevice {
private boolean updateRouteId(String routeId) {
if (!Objects.equals(this.routeId, routeId)) {
this.routeId = routeId;
this.fireWatcher();
this.fireWatcher("routeId", this.routeId);
return true;
}
return false;
@ -93,7 +92,7 @@ public class CilSwitch extends CilDevice {
private boolean updateRl(boolean rl) {
if (this.rl != rl) {
this.rl = rl;
this.fireWatcher();
this.fireWatcher("rl", this.rl);
return true;
}
return false;
@ -102,7 +101,7 @@ public class CilSwitch extends CilDevice {
private boolean updateOl(boolean ol) {
if (this.ol != ol) {
this.ol = ol;
this.fireWatcher();
this.fireWatcher("ol", this.ol);
return true;
}
return false;
@ -111,7 +110,7 @@ public class CilSwitch extends CilDevice {
private boolean updateFl(boolean fl) {
if (this.fl != fl) {
this.fl = fl;
this.fireWatcher();
this.fireWatcher("fl", this.fl);
return true;
}
return false;
@ -120,7 +119,7 @@ public class CilSwitch extends CilDevice {
private boolean updateMgl(boolean mgl) {
if (this.mgl != mgl) {
this.mgl = mgl;
this.fireWatcher();
this.fireWatcher("mgl", this.mgl);
return true;
}
return false;

View File

@ -10,15 +10,8 @@ import org.springframework.stereotype.Component;
public class SrAxcCilWatcher implements Watcher<SrAXC> {
@Override
public void handleStateChange(Simulation simulation, SrAXC watchable) {
public void handleFieldChange(Simulation simulation, SrAXC watchable, String filed, Object val) {
CilSyncRepository cilSyncRepository = (CilSyncRepository) simulation.getRepository(CilSyncRepository.NAME, CilSyncRepository.class);
cilSyncRepository.collectSrAXC(watchable);
// CilRepository cilRepository = (CilRepository) simulation.getRepository(CilRepository.NAME, CilRepository.class);
// CilSection cilSection = cilRepository.getSectionById(watchable.getId());
// cilSection.applyAxcOccupyState(watchable.isOccupy());
// List<CilSection> logicList = cilRepository.queryLogicListOfAxc(watchable.getId());
// for (CilSection section : logicList) {
// section.applyAxcOccupyState(watchable.isOccupy());
// }
}
}

View File

@ -10,11 +10,8 @@ import org.springframework.stereotype.Component;
public class SrSignalCilWatcher implements Watcher<SrSignal> {
@Override
public void handleStateChange(Simulation simulation, SrSignal watchable) {
public void handleFieldChange(Simulation simulation, SrSignal watchable, String filed, Object val) {
CilSyncRepository cilSyncRepository = (CilSyncRepository) simulation.getRepository(CilSyncRepository.NAME, CilSyncRepository.class);
cilSyncRepository.collectSrSignal(watchable);
// CilRepository cilRepository = (CilRepository) simulation.getRepository(CilRepository.NAME, CilRepository.class);
// CilSignal cilSignal = cilRepository.getSignalById(watchable.getId());
// cilSignal.updateByDeviceState(watchable.getState());
}
}

View File

@ -10,11 +10,8 @@ import org.springframework.stereotype.Component;
public class SrSwitchCilWatcher implements Watcher<SrSwitch> {
@Override
public void handleStateChange(Simulation simulation, SrSwitch watchable) {
public void handleFieldChange(Simulation simulation, SrSwitch watchable, String filed, Object val) {
CilSyncRepository cilSyncRepository = (CilSyncRepository) simulation.getRepository(CilSyncRepository.NAME, CilSyncRepository.class);
cilSyncRepository.collectSrSwitch(watchable);
// CilRepository cilRepository = (CilRepository) simulation.getRepository(CilRepository.NAME, CilRepository.class);
// CilSwitch cilSwitch = cilRepository.getSwitchById(watchable.getId());
// cilSwitch.applyPosition(watchable.getState());
}
}

View File

@ -3,9 +3,16 @@ package club.joylink.rtss.simulation.rt;
import club.joylink.rtss.constants.MapPrdTypeEnum;
import club.joylink.rtss.constants.Project;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.services.IDailyRunPlanService;
import club.joylink.rtss.services.ILoadPlanService;
import club.joylink.rtss.services.IRunPlanTemplateService;
import club.joylink.rtss.services.MapService;
import club.joylink.rtss.simulation.SimulationManager;
import club.joylink.rtss.simulation.cbtc.constant.SimulationConstants;
import club.joylink.rtss.simulation.rt.ATS.AtsLogicService;
import club.joylink.rtss.simulation.rt.ATS.bo.AtsRepository;
import club.joylink.rtss.simulation.rt.ATS.bo.plan.AtsRunPlan;
import club.joylink.rtss.simulation.rt.ATS.bo.plan.AtsRunPlanBuilder;
import club.joylink.rtss.simulation.rt.CIL.CilLogicService;
import club.joylink.rtss.simulation.rt.SRD.SrdLogicService;
import club.joylink.rtss.simulation.rt.SRD.bo.SrTrain;
@ -17,10 +24,13 @@ import club.joylink.rtss.simulation.rt.repo.CommonRepository;
import club.joylink.rtss.simulation.rt.repo.CommonStation;
import club.joylink.rtss.simulation.rt.vo.RtSimulationInfoVO;
import club.joylink.rtss.vo.AccountVO;
import club.joylink.rtss.vo.client.runplan.RunPlanLoadVO;
import club.joylink.rtss.vo.client.runplan.RunPlanVO;
import club.joylink.rtss.vo.map.MapVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.Objects;
@Component
@ -28,6 +38,12 @@ public class RtSimulationService {
@Autowired
private MapService mapService;
@Autowired
private IDailyRunPlanService iDailyRunPlanService;
@Autowired
private ILoadPlanService iLoadPlanService;
@Autowired
private IRunPlanTemplateService iRunPlanTemplateService;
@Autowired
private SimulationManager simulationManager;
@Autowired
private CommonRepoService commonRepoService;
@ -51,7 +67,8 @@ public class RtSimulationService {
this.simulationManager.save(rtSimulation);
try {
rtSimulation.mapVO = mapVO;
this.loading(rtSimulation, mapVO);
this.loadingMap(rtSimulation, mapVO);
this.loadRunPlan(rtSimulation, this.queryUserRunPlan(accountVO.getId(), mapId));
this.initSimulationMember(rtSimulation);
this.initCreatorPlayMember(rtSimulation, mapVO);
} catch (Exception e) {
@ -68,6 +85,35 @@ public class RtSimulationService {
return rtSimulation;
}
private RunPlanVO queryUserRunPlan(Long mapId, Long userId) {
RunPlanLoadVO loadPlan = null;
LocalDate runPlanDate = SimulationConstants.getRunPlanDate();
// 仿真运行计划的查询先找用户的如果不存在找通用的
loadPlan = this.iLoadPlanService.findUserLoadPlan(userId, mapId, runPlanDate);
if (Objects.isNull(loadPlan)) {
loadPlan = this.iLoadPlanService.findCommonLoadPlanOfMap(mapId);
}
if (loadPlan != null) {
return this.iRunPlanTemplateService.getRunPlan(loadPlan.getTemplatePlanId());
}
return null;
}
public void loadRunPlan(String id, RunPlanVO runPlanVO) {
RtSimulation simulation = this.simulationManager.getById(id, RtSimulation.class);
this.loadRunPlan(simulation, runPlanVO);
}
public void loadRunPlan(RtSimulation simulation, RunPlanVO runPlanVO) {
if (runPlanVO == null) {
return;
}
AtsRunPlan atsRunPlan = AtsRunPlanBuilder.buildFrom(runPlanVO,
simulation.getSystemTime().toLocalDate(), CommonRepository.getInstanceFrom(simulation));
AtsRepository atsRepository = AtsRepository.getInstanceFrom(simulation);
atsRepository.setRunPlan(atsRunPlan);
}
private void initCreatorPlayMember(RtSimulation rtSimulation, MapVO mapVO) {
// RtSimulationMember simulationMember = rtSimulation.querySimulationMemberById("2");
// List<RtSimulationMember> memberList = rtSimulation.querySimulationMembersOfRole(RtSimulationMember.Role.LOWS);
@ -106,7 +152,7 @@ public class RtSimulationService {
/**
* 加载相关数据
*/
private void loading(RtSimulation rtSimulation, MapVO mapVO) {
private void loadingMap(RtSimulation rtSimulation, MapVO mapVO) {
this.commonRepoService.loading(rtSimulation, mapVO);
SrdRepository srdRepository = this.srdLogicService.loading(rtSimulation, mapVO);
this.cilLogicService.loading(rtSimulation, mapVO);

View File

@ -160,6 +160,7 @@ public class SrdLogicService {
float speed = srTrain.getSpeed();
TlRepository tlRepository = TlRepository.getInstanceFrom((RtSimulation) repository.getSimulation());
TlTrain tlTrain = tlRepository.getTrainById(srTrain.getId());
tlTrain.changeGear();
float f = tlTrain.calculateF();
float a = f / (srTrain.getMass() + srTrain.getLoadMass());
float cv = (speed + a * TRAIN_RUN_RATE / 1000); // 当前速度

View File

@ -8,15 +8,31 @@ import club.joylink.rtss.simulation.rt.SRD.bo.SrdRepository;
import club.joylink.rtss.simulation.rt.SRD.bo.TrackPosition;
import club.joylink.rtss.simulation.rt.TL.bo.TlRepository;
import club.joylink.rtss.simulation.rt.TL.bo.TlTrain;
import club.joylink.rtss.simulation.rt.repo.CommonRepository;
import club.joylink.rtss.simulation.rt.repo.CommonSection;
import club.joylink.rtss.simulation.rt.repo.CommonSignal;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class SrdTrainService {
public void loadTrain(RtSimulation simulation, String trainId, boolean right, String trackId) {
SrdRepository srdRepository = simulation.getRepository(SrdRepository.NAME, SrdRepository.class);
SrdRepository srdRepository = SrdRepository.getInstanceFrom(simulation);
SrTrain train = srdRepository.getTrainById(trainId);
SrTrack track = srdRepository.getTrackById(trackId);
TrackPosition trackPosition = new TrackPosition(track, 5000);
CommonRepository commonRepo = CommonRepository.getInstanceFrom(simulation);
CommonSection section = commonRepo.getSectionById(trackId);
CommonSignal signal = section.queryMoreDistanceSignalOf(right);
int loadOffset = 10000; // 10m
int offset = 0;
if (signal != null) {
offset = right ? signal.getOffset() - loadOffset : signal.getOffset() + loadOffset;
}
if (offset <= 0) {
offset = right ? track.getLen() - loadOffset : loadOffset;
}
TrackPosition trackPosition = new TrackPosition(track, offset);
train.initPosition(trackPosition, right);
}

View File

@ -24,7 +24,7 @@ public class SrAXC extends SrDevice {
if (this.state != state) {
this.state = state;
this.stateList.set(1, this.state);
this.fireWatcher();
this.fireWatcher("state", this.state);
return true;
}
return false;
@ -47,9 +47,8 @@ public class SrAXC extends SrDevice {
@Override
public void initState() {
this.updateState(OFF);
this.fault = null;
this.fireWatcher();
this.updateState(OFF);
}
@Override

View File

@ -41,7 +41,7 @@ public class SrPSD extends SrDevice {
if (this.state != state) {
this.state = state;
this.stateList.set(1, this.state);
this.fireWatcher();
this.fireWatcher("state", this.state);
return true;
}
return false;
@ -51,7 +51,7 @@ public class SrPSD extends SrDevice {
if (this.command != command) {
this.command = (command);
this.stateList.set(2, this.command);
this.fireWatcher();
this.fireWatcher("command", this.command);
return true;
}
return false;

View File

@ -47,7 +47,7 @@ public class SrSignal extends SrDevice {
if (this.state != state) {
this.state = state;
this.stateList.set(1, this.state);
this.fireWatcher();
this.fireWatcher("state", this.state);
return true;
}
return false;
@ -56,7 +56,7 @@ public class SrSignal extends SrDevice {
private boolean updateCommand(int command) {
if (this.command != command) {
this.command = (command);
this.fireWatcher();
this.fireWatcher("command", this.command);
return true;
}
return false;

View File

@ -36,7 +36,7 @@ public class SrSwitch extends SrDevice {
if (this.state != state) {
this.state = state;
this.stateList.set(1, this.state);
this.fireWatcher();
this.fireWatcher("state", this.state);
return true;
}
return false;
@ -46,7 +46,7 @@ public class SrSwitch extends SrDevice {
if (this.command != command) {
this.command = (command);
this.stateList.set(2, this.command);
this.fireWatcher();
this.fireWatcher("command", this.command);
return true;
}
return false;

View File

@ -1,5 +1,6 @@
package club.joylink.rtss.simulation.rt.TL.bo;
import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import club.joylink.rtss.simulation.rt.SRD.bo.SrTrain;
import lombok.Getter;
@ -17,6 +18,7 @@ public class TlTrain extends TlDevice {
*/
float speed;
int controlPosition;//司控器手柄位置
boolean autoGear; // 是否自动挡
int gear; // 档位(-1~9,1挡为起步挡2~9实际为1~8挡)
int throttlePosition; // 油门杆位置(0~100)
int changeOverSwitch; // 换向开关(-1, 0, 1, 2:手动)
@ -28,6 +30,7 @@ public class TlTrain extends TlDevice {
public TlTrain(SrTrain train) {
super(train.getId());
this.srTrain = train;
this.autoGear = true; // 大铁驾驶暂时默认自动挡
}
/**
@ -147,90 +150,101 @@ public class TlTrain extends TlDevice {
this.singleBreak, this.autoBreak);
}
public void changeGear() {
if (this.isAutoGear()) { // 自动挡根据油门和列车速度自动调整档位
// int throttlePosition = this.throttlePosition;
// double speedMax = GearParam.G.vmax / 3.6;
// double ts = speedMax * throttlePosition / 100; // 油门最高速度
// int tgear = this.calculateGearBySpeed((float) ts); // 油门对应档位
// float speed = this.srTrain.getSpeed();
// int sgear = this.calculateGearBySpeed(speed);
// int gear = Math.min(tgear, sgear);
this.updateGear(GearParam.G.gear);
}
}
private int calculateGearBySpeed(float speed) {
for (GearParam param : GearParam.values()) {
float vc = param.vmax / 3.6f * 0.8f;
if (speed < vc) {
return param.gear;
}
}
return GearParam.G.gear;
}
public static enum GearParam {
// GF1(-1, 3, 25, 1.89f, 1.64f),
// G0(0, 0, 0, 0, 0),
// G1(1, 3, 30, 1.89f, 1.64f),
// G2(2, 20, 56, 1.38f, 1.15f),
// G3(3, 32, 85, 0.92f, 0.73f),
// G4(4, 48, 118, 0.75f, 0.58f),
// G5(5, 62, 150, 0.57f, 0.42f),
// G6(6, 75, 190, 0.50f, 0.31f),
// G7(7, 95, 250, 0.41f, 0.29f),
// G8(8, 120, 300, 0.35f, 0.21f),
// G9(9, 150, 360, 0.26f, 0.16f),
G(1, 3, 360, 1.69f, 0.18f)
;
int gear;
float vmin;
float vmax;
float amax;
float amin;
GearParam(int gear, float vmin, float vmax, float amax, float amin) {
this.gear = gear;
this.vmin = vmin;
this.vmax = vmax;
this.amax = amax;
this.amin = amin;
}
public float getVminMps() {
return this.vmin / 3.6f;
}
public float getVmaxMps() {
return this.vmax / 3.6f;
}
public static GearParam getByGear(int gear) {
for (GearParam param : GearParam.values()) {
if (param.gear == gear) {
return param;
}
}
throw BusinessExceptionAssertEnum.ARGUMENT_ILLEGAL.exception("无效的档位");
}
}
public static void main(String[] args) {
for (int i = 0; i <= 100; i++) {
float fx = GearParam.G.vmin + i * i / 100f * (GearParam.G.vmax - GearParam.G.vmin) / 100f;
System.out.println(fx);
}
}
public float calculateF() {
float f = 0;
float speed = this.srTrain.getSpeed();
// 根据列车档位和油门计算牵引力或制动力
float vmin = 0;
float vmax = 0;
float amin = 0;
float amax = 0;
switch (this.gear) {
case -1: // 倒车3~7km/h; 1.89 ~ 1.64 m/s^2
vmin = 3;
vmax = 7;
amax = 1.89f;
amin = 1.64f;
break;
case 0: // 空挡
break;
case 1: // 起步挡3~8km/h; 1.89 ~ 1.64 m/s^2
vmin = 3;
vmax = 8;
amax = 1.89f;
amin = 1.64f;
break;
case 2: // 1挡5~15km/h; 1.38 ~ 1.15 m/s^2
vmin = 5;
vmax = 15;
amax = 1.38f;
amin = 1.15f;
break;
case 3: // 2挡9~20km/h; 0.92 ~ 0.73 m/s^2
vmin = 9;
vmax = 20;
amax = 0.92f;
amin = 0.73f;
break;
case 4: // 3挡13~28km/h; 0.65 ~ 0.48 m/s^2
vmin = 13;
vmax = 28;
amax = 0.65f;
amin = 0.48f;
break;
case 5: // 4挡20~38km/h; 0.47 ~ 0.32 m/s^2
vmin = 20;
vmax = 38;
amax = 0.47f;
amin = 0.32f;
break;
case 6: // 5挡26~50km/h; 0.30 ~ 0.21 m/s^2
vmin = 26;
vmax = 50;
amax = 0.30f;
amin = 0.21f;
break;
case 7: // 6挡33~60km/h; 0.21 ~ 0.15 m/s^2
vmin = 33;
vmax = 60;
amax = 0.21f;
amin = 0.15f;
break;
case 8: // 7挡52~75km/h; 0.15 ~ 0.11 m/s^2
vmin = 52;
vmax = 75;
amax = 0.15f;
amin = 0.11f;
break;
case 9: // 8挡60~90km/h; 0.11 ~ 0.08 m/s^2
vmin = 60;
vmax = 90;
amax = 0.11f;
amin = 0.08f;
break;
default:
throw new RuntimeException("无效的档位");
}
GearParam param = GearParam.G;
float fk = 0;
float fb = 0;
int tp = this.throttlePosition;
if (this.gear != 0 && this.changeOverState != 0) { // 非空挡
float vs = (float) ((vmin + (Float.valueOf(vmax - vmin) * this.throttlePosition / 100)) / 3.6);
float vs = (param.vmin + (((param.vmax - param.vmin) / 100f) * (tp * tp / 100f))) / 3.6f;
if (speed > vs) {
fb += this.calculateAccOf(speed - vs) * this.srTrain.getTotalMass();
fb += this.calculateAccOf(speed - vs) * this.srTrain.getMass();
} else {
fk = (float) ((amin + ((vs - vmin) / (vmax - vmin) * (amax - amin))) * this.srTrain.getTotalMass());
fk = ((param.amin + ((vs - speed) / (param.getVmaxMps() - param.getVminMps()) * (param.amax - param.amin))) * this.srTrain.getMass());
}
}
// 摩擦阻力
fb += 0.034 * this.srTrain.getTotalMass();
// 根据制动阀计算制动力
fb += this.calculateFb();
// 计算合力
@ -254,7 +268,7 @@ public class TlTrain extends TlDevice {
* @return
*/
private float calculateAccOf(float v) {
return v / 20;
return v / 60;
}
private float calculateFriction(float speed, float mass) {

View File

@ -24,7 +24,7 @@ public class TrainLoadService {
}
private List<AtsTripPlan> queryLoadTrips(RtSimulation rtSimulation, LocalDateTime dateTime) {
LocalTime time = dateTime.toLocalTime();
LocalDateTime time = dateTime;
AtsRepository atsRepository = rtSimulation.getRepository(AtsRepository.NAME, AtsRepository.class);
AtsRunPlan runPlan = atsRepository.getRunPlan();
List<AtsTripPlan> loadTripList = new ArrayList<>();
@ -57,7 +57,7 @@ public class TrainLoadService {
LocalDateTime systemTime = rtSimulation.convertToSystemTime(dateTime);
List<AtsTripPlan> loadTripList = this.queryLoadTrips(rtSimulation, systemTime);
loadTripList.sort(Comparator.comparing(AtsTripPlan::getStartTime)); // 按时间排序
LocalTime time = systemTime.toLocalTime();
LocalDateTime time = systemTime;
for (AtsTripPlan tripPlan : loadTripList) {
if (!time.isAfter(tripPlan.getEndTime())) {// 在车次计划中
List<AtsStationPlan> stationPlanList = tripPlan.getStationPlanList();

View File

@ -84,4 +84,10 @@ public class CommonRepository extends SimulationRepository {
public List<CommonSignal> querySignalsByDirection(boolean right) {
return this.signalMap.values().stream().filter(cs -> cs.isRight() == right).collect(Collectors.toList());
}
public CommonStation getStationById(String id) {
CommonStation commonStation = this.stationMap.get(id);
BusinessExceptionAssertEnum.DATA_ERROR.assertNotNull(commonStation, String.format("不存在id为[%s]的车站", id));
return commonStation;
}
}

View File

@ -4,6 +4,7 @@ import club.joylink.rtss.exception.BusinessExceptionAssertEnum;
import lombok.Getter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@ -96,6 +97,17 @@ public class CommonSection extends CommonDevice {
.collect(Collectors.toList());
}
public CommonSignal queryMoreDistanceSignalOf(boolean right) {
List<CommonSignal> list = this.getSignalOf(right);
if (list.size() == 1) {
return list.get(0);
} else if (list.size() > 1) {
list.sort(Comparator.comparing(signal -> right ? signal.getOffset() : this.getLen() - signal.getOffset()));
return list.get(list.size() - 1);
}
return null;
}
public enum Type {
/** 一般计轴区段 */
NAx,