// Mode mapping via config file in aircraft folder #include "stdafx.h" // Things for execution bool quit = 0; HANDLE hSimConnect = NULL; char *throttleQuadrantCFG; initialization init; uint8_t numEngines = 0; SerialPort *arduino; values potValues; int sizeOfDataToSendToFSX = 0; bool ready = false; bool hasPropeller = false; engineAll eAOne; engineAll eATwo; engineAll eAThree; engineAll eAFour; void setupDefinitions() { printf("\nSetting up ... "); HRESULT hr; hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE); hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO); hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE); hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR); FILE *fp = fopen(throttleQuadrantCFG, "r"); char * line = NULL; bool hasMixture = false; if (fp == NULL) { printf("\nThe application cannot run without a valid tq.cfg."); arduino->writeSerialPort("q", 1); exit(EXIT_FAILURE); } while ((line = readLine(fp)) != NULL) { // Parse char *assign = strstr(line, "="); char *id = (char *)calloc(13, 1); memcpy(id, line, ((long)assign - (long)line)); if (strcmp(trimwhitespace(id), "numModes") == 0) init.numModes = atoi(assign + 1); else if (strcmp(trimwhitespace(id), "hasPropeller") == 0) hasPropeller = atoi(assign + 1); else if (strcmp(trimwhitespace(id), "hasMixture") == 0) hasMixture = atoi(assign + 1); else if (strcmp(trimwhitespace(id), "mode1") == 0) strcpy(init.modes[0], strrev(assign + 1)); else if (strcmp(trimwhitespace(id), "mode2") == 0) strcpy(init.modes[1], strrev(assign + 1)); else if (strcmp(trimwhitespace(id), "mode3") == 0) strcpy(init.modes[2], strrev(assign + 1)); free(line); free(id); } fclose(fp); // Setup Data definitions printf("AC has %i eng, prop: %d, mix: %d ... ", numEngines, hasPropeller, hasMixture); if (!hasPropeller && !hasMixture) { switch (numEngines) { case 1: printf(" set one eng t mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); break; case 2: printf(" set two eng t mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); break; case 3: printf(" set three eng t mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); break; case 4: printf(" set four eng t mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "percent"); break; default: break; } sizeOfDataToSendToFSX = sizeof(double); } else if (hasPropeller && !hasMixture) { switch (numEngines) { case 1: printf(" set one eng tp mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); break; case 2: printf(" set two eng tp mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG PROPELLER LEVER POSITION:2", "percent"); break; case 3: printf(" set three eng tp mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG PROPELLER LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "percent"); break; case 4: printf(" set four eng tp mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG PROPELLER LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG PROPELLER LEVER POSITION:4", "percent"); break; default: break; } sizeOfDataToSendToFSX = 2*sizeof(double); } else if (!hasPropeller && hasMixture) { switch (numEngines) { case 1: printf(" set one eng tm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); break; case 2: printf(" set two eng tm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG MIXTURE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG MIXTURE LEVER POSITION:2", "percent"); break; case 3: printf(" set three eng tm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG MIXTURE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG MIXTURE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent"); break; case 4: printf(" set four eng tm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG MIXTURE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG MIXTURE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG MIXTURE LEVER POSITION:4", "percent"); break; default: break; } sizeOfDataToSendToFSX = 2*sizeof(double); } else if (hasPropeller && hasMixture) { switch (numEngines) { case 1: printf(" set one eng tpm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG MIXTURE LEVER POSITION:1", "percent"); break; case 2: printf(" set two eng tpm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG PROPELLER LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG MIXTURE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG MIXTURE LEVER POSITION:2", "percent"); break; case 3: printf(" set three eng tpm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG PROPELLER LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG MIXTURE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG MIXTURE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent"); break; case 4: printf(" set four eng tpm mode ... "); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG PROPELLER LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG PROPELLER LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG PROPELLER LEVER POSITION:4", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG MIXTURE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG MIXTURE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG MIXTURE LEVER POSITION:4", "percent"); break; default: break; } sizeOfDataToSendToFSX = sizeof(engineAll); } printf("done!"); arduino->writeSerialPort("i", 1); arduino->writeSerialPort((char *)&init, sizeof(initialization)); ready = true; } // SimConnect callback void CALLBACK MyDispatchProcTC(SIMCONNECT_RECV* pData, DWORD cbData, void *pContext) { HRESULT hr; switch (pData->dwID) { case SIMCONNECT_RECV_ID_SIMOBJECT_DATA: { SIMCONNECT_RECV_SIMOBJECT_DATA *data = (SIMCONNECT_RECV_SIMOBJECT_DATA *)pData; switch (data->dwRequestID) { case AC_DATA_REQUEST: { printf("Aircraft data retrieved."); init.maxRev = (int8_t)((aircraftData *)&data->dwData)->lowerThrottleLimit; numEngines = (uint8_t)((aircraftData *)&data->dwData)->numEngines; setupDefinitions(); break; } default: break; } break; } case SIMCONNECT_RECV_ID_SYSTEM_STATE: { SIMCONNECT_RECV_SYSTEM_STATE *state = (SIMCONNECT_RECV_SYSTEM_STATE *)pData; switch (state->dwRequestID) { // Receive loaded aircraft name, set path to tq.cfg case REQUEST_SYSTEM_STATE: { char *path = strrev(strstr(strrev(state->szString), "\\")); throttleQuadrantCFG = (char *)calloc(strlen(path) + 6, 1); strcpy(throttleQuadrantCFG, path); strcat(throttleQuadrantCFG, "tq.cfg"); printf("%s loaded.", throttleQuadrantCFG); printf("\nRetrieving aicraft data ... "); hr = SimConnect_RequestDataOnSimObject(hSimConnect, AC_DATA_REQUEST, DEFINITION_AC_DATA, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE); break; } default: break; } break; } case SIMCONNECT_RECV_ID_EVENT: { SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT *)pData; switch (evt->uEventID) { case EVENT_SIM_START: { // Send this request to get the user aircraft id printf("\nRequesting loaded AC path ... "); hr = SimConnect_RequestSystemState(hSimConnect, REQUEST_SYSTEM_STATE, "AircraftLoaded"); } break; default: break; } break; } case SIMCONNECT_RECV_ID_QUIT: { quit = 1; break; } default: break; } } void throttleControl() { HRESULT hr; if (SUCCEEDED(SimConnect_Open(&hSimConnect, "Throttle Control", NULL, 0, 0, 0))) { printf("\nConnected to Flight Simulator!"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AC_DATA, "NUMBER OF ENGINES", "number"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AC_DATA, "THROTTLE LOWER LIMIT", "percent"); // Request a simulation started event hr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SIM_START, "SimStart"); while (0 == quit) { SimConnect_CallDispatch(hSimConnect, MyDispatchProcTC, NULL); if (ready) { arduino->writeSerialPort("s", 1); arduino->readSerialPort((char *)&potValues, sizeof(values)); // Set Values int currentEngine = 1; char lastSymbol; for (int i = 3; i >= 0; i--) { if (init.modes[potValues.mode][i] != lastSymbol) currentEngine = 1; if (init.modes[potValues.mode][i] == 'T') { lastSymbol = 'T'; switch (currentEngine) { case 1: eAOne.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; case 2: eATwo.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; case 3: eAThree.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; case 4: eAFour.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; } currentEngine++; } else if (init.modes[potValues.mode][i] == 'P') { lastSymbol = 'P'; switch (currentEngine) { case 1: eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 2: eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 3: eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 4: eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; } currentEngine++; } else if (init.modes[potValues.mode][i] == 'M') { lastSymbol = 'M'; switch (currentEngine) { case 1: if (hasPropeller) eAOne.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; else eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 2: if (hasPropeller) eATwo.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; else eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 3: if (hasPropeller) eAThree.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; else eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 4: if (hasPropeller) eAFour.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; else eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; } currentEngine++; } } // Send to sim switch (numEngines) { case 1: hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); break; case 2: hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); break; case 3: hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_THREE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAThree); break; case 4: hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_THREE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAThree); hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_FOUR, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAFour); break; default: break; } } Sleep(10); } hr = SimConnect_Close(hSimConnect); } } int __cdecl _tmain(int argc, _TCHAR* argv[]) { // Open com to arduino char* portName = "\\\\.\\COM3"; arduino = new SerialPort(portName); if (arduino->isConnected()) { // Calibrate printf("\nCalibration ... "); arduino->writeSerialPort("c", 1); printf("done."); char ready; int hasRead = arduino->readSerialPort(&ready, 1); while (hasRead != 1 && ready != 'r') { } // Start TQ throttleControl(); } return 0; }