Beginning

This commit is contained in:
Kilian Kurt Hofmann 2017-01-13 21:57:46 +01:00
parent 9dcb8f3835
commit 00e307cccb
3 changed files with 328 additions and 6 deletions

View File

@ -1,11 +1,313 @@
// TQInterface.cpp : Defines the entry point for the console application.
//
// Aircraft data and mode mapping via config file in aircraft folder
#include "stdafx.h"
// Things for execution
bool quit = 0;
HANDLE hSimConnect = NULL;
char *throttleQuadrantCFG;
initialization init;
uint8_t numEngines = 0;
int main()
// 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)
{
return 0;
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() {
printf("\nSetting up...");
HRESULT hr;
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_ONE);
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_TWO);
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_THREE);
hr = SimConnect_ClearDataDefinition(hSimConnect, DEFINITION_LEVER_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.");
exit(EXIT_FAILURE);
}
while ((line = readLine(fp)) != NULL) {
// Parse
char *assign = strstr(line, "=");
char *id = (char *)calloc(13, 1);
memcpy(id, line, ((long)assign - (long)line));
if (strcmp(trimwhitespace(id), "numModes") == 0)
init.numModes = atoi(assign + 1);
else if (strcmp(trimwhitespace(id), "hasPropeller") == 0)
hasPropeller = atoi(assign + 1);
else if (strcmp(trimwhitespace(id), "hasMixture") == 0)
hasMixture = atoi(assign + 1);
else if (strcmp(trimwhitespace(id), "mode1") == 0)
strcpy(init.modes[0], strrev(assign + 1));
else if (strcmp(trimwhitespace(id), "mode2") == 0)
strcpy(init.modes[1], strrev(assign + 1));
else if (strcmp(trimwhitespace(id), "mode3") == 0)
strcpy(init.modes[2], strrev(assign + 1));
free(line);
free(id);
}
fclose(fp);
fp = fopen("dump.hex", "wb");
/*DEBUG*/fwrite(&init, 1, sizeof(initialization), fp);
fclose(fp);
// Setup Data definitions
if (!hasPropeller && !hasMixture)
{
switch (numEngines) {
case 1:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent");
break;
case 2:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:1", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:2", "percent");
break;
case 3:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_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_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent");
break;
case 4:
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_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_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:3", "percent");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_LEVER_ONE, "GENERAL ENG THROTTLE LEVER POSITION:4", "percent");
break;
default:
break;
}
}
}
// SimConnect callback
void CALLBACK MyDispatchProcTC(SIMCONNECT_RECV* pData, DWORD cbData, void *pContext)
{
HRESULT hr;
switch (pData->dwID)
{
case SIMCONNECT_RECV_ID_SIMOBJECT_DATA: {
SIMCONNECT_RECV_SIMOBJECT_DATA *data = (SIMCONNECT_RECV_SIMOBJECT_DATA *)pData;
switch (data->dwRequestID) {
case AC_DATA_REQUEST:
{
printf("\Aircraft data retrieved");
init.maxRev = (int8_t)((aircraftData *)&data->dwData)->lowerThrottleLimit;
numEngines = (uint8_t)((aircraftData *)&data->dwData)->numEngines;
setupDefinitions();
break;
}
default:
break;
}
break;
}
case SIMCONNECT_RECV_ID_SYSTEM_STATE:
{
SIMCONNECT_RECV_SYSTEM_STATE *state = (SIMCONNECT_RECV_SYSTEM_STATE *)pData;
switch (state->dwRequestID)
{
// Receive loaded aircraft name, set path to tq.cfg
case REQUEST_SYSTEM_STATE:
{
char *path = strrev(strstr(strrev(state->szString), "\\"));
throttleQuadrantCFG = (char *)calloc(strlen(path) + 6, 1);
strcpy(throttleQuadrantCFG, path);
strcat(throttleQuadrantCFG, "tq.cfg");
printf("\n%s loaded.", throttleQuadrantCFG);
printf("\nRetrieving aicraft data...");
hr = SimConnect_RequestDataOnSimObject(hSimConnect, AC_DATA_REQUEST, DEFINITION_AC_DATA, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE);
break;
}
default:
break;
}
break;
}
case SIMCONNECT_RECV_ID_EVENT:
{
SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT *)pData;
switch (evt->uEventID)
{
case EVENT_SIM_START:
{
// Send this request to get the user aircraft id
printf("\n\nRequesting loaded AC path...");
hr = SimConnect_RequestSystemState(hSimConnect, REQUEST_SYSTEM_STATE, "AircraftLoaded");
}
break;
default:
break;
}
break;
}
case SIMCONNECT_RECV_ID_QUIT:
{
quit = 1;
break;
}
default:
break;
}
}
void testThrottleControl()
{
HRESULT hr;
if (SUCCEEDED(SimConnect_Open(&hSimConnect, "Throttle Control", NULL, 0, 0, 0)))
{
printf("\nConnected to Flight Simulator!");
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_AC_DATA, "NUMBER OF ENGINES", "number");
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);
// Request a simulation started event
hr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SIM_START, "SimStart");
while (0 == quit)
{
SimConnect_CallDispatch(hSimConnect, MyDispatchProcTC, NULL);
Sleep(1);
}
hr = SimConnect_Close(hSimConnect);
}
}
int __cdecl _tmain(int argc, _TCHAR* argv[])
{
testThrottleControl();
return 0;
}

View File

@ -88,10 +88,12 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft Games\Microsoft Flight Simulator X SDK\SDK\Core Utilities Kit\SimConnect SDK\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>C:\Program Files %28x86%29\Microsoft Games\Microsoft Flight Simulator X SDK\SDK\Core Utilities Kit\SimConnect SDK\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -116,12 +118,14 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>C:\Program Files %28x86%29\Microsoft Games\Microsoft Flight Simulator X SDK\SDK\Core Utilities Kit\SimConnect SDK\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>C:\Program Files %28x86%29\Microsoft Games\Microsoft Flight Simulator X SDK\SDK\Core Utilities Kit\SimConnect SDK\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

View File

@ -7,9 +7,25 @@
#include "targetver.h"
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <strsafe.h>
#include <inttypes.h>
#include "SimConnect.h"
#pragma comment(lib, "SimConnect.lib")
typedef struct initialization {
uint8_t numModes;
int8_t maxRev;
char modes[3][5];
} initialization;
typedef struct values {
uint8_t mode;
int8_t leverValuesInPercent[4];
} values;
// TODO: reference additional headers your program requires here