5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
21 #ifndef _GUI_COMMON_H_
22 #define _GUI_COMMON_H_
26 #include "telemetry/telemetry_sensors.h"
28 #define READONLY_ROW ((uint8_t)-1)
29 #define TITLE_ROW READONLY_ROW
30 #define LABEL(...) READONLY_ROW
31 #define HIDDEN_ROW ((uint8_t)-2)
33 #if defined(ROTARY_ENCODER_NAVIGATION)
34 #define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT:
35 #define CASE_EVT_ROTARY_RIGHT case EVT_ROTARY_RIGHT:
37 #define CASE_EVT_ROTARY_LEFT
38 #define CASE_EVT_ROTARY_RIGHT
41 #if defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) || defined(NAVIGATION_HORUS)
42 inline uint8_t MENU_FIRST_LINE_EDIT(const uint8_t * horTab
, uint8_t horTabMax
)
46 while (result
< horTabMax
&& horTab
[result
] >= HIDDEN_ROW
)
56 typedef bool (*IsValueAvailable
)(int);
58 int circularIncDec(int current
, int inc
, int min
, int max
, IsValueAvailable isValueAvailable
=nullptr);
59 int getFirstAvailable(int min
, int max
, IsValueAvailable isValueAvailable
);
61 bool isTrimModeAvailable(int mode
);
62 bool isInputAvailable(int input
);
63 bool isSourceAvailableInInputs(int source
);
64 bool isThrottleSourceAvailable(int source
);
65 bool isLogicalSwitchFunctionAvailable(int function
);
66 bool isLogicalSwitchAvailable(int index
);
67 bool isAssignableFunctionAvailable(int function
);
68 bool isSourceAvailable(int source
);
69 bool isSourceAvailableInGlobalFunctions(int source
);
70 bool isSourceAvailableInCustomSwitches(int source
);
71 bool isSourceAvailableInResetSpecialFunction(int index
);
72 bool isSourceAvailableInGlobalResetSpecialFunction(int index
);
73 bool isSwitchAvailableInLogicalSwitches(int swtch
);
74 bool isSwitchAvailableInCustomFunctions(int swtch
);
75 bool isSwitchAvailableInMixes(int swtch
);
76 bool isSwitchAvailableInTimers(int swtch
);
77 bool isR9MModeAvailable(int mode
);
78 bool isPxx2IsrmChannelsCountAllowed(int channels
);
79 bool isModuleUsingSport(uint8_t moduleBay
, uint8_t moduleType
);
80 bool isTrainerUsingModuleBay();
81 bool isExternalModuleAvailable(int moduleType
);
82 bool isInternalModuleAvailable(int moduleType
);
83 bool isRfProtocolAvailable(int protocol
);
84 bool isTelemetryProtocolAvailable(int protocol
);
85 bool isTrainerModeAvailable(int mode
);
87 bool isSensorUnit(int sensor
, uint8_t unit
);
88 bool isCellsSensor(int sensor
);
89 bool isGPSSensor(int sensor
);
90 bool isAltSensor(int sensor
);
91 bool isVoltsSensor(int sensor
);
92 bool isCurrentSensor(int sensor
);
93 bool isTelemetryFieldAvailable(int index
);
94 bool isTelemetryFieldComparisonAvailable(int index
);
95 bool isSensorAvailable(int sensor
);
96 bool isRssiSensorAvailable(int sensor
);
100 #if defined(COLORLCD)
101 bool isSwitch2POSWarningStateAvailable(int state
);
105 #define IS_INSTANT_TRIM_ALLOWED() (IS_MAIN_VIEW_DISPLAYED() || IS_TELEMETRY_VIEW_DISPLAYED() || IS_OTHER_VIEW_DISPLAYED())
107 #define IS_INSTANT_TRIM_ALLOWED() true
110 #if defined(FLIGHT_MODES)
111 void drawFlightMode(coord_t x
, coord_t y
, int8_t idx
, LcdFlags att
=0);
114 swsrc_t
checkIncDecMovedSwitch(swsrc_t val
);
116 void drawCurveRef(coord_t x
, coord_t y
, CurveRef
& curve
, LcdFlags flags
=0);
117 void drawDate(coord_t x
, coord_t y
, TelemetryItem
& telemetryItem
, LcdFlags flags
=0);
118 void drawTelemScreenDate(coord_t x
, coord_t y
, source_t sensor
, LcdFlags flags
=0);
119 void drawGPSPosition(coord_t x
, coord_t y
, int32_t longitude
, int32_t latitude
, LcdFlags flags
=0);
120 void drawGPSSensorValue(coord_t x
, coord_t y
, TelemetryItem
& telemetryItem
, LcdFlags flags
=0);
121 void drawSensorCustomValue(coord_t x
, coord_t y
, uint8_t sensor
, int32_t value
, LcdFlags flags
=0);
122 void drawSourceCustomValue(coord_t x
, coord_t y
, source_t channel
, int32_t val
, LcdFlags flags
=0);
123 void drawSourceValue(coord_t x
, coord_t y
, source_t channel
, LcdFlags flags
=0);
125 void drawCurve(coord_t offset
=0);
127 #if defined(COLORLCD)
128 void drawStringWithIndex(coord_t x
, coord_t y
, const char * str
, int idx
, LcdFlags flags
=0, const char * prefix
=nullptr, const char * suffix
=nullptr);
129 uint8_t editCheckBox(uint8_t value
, coord_t x
, coord_t y
, LcdFlags flags
, event_t event
);
130 swsrc_t
editSwitch(coord_t x
, coord_t y
, swsrc_t value
, LcdFlags flags
, event_t event
);
131 void drawFatalErrorScreen(const char * message
);
132 void runFatalErrorScreen(const char * message
);
135 #define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW)
136 #define IF_MODULE_ON(moduleIndex, x) (IS_MODULE_ENABLED(moduleIndex) ? (uint8_t)(x) : HIDDEN_ROW)
138 // model_setup Defines that are used in all uis in the same way
140 inline uint8_t MODULE_BIND_ROWS(int moduleIdx
)
142 if (isModuleXJTD8(moduleIdx
) || isModuleSBUS(moduleIdx
))
145 if (isModulePPM(moduleIdx
) || isModulePXX1(moduleIdx
) || isModulePXX2(moduleIdx
) || isModuleDSM2(moduleIdx
) || isModuleMultimodule(moduleIdx
))
151 inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx
)
153 if (!IS_MODULE_ENABLED(moduleIdx
))
156 if (isModuleDSM2(moduleIdx
) || isModuleCrossfire(moduleIdx
) || isModuleSBUS(moduleIdx
) || (isModuleMultimodule(moduleIdx
) && g_model
.moduleData
[moduleIdx
].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2
))
163 #if defined(MULTIMODULE)
164 inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx
)
166 if (!isModuleMultimodule(moduleIdx
))
169 uint8_t protocol
= g_model
.moduleData
[moduleIdx
].getMultiProtocol();
170 if (protocol
< MODULE_SUBTYPE_MULTI_LAST
) {
171 const mm_protocol_definition
* pdef
= getMultiProtocolDefinition(protocol
);
172 if (pdef
->disable_ch_mapping
)
176 MultiModuleStatus
&status
= getMultiModuleStatus(moduleIdx
);
177 if (status
.supportsDisableMapping() && status
.isValid()) {
184 inline bool isMultiProtocolSelectable(int protocol
)
186 return protocol
!= MODULE_SUBTYPE_MULTI_SCANNER
;
189 inline bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx
)
191 if (!isModuleMultimodule(moduleIdx
)) {
195 if (g_model
.moduleData
[moduleIdx
].getMultiProtocol() < MODULE_SUBTYPE_MULTI_LAST
) {
199 MultiModuleStatus
&status
= getMultiModuleStatus(moduleIdx
);
200 if (status
.isValid()) {
201 return status
.protocolValid();
207 inline bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx
)
209 MultiModuleStatus
&status
= getMultiModuleStatus(moduleIdx
);
211 if (g_model
.moduleData
[moduleIdx
].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY
) {
215 if (status
.isValid()) {
216 return status
.protocolSubNbr
> 0;
220 if (g_model
.moduleData
[moduleIdx
].getMultiProtocol() > MODULE_SUBTYPE_MULTI_LAST
)
223 return getMultiProtocolDefinition(g_model
.moduleData
[moduleIdx
].getMultiProtocol())->maxSubtype
> 0;
227 inline uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx
)
230 return (MULTIMODULE_HAS_SUBTYPE(moduleIdx
) ? (uint8_t) 0 : HIDDEN_ROW
);
232 return (MULTIMODULE_HAS_SUBTYPE(moduleIdx
) ? (uint8_t) 1 : 0);
236 inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx
)
238 if (!isModuleMultimodule(moduleIdx
))
241 uint8_t protocol
= g_model
.moduleData
[moduleIdx
].getMultiProtocol();
242 if (protocol
< MODULE_SUBTYPE_MULTI_LAST
) {
243 return getMultiProtocolDefinition(protocol
)->optionsstr
!= nullptr;
246 MultiModuleStatus
&status
= getMultiModuleStatus(moduleIdx
);
247 return status
.optionDisp
;
250 #define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
251 #define MULTIMODULE_STATUS_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(moduleIdx) && getMultiSyncStatus(moduleIdx).isValid()) ? TITLE_ROW : HIDDEN_ROW,
252 #define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1
253 #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
254 #define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW
257 #define MULTIMODULE_STATUS_ROWS(moduleIdx)
258 #define MULTIMODULE_MODULE_ROWS(moduleIdx)
259 #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx)
260 #define MULTIMODULE_MODE_ROWS(moduleIdx) (uint8_t)0
261 #define MULTIMODULE_OPTIONS_ROW(moduleIdx) HIDDEN_ROW
264 #define FAILSAFE_ROWS(moduleIdx) isModuleFailsafeAvailable(moduleIdx) ? (g_model.moduleData[moduleIdx].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW
265 #define MODULE_OPTION_ROW(moduleIdx) (isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW(moduleIdx))
266 #define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
268 void editStickHardwareSettings(coord_t x
, coord_t y
, int idx
, event_t event
, LcdFlags flags
);
270 const char * writeScreenshot();
272 #endif // _GUI_COMMON_H_