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.
24 void displayFlightModes(coord_t x
, coord_t y
, FlightModesType value
, uint8_t attr
)
26 for (int i
=0; i
<MAX_FLIGHT_MODES
; i
++) {
27 LcdFlags flags
= ((menuHorizontalPosition
==i
&& attr
) ? INVERS
: 0);
28 flags
|= ((value
& (1<<i
))) ? TEXT_DISABLE_COLOR
: TEXT_COLOR
;
29 if (attr
&& menuHorizontalPosition
< 0) flags
|= INVERS
;
32 lcdDrawText(x
, y
, s
, flags
);
37 FlightModesType
editFlightModes(coord_t x
, coord_t y
, event_t event
, FlightModesType value
, uint8_t attr
)
39 displayFlightModes(x
, y
, value
, attr
);
42 if (s_editMode
&& event
==EVT_KEY_BREAK(KEY_ENTER
)) {
44 value
^= (1<<menuHorizontalPosition
);
45 storageDirty(EE_MODEL
);
52 enum FlightModesItems
{
53 ITEM_FLIGHT_MODES_NAME
,
54 ITEM_FLIGHT_MODES_SWITCH
,
55 ITEM_FLIGHT_MODES_TRIM_RUD
,
56 ITEM_FLIGHT_MODES_TRIM_ELE
,
57 ITEM_FLIGHT_MODES_TRIM_THR
,
58 ITEM_FLIGHT_MODES_TRIM_AIL
,
59 ITEM_FLIGHT_MODES_TRIM_T5
,
60 ITEM_FLIGHT_MODES_TRIM_T6
,
61 ITEM_FLIGHT_MODES_FADE_IN
,
62 ITEM_FLIGHT_MODES_FADE_OUT
,
63 ITEM_FLIGHT_MODES_COUNT
,
64 ITEM_FLIGHT_MODES_LAST
= ITEM_FLIGHT_MODES_COUNT
-1
67 bool isTrimModeAvailable(int mode
)
69 return (mode
< 0 || (mode
%2) == 0 || (mode
/2) != menuVerticalPosition
);
72 #define FLIGHT_MODES_NAME_COLUMN 50
73 #define FLIGHT_MODES_SWITCH_COLUMN 180
74 #define FLIGHT_MODES_TRIMS_COLUMN 175
75 #define FLIGHT_MODES_TRIM_WIDTH 26
76 #define FLIGHT_MODES_FADEIN_COLUMN 420
77 #define FLIGHT_MODES_FADEOUT_COLUMN 460
79 bool menuModelFlightModesAll(event_t event
)
81 MENU(STR_MENUFLIGHTMODES
, MODEL_ICONS
, menuTabModel
, MENU_MODEL_FLIGHT_MODES
, MAX_FLIGHT_MODES
+1, { NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, NAVIGATION_LINE_BY_LINE
|ITEM_FLIGHT_MODES_LAST
, 0});
83 if (menuVerticalPosition
==0 && menuHorizontalPosition
==ITEM_FLIGHT_MODES_SWITCH
) {
84 menuHorizontalPosition
+= CURSOR_MOVED_LEFT(event
) ? -1 : +1;
87 if (menuVerticalPosition
<MAX_FLIGHT_MODES
&& menuHorizontalPosition
>=0) {
88 drawColumnHeader(STR_PHASES_HEADERS
, NULL
, menuHorizontalPosition
);
91 for (uint8_t i
=0; i
<NUM_BODY_LINES
; i
++) {
92 coord_t y
= MENU_CONTENT_TOP
+ i
*FH
;
93 int k
= i
+menuVerticalOffset
;
95 if (k
==MAX_FLIGHT_MODES
) {
96 // last line available - add the "check trims" line
98 if (menuVerticalPosition
==MAX_FLIGHT_MODES
) {
99 if (!trimsCheckTimer
) {
100 if (event
== EVT_KEY_FIRST(KEY_ENTER
)) {
101 trimsCheckTimer
= 200; // 2 seconds trims cancelled
111 if (event
== EVT_KEY_FIRST(KEY_EXIT
)) {
119 sprintf(s
, "Check FM%d Trims", mixerCurrentFlightMode
);
120 lcdDrawText(LCD_W
/2, y
, s
, CENTERED
|attr
);
124 FlightModeData
* p
= flightModeAddress(k
);
126 drawFlightMode(MENUS_MARGIN_LEFT
, y
, k
+1, (getFlightMode()==k
? BOLD
: 0) | ((menuVerticalPosition
==k
&& menuHorizontalPosition
<0) ? INVERS
: 0));
128 for (uint8_t j
=0; j
<ITEM_FLIGHT_MODES_COUNT
; j
++) {
129 LcdFlags attr
= ((menuVerticalPosition
==k
&& menuHorizontalPosition
==j
) ? ((s_editMode
>0) ? BLINK
|INVERS
: INVERS
) : 0);
130 LcdFlags active
= (attr
&& s_editMode
>0) ;
132 case ITEM_FLIGHT_MODES_NAME
:
133 editName(FLIGHT_MODES_NAME_COLUMN
, y
, p
->name
, sizeof(p
->name
), event
, attr
);
136 case ITEM_FLIGHT_MODES_SWITCH
:
137 if (active
) CHECK_INCDEC_MODELSWITCH(event
, p
->swtch
, SWSRC_FIRST_IN_MIXES
, SWSRC_LAST_IN_MIXES
, isSwitchAvailableInMixes
);
139 lcdDrawText(FLIGHT_MODES_SWITCH_COLUMN
, y
, "N/A");
141 drawSwitch(FLIGHT_MODES_SWITCH_COLUMN
, y
, p
->swtch
, attr
);
144 case ITEM_FLIGHT_MODES_TRIM_RUD
:
145 case ITEM_FLIGHT_MODES_TRIM_ELE
:
146 case ITEM_FLIGHT_MODES_TRIM_THR
:
147 case ITEM_FLIGHT_MODES_TRIM_AIL
:
148 case ITEM_FLIGHT_MODES_TRIM_T5
:
149 case ITEM_FLIGHT_MODES_TRIM_T6
:
151 uint8_t t
= j
-ITEM_FLIGHT_MODES_TRIM_RUD
;
153 trim_t
& v
= p
->trim
[t
];
154 v
.mode
= checkIncDec(event
, v
.mode
==TRIM_MODE_NONE
? -1 : v
.mode
, -1, k
==0 ? 0 : 2*MAX_FLIGHT_MODES
-1, EE_MODEL
, isTrimModeAvailable
);
156 drawTrimMode(FLIGHT_MODES_TRIMS_COLUMN
+j
*FLIGHT_MODES_TRIM_WIDTH
, y
, k
, t
, attr
);
160 case ITEM_FLIGHT_MODES_FADE_IN
:
161 if (active
) p
->fadeIn
= checkIncDec(event
, p
->fadeIn
, 0, DELAY_MAX
, EE_MODEL
|NO_INCDEC_MARKS
);
162 lcdDrawNumber(FLIGHT_MODES_FADEIN_COLUMN
, y
, p
->fadeIn
, attr
|PREC1
|RIGHT
);
165 case ITEM_FLIGHT_MODES_FADE_OUT
:
166 if (active
) p
->fadeOut
= checkIncDec(event
, p
->fadeOut
, 0, DELAY_MAX
, EE_MODEL
|NO_INCDEC_MARKS
);
167 lcdDrawNumber(FLIGHT_MODES_FADEOUT_COLUMN
, y
, p
->fadeOut
, attr
|PREC1
|RIGHT
);