This commit is contained in:
DU 2020-12-10 18:46:24 +08:00
commit 3e6bd50e11
6 changed files with 127 additions and 4 deletions

View File

@ -412,6 +412,7 @@ public class SimulationMainThread {
}
case MESSAGE_3D: {
this.joylink3DMessageService.collectAndSendTrainHmiDisplayMessage(simulation);
this.joylink3DMessageService.tdtStatusCollectAndSend(simulation);
break;
}
case TRAIN_POSITION_3D: {

View File

@ -7,7 +7,9 @@ import club.joylink.rtss.simulation.cbtc.communication.vo.*;
import club.joylink.rtss.simulation.cbtc.communication.vo.fault.DeviceFaultInfo;
import club.joylink.rtss.simulation.cbtc.data.SimulationDataRepository;
import club.joylink.rtss.simulation.cbtc.data.map.MapElement;
import club.joylink.rtss.simulation.cbtc.data.map.Stand;
import club.joylink.rtss.simulation.cbtc.data.status.TrainStatus;
import club.joylink.rtss.simulation.cbtc.data.vo.TdtStatusVO;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityScreenDoor;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySignal;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealitySwitch;
@ -57,6 +59,29 @@ public class Joylink3DMessageService {
}
}
public void tdtStatusCollectAndSend(Simulation simulation) {
List<TdtStatusVO> list = new ArrayList<>();
SimulationDataRepository repository = simulation.getRepository();
for (Stand stand : repository.getStandList()) {
if (!stand.isSmall()) {
TdtStatusVO statusVO = repository.queryTdtStatus(stand.getCode());
if (Objects.isNull(statusVO)) {
statusVO = new TdtStatusVO(stand);
repository.addTdtStatus(statusVO);
list.add(statusVO);
} else {
if (statusVO.compareAndChange(stand)) {
list.add(statusVO);
}
}
TdtStatusVO tdtStatusVO = new TdtStatusVO(stand);
list.add(tdtStatusVO);
}
}
SocketMessageVO message = SocketMessageFactory.buildTrainIsAbout2ArriveMessage(simulation.getGroup(), list);
this.stompMessageService.sendToUser(simulation.getSimulationUserIds(), message);
}
/**
* 构建并发送列车状态信息
*
@ -305,4 +330,6 @@ public class Joylink3DMessageService {
Set<String> users = simulation.getSimulationUserIds();
this.collectAndSend3DInitDeviceList(simulation, users);
}
}

View File

@ -9,6 +9,7 @@ import club.joylink.rtss.simulation.cbtc.data.status.IbpStatus;
import club.joylink.rtss.simulation.cbtc.data.status.TrainStatus;
import club.joylink.rtss.simulation.cbtc.data.support.RoutePath;
import club.joylink.rtss.simulation.cbtc.data.support.SectionPosition;
import club.joylink.rtss.simulation.cbtc.data.vo.TdtStatusVO;
import club.joylink.rtss.simulation.cbtc.data.vo.TrainInfo;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityDevice;
import club.joylink.rtss.simulation.cbtc.data.vr.VirtualRealityTrain;
@ -77,6 +78,13 @@ public class SimulationDataRepository {
*/
private Map<String, TrainHmiDisplay> trainHmiMap = new ConcurrentHashMap<>();
/**
* TDTtrain depart timer状态数据
* key-站台code
* val-tdt状态对象
*/
private Map<String, TdtStatusVO> tdtStatusMap = new ConcurrentHashMap<>();
/**
* ATS监控的列车信息map
* key-车组号
@ -643,6 +651,7 @@ public class SimulationDataRepository {
// 清空设备状态
this.deviceInfoMap.clear();
this.trainHmiMap.clear();
this.tdtStatusMap.clear();
}
/**
@ -904,6 +913,18 @@ public class SimulationDataRepository {
this.trainHmiMap.remove(code);
}
public TdtStatusVO queryTdtStatus(String code) {
return this.tdtStatusMap.get(code);
}
public void addTdtStatus(TdtStatusVO tdtStatusVO) {
this.tdtStatusMap.put(tdtStatusVO.getStandCode(), tdtStatusVO);
}
public void removeTdtStatus(String code) {
this.tdtStatusMap.remove(code);
}
/**
* 获取该车站某个方向的相邻车站
*/

View File

@ -0,0 +1,66 @@
package club.joylink.rtss.simulation.cbtc.data.vo;
import club.joylink.rtss.simulation.cbtc.data.map.Stand;
import lombok.Getter;
import lombok.Setter;
import java.util.Objects;
@Getter
@Setter
public class TdtStatusVO {
/**
* 站台code
*/
private String standCode;
/**
* 是否扣车
*/
private boolean hold;
/**
* 是否跳停
*/
private boolean jump;
/**
* 倒计时剩余时间
*/
private int remain;
/**
* 是否有停靠列车
*/
private boolean parking;
public TdtStatusVO(Stand stand) {
this.standCode = stand.getCode();
boolean trainParking = stand.isTrainParking();
this.parking = trainParking;
if (trainParking) {
this.remain = stand.getRemainTime() / 1000;
}
this.hold = stand.isHoldTrain();
this.jump = stand.isJumpStop();
}
public boolean compareAndChange(Stand stand) {
boolean change = false;
boolean trainParking = stand.isTrainParking();
if (!Objects.equals(this.parking, trainParking)) {
change = true;
this.parking = trainParking;
}
int remainTime = stand.getRemainTime() / 1000;
if (trainParking && !Objects.equals(this.remain, remainTime)) {
change = true;
this.remain = remainTime;
}
if (!Objects.equals(this.jump, stand.isJumpStop())) {
change = true;
this.jump = stand.isJumpStop();
}
if (!Objects.equals(this.hold, stand.isHoldTrain())) {
change = true;
this.hold = stand.isHoldTrain();
}
return change;
}
}

View File

@ -141,6 +141,8 @@ public enum WebSocketMessageType {
DeviceCtrl_3D,
/** 列车即将进站消息 */
BeAbout2Arrive_3D,
/** 列车即将进站消息 */
TDT_3D,
/** 3D设备故障设置消息 */
Device_Fault_Set_3D,
/** 3D设备故障解决消息 */

View File

@ -6,10 +6,7 @@ import club.joylink.rtss.simulation.cbtc.communication.vo.TrainPosition;
import club.joylink.rtss.simulation.cbtc.conversation.Conversation;
import club.joylink.rtss.simulation.cbtc.conversation.ConversationMessage;
import club.joylink.rtss.simulation.cbtc.data.status.IbpStatus;
import club.joylink.rtss.simulation.cbtc.data.vo.ConversationSocketMessageVO;
import club.joylink.rtss.simulation.cbtc.data.vo.DeviceStatusVO;
import club.joylink.rtss.simulation.cbtc.data.vo.SimulationVO;
import club.joylink.rtss.simulation.cbtc.data.vo.TrainIsAbout2ArriveVO;
import club.joylink.rtss.simulation.cbtc.data.vo.*;
import club.joylink.rtss.simulation.cbtc.member.SimulationMember;
import club.joylink.rtss.simulation.cbtc.member.SimulationUser;
import club.joylink.rtss.vo.client.SocketMessageVO;
@ -139,6 +136,7 @@ public class SocketMessageFactory {
}
case Device_Load_Destroy_3D:
case DeviceCtrl_3D:
case TDT_3D:
case BeAbout2Arrive_3D: {
topicList.add(String.format(WebSocketSubscribeTopic.Sandbox3D, group));
topicList.add(String.format(WebSocketSubscribeTopic.TrainDrive3D, group));
@ -320,6 +318,14 @@ public class SocketMessageFactory {
return build(WebSocketMessageType.BeAbout2Arrive_3D, group, arriveVO);
}
/**
* 构建列车即将到站消息
* @return
*/
public static SocketMessageVO<List<TdtStatusVO>> buildTrainIsAbout2ArriveMessage(String group, List<TdtStatusVO> list) {
return build(WebSocketMessageType.TDT_3D, group, list);
}
/**
* 构建VR同步消息
*/