2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
24 #if defined(USE_OSD) && defined(USE_CMS) && defined(CMS_MENU_OSD)
26 #include "build/debug.h"
28 #include "common/utils.h"
31 #include "cms/cms_types.h"
32 #include "cms/cms_menu_osd.h"
34 #include "fc/settings.h"
38 #define OSD_ITEM_ENTRY(label, item_id) ((OSD_Entry){ label, {.itemId = item_id}, &cmsx_menuOsdElementActions, OME_Submenu, 0 })
40 static int osdCurrentLayout
= -1;
41 static int osdCurrentItem
= -1;
43 static uint8_t osdCurrentElementRow
= 0;
44 static uint8_t osdCurrentElementColumn
= 0;
45 static uint8_t osdCurrentElementVisible
= 0;
47 static long osdElementsOnEnter(const OSD_Entry
*from
);
48 static long osdElementsOnExit(const OSD_Entry
*from
);
49 static long osdElemActionsOnEnter(const OSD_Entry
*from
);
51 static const OSD_Entry cmsx_menuAlarmsEntries
[] = {
52 OSD_LABEL_ENTRY("--- ALARMS ---"),
54 OSD_SETTING_ENTRY("RSSI", SETTING_OSD_RSSI_ALARM
),
55 OSD_SETTING_ENTRY("FLY TIME", SETTING_OSD_TIME_ALARM
),
56 OSD_SETTING_ENTRY("MAX ALT", SETTING_OSD_ALT_ALARM
),
57 OSD_SETTING_ENTRY("MAX DIST", SETTING_OSD_DIST_ALARM
),
58 OSD_SETTING_ENTRY("MAX NEG ALT", SETTING_OSD_NEG_ALT_ALARM
),
60 OSD_BACK_AND_END_ENTRY
,
63 static const CMS_Menu cmsx_menuAlarms
= {
65 .GUARD_text
= "MENUOSDA",
66 .GUARD_type
= OME_MENU
,
71 .entries
= cmsx_menuAlarmsEntries
,
74 static long cmsx_osdElementOnChange(displayPort_t
*displayPort
, const void *ptr
)
78 uint16_t *pos
= &osdLayoutsConfigMutable()->item_pos
[osdCurrentLayout
][osdCurrentItem
];
79 *pos
= OSD_POS(osdCurrentElementColumn
, osdCurrentElementRow
);
80 if (osdCurrentElementVisible
) {
81 *pos
|= OSD_VISIBLE_FLAG
;
83 cmsYieldDisplay(displayPort
, 500);
87 static long osdElementPreview(displayPort_t
*displayPort
, const void *ptr
)
91 cmsYieldDisplay(displayPort
, 2000);
96 static const OSD_Entry menuOsdElemActionsEntries
[] = {
98 OSD_BOOL_CALLBACK_ENTRY("ENABLED", cmsx_osdElementOnChange
, &osdCurrentElementVisible
),
99 OSD_UINT8_CALLBACK_ENTRY("ROW", cmsx_osdElementOnChange
, (&(const OSD_UINT8_t
){ &osdCurrentElementRow
, 0, OSD_X(OSD_POS_MAX
), 1 })),
100 OSD_UINT8_CALLBACK_ENTRY("COLUMN", cmsx_osdElementOnChange
, (&(const OSD_UINT8_t
){ &osdCurrentElementColumn
, 0, OSD_Y(OSD_POS_MAX
), 1 })),
101 OSD_FUNC_CALL_ENTRY("PREVIEW", osdElementPreview
),
103 OSD_BACK_AND_END_ENTRY
,
106 static const OSD_Entry menuOsdFixedElemActionsEntries
[] = {
108 OSD_BOOL_CALLBACK_ENTRY("ENABLED", cmsx_osdElementOnChange
, &osdCurrentElementVisible
),
109 OSD_FUNC_CALL_ENTRY("PREVIEW", osdElementPreview
),
111 OSD_BACK_AND_END_ENTRY
,
114 static CMS_Menu cmsx_menuOsdElementActions
= {
115 #ifdef CMS_MENU_DEBUG
116 .GUARD_text
= "MENUOSDELEM",
117 .GUARD_type
= OME_MENU
,
119 .onEnter
= osdElemActionsOnEnter
,
121 .onGlobalExit
= NULL
,
122 .entries
= menuOsdElemActionsEntries
,
125 static long osdElemActionsOnEnter(const OSD_Entry
*from
)
127 osdCurrentItem
= from
->itemId
;
128 uint16_t pos
= osdLayoutsConfig()->item_pos
[osdCurrentLayout
][osdCurrentItem
];
129 osdCurrentElementColumn
= OSD_X(pos
);
130 osdCurrentElementRow
= OSD_Y(pos
);
131 osdCurrentElementVisible
= OSD_VISIBLE(pos
) ? 1 : 0;
132 if (osdItemIsFixed(osdCurrentItem
)) {
133 cmsx_menuOsdElementActions
.entries
= menuOsdFixedElemActionsEntries
;
135 cmsx_menuOsdElementActions
.entries
= menuOsdElemActionsEntries
;
140 #define OSD_ELEMENT_ENTRY(name, osd_item_id) OSD_ITEM_ENTRY(name, osd_item_id)
142 static const OSD_Entry menuCrsfRxEntries
[]=
144 OSD_LABEL_ENTRY("-- CRSF RX --"),
146 OSD_SETTING_ENTRY("LQ FORMAT", SETTING_OSD_CRSF_LQ_FORMAT
),
147 OSD_SETTING_ENTRY("LQ ALARM LEVEL", SETTING_OSD_LINK_QUALITY_ALARM
),
148 OSD_SETTING_ENTRY("SNR ALARM LEVEL", SETTING_OSD_SNR_ALARM
),
149 OSD_SETTING_ENTRY("RX SENSITIVITY", SETTING_OSD_RSSI_DBM_MIN
),
150 OSD_ELEMENT_ENTRY("RX RSSI DBM", OSD_CRSF_RSSI_DBM
),
151 OSD_ELEMENT_ENTRY("RX LQ", OSD_CRSF_LQ
),
152 OSD_ELEMENT_ENTRY("RX SNR ALARM", OSD_CRSF_SNR_DB
),
153 OSD_ELEMENT_ENTRY("TX POWER", OSD_CRSF_TX_POWER
),
155 OSD_BACK_AND_END_ENTRY
,
158 const CMS_Menu cmsx_menuCrsf
= {
159 #ifdef CMS_MENU_DEBUG
160 .GUARD_text
= "MENUCRF",
161 .GUARD_type
= OME_MENU
,
165 .onGlobalExit
= NULL
,
166 .entries
= menuCrsfRxEntries
,
169 static const OSD_Entry menuOsdElemsEntries
[] =
171 OSD_LABEL_ENTRY("--- OSD ITEMS ---"),
173 OSD_ELEMENT_ENTRY("RSSI", OSD_RSSI_VALUE
),
174 #ifdef USE_SERIALRX_CRSF
175 OSD_SUBMENU_ENTRY("CRSF RX", &cmsx_menuCrsf
),
177 OSD_ELEMENT_ENTRY("MAIN BATTERY", OSD_MAIN_BATT_VOLTAGE
),
178 OSD_ELEMENT_ENTRY("MAIN BATT SC", OSD_SAG_COMPENSATED_MAIN_BATT_VOLTAGE
),
179 OSD_ELEMENT_ENTRY("CELL VOLTAGE", OSD_MAIN_BATT_CELL_VOLTAGE
),
180 OSD_ELEMENT_ENTRY("CELL VOLT. SC", OSD_MAIN_BATT_SAG_COMPENSATED_CELL_VOLTAGE
),
181 OSD_ELEMENT_ENTRY("BAT IMPEDANCE", OSD_POWER_SUPPLY_IMPEDANCE
),
182 OSD_ELEMENT_ENTRY("CROSSHAIRS", OSD_CROSSHAIRS
),
183 OSD_ELEMENT_ENTRY("HORIZON", OSD_ARTIFICIAL_HORIZON
),
184 OSD_ELEMENT_ENTRY("HORIZON SIDEBARS", OSD_HORIZON_SIDEBARS
),
185 OSD_ELEMENT_ENTRY("ON TIME", OSD_ONTIME
),
186 OSD_ELEMENT_ENTRY("FLY TIME", OSD_FLYTIME
),
187 OSD_ELEMENT_ENTRY("ON/FLY TIME", OSD_ONTIME_FLYTIME
),
188 OSD_ELEMENT_ENTRY("REM. TIME", OSD_REMAINING_FLIGHT_TIME_BEFORE_RTH
),
189 OSD_ELEMENT_ENTRY("REM. DIST", OSD_REMAINING_DISTANCE_BEFORE_RTH
),
190 OSD_ELEMENT_ENTRY("TIME (HOUR)", OSD_RTC_TIME
),
191 OSD_ELEMENT_ENTRY("FLY MODE", OSD_FLYMODE
),
192 OSD_ELEMENT_ENTRY("NAME", OSD_CRAFT_NAME
),
193 OSD_ELEMENT_ENTRY("THR. ", OSD_THROTTLE_POS
),
194 OSD_ELEMENT_ENTRY("THR. (SCALED)", OSD_SCALED_THROTTLE_POS
),
195 OSD_ELEMENT_ENTRY("SYS MESSAGES", OSD_MESSAGES
),
196 OSD_ELEMENT_ENTRY("VTX CHAN", OSD_VTX_CHANNEL
),
197 OSD_ELEMENT_ENTRY("CURRENT (A)", OSD_CURRENT_DRAW
),
198 OSD_ELEMENT_ENTRY("POWER", OSD_POWER
),
199 OSD_ELEMENT_ENTRY("USED MAH", OSD_MAH_DRAWN
),
200 OSD_ELEMENT_ENTRY("USED WH", OSD_WH_DRAWN
),
201 OSD_ELEMENT_ENTRY("EFF/KM (AH)", OSD_EFFICIENCY_MAH_PER_KM
),
202 OSD_ELEMENT_ENTRY("EFF/KM (WH)", OSD_EFFICIENCY_WH_PER_KM
),
203 OSD_ELEMENT_ENTRY("BATT CAP REM", OSD_BATTERY_REMAINING_CAPACITY
),
204 OSD_ELEMENT_ENTRY("BATT % REM", OSD_BATTERY_REMAINING_PERCENT
),
206 OSD_ELEMENT_ENTRY("HOME DIR", OSD_HOME_DIR
),
207 OSD_ELEMENT_ENTRY("HOME HEAD. ERR", OSD_HOME_HEADING_ERROR
),
208 OSD_ELEMENT_ENTRY("HOME DIST", OSD_HOME_DIST
),
209 OSD_ELEMENT_ENTRY("TRIP DIST", OSD_TRIP_DIST
),
210 OSD_ELEMENT_ENTRY("GPS SPEED", OSD_GPS_SPEED
),
211 OSD_ELEMENT_ENTRY("GPS SATS", OSD_GPS_SATS
),
212 OSD_ELEMENT_ENTRY("GPS LAT", OSD_GPS_LAT
),
213 OSD_ELEMENT_ENTRY("GPS LON", OSD_GPS_LON
),
214 OSD_ELEMENT_ENTRY("GPS HDOP", OSD_GPS_HDOP
),
215 OSD_ELEMENT_ENTRY("3D SPEED", OSD_3D_SPEED
),
216 OSD_ELEMENT_ENTRY("PLUS CODE", OSD_PLUS_CODE
),
217 OSD_ELEMENT_ENTRY("AZIMUTH", OSD_AZIMUTH
),
218 OSD_ELEMENT_ENTRY("GRD COURSE", OSD_GROUND_COURSE
),
219 OSD_ELEMENT_ENTRY("X TRACK ERR", OSD_CROSS_TRACK_ERROR
),
221 OSD_ELEMENT_ENTRY("HEADING", OSD_HEADING
),
222 OSD_ELEMENT_ENTRY("HEADING GR.", OSD_HEADING_GRAPH
),
223 OSD_ELEMENT_ENTRY("CRS HLD ERR", OSD_COURSE_HOLD_ERROR
),
224 OSD_ELEMENT_ENTRY("CRS HLD ADJ", OSD_COURSE_HOLD_ADJUSTMENT
),
225 #if defined(USE_BARO) || defined(USE_GPS)
226 OSD_ELEMENT_ENTRY("VARIO", OSD_VARIO
),
227 OSD_ELEMENT_ENTRY("VARIO NUM", OSD_VARIO_NUM
),
229 OSD_ELEMENT_ENTRY("ALTITUDE", OSD_ALTITUDE
),
230 OSD_ELEMENT_ENTRY("ALTITUDE MSL", OSD_ALTITUDE_MSL
),
231 #if defined(USE_PITOT)
232 OSD_ELEMENT_ENTRY("AIR SPEED", OSD_AIR_SPEED
),
235 OSD_ELEMENT_ENTRY("MAP NORTH", OSD_MAP_NORTH
),
236 OSD_ELEMENT_ENTRY("MAP TAKE OFF", OSD_MAP_TAKEOFF
),
237 OSD_ELEMENT_ENTRY("RADAR", OSD_RADAR
),
238 OSD_ELEMENT_ENTRY("MAP SCALE", OSD_MAP_SCALE
),
239 OSD_ELEMENT_ENTRY("MAP REFERENCE", OSD_MAP_REFERENCE
),
240 OSD_ELEMENT_ENTRY("FORMATION FLIGHT", OSD_FORMATION_FLIGHT
),
242 OSD_ELEMENT_ENTRY("EXPO", OSD_RC_EXPO
),
243 OSD_ELEMENT_ENTRY("YAW EXPO", OSD_RC_YAW_EXPO
),
244 OSD_ELEMENT_ENTRY("THR EXPO", OSD_THROTTLE_EXPO
),
245 OSD_ELEMENT_ENTRY("ROLL RATE", OSD_ROLL_RATE
),
246 OSD_ELEMENT_ENTRY("PITCH RATE", OSD_PITCH_RATE
),
247 OSD_ELEMENT_ENTRY("YAW RATE", OSD_YAW_RATE
),
248 OSD_ELEMENT_ENTRY("M EXPO", OSD_MANUAL_RC_EXPO
),
249 OSD_ELEMENT_ENTRY("M YAW EXPO", OSD_MANUAL_RC_YAW_EXPO
),
250 OSD_ELEMENT_ENTRY("M ROLL RATE", OSD_MANUAL_ROLL_RATE
),
251 OSD_ELEMENT_ENTRY("M PITCH RATE", OSD_MANUAL_PITCH_RATE
),
252 OSD_ELEMENT_ENTRY("M YAW RATE", OSD_MANUAL_YAW_RATE
),
253 OSD_ELEMENT_ENTRY("CRUISE THR", OSD_NAV_FW_CRUISE_THR
),
254 OSD_ELEMENT_ENTRY("PITCH TO THR", OSD_NAV_FW_PITCH2THR
),
255 OSD_ELEMENT_ENTRY("ROLL PIDS", OSD_ROLL_PIDS
),
256 OSD_ELEMENT_ENTRY("PITCH PIDS", OSD_PITCH_PIDS
),
257 OSD_ELEMENT_ENTRY("YAW PIDS", OSD_YAW_PIDS
),
258 OSD_ELEMENT_ENTRY("LEVEL PIDS", OSD_LEVEL_PIDS
),
259 OSD_ELEMENT_ENTRY("POSXY PIDS", OSD_POS_XY_PIDS
),
260 OSD_ELEMENT_ENTRY("POSZ PIDS", OSD_POS_Z_PIDS
),
261 OSD_ELEMENT_ENTRY("VELXY PIDS", OSD_VEL_XY_PIDS
),
262 OSD_ELEMENT_ENTRY("VELZ PIDS", OSD_VEL_Z_PIDS
),
263 OSD_ELEMENT_ENTRY("HEAD P", OSD_HEADING_P
),
264 OSD_ELEMENT_ENTRY("ALIGN ROLL", OSD_BOARD_ALIGN_ROLL
),
265 OSD_ELEMENT_ENTRY("ALIGN PITCH", OSD_BOARD_ALIGN_PITCH
),
266 OSD_ELEMENT_ENTRY("0THR PITCH", OSD_FW_MIN_THROTTLE_DOWN_PITCH_ANGLE
),
268 OSD_ELEMENT_ENTRY("FW ALT PID OUT", OSD_FW_ALT_PID_OUTPUTS
),
269 OSD_ELEMENT_ENTRY("FW POS PID OUT", OSD_FW_POS_PID_OUTPUTS
),
270 OSD_ELEMENT_ENTRY("MC VELX PID OUT", OSD_MC_VEL_X_PID_OUTPUTS
),
271 OSD_ELEMENT_ENTRY("MC VELY PID OUT", OSD_MC_VEL_Y_PID_OUTPUTS
),
272 OSD_ELEMENT_ENTRY("MC VELZ PID OUT", OSD_MC_VEL_Z_PID_OUTPUTS
),
273 OSD_ELEMENT_ENTRY("MC POS PID OUT", OSD_MC_POS_XYZ_P_OUTPUTS
),
275 OSD_ELEMENT_ENTRY("ATTI PITCH", OSD_ATTITUDE_PITCH
),
276 OSD_ELEMENT_ENTRY("ATTI ROLL", OSD_ATTITUDE_ROLL
),
278 OSD_ELEMENT_ENTRY("WIND HOR", OSD_WIND_SPEED_HORIZONTAL
),
279 OSD_ELEMENT_ENTRY("WIND VERT", OSD_WIND_SPEED_VERTICAL
),
281 OSD_ELEMENT_ENTRY("G-FORCE", OSD_GFORCE
),
282 OSD_ELEMENT_ENTRY("G-FORCE X", OSD_GFORCE_X
),
283 OSD_ELEMENT_ENTRY("G-FORCE Y", OSD_GFORCE_Y
),
284 OSD_ELEMENT_ENTRY("G-FORCE Z", OSD_GFORCE_Z
),
286 OSD_ELEMENT_ENTRY("VTX POWER", OSD_VTX_POWER
),
288 #if defined(USE_RX_MSP) && defined(USE_MSP_RC_OVERRIDE)
289 OSD_ELEMENT_ENTRY("RC SOURCE", OSD_RC_SOURCE
),
292 OSD_ELEMENT_ENTRY("IMU TEMP", OSD_IMU_TEMPERATURE
),
294 OSD_ELEMENT_ENTRY("BARO TEMP", OSD_BARO_TEMPERATURE
),
297 #ifdef USE_TEMPERATURE_SENSOR
298 OSD_ELEMENT_ENTRY("SENSOR 0 TEMP", OSD_TEMP_SENSOR_0_TEMPERATURE
),
299 OSD_ELEMENT_ENTRY("SENSOR 1 TEMP", OSD_TEMP_SENSOR_1_TEMPERATURE
),
300 OSD_ELEMENT_ENTRY("SENSOR 2 TEMP", OSD_TEMP_SENSOR_2_TEMPERATURE
),
301 OSD_ELEMENT_ENTRY("SENSOR 3 TEMP", OSD_TEMP_SENSOR_3_TEMPERATURE
),
302 OSD_ELEMENT_ENTRY("SENSOR 4 TEMP", OSD_TEMP_SENSOR_4_TEMPERATURE
),
303 OSD_ELEMENT_ENTRY("SENSOR 5 TEMP", OSD_TEMP_SENSOR_5_TEMPERATURE
),
304 OSD_ELEMENT_ENTRY("SENSOR 6 TEMP", OSD_TEMP_SENSOR_6_TEMPERATURE
),
305 OSD_ELEMENT_ENTRY("SENSOR 7 TEMP", OSD_TEMP_SENSOR_7_TEMPERATURE
),
308 OSD_ELEMENT_ENTRY("GVAR 0", OSD_GVAR_0
),
309 OSD_ELEMENT_ENTRY("GVAR 1", OSD_GVAR_1
),
310 OSD_ELEMENT_ENTRY("GVAR 2", OSD_GVAR_2
),
311 OSD_ELEMENT_ENTRY("GVAR 3", OSD_GVAR_3
),
313 OSD_ELEMENT_ENTRY("TPA", OSD_TPA
),
314 OSD_ELEMENT_ENTRY("FW CTRL SMOOTH", OSD_NAV_FW_CONTROL_SMOOTHNESS
),
315 OSD_ELEMENT_ENTRY("VERSION", OSD_VERSION
),
316 OSD_ELEMENT_ENTRY("RANGEFINDER", OSD_RANGEFINDER
),
318 #ifdef USE_ESC_SENSOR
319 OSD_ELEMENT_ENTRY("ESC RPM", OSD_ESC_RPM
),
320 OSD_ELEMENT_ENTRY("ESC TEMPERATURE", OSD_ESC_TEMPERATURE
),
323 #ifdef USE_POWER_LIMITS
324 OSD_ELEMENT_ENTRY("PLIM BURST TIME", OSD_PLIMIT_REMAINING_BURST_TIME
),
325 OSD_ELEMENT_ENTRY("PLIM CURR LIMIT", OSD_PLIMIT_ACTIVE_CURRENT_LIMIT
),
327 OSD_ELEMENT_ENTRY("PLIM POWER LIMIT", OSD_PLIMIT_ACTIVE_POWER_LIMIT
),
329 #endif // USE_POWER_LIMITS
331 OSD_BACK_AND_END_ENTRY
,
334 const CMS_Menu menuOsdElements
= {
335 #ifdef CMS_MENU_DEBUG
336 .GUARD_text
= "MENUOSDE",
337 .GUARD_type
= OME_MENU
,
339 .onEnter
= osdElementsOnEnter
,
340 .onExit
= osdElementsOnExit
,
341 .onGlobalExit
= NULL
,
342 .entries
= menuOsdElemsEntries
,
346 #define OSD_LAYOUT_SUBMENU_ENTRY(label) OSD_SUBMENU_ENTRY(label, &menuOsdElements)
348 static const OSD_Entry cmsx_menuOsdLayoutEntries
[] =
350 OSD_LABEL_ENTRY("---SCREEN LAYOUT---"),
352 OSD_LAYOUT_SUBMENU_ENTRY("DEFAULT"),
353 #if OSD_ALTERNATE_LAYOUT_COUNT > 0
354 OSD_LAYOUT_SUBMENU_ENTRY("ALTERNATE 1"),
355 #if OSD_ALTERNATE_LAYOUT_COUNT > 1
356 OSD_LAYOUT_SUBMENU_ENTRY("ALTERNATE 2"),
357 #if OSD_ALTERNATE_LAYOUT_COUNT > 2
358 OSD_LAYOUT_SUBMENU_ENTRY("ALTERNATE 3"),
363 OSD_BACK_AND_END_ENTRY
,
366 const CMS_Menu cmsx_menuOsdLayout
= {
367 #ifdef CMS_MENU_DEBUG
368 .GUARD_text
= "MENUOSDL",
369 .GUARD_type
= OME_MENU
,
373 .onGlobalExit
= NULL
,
374 .entries
= cmsx_menuOsdLayoutEntries
,
377 static long osdElementsOnEnter(const OSD_Entry
*from
)
379 // First entry is the label. Store the current layout
380 // and override it on the OSD so previews so this layout.
381 osdCurrentLayout
= from
- cmsx_menuOsdLayoutEntries
- 1;
382 osdOverrideLayout(osdCurrentLayout
, 0);
386 static long osdElementsOnExit(const OSD_Entry
*from
)
390 // Stop overriding OSD layout
391 osdOverrideLayout(-1, 0);
395 static const OSD_Entry menuOsdSettingsEntries
[] = {
396 OSD_LABEL_ENTRY("--- OSD SETTINGS ---"),
398 OSD_SETTING_ENTRY("VOLT. DECIMALS", SETTING_OSD_MAIN_VOLTAGE_DECIMALS
),
399 OSD_SETTING_ENTRY("COORD. DIGITS", SETTING_OSD_COORDINATE_DIGITS
),
400 OSD_SETTING_ENTRY("LEFT SCROLL", SETTING_OSD_LEFT_SIDEBAR_SCROLL
),
401 OSD_SETTING_ENTRY("RIGHT SCROLL", SETTING_OSD_RIGHT_SIDEBAR_SCROLL
),
402 OSD_SETTING_ENTRY("SCROLL ARROWS", SETTING_OSD_SIDEBAR_SCROLL_ARROWS
),
404 OSD_BACK_AND_END_ENTRY
,
407 static const CMS_Menu cmsx_menuOsdSettings
= {
408 #ifdef CMS_MENU_DEBUG
409 .GUARD_text
= "MENUOSDS",
410 .GUARD_type
= OME_MENU
,
414 .onGlobalExit
= NULL
,
415 .entries
= menuOsdSettingsEntries
,
418 static const OSD_Entry menuOsdHud2Entries
[] = {
419 OSD_LABEL_ENTRY("--- HUD ITEMS ---"),
421 OSD_SETTING_ENTRY("HOMING ARROWS", SETTING_OSD_HUD_HOMING
),
422 OSD_SETTING_ENTRY("HOME POINT", SETTING_OSD_HUD_HOMEPOINT
),
423 OSD_SETTING_ENTRY("RADAR MAX AIRCRAFT", SETTING_OSD_HUD_RADAR_DISP
),
424 OSD_SETTING_ENTRY("RADAR MIN RANGE", SETTING_OSD_HUD_RADAR_RANGE_MIN
),
425 OSD_SETTING_ENTRY("RADAR MAX RANGE", SETTING_OSD_HUD_RADAR_RANGE_MAX
),
426 OSD_SETTING_ENTRY("NEXT WAYPOINTS", SETTING_OSD_HUD_WP_DISP
),
431 static const CMS_Menu cmsx_menuOsdHud2
= {
432 #ifdef CMS_MENU_DEBUG
433 .GUARD_text
= "MENUOSDH2",
434 .GUARD_type
= OME_MENU
,
438 .onGlobalExit
= NULL
,
439 .entries
= menuOsdHud2Entries
,
442 static const OSD_Entry menuOsdHudEntries
[] = {
443 OSD_LABEL_ENTRY("--- HUD ---"),
445 OSD_SETTING_ENTRY("CROSSHAIRS STYLE", SETTING_OSD_CROSSHAIRS_STYLE
),
446 OSD_SETTING_ENTRY("HORIZON OFFSET", SETTING_OSD_HORIZON_OFFSET
),
447 OSD_SETTING_ENTRY("CAMERA UPTILT", SETTING_OSD_CAMERA_UPTILT
),
448 OSD_SETTING_ENTRY("CAMERA FOV HORI", SETTING_OSD_CAMERA_FOV_H
),
449 OSD_SETTING_ENTRY("CAMERA FOV VERT", SETTING_OSD_CAMERA_FOV_V
),
450 OSD_SETTING_ENTRY("HUD MARGIN HORI", SETTING_OSD_HUD_MARGIN_H
),
451 OSD_SETTING_ENTRY("HUD MARGIN VERT", SETTING_OSD_HUD_MARGIN_V
),
452 OSD_SUBMENU_ENTRY("DISPLAYED ITEMS", &cmsx_menuOsdHud2
),
458 #ifdef USE_CMS_FONT_PREVIEW
460 static const OSD_Entry menuOsdFontPage1Entries
[] = {
461 OSD_LABEL_ENTRY("FONT: 0123456789ABCDEF"),
462 OSD_LABEL_ENTRY(" 00: \x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"),
463 OSD_LABEL_ENTRY(" 10: \x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"),
464 OSD_LABEL_ENTRY(" 20: \x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F"),
465 OSD_LABEL_ENTRY(" 30: \x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F"),
466 OSD_LABEL_ENTRY(" 40: \x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F"),
467 OSD_LABEL_ENTRY(" 50: \x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F"),
468 OSD_LABEL_ENTRY(" 60: \x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F"),
469 OSD_LABEL_ENTRY(" 70: \x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F"),
470 OSD_LABEL_ENTRY(" 80: \x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F"),
471 OSD_LABEL_ENTRY(" 90: \x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F"),
472 OSD_LABEL_ENTRY(" A0: \xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"),
473 OSD_LABEL_ENTRY(" B0: \xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF"),
474 OSD_LABEL_ENTRY(" C0: \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF"),
475 OSD_LABEL_ENTRY(" "),
476 OSD_LABEL_ENTRY(" "),
477 OSD_LABEL_ENTRY(" "),
478 OSD_LABEL_ENTRY("FONT: 0123456789ABCDEF"),
479 OSD_LABEL_ENTRY(" D0: \xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF"),
480 OSD_LABEL_ENTRY(" E0: \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEE"),
481 OSD_LABEL_ENTRY(" F0: \xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"),
487 static const OSD_Entry menuOsdFontPage2Entries
[] = {
488 OSD_LABEL_ENTRY( "FONT: 0123456789ABCDEF"),
489 OSD_LABEL_PAGE2_ENTRY(" 00: ", "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\0"),
490 OSD_LABEL_PAGE2_ENTRY(" 10: ", "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\0"),
491 OSD_LABEL_PAGE2_ENTRY(" 20: ", "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\0"),
492 OSD_LABEL_PAGE2_ENTRY(" 30: ", "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\0"),
493 OSD_LABEL_PAGE2_ENTRY(" 40: ", "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\0"),
494 OSD_LABEL_PAGE2_ENTRY(" 50: ", "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\0"),
495 OSD_LABEL_PAGE2_ENTRY(" 60: ", "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\0"),
496 OSD_LABEL_PAGE2_ENTRY(" 70: ", "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\0"),
497 OSD_LABEL_PAGE2_ENTRY(" 80: ", "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\0"),
498 OSD_LABEL_PAGE2_ENTRY(" 90: ", "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\0"),
499 OSD_LABEL_PAGE2_ENTRY(" A0: ", "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\0"),
500 OSD_LABEL_PAGE2_ENTRY(" B0: ", "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\0"),
501 OSD_LABEL_PAGE2_ENTRY(" C0: ", "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\0"),
502 OSD_LABEL_ENTRY(" "),
503 OSD_LABEL_ENTRY(" "),
504 OSD_LABEL_ENTRY(" "),
505 OSD_LABEL_ENTRY( "FONT: 0123456789ABCDEF"),
506 OSD_LABEL_PAGE2_ENTRY(" D0: ", "\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\0"),
507 OSD_LABEL_PAGE2_ENTRY(" E0: ", "\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEE\0"),
508 OSD_LABEL_PAGE2_ENTRY(" F0: ", "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF\0"),
509 OSD_LABEL_ENTRY(" "),
516 static const CMS_Menu cmsx_menuOsdFontPage1
= {
517 #ifdef CMS_MENU_DEBUG
518 .GUARD_text
= "MENUOSDFONTP1",
519 .GUARD_type
= OME_MENU
,
523 .onGlobalExit
= NULL
,
524 .entries
= menuOsdFontPage1Entries
,
527 static const CMS_Menu cmsx_menuOsdFontPage2
= {
528 #ifdef CMS_MENU_DEBUG
529 .GUARD_text
= "MENUOSDFONTP2",
530 .GUARD_type
= OME_MENU
,
534 .onGlobalExit
= NULL
,
535 .entries
= menuOsdFontPage2Entries
,
538 static const OSD_Entry menuOsdFontEntries
[] = {
539 OSD_LABEL_ENTRY("--- FONT ---"),
540 OSD_SUBMENU_ENTRY("PAGE 1", &cmsx_menuOsdFontPage1
),
541 OSD_SUBMENU_ENTRY("PAGE 2", &cmsx_menuOsdFontPage2
),
547 static const CMS_Menu cmsx_menuFont
= {
548 #ifdef CMS_MENU_DEBUG
549 .GUARD_text
= "MENUFONT",
550 .GUARD_type
= OME_MENU
,
554 .onGlobalExit
= NULL
,
555 .entries
= menuOsdFontEntries
,
558 #endif // USE_CMS_FONT_PREVIEW
560 static const CMS_Menu cmsx_menuOsdHud
= {
561 #ifdef CMS_MENU_DEBUG
562 .GUARD_text
= "MENUOSDH",
563 .GUARD_type
= OME_MENU
,
567 .onGlobalExit
= NULL
,
568 .entries
= menuOsdHudEntries
,
571 static const OSD_Entry menuOsdEntries
[] = {
572 OSD_LABEL_ENTRY("--- OSD ---"),
574 OSD_SUBMENU_ENTRY("LAYOUTS", &cmsx_menuOsdLayout
),
575 OSD_SUBMENU_ENTRY("SETTINGS", &cmsx_menuOsdSettings
),
576 OSD_SUBMENU_ENTRY("ALARMS", &cmsx_menuAlarms
),
577 OSD_SUBMENU_ENTRY("HUD", &cmsx_menuOsdHud
),
578 #ifdef USE_CMS_FONT_PREVIEW
579 OSD_SUBMENU_ENTRY("FONT", &cmsx_menuFont
),
582 OSD_BACK_AND_END_ENTRY
,
586 const CMS_Menu cmsx_menuOsd
= {
587 #ifdef CMS_MENU_DEBUG
588 .GUARD_text
= "MENUOSD",
589 .GUARD_type
= OME_MENU
,
593 .onGlobalExit
= NULL
,
594 .entries
= menuOsdEntries
,