GSX Synced boarding/deboarding
This commit is contained in:
@@ -10,6 +10,7 @@ paxPayloadData_t* targetPaxPayloadData;
|
||||
fPayloadData_t* liveFPayloadData;
|
||||
fPayloadData_t* targetFPayloadData;
|
||||
FuelData_t* liveFuelData;
|
||||
UserOptions_t* UserOptions;
|
||||
|
||||
// Operational
|
||||
bool commBusCallbackRegistered;
|
||||
@@ -34,6 +35,7 @@ extern "C" MSFS_CALLBACK void module_init(void) {
|
||||
liveFPayloadData = new fPayloadData_t();
|
||||
targetFPayloadData = new fPayloadData_t();
|
||||
liveFuelData = new FuelData_t();
|
||||
UserOptions = new UserOptions_t();
|
||||
|
||||
targetFPayloadData->CGTarget = targetPaxPayloadData->CGTarget = 21;
|
||||
|
||||
@@ -392,6 +394,26 @@ extern "C" MSFS_CALLBACK void module_init(void) {
|
||||
log(stdout, MODULE_NAME"CommBus registered.\n");
|
||||
}
|
||||
|
||||
// Options
|
||||
FILE* optionsFile = fopen("\\work\\options.json", "rb");
|
||||
if (optionsFile != NULL) {
|
||||
char readBuffer[256];
|
||||
rapidjson::FileReadStream is(optionsFile, readBuffer, sizeof(readBuffer));
|
||||
rapidjson::Document optionsDoc;
|
||||
optionsDoc.ParseStream(is);
|
||||
if (optionsDoc.HasMember("GSXSync")) UserOptions->GSXSync = optionsDoc["GSXSync"].GetBool();
|
||||
if (optionsDoc.HasMember("paxWeightKG")) UserOptions->paxWeightKG = optionsDoc["paxWeightKG"].GetDouble();
|
||||
if (optionsDoc.HasMember("bagWeightKG")) UserOptions->bagWeightKG = optionsDoc["bagWeightKG"].GetDouble();
|
||||
if (optionsDoc.HasMember("paxWeightLBS")) UserOptions->paxWeightLBS = optionsDoc["paxWeightLBS"].GetDouble();
|
||||
if (optionsDoc.HasMember("bagWeightLBS")) UserOptions->bagWeightLBS = optionsDoc["bagWeightLBS"].GetDouble();
|
||||
fclose(optionsFile);
|
||||
|
||||
log(stdout, MODULE_NAME"Options loaded.\n");
|
||||
}
|
||||
else {
|
||||
log(stdout, MODULE_NAME"Options file not present, skip.\n");
|
||||
}
|
||||
|
||||
log(stdout, MODULE_NAME"Initialized.\n");
|
||||
}
|
||||
|
||||
@@ -403,6 +425,8 @@ extern "C" MSFS_CALLBACK void module_deinit(void) {
|
||||
log(stderr, MODULE_NAME"Failed to close SimConnect.\n");
|
||||
}
|
||||
|
||||
log(stdout, MODULE_NAME"SimConnect closed.\n");
|
||||
|
||||
delete UserData;
|
||||
delete GSXData;
|
||||
delete livePaxPayloadData;
|
||||
@@ -411,7 +435,36 @@ extern "C" MSFS_CALLBACK void module_deinit(void) {
|
||||
delete targetFPayloadData;
|
||||
delete liveFuelData;
|
||||
|
||||
log(stdout, MODULE_NAME"Global memory released.\n");
|
||||
|
||||
fsCommBusUnregister(COMM_BUS_UPDATE_TARGET_EVENT, commBusUpdateTargetCallback);
|
||||
|
||||
log(stdout, MODULE_NAME"CommBus unregistered.\n");
|
||||
|
||||
// Options
|
||||
rapidjson::Document optionsDoc;
|
||||
rapidjson::Document::AllocatorType& allocator = optionsDoc.GetAllocator();
|
||||
optionsDoc.SetObject();
|
||||
optionsDoc.AddMember("GSXSync", UserOptions->GSXSync, allocator);
|
||||
optionsDoc.AddMember("paxWeightKG", UserOptions->paxWeightKG, allocator);
|
||||
optionsDoc.AddMember("bagWeightKG", UserOptions->bagWeightKG, allocator);
|
||||
optionsDoc.AddMember("paxWeightLBS", UserOptions->paxWeightLBS, allocator);
|
||||
optionsDoc.AddMember("bagWeightLBS", UserOptions->bagWeightLBS, allocator);
|
||||
FILE* optionsFile = fopen("\\work\\options.json", "wb");
|
||||
if (optionsFile != NULL) {
|
||||
char writeBuffer[256];
|
||||
rapidjson::FileWriteStream os(optionsFile, writeBuffer, sizeof(writeBuffer));
|
||||
rapidjson::Writer<rapidjson::FileWriteStream> writer(os);
|
||||
optionsDoc.Accept(writer);
|
||||
fclose(optionsFile);
|
||||
|
||||
log(stdout, MODULE_NAME"Options written.\n");
|
||||
}
|
||||
else {
|
||||
log(stdout, MODULE_NAME"Filed to open options file for write, skip.\n");
|
||||
}
|
||||
|
||||
log(stdout, MODULE_NAME"Deinitialized.\n");
|
||||
}
|
||||
|
||||
// Main loop
|
||||
@@ -455,13 +508,14 @@ int receiveData(const char* buf) {
|
||||
|
||||
if (UserData->isCargo) {
|
||||
targetPaxPayloadData->CGTarget = CGTarget;
|
||||
//TODO: F load
|
||||
}
|
||||
else {
|
||||
if (!document.HasMember("numPax")) return -1;
|
||||
unsigned short numPax = document["numPax"].GetInt();
|
||||
|
||||
targetPaxPayloadData->CGTarget = CGTarget;
|
||||
distribute(targetPaxPayloadData, liveFuelData, numPax, cargo, UserData->isImperial);
|
||||
distribute(targetPaxPayloadData, liveFuelData, numPax, cargo, UserData->isImperial, UserData->isER);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -473,17 +527,18 @@ int receiveData(const char* buf) {
|
||||
|
||||
if (UserData->isCargo) {
|
||||
targetPaxPayloadData->CGTarget = CGTarget;
|
||||
//TODO: F load
|
||||
}
|
||||
else {
|
||||
targetPaxPayloadData->CGTarget = CGTarget;
|
||||
distribute(targetPaxPayloadData, liveFuelData, ZFWTarget, UserData->isImperial);
|
||||
distribute(targetPaxPayloadData, liveFuelData, ZFWTarget, UserData->isImperial, UserData->isER);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Station Entry
|
||||
case 2: {
|
||||
if (UserData->isCargo) {
|
||||
|
||||
//TODO: F load
|
||||
}
|
||||
else {
|
||||
if (!document.HasMember("business1") || !document.HasMember("business2") ||
|
||||
@@ -503,7 +558,7 @@ int receiveData(const char* buf) {
|
||||
// Trigger load
|
||||
case 3: {
|
||||
if (UserData->isCargo) {
|
||||
|
||||
//TODO: F load
|
||||
}
|
||||
else {
|
||||
load(targetPaxPayloadData, simConnect, UserData->isImperial);
|
||||
@@ -514,10 +569,10 @@ int receiveData(const char* buf) {
|
||||
// Trigger unload
|
||||
case 4: {
|
||||
if (UserData->isCargo) {
|
||||
|
||||
//TODO: F load
|
||||
}
|
||||
else {
|
||||
unload(simConnect, UserData->isImperial);
|
||||
unload(simConnect, UserData->isER);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -551,6 +606,8 @@ void sendData () {
|
||||
userData.SetObject();
|
||||
rapidjson::Value limits;
|
||||
limits.SetObject();
|
||||
rapidjson::Value options;
|
||||
options.SetObject();
|
||||
|
||||
rapidjson::StringBuffer strbuf;
|
||||
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
|
||||
@@ -665,14 +722,9 @@ void sendData () {
|
||||
|
||||
#pragma endregion
|
||||
|
||||
//TODO: Evaluate necessity of sending GSX data
|
||||
// GSX
|
||||
GSX.AddMember("boardingState", GSXData->boardingState, allocator);
|
||||
GSX.AddMember("deboardingState", GSXData->deboardingState, allocator);
|
||||
GSX.AddMember("passengersBoarded", GSXData->passengersBoarded, allocator);
|
||||
GSX.AddMember("passengersDeboarded", GSXData->passengersDeboarded, allocator);
|
||||
GSX.AddMember("cargoBoarded", GSXData->cargoBoarded, allocator);
|
||||
GSX.AddMember("cargoDeboarded", GSXData->cargoDeboarded, allocator);
|
||||
|
||||
// User Data
|
||||
userData.AddMember<bool>("isCargo", UserData->isCargo, allocator);
|
||||
@@ -692,7 +744,7 @@ void sendData () {
|
||||
limits.AddMember("upper3", -1, allocator);
|
||||
limits.AddMember("upper4", -1, allocator);
|
||||
limits.AddMember("lowerForward", MAX_FRONT_CARGO(UserData->isImperial), allocator);
|
||||
limits.AddMember("lowerRear", MAX_REAR_CARGO(UserData->isImperial), allocator);
|
||||
limits.AddMember("lowerRear", MAX_REAR_CARGO(UserData->isImperial, UserData->isER), allocator);
|
||||
// TODO: Actual F limit
|
||||
//limits.AddMember("MaxZFW", MAX_F_ZFW, allocator);
|
||||
limits.AddMember("minZFW", targetFPayloadData->empty + targetFPayloadData->leftAux + targetFPayloadData->rightAux, allocator);
|
||||
@@ -704,17 +756,23 @@ void sendData () {
|
||||
limits.AddMember("economy1", MAX_ECONOMY_1, allocator);
|
||||
limits.AddMember("economy2", MAX_ECONOMY_2, allocator);
|
||||
limits.AddMember("forwardCargo", MAX_FRONT_CARGO(UserData->isImperial), allocator);
|
||||
limits.AddMember("rearCargo", MAX_REAR_CARGO(UserData->isImperial), allocator);
|
||||
limits.AddMember("rearCargo", MAX_REAR_CARGO(UserData->isImperial, UserData->isER), allocator);
|
||||
limits.AddMember("maxZFW", MAX_PAX_ZFW(UserData->isImperial), allocator);
|
||||
limits.AddMember("minZFW", targetPaxPayloadData->empty + targetPaxPayloadData->leftAux + targetPaxPayloadData->rightAux, allocator);
|
||||
}
|
||||
|
||||
// Options
|
||||
options.AddMember("GSXSync", UserOptions->GSXSync, allocator);
|
||||
options.AddMember("paxWeight", UserData->isImperial ? UserOptions->paxWeightLBS : UserOptions->paxWeightKG, allocator);
|
||||
options.AddMember("bagWeight", UserData->isImperial ? UserOptions->bagWeightLBS : UserOptions->bagWeightKG, allocator);
|
||||
|
||||
// Construct document
|
||||
document.AddMember("livePayload", livePayload.Move(), allocator);
|
||||
document.AddMember("targetPayload", targetPayload.Move(), allocator);
|
||||
document.AddMember("GSX", GSX.Move(), allocator);
|
||||
document.AddMember("userData", userData.Move(), allocator);
|
||||
document.AddMember("limits", limits.Move(), allocator);
|
||||
document.AddMember("options", options.Move(), allocator);
|
||||
|
||||
// Write to CommBus
|
||||
document.Accept(writer);
|
||||
@@ -796,6 +854,59 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
|
||||
GSXData_t* data = (GSXData_t*)&pObjData->dwData;
|
||||
memcpy(GSXData, data, sizeof(GSXData_t));
|
||||
|
||||
if (UserOptions->GSXSync) {
|
||||
if (GSXData->boardingState == GSX_SERVICE_ACTIVE) {
|
||||
double cargoBoarded = GSXData->cargoBoarded;
|
||||
if (UserData->isCargo) {
|
||||
//TODO: Progressive F load
|
||||
}
|
||||
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);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
}
|
||||
}
|
||||
if (GSXData->deboardingState == GSX_SERVICE_ACTIVE) {
|
||||
double cargoDeboarded = GSXData->cargoDeboarded;
|
||||
if (UserData->isCargo) {
|
||||
//TODO: Progressive F unload
|
||||
}
|
||||
else {
|
||||
double passengersDeboarded = GSXData->passengersDeboarded;
|
||||
paxPayloadData_t localPayload = {};
|
||||
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
|
||||
|
||||
localPayload.paxCount.business1 -= min(targetPaxPayloadData->paxCount.business1, passengersDeboarded);
|
||||
passengersDeboarded -= localPayload.paxCount.business1;
|
||||
localPayload.paxCount.business2 -= min(targetPaxPayloadData->paxCount.business2, passengersDeboarded);
|
||||
passengersDeboarded -= localPayload.paxCount.business2;
|
||||
localPayload.paxCount.economy1 -= min(targetPaxPayloadData->paxCount.economy1, passengersDeboarded);
|
||||
passengersDeboarded -= localPayload.paxCount.economy1;
|
||||
localPayload.paxCount.economy2 -= min(targetPaxPayloadData->paxCount.economy2, passengersDeboarded);
|
||||
passengersDeboarded -= localPayload.paxCount.economy2;
|
||||
localPayload.forwardCargo -= targetPaxPayloadData->forwardCargo * (cargoDeboarded / 100);
|
||||
localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100);
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case DATA_REQUEST_USER_DATA: {
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#include <MSFS/Legacy/gauges.h>
|
||||
|
||||
#include <rapidjson/document.h>
|
||||
#include <rapidjson/filereadstream.h>
|
||||
#include "rapidjson/filewritestream.h"
|
||||
#include <rapidjson/writer.h>
|
||||
|
||||
#include <SimConnect.h>
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
#include "pax.h"
|
||||
|
||||
//ZFW Entry, fill pax first (pax+bag), rest is cargo
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const bool isImperial) {
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const bool isImperial, const bool isER) {
|
||||
// Find payload, num pax and extra cargo
|
||||
double payload = ZFWTarget - targetPayload->empty - targetPayload->pilot - targetPayload->firstOfficer - targetPayload->engineer -
|
||||
targetPayload->cabinCrewFront - targetPayload->cabinCrewRear - targetPayload->leftAux - targetPayload->rightAux;
|
||||
unsigned short numPax = max(0.0, min((double)MAX_PAX, floor(payload / (PAX_WEIGHT(isImperial) + BAG_WEIGHT(isImperial)))));
|
||||
unsigned int cargo = round(payload - numPax * PAX_WEIGHT(isImperial) - numPax * BAG_WEIGHT(isImperial));
|
||||
|
||||
distribute(targetPayload, fuel, numPax, cargo, isImperial);
|
||||
distribute(targetPayload, fuel, numPax, cargo, isImperial, isER);
|
||||
}
|
||||
|
||||
//SimBrief Entry, SB pax count and extra cargo
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, const bool isImperial) {
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, const bool isImperial, const bool isER) {
|
||||
// Clear
|
||||
targetPayload->paxCount.business1 = targetPayload->paxCount.business2 = targetPayload->paxCount.economy1 = targetPayload->paxCount.economy2 =
|
||||
targetPayload->paxCount.total = 0;
|
||||
@@ -94,7 +94,7 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
||||
targetPayload->forwardCargo++;
|
||||
cargo--;
|
||||
}
|
||||
if (targetPayload->rearCargo < MAX_REAR_CARGO(isImperial) && cargo > 0) {
|
||||
if (targetPayload->rearCargo < MAX_REAR_CARGO(isImperial, isER) && cargo > 0) {
|
||||
targetPayload->rearCargo++;
|
||||
cargo--;
|
||||
}
|
||||
@@ -170,14 +170,14 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
||||
count--;
|
||||
}
|
||||
// Refinement cargo
|
||||
count = MAX_FRONT_CARGO(isImperial) + MAX_REAR_CARGO(isImperial);
|
||||
count = MAX_FRONT_CARGO(isImperial) + MAX_REAR_CARGO(isImperial, isER);
|
||||
while (count > 0) {
|
||||
generatePayload(targetPayload, isImperial);
|
||||
calculateCGs(targetPayload, fuel, &targetPayload->ZFWCG, &targetPayload->TOCG, isImperial);
|
||||
|
||||
// in front of target
|
||||
if (targetPayload->ZFWCG < targetPayload->CGTarget - CG_TOLERANCE) {
|
||||
if (targetPayload->forwardCargo > 0 && targetPayload->rearCargo < MAX_REAR_CARGO(isImperial)) {
|
||||
if (targetPayload->forwardCargo > 0 && targetPayload->rearCargo < MAX_REAR_CARGO(isImperial, isER)) {
|
||||
if (targetPayload->forwardCargo > BAG_WEIGHT(isImperial) &&
|
||||
targetPayload->rearCargo < MAX_FRONT_CARGO(isImperial) - BAG_WEIGHT(isImperial)) {
|
||||
targetPayload->forwardCargo -= BAG_WEIGHT(isImperial);
|
||||
@@ -196,7 +196,7 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
||||
else if (targetPayload->ZFWCG > targetPayload->CGTarget + CG_TOLERANCE) {
|
||||
if (targetPayload->rearCargo > 0 && targetPayload->forwardCargo < MAX_FRONT_CARGO(isImperial)) {
|
||||
if (targetPayload->rearCargo > BAG_WEIGHT(isImperial) &&
|
||||
targetPayload->forwardCargo < MAX_REAR_CARGO(isImperial) - BAG_WEIGHT(isImperial)) {
|
||||
targetPayload->forwardCargo < MAX_REAR_CARGO(isImperial, isER) - BAG_WEIGHT(isImperial)) {
|
||||
targetPayload->rearCargo -= BAG_WEIGHT(isImperial);
|
||||
targetPayload->forwardCargo += BAG_WEIGHT(isImperial);
|
||||
}
|
||||
@@ -218,7 +218,7 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
|
||||
}
|
||||
|
||||
// Updates pax stations with their respective weights
|
||||
// Used internally and used for Station Entry (pax only, cargo is ste directly)
|
||||
// Used internally and used for Station Entry (pax only, cargo is set directly)
|
||||
void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperial) {
|
||||
targetPayload->business1Left = targetPayload->business1Center = targetPayload->business1Right = (targetPayload->paxCount.business1 / 3.0) * PAX_WEIGHT(isImperial);
|
||||
targetPayload->business2Left = targetPayload->business2Center = targetPayload->business2Right = (targetPayload->paxCount.business2 / 3.0) * PAX_WEIGHT(isImperial);
|
||||
@@ -255,6 +255,8 @@ void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperi
|
||||
targetPayload->cabinCrewRear = TO_POUNDS(isImperial, targetPayload->cabinCrewRear);
|
||||
targetPayload->forwardCargo = TO_POUNDS(isImperial, targetPayload->forwardCargo);
|
||||
targetPayload->rearCargo = TO_POUNDS(isImperial, targetPayload->rearCargo);
|
||||
targetPayload->leftAux = TO_POUNDS(isImperial, targetPayload->leftAux);
|
||||
targetPayload->rightAux = TO_POUNDS(isImperial, targetPayload->rightAux);
|
||||
}
|
||||
|
||||
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial) {
|
||||
@@ -299,8 +301,13 @@ void load(const paxPayloadData_t* const targetPayload, const HANDLE simConnect,
|
||||
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(paxPayloadDataSet_t), &localPayload);
|
||||
}
|
||||
|
||||
void unload(const HANDLE simConnect, const bool isImperial) {
|
||||
void unload(const HANDLE simConnect, const bool isER) {
|
||||
paxPayloadDataSet_t localPayload = {};
|
||||
|
||||
localPayload.cabinCrewFront = FRONT_CREW_WEIGHT(true);
|
||||
localPayload.cabinCrewRear = REAR_CREW_WEIGHT(true);
|
||||
localPayload.leftAux = localPayload.rightAux = isER ? AUX_WEIGHT(true) : 0;
|
||||
localPayload.pilot = localPayload.firstOfficer = localPayload.engineer = PILOT_WEIGHT(true);
|
||||
|
||||
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(localPayload), &localPayload);
|
||||
}
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
#include "types.h"
|
||||
|
||||
//ZFW Entry, fill pax first (pax+bag), rest is cargo
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, bool isImperial);
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, const double ZFWTarget, const bool isImperial, const bool isER);
|
||||
//SimBrief Entry, SB pax count and total cargo
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, bool isImperial);
|
||||
void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, unsigned short numPax, unsigned int cargo, const bool isImperial, const bool isER);
|
||||
// Updates pax stations with their respective weights
|
||||
// Used internally and used for Station Entry (pax only, cargo is ste directly)
|
||||
// STATION WEIGHTS ARE NOT NORMALISED TO POUNDS
|
||||
@@ -33,4 +33,4 @@ void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperia
|
||||
void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperial);
|
||||
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial);
|
||||
void load(const paxPayloadData_t* const targetPayload, const HANDLE simConnect, const bool isImperial);
|
||||
void unload(const HANDLE simConnect, const bool isImperial);
|
||||
void unload(const HANDLE simConnect, const bool isER);
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
//PMC pallet due to 104in door
|
||||
#define MAX_FRONT_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (6.0 * 15000.0) : (6.0 * 6804.0))
|
||||
//LD3s due to 70in door
|
||||
#define MAX_REAR_CARGO(IS_IMPERIAL) ((IS_IMPERIAL) ? (14.0 * 3500.0) : (14.0 * 1588.0))
|
||||
#define MAX_REAR_CARGO(IS_IMPERIAL, IS_ER) ((IS_IMPERIAL) ? ((IS_ER ? 14.0 : 2.0) * 3500.0) : ((IS_ER ? 14.0 : 2.0) * 1588.0))
|
||||
|
||||
// All actual Business seats
|
||||
#define MAX_BUSINESS_1 30
|
||||
@@ -101,6 +101,9 @@
|
||||
#define TO_POUNDS(IS_IMPERIAL, VALUE) ((IS_IMPERIAL) ? (VALUE) : (VALUE) * 2.20462262185)
|
||||
#define FROM_POUNDS(IS_IMPERIAL, VALUE) ((IS_IMPERIAL) ? (VALUE) : (VALUE) * (1.0 / 2.20462262185))
|
||||
|
||||
// GSX States
|
||||
#define GSX_SERVICE_ACTIVE 5
|
||||
|
||||
// SimConnect ENUMs
|
||||
enum DATA_DEFINITIONS {
|
||||
DATA_DEFINITION_EMPTY_WEIGHT,
|
||||
@@ -259,3 +262,11 @@ typedef struct {
|
||||
// Additional properties
|
||||
double total;
|
||||
} FuelData_t;
|
||||
|
||||
typedef struct {
|
||||
bool GSXSync;
|
||||
double paxWeightKG;
|
||||
double bagWeightKG;
|
||||
double paxWeightLBS;
|
||||
double bagWeightLBS;
|
||||
} UserOptions_t;
|
||||
Reference in New Issue
Block a user