#include <Windows.h>
#include <cstdio>
#include "SimConnect.h"
HANDLE hSimConnect = NULL;
enum DATA_DEFINE_ID
{
DEFINITION_ID_AP,
};
enum DATA_REQUEST_ID
{
REQUEST_AP_SETTINGS,
};
enum EVENT_ID
{
EVENT_SET_AP_ALTITUDE,
};
struct AutopilotData
{
double available;
double altitude_tunable;
double altitude_feet;
};
int main()
{
HRESULT hr;
SIMCONNECT_RECV* pData = NULL;
DWORD cbData = 0;
bool bRequestProcessed = false;
int SelectedAltitude = 0;
SIMCONNECT_RECV_SIMOBJECT_DATA* pObjData = NULL;
AutopilotData* pAutopilotData = NULL;
// Connect to MSFS
if (FAILED(SimConnect_Open(&hSimConnect, "AP changer", NULL, 0, 0, 0)))
{
printf("Unable to connect to MSFS using SimConnect\n");
exit(EXIT_FAILURE);
}
printf("Connected to MSFS!\n");
// Request current autopilot settings
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ID_AP, "AUTOPILOT AVAILABLE", "Bool");
if (FAILED(hr))
{
printf("AddToDataDefinition for AUTOPILOT AVAILABLE - error\n");
}
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ID_AP, "AUTOPILOT ALTITUDE MANUALLY TUNABLE", "Bool");
if (FAILED(hr))
{
printf("AddToDataDefinition for AUTOPILOT ALTITUDE MANUALLY TUNABLE - error\n");
}
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ID_AP, "AUTOPILOT ALTITUDE LOCK VAR", "Feet");
if (FAILED(hr))
{
printf("AddToDataDefinition for AUTOPILOT ALTITUDE LOCK VAR - error\n");
}
hr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_AP_SETTINGS, DEFINITION_ID_AP, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE);
if (FAILED(hr))
{
printf("RequestDataOnSimObject for AutopilotData structure - error\n");
}
bRequestProcessed = false;
while (!bRequestProcessed)
{
hr = SimConnect_GetNextDispatch(hSimConnect, &pData, &cbData);
if (SUCCEEDED(hr))
{
pObjData = (SIMCONNECT_RECV_SIMOBJECT_DATA*)pData;
if (pData->dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA && pObjData->dwRequestID == REQUEST_AP_SETTINGS)
{
bRequestProcessed = true;
pAutopilotData = (AutopilotData*)&pObjData->dwData;
if (pAutopilotData->available == 0)
printf("Your airplane doesn't have autopilot, sorry.\n");
if (pAutopilotData->altitude_tunable > 0)
printf("This SimObject can accept new autopilot altitude value.\n");
else
printf("This SimObject can't accept new autopilot altitude value, sorry.\n");
printf("Current autopilot selected altitude: %.0f feet\n", pAutopilotData->altitude_feet);
}
}
}
// Ask user for new value for altitude
printf("What altitude do you want? ");
if (scanf_s("%d", &SelectedAltitude) != 1 || SelectedAltitude < 0)
{
printf("Can't set you altitude. Will set 0.\n");
SelectedAltitude = 0;
}
// Set new values
hr = SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_SET_AP_ALTITUDE, "AP_ALT_VAR_SET_ENGLISH");
if (FAILED(hr))
{
printf("MapClientEvetnToSimEvent for AP_ALT_VAR_SET_ENGLISH - error\n");
}
hr = SimConnect_TransmitClientEvent(hSimConnect, SIMCONNECT_OBJECT_ID_USER, EVENT_SET_AP_ALTITUDE, SelectedAltitude, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
if (FAILED(hr))
{
printf("TransmitClientEvent for SelectedAltitude value - error\n");
}
// Check current altitude setting
hr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_AP_SETTINGS, DEFINITION_ID_AP, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE);
if (FAILED(hr))
{
printf("RequestDataOnSimObject for AutopilotData structure - error\n");
}
bRequestProcessed = false;
while (!bRequestProcessed)
{
hr = SimConnect_GetNextDispatch(hSimConnect, &pData, &cbData);
if (SUCCEEDED(hr))
{
pObjData = (SIMCONNECT_RECV_SIMOBJECT_DATA*)pData;
if (pData->dwID == SIMCONNECT_RECV_ID_SIMOBJECT_DATA && pObjData->dwRequestID == REQUEST_AP_SETTINGS)
{
bRequestProcessed = true;
pAutopilotData = (AutopilotData*)&pObjData->dwData;
printf("Current autopilot selected altitude: %.0f feet\n", pAutopilotData->altitude_feet);
}
}
}
// Close
hr = SimConnect_Close(hSimConnect);
return 0;
}