ZFW Target Set
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user