Cosmetics
[opentx.git] / radio / src / gui / 480x272 / model_flightmodes.cpp
blobe6210bd92890c6fb5c727aa9789edbe736956371
1 /*
2 * Copyright (C) OpenTX
4 * Based on code named
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 #include <stdio.h>
22 #include "opentx.h"
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;
30 char s[] = " ";
31 s[0] = '0' + i;
32 lcdDrawText(x, y, s, flags);
33 x += 12;
37 FlightModesType editFlightModes(coord_t x, coord_t y, event_t event, FlightModesType value, uint8_t attr)
39 displayFlightModes(x, y, value, attr);
41 if (attr) {
42 if (s_editMode && event==EVT_KEY_BREAK(KEY_ENTER)) {
43 s_editMode = 0;
44 value ^= (1<<menuHorizontalPosition);
45 storageDirty(EE_MODEL);
49 return value;
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
97 LcdFlags attr = 0;
98 if (menuVerticalPosition==MAX_FLIGHT_MODES) {
99 if (!trimsCheckTimer) {
100 if (event == EVT_KEY_FIRST(KEY_ENTER)) {
101 trimsCheckTimer = 200; // 2 seconds trims cancelled
102 s_editMode = 1;
103 killEvents(event);
105 else {
106 attr |= INVERS;
107 s_editMode = 0;
110 else {
111 if (event == EVT_KEY_FIRST(KEY_EXIT)) {
112 trimsCheckTimer = 0;
113 s_editMode = 0;
114 killEvents(event);
118 char s[32];
119 sprintf(s, "Check FM%d Trims", mixerCurrentFlightMode);
120 lcdDrawText(LCD_W/2, y, s, CENTERED|attr);
121 return true;
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) ;
131 switch (j) {
132 case ITEM_FLIGHT_MODES_NAME:
133 editName(FLIGHT_MODES_NAME_COLUMN, y, p->name, sizeof(p->name), event, attr);
134 break;
136 case ITEM_FLIGHT_MODES_SWITCH:
137 if (active) CHECK_INCDEC_MODELSWITCH(event, p->swtch, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes);
138 if (k == 0)
139 lcdDrawText(FLIGHT_MODES_SWITCH_COLUMN, y, "N/A");
140 else
141 drawSwitch(FLIGHT_MODES_SWITCH_COLUMN, y, p->swtch, attr);
142 break;
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;
152 if (active) {
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);
157 break;
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);
163 break;
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);
168 break;
174 return true;