Initial GSX Sync for fuel
This commit is contained in:
@@ -275,11 +275,13 @@ void calculateCGs(fPayloadData_t *const targetPayload, const FuelData_t *const f
|
||||
targetPayload->TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
|
||||
}
|
||||
|
||||
void load(const fPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial) {
|
||||
void load(const fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
|
||||
const bool isImperial) {
|
||||
fPayloadData_t localPayload = {};
|
||||
memcpy(&localPayload, targetPayload, sizeof(localPayload));
|
||||
normalisePayload(&localPayload, isImperial);
|
||||
|
||||
calculateCGs(&localPayload, fuel, isImperial);
|
||||
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
|
||||
|
||||
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_F, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(fPayloadDataSet_t),
|
||||
|
||||
@@ -113,5 +113,6 @@ void generatePayload(fPayloadData_t *const targetPayload, const bool isImperial)
|
||||
// For Station Entry: CALL AFTER `generatePayload`
|
||||
void normalisePayload(fPayloadData_t *const targetPayload, const bool isImperial);
|
||||
void calculateCGs(fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial);
|
||||
void load(const fPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial);
|
||||
void load(const fPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
|
||||
const bool isImperial);
|
||||
void unloadF(const HANDLE simConnect, const bool isER);
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#include "fuel.h"
|
||||
|
||||
// ZFW Entry
|
||||
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData) {
|
||||
double fuelLbs = TO_POUNDS(userData->isImperial, fuelTarget);
|
||||
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const bool isImperial, const bool isER) {
|
||||
double fuelLbs = TO_POUNDS(isImperial, fuelTarget);
|
||||
|
||||
// Equal mains
|
||||
if (fuelLbs <= MAX_TANK_1_3_LBS * 3) {
|
||||
@@ -98,7 +97,7 @@ void distribute(FuelData_t *const targetFuel, const double fuelTarget, const Use
|
||||
|
||||
targetFuel->forwardAux1 = 0;
|
||||
targetFuel->forwardAux2 = 0;
|
||||
} else if (userData->isER) {
|
||||
} else if (isER) {
|
||||
targetFuel->main1 = MAX_TANK_1_3_MAIN_LBS;
|
||||
targetFuel->main3 = MAX_TANK_1_3_MAIN_LBS;
|
||||
targetFuel->main1Tip = MAX_TANK_1_3_TIP_LBS;
|
||||
@@ -118,6 +117,10 @@ void distribute(FuelData_t *const targetFuel, const double fuelTarget, const Use
|
||||
targetFuel->forwardAux2;
|
||||
}
|
||||
|
||||
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData) {
|
||||
distribute(targetFuel, fuelTarget, userData->isImperial, userData->isER);
|
||||
}
|
||||
|
||||
void fuel(const FuelData_t *const targetFuel, const HANDLE simConnect) {
|
||||
FuelDataSet_t localFuel = {};
|
||||
|
||||
|
||||
@@ -22,7 +22,12 @@
|
||||
#include "shared.h"
|
||||
|
||||
/******************************** Constants ********************************/
|
||||
|
||||
// Pounds to gallons conversion
|
||||
#define LBS_PER_GAL 6.699999809
|
||||
// Fueling rate
|
||||
#define FUELING_RATE ((LBS_PER_GAL * 1000) / 60)
|
||||
// Max tank capacity gallons
|
||||
#define MAX_TANK_1_3_MAIN_GAL 5167.907
|
||||
#define MAX_TANK_1_3_TIP_GAL 874.5
|
||||
#define MAX_TANK_1_3_GAL (5167.907 + 874.5)
|
||||
@@ -31,6 +36,7 @@
|
||||
#define MAX_LWR_AUX_GAL 1641.82
|
||||
#define MAX_TAIL_GAL 1957.779
|
||||
#define MAX_FWD_AUX_GAL 1970.8
|
||||
// Max tank capacity pounds
|
||||
#define MAX_TANK_1_3_MAIN_LBS (LBS_PER_GAL * MAX_TANK_1_3_MAIN_GAL)
|
||||
#define MAX_TANK_1_3_TIP_LBS (LBS_PER_GAL * MAX_TANK_1_3_TIP_GAL)
|
||||
#define MAX_TANK_1_3_LBS (LBS_PER_GAL * MAX_TANK_1_3_GAL)
|
||||
@@ -39,7 +45,6 @@
|
||||
#define MAX_LWR_AUX_LBS (LBS_PER_GAL * MAX_LWR_AUX_GAL)
|
||||
#define MAX_TAIL_LBS (LBS_PER_GAL * MAX_TAIL_GAL)
|
||||
#define MAX_FWD_AUX_LBS (LBS_PER_GAL * MAX_FWD_AUX_GAL)
|
||||
|
||||
// Max Fuel
|
||||
#define MAX_FUEL(IS_IMPERIAL) ((IS_IMPERIAL) ? (256207) : (116213))
|
||||
#define MAX_FUEL_ER(IS_IMPERIAL) ((IS_IMPERIAL) ? (282619) : (128193))
|
||||
@@ -84,5 +89,6 @@ typedef struct {
|
||||
} FuelDataSet_t;
|
||||
|
||||
/******************************** Functions ********************************/
|
||||
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const bool isImperial, const bool isER);
|
||||
void distribute(FuelData_t *const targetFuel, const double fuelTarget, const UserData_t *const userData);
|
||||
void fuel(const FuelData_t *const targetFuel, const HANDLE simConnect);
|
||||
@@ -423,6 +423,12 @@ extern "C" MSFS_CALLBACK void module_init(void) {
|
||||
log(stderr, "Could not add L:FSDT_GSX_DEBOARDING_STATE to data definition, terminating.\n");
|
||||
return;
|
||||
}
|
||||
hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_REFUELING_STATE", "number",
|
||||
SIMCONNECT_DATATYPE_FLOAT64);
|
||||
if (hr != S_OK) {
|
||||
log(stderr, "Could not add L:FSDT_GSX_REFULEING_STATE to data definition, terminating.\n");
|
||||
return;
|
||||
}
|
||||
hr = SimConnect_AddToDataDefinition(simConnect, DATA_DEFINITION_GSX, "L:FSDT_GSX_NUMPASSENGERS_BOARDING_TOTAL", "number",
|
||||
SIMCONNECT_DATATYPE_FLOAT64);
|
||||
if (hr != S_OK) {
|
||||
@@ -604,10 +610,42 @@ 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) {
|
||||
static double dTime = 0;
|
||||
|
||||
switch (service_id) {
|
||||
case PANEL_SERVICE_PRE_UPDATE: {
|
||||
case PANEL_SERVICE_PRE_DRAW: {
|
||||
sGaugeDrawData *d = (sGaugeDrawData *)pData;
|
||||
|
||||
lookup_var(&tick18);
|
||||
if (fmod(tick18.var_value.n, 3) == 0) sendData();
|
||||
|
||||
if (GSXData->fuelingState == FUELING_STATE_FUELING && abs(liveFuelData->total - targetFuelData->total) < 0.1) {
|
||||
GSXData->fuelingState = FUELING_STATE_FUELD;
|
||||
fuel(targetFuelData, simConnect);
|
||||
}
|
||||
|
||||
dTime += d->dt;
|
||||
|
||||
if (GSXData->fuelingState == FUELING_STATE_FUELING && dTime >= 0.5) {
|
||||
|
||||
FuelData_t toSet = {};
|
||||
|
||||
if (targetFuelData->total > liveFuelData->total) {
|
||||
distribute(&toSet,
|
||||
min(targetFuelData->total,
|
||||
liveFuelData->total + min(max(targetFuelData->total - liveFuelData->total, 1), FUELING_RATE) * dTime),
|
||||
true, UserData->isER);
|
||||
} else {
|
||||
distribute(&toSet,
|
||||
max(targetFuelData->total,
|
||||
liveFuelData->total + max(min(targetFuelData->total - liveFuelData->total, -1), -FUELING_RATE) * dTime),
|
||||
true, UserData->isER);
|
||||
}
|
||||
|
||||
dTime = 0;
|
||||
|
||||
fuel(&toSet, simConnect);
|
||||
}
|
||||
}
|
||||
default:
|
||||
break;
|
||||
@@ -723,10 +761,10 @@ int receiveData(const char *buf) {
|
||||
case CALL_MODE_LOAD_SET: {
|
||||
if (UserData->isCargo) {
|
||||
fuel(targetFuelData, simConnect);
|
||||
load(targetFPayloadData, simConnect, UserData->isImperial);
|
||||
load(targetFPayloadData, targetFuelData, simConnect, UserData->isImperial);
|
||||
} else {
|
||||
fuel(targetFuelData, simConnect);
|
||||
load(targetPaxPayloadData, simConnect, UserData->isImperial);
|
||||
load(targetPaxPayloadData, targetFuelData, simConnect, UserData->isImperial);
|
||||
}
|
||||
|
||||
AircraftLoaded = true;
|
||||
@@ -781,6 +819,7 @@ int receiveData(const char *buf) {
|
||||
}
|
||||
case CALL_MODE_GSX_RESET: {
|
||||
GSXData->loadingState = LOADING_STATE_IDLE;
|
||||
GSXData->fuelingState = FUELING_STATE_IDLE;
|
||||
UserOptions->GSXSync = false;
|
||||
}
|
||||
default:
|
||||
@@ -943,6 +982,7 @@ void sendData() {
|
||||
// GSX
|
||||
GSX.AddMember<bool>("couatlStarted", GSXData->couatlStarted, allocator);
|
||||
GSX.AddMember("loadingState", GSXData->loadingState, allocator);
|
||||
GSX.AddMember("fuelingState", GSXData->fuelingState, allocator);
|
||||
|
||||
// User Data
|
||||
userData.AddMember<bool>("isCargo", UserData->isCargo, allocator);
|
||||
@@ -1068,7 +1108,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
abs(liveFPayloadData->total - TO_POUNDS(UserData->isImperial, targetFPayloadData->total)) > 100) {
|
||||
log(stdout, "F AC loaded, Payload mismatch, resetting target\n");
|
||||
|
||||
load(targetFPayloadData, simConnect, UserData->isImperial);
|
||||
load(targetFPayloadData, liveFuelData, simConnect, UserData->isImperial);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1094,7 +1134,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
abs(livePaxPayloadData->total - TO_POUNDS(UserData->isImperial, targetPaxPayloadData->total)) > 100) {
|
||||
log(stdout, "PAX AC loaded, Payload mismatch, resetting target\n");
|
||||
|
||||
load(targetPaxPayloadData, simConnect, UserData->isImperial);
|
||||
load(targetPaxPayloadData, liveFuelData, simConnect, UserData->isImperial);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1122,6 +1162,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
GSXData->couatlStarted = data->couatlStarted;
|
||||
GSXData->boardingState = data->boardingState;
|
||||
GSXData->deboardingState = data->deboardingState;
|
||||
GSXData->refuelingState = data->refuelingState;
|
||||
GSXData->passengersBoarded = data->passengersBoarded;
|
||||
GSXData->passengersDeboarded = data->passengersDeboarded;
|
||||
GSXData->cargoBoarded = data->cargoBoarded;
|
||||
@@ -1147,7 +1188,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
localPayload.lowerRear = targetFPayloadData->lowerRear * (cargoBoarded / 100);
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
} else {
|
||||
double passengersBoarded = GSXData->passengersBoarded;
|
||||
paxPayloadData_t localPayload = {};
|
||||
@@ -1165,7 +1206,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
localPayload.rearCargo = targetPaxPayloadData->rearCargo * (cargoBoarded / 100);
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial, UserOptions);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1180,13 +1221,13 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
memcpy(&localPayload, targetFPayloadData, sizeof(localPayload));
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
} else {
|
||||
paxPayloadData_t localPayload = {};
|
||||
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial, UserOptions);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1216,7 +1257,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
localPayload.lowerRear -= targetFPayloadData->lowerRear * (cargoDeboarded / 100);
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
} else {
|
||||
double passengersDeboarded = GSXData->passengersDeboarded;
|
||||
paxPayloadData_t localPayload = {};
|
||||
@@ -1234,7 +1275,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
localPayload.rearCargo -= targetPaxPayloadData->rearCargo * (cargoDeboarded / 100);
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial, UserOptions);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1257,7 +1298,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
localPayload.lowerRear = 0;
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
} else {
|
||||
paxPayloadData_t localPayload = {};
|
||||
memcpy(&localPayload, targetPaxPayloadData, sizeof(localPayload));
|
||||
@@ -1270,7 +1311,7 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
localPayload.rearCargo = 0;
|
||||
|
||||
generatePayload(&localPayload, UserData->isImperial, UserOptions);
|
||||
load(&localPayload, simConnect, UserData->isImperial);
|
||||
load(&localPayload, liveFuelData, simConnect, UserData->isImperial);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -1278,6 +1319,26 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContex
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch ((char)GSXData->refuelingState) {
|
||||
case GSX_SERVICE_IDLE: {
|
||||
GSXData->fuelingState = FUELING_STATE_IDLE;
|
||||
|
||||
break;
|
||||
}
|
||||
case GSX_SERVICE_ACTIVE: {
|
||||
GSXData->fuelingState = FUELING_STATE_FUELING;
|
||||
|
||||
break;
|
||||
}
|
||||
case GSX_SERVICE_FINISHED: {
|
||||
GSXData->fuelingState = FUELING_STATE_FUELD;
|
||||
fuel(targetFuelData, simConnect);
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
/******************************** Constants ********************************/
|
||||
// Module identification
|
||||
#define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager] "
|
||||
#define VERSION_STRING "2.9-beta"
|
||||
#define VERSION_STRING "2.12-beta"
|
||||
// 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"
|
||||
|
||||
@@ -291,11 +291,13 @@ void calculateCGs(paxPayloadData_t *const targetPayload, const FuelData_t *const
|
||||
targetPayload->TOCG = TO_PERCENT_MAC(totalMoment / totalWeight);
|
||||
}
|
||||
|
||||
void load(const paxPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial) {
|
||||
void load(const paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
|
||||
const bool isImperial) {
|
||||
paxPayloadData_t localPayload = {};
|
||||
memcpy(&localPayload, targetPayload, sizeof(localPayload));
|
||||
normalisePayload(&localPayload, isImperial);
|
||||
|
||||
calculateCGs(&localPayload, fuel, isImperial);
|
||||
localPayload._ZFWCG = localPayload.ZFWCG / 100.0;
|
||||
|
||||
SimConnect_SetDataOnSimObject(simConnect, DATA_DEFINITION_PAYLOAD_PAX, SIMCONNECT_OBJECT_ID_USER, 0, 0,
|
||||
|
||||
@@ -146,7 +146,8 @@ void generatePayload(paxPayloadData_t *const targetPayload, const bool isImperia
|
||||
// For Station Entry: CALL AFTER `generatePayload`
|
||||
void normalisePayload(paxPayloadData_t *const targetPayload, const bool isImperial);
|
||||
void calculateCGs(paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const bool isImperial);
|
||||
void load(const paxPayloadData_t *const targetPayload, const HANDLE simConnect, const bool isImperial);
|
||||
void load(const paxPayloadData_t *const targetPayload, const FuelData_t *const fuel, const HANDLE simConnect,
|
||||
const bool isImperial);
|
||||
void unload(const HANDLE simConnect, const bool isER);
|
||||
// Based on ICAO/LH findings
|
||||
const double PAX_WEIGHT(const bool isImperial, const UserOptions_t *const options);
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#define MAX_CG 34.0
|
||||
#define CG_TOLERANCE 0.05
|
||||
// GSX States
|
||||
#define GSX_SERVICE_IDLE 1
|
||||
#define GSX_SERVICE_ACTIVE 5
|
||||
#define GSX_SERVICE_FINISHED 6
|
||||
|
||||
@@ -84,6 +85,8 @@ enum LOADING_STATES {
|
||||
LOADING_STATE_DEBOARDED,
|
||||
};
|
||||
|
||||
enum FUELING_STATES { FUELING_STATE_IDLE, FUELING_STATE_FUELING, FUELING_STATE_FUELD };
|
||||
|
||||
enum CALL_MODES {
|
||||
CALL_MODE_SB_SET,
|
||||
CALL_MODE_ZFW_SET,
|
||||
@@ -106,6 +109,7 @@ typedef struct {
|
||||
double couatlStarted; // boolean
|
||||
double boardingState; // See manual, 5 => active
|
||||
double deboardingState; // See manual, 5 => active
|
||||
double refuelingState; // See manual, 5 => active
|
||||
double passengersBoarded; // Num pax
|
||||
double passengersDeboarded; // Num pax
|
||||
double cargoBoarded; // In percent
|
||||
@@ -113,6 +117,7 @@ typedef struct {
|
||||
|
||||
// Additional properties
|
||||
enum LOADING_STATES loadingState;
|
||||
enum FUELING_STATES fuelingState;
|
||||
} GSXData_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
Reference in New Issue
Block a user