#pragma once #ifndef __INTELLISENSE__ # define MODULE_EXPORT __attribute__( ( visibility( "default" ) ) ) # define MODULE_WASM_MODNAME(mod) __attribute__((import_module(mod))) #else # define MODULE_EXPORT # define MODULE_WASM_MODNAME(mod) # define __attribute__(x) # define __restrict__ #endif #include #include #include #include #include #include #include #include #define MODULE_NAME "[KHOFMANN TFDi MD-11 Load Manager]" #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" //TODO: Make User adjustable #define PAX_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (190) : (86)) #define BAG_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (23) : (50)) #define PILOT_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (190) : (86)) #define FRONT_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (380) : (172)) #define REAR_CREW_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (950) : (430)) #define AUX_WEIGHT(IS_IMPERIAL) ((IS_IMPERIAL) ? (200) : (91)) // Conversions #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)) // Data typedef struct { double isCargo; double isER; double isImperial; } UserData_t; typedef struct { 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 } GSXData_t; typedef struct { // SimConnect mapped double pilot; double firstOfficer; double engineer; double cabinCrewFront; double business1Left; double business1Center; double business1Right; double business2Left; double business2Center; double business2Right; double economy1Left; double economy1Center; double economy1Right; double economy2Left; double economy2Center; double economy2Right; double cabinCrewRear; double forwardCargo; double rearCargo; double leftAux; double rightAux; // Additional properties double empty; struct paxCount { unsigned char business1; unsigned char business2; unsigned char economy1; unsigned char economy2; unsigned short total; } paxCount; } paxPayloadData_t; typedef struct { // SimConnect mapped double pilot; double firstOfficer; double engineer; double upper1Left; double upper1Right; double upper2Left; double upper2Right; double upper3Left; double upper3Right; double upper4Left; double upper4Right; double lowerForward; double lowerRear; double leftAux; double rightAux; // Additional properties double empty; } fPayloadData_t; typedef struct { // SimConnect mapped double poundsPerGallon; double main1; double main3; double main2; double upperAux; double lowerAux; double main1Tip; double main3Tip; double tail; double forwardAux1; double forwardAux2; } FuelData_t; // SimConnect ENUMs enum DATA_DEFINITIONS { DATA_DEFINITION_EMPTY_WEIGHT, DATA_DEFINITION_PAYLOAD_PAX, DATA_DEFINITION_PAYLOAD_F, DATA_DEFINITION_FUEL, DATA_DEFINITION_GSX, DATA_DEFINITION_USER_DATA, }; enum DATA_REQUESTS { DATA_REQUEST_EMPTY_WEIGHT, DATA_REQUEST_PAYLOAD_PAX, DATA_REQUEST_PAYLOAD_F, DATA_REQUEST_FUEL, DATA_REQUEST_GSX, DATA_REQUEST_USER_DATA, }; static void commBusUpdateTargetCallback(const char* args, unsigned int size, void* ctx); static int parseData(const char* buf); static void sendLiveData(); void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext); void log(FILE* file, const char* format, void* optionalElement = NULL);