SDK200Tests
From X-Plane SDK
- Download SDK200Tests as project for X-Code 3.2 or newer, 32 and 64-bit Intel
- Download SDK200Tests as project for Microsoft Visual Studio 2010 (32 and 64-bit)
- Download SDK200Tests as makefile for GCC 4.x/Linux (32 and 64-bit)
/* SDK200Tests Example Tests the new SDK 2.00 functions. Version 1.0.0.1 Intitial Sandy Barbour 20/11/2007 Version 1.1.0.1 Added Load/Save sit/smo files test Added Map Drawing Tests - Sandy Barbour 02/12/2009 NOTES 1. This code also draws a custom X-Plane OBJ (3-d model). You will need to add your own OBJ and change the code to reflect this. Copy your OBJ to the XPlane V9 application directory. The line below, which is in the SDK200TestsDrawObject(..) callback is the line to change. SDK200TestsObject = XPLMLoadObject("dummy.obj"); An alternative is to just rename you .obj file to dummy.obj 2. The code draws 2 objects each time, so you are not seeing double. :-) */ #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 "XPLMScenery.h" #include <string.h> #include <stdio.h> #include <stdlib.h> #if IBM #include <windows.h> #include <stdio.h> #endif #if LIN #include <GL/gl.h> #else #if __GNUC__ #include <OpenGL/gl.h> #else #include <GL/gl.h> #endif #endif // Number of edit boxes in widget #define MAX_ITEMS 5 // Number of Xplane objects #define MAX_OBJECT_ITEMS 6 char SDK200TestsVersionNumber[] = "v1.10"; // Description text for widget edit boxes char SDK200TestsDataDesc[MAX_ITEMS][255] = {"Probe Test", "Command Test", "Mouse Wheel", "Cursor", "Objects"}; // Used as interlock for widget int SDK200TestsMenuItem1; // Used by menus XPLMMenuID SDK200TestsId; int SDK200TestsItem; // Used for the text window XPLMWindowID SDK200TestsTestWindow; // Used to test Command API XPLMCommandRef SDK200TestsCommand1 = NULL; // Indexers int SDK200TestsCursorStatusIndex = 0; int SDK200TestsCurrentFontIndex = 0; int SDK200TestsCurrentObjectIndex = 0; int SDK200TestsDrawWindowEnabled = 0; // Used by the cursor test XPLMCursorStatus SDK200TestsCursorStatus[4] = {xplm_CursorDefault, xplm_CursorHidden, xplm_CursorArrow, xplm_CursorCustom}; // Used by the Draw Objects test char SDK200TestsObjectPath[MAX_OBJECT_ITEMS][255] = { "lib/ships/Frigate.obj", "lib/airport/landscape/radar.obj", "lib/dynamic/balloon.obj", "lib/airport/landscape/windsock_pole.obj", "lib/airport/NAVAIDS/glideslope.obj", "lib/airport/aircraft/regional_prop/ATR42-500_FedEx.obj" }; // Used for GetVersion tests char SDK200TestsXPLMFindSymbolBuffer[256], SDK200TestsXPLMGetVersionsBuffer[256]; // Datarefs XPLMDataRef SDK200Tests_refx = NULL; XPLMDataRef SDK200Tests_refy = NULL; XPLMDataRef SDK200Tests_refz = NULL; XPLMDataRef SDK200Tests_ref_render_type = NULL; XPLMDataRef SDK200Tests_ref_wrl_type = NULL; XPLMDataRef SDK200Tests_ref_vl = NULL; XPLMDataRef SDK200Tests_ref_vb = NULL; XPLMDataRef SDK200Tests_ref_vr = NULL; XPLMDataRef SDK200Tests_ref_vt = NULL; XPLMDataRef SDK200Tests_ref_mode_time = NULL; XPLMDataRef SDK200Tests_ref_x_scale = NULL; XPLMDataRef SDK200Tests_ref_y_scale = NULL; XPLMDataRef SDK200Tests_ref_t_scale = NULL; // Widgets XPWidgetID SDK200TestsWidget, SDK200TestsWindow; XPWidgetID SDK200TestsButton1, SDK200TestsButton2, SDK200TestsButton3, SDK200TestsButton4, SDK200TestsButton5; XPWidgetID SDK200TestsButton6, SDK200TestsButton7, SDK200TestsButton8, SDK200TestsButton9; XPWidgetID SDK200TestsText[MAX_ITEMS]; XPWidgetID SDK200TestsEdit[MAX_ITEMS]; XPLMProbeRef SDK200TestsProbe=NULL; // Used by the Draw Objects test XPLMObjectRef SDK200TestsObject=NULL; XPLMProbeRef SDK200TestsObjectProbe=NULL; // Prototype for the XPLMFindSymbol test typedef void (* XPLMGetVersions_f)( int * outXPlaneVersion, int * outXPLMVersion, XPLMHostApplicationID * outHostID); // Displays data in widget float SDK200TestsLoopCB(float elapsedMe, float elapsedSim, int counter, void * refcon);; // Menu Prototype void SDK200TestsMenuHandler(void *, void *); // Draw Text window callbacks void SDK200TestsWindowDraw(XPLMWindowID inWindowID, void * inRefcon); void SDK200TestsWindowKey(XPLMWindowID inWindowID, char inKey, XPLMKeyFlags inFlags, char vkey, void * inRefcon, int losingFocus); int SDK200TestsWindowMouse(XPLMWindowID inWindowID, int x, int y, XPLMMouseStatus isDown, void * inRefcon); int SDK200TestsWindowMouseWheel(XPLMWindowID inWindowID, int x, int y, int wheel, int clicks, void * inRefcon); XPLMCursorStatus SDK200TestsWindowCursor(XPLMWindowID inWindowID, int x, int y, void * inRefcon); // Widget prototypes void CreateSDK200Tests(int x1, int y1, int w, int h); int SDK200TestsHandler( XPWidgetMessage inMessage, XPWidgetID inWidget, intptr_t inParam1, intptr_t inParam2); // Callback for the Command API Tests int SDK200TestsCommandHandler1(XPLMCommandRef inCommand, XPLMCommandPhase inPhase, void * inRefcon) { char Buffer[256]; sprintf(Buffer,"Cmdh handler: 0x%08x, %d, 0x%08x\n", inCommand, inPhase, inRefcon); XPSetWidgetDescriptor(SDK200TestsEdit[1], Buffer); return 0; } // Prototype for Draw Object tests int SDK200TestsDrawObject( XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon); // Callback for Error Tests void SDK200TestsErrorCB(const char * msg) { XPLMDebugString("SDK200Tests -:- error CB called: "); XPLMDebugString(msg); XPLMDebugString("\n"); } // Callback or Feature API Tests void SDK200TestsFeatureEnum(const char * msg, void * inRefcon) { XPLMDebugString("SDK200Tests -:- SUPPORTED FEATURE TEST: "); XPLMDebugString(msg); XPLMDebugString("\n"); } // Prototype for Map Draw tests int SDK200TestsMapCB( XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon); PLUGIN_API int XPluginStart( char * outName, char * outSig, char * outDesc) { int DataRefItem; int XPlaneVersion, XPLMVersion, HostID; char Buffer[256]; strcpy(outName, "SDK200Tests"); strcpy(outSig, "sandybarbour.projects.sdk200tests"); strcpy(outDesc, "A plug-in to test the new SDK200 API's."); // Get the aicraft position SDK200Tests_refx = XPLMFindDataRef("sim/flightmodel/position/local_x"); SDK200Tests_refy = XPLMFindDataRef("sim/flightmodel/position/local_y"); SDK200Tests_refz = XPLMFindDataRef("sim/flightmodel/position/local_z"); SDK200Tests_ref_render_type = XPLMFindDataRef("sim/graphics/view/panel_render_type"); SDK200Tests_ref_wrl_type = XPLMFindDataRef("sim/graphics/view/world_render_type"); SDK200Tests_ref_vl = XPLMFindDataRef("sim/graphics/view/local_map_l"); SDK200Tests_ref_vb = XPLMFindDataRef("sim/graphics/view/local_map_b"); SDK200Tests_ref_vr = XPLMFindDataRef("sim/graphics/view/local_map_r"); SDK200Tests_ref_vt = XPLMFindDataRef("sim/graphics/view/local_map_t"); SDK200Tests_ref_mode_time = XPLMFindDataRef("sim/graphics/settings/local_map/profile_view_is_time"); SDK200Tests_ref_x_scale = XPLMFindDataRef("sim/graphics/view/local_profile_scale_x"); SDK200Tests_ref_y_scale = XPLMFindDataRef("sim/graphics/view/local_profile_scale_y"); SDK200Tests_ref_t_scale = XPLMFindDataRef("sim/graphics/view/local_profile_scale_t"); // Create function pointer XPLMGetVersions_f XPLMGetVersionsTemp; // Find the real XPLMGetVersions function and copy to function pointer XPLMGetVersionsTemp = (XPLMGetVersions_f) XPLMFindSymbol("XPLMGetVersions"); // Call the function XPLMGetVersionsTemp(&XPlaneVersion, &XPLMVersion, &HostID); // Display the results sprintf(SDK200TestsXPLMFindSymbolBuffer, "SDK200Tests -:- XPLMFindSymbol returned [XPlaneVersion = %d, XPLMVersion = %d, HostID = %d\n", XPlaneVersion, XPLMVersion, HostID); XPLMDebugString(SDK200TestsXPLMFindSymbolBuffer); // Call the real XPLMGetVersions as a comparison for the above XPLMGetVersions(&XPlaneVersion, &XPLMVersion, &HostID); // Display the results sprintf(SDK200TestsXPLMGetVersionsBuffer, "SDK200Tests -:- XPLMGetVersions returned [XPlaneVersion = %d, XPLMVersion = %d, HostID = %d\n", XPlaneVersion, XPLMVersion, HostID); XPLMDebugString(SDK200TestsXPLMGetVersionsBuffer); // Create the menus SDK200TestsItem = XPLMAppendMenuItem(XPLMFindPluginsMenu(), "SDK200Tests", NULL, 1); SDK200TestsId = XPLMCreateMenu("SDK200Tests", XPLMFindPluginsMenu(), SDK200TestsItem, SDK200TestsMenuHandler, NULL); XPLMAppendMenuItem(SDK200TestsId, "SDK200Tests", (void *)"SDK200Tests", 1); XPLMAppendMenuItem(SDK200TestsId, "Show Window", (void *)"Show Window", 1); XPLMAppendMenuItem(SDK200TestsId, "Hide Window", (void *)"Hide Window", 1); // Register the callback for errors XPLMSetErrorCallback(SDK200TestsErrorCB); // Test enumaration of features XPLMEnumerateFeatures(SDK200TestsFeatureEnum, NULL); // Enable a valid feature, which trigger the SDK200TestsFeatureEnum callback XPLMEnableFeature("XPLM_WANTS_REFLECTIONS", 1); // Try to enable an invalid feature, error will be reported in the SDK200TestsErrorCB callback XPLMEnableFeature("SANDY_WANTS_REFLECTIONS", 1); SDK200TestsMenuItem1 = 0; SDK200TestsDrawWindowEnabled = 0; // This is used to create a text window using the new XPLMCreateWindowEx function. XPLMCreateWindow_t TestWindowData; TestWindowData.structSize = sizeof(TestWindowData); TestWindowData.left = 50; TestWindowData.top = 450; TestWindowData.right = 600; TestWindowData.bottom = 350; TestWindowData.visible= 1; TestWindowData.drawWindowFunc = SDK200TestsWindowDraw; TestWindowData.handleKeyFunc = SDK200TestsWindowKey; TestWindowData.handleMouseClickFunc = SDK200TestsWindowMouse; TestWindowData.handleMouseWheelFunc = SDK200TestsWindowMouseWheel; TestWindowData.handleCursorFunc = SDK200TestsWindowCursor; TestWindowData.refcon = NULL; SDK200TestsTestWindow = XPLMCreateWindowEx(&TestWindowData); sprintf(Buffer, "SDK200Tests -:- Creating window with XPLMCreateWindowEx: returned XPLMWindowID = %x\n", SDK200TestsTestWindow); XPLMDebugString(Buffer); XPLMRegisterFlightLoopCallback(SDK200TestsLoopCB, 1.0, NULL); // Create the test command, this will save the screen to a file. SDK200TestsCommand1 = XPLMCreateCommand("sim/operation/screenshot", "Test screenshot"); // Register it XPLMRegisterCommandHandler(SDK200TestsCommand1, SDK200TestsCommandHandler1, 0, (void *) 0); // This used for the Draw Objects tests XPLMRegisterDrawCallback( SDK200TestsDrawObject, xplm_Phase_Objects, 0, 0 ); // This used for the Draw Map tests XPLMRegisterDrawCallback( SDK200TestsMapCB, xplm_Phase_LocalMap2D, 0, 0); XPLMRegisterDrawCallback( SDK200TestsMapCB, xplm_Phase_LocalMap3D, 0, 0); XPLMRegisterDrawCallback( SDK200TestsMapCB, xplm_Phase_LocalMapProfile, 0, 0); // Create a Y probe SDK200TestsObjectProbe = XPLMCreateProbe(xplm_ProbeY); SDK200TestsProbe = XPLMCreateProbe(xplm_ProbeY); return 1; } PLUGIN_API void XPluginStop(void) { // Clean up XPLMUnregisterDrawCallback( SDK200TestsDrawObject, xplm_Phase_Objects, 0, 0 ); XPLMUnregisterDrawCallback( SDK200TestsMapCB, xplm_Phase_LocalMap2D, 0, 0); XPLMUnregisterDrawCallback( SDK200TestsMapCB, xplm_Phase_LocalMap3D, 0, 0); XPLMUnregisterDrawCallback( SDK200TestsMapCB, xplm_Phase_LocalMapProfile, 0, 0); if(SDK200TestsObject) XPLMUnloadObject(SDK200TestsObject); XPLMDestroyProbe(SDK200TestsObjectProbe); XPLMDestroyProbe(SDK200TestsProbe); XPLMDestroyWindow(SDK200TestsTestWindow); XPLMUnregisterCommandHandler(SDK200TestsCommand1, SDK200TestsCommandHandler1, 0, 0); XPLMUnregisterFlightLoopCallback(SDK200TestsLoopCB, NULL); XPLMDestroyMenu(SDK200TestsId); } PLUGIN_API int XPluginEnable(void) { return 1; } PLUGIN_API void XPluginDisable(void) { } PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFrom, int inMsg, void * inParam) { } // Displays data in widget float SDK200TestsLoopCB(float elapsedMe, float elapsedSim, int counter, void * refcon) { char Buffer[256]; float x = XPLMGetDatad(SDK200Tests_refx); float y = XPLMGetDatad(SDK200Tests_refy); float z = XPLMGetDatad(SDK200Tests_refz); XPLMProbeInfo_t info = { 0 }; info.structSize = sizeof(info); // If we have a hit then display the data in the widget if (XPLMProbeTerrainXYZ(SDK200TestsProbe,x,y,z,&info) == xplm_ProbeHitTerrain) { sprintf(Buffer,"Y gap is: %f v=%f,%f,%f\n", y - info.locationY, info.velocityX, info.velocityY, info.velocityZ); if (SDK200TestsMenuItem1 == 1) XPSetWidgetDescriptor(SDK200TestsEdit[0], Buffer); } return 0.1; } // Process the menu selections void SDK200TestsMenuHandler(void * mRef, void * iRef) { // Menu selected for widget if (!strcmp((char *) iRef, "SDK200Tests")) { if (SDK200TestsMenuItem1 == 0) { CreateSDK200Tests(100, 550, 650, 330); SDK200TestsMenuItem1 = 1; } } // Menu selected to enable text window if (!strcmp((char *) iRef, "Show Window")) { SDK200TestsDrawWindowEnabled = 1; } // Menu selected to disable text window if (!strcmp((char *) iRef, "Hide Window")) { SDK200TestsDrawWindowEnabled = 0; } } // Used to draw various test info to the text window void SDK200TestsWindowDraw(XPLMWindowID inWindowID, void * inRefcon) { float rgb [] = { 1.0, 1.0, 1.0 }; int Left, Top, Right, Bottom; char Buffer[256]; // Used by the Font test XPLMFontID TestFont[2] = {xplmFont_Basic, xplmFont_Proportional}; char TestFontDesc[2][80] = {"xplmFont_Basic", "xplmFont_Proportional"}; // Only draw if enabled through the menu if (SDK200TestsDrawWindowEnabled) { sprintf(Buffer, "Current font is %d : %s", TestFont[SDK200TestsCurrentFontIndex], TestFontDesc[SDK200TestsCurrentFontIndex]); XPLMGetWindowGeometry(inWindowID, &Left, &Top, &Right, &Bottom); XPLMDrawTranslucentDarkBox(Left, Top, Right, Bottom); XPLMDrawString(rgb, Left+10, Top-10, SDK200TestsXPLMFindSymbolBuffer, NULL, TestFont[SDK200TestsCurrentFontIndex]); XPLMDrawString(rgb, Left+10, Top-20, SDK200TestsXPLMGetVersionsBuffer, NULL, TestFont[SDK200TestsCurrentFontIndex]); XPLMDrawString(rgb, Left+10, Top-50, Buffer, NULL, xplmFont_Basic); int render_type = XPLMGetDatai(SDK200Tests_ref_render_type); sprintf(Buffer, "Current Render Type is %d", render_type); XPLMDrawString(rgb, Left+10, Top-70, Buffer, NULL, xplmFont_Basic); sprintf(Buffer, "Test Feature - XPLMHasFeature is %d : XPLMIsFeatureEnabled is %d", XPLMHasFeature("XPLM_WANTS_REFLECTIONS"), XPLMIsFeatureEnabled("XPLM_WANTS_REFLECTIONS")); XPLMDrawString(rgb, Left+10, Top-90, Buffer, 0, xplmFont_Basic); } } // Not used void SDK200TestsWindowKey(XPLMWindowID inWindowID, char inKey, XPLMKeyFlags inFlags, char vkey, void * inRefcon, int losingFocus) { } // Not used int SDK200TestsWindowMouse(XPLMWindowID inWindowID, int x, int y, XPLMMouseStatus isDown, void * inRefcon) { return 1; } // Using the mouse wheel in the text window will increase the throttle int SDK200TestsWindowMouseWheel(XPLMWindowID inWindowID, int x, int y, int wheel, int clicks, void * inRefcon) { XPLMCommandOnce(XPLMFindCommand("sim/engines/throttle_up_1")); return 1; } // This will change the type of cursor XPLMCursorStatus SDK200TestsWindowCursor(XPLMWindowID inWindowID, int x, int y, void * inRefcon) { return SDK200TestsCursorStatus[SDK200TestsCursorStatusIndex]; } // Function for Draw Object tests void SDK200TestsLoadObject(const char * fname, void * ref) { if(SDK200TestsObject == NULL) SDK200TestsObject = XPLMLoadObject(fname); } // Function for Draw Object tests int SDK200TestsDrawObject( XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon) { // If NULL then first time or reset by widget button press if (SDK200TestsObject == NULL) { if (SDK200TestsCurrentObjectIndex < MAX_OBJECT_ITEMS) // Xplane object so do lookup, will invoke callback if found which will load object XPLMLookupObjects(SDK200TestsObjectPath[SDK200TestsCurrentObjectIndex], 0, 0, SDK200TestsLoadObject, NULL); else // Load the imported object // NOTE - Change this line with the name of your .obj file. SDK200TestsObject = XPLMLoadObject("dummy.obj"); } // Only do this if we have everything we need if (SDK200TestsObject && SDK200Tests_refx && SDK200Tests_refy && SDK200Tests_refz && SDK200TestsObjectProbe) { XPLMProbeInfo_t info; info.structSize = sizeof(info); // Probe the terrain XPLMProbeResult result = XPLMProbeTerrainXYZ( SDK200TestsObjectProbe, XPLMGetDatad(SDK200Tests_refx), XPLMGetDatad(SDK200Tests_refy), XPLMGetDatad(SDK200Tests_refz), &info); // If we have a hit if(result == xplm_ProbeHitTerrain) { XPLMDrawInfo_t locations[2] = { 0 }; locations[0].structSize = sizeof(XPLMDrawInfo_t); locations[0].x = info.locationX; locations[0].y = info.locationY; locations[0].z = info.locationZ; if(info.is_wet)locations[0].pitch += 20.0; if(XPLMGetDatai(SDK200Tests_ref_wrl_type)) locations[0].heading += 30.0; locations[1].structSize = sizeof(XPLMDrawInfo_t); locations[1].x = XPLMGetDatad(SDK200Tests_refx) + 20; locations[1].y = XPLMGetDatad(SDK200Tests_refy); locations[1].z = XPLMGetDatad(SDK200Tests_refz) + 20; locations[1].pitch = 0; locations[1].heading = 0; locations[1].roll = 0; // Draw the object XPLMDrawObjects(SDK200TestsObject, 2, locations, 0, 1); } } return 1; } // Function for Map Draw tests int SDK200TestsMapCB( XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon) { if(inPhase == xplm_Phase_LocalMap3D) { float lx = XPLMGetDataf(SDK200Tests_refx); float ly = XPLMGetDataf(SDK200Tests_refy); float lz = XPLMGetDataf(SDK200Tests_refz); XPLMSetGraphicsState(0, 0, 0, 0, 0, 0, 0); glColor3f(1,1,1); glBegin(GL_LINES); glVertex3f(lx,ly,lz-10.0); glVertex3f(lx,ly,lz+10.0); glVertex3f(lx,ly-10.0,lz); glVertex3f(lx,ly+10.0,lz); glVertex3f(lx-10.0,ly,lz); glVertex3f(lx+10.0,ly,lz); glEnd(); } else { float vl = XPLMGetDataf(SDK200Tests_ref_vl); float vb = XPLMGetDataf(SDK200Tests_ref_vb); float vr = XPLMGetDataf(SDK200Tests_ref_vr); float vt = XPLMGetDataf(SDK200Tests_ref_vt); XPLMSetGraphicsState(0, 0, 0, 0, 0, 0, 0); glColor3f(0, 1, 0); glBegin(GL_LINE_LOOP); glVertex2f(vl+2, vb+2); glVertex2f(vl+2, vt-2); glVertex2f(vr-2, vt-2); glVertex2f(vr-2, vb+2); glEnd(); if(inPhase == xplm_Phase_LocalMapProfile) { int mode_time = XPLMGetDatai(SDK200Tests_ref_mode_time); float x_scale = XPLMGetDataf(SDK200Tests_ref_x_scale); float y_scale = XPLMGetDataf(SDK200Tests_ref_y_scale); float t_scale = XPLMGetDataf(SDK200Tests_ref_t_scale); glColor3f(1,0,0); glBegin(GL_LINES); glVertex2f(vl,vb); if(mode_time) glVertex2f(vl+60.0*t_scale,vb+50.0*t_scale); else glVertex2f(vl+1000.0*x_scale,vb+50.0*y_scale); glEnd(); } } return 1; } // Creates the widget with buttons for test and edit boxes for info void CreateSDK200Tests(int x, int y, int w, int h) { int Item; int x2 = x + w; int y2 = y - h; char Buffer[255]; sprintf(Buffer, "%s %s %s", "SDK200Tests", SDK200TestsVersionNumber, "- Sandy Barbour 2007"); SDK200TestsWidget = XPCreateWidget(x, y, x2, y2, 1, // Visible Buffer, // desc 1, // root NULL, // no container xpWidgetClass_MainWindow); XPSetWidgetProperty(SDK200TestsWidget, xpProperty_MainWindowHasCloseBoxes, 1); SDK200TestsWindow = XPCreateWidget(x+50, y-50, x2-50, y2+50, 1, // Visible "", // desc 0, // root SDK200TestsWidget, xpWidgetClass_SubWindow); XPSetWidgetProperty(SDK200TestsWindow, xpProperty_SubWindowType, xpSubWindowStyle_SubWindow); SDK200TestsButton1 = XPCreateWidget(x+60, y-60, x+140, y-82, 1, " Cmd Test 1", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton1, xpProperty_ButtonType, xpPushButton); SDK200TestsButton2 = XPCreateWidget(x+150, y-60, x+230, y-82, 1, " Cmd Test 2", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton2, xpProperty_ButtonType, xpPushButton); SDK200TestsButton3 = XPCreateWidget(x+240, y-60, x+320, y-82, 1, " Cursor", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton3, xpProperty_ButtonType, xpPushButton); SDK200TestsButton4 = XPCreateWidget(x+330, y-60, x+410, y-82, 1, " Font", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton4, xpProperty_ButtonType, xpPushButton); SDK200TestsButton5 = XPCreateWidget(x+420, y-60, x+500, y-82, 1, " Objects", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton5, xpProperty_ButtonType, xpPushButton); SDK200TestsButton6 = XPCreateWidget(x+60, y-90, x+140, y-112, 1, " Load SIT", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton6, xpProperty_ButtonType, xpPushButton); SDK200TestsButton7 = XPCreateWidget(x+150, y-90, x+230, y-112, 1, " Save SIT", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton7, xpProperty_ButtonType, xpPushButton); SDK200TestsButton8 = XPCreateWidget(x+240, y-90, x+320, y-112, 1, " Load SMO", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton8, xpProperty_ButtonType, xpPushButton); SDK200TestsButton9 = XPCreateWidget(x+330, y-90, x+410, y-112, 1, " Save SMO", 0, SDK200TestsWidget, xpWidgetClass_Button); XPSetWidgetProperty(SDK200TestsButton9, xpProperty_ButtonType, xpPushButton); for (Item=0; Item<MAX_ITEMS; Item++) { SDK200TestsText[Item] = XPCreateWidget(x+60, y-(120 + (Item*30)), x+160, y-(142 + (Item*30)), 1, // Visible SDK200TestsDataDesc[Item],// desc 0, // root SDK200TestsWidget, xpWidgetClass_Caption); SDK200TestsEdit[Item] = XPCreateWidget(x+170, y-(120 + (Item*30)), x+570, y-(142 + (Item*30)), 1, "", 0, SDK200TestsWidget, xpWidgetClass_TextField); XPSetWidgetProperty(SDK200TestsEdit[Item], xpProperty_TextFieldType, xpTextEntryField); } sprintf(Buffer,"Object Index = %d : %s", SDK200TestsCurrentObjectIndex, SDK200TestsObjectPath[SDK200TestsCurrentObjectIndex]); XPSetWidgetDescriptor(SDK200TestsEdit[4], Buffer); XPAddWidgetCallback(SDK200TestsWidget, SDK200TestsHandler); } //Handle the widget messages int SDK200TestsHandler( XPWidgetMessage inMessage, XPWidgetID inWidget, intptr_t inParam1, intptr_t inParam2) { char Buffer[256]; XPLMCommandRef Command1Ref; char CursorStatusDesc[4][80] = {"xplm_CursorDefault", "xplm_CursorHidden", "xplm_CursorArrow", "xplm_CursorCustom"}; // Get the mouse wheel messages and display in widget if (inMessage == xpMsg_MouseWheel) { XPMouseState_t *pXPMouseState = (XPMouseState_t *) inParam1; sprintf(Buffer,"x = %d, y = %d, button = %d, delta = %d", pXPMouseState->x, pXPMouseState->y, pXPMouseState->button, pXPMouseState->delta); XPSetWidgetDescriptor(SDK200TestsEdit[2], Buffer); return 1; } // Get the cursor status message and display in widget if (inMessage == xpMsg_CursorAdjust) { inParam2 = (intptr_t) SDK200TestsCursorStatus[SDK200TestsCursorStatusIndex]; sprintf(Buffer,"New Cursor Status = %d : %s", inParam2, CursorStatusDesc[SDK200TestsCursorStatusIndex]); XPSetWidgetDescriptor(SDK200TestsEdit[3], Buffer); return 1; } // When widget close cross is clicked we only hide the widget if (inMessage == xpMessage_CloseButtonPushed) { if (SDK200TestsMenuItem1 == 1) { XPDestroyWidget(SDK200TestsWidget, 1); SDK200TestsMenuItem1 = 0; } return 1; } // Process when a button on the widget is pressed if (inMessage == xpMsg_PushButtonPressed) { // Tests the Command API, will find command if (inParam1 == (intptr_t)SDK200TestsButton1) { Command1Ref = XPLMFindCommand("sim/operation/screenshot"); if(Command1Ref) { // Separate the command action XPLMCommandBegin(Command1Ref); XPLMCommandEnd(Command1Ref); } return 1; } if (inParam1 == (intptr_t)SDK200TestsButton2) { // Tests the Command API, will create the command Command1Ref = XPLMCreateCommand("sim/operation/screenshot", "Test screenshot"); if(Command1Ref) { // Used the function to combine the command action XPLMCommandOnce(Command1Ref); } return 1; } // Index is increased every button press if (inParam1 == (intptr_t)SDK200TestsButton3) { SDK200TestsCursorStatusIndex++; // Wrap around if (SDK200TestsCursorStatusIndex > 3) SDK200TestsCursorStatusIndex = 0; return 1; } // Index is increased every button press if (inParam1 == (intptr_t)SDK200TestsButton4) { SDK200TestsCurrentFontIndex++; // Wrap around if (SDK200TestsCurrentFontIndex > 1) SDK200TestsCurrentFontIndex = 0; return 1; } // Index is increased every button press if (inParam1 == (intptr_t)SDK200TestsButton5) { SDK200TestsCurrentObjectIndex++; // Wrap around if (SDK200TestsCurrentObjectIndex > MAX_OBJECT_ITEMS) SDK200TestsCurrentObjectIndex = 0; // Reset so that draw is invoked SDK200TestsObject = NULL; // If less than MAX_OBJECT_ITEMS then it is an xplane object if (SDK200TestsCurrentObjectIndex < MAX_OBJECT_ITEMS) sprintf(Buffer,"Object Index = %d : %s", SDK200TestsCurrentObjectIndex, SDK200TestsObjectPath[SDK200TestsCurrentObjectIndex]); // Otherwise use the user supplied object else sprintf(Buffer,"Object Index = %d : %s", SDK200TestsCurrentObjectIndex, "User Supplied Object"); XPSetWidgetDescriptor(SDK200TestsEdit[4], Buffer); return 1; } if (inParam1 == (intptr_t)SDK200TestsButton6) { if (XPLMLoadDataFile(xplm_DataFile_Situation, "Output/situations/test.sit")) XPLMDebugString("XPLMLoadDataFile (.sit) successful\n"); else XPLMDebugString("XPLMLoadDataFile (.sit) failed\n"); return 1; } if (inParam1 == (intptr_t)SDK200TestsButton7) { if (XPLMSaveDataFile(xplm_DataFile_Situation, "Output/situations/test.sit")) XPLMDebugString("XPLMSaveDataFile (.sit) successful\n"); else XPLMDebugString("XPLMSaveDataFile (.sit) failed\n"); return 1; } if (inParam1 == (intptr_t)SDK200TestsButton8) { if (XPLMLoadDataFile(xplm_DataFile_ReplayMovie, "Output/replays/test.rep")) XPLMDebugString("XPLMLoadDataFile (.smo) successful\n"); else XPLMDebugString("XPLMLoadDataFile (.smo) failed\n"); return 1; } if (inParam1 == (intptr_t)SDK200TestsButton9) { if (XPLMSaveDataFile(xplm_DataFile_ReplayMovie, "Output/replays/test.rep")) XPLMDebugString("XPLMSaveDataFile (.smo) successful\n"); else XPLMDebugString("XPLMSaveDataFile (.smo) failed\n"); return 1; } } return 0; } //---------------------------------------------------------------------------