Prepare for ARDUINO

This commit is contained in:
Kilian Kurt Hofmann 2017-01-13 22:30:06 +01:00
parent 00e307cccb
commit cb733f03f7
8 changed files with 392 additions and 147 deletions

View File

@ -0,0 +1,97 @@
/*
* Author: Manash Kumar Mandal
* Modified Library introduced in Arduino Playground which does not work
* This works perfectly
* LICENSE: MIT
*/
#include "SerialPort.h"
SerialPort::SerialPort(char *portName)
{
this->connected = false;
this->handler = CreateFileA(static_cast<LPCSTR>(portName),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (this->handler == INVALID_HANDLE_VALUE){
if (GetLastError() == ERROR_FILE_NOT_FOUND){
printf("ERROR: Handle was not attached. Reason: %s not available\n", portName);
}
else
{
printf("ERROR!!!");
}
}
else {
DCB dcbSerialParameters = {0};
if (!GetCommState(this->handler, &dcbSerialParameters)) {
printf("failed to get current serial parameters");
}
else {
dcbSerialParameters.BaudRate = CBR_9600;
dcbSerialParameters.ByteSize = 8;
dcbSerialParameters.StopBits = ONESTOPBIT;
dcbSerialParameters.Parity = NOPARITY;
dcbSerialParameters.fDtrControl = DTR_CONTROL_ENABLE;
if (!SetCommState(handler, &dcbSerialParameters))
{
printf("ALERT: could not set Serial port parameters\n");
}
else {
this->connected = true;
PurgeComm(this->handler, PURGE_RXCLEAR | PURGE_TXCLEAR);
Sleep(ARDUINO_WAIT_TIME);
}
}
}
}
SerialPort::~SerialPort()
{
if (this->connected){
this->connected = false;
CloseHandle(this->handler);
}
}
int SerialPort::readSerialPort(char *buffer, unsigned int buf_size)
{
DWORD bytesRead;
unsigned int toRead;
ClearCommError(this->handler, &this->errors, &this->status);
if (this->status.cbInQue > 0){
if (this->status.cbInQue > buf_size){
toRead = buf_size;
}
else toRead = this->status.cbInQue;
}
if (ReadFile(this->handler, buffer, toRead, &bytesRead, NULL)) return bytesRead;
return 0;
}
bool SerialPort::writeSerialPort(char *buffer, unsigned int buf_size)
{
DWORD bytesSend;
if (!WriteFile(this->handler, (void*) buffer, buf_size, &bytesSend, 0)){
ClearCommError(this->handler, &this->errors, &this->status);
return false;
}
else return true;
}
bool SerialPort::isConnected()
{
return this->connected;
}

35
TQInterface/SerialPort.h Normal file
View File

@ -0,0 +1,35 @@
/*
* Author: Manash Kumar Mandal
* Modified Library introduced in Arduino Playground which does not work
* This works perfectly
* LICENSE: MIT
*/
#ifndef SERIALPORT_H
#define SERIALPORT_H
#define ARDUINO_WAIT_TIME 2000
#define MAX_DATA_LENGTH 255
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
class SerialPort
{
private:
HANDLE handler;
bool connected;
COMSTAT status;
DWORD errors;
public:
SerialPort(char *portName);
~SerialPort();
int readSerialPort(char *buffer, unsigned int buf_size);
bool writeSerialPort(char *buffer, unsigned int buf_size);
bool isConnected();
};
#endif // SERIALPORT_H

View File

@ -0,0 +1,61 @@
#include "stdafx.h"
char *trimwhitespace(char *str)
{
char *end;
// Trim leading space
while (isspace((unsigned char)*str)) str++;
if (*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while (end > str && isspace((unsigned char)*end)) end--;
// Write new null terminator
*(end + 1) = 0;
return str;
}
char *readLine(FILE *file) {
if (file == NULL) {
printf("\nError: file pointer is null.");
exit(1);
}
int maximumLineLength = 128;
char *lineBuffer = (char *)malloc(sizeof(char) * maximumLineLength);
if (lineBuffer == NULL) {
printf("\nError allocating memory for line buffer.");
exit(1);
}
char ch = getc(file);
int count = 0;
while ((ch != '\n') && (ch != EOF)) {
if (count == maximumLineLength) {
maximumLineLength += 128;
lineBuffer = (char *)realloc(lineBuffer, maximumLineLength);
if (lineBuffer == NULL) {
printf("\nError reallocating space for line buffer.");
exit(1);
}
}
lineBuffer[count] = ch;
count++;
ch = getc(file);
}
lineBuffer[count] = '\0';
if (count > 0)
return lineBuffer;
else
return NULL;
}

View File

@ -9,123 +9,13 @@ char *throttleQuadrantCFG;
initialization init; initialization init;
uint8_t numEngines = 0; uint8_t numEngines = 0;
// Event to catch beginning
static enum EVENT_ID {
EVENT_SIM_START,
REQUEST_SYSTEM_STATE,
};
// Definitions for levers, dynamically added to SimConnect
static enum DATA_DEFINE_ID {
DEFINITION_AC_DATA,
DEFINITION_LEVER_ONE,
DEFINITION_LEVER_TWO,
DEFINITION_LEVER_THREE,
DEFINITION_LEVER_FOUR,
};
// Request ID
static enum REQUEST_ID {
AC_DATA_REQUEST,
};
// Struct for ac data
struct aircraftData {
double numEngines;
double lowerThrottleLimit;
};
// Structs for levers
struct engineJustThrottle {
double throttlePercent;
};
struct engineThrottleAndPropeller {
double throttlePercent;
double propellerPercent;
};
struct engineThrottleAndMixture {
double throttlePercent;
double mixturePercent;
};
struct engineAll {
double throttlePercent;
double propellerPrecent;
double mixturePercent;
};
//TESTING PURPOSE
engineJustThrottle tc;
char *trimwhitespace(char *str)
{
char *end;
// Trim leading space
while (isspace((unsigned char)*str)) str++;
if (*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while (end > str && isspace((unsigned char)*end)) end--;
// Write new null terminator
*(end + 1) = 0;
return str;
}
char *readLine(FILE *file) {
if (file == NULL) {
printf("\nError: file pointer is null.");
exit(1);
}
int maximumLineLength = 128;
char *lineBuffer = (char *)malloc(sizeof(char) * maximumLineLength);
if (lineBuffer == NULL) {
printf("\nError allocating memory for line buffer.");
exit(1);
}
char ch = getc(file);
int count = 0;
while ((ch != '\n') && (ch != EOF)) {
if (count == maximumLineLength) {
maximumLineLength += 128;
lineBuffer = (char *)realloc(lineBuffer, maximumLineLength);
if (lineBuffer == NULL) {
printf("\nError reallocating space for line buffer.");
exit(1);
}
}
lineBuffer[count] = ch;
count++;
ch = getc(file);
}
lineBuffer[count] = '\0';
if (count > 0)
return lineBuffer;
else
return NULL ;
}
void setupDefinitions() { void setupDefinitions() {
printf("\nSetting up..."); printf("\nSetting up ... ");
HRESULT hr; HRESULT hr;
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_ONE); hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE);
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_TWO); hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO);
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_THREE); hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE);
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_FOUR); hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR);
FILE *fp = fopen(throttleQuadrantCFG, "r"); FILE *fp = fopen(throttleQuadrantCFG, "r");
char * line = NULL; char * line = NULL;
uint8_t numEngines = 0; uint8_t numEngines = 0;
@ -170,27 +60,143 @@ void setupDefinitions() {
{ {
switch (numEngines) { switch (numEngines) {
case 1: case 1:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent");
break; break;
case 2: case 2:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent");
break; break;
case 3: case 3:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent");
break; break;
case 4: case 4:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_TWO, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:4", "percent"); hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "percent");
break;
default:
break;
}
}
else if (hasPropeller && !hasMixture)
{
switch (numEngines) {
case 1:
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:
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:
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");
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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "percent");
break;
case 4:
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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG PROPELLER LEVER POSITION:4", "percent");
break; break;
default: default:
break; break;
} }
} }
else if (!hasPropeller && hasMixture)
{
switch (numEngines) {
case 1:
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");
break;
case 2:
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:
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");
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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent");
break;
case 4:
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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG MIXTURE LEVER POSITION:4", "percent");
break;
default:
break;
}
}
else if (hasPropeller && hasMixture)
{
switch (numEngines) {
case 1:
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 MIXTURE LEVER POSITION:1", "percent");
break;
case 2:
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");
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:
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");
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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent");
break;
case 4:
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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG THROTTLE LEVER POSITION:4", "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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG PROPELLER LEVER POSITION:3", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG PROPELLER LEVER POSITION:4", "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");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_THREE, "GENERAL ENG MIXTURE LEVER POSITION:3", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ENGINE_FOUR, "GENERAL ENG MIXTURE LEVER POSITION:4", "percent");
break;
default:
break;
}
}
printf("done!");
} }
// SimConnect callback // SimConnect callback
@ -207,7 +213,7 @@ void CALLBACK MyDispatchProcTC(SIMCONNECT_RECV* pData, DWORD cbData, void *pCont
switch (data->dwRequestID) { switch (data->dwRequestID) {
case AC_DATA_REQUEST: case AC_DATA_REQUEST:
{ {
printf("\Aircraft data retrieved"); printf("Aircraft data retrieved.");
init.maxRev = (int8_t)((aircraftData *)&data->dwData)->lowerThrottleLimit; init.maxRev = (int8_t)((aircraftData *)&data->dwData)->lowerThrottleLimit;
numEngines = (uint8_t)((aircraftData *)&data->dwData)->numEngines; numEngines = (uint8_t)((aircraftData *)&data->dwData)->numEngines;
setupDefinitions(); setupDefinitions();
@ -234,8 +240,8 @@ void CALLBACK MyDispatchProcTC(SIMCONNECT_RECV* pData, DWORD cbData, void *pCont
throttleQuadrantCFG = (char *)calloc(strlen(path) + 6, 1); throttleQuadrantCFG = (char *)calloc(strlen(path) + 6, 1);
strcpy(throttleQuadrantCFG, path); strcpy(throttleQuadrantCFG, path);
strcat(throttleQuadrantCFG, "tq.cfg"); strcat(throttleQuadrantCFG, "tq.cfg");
printf("\n%s loaded.", throttleQuadrantCFG); printf("%s loaded.", throttleQuadrantCFG);
printf("\nRetrieving aicraft data..."); printf("\nRetrieving aicraft data ... ");
hr = SimConnect_RequestDataOnSimObject(hSimConnect, AC_DATA_REQUEST, DEFINITION_AC_DATA, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE); hr = SimConnect_RequestDataOnSimObject(hSimConnect, AC_DATA_REQUEST, DEFINITION_AC_DATA, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE);
break; break;
} }
@ -255,7 +261,7 @@ void CALLBACK MyDispatchProcTC(SIMCONNECT_RECV* pData, DWORD cbData, void *pCont
case EVENT_SIM_START: case EVENT_SIM_START:
{ {
// Send this request to get the user aircraft id // Send this request to get the user aircraft id
printf("\n\nRequesting loaded AC path..."); printf("\nRequesting loaded AC path ... ");
hr = SimConnect_RequestSystemState(hSimConnect, REQUEST_SYSTEM_STATE, "AircraftLoaded"); hr = SimConnect_RequestSystemState(hSimConnect, REQUEST_SYSTEM_STATE, "AircraftLoaded");
} }
break; break;
@ -277,7 +283,7 @@ void CALLBACK MyDispatchProcTC(SIMCONNECT_RECV* pData, DWORD cbData, void *pCont
} }
} }
void testThrottleControl() void throttleControl()
{ {
HRESULT hr; HRESULT hr;
@ -287,8 +293,6 @@ void testThrottleControl()
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");
// Set up a data definition for the throttle control
//hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_LEVER_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(tc), &tc); //hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_LEVER_ONE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(tc), &tc);
@ -307,7 +311,6 @@ void testThrottleControl()
int __cdecl _tmain(int argc, _TCHAR* argv[]) int __cdecl _tmain(int argc, _TCHAR* argv[])
{ {
testThrottleControl(); throttleControl();
return 0; return 0;
} }

View File

@ -149,11 +149,13 @@
<Text Include="ReadMe.txt" /> <Text Include="ReadMe.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="SerialPort.h" />
<ClInclude Include="stdafx.h" /> <ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" /> <ClInclude Include="targetver.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="stdafx.cpp" /> <ClCompile Include="SerialPort.cpp" />
<ClCompile Include="StringAdditions.cpp" />
<ClCompile Include="TQInterface.cpp" /> <ClCompile Include="TQInterface.cpp" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View File

@ -24,12 +24,18 @@
<ClInclude Include="targetver.h"> <ClInclude Include="targetver.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="SerialPort.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="stdafx.cpp"> <ClCompile Include="TQInterface.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="TQInterface.cpp"> <ClCompile Include="StringAdditions.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SerialPort.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>

View File

@ -1,8 +0,0 @@
// stdafx.cpp : source file that includes just the standard includes
// TQInterface.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

View File

@ -5,8 +5,6 @@
#pragma once #pragma once
#include "targetver.h"
#include <windows.h> #include <windows.h>
#include <tchar.h> #include <tchar.h>
#include <stdio.h> #include <stdio.h>
@ -15,6 +13,8 @@
#include <inttypes.h> #include <inttypes.h>
#include "SimConnect.h" #include "SimConnect.h"
#include "SerialPort.h"
#include "targetver.h"
#pragma comment(lib, "SimConnect.lib") #pragma comment(lib, "SimConnect.lib")
@ -29,3 +29,52 @@ typedef struct values {
int8_t leverValuesInPercent[4]; int8_t leverValuesInPercent[4];
} values; } values;
char *trimwhitespace(char *str);
char *readLine(FILE *file);
// Event IDs
static enum EVENT_ID {
EVENT_SIM_START,
REQUEST_SYSTEM_STATE,
};
// Data definition IDs, engines dynamically added
static enum DATA_DEFINE_ID {
DEFINITION_AC_DATA,
DEFINITION_ENGINE_ONE,
DEFINITION_ENGINE_TWO,
DEFINITION_ENGINE_THREE,
DEFINITION_ENGINE_FOUR,
};
// Request IDs
static enum REQUEST_ID {
AC_DATA_REQUEST,
};
// Struct for ac data
struct aircraftData {
double numEngines;
double lowerThrottleLimit;
};
// 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;
double mixturePercent;
};