-
Notifications
You must be signed in to change notification settings - Fork 0
/
get_altitudes.cpp
133 lines (113 loc) · 4.94 KB
/
get_altitudes.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// This basic plugin is a modified and de-commented version of the sample
// "Hello, World" plugin code found here:
// https://developer.x-plane.com/code-sample/hello-world-sdk-3/
#include <string.h>
#include <windows.h>
#include <string>
#include "XPLMDataAccess.h"
#include "XPLMDisplay.h"
#include "XPLMGraphics.h"
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifndef XPLM300
#error This is made to be compiled against the XPLM300 SDK
#endif
// An opaque handle to the window we will create
static XPLMWindowID g_window;
static XPLMDataRef elevationMslRef;
static XPLMDataRef elevationAglRef;
// Callbacks we will register when we create our window
void draw_hello_world(XPLMWindowID in_window_id, void* in_refcon);
int dummy_mouse_handler(XPLMWindowID in_window_id, int x, int y, int is_down,
void* in_refcon) {
return 0;
}
XPLMCursorStatus dummy_cursor_status_handler(XPLMWindowID in_window_id, int x,
int y, void* in_refcon) {
return xplm_CursorDefault;
}
int dummy_wheel_handler(XPLMWindowID in_window_id, int x, int y, int wheel,
int clicks, void* in_refcon) {
return 0;
}
void dummy_key_handler(XPLMWindowID in_window_id, char key, XPLMKeyFlags flags,
char virtual_key, void* in_refcon, int losing_focus) {}
PLUGIN_API int XPluginStart(char* outName, char* outSig, char* outDesc) {
strcpy(outName, "GetAltitudesPlugin");
strcpy(outSig, "alielnour.getaltitudesplugin");
strcpy(outDesc, "A plug-in that displays both the AGL and MSL altitudes.");
XPLMCreateWindow_t params;
params.structSize = sizeof(params);
params.visible = 1;
params.drawWindowFunc = draw_hello_world;
params.handleMouseClickFunc = dummy_mouse_handler;
params.handleRightClickFunc = dummy_mouse_handler;
params.handleMouseWheelFunc = dummy_wheel_handler;
params.handleKeyFunc = dummy_key_handler;
params.handleCursorFunc = dummy_cursor_status_handler;
params.refcon = NULL;
params.layer = xplm_WindowLayerFloatingWindows;
// Opt-in to styling our window like an X-Plane 11 native window
params.decorateAsFloatingWindow = xplm_WindowDecorationRoundRectangle;
// Set the window's initial bounds
int left, bottom, right, top;
XPLMGetScreenBoundsGlobal(&left, &top, &right, &bottom);
params.left = left + 50;
params.bottom = bottom + 150;
params.right = params.left + 200;
params.top = params.bottom + 200;
// Obtain datarefs for MSL and AGL elevation, respectively
elevationMslRef = XPLMFindDataRef("sim/flightmodel/position/elevation");
elevationAglRef = XPLMFindDataRef("sim/flightmodel/position/y_agl");
g_window = XPLMCreateWindowEx(¶ms);
// Position the window as a "free" floating window, which the user can drag
// around
XPLMSetWindowPositioningMode(g_window, xplm_WindowPositionFree, -1);
// Limit resizing our window: maintain a minimum width/height of 100 boxels
// and a max width/height of 300 boxels
XPLMSetWindowResizingLimits(g_window, 200, 50, 300, 50);
XPLMSetWindowTitle(g_window, "Positional Flight Data");
return g_window != NULL;
}
PLUGIN_API void XPluginStop(void) {
XPLMDestroyWindow(g_window);
g_window = NULL;
}
PLUGIN_API void XPluginDisable(void) {}
PLUGIN_API int XPluginEnable(void) { return 1; }
PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFrom, int inMsg,
void* inParam) {}
void draw_hello_world(XPLMWindowID in_window_id, void* in_refcon) {
XPLMSetGraphicsState(0 /* no fog */, 0 /* 0 texture units */,
0 /* no lighting */, 0 /* no alpha testing */,
1 /* do alpha blend */, 1 /* do depth testing */,
0 /* no depth writing */
);
int l, t, r, b;
XPLMGetWindowGeometry(in_window_id, &l, &t, &r, &b);
float col_white[] = {1.0, 1.0, 1.0}; // RGB
// Dataref provides altitudes in meters, need to convert to feet to match
// in-game display for validation
float metersToFeetRate = 3.28084;
float currentElevationMsl =
XPLMGetDataf(elevationMslRef) * metersToFeetRate;
float currentElevationAgl =
XPLMGetDataf(elevationAglRef) * metersToFeetRate;
std::string elevationMslStr =
"Elevation (MSL): " + std::to_string(currentElevationMsl) + " ft";
std::string elevationAglStr =
"Elevation (AGL): " + std::to_string(currentElevationAgl) + " ft";
XPLMDrawString(col_white, l + 10, t - 20, elevationMslStr.c_str(), NULL,
xplmFont_Proportional);
XPLMDrawString(col_white, l + 10, t - 30, elevationAglStr.c_str(), NULL,
xplmFont_Proportional);
}