Control
From X-Plane SDK
Revision as of 18:44, 13 December 2012 by Sbarbour (Talk | contribs) (Code updated for 64 bit compatibility)
- Download Control as project for X-Code 3.2 or newer, 32 and 64-bit Intel
- Download Control as project for Microsoft Visual Studio 2010 (32 and 64-bit)
- Download Control as makefile for GCC 4.x/Linux (32 and 64-bit)
#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); } }