Interface with arduino and FSX done, working order established
This commit is contained in:
parent
cb733f03f7
commit
3187bf00e9
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user