Control

From X-Plane SDK
Jump to: navigation, search




#include "XPLMPlugin.h"
#include "XPLMDisplay.h"
#include "XPLMGraphics.h"
#include "XPLMProcessing.h"
#include "XPLMDataAccess.h"
#include "XPLMMenus.h"
#include "XPLMUtilities.h"
#include "XPWidgets.h"
#include "XPStandardWidgets.h"
#include "XPLMCamera.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#if IBM
#include <windows.h>
#endif

#define MAX_ITEMS 12
	
static XPLMDataRef gControlDataRef[MAX_ITEMS];

static char DataRefString[MAX_ITEMS][255] = {	"sim/joystick/yolk_pitch_ratio", "sim/joystick/yolk_roll_ratio", "sim/joystick/yolk_heading_ratio",
										"sim/joystick/artstab_pitch_ratio", "sim/joystick/artstab_roll_ratio", "sim/joystick/artstab_heading_ratio",
										"sim/joystick/FC_ptch", "sim/joystick/FC_roll", "sim/joystick/FC_hdng",
										"sim/flightmodel/weight/m_fuel1", "sim/flightmodel/weight/m_fuel2", "sim/flightmodel/weight/m_fuel3"};

static char DataRefDesc[MAX_ITEMS][255] = {"Yolk Pitch", "Yolk Roll", "Yolk Heading", "AS Pitch", "AS Roll", "AS Heading", "FC Pitch", "FC Roll", "FC Heading", "Fuel 1", "Fuel 2", "Fuel 3"};


static float IncrementValue[MAX_ITEMS] = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 10.0, 10.0, 10.0};

static int	Element = 0, IntVals[128];
static float FloatVals[128];
static int ByteVals[128];

static int MenuItem1;

static XPWidgetID			ControlWidget = NULL, ControlWindow = NULL;
static XPWidgetID			ControlApplyButton = NULL; 
static XPWidgetID			ControlText[MAX_ITEMS] = {NULL};
static XPWidgetID			ControlEdit[MAX_ITEMS] = {NULL};
static XPWidgetID			UpArrow[MAX_ITEMS] = {NULL};
static XPWidgetID			DownArrow[MAX_ITEMS] = {NULL};

static void ControlMenuHandler(void *, void *);

static void CreateControl(int x1, int y1, int w, int h);

static int ControlHandler(
						XPWidgetMessage			inMessage,
						XPWidgetID				inWidget,
						intptr_t				inParam1,
						intptr_t				inParam2);

static void DisplayFindDataRef(void);
static void ApplyValues(void);
static void RefreshValues(void);

inline	float	HACKFLOAT(float val)
{
	return val;
}
/*
#if IBM
inline	float	HACKFLOAT(float val)
{
	return val;
}
#else
inline long long HACKFLOAT(float val)
{
	double	d = val;
	long long temp;
	temp = *((long long *) &d);
	return temp;
}
#endif
*/

PLUGIN_API int XPluginStart(
						char *		outName,
						char *		outSig,
						char *		outDesc)
{
	XPLMMenuID	id;
	int			item;

	strcpy(outName, "Control");
	strcpy(outSig, "xpsdk.examples.Control");
	strcpy(outDesc, "A plug-in that allows Controling of lat/lon etc.");

	item = XPLMAppendMenuItem(XPLMFindPluginsMenu(), "Control", NULL, 1);

	id = XPLMCreateMenu("Control", XPLMFindPluginsMenu(), item, ControlMenuHandler, NULL);
	XPLMAppendMenuItem(id, "Control", (void *)"Control", 1);
	
	MenuItem1 = 0;

	for (int Item=0; Item<MAX_ITEMS; Item++)
		gControlDataRef[Item] = XPLMFindDataRef(DataRefString[Item]);

	return 1;
}

PLUGIN_API void	XPluginStop(void)
{
	if (MenuItem1 == 1)
	{
		XPDestroyWidget(ControlWidget, 1);
		MenuItem1 = 0;
	}
}

PLUGIN_API void XPluginDisable(void)
{
}

PLUGIN_API int XPluginEnable(void)
{
	return 1;
}

PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFrom, int inMsg, void * inParam)
{
	if (inFrom == XPLM_PLUGIN_XPLANE)
	{
		switch(inMsg)
		{
			case XPLM_MSG_PLANE_LOADED:
				RefreshValues();
				break;
		}
	}
}

void ControlMenuHandler(void * mRef, void * iRef)
{
	if (!strcmp((char *) iRef, "Control"))
	{
		if (MenuItem1 == 0)
		{
			CreateControl(300, 550, 350, 530);
			MenuItem1 = 1;
		}
		else
		{
			if(!XPIsWidgetVisible(ControlWidget))
			{
				RefreshValues();
				XPShowWidget(ControlWidget);
	}
}						
	}
}						


void CreateControl(int x, int y, int w, int h)
{
	int x2 = x + w;
	int y2 = y - h;
	char buffer[512];
	float FloatValue[MAX_ITEMS];
	int Item;

	for (Item=0; Item<MAX_ITEMS; Item++)
		FloatValue[Item] = XPLMGetDataf(gControlDataRef[Item]);
	
	ControlWidget = XPCreateWidget(x, y, x2, y2,
					1,	// Visible
					"Control",	// desc
					1,		// root
					NULL,	// no container
					xpWidgetClass_MainWindow);

	XPSetWidgetProperty(ControlWidget, xpProperty_MainWindowHasCloseBoxes, 1);

	ControlWindow = XPCreateWidget(x+50, y-50, x2-50, y2+50,
					1,	// Visible
					"",	// desc
					0,		// root
					ControlWidget,
					xpWidgetClass_SubWindow);

	XPSetWidgetProperty(ControlWindow, xpProperty_SubWindowType, xpSubWindowStyle_SubWindow);

	for (Item=0; Item<MAX_ITEMS; Item++)
	{
		ControlText[Item] = XPCreateWidget(x+60, y-(70 + (Item*30)), x+115, y-(92 + (Item*30)),
							1,	// Visible
							DataRefDesc[Item],// desc
							0,		// root
							ControlWidget,
							xpWidgetClass_Caption);

		sprintf(buffer, "%f", HACKFLOAT(FloatValue[Item]));
		ControlEdit[Item] = XPCreateWidget(x+160, y-(70 + (Item*30)), x+250, y-(92 + (Item*30)),
							1, buffer, 0, ControlWidget,
							xpWidgetClass_TextField);

		XPSetWidgetProperty(ControlEdit[Item], xpProperty_TextFieldType, xpTextEntryField);

		UpArrow[Item] = XPCreateWidget(x+252, y-(66 + (Item*30)), x+264, y-(81 + (Item*30)),
							1, "", 0, ControlWidget,
							xpWidgetClass_Button);

		XPSetWidgetProperty(UpArrow[Item], xpProperty_ButtonType, xpLittleUpArrow);

		DownArrow[Item] = XPCreateWidget(x+252, y-(81 + (Item*30)), x+264, y-(96 + (Item*30)),
							1, "", 0, ControlWidget,
							xpWidgetClass_Button);
	
		XPSetWidgetProperty(DownArrow[Item], xpProperty_ButtonType, xpLittleDownArrow);
	}

	ControlApplyButton = XPCreateWidget(x+120, y-440, x+210, y-462,
					1, "Apply Data", 0, ControlWidget, 
					xpWidgetClass_Button);

	XPSetWidgetProperty(ControlApplyButton, xpProperty_ButtonType, xpPushButton);

	XPAddWidgetCallback(ControlWidget, ControlHandler);
}

int	ControlHandler(
						XPWidgetMessage			inMessage,
						XPWidgetID				inWidget,
						intptr_t				inParam1,
						intptr_t				inParam2)
{
	char buffer[512];
	float FloatValue[MAX_ITEMS];
	int Item;

	for (Item=0; Item<MAX_ITEMS; Item++)
		FloatValue[Item] = XPLMGetDataf(gControlDataRef[Item]);

	if (inMessage == xpMessage_CloseButtonPushed)
	{
		if (MenuItem1 == 1)
		{
			XPHideWidget(ControlWidget);
		}
		return 1;
	}

	if (inMessage == xpMsg_PushButtonPressed)
	{

		if (inParam1 == (intptr_t)ControlApplyButton)
		{
			ApplyValues();
			return 1;
		}

		for (Item=0; Item<MAX_ITEMS; Item++)
		{
			if (inParam1 == (intptr_t)UpArrow[Item])
			{
				FloatValue[Item] += IncrementValue[Item];
				sprintf(buffer, "%f", HACKFLOAT(FloatValue[Item]));
				XPSetWidgetDescriptor(ControlEdit[Item], buffer);
				XPLMSetDataf(gControlDataRef[Item], FloatValue[Item]);
				return 1;
			}
		}

		for (Item=0; Item<MAX_ITEMS; Item++)
		{
			if (inParam1 == (intptr_t)DownArrow[Item])
			{
				FloatValue[Item] -= IncrementValue[Item];
				sprintf(buffer, "%f", HACKFLOAT(FloatValue[Item]));
				XPSetWidgetDescriptor(ControlEdit[Item], buffer);
				XPLMSetDataf(gControlDataRef[Item], FloatValue[Item]);
				return 1;
			}
		}
	}

	return 0;
}						

void ApplyValues(void)
{
	char	buffer[512];

	for (int Item=0; Item<MAX_ITEMS; Item++)
	{
		XPGetWidgetDescriptor(ControlEdit[Item], buffer, 512);
		XPLMSetDataf(gControlDataRef[Item], atof(buffer));
	}
}

void RefreshValues(void)
{
	char	buffer[512];
	float FloatValue[MAX_ITEMS];
	int Item;

	for (Item=0; Item<MAX_ITEMS; Item++)
		FloatValue[Item] = XPLMGetDataf(gControlDataRef[Item]);
	
	for (Item=0; Item<MAX_ITEMS; Item++)
	{
		sprintf(buffer, "%f", HACKFLOAT(FloatValue[Item]));
		XPSetWidgetDescriptor(ControlEdit[Item], buffer);
	}
}