Interface with arduino and FSX done, working order established

This commit is contained in:
Kilian Kurt Hofmann 2017-01-14 01:02:17 +01:00
parent cb733f03f7
commit 3187bf00e9
2 changed files with 161 additions and 26 deletions

View File

@ -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;
}

View File

@ -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;