Moved GSX state machine into WASM

This commit is contained in:
2025-09-09 14:53:41 +02:00
parent dee5447bed
commit 04e5ec4251
9 changed files with 218 additions and 154 deletions
+149 -62
View File
@@ -17,6 +17,8 @@ HANDLE simConnect;
FILE* logFile;
MODULE_VAR tick18 = { TICK18 };
#pragma region Module callbacks
// Init
extern "C" MSFS_CALLBACK void module_init(void) {
log(stdout, "Starting init.\n");
@@ -299,6 +301,11 @@ extern "C" MSFS_CALLBACK void module_init(void) {
return;
}
// GSX LVars
hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_COUATL_STARTED", "number", SIMCONNECT_DATATYPE_FLOAT64);
if (hr != S_OK) {
log(stderr, "Could not add L:FSDT_GSX_COUATL_STARTED to data definition, terminating.\n");
return;
}
hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_BOARDING_STATE", "number", SIMCONNECT_DATATYPE_FLOAT64);
if (hr != S_OK) {
log(stderr, "Could not add L:FSDT_GSX_BOARDING_STATE to data definition, terminating.\n");
@@ -489,6 +496,8 @@ extern "C" MSFS_CALLBACK bool Load_Manager_gauge_callback(FsContext ctx, int ser
return true;
}
#pragma endregion
// CommBus
void commBusUpdateTargetCallback(const char* args, unsigned int size, void* ctx) {
int hr = receiveData(args);
@@ -795,8 +804,8 @@ void sendData () {
#pragma endregion
// GSX
GSX.AddMember("boardingState", GSXData->boardingState, allocator);
GSX.AddMember("deboardingState", GSXData->deboardingState, allocator);
GSX.AddMember<bool>("couatlStarted", GSXData->couatlStarted, allocator);
GSX.AddMember("loadingState", GSXData->loadingState, allocator);
// User Data
userData.AddMember<bool>("isCargo", UserData->isCargo, allocator);
@@ -954,79 +963,157 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
}
case DATA_REQUEST_GSX: {
GSXData_t* data = (GSXData_t*)&pObjData->dwData;
memcpy(GSXData, data, sizeof(GSXData_t));
GSXData->couatlStarted = data->couatlStarted;
GSXData->boardingState = data->boardingState;
GSXData->deboardingState = data->deboardingState;
GSXData->passengersBoarded = data->passengersBoarded;
GSXData->passengersDeboarded = data->passengersDeboarded;
GSXData->cargoBoarded = data->cargoBoarded;
GSXData->cargoDeboarded = data->cargoDeboarded;
if (UserOptions->GSXSync) {
if (GSXData->boardingState == GSX_SERVICE_ACTIVE) {
double cargoBoarded = GSXData->cargoBoarded;
if (UserData->isCargo) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetFPayloadData, sizeof(localPayload));
if (UserOptions->GSXSync && GSXData->couatlStarted == 1) {
switch ((char)GSXData->boardingState) {
case GSX_SERVICE_ACTIVE: {
GSXData->loadingState = LOADING_STATE_BOARDING;
localPayload.stations.upper1 = targetFPayloadData->stations.upper1 * (cargoBoarded / 100);
localPayload.stations.upper2 = targetFPayloadData->stations.upper2 * (cargoBoarded / 100);
localPayload.stations.upper3 = targetFPayloadData->stations.upper3 * (cargoBoarded / 100);
localPayload.stations.upper4 = targetFPayloadData->stations.upper4 * (cargoBoarded / 100);
localPayload.lowerForward = targetFPayloadData->lowerForward * (cargoBoarded / 100);
localPayload.lowerRear = targetFPayloadData->lowerRear * (cargoBoarded / 100);
double cargoBoarded = GSXData->cargoBoarded;
if (UserData->isCargo) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetFPayloadData, sizeof(localPayload));
generatePayload(&localPayload, UserData->isImperial);
load(&localPayload, simConnect, UserData->isImperial);
localPayload.stations.upper1 = targetFPayloadData->stations.upper1 * (cargoBoarded / 100);
localPayload.stations.upper2 = targetFPayloadData->stations.upper2 * (cargoBoarded / 100);
localPayload.stations.upper3 = targetFPayloadData->stations.upper3 * (cargoBoarded / 100);
localPayload.stations.upper4 = targetFPayloadData->stations.upper4 * (cargoBoarded / 100);
localPayload.lowerForward = targetFPayloadData->lowerForward * (cargoBoarded / 100);
localPayload.lowerRear = targetFPayloadData->lowerRear * (cargoBoarded / 100);
generatePayload(&localPayload, UserData->isImperial);
load(&localPayload, simConnect, UserData->isImperial);
}
else {
double passengersBoarded = GSXData->passengersBoarded;
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
localPayload.paxCount.business1 = min(targetPaxPayloadData->paxCount.business1, passengersBoarded);
passengersBoarded -= localPayload.paxCount.business1;
localPayload.paxCount.business2 = min(targetPaxPayloadData->paxCount.business2, passengersBoarded);
passengersBoarded -= localPayload.paxCount.business2;
localPayload.paxCount.economy1 = min(targetPaxPayloadData->paxCount.economy1, passengersBoarded);
passengersBoarded -= localPayload.paxCount.economy1;
localPayload.paxCount.economy2 = min(targetPaxPayloadData->paxCount.economy2, passengersBoarded);
passengersBoarded -= localPayload.paxCount.economy2;
localPayload.forwardCargo = targetPaxPayloadData->forwardCargo * (cargoBoarded / 100);
localPayload.rearCargo = targetPaxPayloadData->rearCargo * (cargoBoarded / 100);
generatePayload(&localPayload, UserData->isImperial, UserOptions);
load(&localPayload, simConnect, UserData->isImperial);
}
break;
}
else {
double passengersBoarded = GSXData->passengersBoarded;
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
case GSX_SERVICE_FINISHED: {
GSXData->loadingState = LOADING_STATE_BOARDED;
localPayload.paxCount.business1 = min(targetPaxPayloadData->paxCount.business1, passengersBoarded);
passengersBoarded -= localPayload.paxCount.business1;
localPayload.paxCount.business2 = min(targetPaxPayloadData->paxCount.business2, passengersBoarded);
passengersBoarded -= localPayload.paxCount.business2;
localPayload.paxCount.economy1 = min(targetPaxPayloadData->paxCount.economy1, passengersBoarded);
passengersBoarded -= localPayload.paxCount.economy1;
localPayload.paxCount.economy2 = min(targetPaxPayloadData->paxCount.economy2, passengersBoarded);
passengersBoarded -= localPayload.paxCount.economy2;
localPayload.forwardCargo = targetPaxPayloadData->forwardCargo * (cargoBoarded / 100);
localPayload.rearCargo = targetPaxPayloadData->rearCargo * (cargoBoarded / 100);
if (UserData->isCargo) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetFPayloadData, sizeof(localPayload));
generatePayload(&localPayload, UserData->isImperial, UserOptions);
load(&localPayload, simConnect, UserData->isImperial);
generatePayload(&localPayload, UserData->isImperial);
load(&localPayload, simConnect, UserData->isImperial);
}
else {
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
generatePayload(&localPayload, UserData->isImperial, UserOptions);
load(&localPayload, simConnect, UserData->isImperial);
}
break;
}
}
if (GSXData->deboardingState == GSX_SERVICE_ACTIVE) {
double cargoDeboarded = GSXData->cargoDeboarded;
if (UserData->isCargo) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetFPayloadData, sizeof(localPayload));
switch ((char)GSXData->deboardingState) {
case GSX_SERVICE_ACTIVE: {
// Exit if not boarded
if (GSXData->loadingState != LOADING_STATE_BOARDED) break;
localPayload.stations.upper1 -= targetFPayloadData->stations.upper1 * (cargoDeboarded / 100);
localPayload.stations.upper2 -= targetFPayloadData->stations.upper2 * (cargoDeboarded / 100);
localPayload.stations.upper3 -= targetFPayloadData->stations.upper3 * (cargoDeboarded / 100);
localPayload.stations.upper4 -= targetFPayloadData->stations.upper4 * (cargoDeboarded / 100);
localPayload.lowerForward -= targetFPayloadData->lowerForward * (cargoDeboarded / 100);
localPayload.lowerRear -= targetFPayloadData->lowerRear * (cargoDeboarded / 100);
GSXData->loadingState = LOADING_STATE_DEBOARDING;
generatePayload(&localPayload, UserData->isImperial);
load(&localPayload, simConnect, UserData->isImperial);
double cargoDeboarded = GSXData->cargoDeboarded;
if (UserData->isCargo) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetFPayloadData, sizeof(localPayload));
localPayload.stations.upper1 -= targetFPayloadData->stations.upper1 * (cargoDeboarded / 100);
localPayload.stations.upper2 -= targetFPayloadData->stations.upper2 * (cargoDeboarded / 100);
localPayload.stations.upper3 -= targetFPayloadData->stations.upper3 * (cargoDeboarded / 100);
localPayload.stations.upper4 -= targetFPayloadData->stations.upper4 * (cargoDeboarded / 100);
localPayload.lowerForward -= targetFPayloadData->lowerForward * (cargoDeboarded / 100);
localPayload.lowerRear -= targetFPayloadData->lowerRear * (cargoDeboarded / 100);
generatePayload(&localPayload, UserData->isImperial);
load(&localPayload, simConnect, UserData->isImperial);
}
else {
double passengersDeboarded = GSXData->passengersDeboarded;
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
localPayload.paxCount.business1 -= min(targetPaxPayloadData->paxCount.business1, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.business1 - localPayload.paxCount.business1;
localPayload.paxCount.business2 -= min(targetPaxPayloadData->paxCount.business2, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.business2 - localPayload.paxCount.business2;
localPayload.paxCount.economy1 -= min(targetPaxPayloadData->paxCount.economy1, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.economy1 - localPayload.paxCount.economy1;
localPayload.paxCount.economy2 -= min(targetPaxPayloadData->paxCount.economy2, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.economy2 - localPayload.paxCount.economy2;
localPayload.forwardCargo -= targetPaxPayloadData->forwardCargo * (cargoDeboarded / 100);
localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100);
generatePayload(&localPayload, UserData->isImperial, UserOptions);
load(&localPayload, simConnect, UserData->isImperial);
}
break;
}
else {
double passengersDeboarded = GSXData->passengersDeboarded;
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
case GSX_SERVICE_FINISHED: {
// Exit if not deboarding
if (GSXData->loadingState != LOADING_STATE_DEBOARDING) break;
localPayload.paxCount.business1 -= min(targetPaxPayloadData->paxCount.business1, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.business1 - localPayload.paxCount.business1;
localPayload.paxCount.business2 -= min(targetPaxPayloadData->paxCount.business2, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.business2 - localPayload.paxCount.business2;
localPayload.paxCount.economy1 -= min(targetPaxPayloadData->paxCount.economy1, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.economy1 - localPayload.paxCount.economy1;
localPayload.paxCount.economy2 -= min(targetPaxPayloadData->paxCount.economy2, passengersDeboarded);
passengersDeboarded -= targetPaxPayloadData->paxCount.economy2 - localPayload.paxCount.economy2;
localPayload.forwardCargo -= targetPaxPayloadData->forwardCargo * (cargoDeboarded / 100);
localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100);
GSXData->loadingState = LOADING_STATE_DEBOARDED;
generatePayload(&localPayload, UserData->isImperial, UserOptions);
load(&localPayload, simConnect, UserData->isImperial);
if (UserData->isCargo) {
fPayloadData_t localPayload = {};
memcpy(&localPayload, targetFPayloadData, sizeof(localPayload));
localPayload.stations.upper1 = 0;
localPayload.stations.upper2 = 0;
localPayload.stations.upper3 = 0;
localPayload.stations.upper4 = 0;
localPayload.lowerForward = 0;
localPayload.lowerRear = 0;
generatePayload(&localPayload, UserData->isImperial);
load(&localPayload, simConnect, UserData->isImperial);
}
else {
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
localPayload.paxCount.business1 = 0;
localPayload.paxCount.business2 = 0;
localPayload.paxCount.economy1 = 0;
localPayload.paxCount.economy2 = 0;
localPayload.forwardCargo = 0;
localPayload.rearCargo = 0;
generatePayload(&localPayload, UserData->isImperial, UserOptions);
load(&localPayload, simConnect, UserData->isImperial);
}
break;
}
}
}
+1 -1
View File
@@ -32,7 +32,7 @@
/******************************** Constants ********************************/
// Module identification
#define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager] "
#define VERSION_STRING "1.1"
#define VERSION_STRING "1.3"
// COMM BUS
#define COMM_BUS_LIVE_DATA_EVENT "khofmann_tfdi_md-11_load_manager_live_data"
#define COMM_BUS_UPDATE_TARGET_EVENT "khofmann_tfdi_md-11_load_manager_update_target"
+14
View File
@@ -60,6 +60,7 @@
#define CG_TOLERANCE 0.05
// GSX States
#define GSX_SERVICE_ACTIVE 5
#define GSX_SERVICE_FINISHED 6
/********************************* Macros **********************************/
// Conversions
@@ -87,6 +88,14 @@ enum DATA_REQUESTS {
DATA_REQUEST_USER_DATA,
};
enum LOADING_STATES {
LOADING_STATE_IDLE,
LOADING_STATE_BOARDING,
LOADING_STATE_BOARDED,
LOADING_STATE_DEBOARDING,
LOADING_STATE_DEBOARDED,
};
/***************************** Data structures *****************************/
typedef struct {
double isCargo;
@@ -95,12 +104,17 @@ typedef struct {
} UserData_t;
typedef struct {
// SimConnect mapped
double couatlStarted; // boolean
double boardingState; // See manual, 5 => active
double deboardingState; // See manual, 5 => active
double passengersBoarded; // Num pax
double passengersDeboarded; // Num pax
double cargoBoarded; // In percent
double cargoDeboarded; // In percent
// Additional properties
enum LOADING_STATES loadingState;
} GSXData_t;
typedef struct {