From 3187bf00e9c97c7c799d1d2e3c52d9f5db0ae693 Mon Sep 17 00:00:00 2001 From: Kilian Kurt Hofmann Date: Sat, 14 Jan 2017 01:02:17 +0100 Subject: [PATCH] Interface with arduino and FSX done, working order established --- TQInterface/TQInterface.cpp | 173 +++++++++++++++++++++++++++++++++--- TQInterface/stdafx.h | 14 --- 2 files changed, 161 insertions(+), 26 deletions(-) diff --git a/TQInterface/TQInterface.cpp b/TQInterface/TQInterface.cpp index 8466bd9..bd16d27 100644 --- a/TQInterface/TQInterface.cpp +++ b/TQInterface/TQInterface.cpp @@ -1,4 +1,4 @@ -// Aircraft data and mode mapping via config file in aircraft folder +// Mode mapping via config file in aircraft folder #include "stdafx.h" @@ -8,6 +8,16 @@ 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 ... "); @@ -18,12 +28,11 @@ void setupDefinitions() { hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR); FILE *fp = fopen(throttleQuadrantCFG, "r"); char * line = NULL; - uint8_t numEngines = 0; - bool hasPropeller = false; bool hasMixture = false; if (fp == NULL) { printf("\nThe application cannot run without a valid tq.cfg."); + arduino->writeSerialPort("q", 1); exit(EXIT_FAILURE); } @@ -50,28 +59,30 @@ void setupDefinitions() { free(id); } - fclose(fp); - fp = fopen("dump.hex", "wb"); - /*DEBUG*/fwrite(&init, 1, sizeof(initialization), fp); 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"); @@ -80,21 +91,25 @@ void setupDefinitions() { 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"); @@ -103,6 +118,7 @@ void setupDefinitions() { 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"); @@ -115,21 +131,25 @@ void setupDefinitions() { 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 MIXTURE 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"); @@ -138,6 +158,7 @@ void setupDefinitions() { 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"); @@ -150,16 +171,19 @@ void setupDefinitions() { 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 MIXTURE 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"); @@ -168,6 +192,7 @@ void setupDefinitions() { 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"); @@ -179,6 +204,7 @@ void setupDefinitions() { 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"); @@ -195,8 +221,12 @@ void setupDefinitions() { default: break; } + sizeOfDataToSendToFSX = sizeof(engineAll); } printf("done!"); + arduino->writeSerialPort("i", 1); + arduino->writeSerialPort((char *)&init, sizeof(initialization)); + ready = true; } // SimConnect callback @@ -293,8 +323,6 @@ void throttleControl() hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AC_DATA, "NUMBER OF ENGINES", "number"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AC_DATA, "THROTTLE LOWER LIMIT", "percent"); - - //hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_LEVER_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(tc), &tc); // Request a simulation started event hr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SIM_START, "SimStart"); @@ -302,7 +330,112 @@ void throttleControl() while (0 == quit) { SimConnect_CallDispatch(hSimConnect, MyDispatchProcTC, NULL); - Sleep(1); + 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); @@ -311,6 +444,22 @@ void throttleControl() int __cdecl _tmain(int argc, _TCHAR* argv[]) { - throttleControl(); + // 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; } diff --git a/TQInterface/stdafx.h b/TQInterface/stdafx.h index accc6ad..4532750 100644 --- a/TQInterface/stdafx.h +++ b/TQInterface/stdafx.h @@ -59,20 +59,6 @@ struct aircraftData { }; // Structs for engines -struct engineJustThrottle { - double throttlePercent; -}; - -struct engineThrottleAndPropeller { - double throttlePercent; - double propellerPercent; -}; - -struct engineThrottleAndMixture { - double throttlePercent; - double mixturePercent; -}; - struct engineAll { double throttlePercent; double propellerPrecent;