ZFW Target Set

This commit is contained in:
2025-06-11 00:27:27 +02:00
parent 9224300c85
commit ee46d0bff1
13 changed files with 382 additions and 499 deletions
+109 -50
View File
@@ -15,7 +15,7 @@ FuelData_t* liveFuelData;
bool commBusCallbackRegistered;
HANDLE simConnect;
FILE* logFile;
char sendTimer = 0;
MODULE_VAR tick18 = { TICK18 };
// Init
extern "C" MSFS_CALLBACK void module_init(void) {
@@ -35,6 +35,8 @@ extern "C" MSFS_CALLBACK void module_init(void) {
targetFPayloadData = new fPayloadData_t();
liveFuelData = new FuelData_t();
targetFPayloadData->ZFWCG = targetPaxPayloadData->ZFWCG = 21;
#pragma region SimConnect
// SimConnect open
@@ -414,15 +416,15 @@ extern "C" MSFS_CALLBACK void module_deinit(void) {
// Main loop
extern "C" MSFS_CALLBACK bool Load_Manager_gauge_callback(FsContext ctx, int service_id, void* pData) {
/*
switch (service_id) {
case PANEL_SERVICE_PRE_UPDATE: {
lookup_var(&tick18);
if (fmod(tick18.var_value.n, 3) == 0) sendData();
}
default:
break;
}
*/
return true;
}
@@ -431,6 +433,8 @@ void commBusUpdateTargetCallback(const char* args, unsigned int size, void* ctx)
printf("Target payload update request: %d", receiveData(args));
}
#pragma region JSON data handling
// JSON receive
int receiveData(const char* buf) {
if (liveFPayloadData == nullptr || livePaxPayloadData == nullptr || targetFPayloadData == nullptr || targetPaxPayloadData == nullptr ||
@@ -440,20 +444,6 @@ int receiveData(const char* buf) {
document.Parse(buf);
if (document.HasParseError()) return document.GetParseError();
// Shared part 1
targetFPayloadData->empty = targetPaxPayloadData->empty = FROM_POUNDS(UserData->isImperial, liveFPayloadData->empty);
targetFPayloadData->pilot = targetPaxPayloadData->pilot = PILOT_WEIGHT(UserData->isImperial);
targetFPayloadData->firstOfficer = targetPaxPayloadData->firstOfficer = PILOT_WEIGHT(UserData->isImperial);
targetFPayloadData->engineer = targetPaxPayloadData->engineer = PILOT_WEIGHT(UserData->isImperial);
// Shared part 2
targetFPayloadData->leftAux = targetPaxPayloadData->leftAux = UserData->isER ? AUX_WEIGHT(UserData->isImperial) : 0;
targetFPayloadData->rightAux = targetPaxPayloadData->rightAux = UserData->isER ? AUX_WEIGHT(UserData->isImperial) : 0;
// Pax only fixed weights
if (!UserData->isCargo) {
targetPaxPayloadData->cabinCrewFront = FRONT_CREW_WEIGHT(UserData->isImperial);
targetPaxPayloadData->cabinCrewRear = REAR_CREW_WEIGHT(UserData->isImperial);
}
if (document.HasMember("mode")) {
int mode = document["mode"].GetUint();
switch(mode) {
@@ -512,6 +502,7 @@ int receiveData(const char* buf) {
default:
break;
}
sendData();
}
else return -1;
@@ -533,6 +524,10 @@ void sendData () {
targetPayload.SetObject();
rapidjson::Value GSX;
GSX.SetObject();
rapidjson::Value userData;
userData.SetObject();
rapidjson::Value limits;
limits.SetObject();
rapidjson::StringBuffer strbuf;
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
@@ -558,6 +553,12 @@ void sendData () {
livePayload.AddMember("upper4", FROM_POUNDS(UserData->isImperial, liveFPayloadData->upper4Left + liveFPayloadData->upper4Right), allocator);
livePayload.AddMember("lowerForward", FROM_POUNDS(UserData->isImperial, liveFPayloadData->lowerForward), allocator);
livePayload.AddMember("lowerRear", FROM_POUNDS(UserData->isImperial, liveFPayloadData->lowerRear), allocator);
livePayload.AddMember("total", FROM_POUNDS(UserData->isImperial, liveFPayloadData->total), allocator);
// CGs
//TODO: Enable for F
//calculateCGs(liveFPayloadData, liveFuelData, &liveFPayloadData->ZFWCG, &liveFPayloadData->TOCG, true);
targetPayload.AddMember("ZFWCG", liveFPayloadData->ZFWCG, allocator);
targetPayload.AddMember("TOCG", liveFPayloadData->TOCG, allocator);
}
// Pax only (converted to passengers)
else {
@@ -566,7 +567,7 @@ void sendData () {
FROM_POUNDS(UserData->isImperial, livePaxPayloadData->engineer) + FROM_POUNDS(UserData->isImperial, livePaxPayloadData->cabinCrewFront) +
FROM_POUNDS(UserData->isImperial, livePaxPayloadData->cabinCrewRear),
allocator);
livePayload.AddMember("businnes1",
livePayload.AddMember("business1",
(short)(FROM_POUNDS(UserData->isImperial, livePaxPayloadData->business1Left + livePaxPayloadData->business1Center +
livePaxPayloadData->business1Right) / PAX_WEIGHT(UserData->isImperial)),
allocator);
@@ -584,11 +585,12 @@ void sendData () {
allocator);
livePayload.AddMember("forwardCargo", FROM_POUNDS(UserData->isImperial, livePaxPayloadData->forwardCargo), allocator);
livePayload.AddMember("rearCargo", FROM_POUNDS(UserData->isImperial, livePaxPayloadData->rearCargo), allocator);
livePayload.AddMember("total", FROM_POUNDS(UserData->isImperial, livePaxPayloadData->total), allocator);
// CGs
calculateCGs(livePaxPayloadData, liveFuelData, &livePaxPayloadData->ZFWCG, &livePaxPayloadData->TOCG, true);
livePayload.AddMember("ZFWCG",livePaxPayloadData->ZFWCG, allocator);
livePayload.AddMember("TOCG", livePaxPayloadData->TOCG, allocator);
}
// CGs
calculateCGs(livePaxPayloadData, liveFuelData, &livePaxPayloadData->ZFWCG, &livePaxPayloadData->TOCG, true);
livePayload.AddMember("ZFWCG", UserData->isCargo ? liveFPayloadData->ZFWCG : livePaxPayloadData->ZFWCG, allocator);
livePayload.AddMember("TOCG", UserData->isCargo ? liveFPayloadData->ZFWCG : livePaxPayloadData->TOCG, allocator);
// Fuel
livePayload.AddMember("fuel", FROM_POUNDS(UserData->isImperial, liveFuelData->total), allocator);
#pragma endregion
@@ -610,6 +612,12 @@ void sendData () {
targetPayload.AddMember("upper4", targetFPayloadData->upper4Left + targetFPayloadData->upper4Right, allocator);
targetPayload.AddMember("lowerForward", targetFPayloadData->lowerForward, allocator);
targetPayload.AddMember("lowerRear", targetFPayloadData->lowerRear, allocator);
targetPayload.AddMember("total", targetFPayloadData->total, allocator);
// CGs
//TODO: Enable for F
//calculateCGs(targetFPayloadData, liveFuelData, &targetFPayloadData->ZFWCG, &targetFPayloadData->TOCG, UserData->isImperial);
targetPayload.AddMember("ZFWCG", targetFPayloadData->ZFWCG, allocator);
targetPayload.AddMember("TOCG", targetFPayloadData->TOCG, allocator);
}
// Pax only (converted to passengers)
else {
@@ -617,16 +625,18 @@ void sendData () {
targetPaxPayloadData->pilot + targetPaxPayloadData->firstOfficer + targetPaxPayloadData->engineer +
targetPaxPayloadData->cabinCrewFront + targetPaxPayloadData->cabinCrewRear,
allocator);
targetPayload.AddMember("businnes1", targetPaxPayloadData->paxCount.business1, allocator);
targetPayload.AddMember("business1", targetPaxPayloadData->paxCount.business1, allocator);
targetPayload.AddMember("business2", targetPaxPayloadData->paxCount.business2, allocator);
targetPayload.AddMember("economy1", targetPaxPayloadData->paxCount.economy1, allocator);
targetPayload.AddMember("economy2", targetPaxPayloadData->paxCount.economy2, allocator);
targetPayload.AddMember("forwardCargo", targetPaxPayloadData->forwardCargo, allocator);
targetPayload.AddMember("rearCargo", targetPaxPayloadData->rearCargo, allocator);
targetPayload.AddMember("total", targetPaxPayloadData->total, allocator);
// CGs
calculateCGs(targetPaxPayloadData, liveFuelData, &targetPaxPayloadData->ZFWCG, &targetPaxPayloadData->TOCG, UserData->isImperial);
targetPayload.AddMember("ZFWCG", targetPaxPayloadData->ZFWCG, allocator);
targetPayload.AddMember("TOCG", targetPaxPayloadData->TOCG, allocator);
}
// CGs
targetPayload.AddMember("ZFWCG", UserData->isCargo ? targetFPayloadData->ZFWCG : targetPaxPayloadData->ZFWCG, allocator);
targetPayload.AddMember("TOCG", UserData->isCargo ? targetFPayloadData->TOCG : targetPaxPayloadData->TOCG, allocator);
#pragma endregion
@@ -639,10 +649,47 @@ void sendData () {
GSX.AddMember("cargoBoarded", GSXData->cargoBoarded, allocator);
GSX.AddMember("cargoDeboarded", GSXData->cargoDeboarded, allocator);
// User Data
userData.AddMember<bool>("isCargo", UserData->isCargo, allocator);
userData.AddMember<bool>("isER", UserData->isER, allocator);
userData.AddMember<bool>("isImperial", UserData->isImperial, allocator);
// Limits
limits.AddMember("minCG", MIN_CG, allocator);
limits.AddMember("maxCG", MAX_CG, allocator);
limits.AddMember("maxFuel", UserData->isER ? MAX_FUEL_ER(UserData->isImperial) : MAX_FUEL(UserData->isImperial), allocator);
limits.AddMember("maxTOW", UserData->isER ? MAX_TOW_ER(UserData->isImperial) : MAX_TOW(UserData->isImperial), allocator);
// Cargo Only
// TODO: Actual F limits
if (UserData->isCargo) {
limits.AddMember("upper1", -1, allocator);
limits.AddMember("upper2", -1, allocator);
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);
// TODO: Actual F limit
//limits.AddMember("MaxZFW", MAX_F_ZFW, allocator);
limits.AddMember("minZFW", targetFPayloadData->empty + targetFPayloadData->leftAux + targetFPayloadData->rightAux, allocator);
}
// Pax only
else {
limits.AddMember("business1", MAX_BUSINESS_1, allocator);
limits.AddMember("business2", MAX_BUSINESS_2, allocator);
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("maxZFW", MAX_PAX_ZFW(UserData->isImperial), allocator);
limits.AddMember("minZFW", targetPaxPayloadData->empty + targetPaxPayloadData->leftAux + targetPaxPayloadData->rightAux, 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);
// Write to CommBus
document.Accept(writer);
@@ -650,6 +697,8 @@ void sendData () {
fsCommBusCall(COMM_BUS_LIVE_DATA_EVENT, strbuf.GetString(), strbuf.GetSize(), FsCommBusBroadcast_JS);
}
#pragma endregion
// Logfile
void log(FILE* file, const char* format, void* optionalElement)
{
@@ -669,17 +718,19 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
switch (pObjData->dwRequestID) {
case DATA_REQUEST_EMPTY_WEIGHT: {
liveFPayloadData->empty = livePaxPayloadData->empty = *((double*)&pObjData->dwData);
sendTimer++;
break;
}
case DATA_REQUEST_PAYLOAD_F: {
fPayloadData_t* data = (fPayloadData_t*)&pObjData->dwData;
data->empty = liveFPayloadData->empty;
memcpy(liveFPayloadData, data, sizeof(fPayloadData_t));
sendTimer++;
liveFPayloadData->total = liveFPayloadData->empty + liveFPayloadData->pilot + liveFPayloadData->firstOfficer +
liveFPayloadData->engineer + liveFPayloadData->upper1Left + liveFPayloadData->upper1Right +
liveFPayloadData->upper2Left + liveFPayloadData->upper2Right + liveFPayloadData->upper3Left +
liveFPayloadData->upper3Right + liveFPayloadData->upper4Left + liveFPayloadData->upper4Right +
liveFPayloadData->lowerForward + liveFPayloadData->lowerRear + liveFPayloadData->leftAux +
liveFPayloadData->rightAux;
break;
}
@@ -687,8 +738,14 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
paxPayloadData_t* data = (paxPayloadData_t*)&pObjData->dwData;
data->empty = livePaxPayloadData->empty;
memcpy(livePaxPayloadData, data, sizeof(paxPayloadData_t));
sendTimer++;
livePaxPayloadData->total = livePaxPayloadData->empty + livePaxPayloadData->pilot + livePaxPayloadData->firstOfficer +
livePaxPayloadData->engineer + livePaxPayloadData->cabinCrewFront + livePaxPayloadData->business1Left +
livePaxPayloadData->business1Center + livePaxPayloadData->business1Right + livePaxPayloadData->business2Left +
livePaxPayloadData->business2Center + livePaxPayloadData->business2Right + livePaxPayloadData->economy1Left +
livePaxPayloadData->economy1Center + livePaxPayloadData->economy1Right + livePaxPayloadData->economy2Left +
livePaxPayloadData->economy2Center + livePaxPayloadData->economy2Right + livePaxPayloadData->cabinCrewRear +
livePaxPayloadData->forwardCargo + livePaxPayloadData->rearCargo + livePaxPayloadData->leftAux +
livePaxPayloadData->rightAux;
break;
}
@@ -707,39 +764,41 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
liveFuelData->total = liveFuelData->main1 + liveFuelData->main3 + liveFuelData->main2 + liveFuelData->upperAux +
liveFuelData->lowerAux + liveFuelData->main1Tip + liveFuelData->main3Tip + liveFuelData->tail +
liveFuelData->forwardAux1 + liveFuelData->forwardAux2;
sendTimer++;
break;
}
case DATA_REQUEST_GSX: {
GSXData_t* data = (GSXData_t*)&pObjData->dwData;
memcpy(GSXData, data, sizeof(GSXData_t));
sendTimer++;
break;
}
case DATA_REQUEST_USER_DATA: {
UserData_t* data = (UserData_t*)&pObjData->dwData;
data->isImperial = ((long)data->isImperial) & 1;
memcpy(UserData, data, sizeof(UserData_t));
sendTimer++;
// Update static weights
// Shared part 1
targetFPayloadData->empty = targetPaxPayloadData->empty = FROM_POUNDS(UserData->isImperial, liveFPayloadData->empty);
targetFPayloadData->pilot = targetPaxPayloadData->pilot = targetFPayloadData->firstOfficer = targetPaxPayloadData->firstOfficer =
targetFPayloadData->engineer = targetPaxPayloadData->engineer = PILOT_WEIGHT(UserData->isImperial);
// Shared part 2
targetFPayloadData->leftAux = targetPaxPayloadData->leftAux = targetFPayloadData->rightAux = targetPaxPayloadData->rightAux =
UserData->isER ? AUX_WEIGHT(UserData->isImperial) : 0;
// Pax only fixed weights
if (!UserData->isCargo) {
targetPaxPayloadData->cabinCrewFront = FRONT_CREW_WEIGHT(UserData->isImperial);
targetPaxPayloadData->cabinCrewRear = REAR_CREW_WEIGHT(UserData->isImperial);
}
break;
}
default: {
break;
}
}
// Send once every request "frame"
if (sendTimer == 6) {
sendData();
sendTimer = 0;
}
break;
}
case SIMCONNECT_RECV_ID_EXCEPTION:
+38 -18
View File
@@ -13,6 +13,11 @@ void distribute(paxPayloadData_t* const targetPayload, const FuelData_t* const f
//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, const double CGTarget, const bool isImperial) {
// Clear
targetPayload->paxCount.business1 = targetPayload->paxCount.business2 = targetPayload->paxCount.economy1 = targetPayload->paxCount.economy2 =
targetPayload->paxCount.total = 0;
targetPayload->forwardCargo = targetPayload->rearCargo = 0;
unsigned short _numPax = 0;
unsigned int count = MAX_PAX;
// Initial distribution pax + bags
@@ -219,12 +224,22 @@ void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperia
targetPayload->business2Left = targetPayload->business2Center = targetPayload->business2Right = (targetPayload->paxCount.business2 / 3.0) * PAX_WEIGHT(isImperial);
targetPayload->economy1Left = targetPayload->economy1Center = targetPayload->economy1Right = (targetPayload->paxCount.economy1 / 3.0) * PAX_WEIGHT(isImperial);
targetPayload->economy2Left = targetPayload->economy2Center = targetPayload->economy2Right = (targetPayload->paxCount.economy2 / 3.0) * PAX_WEIGHT(isImperial);
targetPayload->total = targetPayload->empty + targetPayload->pilot + targetPayload->firstOfficer + targetPayload->engineer + targetPayload->cabinCrewFront +
targetPayload->business1Left + targetPayload->business1Center + targetPayload->business1Right + targetPayload->business2Left +
targetPayload->business2Center + targetPayload->business2Right + targetPayload->economy1Left + targetPayload->economy1Center +
targetPayload->economy1Right + targetPayload->economy2Left + targetPayload->economy2Center + targetPayload->economy2Right +
targetPayload->cabinCrewRear + targetPayload->forwardCargo + targetPayload->rearCargo + targetPayload->leftAux + targetPayload->rightAux;
}
// Normalise to Pounds
// MANDATORY BEFORE SETTING WEIGHTS
// ENSURE ONLY EVER CALLED ONCE PER SET CYCLE
void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperial) {
targetPayload->empty = TO_POUNDS(isImperial, targetPayload->empty);
targetPayload->pilot = TO_POUNDS(isImperial, targetPayload->pilot);
targetPayload->firstOfficer = TO_POUNDS(isImperial, targetPayload->firstOfficer);
targetPayload->engineer = TO_POUNDS(isImperial, targetPayload->engineer);
targetPayload->cabinCrewFront = TO_POUNDS(isImperial, targetPayload->cabinCrewFront);
targetPayload->business1Left = TO_POUNDS(isImperial, targetPayload->business1Left);
targetPayload->business1Center = TO_POUNDS(isImperial, targetPayload->business1Center);
targetPayload->business1Right = TO_POUNDS(isImperial, targetPayload->business1Right);
@@ -237,27 +252,32 @@ void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperi
targetPayload->economy2Left = TO_POUNDS(isImperial, targetPayload->economy2Left);
targetPayload->economy2Center = TO_POUNDS(isImperial, targetPayload->economy2Center);
targetPayload->economy2Right = TO_POUNDS(isImperial, targetPayload->economy2Right);
targetPayload->cabinCrewRear = TO_POUNDS(isImperial, targetPayload->cabinCrewRear);
targetPayload->forwardCargo = TO_POUNDS(isImperial, targetPayload->forwardCargo);
targetPayload->rearCargo = TO_POUNDS(isImperial, targetPayload->rearCargo);
}
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* fuel, double* const ZFWCG, double* const TOCG, const bool isImperial) {
double totalMoment = targetPayload->empty * ARM_EMPTY + targetPayload->pilot * ARM_PILOT + targetPayload->firstOfficer * ARM_FIRST_OFFICER +
targetPayload->engineer * ARM_ENGINEER + targetPayload->cabinCrewFront * ARM_PAX_CABIN_CREW_FRONT +
targetPayload->business1Left * ARM_PAX_BUSINESS1_LEFT + targetPayload->business1Center * ARM_PAX_BUSINESS1_CENTER +
targetPayload->business1Right * ARM_PAX_BUSINESS1_RIGHT + targetPayload->business2Left * ARM_PAX_BUSINESS2_LEFT +
targetPayload->business2Center * ARM_PAX_BUSINESS2_CENTER + targetPayload->business2Right * ARM_PAX_BUSINESS2_RIGHT +
targetPayload->economy1Left * ARM_PAX_ECONOMY1_LEFT + targetPayload->economy1Center * ARM_PAX_ECONOMY1_CENTER +
targetPayload->economy1Right * ARM_PAX_ECONOMY1_RIGHT + targetPayload->economy2Left * ARM_PAX_ECONOMY2_LEFT +
targetPayload->economy2Center * ARM_PAX_ECONOMY2_CENTER + targetPayload->economy2Right * ARM_PAX_ECONOMY2_RIGHT +
targetPayload->cabinCrewRear * ARM_PAX_CABIN_CREW_REAR + targetPayload->forwardCargo * ARM_FORWARD_CARGO +
targetPayload->rearCargo * ARM_REAR_CARGO + targetPayload->leftAux * ARM_LEFT_AUX + targetPayload->rightAux * ARM_RIGHT_AUX;
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial) {
paxPayloadData_t localPayload = {};
memcpy(&localPayload, targetPayload, sizeof(localPayload));
normalisePayload(&localPayload, isImperial);
double totalWeight = targetPayload->empty + targetPayload->pilot + targetPayload->firstOfficer + targetPayload->engineer +
targetPayload->cabinCrewFront + targetPayload->business1Left + targetPayload->business1Center +
targetPayload->business1Right + targetPayload->business2Left + targetPayload->business2Center +
targetPayload->business2Right + targetPayload->economy1Left + targetPayload->economy1Center +
targetPayload->economy1Right + targetPayload->economy2Left + targetPayload->economy2Center +
targetPayload->economy2Right + targetPayload->cabinCrewRear + targetPayload->forwardCargo +
targetPayload->rearCargo + targetPayload->leftAux + targetPayload->rightAux;
double totalMoment = localPayload.empty * ARM_EMPTY + localPayload.pilot * ARM_PILOT + localPayload.firstOfficer * ARM_FIRST_OFFICER +
localPayload.engineer * ARM_ENGINEER + localPayload.cabinCrewFront * ARM_PAX_CABIN_CREW_FRONT +
localPayload.business1Left * ARM_PAX_BUSINESS1_LEFT + localPayload.business1Center * ARM_PAX_BUSINESS1_CENTER +
localPayload.business1Right * ARM_PAX_BUSINESS1_RIGHT + localPayload.business2Left * ARM_PAX_BUSINESS2_LEFT +
localPayload.business2Center * ARM_PAX_BUSINESS2_CENTER + localPayload.business2Right * ARM_PAX_BUSINESS2_RIGHT +
localPayload.economy1Left * ARM_PAX_ECONOMY1_LEFT + localPayload.economy1Center * ARM_PAX_ECONOMY1_CENTER +
localPayload.economy1Right * ARM_PAX_ECONOMY1_RIGHT + localPayload.economy2Left * ARM_PAX_ECONOMY2_LEFT +
localPayload.economy2Center * ARM_PAX_ECONOMY2_CENTER + localPayload.economy2Right * ARM_PAX_ECONOMY2_RIGHT +
localPayload.cabinCrewRear * ARM_PAX_CABIN_CREW_REAR + localPayload.forwardCargo * ARM_FORWARD_CARGO +
localPayload.rearCargo * ARM_REAR_CARGO + localPayload.leftAux * ARM_LEFT_AUX + localPayload.rightAux * ARM_RIGHT_AUX;
double totalWeight = localPayload.empty + localPayload.pilot + localPayload.firstOfficer + localPayload.engineer + localPayload.cabinCrewFront +
localPayload.business1Left + localPayload.business1Center + localPayload.business1Right + localPayload.business2Left +
localPayload.business2Center + localPayload.business2Right + localPayload.economy1Left + localPayload.economy1Center +
localPayload.economy1Right + localPayload.economy2Left + localPayload.economy2Center + localPayload.economy2Right +
localPayload.cabinCrewRear + localPayload.forwardCargo + localPayload.rearCargo + localPayload.leftAux + localPayload.rightAux;
*ZFWCG = TO_PERCENT_MAC(totalMoment / totalWeight);
+1 -1
View File
@@ -27,4 +27,4 @@ void generatePayload(paxPayloadData_t* const targetPayload, const bool isImperia
// Normalise to Pounds
// For Station Entry: CALL AFTER `generatePayload`
void normalisePayload(paxPayloadData_t* const targetPayload, const bool isImperial);
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* fuel, double* const ZFWCG, double* const TOCG, const bool isImperial);
void calculateCGs(const paxPayloadData_t* const targetPayload, const FuelData_t* const fuel, double* const ZFWCG, double* const TOCG, const bool isImperial);
+13 -3
View File
@@ -31,6 +31,17 @@
// Total
#define MAX_PAX 298
// Max ZFW
#define MAX_PAX_ZFW(IS_IMPERIAL) ((IS_IMPERIAL) ? (400000) : (181437))
// Max TOW
#define MAX_TOW(IS_IMPERIAL) ((IS_IMPERIAL) ? (625500) : (283722))
#define MAX_TOW_ER(IS_IMPERIAL) ((IS_IMPERIAL) ? (630500) : (285990))
// Max Fuel
#define MAX_FUEL(IS_IMPERIAL) ((IS_IMPERIAL) ? (256207) : (116213))
#define MAX_FUEL_ER(IS_IMPERIAL) ((IS_IMPERIAL) ? (282619) : (128193))
// Arms
// Shared part 1
#define ARM_EMPTY -159.6
@@ -132,10 +143,9 @@ typedef struct {
// Additional properties
double empty;
double total;
double ZFWCG;
double TOCG;
struct paxCount {
unsigned char business1;
unsigned char business2;
@@ -165,7 +175,7 @@ typedef struct {
// Additional properties
double empty;
double total;
double ZFWCG;
double TOCG;
} fPayloadData_t;