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.
29 CASE_CURVES(MIX_FIELD_CURVE
)
30 CASE_FLIGHT_MODES(MIX_FIELD_FLIGHT_MODE
)
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
;
51 lcdDrawNumber(x
-((barMin
>= 0) ? 2 : 3), y
-6, barMin
, TINSIZE
|LEFT
);
52 lcdDrawNumber(x
+gaugeWidth
+1, y
-6, barMax
, TINSIZE
|RIGHT
);
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);
73 for (uint8_t i
=0; i
<3; ++i
) {
74 lcdDrawPoint(x
+i
, y
+4-i
);
75 lcdDrawPoint(x
+3+i
, y
+4-i
);
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
);
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);
108 editSingleName(MIXES_2ND_COLUMN
, y
, STR_MIXNAME
, md2
->name
, sizeof(md2
->name
), event
, attr
);
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
);
117 case MIX_FIELD_WEIGHT
:
118 lcdDrawTextAlignedLeft(y
, STR_WEIGHT
);
119 gvarWeightItem(MIXES_2ND_COLUMN
, y
, md2
, attr
|LEFT
, event
);
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
);
134 lcdDrawTextAlignedLeft(y
, STR_TRIM
);
135 drawCheckBox(MIXES_2ND_COLUMN
, y
, !md2
->carryTrim
, attr
);
137 md2
->carryTrim
= !checkIncDecModel(event
, !md2
->carryTrim
, 0, 1);
142 case MIX_FIELD_CURVE
:
143 lcdDrawTextAlignedLeft(y
, STR_CURVE
);
144 editCurveRef(MIXES_2ND_COLUMN
, y
, md2
->curve
, event
, attr
);
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
);
155 case MIX_FIELD_SWITCH
:
156 md2
->swtch
= editSwitch(MIXES_2ND_COLUMN
, y
, md2
->swtch
, attr
, event
);
159 case MIX_FIELD_WARNING
:
160 drawFieldLabel(MIXES_2ND_COLUMN
, y
, STR_MIXWARNING
);
162 lcdDrawNumber(MIXES_2ND_COLUMN
, y
, md2
->mixWarn
, attr
|LEFT
);
164 lcdDrawText(MIXES_2ND_COLUMN
, y
, STR_OFF
, attr
);
165 if (attr
) CHECK_INCDEC_MODELVAR_ZERO(event
, md2
->mixWarn
, 3);
168 case MIX_FIELD_MLTPX
:
169 md2
->mltpx
= editChoice(MIXES_2ND_COLUMN
, y
, STR_MULTPX
, STR_VMLTPX
, md2
->mltpx
, 0, 2, attr
, event
);
172 case MIX_FIELD_DELAY_UP
:
173 md2
->delayUp
= EDIT_DELAY(y
, event
, attr
, STR_DELAYUP
, md2
->delayUp
);
176 case MIX_FIELD_DELAY_DOWN
:
177 md2
->delayDown
= EDIT_DELAY(y
, event
, attr
, STR_DELAYDOWN
, md2
->delayDown
);
180 case MIX_FIELD_SLOW_UP
:
181 md2
->speedUp
= EDIT_DELAY(y
, event
, attr
, STR_SLOWUP
, md2
->speedUp
);
184 case MIX_FIELD_SLOW_DOWN
:
185 md2
->speedDown
= EDIT_DELAY(y
, event
, attr
, STR_SLOWDOWN
, md2
->speedDown
);