Merge companion and firmware notes, and get them from the server (#5530)
[opentx.git] / radio / src / gui / 212x64 / model_mix_edit.cpp
blobb37c6f75d6e8b191bd93930bac6c074a136a436b
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 "opentx.h"
23 enum MixFields {
24 MIX_FIELD_NAME,
25 MIX_FIELD_SOURCE,
26 MIX_FIELD_WEIGHT,
27 MIX_FIELD_OFFSET,
28 MIX_FIELD_TRIM,
29 CASE_CURVES(MIX_FIELD_CURVE)
30 CASE_FLIGHT_MODES(MIX_FIELD_FLIGHT_MODE)
31 MIX_FIELD_SWITCH,
32 MIX_FIELD_WARNING,
33 MIX_FIELD_MLTPX,
34 MIX_FIELD_DELAY_UP,
35 MIX_FIELD_DELAY_DOWN,
36 MIX_FIELD_SLOW_UP,
37 MIX_FIELD_SLOW_DOWN,
38 MIX_FIELD_COUNT
41 void drawOffsetBar(uint8_t x, uint8_t y, MixData * md)
43 const int gaugeWidth = 33;
44 const int gaugeHeight = 6;
46 int offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode);
47 int weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode);
48 int barMin = offset - weight;
49 int barMax = offset + weight;
50 if (y > 15) {
51 lcdDrawNumber(x-((barMin >= 0) ? 2 : 3), y-6, barMin, TINSIZE|LEFT);
52 lcdDrawNumber(x+gaugeWidth+1, y-6, barMax, TINSIZE|RIGHT);
54 if (weight < 0) {
55 barMin = -barMin;
56 barMax = -barMax;
58 if (barMin < -101)
59 barMin = -101;
60 if (barMax > 101)
61 barMax = 101;
62 lcdDrawHorizontalLine(x-2, y, gaugeWidth+2, DOTTED);
63 lcdDrawHorizontalLine(x-2, y+gaugeHeight, gaugeWidth+2, DOTTED);
64 lcdDrawSolidVerticalLine(x-2, y+1, gaugeHeight-1);
65 lcdDrawSolidVerticalLine(x+gaugeWidth-1, y+1, gaugeHeight-1);
66 if (barMin <= barMax) {
67 int8_t right = (barMax * gaugeWidth) / 200;
68 int8_t left = ((barMin * gaugeWidth) / 200)-1;
69 lcdDrawFilledRect(x+gaugeWidth/2+left, y+2, right-left, gaugeHeight-3);
71 lcdDrawSolidVerticalLine(x+gaugeWidth/2-1, y, gaugeHeight+1);
72 if (barMin == -101) {
73 for (uint8_t i=0; i<3; ++i) {
74 lcdDrawPoint(x+i, y+4-i);
75 lcdDrawPoint(x+3+i, y+4-i);
78 if (barMax == 101) {
79 for (uint8_t i=0; i<3; ++i) {
80 lcdDrawPoint(x+gaugeWidth-8+i, y+4-i);
81 lcdDrawPoint(x+gaugeWidth-5+i, y+4-i);
86 void menuModelMixOne(event_t event)
88 if (event == EVT_KEY_LONG(KEY_MENU)) {
89 pushMenu(menuChannelsView);
90 killEvents(event);
93 MixData * md2 = mixAddress(s_currIdx) ;
94 putsChn(PSIZE(TR_MIXER)*FW+FW, 0, md2->destCh+1,0);
95 lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT);
97 SUBMENU(STR_MIXER, MIX_FIELD_COUNT, {0, 0, 0, 0, 0, CASE_CURVES(1) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/});
99 int8_t sub = menuVerticalPosition;
100 int8_t editMode = s_editMode;
102 for (uint8_t k=0; k<NUM_BODY_LINES; k++) {
103 coord_t y = MENU_HEADER_HEIGHT + 1 + k*FH;
104 int i = k + menuVerticalOffset;
105 LcdFlags attr = (sub==i ? INVERS | (editMode>0 ? BLINK : 0) : 0);
106 switch (i) {
107 case MIX_FIELD_NAME:
108 editSingleName(MIXES_2ND_COLUMN, y, STR_MIXNAME, md2->name, sizeof(md2->name), event, attr);
109 break;
111 case MIX_FIELD_SOURCE:
112 lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE));
113 drawSource(MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr);
114 if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST);
115 break;
117 case MIX_FIELD_WEIGHT:
118 lcdDrawTextAlignedLeft(y, STR_WEIGHT);
119 gvarWeightItem(MIXES_2ND_COLUMN, y, md2, attr|LEFT, event);
120 break;
122 case MIX_FIELD_OFFSET:
124 lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET));
125 u_int8int16_t offset;
126 MD_OFFSET_TO_UNION(md2, offset);
127 offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event);
128 MD_UNION_TO_OFFSET(offset, md2);
129 drawOffsetBar(MIXES_2ND_COLUMN+35, y, md2);
130 break;
133 case MIX_FIELD_TRIM:
134 lcdDrawTextAlignedLeft(y, STR_TRIM);
135 drawCheckBox(MIXES_2ND_COLUMN, y, !md2->carryTrim, attr);
136 if (attr) {
137 md2->carryTrim = !checkIncDecModel(event, !md2->carryTrim, 0, 1);
139 break;
141 #if defined(CURVES)
142 case MIX_FIELD_CURVE:
143 lcdDrawTextAlignedLeft(y, STR_CURVE);
144 editCurveRef(MIXES_2ND_COLUMN, y, md2->curve, event, attr);
145 break;
146 #endif
148 #if defined(FLIGHT_MODES)
149 case MIX_FIELD_FLIGHT_MODE:
150 drawFieldLabel(MIXES_2ND_COLUMN, y, STR_FLMODE);
151 md2->flightModes = editFlightModes(MIXES_2ND_COLUMN, y, event, md2->flightModes, attr);
152 break;
153 #endif
155 case MIX_FIELD_SWITCH:
156 md2->swtch = editSwitch(MIXES_2ND_COLUMN, y, md2->swtch, attr, event);
157 break;
159 case MIX_FIELD_WARNING:
160 drawFieldLabel(MIXES_2ND_COLUMN, y, STR_MIXWARNING);
161 if (md2->mixWarn)
162 lcdDrawNumber(MIXES_2ND_COLUMN, y, md2->mixWarn, attr|LEFT);
163 else
164 lcdDrawText(MIXES_2ND_COLUMN, y, STR_OFF, attr);
165 if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, md2->mixWarn, 3);
166 break;
168 case MIX_FIELD_MLTPX:
169 md2->mltpx = editChoice(MIXES_2ND_COLUMN, y, STR_MULTPX, STR_VMLTPX, md2->mltpx, 0, 2, attr, event);
170 break;
172 case MIX_FIELD_DELAY_UP:
173 md2->delayUp = EDIT_DELAY(y, event, attr, STR_DELAYUP, md2->delayUp);
174 break;
176 case MIX_FIELD_DELAY_DOWN:
177 md2->delayDown = EDIT_DELAY(y, event, attr, STR_DELAYDOWN, md2->delayDown);
178 break;
180 case MIX_FIELD_SLOW_UP:
181 md2->speedUp = EDIT_DELAY(y, event, attr, STR_SLOWUP, md2->speedUp);
182 break;
184 case MIX_FIELD_SLOW_DOWN:
185 md2->speedDown = EDIT_DELAY(y, event, attr, STR_SLOWDOWN, md2->speedDown);
186 break;