diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index b69ed40..b5c5c40 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -14,7 +14,8 @@ "cStandard": "c11", "cppStandard": "c++14", "intelliSenseMode": "linux-clang-x64" - }, { + }, + { "name": "Windows", "includePath": [ "${workspaceFolder}/**" @@ -30,6 +31,20 @@ "cppStandard": "c++14", "intelliSenseMode": "windows-clang-x64" }, + { + "name": "Windows ESP", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "BIT=\"32\"", + "IBM" + ], + "compilerPath": "/opt/llvm-mingw/bin/x86_64-w64-mingw32-clang", + "cStandard": "c11", + "cppStandard": "c++14", + "intelliSenseMode": "windows-clang-x64" + }, { "name": "Mac", "includePath": [ diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e27d5b..009122e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,12 +12,18 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) set(PLUGIN_NAME GAConnector) option(DEBUG "Debug symbols" OFF) +option(XP "X-Plane" OFF) +option(BIT "Bitnes" 64) add_subdirectory( ixwebsocket ) -if(NOT (WIN32 AND (BIT STREQUAL "32"))) +if(XP) add_subdirectory( xplugin ) +else() + add_subdirectory( + esp + ) endif() diff --git a/Jenkinsfile b/Jenkinsfile index 364269b..d10588b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -18,6 +18,8 @@ pipeline { steps { sh 'bash ./build.sh win32' sh 'analyze-build --verbose --cdb build/compile_commands.json --output build/Analysis/win32' + sh 'bash ./build.sh win64-ESP' + sh 'analyze-build --verbose --cdb build/compile_commands.json --output build/Analysis/win64-ESP' sh 'bash ./build.sh win64' sh 'analyze-build --verbose --cdb build/compile_commands.json --output build/Analysis/win64' } diff --git a/SimConnect/32/SimConnect.lib b/SimConnect/32/SimConnect.lib new file mode 100644 index 0000000..46af37d Binary files /dev/null and b/SimConnect/32/SimConnect.lib differ diff --git a/SimConnect/32/SimConnect.msi b/SimConnect/32/SimConnect.msi new file mode 100644 index 0000000..eafb7ae Binary files /dev/null and b/SimConnect/32/SimConnect.msi differ diff --git a/SimConnect/32/include/SimConnect.h b/SimConnect/32/include/SimConnect.h new file mode 100644 index 0000000..c085f50 --- /dev/null +++ b/SimConnect/32/include/SimConnect.h @@ -0,0 +1,746 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All Rights Reserved. +// +//----------------------------------------------------------------------------- + +#ifndef _SIMCONNECT_H_ +#define _SIMCONNECT_H_ + +#pragma once + +#ifndef SIMCONNECT_H_NOMANIFEST +#if _MSC_FULL_VER >= 140040130 +#ifdef _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' " \ + "name='" "Microsoft.FlightSimulator.SimConnect" "' " \ + "version='" "10.0.61259.0" "' " \ + "processorArchitecture='x86' " \ + "publicKeyToken='" "67c7c14424d61b5b" "'\"") +#endif +#endif +#endif //SIMCONNECT_H_NOMANIFEST + +#ifndef DWORD_MAX +#define DWORD_MAX 0xFFFFFFFF +#endif + +#include + +typedef DWORD SIMCONNECT_OBJECT_ID; + +//---------------------------------------------------------------------------- +// Constants +//---------------------------------------------------------------------------- + +static const DWORD SIMCONNECT_UNUSED = DWORD_MAX; // special value to indicate unused event, ID +static const DWORD SIMCONNECT_OBJECT_ID_USER = 0; // proxy value for User vehicle ObjectID + +static const float SIMCONNECT_CAMERA_IGNORE_FIELD = FLT_MAX; //Used to tell the Camera API to NOT modify the value in this part of the argument. + +static const DWORD SIMCONNECT_CLIENTDATA_MAX_SIZE = 8192; // maximum value for SimConnect_CreateClientData dwSize parameter + + +// Notification Group priority values +static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST = 1; // highest priority +static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST_MASKABLE = 10000000; // highest priority that allows events to be masked +static const DWORD SIMCONNECT_GROUP_PRIORITY_STANDARD = 1900000000; // standard priority +static const DWORD SIMCONNECT_GROUP_PRIORITY_DEFAULT = 2000000000; // default priority +static const DWORD SIMCONNECT_GROUP_PRIORITY_LOWEST = 4000000000; // priorities lower than this will be ignored + +//Weather observations Metar strings +static const DWORD MAX_METAR_LENGTH = 2000; + +// Maximum thermal size is 100 km. +static const float MAX_THERMAL_SIZE = 100000; +static const float MAX_THERMAL_RATE = 1000; + +// SIMCONNECT_DATA_INITPOSITION.Airspeed +static const DWORD INITPOSITION_AIRSPEED_CRUISE = -1; // aircraft's cruise airspeed +static const DWORD INITPOSITION_AIRSPEED_KEEP = -2; // keep current airspeed + +// AddToClientDataDefinition dwSizeOrType parameter type values +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT8 = -1; // 8-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT16 = -2; // 16-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT32 = -3; // 32-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT64 = -4; // 64-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT32 = -5; // 32-bit floating-point number (float) +static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT64 = -6; // 64-bit floating-point number (double) + +// AddToClientDataDefinition dwOffset parameter special values +static const DWORD SIMCONNECT_CLIENTDATAOFFSET_AUTO = -1; // automatically compute offset of the ClientData variable + +// Open ConfigIndex parameter special value +static const DWORD SIMCONNECT_OPEN_CONFIGINDEX_LOCAL = -1; // ignore SimConnect.cfg settings, and force local connection + +//---------------------------------------------------------------------------- +// Enum definitions +//---------------------------------------------------------------------------- + +// Receive data types +enum SIMCONNECT_RECV_ID { + SIMCONNECT_RECV_ID_NULL, + SIMCONNECT_RECV_ID_EXCEPTION, + SIMCONNECT_RECV_ID_OPEN, + SIMCONNECT_RECV_ID_QUIT, + SIMCONNECT_RECV_ID_EVENT, + SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE, + SIMCONNECT_RECV_ID_EVENT_FILENAME, + SIMCONNECT_RECV_ID_EVENT_FRAME, + SIMCONNECT_RECV_ID_SIMOBJECT_DATA, + SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE, + SIMCONNECT_RECV_ID_WEATHER_OBSERVATION, + SIMCONNECT_RECV_ID_CLOUD_STATE, + SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID, + SIMCONNECT_RECV_ID_RESERVED_KEY, + SIMCONNECT_RECV_ID_CUSTOM_ACTION, + SIMCONNECT_RECV_ID_SYSTEM_STATE, + SIMCONNECT_RECV_ID_CLIENT_DATA, + SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE, + SIMCONNECT_RECV_ID_AIRPORT_LIST, + SIMCONNECT_RECV_ID_VOR_LIST, + SIMCONNECT_RECV_ID_NDB_LIST, + SIMCONNECT_RECV_ID_WAYPOINT_LIST, + SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED, + SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED, + SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED, + SIMCONNECT_RECV_ID_EVENT_RACE_END, + SIMCONNECT_RECV_ID_EVENT_RACE_LAP, + +}; + + + +// Data data types +enum SIMCONNECT_DATATYPE { + SIMCONNECT_DATATYPE_INVALID, // invalid data type + SIMCONNECT_DATATYPE_INT32, // 32-bit integer number + SIMCONNECT_DATATYPE_INT64, // 64-bit integer number + SIMCONNECT_DATATYPE_FLOAT32, // 32-bit floating-point number (float) + SIMCONNECT_DATATYPE_FLOAT64, // 64-bit floating-point number (double) + SIMCONNECT_DATATYPE_STRING8, // 8-byte string + SIMCONNECT_DATATYPE_STRING32, // 32-byte string + SIMCONNECT_DATATYPE_STRING64, // 64-byte string + SIMCONNECT_DATATYPE_STRING128, // 128-byte string + SIMCONNECT_DATATYPE_STRING256, // 256-byte string + SIMCONNECT_DATATYPE_STRING260, // 260-byte string + SIMCONNECT_DATATYPE_STRINGV, // variable-length string + + SIMCONNECT_DATATYPE_INITPOSITION, // see SIMCONNECT_DATA_INITPOSITION + SIMCONNECT_DATATYPE_MARKERSTATE, // see SIMCONNECT_DATA_MARKERSTATE + SIMCONNECT_DATATYPE_WAYPOINT, // see SIMCONNECT_DATA_WAYPOINT + SIMCONNECT_DATATYPE_LATLONALT, // see SIMCONNECT_DATA_LATLONALT + SIMCONNECT_DATATYPE_XYZ, // see SIMCONNECT_DATA_XYZ + + SIMCONNECT_DATATYPE_MAX // enum limit +}; + +// Exception error types +enum SIMCONNECT_EXCEPTION { + SIMCONNECT_EXCEPTION_NONE, + + SIMCONNECT_EXCEPTION_ERROR, + SIMCONNECT_EXCEPTION_SIZE_MISMATCH, + SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID, + SIMCONNECT_EXCEPTION_UNOPENED, + SIMCONNECT_EXCEPTION_VERSION_MISMATCH, + SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS, + SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED, + SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES, + SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE, + SIMCONNECT_EXCEPTION_TOO_MANY_MAPS, + SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS, + SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS, + SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT, + SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR, + SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION, + SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION, + SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION, + SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE, + SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE, + SIMCONNECT_EXCEPTION_DATA_ERROR, + SIMCONNECT_EXCEPTION_INVALID_ARRAY, + SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED, + SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED, + SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE, + SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION, + SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED, + SIMCONNECT_EXCEPTION_INVALID_ENUM, + SIMCONNECT_EXCEPTION_DEFINITION_ERROR, + SIMCONNECT_EXCEPTION_DUPLICATE_ID, + SIMCONNECT_EXCEPTION_DATUM_ID, + SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS, + SIMCONNECT_EXCEPTION_ALREADY_CREATED, + SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE, + SIMCONNECT_EXCEPTION_OBJECT_CONTAINER, + SIMCONNECT_EXCEPTION_OBJECT_AI, + SIMCONNECT_EXCEPTION_OBJECT_ATC, + SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE, +}; + +// Object types +enum SIMCONNECT_SIMOBJECT_TYPE { + SIMCONNECT_SIMOBJECT_TYPE_USER, + SIMCONNECT_SIMOBJECT_TYPE_ALL, + SIMCONNECT_SIMOBJECT_TYPE_AIRCRAFT, + SIMCONNECT_SIMOBJECT_TYPE_HELICOPTER, + SIMCONNECT_SIMOBJECT_TYPE_BOAT, + SIMCONNECT_SIMOBJECT_TYPE_GROUND, +}; + +// EventState values +enum SIMCONNECT_STATE { + SIMCONNECT_STATE_OFF, + SIMCONNECT_STATE_ON, +}; + +// Object Data Request Period values +enum SIMCONNECT_PERIOD { + SIMCONNECT_PERIOD_NEVER, + SIMCONNECT_PERIOD_ONCE, + SIMCONNECT_PERIOD_VISUAL_FRAME, + SIMCONNECT_PERIOD_SIM_FRAME, + SIMCONNECT_PERIOD_SECOND, +}; + + +enum SIMCONNECT_MISSION_END { + SIMCONNECT_MISSION_FAILED, + SIMCONNECT_MISSION_CRASHED, + SIMCONNECT_MISSION_SUCCEEDED +}; + +// ClientData Request Period values +enum SIMCONNECT_CLIENT_DATA_PERIOD { + SIMCONNECT_CLIENT_DATA_PERIOD_NEVER, + SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, + SIMCONNECT_CLIENT_DATA_PERIOD_VISUAL_FRAME, + SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET, + SIMCONNECT_CLIENT_DATA_PERIOD_SECOND, +}; + +enum SIMCONNECT_TEXT_TYPE { + SIMCONNECT_TEXT_TYPE_SCROLL_BLACK, + SIMCONNECT_TEXT_TYPE_SCROLL_WHITE, + SIMCONNECT_TEXT_TYPE_SCROLL_RED, + SIMCONNECT_TEXT_TYPE_SCROLL_GREEN, + SIMCONNECT_TEXT_TYPE_SCROLL_BLUE, + SIMCONNECT_TEXT_TYPE_SCROLL_YELLOW, + SIMCONNECT_TEXT_TYPE_SCROLL_MAGENTA, + SIMCONNECT_TEXT_TYPE_SCROLL_CYAN, + SIMCONNECT_TEXT_TYPE_PRINT_BLACK=0x0100, + SIMCONNECT_TEXT_TYPE_PRINT_WHITE, + SIMCONNECT_TEXT_TYPE_PRINT_RED, + SIMCONNECT_TEXT_TYPE_PRINT_GREEN, + SIMCONNECT_TEXT_TYPE_PRINT_BLUE, + SIMCONNECT_TEXT_TYPE_PRINT_YELLOW, + SIMCONNECT_TEXT_TYPE_PRINT_MAGENTA, + SIMCONNECT_TEXT_TYPE_PRINT_CYAN, + SIMCONNECT_TEXT_TYPE_MENU=0x0200, +}; + +enum SIMCONNECT_TEXT_RESULT { + SIMCONNECT_TEXT_RESULT_MENU_SELECT_1, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_2, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_3, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_4, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_5, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_6, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_7, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_8, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_9, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_10, + SIMCONNECT_TEXT_RESULT_DISPLAYED = 0x00010000, + SIMCONNECT_TEXT_RESULT_QUEUED, + SIMCONNECT_TEXT_RESULT_REMOVED, + SIMCONNECT_TEXT_RESULT_REPLACED, + SIMCONNECT_TEXT_RESULT_TIMEOUT, +}; + +enum SIMCONNECT_WEATHER_MODE { + SIMCONNECT_WEATHER_MODE_THEME, + SIMCONNECT_WEATHER_MODE_RWW, + SIMCONNECT_WEATHER_MODE_CUSTOM, + SIMCONNECT_WEATHER_MODE_GLOBAL, +}; + +enum SIMCONNECT_FACILITY_LIST_TYPE { + SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT, + SIMCONNECT_FACILITY_LIST_TYPE_WAYPOINT, + SIMCONNECT_FACILITY_LIST_TYPE_NDB, + SIMCONNECT_FACILITY_LIST_TYPE_VOR, + SIMCONNECT_FACILITY_LIST_TYPE_COUNT // invalid +}; + +typedef DWORD SIMCONNECT_VOR_FLAGS; // flags for SIMCONNECT_RECV_ID_VOR_LIST + + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL = 0x00000001; // Has Nav signal + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_LOCALIZER = 0x00000002; // Has localizer + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_GLIDE_SLOPE = 0x00000004; // Has Nav signal + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_DME = 0x00000008; // Station has DME + + + +// bits for the Waypoint Flags field: may be combined +typedef DWORD SIMCONNECT_WAYPOINT_FLAGS; + + static const DWORD SIMCONNECT_WAYPOINT_NONE = 0x00; + static const DWORD SIMCONNECT_WAYPOINT_SPEED_REQUESTED = 0x04; // requested speed at waypoint is valid + static const DWORD SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED = 0x08; // request a specific throttle percentage + static const DWORD SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED = 0x10; // compute vertical to speed to reach waypoint altitude when crossing the waypoint + static const DWORD SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL = 0x20; // AltitudeIsAGL + static const DWORD SIMCONNECT_WAYPOINT_ON_GROUND = 0x00100000; // place this waypoint on the ground + static const DWORD SIMCONNECT_WAYPOINT_REVERSE = 0x00200000; // Back up to this waypoint. Only valid on first waypoint + static const DWORD SIMCONNECT_WAYPOINT_WRAP_TO_FIRST = 0x00400000; // Wrap around back to first waypoint. Only valid on last waypoint. + + +typedef DWORD SIMCONNECT_EVENT_FLAG; + + static const DWORD SIMCONNECT_EVENT_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_EVENT_FLAG_FAST_REPEAT_TIMER = 0x00000001; // set event repeat timer to simulate fast repeat + static const DWORD SIMCONNECT_EVENT_FLAG_SLOW_REPEAT_TIMER = 0x00000002; // set event repeat timer to simulate slow repeat + static const DWORD SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY = 0x00000010; // interpret GroupID parameter as priority value + + +typedef DWORD SIMCONNECT_DATA_REQUEST_FLAG; + + static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested data when value(s) change + static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested data in tagged format + + +typedef DWORD SIMCONNECT_DATA_SET_FLAG; + + static const DWORD SIMCONNECT_DATA_SET_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format + + +typedef DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG; + + static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_READ_ONLY = 0x00000001; // permit only ClientData creator to write into ClientData + + +typedef DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG; + + static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested ClientData when value(s) change + static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested ClientData in tagged format + + +typedef DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG; + + static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format + + +typedef DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA; // dwData contains these flags for the "View" System Event + + static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_2D = 0x00000001; // 2D Panels in cockpit view + static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_VIRTUAL = 0x00000002; // Virtual (3D) panels in cockpit view + static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_ORTHOGONAL = 0x00000004; // Orthogonal (Map) view + + +typedef DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA; // dwData contains these flags for the "Sound" System Event + + static const DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA_MASTER = 0x00000001; // Sound Master + + + + +//---------------------------------------------------------------------------- +// User-defined enums +//---------------------------------------------------------------------------- + +typedef DWORD SIMCONNECT_NOTIFICATION_GROUP_ID; //client-defined notification group ID +typedef DWORD SIMCONNECT_INPUT_GROUP_ID; //client-defined input group ID +typedef DWORD SIMCONNECT_DATA_DEFINITION_ID; //client-defined data definition ID +typedef DWORD SIMCONNECT_DATA_REQUEST_ID; //client-defined request data ID + +typedef DWORD SIMCONNECT_CLIENT_EVENT_ID; //client-defined client event ID +typedef DWORD SIMCONNECT_CLIENT_DATA_ID; //client-defined client data ID +typedef DWORD SIMCONNECT_CLIENT_DATA_DEFINITION_ID; //client-defined client data definition ID + + +//---------------------------------------------------------------------------- +// Struct definitions +//---------------------------------------------------------------------------- + +#pragma pack(push, 1) + +struct SIMCONNECT_RECV +{ + DWORD dwSize; // record size + DWORD dwVersion; // interface version + DWORD dwID; // see SIMCONNECT_RECV_ID +}; + +struct SIMCONNECT_RECV_EXCEPTION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EXCEPTION +{ + DWORD dwException; // see SIMCONNECT_EXCEPTION + static const DWORD UNKNOWN_SENDID = 0; + DWORD dwSendID; // see SimConnect_GetLastSentPacketID + static const DWORD UNKNOWN_INDEX = DWORD_MAX; + DWORD dwIndex; // index of parameter that was source of error +}; + +struct SIMCONNECT_RECV_OPEN : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_OPEN +{ + char szApplicationName[256]; + DWORD dwApplicationVersionMajor; + DWORD dwApplicationVersionMinor; + DWORD dwApplicationBuildMajor; + DWORD dwApplicationBuildMinor; + DWORD dwSimConnectVersionMajor; + DWORD dwSimConnectVersionMinor; + DWORD dwSimConnectBuildMajor; + DWORD dwSimConnectBuildMinor; + DWORD dwReserved1; + DWORD dwReserved2; +}; + +struct SIMCONNECT_RECV_QUIT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_QUIT +{ +}; + +struct SIMCONNECT_RECV_EVENT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT +{ + static const DWORD UNKNOWN_GROUP = DWORD_MAX; + DWORD uGroupID; + DWORD uEventID; + DWORD dwData; // uEventID-dependent context +}; + +struct SIMCONNECT_RECV_EVENT_FILENAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME +{ + char szFileName[MAX_PATH]; // uEventID-dependent context + DWORD dwFlags; +}; + +struct SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME +{ + SIMCONNECT_SIMOBJECT_TYPE eObjType; +}; + +struct SIMCONNECT_RECV_EVENT_FRAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FRAME +{ + float fFrameRate; + float fSimSpeed; +}; + +struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED +{ + // No event specific data, for now +}; + +struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED +{ + // No event specific data, for now +}; + +struct SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED +{ + // No event specific data, for now +}; + +// SIMCONNECT_DATA_RACE_RESULT +struct SIMCONNECT_DATA_RACE_RESULT +{ + DWORD dwNumberOfRacers; // The total number of racers + GUID MissionGUID; // The name of the mission to execute, NULL if no mission + char szPlayerName[MAX_PATH]; // The name of the player + char szSessionType[MAX_PATH]; // The type of the multiplayer session: "LAN", "GAMESPY") + char szAircraft[MAX_PATH]; // The aircraft type + char szPlayerRole[MAX_PATH]; // The player role in the mission + double fTotalTime; // Total time in seconds, 0 means DNF + double fPenaltyTime; // Total penalty time in seconds + DWORD dwIsDisqualified; // non 0 - disqualified, 0 - not disqualified +}; + +struct SIMCONNECT_RECV_EVENT_RACE_END : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_END +{ + DWORD dwRacerNumber; // The index of the racer the results are for + SIMCONNECT_DATA_RACE_RESULT RacerData; +}; + +struct SIMCONNECT_RECV_EVENT_RACE_LAP : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_LAP +{ + DWORD dwLapIndex; // The index of the lap the results are for + SIMCONNECT_DATA_RACE_RESULT RacerData; +}; + +struct SIMCONNECT_RECV_SIMOBJECT_DATA : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA +{ + DWORD dwRequestID; + DWORD dwObjectID; + DWORD dwDefineID; + DWORD dwFlags; // SIMCONNECT_DATA_REQUEST_FLAG + DWORD dwentrynumber; // if multiple objects returned, this is number out of . + DWORD dwoutof; // note: starts with 1, not 0. + DWORD dwDefineCount; // data count (number of datums, *not* byte count) + DWORD dwData; // data begins here, dwDefineCount data items +}; + +struct SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE +{ +}; + +struct SIMCONNECT_RECV_CLIENT_DATA : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_CLIENT_DATA +{ +}; + +struct SIMCONNECT_RECV_WEATHER_OBSERVATION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_WEATHER_OBSERVATION +{ + DWORD dwRequestID; + char szMetar[1]; // Variable length string whose maximum size is MAX_METAR_LENGTH +}; + +static const int SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH = 64; +static const int SIMCONNECT_CLOUD_STATE_ARRAY_SIZE = SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH*SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH; + +struct SIMCONNECT_RECV_CLOUD_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_CLOUD_STATE +{ + DWORD dwRequestID; + DWORD dwArraySize; + BYTE rgbData[1]; +}; + +struct SIMCONNECT_RECV_ASSIGNED_OBJECT_ID : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID +{ + DWORD dwRequestID; + DWORD dwObjectID; +}; + +struct SIMCONNECT_RECV_RESERVED_KEY : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY +{ + char szChoiceReserved[30]; + char szReservedKey[50]; +}; + +struct SIMCONNECT_RECV_SYSTEM_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SYSTEM_STATE +{ + DWORD dwRequestID; + DWORD dwInteger; + float fFloat; + char szString[MAX_PATH]; +}; + +struct SIMCONNECT_RECV_CUSTOM_ACTION : public SIMCONNECT_RECV_EVENT +{ + GUID guidInstanceId; // Instance id of the action that executed + DWORD dwWaitForCompletion; // Wait for completion flag on the action + char szPayLoad[1]; // Variable length string payload associated with the mission action. +}; + +struct SIMCONNECT_RECV_EVENT_WEATHER_MODE : public SIMCONNECT_RECV_EVENT +{ + // No event specific data - the new weather mode is in the base structure dwData member. +}; + +// SIMCONNECT_RECV_FACILITIES_LIST +struct SIMCONNECT_RECV_FACILITIES_LIST : public SIMCONNECT_RECV +{ + DWORD dwRequestID; + DWORD dwArraySize; + DWORD dwEntryNumber; // when the array of items is too big for one send, which send this is (0..dwOutOf-1) + DWORD dwOutOf; // total number of transmissions the list is chopped into +}; + +// SIMCONNECT_DATA_FACILITY_AIRPORT +struct SIMCONNECT_DATA_FACILITY_AIRPORT +{ + char Icao[9]; // ICAO of the object + double Latitude; // degrees + double Longitude; // degrees + double Altitude; // meters +}; + +// SIMCONNECT_RECV_AIRPORT_LIST +struct SIMCONNECT_RECV_AIRPORT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_DATA_FACILITY_AIRPORT rgData[1]; +}; + + +// SIMCONNECT_DATA_FACILITY_WAYPOINT +struct SIMCONNECT_DATA_FACILITY_WAYPOINT : public SIMCONNECT_DATA_FACILITY_AIRPORT +{ + float fMagVar; // Magvar in degrees +}; + +// SIMCONNECT_RECV_WAYPOINT_LIST +struct SIMCONNECT_RECV_WAYPOINT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_DATA_FACILITY_WAYPOINT rgData[1]; +}; + +// SIMCONNECT_DATA_FACILITY_NDB +struct SIMCONNECT_DATA_FACILITY_NDB : public SIMCONNECT_DATA_FACILITY_WAYPOINT +{ + DWORD fFrequency; // frequency in Hz +}; + +// SIMCONNECT_RECV_NDB_LIST +struct SIMCONNECT_RECV_NDB_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_DATA_FACILITY_NDB rgData[1]; +}; + +// SIMCONNECT_DATA_FACILITY_VOR +struct SIMCONNECT_DATA_FACILITY_VOR : public SIMCONNECT_DATA_FACILITY_NDB +{ + DWORD Flags; // SIMCONNECT_VOR_FLAGS + float fLocalizer; // Localizer in degrees + double GlideLat; // Glide Slope Location (deg, deg, meters) + double GlideLon; + double GlideAlt; + float fGlideSlopeAngle; // Glide Slope in degrees +}; + +// SIMCONNECT_RECV_VOR_LIST +struct SIMCONNECT_RECV_VOR_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_DATA_FACILITY_VOR rgData[1]; +}; + + + + +// SIMCONNECT_DATATYPE_INITPOSITION +struct SIMCONNECT_DATA_INITPOSITION +{ + double Latitude; // degrees + double Longitude; // degrees + double Altitude; // feet + double Pitch; // degrees + double Bank; // degrees + double Heading; // degrees + DWORD OnGround; // 1=force to be on the ground + DWORD Airspeed; // knots +}; + + +// SIMCONNECT_DATATYPE_MARKERSTATE +struct SIMCONNECT_DATA_MARKERSTATE +{ + char szMarkerName[64]; + DWORD dwMarkerState; +}; + +// SIMCONNECT_DATATYPE_WAYPOINT +struct SIMCONNECT_DATA_WAYPOINT +{ + double Latitude; // degrees + double Longitude; // degrees + double Altitude; // feet + unsigned long Flags; + double ktsSpeed; // knots + double percentThrottle; +}; + +// SIMCONNECT_DATA_LATLONALT +struct SIMCONNECT_DATA_LATLONALT +{ + double Latitude; + double Longitude; + double Altitude; +}; + +// SIMCONNECT_DATA_XYZ +struct SIMCONNECT_DATA_XYZ +{ + double x; + double y; + double z; +}; + +#pragma pack(pop) + +//---------------------------------------------------------------------------- +// End of Struct definitions +//---------------------------------------------------------------------------- + + +#if !defined(SIMCONNECTAPI) +#define SIMCONNECTAPI extern "C" HRESULT __stdcall +#endif + + +typedef void (CALLBACK *DispatchProc)(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext); + + +SIMCONNECTAPI SimConnect_MapClientEventToSimEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * EventName = ""); +SIMCONNECTAPI SimConnect_TransmitClientEvent(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD dwData, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags); +SIMCONNECTAPI SimConnect_SetSystemEventState(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_STATE dwState); +SIMCONNECTAPI SimConnect_AddClientEventToNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID, BOOL bMaskable = FALSE); +SIMCONNECTAPI SimConnect_RemoveClientEvent(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID); +SIMCONNECTAPI SimConnect_SetNotificationGroupPriority(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD uPriority); +SIMCONNECTAPI SimConnect_ClearNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID); +SIMCONNECTAPI SimConnect_RequestNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD dwReserved = 0, DWORD Flags = 0); +SIMCONNECTAPI SimConnect_AddToDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * DatumName, const char * UnitsName, SIMCONNECT_DATATYPE DatumType = SIMCONNECT_DATATYPE_FLOAT64, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED); +SIMCONNECTAPI SimConnect_ClearDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID); +SIMCONNECTAPI SimConnect_RequestDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_PERIOD Period, SIMCONNECT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0); +SIMCONNECTAPI SimConnect_RequestDataOnSimObjectType(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, DWORD dwRadiusMeters, SIMCONNECT_SIMOBJECT_TYPE type); +SIMCONNECTAPI SimConnect_SetDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_SET_FLAG Flags, DWORD ArrayCount, DWORD cbUnitSize, void * pDataSet); +SIMCONNECTAPI SimConnect_MapInputEventToClientEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition, SIMCONNECT_CLIENT_EVENT_ID DownEventID, DWORD DownValue = 0, SIMCONNECT_CLIENT_EVENT_ID UpEventID = (SIMCONNECT_CLIENT_EVENT_ID)SIMCONNECT_UNUSED, DWORD UpValue = 0, BOOL bMaskable = FALSE); +SIMCONNECTAPI SimConnect_SetInputGroupPriority(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD uPriority); +SIMCONNECTAPI SimConnect_RemoveInputEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition); +SIMCONNECTAPI SimConnect_ClearInputGroup(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID); +SIMCONNECTAPI SimConnect_SetInputGroupState(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD dwState); +SIMCONNECTAPI SimConnect_RequestReservedKey(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * szKeyChoice1 = "", const char * szKeyChoice2 = "", const char * szKeyChoice3 = ""); +SIMCONNECTAPI SimConnect_SubscribeToSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * SystemEventName); +SIMCONNECTAPI SimConnect_UnsubscribeFromSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID); +SIMCONNECTAPI SimConnect_WeatherRequestInterpolatedObservation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt); +SIMCONNECTAPI SimConnect_WeatherRequestObservationAtStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO); +SIMCONNECTAPI SimConnect_WeatherRequestObservationAtNearestStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon); +SIMCONNECTAPI SimConnect_WeatherCreateStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO, const char * szName, float lat, float lon, float alt); +SIMCONNECTAPI SimConnect_WeatherRemoveStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO); +SIMCONNECTAPI SimConnect_WeatherSetObservation(HANDLE hSimConnect, DWORD Seconds, const char * szMETAR); +SIMCONNECTAPI SimConnect_WeatherSetModeServer(HANDLE hSimConnect, DWORD dwPort, DWORD dwSeconds); +SIMCONNECTAPI SimConnect_WeatherSetModeTheme(HANDLE hSimConnect, const char * szThemeName); +SIMCONNECTAPI SimConnect_WeatherSetModeGlobal(HANDLE hSimConnect); +SIMCONNECTAPI SimConnect_WeatherSetModeCustom(HANDLE hSimConnect); +SIMCONNECTAPI SimConnect_WeatherSetDynamicUpdateRate(HANDLE hSimConnect, DWORD dwRate); +SIMCONNECTAPI SimConnect_WeatherRequestCloudState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float minLat, float minLon, float minAlt, float maxLat, float maxLon, float maxAlt, DWORD dwFlags = 0); +SIMCONNECTAPI SimConnect_WeatherCreateThermal(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt, float radius, float height, float coreRate = 3.0f, float coreTurbulence = 0.05f, float sinkRate = 3.0f, float sinkTurbulence = 0.2f, float coreSize = 0.4f, float coreTransitionSize = 0.1f, float sinkLayerSize = 0.4f, float sinkTransitionSize = 0.1f); +SIMCONNECTAPI SimConnect_WeatherRemoveThermal(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID); +SIMCONNECTAPI SimConnect_AICreateParkedATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, const char * szAirportID, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AICreateEnrouteATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, int iFlightNumber, const char * szFlightPlanPath, double dFlightPlanPosition, BOOL bTouchAndGo, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AICreateNonATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AICreateSimulatedObject(HANDLE hSimConnect, const char * szContainerTitle, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AIReleaseControl(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AIRemoveObject(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AISetAircraftFlightPlan(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, const char * szFlightPlanPath, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_ExecuteMissionAction(HANDLE hSimConnect, const GUID guidInstanceId); +SIMCONNECTAPI SimConnect_CompleteCustomMissionAction(HANDLE hSimConnect, const GUID guidInstanceId); +SIMCONNECTAPI SimConnect_Close(HANDLE hSimConnect); +SIMCONNECTAPI SimConnect_RetrieveString(SIMCONNECT_RECV * pData, DWORD cbData, void * pStringV, char ** pszString, DWORD * pcbString); +SIMCONNECTAPI SimConnect_GetLastSentPacketID(HANDLE hSimConnect, DWORD * pdwError); +SIMCONNECTAPI SimConnect_Open(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex); +SIMCONNECTAPI SimConnect_CallDispatch(HANDLE hSimConnect, DispatchProc pfcnDispatch, void * pContext); +SIMCONNECTAPI SimConnect_GetNextDispatch(HANDLE hSimConnect, SIMCONNECT_RECV ** ppData, DWORD * pcbData); +SIMCONNECTAPI SimConnect_RequestResponseTimes(HANDLE hSimConnect, DWORD nCount, float * fElapsedSeconds); +SIMCONNECTAPI SimConnect_InsertString(char * pDest, DWORD cbDest, void ** ppEnd, DWORD * pcbStringV, const char * pSource); +SIMCONNECTAPI SimConnect_CameraSetRelative6DOF(HANDLE hSimConnect, float fDeltaX, float fDeltaY, float fDeltaZ, float fPitchDeg, float fBankDeg, float fHeadingDeg); +SIMCONNECTAPI SimConnect_MenuAddItem(HANDLE hSimConnect, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, DWORD dwData); +SIMCONNECTAPI SimConnect_MenuDeleteItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID); +SIMCONNECTAPI SimConnect_MenuAddSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID, DWORD dwData); +SIMCONNECTAPI SimConnect_MenuDeleteSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID); +SIMCONNECTAPI SimConnect_RequestSystemState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szState); +SIMCONNECTAPI SimConnect_SetSystemState(HANDLE hSimConnect, const char * szState, DWORD dwInteger, float fFloat, const char * szString); +SIMCONNECTAPI SimConnect_MapClientDataNameToID(HANDLE hSimConnect, const char * szClientDataName, SIMCONNECT_CLIENT_DATA_ID ClientDataID); +SIMCONNECTAPI SimConnect_CreateClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, DWORD dwSize, SIMCONNECT_CREATE_CLIENT_DATA_FLAG Flags); +SIMCONNECTAPI SimConnect_AddToClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, DWORD dwOffset, DWORD dwSizeOrType, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED); +SIMCONNECTAPI SimConnect_ClearClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID); +SIMCONNECTAPI SimConnect_RequestClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_PERIOD Period = SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0); +SIMCONNECTAPI SimConnect_SetClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_SET_FLAG Flags, DWORD dwReserved, DWORD cbUnitSize, void * pDataSet); +SIMCONNECTAPI SimConnect_FlightLoad(HANDLE hSimConnect, const char * szFileName); +SIMCONNECTAPI SimConnect_FlightSave(HANDLE hSimConnect, const char * szFileName, const char * szTitle, const char * szDescription, DWORD Flags); +SIMCONNECTAPI SimConnect_FlightPlanLoad(HANDLE hSimConnect, const char * szFileName); +SIMCONNECTAPI SimConnect_Text(HANDLE hSimConnect, SIMCONNECT_TEXT_TYPE type, float fTimeSeconds, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD cbUnitSize, void * pDataSet); +SIMCONNECTAPI SimConnect_SubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_UnsubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type); +SIMCONNECTAPI SimConnect_RequestFacilitiesList(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID); + + +#endif // _SIMCONNECT_H_ diff --git a/SimConnect/64/SimConnect.dll b/SimConnect/64/SimConnect.dll new file mode 100644 index 0000000..6b25958 Binary files /dev/null and b/SimConnect/64/SimConnect.dll differ diff --git a/SimConnect/64/SimConnect.lib b/SimConnect/64/SimConnect.lib new file mode 100644 index 0000000..9dcfcc1 Binary files /dev/null and b/SimConnect/64/SimConnect.lib differ diff --git a/SimConnect/64/include/SimConnect.h b/SimConnect/64/include/SimConnect.h new file mode 100644 index 0000000..fefa4eb --- /dev/null +++ b/SimConnect/64/include/SimConnect.h @@ -0,0 +1,847 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. All Rights Reserved. +// +//----------------------------------------------------------------------------- + +#ifndef _SIMCONNECT_H_ +#define _SIMCONNECT_H_ + +#pragma once + +// = 140040130 +#if defined(_M_IX86) || defined(_M_X64) +//#pragma comment(linker,"/manifestdependency:\"type='win32' " \ +// "name='" "Microsoft..SimConnect" "' " \ +// "version='" "" "' " \ +// "processorArchitecture='amd64' " \ +// "publicKeyToken='" "" "'\"") +#endif // #if defined(_M_IX86) || defined(_M_X64) +#endif // #if _MSC_FULL_VER >= 140040130 +#endif // #ifndef SIMCONNECT_H_NOMANIFEST +// ASOBO-MOD/> + +#ifndef DWORD_MAX +#define DWORD_MAX 0xFFFFFFFF +#endif + +#include + +typedef DWORD SIMCONNECT_OBJECT_ID; + +//---------------------------------------------------------------------------- +// Constants +//---------------------------------------------------------------------------- + +static const DWORD SIMCONNECT_UNUSED = DWORD_MAX; // special value to indicate unused event, ID +static const DWORD SIMCONNECT_OBJECT_ID_USER = 0; // proxy value for User vehicle ObjectID + +static const float SIMCONNECT_CAMERA_IGNORE_FIELD = FLT_MAX; //Used to tell the Camera API to NOT modify the value in this part of the argument. + +static const DWORD SIMCONNECT_CLIENTDATA_MAX_SIZE = 8192; // maximum value for SimConnect_CreateClientData dwSize parameter + + +// Notification Group priority values +static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST = 1; // highest priority +static const DWORD SIMCONNECT_GROUP_PRIORITY_HIGHEST_MASKABLE = 10000000; // highest priority that allows events to be masked +static const DWORD SIMCONNECT_GROUP_PRIORITY_STANDARD = 1900000000; // standard priority +static const DWORD SIMCONNECT_GROUP_PRIORITY_DEFAULT = 2000000000; // default priority +static const DWORD SIMCONNECT_GROUP_PRIORITY_LOWEST = 4000000000; // priorities lower than this will be ignored + +//Weather observations Metar strings +static const DWORD MAX_METAR_LENGTH = 2000; + +// Maximum thermal size is 100 km. +static const float MAX_THERMAL_SIZE = 100000; +static const float MAX_THERMAL_RATE = 1000; + +// SIMCONNECT_DATA_INITPOSITION.Airspeed +static const DWORD INITPOSITION_AIRSPEED_CRUISE = -1; // aircraft's cruise airspeed +static const DWORD INITPOSITION_AIRSPEED_KEEP = -2; // keep current airspeed + +// AddToClientDataDefinition dwSizeOrType parameter type values +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT8 = -1; // 8-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT16 = -2; // 16-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT32 = -3; // 32-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_INT64 = -4; // 64-bit integer number +static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT32 = -5; // 32-bit floating-point number (float) +static const DWORD SIMCONNECT_CLIENTDATATYPE_FLOAT64 = -6; // 64-bit floating-point number (double) + +// AddToClientDataDefinition dwOffset parameter special values +static const DWORD SIMCONNECT_CLIENTDATAOFFSET_AUTO = -1; // automatically compute offset of the ClientData variable + +// Open ConfigIndex parameter special value +static const DWORD SIMCONNECT_OPEN_CONFIGINDEX_LOCAL = -1; // ignore SimConnect.cfg settings, and force local connection + +//---------------------------------------------------------------------------- +// Enum definitions +//---------------------------------------------------------------------------- + +//these came from substituteMacros +#define SIMCONNECT_REFSTRUCT struct +#define SIMCONNECT_STRUCT struct +#define SIMCONNECT_STRING(name, size) char name[size] +#define SIMCONNECT_GUID GUID +#define SIMCONNECT_STRINGV(name) char name[1] +#define SIMCONNECT_DATAV(name, id, count) DWORD name +#define SIMCONNECT_FIXEDTYPE_DATAV(type, name, count, cliMarshalAs, cliType) type name[1] +#define SIMCONNECT_GUID GUID +#define SIMCONNECT_ENUM enum +#define SIMCONNECT_ENUM_FLAGS typedef DWORD +#define SIMCONNECT_USER_ENUM typedef DWORD + + +// Receive data types +SIMCONNECT_ENUM SIMCONNECT_RECV_ID { + SIMCONNECT_RECV_ID_NULL, + SIMCONNECT_RECV_ID_EXCEPTION, + SIMCONNECT_RECV_ID_OPEN, + SIMCONNECT_RECV_ID_QUIT, + SIMCONNECT_RECV_ID_EVENT, + SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE, + SIMCONNECT_RECV_ID_EVENT_FILENAME, + SIMCONNECT_RECV_ID_EVENT_FRAME, + SIMCONNECT_RECV_ID_SIMOBJECT_DATA, + SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE, + SIMCONNECT_RECV_ID_WEATHER_OBSERVATION, + SIMCONNECT_RECV_ID_CLOUD_STATE, + SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID, + SIMCONNECT_RECV_ID_RESERVED_KEY, + SIMCONNECT_RECV_ID_CUSTOM_ACTION, + SIMCONNECT_RECV_ID_SYSTEM_STATE, + SIMCONNECT_RECV_ID_CLIENT_DATA, + SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE, + SIMCONNECT_RECV_ID_AIRPORT_LIST, + SIMCONNECT_RECV_ID_VOR_LIST, + SIMCONNECT_RECV_ID_NDB_LIST, + SIMCONNECT_RECV_ID_WAYPOINT_LIST, + SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED, + SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED, + SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED, + SIMCONNECT_RECV_ID_EVENT_RACE_END, + SIMCONNECT_RECV_ID_EVENT_RACE_LAP, +#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL + SIMCONNECT_RECV_ID_PICK, +#endif //ENABLE_SIMCONNECT_EXPERIMENTAL + SIMCONNECT_RECV_ID_EVENT_EX1, + SIMCONNECT_RECV_ID_FACILITY_DATA, + SIMCONNECT_RECV_ID_FACILITY_DATA_END, +}; + + + +// Data data types +SIMCONNECT_ENUM SIMCONNECT_DATATYPE { + SIMCONNECT_DATATYPE_INVALID, // invalid data type + SIMCONNECT_DATATYPE_INT32, // 32-bit integer number + SIMCONNECT_DATATYPE_INT64, // 64-bit integer number + SIMCONNECT_DATATYPE_FLOAT32, // 32-bit floating-point number (float) + SIMCONNECT_DATATYPE_FLOAT64, // 64-bit floating-point number (double) + SIMCONNECT_DATATYPE_STRING8, // 8-byte string + SIMCONNECT_DATATYPE_STRING32, // 32-byte string + SIMCONNECT_DATATYPE_STRING64, // 64-byte string + SIMCONNECT_DATATYPE_STRING128, // 128-byte string + SIMCONNECT_DATATYPE_STRING256, // 256-byte string + SIMCONNECT_DATATYPE_STRING260, // 260-byte string + SIMCONNECT_DATATYPE_STRINGV, // variable-length string + + SIMCONNECT_DATATYPE_INITPOSITION, // see SIMCONNECT_DATA_INITPOSITION + SIMCONNECT_DATATYPE_MARKERSTATE, // see SIMCONNECT_DATA_MARKERSTATE + SIMCONNECT_DATATYPE_WAYPOINT, // see SIMCONNECT_DATA_WAYPOINT + SIMCONNECT_DATATYPE_LATLONALT, // see SIMCONNECT_DATA_LATLONALT + SIMCONNECT_DATATYPE_XYZ, // see SIMCONNECT_DATA_XYZ + + SIMCONNECT_DATATYPE_MAX // enum limit +}; + +// Exception error types +SIMCONNECT_ENUM SIMCONNECT_EXCEPTION { + SIMCONNECT_EXCEPTION_NONE, + + SIMCONNECT_EXCEPTION_ERROR, + SIMCONNECT_EXCEPTION_SIZE_MISMATCH, + SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID, + SIMCONNECT_EXCEPTION_UNOPENED, + SIMCONNECT_EXCEPTION_VERSION_MISMATCH, + SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS, + SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED, + SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES, + SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE, + SIMCONNECT_EXCEPTION_TOO_MANY_MAPS, + SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS, + SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS, + SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT, + SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR, + SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION, + SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION, + SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION, + SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE, + SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE, + SIMCONNECT_EXCEPTION_DATA_ERROR, + SIMCONNECT_EXCEPTION_INVALID_ARRAY, + SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED, + SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED, + SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE, + SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION, + SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED, + SIMCONNECT_EXCEPTION_INVALID_ENUM, + SIMCONNECT_EXCEPTION_DEFINITION_ERROR, + SIMCONNECT_EXCEPTION_DUPLICATE_ID, + SIMCONNECT_EXCEPTION_DATUM_ID, + SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS, + SIMCONNECT_EXCEPTION_ALREADY_CREATED, + SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE, + SIMCONNECT_EXCEPTION_OBJECT_CONTAINER, + SIMCONNECT_EXCEPTION_OBJECT_AI, + SIMCONNECT_EXCEPTION_OBJECT_ATC, + SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE, +}; + +// Object types +SIMCONNECT_ENUM SIMCONNECT_SIMOBJECT_TYPE { + SIMCONNECT_SIMOBJECT_TYPE_USER, + SIMCONNECT_SIMOBJECT_TYPE_ALL, + SIMCONNECT_SIMOBJECT_TYPE_AIRCRAFT, + SIMCONNECT_SIMOBJECT_TYPE_HELICOPTER, + SIMCONNECT_SIMOBJECT_TYPE_BOAT, + SIMCONNECT_SIMOBJECT_TYPE_GROUND, +}; + +// EventState values +SIMCONNECT_ENUM SIMCONNECT_STATE { + SIMCONNECT_STATE_OFF, + SIMCONNECT_STATE_ON, +}; + +// Object Data Request Period values +SIMCONNECT_ENUM SIMCONNECT_PERIOD { + SIMCONNECT_PERIOD_NEVER, + SIMCONNECT_PERIOD_ONCE, + SIMCONNECT_PERIOD_VISUAL_FRAME, + SIMCONNECT_PERIOD_SIM_FRAME, + SIMCONNECT_PERIOD_SECOND, +}; + + +SIMCONNECT_ENUM SIMCONNECT_MISSION_END { + SIMCONNECT_MISSION_FAILED, + SIMCONNECT_MISSION_CRASHED, + SIMCONNECT_MISSION_SUCCEEDED +}; + +// ClientData Request Period values +SIMCONNECT_ENUM SIMCONNECT_CLIENT_DATA_PERIOD { + SIMCONNECT_CLIENT_DATA_PERIOD_NEVER, + SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, + SIMCONNECT_CLIENT_DATA_PERIOD_VISUAL_FRAME, + SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET, + SIMCONNECT_CLIENT_DATA_PERIOD_SECOND, +}; + +SIMCONNECT_ENUM SIMCONNECT_TEXT_TYPE { + SIMCONNECT_TEXT_TYPE_SCROLL_BLACK, + SIMCONNECT_TEXT_TYPE_SCROLL_WHITE, + SIMCONNECT_TEXT_TYPE_SCROLL_RED, + SIMCONNECT_TEXT_TYPE_SCROLL_GREEN, + SIMCONNECT_TEXT_TYPE_SCROLL_BLUE, + SIMCONNECT_TEXT_TYPE_SCROLL_YELLOW, + SIMCONNECT_TEXT_TYPE_SCROLL_MAGENTA, + SIMCONNECT_TEXT_TYPE_SCROLL_CYAN, + SIMCONNECT_TEXT_TYPE_PRINT_BLACK=0x0100, + SIMCONNECT_TEXT_TYPE_PRINT_WHITE, + SIMCONNECT_TEXT_TYPE_PRINT_RED, + SIMCONNECT_TEXT_TYPE_PRINT_GREEN, + SIMCONNECT_TEXT_TYPE_PRINT_BLUE, + SIMCONNECT_TEXT_TYPE_PRINT_YELLOW, + SIMCONNECT_TEXT_TYPE_PRINT_MAGENTA, + SIMCONNECT_TEXT_TYPE_PRINT_CYAN, + SIMCONNECT_TEXT_TYPE_MENU=0x0200, +}; + +SIMCONNECT_ENUM SIMCONNECT_TEXT_RESULT { + SIMCONNECT_TEXT_RESULT_MENU_SELECT_1, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_2, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_3, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_4, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_5, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_6, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_7, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_8, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_9, + SIMCONNECT_TEXT_RESULT_MENU_SELECT_10, + SIMCONNECT_TEXT_RESULT_DISPLAYED = 0x00010000, + SIMCONNECT_TEXT_RESULT_QUEUED, + SIMCONNECT_TEXT_RESULT_REMOVED, + SIMCONNECT_TEXT_RESULT_REPLACED, + SIMCONNECT_TEXT_RESULT_TIMEOUT, +}; + +SIMCONNECT_ENUM SIMCONNECT_WEATHER_MODE { + SIMCONNECT_WEATHER_MODE_THEME, + SIMCONNECT_WEATHER_MODE_RWW, + SIMCONNECT_WEATHER_MODE_CUSTOM, + SIMCONNECT_WEATHER_MODE_GLOBAL, +}; + +SIMCONNECT_ENUM SIMCONNECT_FACILITY_LIST_TYPE { + SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT, + SIMCONNECT_FACILITY_LIST_TYPE_WAYPOINT, + SIMCONNECT_FACILITY_LIST_TYPE_NDB, + SIMCONNECT_FACILITY_LIST_TYPE_VOR, + SIMCONNECT_FACILITY_LIST_TYPE_COUNT // invalid +}; + +SIMCONNECT_ENUM SIMCONNECT_FACILITY_DATA_TYPE +{ + SIMCONNECT_FACILITY_DATA_AIRPORT, + SIMCONNECT_FACILITY_DATA_RUNWAY, + SIMCONNECT_FACILITY_DATA_START, + SIMCONNECT_FACILITY_DATA_FREQUENCY, + SIMCONNECT_FACILITY_DATA_HELIPAD, + SIMCONNECT_FACILITY_DATA_APPROACH, + SIMCONNECT_FACILITY_DATA_APPROACH_TRANSITION, + SIMCONNECT_FACILITY_DATA_APPROACH_LEG, + SIMCONNECT_FACILITY_DATA_FINAL_APPROACH_LEG, + SIMCONNECT_FACILITY_DATA_MISSED_APPROACH_LEG, + SIMCONNECT_FACILITY_DATA_DEPARTURE, + SIMCONNECT_FACILITY_DATA_ARRIVAL, + SIMCONNECT_FACILITY_DATA_RUNWAY_TRANSITION, + SIMCONNECT_FACILITY_DATA_ENROUTE_TRANSITION, + SIMCONNECT_FACILITY_DATA_TAXI_POINT, + SIMCONNECT_FACILITY_DATA_TAXI_PARKING, + SIMCONNECT_FACILITY_DATA_TAXI_PATH, + SIMCONNECT_FACILITY_DATA_TAXI_NAME, + SIMCONNECT_FACILITY_DATA_JETWAY, + SIMCONNECT_FACILITY_DATA_VOR, + SIMCONNECT_FACILITY_DATA_NDB, + SIMCONNECT_FACILITY_DATA_WAYPOINT, + SIMCONNECT_FACILITY_DATA_ROUTE, +}; + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_VOR_FLAGS; // flags for SIMCONNECT_RECV_ID_VOR_LIST + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL = 0x00000001; // Has Nav signal + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_LOCALIZER = 0x00000002; // Has localizer + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_GLIDE_SLOPE = 0x00000004; // Has Nav signal + static const DWORD SIMCONNECT_RECV_ID_VOR_LIST_HAS_DME = 0x00000008; // Station has DME + + + +// bits for the Waypoint Flags field: may be combined +SIMCONNECT_ENUM_FLAGS SIMCONNECT_WAYPOINT_FLAGS; + static const DWORD SIMCONNECT_WAYPOINT_NONE = 0x00; + static const DWORD SIMCONNECT_WAYPOINT_SPEED_REQUESTED = 0x04; // requested speed at waypoint is valid + static const DWORD SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED = 0x08; // request a specific throttle percentage + static const DWORD SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED = 0x10; // compute vertical to speed to reach waypoint altitude when crossing the waypoint + static const DWORD SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL = 0x20; // AltitudeIsAGL + static const DWORD SIMCONNECT_WAYPOINT_ON_GROUND = 0x00100000; // place this waypoint on the ground + static const DWORD SIMCONNECT_WAYPOINT_REVERSE = 0x00200000; // Back up to this waypoint. Only valid on first waypoint + static const DWORD SIMCONNECT_WAYPOINT_WRAP_TO_FIRST = 0x00400000; // Wrap around back to first waypoint. Only valid on last waypoint. + static const DWORD SIMCONNECT_WAYPOINT_ALWAYS_BACKUP = 0x00800000; // Go from first waypoint to last one moving only backwards + static const DWORD SIMCONNECT_WAYPOINT_KEEP_LAST_HEADING = 0x01000000; // Object doesn't only go from waypoint to waypoint using position but it will also keep the same heading computed on the last 2 waypoints + static const DWORD SIMCONNECT_WAYPOINT_YIELD_TO_USER = 0x02000000; // Object will never be too close of the player. If waypoints pass too close of the player, the object will stop and wait + static const DWORD SIMCONNECT_WAYPOINT_CAN_REVERSE = 0x04000000; // This flags handle the behaviour of the object if it can't reach a waypoint. By default, it will take a other way and try to reach this point again. With this flag, object will try some stuff to reach this waypoint in a better condition (moving backwards...) + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_EVENT_FLAG; + static const DWORD SIMCONNECT_EVENT_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_EVENT_FLAG_FAST_REPEAT_TIMER = 0x00000001; // set event repeat timer to simulate fast repeat + static const DWORD SIMCONNECT_EVENT_FLAG_SLOW_REPEAT_TIMER = 0x00000002; // set event repeat timer to simulate slow repeat + static const DWORD SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY = 0x00000010; // interpret GroupID parameter as priority value + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_DATA_REQUEST_FLAG; + static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested data when value(s) change + static const DWORD SIMCONNECT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested data in tagged format + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_DATA_SET_FLAG; + static const DWORD SIMCONNECT_DATA_SET_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_CREATE_CLIENT_DATA_FLAG; + static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_CREATE_CLIENT_DATA_FLAG_READ_ONLY = 0x00000001; // permit only ClientData creator to write into ClientData + + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_CLIENT_DATA_REQUEST_FLAG; + static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED = 0x00000001; // send requested ClientData when value(s) change + static const DWORD SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_TAGGED = 0x00000002; // send requested ClientData in tagged format + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_CLIENT_DATA_SET_FLAG; + static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_DEFAULT = 0x00000000; + static const DWORD SIMCONNECT_CLIENT_DATA_SET_FLAG_TAGGED = 0x00000001; // data is in tagged format + + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_VIEW_SYSTEM_EVENT_DATA; // dwData contains these flags for the "View" System Event + static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_2D = 0x00000001; // 2D Panels in cockpit view + static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_COCKPIT_VIRTUAL = 0x00000002; // Virtual (3D) panels in cockpit view + static const DWORD SIMCONNECT_VIEW_SYSTEM_EVENT_DATA_ORTHOGONAL = 0x00000004; // Orthogonal (Map) view + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_SOUND_SYSTEM_EVENT_DATA; // dwData contains these flags for the "Sound" System Event + static const DWORD SIMCONNECT_SOUND_SYSTEM_EVENT_DATA_MASTER = 0x00000001; // Sound Master + + +#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL + +SIMCONNECT_ENUM_FLAGS SIMCONNECT_PICK_FLAGS +{ + SIMCONNECT_PICK_GROUND = 0x01, // pick ground/ pick result item is ground location + SIMCONNECT_PICK_AI = 0x02, // pick AI / pick result item is AI, (dwSimObjectID is valid) + SIMCONNECT_PICK_SCENERY = 0x04, // pick scenery/ pick result item is scenery object (hSceneryObject is valid) + SIMCONNECT_PICK_ALL = SIMCONNECT_PICK_SCENERY | SIMCONNECT_PICK_AI | SIMCONNECT_PICK_GROUND, // pick all / (not valid on pick result item) + SIMCONNECT_PICK_COORDSASPIXELS = 0x08, +}; + +#endif //ENABLE_SIMCONNECT_EXPERIMENTAL + +//---------------------------------------------------------------------------- +// User-defined enums +//---------------------------------------------------------------------------- + +SIMCONNECT_USER_ENUM SIMCONNECT_NOTIFICATION_GROUP_ID; //client-defined notification group ID +SIMCONNECT_USER_ENUM SIMCONNECT_INPUT_GROUP_ID; //client-defined input group ID +SIMCONNECT_USER_ENUM SIMCONNECT_DATA_DEFINITION_ID; //client-defined data definition ID +SIMCONNECT_USER_ENUM SIMCONNECT_DATA_REQUEST_ID; //client-defined request data ID + +SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_EVENT_ID; //client-defined client event ID +SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_DATA_ID; //client-defined client data ID +SIMCONNECT_USER_ENUM SIMCONNECT_CLIENT_DATA_DEFINITION_ID; //client-defined client data definition ID + + +//---------------------------------------------------------------------------- +// Struct definitions +//---------------------------------------------------------------------------- + +#pragma pack(push, 1) + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV +{ + DWORD dwSize; // record size + DWORD dwVersion; // interface version + DWORD dwID; // see SIMCONNECT_RECV_ID +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EXCEPTION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EXCEPTION +{ + DWORD dwException; // see SIMCONNECT_EXCEPTION + static const DWORD UNKNOWN_SENDID = 0; + DWORD dwSendID; // see SimConnect_GetLastSentPacketID + static const DWORD UNKNOWN_INDEX = DWORD_MAX; + DWORD dwIndex; // index of parameter that was source of error +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_OPEN : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_OPEN +{ + SIMCONNECT_STRING( szApplicationName, 256); + DWORD dwApplicationVersionMajor; + DWORD dwApplicationVersionMinor; + DWORD dwApplicationBuildMajor; + DWORD dwApplicationBuildMinor; + DWORD dwSimConnectVersionMajor; + DWORD dwSimConnectVersionMinor; + DWORD dwSimConnectBuildMajor; + DWORD dwSimConnectBuildMinor; + DWORD dwReserved1; + DWORD dwReserved2; +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_QUIT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_QUIT +{ +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT +{ + static const DWORD UNKNOWN_GROUP = DWORD_MAX; + DWORD uGroupID; + DWORD uEventID; + DWORD dwData; // uEventID-dependent context +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_FILENAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME +{ + SIMCONNECT_STRING( szFileName, MAX_PATH); // uEventID-dependent context + DWORD dwFlags; +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_OBJECT_ADDREMOVE : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FILENAME +{ + SIMCONNECT_SIMOBJECT_TYPE eObjType; +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_FRAME : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_FRAME +{ + float fFrameRate; + float fSimSpeed; +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_SERVER_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED +{ + // No event specific data, for now +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_CLIENT_STARTED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED +{ + // No event specific data, for now +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_MULTIPLAYER_SESSION_ENDED : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED +{ + // No event specific data, for now +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_EX1 : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_EVENT_EX1 +{ + static const DWORD UNKNOWN_GROUP = DWORD_MAX; + DWORD uGroupID; + DWORD uEventID; + + // Doesn t support array so, let s list + DWORD dwData0; + DWORD dwData1; + DWORD dwData2; + DWORD dwData3; + DWORD dwData4; +}; + +// SIMCONNECT_DATA_RACE_RESULT +SIMCONNECT_STRUCT SIMCONNECT_DATA_RACE_RESULT +{ + DWORD dwNumberOfRacers; // The total number of racers + SIMCONNECT_GUID MissionGUID; // The name of the mission to execute, NULL if no mission + SIMCONNECT_STRING( szPlayerName, MAX_PATH); // The name of the player + SIMCONNECT_STRING( szSessionType, MAX_PATH); // The type of the multiplayer session: "LAN", "GAMESPY") + SIMCONNECT_STRING( szAircraft, MAX_PATH); // The aircraft type + SIMCONNECT_STRING( szPlayerRole, MAX_PATH); // The player role in the mission + double fTotalTime; // Total time in seconds, 0 means DNF + double fPenaltyTime; // Total penalty time in seconds + DWORD dwIsDisqualified; // non 0 - disqualified, 0 - not disqualified +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_RACE_END : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_END +{ + DWORD dwRacerNumber; // The index of the racer the results are for + SIMCONNECT_DATA_RACE_RESULT RacerData; +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_RACE_LAP : public SIMCONNECT_RECV_EVENT // when dwID == SIMCONNECT_RECV_ID_EVENT_RACE_LAP +{ + DWORD dwLapIndex; // The index of the lap the results are for + SIMCONNECT_DATA_RACE_RESULT RacerData; +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SIMOBJECT_DATA : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA +{ + DWORD dwRequestID; + DWORD dwObjectID; + DWORD dwDefineID; + DWORD dwFlags; // SIMCONNECT_DATA_REQUEST_FLAG + DWORD dwentrynumber; // if multiple objects returned, this is number out of . + DWORD dwoutof; // note: starts with 1, not 0. + DWORD dwDefineCount; // data count (number of datums, *not* byte count) + SIMCONNECT_DATAV( dwData, dwDefineID, ); // data begins here, dwDefineCount data items +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE +{ +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CLIENT_DATA : public SIMCONNECT_RECV_SIMOBJECT_DATA // when dwID == SIMCONNECT_RECV_ID_CLIENT_DATA +{ +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_WEATHER_OBSERVATION : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_WEATHER_OBSERVATION +{ + DWORD dwRequestID; + SIMCONNECT_STRINGV( szMetar); // Variable length string whose maximum size is MAX_METAR_LENGTH +}; + +static const int SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH = 64; +static const int SIMCONNECT_CLOUD_STATE_ARRAY_SIZE = SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH*SIMCONNECT_CLOUD_STATE_ARRAY_WIDTH; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CLOUD_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_CLOUD_STATE +{ + DWORD dwRequestID; + DWORD dwArraySize; + SIMCONNECT_FIXEDTYPE_DATAV(BYTE, rgbData, dwArraySize, U1 /*member of UnmanagedType enum*/ , System::Byte /*cli type*/); +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_ASSIGNED_OBJECT_ID : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID +{ + DWORD dwRequestID; + DWORD dwObjectID; +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_RESERVED_KEY : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY +{ + SIMCONNECT_STRING( szChoiceReserved, 30); + SIMCONNECT_STRING( szReservedKey, 50); +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_SYSTEM_STATE : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_SYSTEM_STATE +{ + DWORD dwRequestID; + DWORD dwInteger; + float fFloat; + SIMCONNECT_STRING( szString, MAX_PATH); +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_CUSTOM_ACTION : public SIMCONNECT_RECV_EVENT +{ + SIMCONNECT_GUID guidInstanceId; // Instance id of the action that executed + DWORD dwWaitForCompletion; // Wait for completion flag on the action + SIMCONNECT_STRINGV( szPayLoad); // Variable length string payload associated with the mission action. +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_EVENT_WEATHER_MODE : public SIMCONNECT_RECV_EVENT +{ + // No event specific data - the new weather mode is in the base structure dwData member. +}; + +// SIMCONNECT_RECV_FACILITIES_LIST +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITIES_LIST : public SIMCONNECT_RECV +{ + DWORD dwRequestID; + DWORD dwArraySize; + DWORD dwEntryNumber; // when the array of items is too big for one send, which send this is (0..dwOutOf-1) + DWORD dwOutOf; // total number of transmissions the list is chopped into +}; + +// SIMCONNECT_DATA_FACILITY_AIRPORT +SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_AIRPORT +{ + SIMCONNECT_STRING(Icao, 9); // ICAO of the object + double Latitude; // degrees + double Longitude; // degrees + double Altitude; // meters +}; + +// SIMCONNECT_RECV_AIRPORT_LIST +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_AIRPORT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_AIRPORT, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_AIRPORT /*cli type*/); +}; + + +// SIMCONNECT_DATA_FACILITY_WAYPOINT +SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_WAYPOINT : public SIMCONNECT_DATA_FACILITY_AIRPORT +{ + float fMagVar; // Magvar in degrees +}; + +// SIMCONNECT_RECV_WAYPOINT_LIST +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_WAYPOINT_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_WAYPOINT, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_WAYPOINT /*cli type*/); +}; + +// SIMCONNECT_DATA_FACILITY_NDB +SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_NDB : public SIMCONNECT_DATA_FACILITY_WAYPOINT +{ + DWORD fFrequency; // frequency in Hz +}; + +// SIMCONNECT_RECV_NDB_LIST +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_NDB_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_NDB, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_NDB /*cli type*/); +}; + +// SIMCONNECT_DATA_FACILITY_VOR +SIMCONNECT_REFSTRUCT SIMCONNECT_DATA_FACILITY_VOR : public SIMCONNECT_DATA_FACILITY_NDB +{ + DWORD Flags; // SIMCONNECT_VOR_FLAGS + float fLocalizer; // Localizer in degrees + double GlideLat; // Glide Slope Location (deg, deg, meters) + double GlideLon; + double GlideAlt; + float fGlideSlopeAngle; // Glide Slope in degrees +}; + +// SIMCONNECT_RECV_VOR_LIST +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_VOR_LIST : public SIMCONNECT_RECV_FACILITIES_LIST +{ + SIMCONNECT_FIXEDTYPE_DATAV(SIMCONNECT_DATA_FACILITY_VOR, rgData, dwArraySize, U1 /*member of UnmanagedType enum*/, SIMCONNECT_DATA_FACILITY_VOR /*cli type*/); +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITY_DATA : public SIMCONNECT_RECV +{ + DWORD UserRequestId; + DWORD UniqueRequestId; + DWORD ParentUniqueRequestId; + DWORD Type; + DWORD IsListItem; + DWORD ItemIndex; + DWORD ListSize; + SIMCONNECT_DATAV(Data, Type, ); +}; + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_FACILITY_DATA_END : public SIMCONNECT_RECV +{ + DWORD RequestId; +}; + +#ifdef ENABLE_SIMCONNECT_EXPERIMENTAL + +SIMCONNECT_REFSTRUCT SIMCONNECT_RECV_PICK : public SIMCONNECT_RECV // when dwID == SIMCONNECT_RECV_ID_RESERVED_KEY +{ + HANDLE hContext; + DWORD dwFlags; // + double Latitude; // degrees + double Longitude; // degrees + double Altitude; // feet + int xPos; //reserved + int yPos; //reserved; + DWORD dwSimObjectID; + HANDLE hSceneryObject; + DWORD dwentrynumber; // if multiple objects returned, this is number out of . + DWORD dwoutof; // note: starts with 1, not 0. +}; + +#endif //ENABLE_SIMCONNECT_EXPERIMENTAL + + +// SIMCONNECT_DATATYPE_INITPOSITION +SIMCONNECT_STRUCT SIMCONNECT_DATA_INITPOSITION +{ + double Latitude; // degrees + double Longitude; // degrees + double Altitude; // feet + double Pitch; // degrees + double Bank; // degrees + double Heading; // degrees + DWORD OnGround; // 1=force to be on the ground + DWORD Airspeed; // knots +}; + + +// SIMCONNECT_DATATYPE_MARKERSTATE +SIMCONNECT_STRUCT SIMCONNECT_DATA_MARKERSTATE +{ + SIMCONNECT_STRING( szMarkerName, 64); + DWORD dwMarkerState; +}; + +// SIMCONNECT_DATATYPE_WAYPOINT +SIMCONNECT_STRUCT SIMCONNECT_DATA_WAYPOINT +{ + double Latitude; // degrees + double Longitude; // degrees + double Altitude; // feet + unsigned long Flags; + double ktsSpeed; // knots + double percentThrottle; +}; + +// SIMCONNECT_DATA_LATLONALT +SIMCONNECT_STRUCT SIMCONNECT_DATA_LATLONALT +{ + double Latitude; + double Longitude; + double Altitude; +}; + +// SIMCONNECT_DATA_XYZ +SIMCONNECT_STRUCT SIMCONNECT_DATA_XYZ +{ + double x; + double y; + double z; +}; + +#pragma pack(pop) + +//---------------------------------------------------------------------------- +// End of Struct definitions +//---------------------------------------------------------------------------- + + +#if !defined(SIMCONNECTAPI) +#define SIMCONNECTAPI extern "C" HRESULT __stdcall +#endif + + +typedef void (CALLBACK *DispatchProc)(SIMCONNECT_RECV* pData, DWORD cbData, void* pContext); + + +SIMCONNECTAPI SimConnect_MapClientEventToSimEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * EventName = ""); +SIMCONNECTAPI SimConnect_TransmitClientEvent(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD dwData, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags); +SIMCONNECTAPI SimConnect_SetSystemEventState(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_STATE dwState); +SIMCONNECTAPI SimConnect_AddClientEventToNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID, BOOL bMaskable = FALSE); +SIMCONNECTAPI SimConnect_RemoveClientEvent(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_CLIENT_EVENT_ID EventID); +SIMCONNECTAPI SimConnect_SetNotificationGroupPriority(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD uPriority); +SIMCONNECTAPI SimConnect_ClearNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID); +SIMCONNECTAPI SimConnect_RequestNotificationGroup(HANDLE hSimConnect, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, DWORD dwReserved = 0, DWORD Flags = 0); +SIMCONNECTAPI SimConnect_AddToDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * DatumName, const char * UnitsName, SIMCONNECT_DATATYPE DatumType = SIMCONNECT_DATATYPE_FLOAT64, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED); +SIMCONNECTAPI SimConnect_ClearDataDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID); +SIMCONNECTAPI SimConnect_RequestDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_PERIOD Period, SIMCONNECT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0); +SIMCONNECTAPI SimConnect_RequestDataOnSimObjectType(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_DATA_DEFINITION_ID DefineID, DWORD dwRadiusMeters, SIMCONNECT_SIMOBJECT_TYPE type); +SIMCONNECTAPI SimConnect_SetDataOnSimObject(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_SET_FLAG Flags, DWORD ArrayCount, DWORD cbUnitSize, void * pDataSet); +SIMCONNECTAPI SimConnect_MapInputEventToClientEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition, SIMCONNECT_CLIENT_EVENT_ID DownEventID, DWORD DownValue = 0, SIMCONNECT_CLIENT_EVENT_ID UpEventID = (SIMCONNECT_CLIENT_EVENT_ID)SIMCONNECT_UNUSED, DWORD UpValue = 0, BOOL bMaskable = FALSE); +SIMCONNECTAPI SimConnect_SetInputGroupPriority(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD uPriority); +SIMCONNECTAPI SimConnect_RemoveInputEvent(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, const char * szInputDefinition); +SIMCONNECTAPI SimConnect_ClearInputGroup(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID); +SIMCONNECTAPI SimConnect_SetInputGroupState(HANDLE hSimConnect, SIMCONNECT_INPUT_GROUP_ID GroupID, DWORD dwState); +SIMCONNECTAPI SimConnect_RequestReservedKey(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * szKeyChoice1 = "", const char * szKeyChoice2 = "", const char * szKeyChoice3 = ""); +SIMCONNECTAPI SimConnect_SubscribeToSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID, const char * SystemEventName); +SIMCONNECTAPI SimConnect_UnsubscribeFromSystemEvent(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID EventID); +SIMCONNECTAPI SimConnect_WeatherRequestInterpolatedObservation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt); +SIMCONNECTAPI SimConnect_WeatherRequestObservationAtStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO); +SIMCONNECTAPI SimConnect_WeatherRequestObservationAtNearestStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon); +SIMCONNECTAPI SimConnect_WeatherCreateStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO, const char * szName, float lat, float lon, float alt); +SIMCONNECTAPI SimConnect_WeatherRemoveStation(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szICAO); +SIMCONNECTAPI SimConnect_WeatherSetObservation(HANDLE hSimConnect, DWORD Seconds, const char * szMETAR); +SIMCONNECTAPI SimConnect_WeatherSetModeServer(HANDLE hSimConnect, DWORD dwPort, DWORD dwSeconds); +SIMCONNECTAPI SimConnect_WeatherSetModeTheme(HANDLE hSimConnect, const char * szThemeName); +SIMCONNECTAPI SimConnect_WeatherSetModeGlobal(HANDLE hSimConnect); +SIMCONNECTAPI SimConnect_WeatherSetModeCustom(HANDLE hSimConnect); +SIMCONNECTAPI SimConnect_WeatherSetDynamicUpdateRate(HANDLE hSimConnect, DWORD dwRate); +SIMCONNECTAPI SimConnect_WeatherRequestCloudState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float minLat, float minLon, float minAlt, float maxLat, float maxLon, float maxAlt, DWORD dwFlags = 0); +SIMCONNECTAPI SimConnect_WeatherCreateThermal(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, float lat, float lon, float alt, float radius, float height, float coreRate = 3.0f, float coreTurbulence = 0.05f, float sinkRate = 3.0f, float sinkTurbulence = 0.2f, float coreSize = 0.4f, float coreTransitionSize = 0.1f, float sinkLayerSize = 0.4f, float sinkTransitionSize = 0.1f); +SIMCONNECTAPI SimConnect_WeatherRemoveThermal(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID); +SIMCONNECTAPI SimConnect_AICreateParkedATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, const char * szAirportID, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AICreateEnrouteATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, int iFlightNumber, const char * szFlightPlanPath, double dFlightPlanPosition, BOOL bTouchAndGo, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AICreateNonATCAircraft(HANDLE hSimConnect, const char * szContainerTitle, const char * szTailNumber, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AICreateSimulatedObject(HANDLE hSimConnect, const char * szContainerTitle, SIMCONNECT_DATA_INITPOSITION InitPos, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AIReleaseControl(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AIRemoveObject(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_AISetAircraftFlightPlan(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, const char * szFlightPlanPath, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_ExecuteMissionAction(HANDLE hSimConnect, const GUID guidInstanceId); +SIMCONNECTAPI SimConnect_CompleteCustomMissionAction(HANDLE hSimConnect, const GUID guidInstanceId); +SIMCONNECTAPI SimConnect_Close(HANDLE hSimConnect); +SIMCONNECTAPI SimConnect_RetrieveString(SIMCONNECT_RECV * pData, DWORD cbData, void * pStringV, char ** pszString, DWORD * pcbString); +SIMCONNECTAPI SimConnect_GetLastSentPacketID(HANDLE hSimConnect, DWORD * pdwError); +SIMCONNECTAPI SimConnect_Open(HANDLE * phSimConnect, LPCSTR szName, HWND hWnd, DWORD UserEventWin32, HANDLE hEventHandle, DWORD ConfigIndex); +SIMCONNECTAPI SimConnect_CallDispatch(HANDLE hSimConnect, DispatchProc pfcnDispatch, void * pContext); +SIMCONNECTAPI SimConnect_GetNextDispatch(HANDLE hSimConnect, SIMCONNECT_RECV ** ppData, DWORD * pcbData); +SIMCONNECTAPI SimConnect_RequestResponseTimes(HANDLE hSimConnect, DWORD nCount, float * fElapsedSeconds); +SIMCONNECTAPI SimConnect_InsertString(char * pDest, DWORD cbDest, void ** ppEnd, DWORD * pcbStringV, const char * pSource); +SIMCONNECTAPI SimConnect_CameraSetRelative6DOF(HANDLE hSimConnect, float fDeltaX, float fDeltaY, float fDeltaZ, float fPitchDeg, float fBankDeg, float fHeadingDeg); +SIMCONNECTAPI SimConnect_MenuAddItem(HANDLE hSimConnect, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, DWORD dwData); +SIMCONNECTAPI SimConnect_MenuDeleteItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID); +SIMCONNECTAPI SimConnect_MenuAddSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const char * szMenuItem, SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID, DWORD dwData); +SIMCONNECTAPI SimConnect_MenuDeleteSubItem(HANDLE hSimConnect, SIMCONNECT_CLIENT_EVENT_ID MenuEventID, const SIMCONNECT_CLIENT_EVENT_ID SubMenuEventID); +SIMCONNECTAPI SimConnect_RequestSystemState(HANDLE hSimConnect, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * szState); +SIMCONNECTAPI SimConnect_SetSystemState(HANDLE hSimConnect, const char * szState, DWORD dwInteger, float fFloat, const char * szString); +SIMCONNECTAPI SimConnect_MapClientDataNameToID(HANDLE hSimConnect, const char * szClientDataName, SIMCONNECT_CLIENT_DATA_ID ClientDataID); +SIMCONNECTAPI SimConnect_CreateClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, DWORD dwSize, SIMCONNECT_CREATE_CLIENT_DATA_FLAG Flags); +SIMCONNECTAPI SimConnect_AddToClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, DWORD dwOffset, DWORD dwSizeOrType, float fEpsilon = 0, DWORD DatumID = SIMCONNECT_UNUSED); +SIMCONNECTAPI SimConnect_ClearClientDataDefinition(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID); +SIMCONNECTAPI SimConnect_RequestClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_DATA_REQUEST_ID RequestID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_PERIOD Period = SIMCONNECT_CLIENT_DATA_PERIOD_ONCE, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG Flags = 0, DWORD origin = 0, DWORD interval = 0, DWORD limit = 0); +SIMCONNECTAPI SimConnect_SetClientData(HANDLE hSimConnect, SIMCONNECT_CLIENT_DATA_ID ClientDataID, SIMCONNECT_CLIENT_DATA_DEFINITION_ID DefineID, SIMCONNECT_CLIENT_DATA_SET_FLAG Flags, DWORD dwReserved, DWORD cbUnitSize, void * pDataSet); +SIMCONNECTAPI SimConnect_FlightLoad(HANDLE hSimConnect, const char * szFileName); +SIMCONNECTAPI SimConnect_FlightSave(HANDLE hSimConnect, const char * szFileName, const char * szTitle, const char * szDescription, DWORD Flags); +SIMCONNECTAPI SimConnect_FlightPlanLoad(HANDLE hSimConnect, const char * szFileName); +SIMCONNECTAPI SimConnect_Text(HANDLE hSimConnect, SIMCONNECT_TEXT_TYPE type, float fTimeSeconds, SIMCONNECT_CLIENT_EVENT_ID EventID, DWORD cbUnitSize, void * pDataSet); +SIMCONNECTAPI SimConnect_SubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_UnsubscribeToFacilities(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type); +SIMCONNECTAPI SimConnect_RequestFacilitiesList(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID); +SIMCONNECTAPI SimConnect_TransmitClientEvent_EX1(HANDLE hSimConnect, SIMCONNECT_OBJECT_ID ObjectID, SIMCONNECT_CLIENT_EVENT_ID EventID, SIMCONNECT_NOTIFICATION_GROUP_ID GroupID, SIMCONNECT_EVENT_FLAG Flags, DWORD dwData0, DWORD dwData1 = 0, DWORD dwData2 = 0, DWORD dwData3 = 0, DWORD dwData4 = 0); +SIMCONNECTAPI SimConnect_AddToFacilityDefinition(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, const char * FieldName); +SIMCONNECTAPI SimConnect_RequestFacilityData(HANDLE hSimConnect, SIMCONNECT_DATA_DEFINITION_ID DefineID, SIMCONNECT_DATA_REQUEST_ID RequestID, const char * ICAO, const char * Region = ""); +SIMCONNECTAPI SimConnect_SubscribeToFacilities_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID newElemInRangeRequestID, SIMCONNECT_DATA_REQUEST_ID oldElemOutRangeRequestID); +SIMCONNECTAPI SimConnect_UnsubscribeToFacilities_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, bool bUnsubscribeNewInRange, bool bUnsubscribeOldOutRange); +SIMCONNECTAPI SimConnect_RequestFacilitiesList_EX1(HANDLE hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE type, SIMCONNECT_DATA_REQUEST_ID RequestID); + + +#endif // _SIMCONNECT_H_ diff --git a/TODO.md b/TODO.md index e69de29..ad366e9 100644 --- a/TODO.md +++ b/TODO.md @@ -0,0 +1,8 @@ +- SimConnect DATA class +- SimDatabase + - MakeRwys (or equiv BGL lib) for 32Bit + - New Facillity API for 64Bit + - Readback test +- Websocket dummy +- Recording file dummy +- Logbook file dummy \ No newline at end of file diff --git a/build.sh b/build.sh index 302041d..66329f6 100755 --- a/build.sh +++ b/build.sh @@ -4,31 +4,41 @@ mkdir -p build cd build mkdir -p X-Plane/GAConnector/64 mkdir -p X-Plane/GAConnector/recordings -mkdir -p ESP/GAConnector -mkdir -p ESP/GAConnector/recordings +mkdir -p ESP/32/GAConnector +mkdir -p ESP/32/GAConnector/recordings +mkdir -p ESP/64/GAConnector +mkdir -p ESP/64/GAConnector/recordings rm -f CMakeCache.txt case $1 in "mac") - cmake -DDEBUG=$DEBUG -DCMAKE_TOOLCHAIN_FILE=../toolchain-mac.cmake .. + cmake -DXP=ON -DDEBUG=$DEBUG -DCMAKE_TOOLCHAIN_FILE=../toolchain-mac.cmake .. ;; "lin") - cmake -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-lin.cmake .. - ;; - "win32") - cmake -DDEBUG=$DEBUG -DBIT=32 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-32.cmake .. - \cp -rf ../openSSL/win32/*.dll ESP/GAConnector/ - \cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libc++.dll ESP/GAConnector/ - \cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libunwind.dll ESP/GAConnector/ + cmake -DXP=ON -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-lin.cmake .. ;; "win64") - cmake -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-64.cmake .. + cmake -DXP=ON -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-64.cmake .. \cp -rf ../openSSL/win64/*.dll X-Plane/GAConnector/64/ \cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libc++.dll X-Plane/GAConnector/64 \cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libunwind.dll X-Plane/GAConnector/64 ;; + "win64-ESP") + cmake -DDEBUG=$DEBUG -DBIT=64 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-64.cmake .. + \cp -rf ../openSSL/win64/*.dll ESP/64/GAConnector/ + \cp -rf ../SimConnect/64/*.dll ESP/64/GAConnector/ + \cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libc++.dll ESP/64/GAConnector/ + \cp -rf /opt/llvm-mingw/x86_64-w64-mingw32/bin/libunwind.dll ESP/64/GAConnector/ + ;; + "win32") + cmake -DDEBUG=$DEBUG -DBIT=32 -DCMAKE_TOOLCHAIN_FILE=../toolchain-win-32.cmake .. + \cp -rf ../openSSL/win32/*.dll ESP/32/GAConnector/ + \cp -rf ../SimConnect/32/*.msi ESP/32/GAConnector/ + \cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libc++.dll ESP/32/GAConnector/ + \cp -rf /opt/llvm-mingw/i686-w64-mingw32/bin/libunwind.dll ESP/32/GAConnector/ + ;; *) - echo "Unknown platform, choose one of mac, lin, win64, win32" + echo "Unknown platform, choose one of mac, lin, win64, win64-ESP, win32" exit 22 ;; esac diff --git a/esp/CMakeLists.txt b/esp/CMakeLists.txt new file mode 100644 index 0000000..60cee47 --- /dev/null +++ b/esp/CMakeLists.txt @@ -0,0 +1,69 @@ +file(GLOB socket CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/websocket/*.cpp) + +enable_language(RC) + +# Add WIN32 to hide console window +add_executable(germanairlinesva_esp WIN32 + ${socket} + resources/resources-${BIT}.rc + main.cpp +) + +target_include_directories(germanairlinesva_esp PRIVATE + ${CMAKE_SOURCE_DIR}/file/include + ${CMAKE_SOURCE_DIR}/simdata/include + ${CMAKE_SOURCE_DIR}/websocket/include + ${CMAKE_SOURCE_DIR}/utilities/include + ${CMAKE_SOURCE_DIR}/ixwebsocket/include + ${CMAKE_SOURCE_DIR}/nlohmann/include + ${CMAKE_SOURCE_DIR}/SimConnect/${BIT}/include +) + +target_compile_definitions(germanairlinesva_esp PRIVATE + BIT="${BIT}" + IBM +) + +target_compile_options(germanairlinesva_esp PRIVATE + -Wall + -Wextra + -pedantic + -fvisibility=hidden +) +if(DEBUG) + target_compile_options(germanairlinesva_esp PRIVATE + -g + ) + target_link_options(germanairlinesva_esp PRIVATE + -g + ) +else() + target_compile_options(germanairlinesva_esp PRIVATE + -O2 + ) +endif() + +message("Building for Windows ${BIT} into ${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}") + +set_target_properties(germanairlinesva_esp PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}" + OUTPUT_NAME "GA Connector" +) + +if(DEBUG) + target_compile_options(germanairlinesva_esp PRIVATE + -gcodeview + ) + target_link_options(germanairlinesva_esp PRIVATE + -Wl,-pdb= + ) +endif() + +target_link_libraries(germanairlinesva_esp PRIVATE + user32 + shell32 + version + ixwebsocket + pthread + ${CMAKE_SOURCE_DIR}/SimConnect/${BIT}/SimConnect.lib +) diff --git a/esp/include/main.h b/esp/include/main.h new file mode 100644 index 0000000..1854059 --- /dev/null +++ b/esp/include/main.h @@ -0,0 +1,20 @@ +#ifndef GERMANAIRLINESVA_GACONNECTOR_ESP_MAIN_H +#define GERMANAIRLINESVA_GACONNECTOR_ESP_MAIN_H + +#include "constants.h" + +#include "windows.h" + +#include "SimConnect.h" + +#include +#include +#include +#include +#include + +WINBOOL addNotifyIcon(HWND hWnd); +WINBOOL removeNotifyIcon(HWND hWnd); +void toLog(const std::string &message); + +#endif \ No newline at end of file diff --git a/esp/main.cpp b/esp/main.cpp new file mode 100644 index 0000000..bba985f --- /dev/null +++ b/esp/main.cpp @@ -0,0 +1,203 @@ +#include "include/main.h" + +bool connectedToSim = false; + +// The Window Procedure +LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static UINT s_uTaskbarRestart; + + switch (msg) { + case WM_CREATE: + s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); + break; + case WM_CLOSE: { + toLog("Close"); + DestroyWindow(hWnd); + break; + } + case WM_DESTROY: { + toLog("Destroy"); + removeNotifyIcon(hWnd); + UnregisterClass(WINDOW_CLASS, GetModuleHandle(NULL)); + PostQuitMessage(0); + break; + } + case TRAY_MESSAGE: { + switch (lParam) { + case WM_RBUTTONUP: + case WM_CONTEXTMENU: { + const int IDM_EXIT = 100; + POINT pt; + GetCursorPos(&pt); + + HMENU hMenu = CreatePopupMenu(); + AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, "Version: " BIT); + if (connectedToSim) { + AppendMenu(hMenu, MF_STRING | MF_GRAYED, NULL, "Connected to Sim"); + } + AppendMenu(hMenu, MF_SEPARATOR, NULL, NULL); + AppendMenu(hMenu, MF_STRING, IDM_EXIT, "Exit"); + + SetForegroundWindow(hWnd); + + WINBOOL cmd = TrackPopupMenu(hMenu, + TPM_LEFTALIGN | TPM_LEFTBUTTON | + TPM_BOTTOMALIGN | TPM_RETURNCMD, + pt.x, + pt.y, + 0, + hWnd, + NULL); + + if (cmd == IDM_EXIT) { + PostMessage(hWnd, WM_CLOSE, 0, NULL); + } + + DestroyMenu(hMenu); + break; + } + } + break; + } + default: { + if (msg == s_uTaskbarRestart) { + addNotifyIcon(hWnd); + } + break; + } + } + return DefWindowProc(hWnd, msg, wParam, lParam); +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-parameter" +int WINAPI WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + HANDLE simConnect; + HRESULT hr; + WNDCLASS wc; + ZeroMemory(&wc, sizeof(WNDCLASS)); + HWND hWnd; + MSG msg; + + // Exit if already running + hWnd = FindWindow(WINDOW_CLASS, WINDOW_CLASS); + if (hWnd != NULL) { + toLog("Exiting duplicate"); + return 0; + } + + // Clear log + std::ofstream clearLog(BASE_DIRECTORY "log.txt"); + clearLog.close(); + + // Registering the Window Class + wc.lpfnWndProc = WndProc; + wc.hInstance = hInstance; + wc.lpszClassName = WINDOW_CLASS; + + if (!RegisterClass(&wc)) { + toLog("Error window register: " + std::to_string(GetLastError())); + return 0; + } + + // Creating the Window + hWnd = CreateWindow(WINDOW_CLASS, + WINDOW_CLASS, + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + 240, + 120, + NULL, + NULL, + hInstance, + NULL); + + if (hWnd == NULL) { + toLog("Error window create: " + std::to_string(GetLastError())); + return 0; + } + + // Add Notify Icon + if (!addNotifyIcon(hWnd)) { + toLog("Error notifyIcon: " + std::to_string(GetLastError())); + return 0; + } + + // Never show window + // ShowWindow(hWnd, SHOW_OPENWINDOW); + + hr = SimConnect_Open(&simConnect, "GAConnector", hWnd, NULL, NULL, NULL); + if (hr == E_FAIL) { + toLog("SimConnect_Open failed"); + } else { + connectedToSim = true; + } + + // The Message Loop + while (GetMessage(&msg, NULL, 0, 0) > 0) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + // Exit + SimConnect_Close(&simConnect); + toLog("Bye"); + return msg.wParam; +} +#pragma clang diagnostic pop + +WINBOOL addNotifyIcon(HWND hWnd) +{ + HICON icon; + NOTIFYICONDATA niData; + ZeroMemory(&niData, sizeof(NOTIFYICONDATA)); + + icon = (HICON)LoadImage(GetModuleHandle(NULL), + MAKEINTRESOURCE(APP_ICON), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_SHARED); + if (icon == NULL) { + toLog("error icon " + std::to_string(GetLastError())); + } + niData.cbSize = sizeof(NOTIFYICONDATA); + niData.uVersion = NOTIFYICON_VERSION_4; + niData.uID = TRAY_ICON_ID; + niData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + strcpy(niData.szTip, "GA Connector"); + niData.hIcon = icon; + niData.hWnd = hWnd; + niData.uCallbackMessage = TRAY_MESSAGE; + + WINBOOL retVal = Shell_NotifyIcon(NIM_ADD, &niData); + // DestroyIcon(niData.hIcon); + + return retVal; +} + +WINBOOL removeNotifyIcon(HWND hWnd) +{ + NOTIFYICONDATA niData; + ZeroMemory(&niData, sizeof(NOTIFYICONDATA)); + + niData.cbSize = sizeof(NOTIFYICONDATA); + niData.uID = TRAY_ICON_ID; + niData.hWnd = hWnd; + return Shell_NotifyIcon(NIM_DELETE, &niData); +} + +void toLog(const std::string &message) +{ + std::time_t utc = std::time(nullptr); + std::tm *time = std::gmtime(&utc); + std::ofstream msg(BASE_DIRECTORY "log.txt", std::ofstream::app); + msg << std::put_time(time, "%Y-%m-%d %H:%M:%S UTC ") + << "German Airlines VA: " << message << std::endl; +} \ No newline at end of file diff --git a/esp/resources/gatoolv2_icon.ico b/esp/resources/gatoolv2_icon.ico new file mode 100644 index 0000000..843ee05 Binary files /dev/null and b/esp/resources/gatoolv2_icon.ico differ diff --git a/esp/resources/manifest-32.xml b/esp/resources/manifest-32.xml new file mode 100644 index 0000000..a6ef7cc --- /dev/null +++ b/esp/resources/manifest-32.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/esp/resources/manifest-64.xml b/esp/resources/manifest-64.xml new file mode 100644 index 0000000..d6830a5 --- /dev/null +++ b/esp/resources/manifest-64.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/esp/resources/resources-32.rc b/esp/resources/resources-32.rc new file mode 100644 index 0000000..69c5770 --- /dev/null +++ b/esp/resources/resources-32.rc @@ -0,0 +1,39 @@ +#define APSTUDIO_READONLY_SYMBOLS +#include "winres.h" +#include "winuser.h" +#undef APSTUDIO_READONLY_SYMBOLS + +#include "constants.h" + +APP_ICON ICON "gatoolv2_icon.ico" + +1 RT_MANIFEST "manifest-32.xml" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VER_FILEVERSION + PRODUCTVERSION VER_PRODUCTVERSION + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS VER_DEBUG + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", VER_COMPANY_NAME + VALUE "FileDescription", VER_FILE_DESCRIPTION + VALUE "FileVersion", VER_FILEVERSION_STR + VALUE "InternalName", VER_INTERNAL_NAME + VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT + VALUE "OriginalFilename", VER_ORIGINAL_FILE_NAME + VALUE "ProductName", VER_PRODUCT_NAME " 32" + VALUE "ProductVersion", VER_PRODUCTVERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END \ No newline at end of file diff --git a/esp/resources/resources-64.rc b/esp/resources/resources-64.rc new file mode 100644 index 0000000..6edc8da --- /dev/null +++ b/esp/resources/resources-64.rc @@ -0,0 +1,39 @@ +#define APSTUDIO_READONLY_SYMBOLS +#include "winres.h" +#include "winuser.h" +#undef APSTUDIO_READONLY_SYMBOLS + +#include "constants.h" + +APP_ICON ICON "gatoolv2_icon.ico" + +1 RT_MANIFEST "manifest-64.xml" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VER_FILEVERSION + PRODUCTVERSION VER_PRODUCTVERSION + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS VER_DEBUG + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", VER_COMPANY_NAME + VALUE "FileDescription", VER_FILE_DESCRIPTION + VALUE "FileVersion", VER_FILEVERSION_STR + VALUE "InternalName", VER_INTERNAL_NAME + VALUE "LegalCopyright", VER_LEGAL_COPYRIGHT + VALUE "OriginalFilename", VER_ORIGINAL_FILE_NAME + VALUE "ProductName", VER_PRODUCT_NAME " 64" + VALUE "ProductVersion", VER_PRODUCTVERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END \ No newline at end of file diff --git a/ixwebsocket/CMakeLists.txt b/ixwebsocket/CMakeLists.txt index 8edfa05..fa006a6 100644 --- a/ixwebsocket/CMakeLists.txt +++ b/ixwebsocket/CMakeLists.txt @@ -82,11 +82,11 @@ elseif(UNIX) ${OPENSSL_LIBRARIES} ) elseif(WIN32) - if (BIT STREQUAL "32") - message("Building ixwebsocket for Windows ${BIT} into ${PROJECT_BINARY_DIR}/ESP/${PLUGIN_NAME}") + if (NOT XP) + message("Building ixwebsocket for Windows ${BIT} into ${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}") set_target_properties(ixwebsocket PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/ESP/${PLUGIN_NAME}" + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/ESP/${BIT}/${PLUGIN_NAME}" ) else() message("Building fileixwebsocket for Windows ${BIT} into ${PROJECT_BINARY_DIR}/X-Plane/${PLUGIN_NAME}/${BIT}") diff --git a/toolchain-win-32.cmake b/toolchain-win-32.cmake index a928cbc..6f3f6c0 100644 --- a/toolchain-win-32.cmake +++ b/toolchain-win-32.cmake @@ -5,6 +5,7 @@ set(CMAKE_SYSTEM_VERSION 7) # which compilers to use for C and C++ set(CMAKE_C_COMPILER i686-w64-mingw32-clang) set(CMAKE_CXX_COMPILER i686-w64-mingw32-clang++) +set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) # where is the target environment located set(CMAKE_FIND_ROOT_PATH /opt/llvm-mingw/) diff --git a/toolchain-win-64.cmake b/toolchain-win-64.cmake index 3fc5f5f..8977513 100644 --- a/toolchain-win-64.cmake +++ b/toolchain-win-64.cmake @@ -5,6 +5,7 @@ set(CMAKE_SYSTEM_VERSION 7) # which compilers to use for C and C++ set(CMAKE_C_COMPILER x86_64-w64-mingw32-clang) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-clang++) +set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) # where is the target environment located set(CMAKE_FIND_ROOT_PATH /opt/llvm-mingw/) diff --git a/utilities/include/constants.h b/utilities/include/constants.h index 66609bf..b34643f 100644 --- a/utilities/include/constants.h +++ b/utilities/include/constants.h @@ -5,6 +5,28 @@ #define BASE_DIRECTORY "Resources/plugins/GAConnector/" #else #define BASE_DIRECTORY "./" + +#define APP_ICON 100 +#define TRAY_ICON_ID 0xAFFE +#define TRAY_MESSAGE 0xAFFE +#define WINDOW_CLASS "GermanAirlinesVA_GAConnector" + +#define VER_FILEVERSION 1, 0, 0, 15 +#define VER_FILEVERSION_STR "1.0.0.15\0" +#define VER_PRODUCTVERSION 1, 0, 0, 0 +#define VER_PRODUCTVERSION_STR "1.0\0" +#ifndef DEBUG +#define VER_DEBUG 0 +#else +#define VER_DEBUG VS_FF_DEBUG +#endif + +#define VER_COMPANY_NAME "German Airlines VA" +#define VER_FILE_DESCRIPTION "Verbindet den Simulator mit der GA" +#define VER_INTERNAL_NAME "GA Connector" +#define VER_LEGAL_COPYRIGHT "2022 German Airlines VA" +#define VER_ORIGINAL_FILE_NAME "GA Connector.exe" +#define VER_PRODUCT_NAME "GA Connector" #endif #define XPLANE_CUSTOM_SCENERY "Custom Scenery/scenery_packs.ini" diff --git a/xplugin/CMakeLists.txt b/xplugin/CMakeLists.txt index 6de4dd1..5f193e5 100644 --- a/xplugin/CMakeLists.txt +++ b/xplugin/CMakeLists.txt @@ -48,7 +48,7 @@ if(APPLE) set_target_properties(germanairlinesva_xplugin PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/X-Plane/${PLUGIN_NAME} INSTALL_RPATH "@loader_path" - OUTPUT_NAME mac + OUTPUT_NAME "mac" ) target_compile_definitions(germanairlinesva_xplugin PUBLIC @@ -72,7 +72,7 @@ elseif(UNIX) set_target_properties(germanairlinesva_xplugin PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/X-Plane/${PLUGIN_NAME}/${BIT} INSTALL_RPATH "\$ORIGIN" - OUTPUT_NAME lin + OUTPUT_NAME "lin" ) target_compile_definitions(germanairlinesva_xplugin PUBLIC @@ -87,7 +87,7 @@ elseif(WIN32) set_target_properties(germanairlinesva_xplugin PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/X-Plane/${PLUGIN_NAME}/${BIT} - OUTPUT_NAME win + OUTPUT_NAME "win" ) target_compile_definitions(germanairlinesva_xplugin PUBLIC