Correct serial speed

On ground check
Reset of arduino on ac change
send only if changed
This commit is contained in:
Kilian Kurt Hofmann 2017-01-15 15:18:32 +01:00
parent 3187bf00e9
commit 14c6361fbd
3 changed files with 92 additions and 20 deletions

View File

@ -34,7 +34,7 @@ SerialPort::SerialPort(char *portName)
printf("failed to get current serial parameters"); printf("failed to get current serial parameters");
} }
else { else {
dcbSerialParameters.BaudRate = CBR_9600; dcbSerialParameters.BaudRate = CBR_115200;
dcbSerialParameters.ByteSize = 8; dcbSerialParameters.ByteSize = 8;
dcbSerialParameters.StopBits = ONESTOPBIT; dcbSerialParameters.StopBits = ONESTOPBIT;
dcbSerialParameters.Parity = NOPARITY; dcbSerialParameters.Parity = NOPARITY;

View File

@ -13,12 +13,18 @@ values potValues;
int sizeOfDataToSendToFSX = 0; int sizeOfDataToSendToFSX = 0;
bool ready = false; bool ready = false;
bool hasPropeller = false; bool hasPropeller = false;
bool onGround = true;
engineAll eAOne; engineAll eAOne;
engineAll eATwo; engineAll eATwo;
engineAll eAThree; engineAll eAThree;
engineAll eAFour; engineAll eAFour;
engineAll lastSaveOne;
engineAll lastSaveTwo;
engineAll lastSaveThree;
engineAll lastSaveFour;
void setupDefinitions() { void setupDefinitions() {
printf("\nSetting up ... "); printf("\nSetting up ... ");
HRESULT hr; HRESULT hr;
@ -224,8 +230,11 @@ void setupDefinitions() {
sizeOfDataToSendToFSX = sizeof(engineAll); sizeOfDataToSendToFSX = sizeof(engineAll);
} }
printf("done!"); printf("done!");
arduino->writeSerialPort("r", 1);
arduino->writeSerialPort("i", 1); arduino->writeSerialPort("i", 1);
arduino->writeSerialPort((char *)&init, sizeof(initialization)); 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; 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; SIMCONNECT_RECV_SIMOBJECT_DATA *data = (SIMCONNECT_RECV_SIMOBJECT_DATA *)pData;
switch (data->dwRequestID) { switch (data->dwRequestID) {
case AC_ON_GROUND_REQUEST:
{
printf("\nOn ground: %f", &data->dwData);
onGround = (int)&data->dwData;
break;
}
case AC_DATA_REQUEST: case AC_DATA_REQUEST:
{ {
printf("Aircraft data retrieved."); 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, "NUMBER OF ENGINES", "number");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AC_DATA, "THROTTLE LOWER LIMIT", "percent"); 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 // Request a simulation started event
hr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SIM_START, "SimStart"); hr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SIM_START, "SimStart");
@ -345,15 +361,19 @@ void throttleControl()
lastSymbol = 'T'; lastSymbol = 'T';
switch (currentEngine) { switch (currentEngine) {
case 1: case 1:
lastSaveOne.throttlePercent = eAOne.throttlePercent;
eAOne.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; eAOne.throttlePercent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
case 2: case 2:
lastSaveTwo.throttlePercent = eATwo.throttlePercent;
eATwo.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; eATwo.throttlePercent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
case 3: case 3:
lastSaveThree.throttlePercent = eAThree.throttlePercent;
eAThree.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; eAThree.throttlePercent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
case 4: case 4:
lastSaveFour.throttlePercent = eAFour.throttlePercent;
eAFour.throttlePercent = (double)potValues.leverValuesInPercent[3 - i]; eAFour.throttlePercent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
} }
@ -364,15 +384,19 @@ void throttleControl()
lastSymbol = 'P'; lastSymbol = 'P';
switch (currentEngine) { switch (currentEngine) {
case 1: case 1:
lastSaveOne.propellerPrecent = eAOne.propellerPrecent;
eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
case 2: case 2:
lastSaveTwo.propellerPrecent = eATwo.propellerPrecent;
eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
case 3: case 3:
lastSaveThree.propellerPrecent = eAThree.propellerPrecent;
eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
case 4: case 4:
lastSaveFour.propellerPrecent = eAFour.propellerPrecent;
eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
break; break;
} }
@ -383,28 +407,44 @@ void throttleControl()
lastSymbol = 'M'; lastSymbol = 'M';
switch (currentEngine) { switch (currentEngine) {
case 1: case 1:
if (hasPropeller) if (hasPropeller) {
lastSaveOne.mixturePercent = eAOne.mixturePercent;
eAOne.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; eAOne.mixturePercent = (double)potValues.leverValuesInPercent[3 - i];
else }
else {
lastSaveOne.mixturePercent = eAOne.propellerPrecent;
eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eAOne.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
}
break; break;
case 2: case 2:
if (hasPropeller) if (hasPropeller) {
lastSaveTwo.mixturePercent = eATwo.mixturePercent;
eATwo.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; eATwo.mixturePercent = (double)potValues.leverValuesInPercent[3 - i];
else }
else {
lastSaveTwo.mixturePercent = eATwo.propellerPrecent;
eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eATwo.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
}
break; break;
case 3: case 3:
if (hasPropeller) if (hasPropeller) {
lastSaveThree.mixturePercent = eAThree.mixturePercent;
eAThree.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; eAThree.mixturePercent = (double)potValues.leverValuesInPercent[3 - i];
else }
else {
lastSaveThree.mixturePercent = eAThree.propellerPrecent;
eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eAThree.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
}
break; break;
case 4: case 4:
if (hasPropeller) if (hasPropeller) {
lastSaveFour.mixturePercent = eAFour.mixturePercent;
eAFour.mixturePercent = (double)potValues.leverValuesInPercent[3 - i]; eAFour.mixturePercent = (double)potValues.leverValuesInPercent[3 - i];
else }
else {
lastSaveFour.mixturePercent = eAFour.mixturePercent;
eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i]; eAFour.propellerPrecent = (double)potValues.leverValuesInPercent[3 - i];
}
break; break;
} }
currentEngine++; currentEngine++;
@ -414,22 +454,52 @@ void throttleControl()
switch (numEngines) switch (numEngines)
{ {
case 1: 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; break;
case 2: case 2:
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); if (lastSaveOne.throttlePercent != eAOne.throttlePercent ||
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); (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; break;
case 3: case 3:
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); if (lastSaveOne.throttlePercent != eAOne.throttlePercent ||
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); (hasPropeller && (lastSaveOne.propellerPrecent != eAOne.propellerPrecent || lastSaveOne.mixturePercent != eAOne.mixturePercent)) ||
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_THREE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAThree); (!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; break;
case 4: case 4:
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAOne); if (lastSaveOne.throttlePercent != eAOne.throttlePercent ||
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_TWO, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eATwo); (hasPropeller && (lastSaveOne.propellerPrecent != eAOne.propellerPrecent || lastSaveOne.mixturePercent != eAOne.mixturePercent)) ||
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_THREE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAThree); (!hasPropeller && (lastSaveOne.mixturePercent != eAOne.propellerPrecent)))
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_ENGINE_FOUR, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeOfDataToSendToFSX, &eAFour); 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; break;
default: default:
break; break;
@ -456,7 +526,7 @@ int __cdecl _tmain(int argc, _TCHAR* argv[])
int hasRead = arduino->readSerialPort(&ready, 1); int hasRead = arduino->readSerialPort(&ready, 1);
while (hasRead != 1 && ready != 'r') while (hasRead != 1 && ready != 'r')
{ {
// EMPTY WAIT FOR CALIBRATION
} }
// Start TQ // Start TQ
throttleControl(); throttleControl();

View File

@ -40,6 +40,7 @@ static enum EVENT_ID {
// Data definition IDs, engines dynamically added // Data definition IDs, engines dynamically added
static enum DATA_DEFINE_ID { static enum DATA_DEFINE_ID {
DEFINITION_AC_ON_GROUND,
DEFINITION_AC_DATA, DEFINITION_AC_DATA,
DEFINITION_ENGINE_ONE, DEFINITION_ENGINE_ONE,
DEFINITION_ENGINE_TWO, DEFINITION_ENGINE_TWO,
@ -50,6 +51,7 @@ static enum DATA_DEFINE_ID {
// Request IDs // Request IDs
static enum REQUEST_ID { static enum REQUEST_ID {
AC_DATA_REQUEST, AC_DATA_REQUEST,
AC_ON_GROUND_REQUEST,
}; };
// Struct for ac data // Struct for ac data