From 14c6361fbd96b26e41ab4873f861c348ce84fe6b Mon Sep 17 00:00:00 2001 From: Kilian Kurt Hofmann Date: Sun, 15 Jan 2017 15:18:32 +0100 Subject: [PATCH] Correct serial speed On ground check Reset of arduino on ac change send only if changed --- TQInterface/SerialPort.cpp | 2 +- TQInterface/TQInterface.cpp | 108 +++++++++++++++++++++++++++++------- TQInterface/stdafx.h | 2 + 3 files changed, 92 insertions(+), 20 deletions(-) diff --git a/TQInterface/SerialPort.cpp b/TQInterface/SerialPort.cpp index 4d749bc..8072d40 100644 --- a/TQInterface/SerialPort.cpp +++ b/TQInterface/SerialPort.cpp @@ -34,7 +34,7 @@ SerialPort::SerialPort(char *portName) printf("failed to get current serial parameters"); } else { - dcbSerialParameters.BaudRate = CBR_9600; + dcbSerialParameters.BaudRate = CBR_115200; dcbSerialParameters.ByteSize = 8; dcbSerialParameters.StopBits = ONESTOPBIT; dcbSerialParameters.Parity = NOPARITY; diff --git a/TQInterface/TQInterface.cpp b/TQInterface/TQInterface.cpp index bd16d27..5e772e4 100644 --- a/TQInterface/TQInterface.cpp +++ b/TQInterface/TQInterface.cpp @@ -13,12 +13,18 @@ values potValues; int sizeOfDataToSendToFSX = 0; bool ready = false; bool hasPropeller = false; +bool onGround = true; engineAll eAOne; engineAll eATwo; engineAll eAThree; engineAll eAFour; +engineAll lastSaveOne; +engineAll lastSaveTwo; +engineAll lastSaveThree; +engineAll lastSaveFour; + void setupDefinitions() { printf("\nSetting up ... "); HRESULT hr; @@ -224,8 +230,11 @@ void setupDefinitions() { sizeOfDataToSendToFSX = sizeof(engineAll); } printf("done!"); + arduino->writeSerialPort("r", 1); arduino->writeSerialPort("i", 1); arduino->writeSerialPort((char *)&init, sizeof(initialization)); + // Request AC_ON_GROUND data every frame for rev engagement + hr = SimConnect_RequestDataOnSimObject(hSimConnect, AC_ON_GROUND_REQUEST, DEFINITION_AC_ON_GROUND, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SIM_FRAME); ready = true; } @@ -241,6 +250,12 @@ void CALLBACK MyDispatchProcTC(SIMCONNECT_RECV* pData, DWORD cbData, void *pCont SIMCONNECT_RECV_SIMOBJECT_DATA *data = (SIMCONNECT_RECV_SIMOBJECT_DATA *)pData; switch (data->dwRequestID) { + case AC_ON_GROUND_REQUEST: + { + printf("\nOn ground: %f", &data->dwData); + onGround = (int)&data->dwData; + break; + } case AC_DATA_REQUEST: { printf("Aircraft data retrieved."); @@ -323,6 +338,7 @@ 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_AddToDataDefinition(hSimConnect, DEFINITION_AC_ON_GROUND, "SIM ON GROUND", "bool"); // Request a simulation started event hr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SIM_START, "SimStart"); @@ -345,15 +361,19 @@ void throttleControl() lastSymbol = 'T'; switch (currentEngine) { case 1: + lastSaveOne.throttlePercent = eAOne.throttlePercent; eAOne.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; case 2: + lastSaveTwo.throttlePercent = eATwo.throttlePercent; eATwo.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; case 3: + lastSaveThree.throttlePercent = eAThree.throttlePercent; eAThree.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; case 4: + lastSaveFour.throttlePercent = eAFour.throttlePercent; eAFour.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; break; } @@ -364,15 +384,19 @@ void throttleControl() lastSymbol = 'P'; switch (currentEngine) { case 1: + lastSaveOne.propellerPrecent = eAOne.propellerPrecent; eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 2: + lastSaveTwo.propellerPrecent = eATwo.propellerPrecent; eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 3: + lastSaveThree.propellerPrecent = eAThree.propellerPrecent; eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; case 4: + lastSaveFour.propellerPrecent = eAFour.propellerPrecent; eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; break; } @@ -383,28 +407,44 @@ void throttleControl() lastSymbol = 'M'; switch (currentEngine) { case 1: - if (hasPropeller) + if (hasPropeller) { + lastSaveOne.mixturePercent = eAOne.mixturePercent; eAOne.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; - else + } + else { + lastSaveOne.mixturePercent = eAOne.propellerPrecent; eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; + } break; case 2: - if (hasPropeller) + if (hasPropeller) { + lastSaveTwo.mixturePercent = eATwo.mixturePercent; eATwo.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; - else + } + else { + lastSaveTwo.mixturePercent = eATwo.propellerPrecent; eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; + } break; case 3: - if (hasPropeller) + if (hasPropeller) { + lastSaveThree.mixturePercent = eAThree.mixturePercent; eAThree.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; - else + } + else { + lastSaveThree.mixturePercent = eAThree.propellerPrecent; eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; + } break; case 4: - if (hasPropeller) + if (hasPropeller) { + lastSaveFour.mixturePercent = eAFour.mixturePercent; eAFour.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; - else + } + else { + lastSaveFour.mixturePercent = eAFour.mixturePercent; eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; + } break; } currentEngine++; @@ -414,22 +454,52 @@ void throttleControl() switch (numEngines) { case 1: - hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); + if (lastSaveOne.throttlePercent != eAOne.throttlePercent || + (hasPropeller && (lastSaveOne.propellerPrecent != eAOne.propellerPrecent || lastSaveOne.mixturePercent != eAOne.mixturePercent)) || + (!hasPropeller && (lastSaveOne.mixturePercent != eAOne.propellerPrecent))) + 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); + if (lastSaveOne.throttlePercent != eAOne.throttlePercent || + (hasPropeller && (lastSaveOne.propellerPrecent != eAOne.propellerPrecent || lastSaveOne.mixturePercent != eAOne.mixturePercent)) || + (!hasPropeller && (lastSaveOne.mixturePercent != eAOne.propellerPrecent))) + hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); + if (lastSaveTwo.throttlePercent != eATwo.throttlePercent || + (hasPropeller && (lastSaveTwo.propellerPrecent != eATwo.propellerPrecent || lastSaveTwo.mixturePercent != eATwo.mixturePercent)) || + (!hasPropeller && (lastSaveTwo.mixturePercent != eATwo.propellerPrecent))) + 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); + if (lastSaveOne.throttlePercent != eAOne.throttlePercent || + (hasPropeller && (lastSaveOne.propellerPrecent != eAOne.propellerPrecent || lastSaveOne.mixturePercent != eAOne.mixturePercent)) || + (!hasPropeller && (lastSaveOne.mixturePercent != eAOne.propellerPrecent))) + hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); + if (lastSaveTwo.throttlePercent != eATwo.throttlePercent || + (hasPropeller && (lastSaveTwo.propellerPrecent != eATwo.propellerPrecent || lastSaveTwo.mixturePercent != eATwo.mixturePercent)) || + (!hasPropeller && (lastSaveTwo.mixturePercent != eATwo.propellerPrecent))) + hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); + if (lastSaveThree.throttlePercent != eAThree.throttlePercent || + (hasPropeller && (lastSaveThree.propellerPrecent != eAThree.propellerPrecent || lastSaveThree.mixturePercent != eAThree.mixturePercent)) || + (!hasPropeller && (lastSaveThree.mixturePercent != eAThree.propellerPrecent))) + 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); + if (lastSaveOne.throttlePercent != eAOne.throttlePercent || + (hasPropeller && (lastSaveOne.propellerPrecent != eAOne.propellerPrecent || lastSaveOne.mixturePercent != eAOne.mixturePercent)) || + (!hasPropeller && (lastSaveOne.mixturePercent != eAOne.propellerPrecent))) + hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); + if (lastSaveTwo.throttlePercent != eATwo.throttlePercent || + (hasPropeller && (lastSaveTwo.propellerPrecent != eATwo.propellerPrecent || lastSaveTwo.mixturePercent != eATwo.mixturePercent)) || + (!hasPropeller && (lastSaveTwo.mixturePercent != eATwo.propellerPrecent))) + hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); + if (lastSaveThree.throttlePercent != eAThree.throttlePercent || + (hasPropeller && (lastSaveThree.propellerPrecent != eAThree.propellerPrecent || lastSaveThree.mixturePercent != eAThree.mixturePercent)) || + (!hasPropeller && (lastSaveThree.mixturePercent != eAThree.propellerPrecent))) + hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_THREE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAThree); + if (lastSaveFour.throttlePercent != eAFour.throttlePercent || + (hasPropeller && (lastSaveFour.propellerPrecent != eAFour.propellerPrecent || lastSaveFour.mixturePercent != eAFour.mixturePercent)) || + (!hasPropeller && (lastSaveFour.mixturePercent != eAFour.propellerPrecent))) + hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_FOUR, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAFour); break; default: break; @@ -456,7 +526,7 @@ int __cdecl _tmain(int argc, _TCHAR* argv[]) int hasRead = arduino->readSerialPort(&ready, 1); while (hasRead != 1 && ready != 'r') { - + // EMPTY WAIT FOR CALIBRATION } // Start TQ throttleControl(); diff --git a/TQInterface/stdafx.h b/TQInterface/stdafx.h index 4532750..ae40894 100644 --- a/TQInterface/stdafx.h +++ b/TQInterface/stdafx.h @@ -40,6 +40,7 @@ static enum EVENT_ID { // Data definition IDs, engines dynamically added static enum DATA_DEFINE_ID { + DEFINITION_AC_ON_GROUND, DEFINITION_AC_DATA, DEFINITION_ENGINE_ONE, DEFINITION_ENGINE_TWO, @@ -50,6 +51,7 @@ static enum DATA_DEFINE_ID { // Request IDs static enum REQUEST_ID { AC_DATA_REQUEST, + AC_ON_GROUND_REQUEST, }; // Struct for ac data