Files
qt-migration-legatus/qt5-before/dlbo/Lts/Tools/SAASimulator/SaaSimulator.ts
T
torstenandCopilot 7173785915 Qt6 Migration: Complete migration with DDS/RTI support and build validation
Major Changes:
- Merged latest Qt5 devel content from dlbo (292 files changed, 7 new dirs)
- Consolidated forward-declarations and include folders
- Removed unneeded modules per Niklas' repo check list

Build System Fixes:
- Fixed CMake VERSION_GREATER syntax in ParticipantManagement/CMakeLists.txt
- Added VLC packages (libvlc-dev, vlc-plugin-base) to docker_build.sh
- Added PostgreSQL dev packages (libpq-dev, postgresql-server-dev-all) to Dockerfile
- Fixed locale warnings (ANSI_X3.4-1968 → C.UTF-8)
- Fixed ArcGIS SDK path warnings when BUILD_ARCGIS=OFF

Code Generation Fixes:
- Fixed IDL enum collisions (PortType→CorePortType/DdsutPortType, PdmEventType)
- Fixed Grantlee template svc_translation.cpp.grantlee:
  - Changed {{ idl_enum.name }}_def:: to {{ idl_enum.name }}::
  - Fixed .underlying() calls for C++11 scoped enums (enum class)
- Removed generated files from repo (moc_*, *_dtc.h, *_ftc.h)

Validation:
- BUILD_RTI=ON: SUCCESS
- BUILD_RTI=OFF: SUCCESS
- C++17 standard maintained for RTI 7.7 compatibility
- Ubuntu 26.04 Docker environment verified

Remaining Warnings (expected):
- BgViewer, KDChart, KDReports, Poppler-Qt6 not found (optional features)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-15 18:20:26 +00:00

242 lines
7.6 KiB
TypeScript

import { resolve } from "bun";
import {v4 as uuidv4} from "uuid"
import { EventEmitter } from "events";
type SAAConfig = {
autoConnectToExercise: boolean
}
enum SAAState {
CREATED = 0,
CONNECTED = 1,
REGISTERED = 3,
CONNECTION_FAILED = 4
};
export class SAASimulator extends EventEmitter{
private exerciseId: number | undefined;
private partyId: number | undefined;
private uri: string | undefined;
private wsExm?: WebSocket;
private wsTabPlugin?: WebSocket;
private wsPpm?: WebSocket;
private openRequests: Map<string, (data: {}) => void> = new Map<string, (data: {}) => void>();
private config: SAAConfig = { autoConnectToExercise: false };
private state: SAAState = SAAState.CREATED;
constructor(config?: SAAConfig, exerciseId?: number, partyId?: number) {
super();
if (config) this.config = config;
if (exerciseId) {
this.exerciseId = exerciseId;
}
}
public setExerciseId(exerciseId: number) {
if ((this.state == SAAState.CONNECTED) || this.state == SAAState.REGISTERED) return;
this.exerciseId = exerciseId;
}
public getExId(): number{
return this.exerciseId || 0;
}
public getPartyId(): number{
return this.partyId || 0;
}
private loadTelegrams() {
const file = Bun.file("telegrams.json");
const contents = file.json();
}
public async register(partyId:number)
{
return new Promise((resolve,reject)=>{
this.sendTelegram({ uuid: "", version: "", timestamp: 1, sender: "", reciver: "", referenceUuid: "" }, { type: "EX-Anmeldung", typeId: 1, data: { partyId: partyId } });
});
}
public getPartys(uri: string, port: number, exerciseId: number) {
return new Promise<number[]>((resolve, reject) => {
const ws = new WebSocket(`${uri}:${port}`)
ws.addEventListener("message", event => {
if (!event.data) reject();
const eventData = JSON.parse(event.data);
const servicePortsInformation = eventData["data"].find((servicePortsInformation: any) => { return servicePortsInformation["exerciseId"] == exerciseId });
const ppmService = servicePortsInformation["services"].find((servicePort: any) => { return servicePort["name"] == "ParticipantManagement"; });
const ppmPort = ppmService["ports"].find((portInfo: any) => { return portInfo["typeId"] == 1; })["number"];
const wsPpm = new WebSocket(`${uri}:${ppmPort}`)
wsPpm.addEventListener("message", event => {
if (!event.data) reject();
const eventData = JSON.parse(event.data);
if(eventData["type"] != "partyBaseData")return;
const partys = eventData["data"].map((party:any )=>{return {id:party["id"],name:party["name"]}});
resolve(partys);
});
// socket opened
wsPpm.addEventListener("open", (event: any) => {
wsPpm.send(`{"type":"baseDlRequest","uuid":"12345"}`)
});
// socket closed
wsPpm.addEventListener("close", (event: any) => {
console.log(event)
reject();
});
// error handler
wsPpm.addEventListener("error", (event: any) => { reject() });
});
// socket opened
ws.addEventListener("open", (event: any) => {
ws.send(`{"type":"servicePortsInformationRequest","uuid":"12345"}`)
});
// socket closed
ws.addEventListener("close", (event: any) => {
console.log(event)
reject();
});
// error handler
ws.addEventListener("error", (event: any) => { reject() });
});
}
public sendTelegram(telegram: any, data:any){
let tele = {...telegram,...data};
const uuid = uuidv4();
tele["uuid"] = uuid;
this.openRequests.set(uuid, (data: any) => { console.log(data) });
this.wsTabPlugin?.send(JSON.stringify(tele));
}
public getParticipantNumbers(){
this.wsPpm?.send(`{"type":"baseDlRequest","uuid":"12345"}`)
}
private getServicePortsInformationRequest(uuid: string) {
this.wsExm?.send(`{"type":"servicePortsInformationRequest","uuid":"${uuid}"}`)
this.openRequests.set(uuid, (data: any) => { this.handleServicePortsInformationResponse(data) });
}
private onOpen(event) {
this.getServicePortsInformationRequest("1234");
}
private handleServicePortsInformationResponse(data: any) {
const servicePortsInformation = data["data"].find((servicePortsInformation: any) => { return servicePortsInformation["exerciseId"] == this.exerciseId });
const serviceTab = servicePortsInformation["services"].find((servicePort: any) => { return servicePort["name"] == "TrainingAreaBase"; });
const tabPort = serviceTab["ports"].find((portInfo: any) => { return portInfo["typeId"] == 3; })["number"];
const servicePpm = servicePortsInformation["services"].find((servicePort: any) => { return servicePort["name"] == "ParticipantManagement"; });
const ppmPort = servicePpm["ports"].find((portInfo: any) => { return portInfo["typeId"] == 1; })["number"];
this.connectToPpm(ppmPort);
this.connectToTabPlugin(tabPort);
}
public getExerciseIds(uri: string, port: number): Promise<number[]> {
return new Promise<number[]>((resolve, reject) => {
const ws = new WebSocket(`${uri}:${port}`)
ws.addEventListener("message", event => {
if (!event.data) reject();
const eventData = JSON.parse(event.data);
resolve(eventData["data"].map((exerciseInfo: any) => { return Number.parseInt(exerciseInfo["exerciseId"]); }));
});
// socket opened
ws.addEventListener("open", (event: any) => {
ws.send(`{"type":"servicePortsInformationRequest","uuid":"12345"}`)
});
// socket closed
ws.addEventListener("close", (event: any) => {
console.log(event)
reject();
});
// error handler
ws.addEventListener("error", (event: any) => {
console.log(event)
reject(); });
});
}
public connect(uri: string, port: number) {
this.uri = uri;
this.wsExm = new WebSocket(`${uri}:${port}`)
this.wsExm.addEventListener("message", event => {
if (!event.data) return;
const eventData = JSON.parse(event.data);
const uuid = eventData["uuid"]
if(this.openRequests.has(uuid)){
const func = this.openRequests.get(uuid);
if (!func) return;
this.openRequests.delete(uuid);
func(eventData);
}
});
// socket opened
this.wsExm.addEventListener("open", (event) => {
this.onOpen(event);
});
// socket closed
this.wsExm.addEventListener("close", event => { console.log(event) });
// error handler
this.wsExm.addEventListener("error", event => { console.log(event) });
}
public getAvailableCommands(): string[] {
}
private connectToTabPlugin(port: number) {
this.wsTabPlugin = new WebSocket(`${this.uri}:${port}`)
this.wsTabPlugin.addEventListener("message", event => {
if (!event.data) return;
const eventData = JSON.parse(event.data);
const uuid = eventData["referenceUuid"]
const func = this.openRequests.get(uuid);
if (!func) return;
func(eventData);
});
// socket opened
this.wsTabPlugin.addEventListener("open", (event) => {
console.log("Connected to TabPlugin")
});
// socket closed
this.wsTabPlugin.addEventListener("close", event => { console.log(event) });
// error handler
this.wsTabPlugin.addEventListener("error", event => { console.log(event) });
}
public connectToPpm(port: number) {
this.wsPpm = new WebSocket(`${this.uri}:${port}`)
this.wsPpm.addEventListener("message", event => {
if (!event.data) return;
const eventData = JSON.parse(event.data);
console.log(JSON.parse(event.data)["data"]);
const path = "/shd/CTC/TOOLS/julius/json.json";
Bun.write(path, event.data);
});
// socket opened
this.wsPpm.addEventListener("open", (event) => {
console.log("Connected to Ppm")
});
// socket closed
this.wsPpm.addEventListener("close", event => { console.log(event) });
// error handler
this.wsPpm.addEventListener("error", event => { console.log(event) });
}
}