/* * Copyright (C) OpenTX * * Based on code named * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef _MENUS_H_ #define _MENUS_H_ #define MENUS_SCROLLBAR_WIDTH 0 #define MENU_COLUMNS 1 #define COLUMN_X 0 #define lcd_putsColumnLeft(x, y, str) lcd_putsLeft(y, str) // Menus related stuff ... #if defined(SDCARD) typedef uint16_t vertpos_t; #else typedef uint8_t vertpos_t; #endif typedef uint8_t check_event_t; #define horzpos_t uint8_t #if defined(CPUARM) extern tmr10ms_t menuEntryTime; #endif extern vertpos_t menuVerticalPosition; extern horzpos_t menuHorizontalPosition; extern vertpos_t menuVerticalOffset; extern uint8_t calibrationState; // Temporary no highlight extern uint8_t noHighlightCounter; #define NO_HIGHLIGHT() (noHighlightCounter > 0) #define START_NO_HIGHLIGHT() do { noHighlightCounter = 25; } while(0) void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr); typedef void (* MenuHandlerFunc)(uint8_t event); extern MenuHandlerFunc menuHandlers[5]; extern uint8_t menuVerticalPositions[4]; extern uint8_t menuLevel; extern uint8_t menuEvent; /// goto given Menu, but substitute current menu in menuStack void chainMenu(MenuHandlerFunc newMenu); /// goto given Menu, store current menu in menuStack void pushMenu(MenuHandlerFunc newMenu); /// return to last menu in menustack void popMenu(); ///deliver address of last menu which was popped from inline MenuHandlerFunc lastPopMenu() { return menuHandlers[menuLevel+1]; } void drawPotsBars(); void doMainScreenGraphics(); void menuFirstCalib(uint8_t event); void onMainViewMenu(const char * result); void menuMainView(uint8_t event); void menuTelemetryFrsky(uint8_t event); void menuTelemetryMavlinkSetup(uint8_t event); void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext); enum EnumTabDiag { e_Setup, CASE_SDCARD(e_Sd) CASE_CPUARM(e_GeneralCustomFunctions) e_Trainer, e_Vers, e_Keys, e_Ana, CASE_CPUARM(e_Hardware) e_Calib }; void menuGeneralSetup(uint8_t event); void menuGeneralSdManager(uint8_t event); void menuGeneralCustomFunctions(uint8_t event); void menuGeneralTrainer(uint8_t event); void menuGeneralVersion(uint8_t event); void menuGeneralDiagKeys(uint8_t event); void menuGeneralDiagAna(uint8_t event); void menuGeneralHardware(uint8_t event); void menuGeneralCalib(uint8_t event); static const MenuHandlerFunc menuTabGeneral[] PROGMEM = { menuGeneralSetup, CASE_SDCARD(menuGeneralSdManager) CASE_CPUARM(menuGeneralCustomFunctions) menuGeneralTrainer, menuGeneralVersion, menuGeneralDiagKeys, menuGeneralDiagAna, CASE_CPUARM(menuGeneralHardware) menuGeneralCalib }; enum EnumTabModel { e_ModelSelect, e_ModelSetup, CASE_HELI(e_Heli) CASE_FLIGHT_MODES(e_FlightModesAll) e_InputsAll, e_MixAll, e_Limits, CASE_CURVES(e_CurvesAll) e_LogicalSwitches, e_CustomFunctions, CASE_FRSKY(e_Telemetry) CASE_MAVLINK(e_MavSetup) CASE_TEMPLATES(e_Templates) }; void menuModelSelect(uint8_t event); void menuModelSetup(uint8_t event); void menuModelHeli(uint8_t event); void menuModelFlightModesAll(uint8_t event); void menuModelExposAll(uint8_t event); void menuModelMixAll(uint8_t event); void menuModelLimits(uint8_t event); void menuModelCurvesAll(uint8_t event); void menuModelCurveOne(uint8_t event); void menuModelGVars(uint8_t event); void menuModelLogicalSwitches(uint8_t event); void menuModelCustomFunctions(uint8_t event); void menuModelTelemetry(uint8_t event); void menuModelTemplates(uint8_t event); void menuModelExpoOne(uint8_t event); static const MenuHandlerFunc menuTabModel[] PROGMEM = { menuModelSelect, menuModelSetup, CASE_HELI(menuModelHeli) CASE_FLIGHT_MODES(menuModelFlightModesAll) menuModelExposAll, menuModelMixAll, menuModelLimits, CASE_CURVES(menuModelCurvesAll) menuModelLogicalSwitches, menuModelCustomFunctions, CASE_FRSKY(menuModelTelemetry) CASE_MAVLINK(menuTelemetryMavlinkSetup) CASE_TEMPLATES(menuModelTemplates) }; void menuStatisticsView(uint8_t event); void menuStatisticsDebug(uint8_t event); void menuAboutView(uint8_t event); #if defined(DEBUG_TRACE_BUFFER) void menuTraceBuffer(uint8_t event); #endif #if !defined(CPUM64) void drawSlider(coord_t x, coord_t y, uint8_t value, uint8_t max, uint8_t attr); #elif defined(GRAPHICS) void display5posSlider(coord_t x, coord_t y, uint8_t value, uint8_t attr); #define drawSlider(x, y, value, max, attr) lcdDrawNumber(x, y, value, attr|LEFT) #else #define drawSlider(x, y, value, max, attr) lcdDrawNumber(x, y, value, attr|LEFT) #endif #if defined(NAVIGATION_POT1) extern int16_t p1valdiff; #else #define p1valdiff 0 #endif #if defined(NAVIGATION_POT2) extern int8_t p2valdiff; #else #define p2valdiff 0 #endif extern int8_t checkIncDec_Ret; // global helper vars #define EDIT_SELECT_MENU -1 #define EDIT_SELECT_FIELD 0 #define EDIT_MODIFY_FIELD 1 #define EDIT_MODIFY_STRING 2 extern int8_t s_editMode; // global editmode // checkIncDec flags #define EE_GENERAL 0x01 #define EE_MODEL 0x02 #define NO_INCDEC_MARKS 0x04 #define INCDEC_SWITCH 0x08 #define INCDEC_SOURCE 0x10 #define INCDEC_REP10 0x40 #define NO_DBLKEYS 0x80 #if defined(CPUARM) #define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = NULL #define INCDEC_SET_FLAG(f) incdecFlag = (f) #define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) #elif defined(CPUM64) #define INCDEC_DECLARE_VARS(f) #define INCDEC_SET_FLAG(f) #define INCDEC_ENABLE_CHECK(fn) #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, EE_MODEL) #else #define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f) #define INCDEC_SET_FLAG(f) incdecFlag = (f) #define INCDEC_ENABLE_CHECK(fn) #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag) #endif // mawrow special values #define TITLE_ROW ((uint8_t)-1) #define HIDDEN_ROW ((uint8_t)-2) #if defined(CPUARM) struct CheckIncDecStops { const int count; const int stops[]; int min() const { return stops[0]; } int max() const { return stops[count-1]; } bool contains(int value) const { for (int i=0; i= 0x0e) #define CASE_EVT_ROTARY_BREAK case EVT_ROTARY_BREAK: #define CASE_EVT_ROTARY_LONG case EVT_ROTARY_LONG: #define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT: #define CASE_EVT_ROTARY_RIGHT case EVT_ROTARY_RIGHT: void repeatLastCursorMove(uint8_t event); #define REPEAT_LAST_CURSOR_MOVE() { if (EVT_KEY_MASK(event) >= 0x0e) putEvent(event); else repeatLastCursorMove(event); } #define MOVE_CURSOR_FROM_HERE() if (menuHorizontalPosition > 0) REPEAT_LAST_CURSOR_MOVE() #else #define IS_ROTARY_LEFT(evt) (0) #define IS_ROTARY_RIGHT(evt) (0) #define IS_ROTARY_BREAK(evt) (0) #define IS_ROTARY_LONG(evt) (0) #define IS_ROTARY_EVENT(evt) (0) #define CASE_EVT_ROTARY_BREAK #define CASE_EVT_ROTARY_LONG #define CASE_EVT_ROTARY_LEFT #define CASE_EVT_ROTARY_RIGHT void repeatLastCursorMove(uint8_t event); #define REPEAT_LAST_CURSOR_MOVE() repeatLastCursorMove(event) #define MOVE_CURSOR_FROM_HERE() REPEAT_LAST_CURSOR_MOVE() #endif #define POS_HORZ_INIT(posVert) 0 #define EDIT_MODE_INIT -1 typedef int16_t (*FnFuncP) (int16_t x); void drawFunction(FnFuncP fn, uint8_t offset=0); uint8_t switchToMix(uint8_t source); void deleteExpoMix(uint8_t expo, uint8_t idx); #endif // _MENUS_H_