#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include "SimConnect.h"
int quit = 0;
HANDLE hSimConnect = NULL;
DWORD HellfireID = SIMCONNECT_OBJECT_ID_USER;
static enum EVENT_ID {
EVENT_SIM_START,
EVENT_Insert,
};
static enum DATA_REQUEST_ID7 {
REQUEST_Hellfie1,
};
static enum GROUP_ID {
GROUP_ZX,
};
static enum INPUT_ID {
INPUT_ZX,
};
struct structHellfireControl
{
double throttlePercent;
};
structHellfireControl bc;
// Set up flags so these operations only happen once
static bool plansSent = false;
static bool objectsCreated = false;
void sendFlightPlans()
{
wp[0].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
wp[0].Altitude = 200;
wp[0].ktsSpeed = 100;
wp[1].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
wp[2].Flags = SIMCONNECT_WAYPOINT_WRAP_TO_FIRST | SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
wp[2].Altitude = 200;
wp[2].ktsSpeed = 200;
// Send the waypoints to the Hellfire
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_WAYPOINT, HellfireID, 0, ARRAYSIZE(wp), sizeof(wp[0]), wp);
}
void setUpSimObjects()
{
SIMCONNECT_DATA_INITPOSITION Init;
HRESULT hr;
// Initialize Mooney aircraft just in front of user aircraft
Init.Altitude = 200.0; // Altitude of Sea-tac is 200 feet
Init.Pitch = -0.2;
Init.Bank = 0.0;
Init.OnGround = 0;
Init.Airspeed = 1;
hr = SimConnect_AICreateNonATCAircraft(hSimConnect, "Mooney Bravo", "N1001", Init, REQUEST_Hellfire1);
void CALLBACK MyDispatchProcSO(SIMCONNECT_RECV* pData, DWORD cbData, void *pContext)
{
HRESULT hr;
switch(pData->dwID)
{
case SIMCONNECT_RECV_ID_EVENT:
{
SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT*)pData;
switch(evt->uEventID)
{
case EVENT_SIM_START:
// Sim has started so turn the input events on
hr = SimConnect_SetInputGroupState(hSimConnect, INPUT_ZX, SIMCONNECT_STATE_ON);
break;
case EVENT_Z:
if (!objectsCreated)
{
setUpSimObjects();
objectsCreated = true;
}
break;
case EVENT_X:
if (!plansSent && objectsCreated)
{
sendFlightPlans();
plansSent = true;
}
break;
case EVENT_C:
{
// Give the balloon some throttle
if (bc.throttlePercent < 100.0f)
bc.throttlePercent += 5.0f;
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_THROTTLE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(bc), &bc);
break;
}
case EVENT_V:
{
// Give the balloon some throttle
if (bc.throttlePercent > 0.0f)
bc.throttlePercent -= 5.0f;
hr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_THROTTLE, SIMCONNECT_OBJECT_ID_USER, 0, 0, sizeof(bc), &bc);
break;
}
default:
printf("\nUnknown event: %d", evt->uEventID);
break;
}
break;
}
case SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID:
{
SIMCONNECT_RECV_ASSIGNED_OBJECT_ID *pObjData = (SIMCONNECT_RECV_ASSIGNED_OBJECT_ID*)pData;
switch( pObjData ->dwRequestID)
{
case REQUEST_Hellfire1:
HellfireID = pObjData->dwObjectID;
printf("\nCreated Mooney Bravo id = %d", MooneyID);
break;
default:
printf("\nUnknown creation %d", pObjData->dwRequestID);
break;
}
break;
}
case SIMCONNECT_RECV_ID_QUIT:
{
quit = 1;
break;
}
default:
printf("\nReceived:%d",pData->dwID);
break;
}
}
void testSimObjects()
{
HRESULT hr;
if (SUCCEEDED(SimConnect_Open(&hSimConnect, "AI Objects and Waypoints", NULL, 0, 0, 0)))
{
printf("\nConnected to Flight Simulator!");
// Create some private events
hr = SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_Insert);
// Link the private events to keyboard keys, and ensure the input events are off
hr = SimConnect_MapInputEventToClientEvent(hSimConnect, INPUT_ZX, "Insert", EVENT_Insert);
hr = SimConnect_SetInputGroupState(hSimConnect, INPUT_ZX, SIMCONNECT_STATE_OFF);
// Sign up for notifications
hr = SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_ZX, EVENT_Insert);
// Set up a definition for a waypoint list
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_WAYPOINT,
"AI Waypoint List", "number", SIMCONNECT_DATATYPE_WAYPOINT);
// Set up a definition for the balloon throttle
bc.throttlePercent = 0.0f;
hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_THROTTLE,
"GENERAL ENG THROTTLE LEVER POSITION:1", "percent");
// Request a simulation start event
hr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SIM_START, "SimStart");
while( 0 == quit )
{
SimConnect_CallDispatch(hSimConnect, MyDispatchProcSO, NULL);
Sleep(1);
}
hr = SimConnect_Close(hSimConnect);
}
}
int __cdecl _tmain(int argc, _TCHAR* argv[])
{
testSimObjects();
return 0;
}