[all] Change in Mixer sources order (will allow the EXTRA_3POS option later)

[all] Change in Switches order (to match the Mixer sources order and save some flash)
[all] New menu in MODELSEL when a ROTARY_ENCODER_NAVIGATION enabled
[all] Add REs (short) and REl (long) in Custom Functions screen. Will be needed later to reset the Rotary Encoder (for example)
This commit is contained in:
bsongis
2013-02-18 18:52:11 +00:00
parent 9d8bfea60a
commit 9fb1eb665f
18 changed files with 1033 additions and 881 deletions
+4 -4
View File
@@ -1044,9 +1044,9 @@ int16_t convertCswTelemValue(CustomSwData * cs)
{
int16_t val;
if (CS_STATE(cs->func)==CS_VOFS)
val = convertTelemValue(cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT), 128+cs->v2);
val = convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128+cs->v2);
else
val = convertTelemValue(cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT), 128+cs->v2) - convertTelemValue(cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT), 128);
val = convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128+cs->v2) - convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128);
return val;
}
@@ -1290,7 +1290,7 @@ void menuTelemetryFrsky(uint8_t event)
uint8_t y = barHeight+6+i*(barHeight+6);
lcd_putsiAtt(0, y+barHeight-5, STR_VTELEMCHNS, source, 0);
lcd_rect(25, y, 101, barHeight+2);
int16_t value = getValue(CSW_CHOUT_BASE+NUM_CHNOUT+source-1);
int16_t value = getValue(MIXSRC_LAST_CH+source-1);
int16_t threshold = 0;
uint8_t thresholdX = 0;
if (source <= TELEM_TM2)
@@ -1363,7 +1363,7 @@ void menuTelemetryFrsky(uint8_t event)
}
if (field) {
fields_count++;
int16_t value = getValue(CSW_CHOUT_BASE+NUM_CHNOUT+field-1);
int16_t value = getValue(MIXSRC_LAST_CH+field-1);
uint8_t att = (i==3 ? NO_UNIT : DBLSIZE|NO_UNIT);
if (field <= TELEM_TM2) {
uint8_t x = (i==3 ? j?80:20 : j?74:10);
+2 -2
View File
@@ -460,7 +460,7 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_STICK_MODE:
lcd_putcAtt(2*FW, y, '1'+g_eeGeneral.stickMode, attr);
for (uint8_t i=0; i<4; i++) putsChnRaw( (6+4*i)*FW, y, pgm_read_byte(modn12x3 + 4*g_eeGeneral.stickMode + i), 0);
for (uint8_t i=0; i<4; i++) putsMixerSource((6+4*i)*FW, y, pgm_read_byte(modn12x3 + 4*g_eeGeneral.stickMode + i), 0);
if (attr && s_editMode>0) {
CHECK_INCDEC_GENVAR(event, g_eeGeneral.stickMode, 0, 3);
}
@@ -759,7 +759,7 @@ void menuGeneralTrainer(uint8_t event)
uint8_t chan = channel_order(i);
volatile TrainerMix *td = &g_eeGeneral.trainer.mix[chan-1];
putsChnRaw(0, y, chan, 0);
putsMixerSource(0, y, chan, 0);
for (uint8_t j=0; j<3; j++) {
+7 -5
View File
@@ -300,7 +300,7 @@ TEST(getSwitch, nullSW)
TEST(Phases, nullFadeOut_posFadeIn)
{
MODEL_RESET();
g_model.phaseData[1].swtch = DSW(SW_ID1);
g_model.phaseData[1].swtch = SWSRC_ID1);
g_model.phaseData[1].fadeIn = 15;
perMain();
simuSetSwitch(3, 0);
@@ -433,11 +433,13 @@ TEST(Mixer, RecursiveAddChannel)
TEST(Expo, AllValues)
{
// TODO whole range
for (uint16_t x=0; x<100; x++) {
for (uint16_t k=0; k<100; k++) {
for (uint16_t x=0; x<20; x++) {
for (uint16_t k=0; k<20; k++) {
// TODO compare with the correct function instead of this one
uint16_t ref = ((unsigned long)x*x*x/0x10000*k/(RESXul*RESXul/0x10000) + (RESKul-k)*x+RESKul/2)/RESKul;
EXPECT_EQ(expou(x, k), ref);
// uint16_t ref = ((unsigned long)x*x*x/0x10000*k/(RESXul*RESXul/0x10000) + (RESKul-k)*x+RESKul/2)/RESKul;
double ref = exp(log((float)x)*(float)k/10);
printf("x=%d k=%d ref=%f res=%d\n", x, k, ref, expou(x, k));
// EXPECT_EQ(expou(x, k), ref);
}
}
}
+45 -39
View File
@@ -561,7 +561,7 @@ void lcd_hline(xcoord_t x, uint8_t y, xcoord_t w, LcdFlags att)
lcd_hlineStip(x, y, w, 0xff, att);
}
#if defined(PCBSTD)
#if defined(CPUM64)
void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat)
{
if (x >= LCD_W) return;
@@ -752,37 +752,25 @@ void putsStrIdx(xcoord_t x, uint8_t y, const pm_char *str, uint8_t idx, LcdFlags
lcd_putsAtt(x, y, str, att);
}
void putsChnRaw(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att)
{
if (idx==0)
lcd_putsiAtt(x, y, STR_MMMINV, 0, att);
else if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CYC)
lcd_putsiAtt(x, y, STR_VSRCRAW, idx-1, att);
else if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CYC+NUM_PPM)
putsStrIdx(x, y, STR_PPM, idx - (NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CYC), att);
else if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CYC+NUM_PPM+NUM_CHNOUT)
putsStrIdx(x, y, STR_CH, idx - (NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CYC+NUM_PPM), att);
else
lcd_putsiAtt(x, y, STR_VTELEMCHNS, idx-(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CYC+NUM_PPM+NUM_CHNOUT), att);
}
void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att)
{
#if defined(PCBX9D) || defined(PCBACT)
if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW)
putsChnRaw(x, y, idx, att);
else if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CSW)
putsSwitches(x, y, MAX_PSWITCH + idx-(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW), att);
else
putsChnRaw(x, y, idx-NUM_CSW, att);
#if defined(PCBX9D)
if (idx < MIXSRC_SW1)
lcd_putsiAtt(x, y, STR_VSRCRAW, idx, att);
else if (idx < MIXSRC_PPM1)
putsSwitches(x, y, idx-MIXSRC_SA, att);
#else
if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW)
putsChnRaw(x, y, idx, att);
else if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+MAX_SWITCH)
putsSwitches(x, y, idx-(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW), att);
else
putsChnRaw(x, y, idx-MAX_SWITCH, att);
if (idx < MIXSRC_THR)
lcd_putsiAtt(x, y, STR_VSRCRAW, idx, att);
else if (idx < MIXSRC_PPM1)
putsSwitches(x, y, idx-MIXSRC_THR+1+3*(1/*+EXTRA_3POS*/), att);
#endif
else if (idx < MIXSRC_CH1)
putsStrIdx(x, y, STR_PPM, idx-MIXSRC_PPM1+1, att);
else if (idx <= MIXSRC_LAST_CH)
putsStrIdx(x, y, STR_CH, idx-MIXSRC_CH1+1, att);
else
lcd_putsiAtt(x, y, STR_VTELEMCHNS, idx-MIXSRC_LAST_CH, att);
}
void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags attr)
@@ -804,25 +792,43 @@ void putsModelName(xcoord_t x, uint8_t y, char *name, uint8_t id, LcdFlags att)
void putsSwitches(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att)
{
if (idx == 0)
if (idx == SWSRC_NONE)
return lcd_putsiAtt(x, y, STR_MMMINV, 0, att);
if (att & SWONOFF) {
if (idx == SWITCH_ON)
return lcd_putsiAtt(x, y, STR_OFFON, 1, att);
if (idx == SWITCH_OFF)
return lcd_putsiAtt(x, y, STR_OFFON, 0, att);
}
if (idx == SWSRC_ON)
return lcd_putsiAtt(x, y, STR_OFFON, 1, att);
if (idx == SWSRC_OFF)
return lcd_putsiAtt(x, y, STR_OFFON, 0, att);
if (idx < 0) {
lcd_vlineStip(x-2, y, 8, 0x5E/*'!'*/);
idx = -idx;
}
if (idx > MAX_SWITCH) {
idx -= ((att & SWONOFF) ? MAX_SWITCH+1 : MAX_SWITCH);
#if ROTARY_ENCODERS > 0
if (idx >= SWSRC_FIRST_ROTENC_SWITCH) {
if (idx <= SWSRC_LAST_ROTENC_SWITCH) {
idx -= SWSRC_FIRST_ROTENC_SWITCH;
char suffix;
if (idx < ROTARY_ENCODERS) {
suffix = 's';
}
else {
idx -= ROTARY_ENCODERS;
suffix = 'l';
}
lcd_putcAtt(x+3*FW, y, suffix, att);
return lcd_putsiAtt(x, y, STR_VRENCODERS, idx, att);
}
idx -= 2*ROTARY_ENCODERS;
}
#endif
if (idx > SWSRC_ON) {
idx -= SWSRC_ON;
char suffix = 'm';
#if defined(CPUARM)
if (idx > MAX_SWITCH+1) {
if (idx > SWSRC_ON) {
suffix = 's';
idx -= MAX_SWITCH+1;
idx -= SWSRC_ON;
if (idx > MAX_PSWITCH) {
suffix = 'l';
idx -= MAX_PSWITCH;
+2 -4
View File
@@ -107,7 +107,6 @@
#define ROUND 0x08
/* switches flags */
#define SWONOFF 0x10 /* means inlude ON OFF in switches */
#define SWCONDENSED 0x20 /* means that THRm will be displayed as THR */
/* telemetry flags */
@@ -181,8 +180,7 @@ extern void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdF
void putsRotaryEncoderMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att);
#endif
extern void putsChnRaw(xcoord_t x, uint8_t y, uint8_t idx1, LcdFlags att);
#define putsChn(x, y, idx, att) putsChnRaw(x, y, (idx)+(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1+NUM_SW_SRCRAW+NUM_CYC+NUM_PPM), att)
#define putsChn(x, y, idx, att) putsMixerSource(x, y, MIXSRC_CH1+idx-1, att)
extern void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags attr);
extern void putsVolts(xcoord_t x, uint8_t y, uint16_t volts, LcdFlags att);
@@ -203,7 +201,7 @@ extern void lcd_plot(xcoord_t x, uint8_t y, LcdFlags att=0);
extern void lcd_hline(xcoord_t x, uint8_t y, xcoord_t w, LcdFlags att=0);
extern void lcd_hlineStip(xcoord_t x, uint8_t y, xcoord_t w, uint8_t pat, LcdFlags att=0);
extern void lcd_vline(xcoord_t x, int8_t y, int8_t h);
#if defined(PCBSTD)
#if defined(CPUM64)
extern void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat);
#else
extern void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, LcdFlags att=0);
+10 -6
View File
@@ -479,7 +479,7 @@ void menuMainView(uint8_t event)
uint8_t x = LCD_W/2+7*FW+col*FW;
uint8_t y = LCD_H/2-7+line*8;
lcd_putcAtt(x, y, sw>=9 ? 'A'+sw-9 : '1'+sw, SMLSIZE);
if (getSwitch(DSW(SW_SW1+sw), 0))
if (getSwitch(SWSRC_SW1+sw, 0))
lcd_filled_rect(x-1, y-1, 6, 8);
sw++;
}
@@ -546,10 +546,14 @@ void menuMainView(uint8_t event)
doMainScreenGraphics();
// Switches
for (uint8_t i=0; i<6; i++) {
int8_t sw1 = (i<3 ? 1+i : 4+i);
int8_t sw2 = (sw1 == 9 ? (getSwitch(4, 0) ? 4 : (getSwitch(5, 0) ? 5 : 6)) : sw1);
putsSwitches(i<3 ? 2*FW-2: 17*FW-1, (i%3)*FH+4*FH+1, sw2, getSwitch(sw1, 0) ? INVERS : 0);
for (uint8_t i=SWSRC_THR; i<=SWSRC_TRN; i++) {
int8_t sw = (i == SWSRC_TRN ? (switchState(SW_ID0) ? SWSRC_ID0 : (switchState(SW_ID1) ? SWSRC_ID1 : SWSRC_ID2)) : i);
uint8_t x = 2*FW-2, y = i*FH+1;
if (i>=SWSRC_AIL) {
x = 17*FW-1;
y -= 3*FH;
}
putsSwitches(x, y, sw, getSwitch(i, 0) ? INVERS : 0);
}
}
else {
@@ -570,7 +574,7 @@ void menuMainView(uint8_t event)
// Curstom Switches
#if defined(PCBSKY9X)
for (uint8_t i=0; i<NUM_CSW; i++) {
int8_t len = getSwitch(DSW(SW_SW1)+i, 0) ? BAR_HEIGHT : 1;
int8_t len = getSwitch(SWSRC_SW1+i, 0) ? BAR_HEIGHT : 1;
uint8_t x = VSWITCH_X(i);
lcd_vline(x-1, VSWITCH_Y-len, len);
lcd_vline(x, VSWITCH_Y-len, len);
+31 -21
View File
@@ -63,7 +63,7 @@ void displayScreenIndex(uint8_t index, uint8_t count, uint8_t attr)
lcd_outdezAtt(x,0,index+1,attr);
}
#if !defined(PCBSTD)
#if !defined(CPUM64)
void displayScrollbar(xcoord_t x, uint8_t y, uint8_t h, uint16_t offset, uint16_t count, uint8_t visible)
{
lcd_vlineStip(x, y, h, SOLID, ERASE);
@@ -143,20 +143,20 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui
if (s_editMode>0) {
int8_t swtch = getMovedSwitch();
if (swtch) {
if (newval == DSW(SW_TRN) && swtch == DSW(SW_TRN))
if (IS_MOMENTARY(newval) && IS_MOMENTARY(swtch))
newval = -newval;
else
newval = swtch;
}
}
if (event == EVT_KEY_LONG(KEY_MENU) && i_max > SWITCH_ON) {
if (event == EVT_KEY_LONG(KEY_ENTER) && i_max > SWSRC_ON) {
s_editMode = !s_editMode;
if (newval > SWITCH_ON)
if (newval > SWSRC_ON)
newval -= (MAX_SWITCH+1);
else if (newval > 0)
newval += (MAX_SWITCH+1);
else if (newval < SWITCH_OFF)
else if (newval < SWSRC_OFF)
newval += (MAX_SWITCH+1);
else if (newval < 0)
newval -= (MAX_SWITCH+1);
@@ -311,24 +311,24 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t
break;
#endif
case EVT_KEY_FIRST(KEY_LEFT):
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LEFT:
if (s_editMode >= 0)
break;
#endif
case EVT_KEY_FIRST(KEY_LEFT):
if (curr > 0)
cc = curr - 1;
else
cc = menuTabSize-1;
break;
case EVT_KEY_FIRST(KEY_RIGHT):
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_RIGHT:
if (s_editMode >= 0)
break;
#endif
case EVT_KEY_FIRST(KEY_RIGHT):
if (curr < (menuTabSize-1))
cc = curr + 1;
else
@@ -635,7 +635,7 @@ void displayWarning(uint8_t event)
lcd_putsnAtt(16, 4*FH, s_warning_info, s_warning_info_len, ZCHAR);
lcd_puts(16, 5*FH, s_warning_type == WARNING_TYPE_CONFIRM ? STR_POPUPS : STR_EXIT);
switch(event) {
#if defined(ROTARY_ENCODERS)
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_BREAK:
#endif
case EVT_KEY_BREAK(KEY_ENTER):
@@ -643,6 +643,10 @@ void displayWarning(uint8_t event)
break;
s_warning_result = true;
// no break
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LONG:
killEvents(event);
#endif
case EVT_KEY_BREAK(KEY_EXIT):
s_warning = 0;
s_warning_type = WARNING_TYPE_ASTERISK;
@@ -716,13 +720,15 @@ int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max,
#if LCD_W >= 212
#define MENU_X 30
#define MENU_Y 16
#define MENU_W LCD_W-60
#else
#define MENU_X 10
#define MENU_Y 16
#define MENU_W LCD_W-20
#endif
#if defined(SDCARD)
#if defined(NAVIGATION_MENUS)
const char *s_menu[MENU_MAX_LINES];
uint8_t s_menu_item = 0;
uint16_t s_menu_count = 0;
@@ -733,40 +739,46 @@ const char * displayMenu(uint8_t event)
const char * result = NULL;
uint8_t display_count = min(s_menu_count, (uint16_t)MENU_MAX_LINES);
lcd_filled_rect(MENU_X, 16, MENU_W, display_count * (FH+1) + 2, SOLID, ERASE);
lcd_rect(MENU_X, 16, MENU_W, display_count * (FH+1) + 2);
uint8_t y = display_count > 4 ? MENU_Y - FH : MENU_Y;
lcd_filled_rect(MENU_X, y, MENU_W, display_count * (FH+1) + 2, SOLID, ERASE);
lcd_rect(MENU_X, y, MENU_W, display_count * (FH+1) + 2);
for (uint8_t i=0; i<display_count; i++) {
lcd_putsAtt(MENU_X+6, i*(FH+1) + 2*FH + 2, s_menu[i], s_menu_flags);
if (i == s_menu_item) lcd_filled_rect(MENU_X+1, i*(FH+1) + 2*FH + 1, MENU_W-2, 9);
lcd_putsAtt(MENU_X+6, i*(FH+1) + y + 2, s_menu[i], s_menu_flags);
if (i == s_menu_item) lcd_filled_rect(MENU_X+1, i*(FH+1) + y + 1, MENU_W-2, 9);
}
if (s_menu_count > display_count) {
displayScrollbar(MENU_X+MENU_W-1, 17, MENU_MAX_LINES * (FH+1), s_menu_offset, s_menu_count, MENU_MAX_LINES);
displayScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_LINES * (FH+1), s_menu_offset, s_menu_count, MENU_MAX_LINES);
}
switch(event) {
CASE_EVT_ROTARY_RIGHT
#if defined(ROTARY_ENCODER_NAVIGATION)
CASE_EVT_ROTARY_LEFT
#endif
case EVT_KEY_BREAK(KEY_MOVE_UP):
if (s_menu_item > 0)
s_menu_item--;
#if defined(SDCARD)
else if (s_menu_offset > 0) {
s_menu_offset--;
result = STR_UPDATE_LIST;
}
#endif
break;
#if defined(ROTARY_ENCODER_NAVIGATION)
CASE_EVT_ROTARY_LEFT
CASE_EVT_ROTARY_RIGHT
#endif
case EVT_KEY_BREAK(KEY_MOVE_DOWN):
if (s_menu_item < display_count - 1 && s_menu_offset + s_menu_item + 1 < s_menu_count)
s_menu_item++;
#if defined(SDCARD)
else if (s_menu_count > s_menu_offset + display_count) {
s_menu_offset++;
result = STR_UPDATE_LIST;
}
#endif
break;
CASE_EVT_ROTARY_BREAK
case EVT_KEY_BREAK(KEY_ENTER):
@@ -786,7 +798,9 @@ const char * displayMenu(uint8_t event)
return result;
}
#endif
#if defined(SDCARD)
char statusLineMsg[STATUS_LINE_LENGTH];
tmr10ms_t statusLineTime = 0;
uint8_t statusLineHeight = 0;
@@ -815,8 +829,4 @@ void drawStatusLine()
lcd_filled_rect(0, 8*FH-statusLineHeight, LCD_W, 8, SOLID);
}
}
#endif
+49 -31
View File
@@ -231,52 +231,70 @@ void displayBox();
void displayPopup(const pm_char * pstr);
void displayWarning(uint8_t event);
#if defined(SDCARD)
#define MENU_MAX_LINES 4
#define MENU_LINE_LENGTH (LEN_MODEL_NAME+1)
extern const char *s_menu[MENU_MAX_LINES];
extern uint16_t s_menu_count;
extern uint8_t s_menu_flags;
extern uint16_t s_menu_offset;
const char * displayMenu(uint8_t event);
#define STATUS_LINE_LENGTH 32
extern char statusLineMsg[STATUS_LINE_LENGTH];
void showStatusLine();
void drawStatusLine();
#if defined(SDCARD) || (defined(ROTARY_ENCODER_NAVIGATION) && !defined(CPUM64))
#define NAVIGATION_MENUS
#define MENU_ADD_ITEM(s) s_menu[s_menu_count++] = s
#if defined(SDCARD) && defined(ROTARY_ENCODER_NAVIGATION)
#define MENU_MAX_LINES 6
#else
#define MENU_MAX_LINES 4
#endif
#if defined(SDCARD)
#define MENU_ADD_SD_ITEM(s) MENU_ADD_ITEM(s)
#else
#define MENU_ADD_SD_ITEM(s)
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
#define MENU_ADD_NAVIGATION_ITEM(s) MENU_ADD_ITEM(s)
#else
#define MENU_ADD_NAVIGATION_ITEM(s)
#endif
#define MENU_LINE_LENGTH (LEN_MODEL_NAME+1)
extern const char *s_menu[MENU_MAX_LINES];
extern uint16_t s_menu_count;
extern uint8_t s_menu_flags;
extern uint16_t s_menu_offset;
const char * displayMenu(uint8_t event);
#else
#define s_menu_count 0
#define drawStatusLine()
#define s_menu_count 0
#endif
#if defined(SDCARD)
#define STATUS_LINE_LENGTH 32
extern char statusLineMsg[STATUS_LINE_LENGTH];
void showStatusLine();
void drawStatusLine();
#else
#define drawStatusLine()
#endif
void menuChannelsMonitor(uint8_t event);
#define LABEL(...) (uint8_t)-1
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
#define KEY_MOVE_UP KEY_PLUS
#define KEY_MOVE_DOWN KEY_MINUS
#define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_PLUS)
#define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_MINUS)
#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_LEFT
#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_RIGHT
#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_LEFT
#define IS_ROTARY_MOVE_LEFT IS_ROTARY_RIGHT
#else
#define KEY_MOVE_UP KEY_UP
#define KEY_MOVE_DOWN KEY_DOWN
#define CURSOR_MOVED_LEFT(event) (IS_ROTARY_LEFT(event) || EVT_KEY_MASK(event) == KEY_LEFT)
#define CURSOR_MOVED_RIGHT(event) (IS_ROTARY_RIGHT(event) || EVT_KEY_MASK(event) == KEY_RIGHT)
#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_RIGHT
#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_LEFT
#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_RIGHT
#define IS_ROTARY_MOVE_LEFT IS_ROTARY_LEFT
#endif
#define CURSOR_MOVED_LEFT(event) (IS_ROTARY_LEFT(event) || EVT_KEY_MASK(event) == KEY_LEFT)
#define CURSOR_MOVED_RIGHT(event) (IS_ROTARY_RIGHT(event) || EVT_KEY_MASK(event) == KEY_RIGHT)
#if defined(PCBX9D)
#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_LEFT
#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_RIGHT
#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_LEFT
#define IS_ROTARY_MOVE_LEFT IS_ROTARY_RIGHT
#else
#define CASE_EVT_ROTARY_MOVE_RIGHT CASE_EVT_ROTARY_RIGHT
#define CASE_EVT_ROTARY_MOVE_LEFT CASE_EVT_ROTARY_LEFT
#define IS_ROTARY_MOVE_RIGHT IS_ROTARY_RIGHT
#define IS_ROTARY_MOVE_LEFT IS_ROTARY_LEFT
#endif
#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D)
#define REPEAT_LAST_CURSOR_MOVE() { if (CURSOR_MOVED_LEFT(event) || CURSOR_MOVED_RIGHT(event)) putEvent(event); else m_posHorz = 0; }
#elif defined(ROTARY_ENCODER_NAVIGATION)
#define REPEAT_LAST_CURSOR_MOVE() { if (EVT_KEY_MASK(event) >= 0x0e) putEvent(event); else m_posHorz = 0; }
#else
#define REPEAT_LAST_CURSOR_MOVE() m_posHorz = 0;
+150 -111
View File
@@ -233,7 +233,7 @@ void menuModelSelect(uint8_t event)
event = EVT_ENTRY_UP;
}
#if defined(SDCARD)
#if defined(NAVIGATION_MENUS)
uint8_t _event = event;
if (s_menu_count) {
event = 0;
@@ -274,10 +274,32 @@ void menuModelSelect(uint8_t event)
if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) {
s_warning = STR_DELETEMODEL;
s_warning_type = WARNING_TYPE_CONFIRM;
#if defined(CPUARM)
s_warning_info = modelNames[sub];
#else
char * name = reusableBuffer.models.mainname;
eeLoadModelName(sub, name);
s_warning_info = name;
#endif
s_warning_info_len = sizeof(g_model.name);
killEvents(event);
break;
}
// no break
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LONG:
killEvents(event);
if (s_editMode < 0) {
popMenu();
return;
}
else if (!s_copyMode) {
m_posVert = sub = g_eeGeneral.currModel;
s_copyMode = 0;
s_editMode = EDIT_MODE_INIT;
}
// no break
#endif
case EVT_KEY_BREAK(KEY_EXIT):
if (s_copyMode) {
sub = m_posVert = (s_copyMode == MOVE_MODE || s_copySrcRow<0) ? (MAX_MODELS+sub+s_copyTgtOfs) % MAX_MODELS : s_copySrcRow;
@@ -286,14 +308,9 @@ void menuModelSelect(uint8_t event)
break;
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_BREAK:
s_editMode = (s_editMode == 0 && sub == g_eeGeneral.currModel) ? -1 : 0;
break;
case EVT_ROTARY_LONG:
if (s_editMode < 0) {
killEvents(event);
popMenu();
return;
if (s_editMode == -1) {
s_editMode = 0;
break;
}
// no break;
#endif
@@ -330,25 +347,42 @@ void menuModelSelect(uint8_t event)
s_copyMode = 0;
event = EVT_ENTRY_UP;
}
else if (event == EVT_KEY_LONG(KEY_MENU) || IS_ROTARY_LONG(event)) {
else if (event == EVT_KEY_LONG(KEY_MENU) || IS_ROTARY_BREAK(event)) {
s_copyMode = 0;
killEvents(event);
#if defined(SDCARD)
#if defined(NAVIGATION_MENUS)
_event = 0;
if (g_eeGeneral.currModel != sub) {
if (eeModelExists(sub)) {
s_menu[s_menu_count++] = STR_SELECT_MODEL;
s_menu[s_menu_count++] = STR_BACKUP_MODEL;
s_menu[s_menu_count++] = STR_RESTORE_MODEL;
MENU_ADD_SD_ITEM(STR_BACKUP_MODEL);
MENU_ADD_SD_ITEM(STR_RESTORE_MODEL);
MENU_ADD_NAVIGATION_ITEM(STR_COPY_MODEL);
MENU_ADD_NAVIGATION_ITEM(STR_MOVE_MODEL);
s_menu[s_menu_count++] = STR_DELETE_MODEL;
}
else {
#if defined(SDCARD)
s_menu[s_menu_count++] = STR_CREATE_MODEL;
s_menu[s_menu_count++] = STR_RESTORE_MODEL;
MENU_ADD_SD_ITEM(STR_RESTORE_MODEL);
#else
// TODO duplicated *3 code
displayPopup(STR_LOADINGMODEL);
saveTimers();
eeCheck(true); // force writing of current model data before this is changed
if (g_eeGeneral.currModel != sub) {
g_eeGeneral.currModel = sub;
STORE_GENERALVARS;
eeLoadModel(sub);
}
#endif
}
}
else {
s_menu[s_menu_count++] = STR_BACKUP_MODEL;
s_menu[s_menu_count++] = STR_RESTORE_MODEL;
MENU_ADD_SD_ITEM(STR_BACKUP_MODEL);
MENU_ADD_SD_ITEM(STR_RESTORE_MODEL);
MENU_ADD_NAVIGATION_ITEM(STR_COPY_MODEL);
MENU_ADD_NAVIGATION_ITEM(STR_MOVE_MODEL);
}
#else
if (g_eeGeneral.currModel != sub) {
@@ -369,7 +403,6 @@ void menuModelSelect(uint8_t event)
break;
#if defined(PCBX9D)
// TODO merge with lines below
case EVT_KEY_BREAK(KEY_PAGE):
case EVT_KEY_LONG(KEY_PAGE):
chainMenu(event == EVT_KEY_BREAK(KEY_PAGE) ? menuModelSetup : menuTabModel[DIM(menuTabModel)-1]);
@@ -379,29 +412,35 @@ void menuModelSelect(uint8_t event)
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LEFT:
case EVT_ROTARY_RIGHT:
if (s_editMode >= 0) break;
#endif
case EVT_KEY_FIRST(KEY_LEFT):
case EVT_KEY_FIRST(KEY_RIGHT):
#if defined(ROTARY_ENCODER_NAVIGATION)
if ((!IS_ROTARY_RIGHT(event) && !IS_ROTARY_LEFT(event)) || s_editMode < 0) {
#endif
if (sub == g_eeGeneral.currModel) {
chainMenu((IS_ROTARY_RIGHT(event) || event == EVT_KEY_FIRST(KEY_RIGHT)) ? menuModelSetup : menuTabModel[DIM(menuTabModel)-1]);
return;
}
AUDIO_WARNING2();
break;
#if defined(ROTARY_ENCODER_NAVIGATION)
}
// no break
#endif
#endif
case EVT_KEY_FIRST(KEY_MOVE_UP):
case EVT_KEY_FIRST(KEY_MOVE_DOWN):
if (s_copyMode) {
int8_t next_ofs = (event == EVT_KEY_FIRST(KEY_MOVE_UP) ? s_copyTgtOfs+1 : s_copyTgtOfs-1);
int8_t next_ofs = (IS_ROTARY_LEFT(event) || event == EVT_KEY_FIRST(KEY_MOVE_UP)) ? s_copyTgtOfs+1 : s_copyTgtOfs-1;
if (next_ofs == MAX_MODELS || next_ofs == -MAX_MODELS)
next_ofs = 0;
if (s_copySrcRow < 0 && s_copyMode==COPY_MODE) {
s_copySrcRow = oldSub;
// find a hole (in the first empty slot above / below)
sub = eeFindEmptyModel(s_copySrcRow, event==EVT_KEY_FIRST(KEY_MOVE_DOWN));
sub = eeFindEmptyModel(s_copySrcRow, IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_MOVE_DOWN));
if (sub < 0) {
// no free room for duplicating the model
AUDIO_ERROR();
@@ -417,7 +456,7 @@ void menuModelSelect(uint8_t event)
}
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
lcd_puts(27*FW-(LEN_FREE-4)*FW, 0, STR_FREE);
if (refresh) reusableBuffer.models.eepromfree = EeFsGetFree();
lcd_outdezAtt(20*FW, 0, reusableBuffer.models.eepromfree, 0);
@@ -483,19 +522,7 @@ void menuModelSelect(uint8_t event)
}
}
if (s_warning) {
#if defined(CPUARM)
s_warning_info = modelNames[sub];
#else
char * name = reusableBuffer.models.mainname;
if (refresh) eeLoadModelName(sub, name);
s_warning_info = name;
#endif
s_warning_info_len = sizeof(g_model.name);
displayWarning(event);
}
#if defined(SDCARD)
#if defined(NAVIGATION_MENUS)
REFRESH(false);
if (s_menu_count) {
@@ -512,6 +539,19 @@ void menuModelSelect(uint8_t event)
eeLoadModel(sub);
}
}
#if defined(ROTARY_ENCODER_NAVIGATION)
else if (result == STR_COPY_MODEL) {
s_copyMode = COPY_MODE;
s_copyTgtOfs = 0;
s_copySrcRow = -1;
}
else if (result == STR_MOVE_MODEL) {
s_copyMode = MOVE_MODE;
s_copyTgtOfs = 0;
s_copySrcRow = -1;
}
#endif
#if defined(SDCARD)
else if (result == STR_BACKUP_MODEL) {
eeCheck(true); // force writing of current model data before this is changed
s_warning = eeBackupModel(sub);
@@ -522,16 +562,27 @@ void menuModelSelect(uint8_t event)
s_menu_flags = 0;
}
}
#endif
else if (result == STR_DELETE_MODEL) {
s_warning = STR_DELETEMODEL;
s_warning_type = WARNING_TYPE_CONFIRM;
#if defined(CPUARM)
s_warning_info = modelNames[sub];
#else
char * name = reusableBuffer.models.mainname;
eeLoadModelName(sub, name);
s_warning_info = name;
#endif
s_warning_info_len = sizeof(g_model.name);
}
#if defined(SDCARD)
else {
// The user choosed a file on SD to restore
s_warning = eeRestoreModel(sub, (char *)result);
if (!s_warning && g_eeGeneral.currModel == sub)
eeLoadModel(sub);
}
#endif
}
}
#endif
@@ -741,7 +792,7 @@ void menuModelSetup(uint8_t event)
div_t qr = div(timer->start, 60);
switch (m_posHorz) {
case 0:
CHECK_INCDEC_MODELVAR(event, timer->mode, -2*(MAX_PSWITCH+NUM_CSW), TMR_VAROFS-1+2*(MAX_PSWITCH+NUM_CSW));
CHECK_INCDEC_MODELVAR(event, timer->mode, -2*(MAX_PSWITCH+NUM_CSW)-1, TMR_VAROFS+2*(MAX_PSWITCH+NUM_CSW));
break;
case 1:
CHECK_INCDEC_MODELVAR_ZERO(event, qr.quot, 59);
@@ -836,7 +887,7 @@ void menuModelSetup(uint8_t event)
else {
if (states & 0x01)
attr = INVERS;
c = pgm_read_byte(STR_VSWITCHES - 2 + (3*i) + (i>=5 ? 6 : 0));
c = pgm_read_byte(STR_VSWITCHES - 2 + 6 + (3*i));
states >>= 1;
}
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+2*FW+i*FW, y, c, attr);
@@ -1370,8 +1421,8 @@ void menuModelHeli(uint8_t event)
break;
case ITEM_HELI_COLLECTIVE:
g_model.swashR.collectiveSource = selectMenuItem(HELI_PARAM_OFS, y, STR_COLLECTIVE, NULL, g_model.swashR.collectiveSource, 0, NUM_XCHNRAW, attr, event);
putsChnRaw(HELI_PARAM_OFS, y, g_model.swashR.collectiveSource, attr);
g_model.swashR.collectiveSource = selectMenuItem(HELI_PARAM_OFS, y, STR_COLLECTIVE, NULL, g_model.swashR.collectiveSource, 0, MIXSRC_LAST_CH, attr, event);
putsMixerSource(HELI_PARAM_OFS, y, g_model.swashR.collectiveSource, attr);
break;
case ITEM_HELI_SWASHRING:
@@ -1476,7 +1527,7 @@ void menuModelCurveOne(uint8_t event)
break;
CASE_EVT_ROTARY_BREAK
case EVT_KEY_BREAK(KEY_ENTER):
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
if (s_editMode <= 0) {
s_editMode = 1;
m_posHorz = 0;
@@ -1506,7 +1557,7 @@ void menuModelCurveOne(uint8_t event)
break;
case EVT_KEY_BREAK(KEY_EXIT):
if (s_editMode > 0) {
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
if (s_editMode == 3 && !(crv.custom && m_posHorz>0 && m_posHorz<crv.points-1))
s_editMode = 2;
#endif
@@ -1585,7 +1636,7 @@ void menuModelCurveOne(uint8_t event)
int8_t x = -100 + 200*i/(crv.points-1);
if (crv.custom && i>0 && i<crv.points-1) x = crv.crv[crv.points+i-1];
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
lcd_puts(7, 2*FH, PSTR("x=")); lcd_outdezAtt(7+2*FW, 2*FH, x, LEFT|(s_editMode==2 ? BLINK|INVERS : 0));
lcd_puts(7, 3*FH, PSTR("y=")); lcd_outdezAtt(7+2*FW, 3*FH, crv.crv[i], LEFT|(s_editMode==3 ? BLINK|INVERS : 0));
#else
@@ -1594,7 +1645,7 @@ void menuModelCurveOne(uint8_t event)
#endif
lcd_rect(3, 1*FH+4, 7*FW-2, 3*FH-2);
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
if (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_FIRST(KEY_PLUS) || event==EVT_KEY_REPT(KEY_MINUS) || event==EVT_KEY_REPT(KEY_PLUS)) {
if (s_editMode == 2)
CHECK_INCDEC_MODELVAR(event, crv.crv[crv.points+i-1], i==1 ? -99 : crv.crv[crv.points+i-2]+1, i==crv.points-2 ? 99 : crv.crv[crv.points+i]-1); // edit X
@@ -1801,7 +1852,7 @@ enum ExposFields {
void menuModelExpoOne(uint8_t event)
{
ExpoData *ed = expoaddress(s_currIdx);
putsChnRaw(7*FW+FW/2,0,ed->chn+1,0);
putsMixerSource(7*FW+FW/2, 0, ed->chn+1, 0);
SUBMENU(STR_MENUDREXPO, EXPO_FIELD_MAX, {IF_CPUARM(0) 0, 0, IF_CURVES(0) IF_FLIGHT_PHASES(MAX_PHASES-1) 0 /*, ...*/});
@@ -1980,7 +2031,7 @@ void menuModelMixOne(uint8_t event)
case MIX_FIELD_SOURCE:
lcd_putsColumnLeft(COLUMN_X, y, NO_INDENT(STR_SOURCE));
putsMixerSource(COLUMN_X+MIXES_2ND_COLUMN, y, md2->srcRaw, attr);
if(attr) CHECK_INCDEC_MODELVAR(event, md2->srcRaw, 1, NUM_XCHNMIX);
if(attr) CHECK_INCDEC_MODELVAR(event, md2->srcRaw, 1, MIXSRC_LAST_CH);
break;
case MIX_FIELD_WEIGHT:
lcd_putsColumnLeft(COLUMN_X, y, STR_WEIGHT);
@@ -1989,7 +2040,7 @@ void menuModelMixOne(uint8_t event)
case MIX_FIELD_OFFSET:
{
lcd_putsColumnLeft(COLUMN_X, y, NO_INDENT(STR_OFFSET));
#if defined(GVARS)
#if defined(GVARS) && !defined(CPUARM)
int16_t offset = (md2->offsetMode ? (int16_t)GV1_LARGE + md2->offset : md2->offset);
offset = gvarMenuItem(COLUMN_X+MIXES_2ND_COLUMN, y, offset, -125, 125, attr|LEFT, event);
if (offset <= 125) {
@@ -2251,7 +2302,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
if (expo ? (i<MAX_EXPOS && (ed=expoaddress(i))->chn+1 == ch && ed->mode) : (i<MAX_MIXERS && (md=mixaddress(i))->srcRaw && md->destCh+1 == ch)) {
if (s_pgOfs < cur && cur-s_pgOfs < LCD_LINES) {
if (expo)
putsChnRaw(0, y, ch, 0);
putsMixerSource(0, y, ch, 0);
else
putsChn(0, y, ch, 0); // show CHx
}
@@ -2356,7 +2407,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
}
if (s_pgOfs < cur && cur-s_pgOfs < LCD_LINES) {
if (expo)
putsChnRaw(0, y, ch, attr);
putsMixerSource(0, y, ch, attr);
else
putsChn(0, y, ch, attr); // show CHx
if (s_copyMode == MOVE_MODE && s_copySrcCh == ch) {
@@ -2400,7 +2451,7 @@ bool thrOutput(uint8_t ch)
}
enum LimitsItems {
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
ITEM_LIMITS_CH_NAME,
#endif
ITEM_LIMITS_OFFSET,
@@ -2417,7 +2468,7 @@ enum LimitsItems {
ITEM_LIMITS_MAXROW = ITEM_LIMITS_COUNT-1
};
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
#define LIMITS_NAME_POS 4*FW
#define LIMITS_OFFSET_POS 14*FW
#define LIMITS_DIRECTION_POS 19*FW+4
@@ -2524,7 +2575,7 @@ void menuModelLimits(uint8_t event)
uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ;
switch(j)
{
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
case ITEM_LIMITS_CH_NAME:
editName(LIMITS_NAME_POS, y, ld->name, sizeof(ld->name), event, attr);
break;
@@ -2743,7 +2794,7 @@ void menuModelCustomSwitchOne(uint8_t event)
TITLE(STR_MENUCUSTOMSWITCH);
CustomSwData * cs = cswaddress(s_currIdx);
uint8_t sw = DSW(SW_SW1)+s_currIdx;
uint8_t sw = SWSRC_SW1+s_currIdx;
putsSwitches(14*FW, 0, sw, (getSwitch(sw, 0) ? BOLD : 0));
SIMPLE_SUBMENU_NOTITLE(CSW_FIELD_COUNT);
@@ -2769,13 +2820,13 @@ void menuModelCustomSwitchOne(uint8_t event)
case CSW_FIELD_V1:
{
lcd_putsLeft(y, STR_V1);
int8_t v1_min=0, v1_max=NUM_XCHNCSW;
int8_t v1_min=0, v1_max=MIXSRC_LAST_CH+NUM_TELEMETRY;
if (cstate == CS_VBOOL) {
putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr);
v1_min = SWITCH_OFF+1; v1_max = SWITCH_ON-1;
v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1;
}
else {
putsChnRaw(CSW_2ND_COLUMN, y, cs->v1, attr);
putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, attr);
}
if (attr) {
CHECK_INCDEC_MODELVAR(event, cs->v1, v1_min, v1_max);
@@ -2785,19 +2836,19 @@ void menuModelCustomSwitchOne(uint8_t event)
case CSW_FIELD_V2:
{
lcd_putsLeft(y, STR_V2);
int8_t v2_min=0, v2_max=NUM_XCHNCSW;
int8_t v2_min=0, v2_max=MIXSRC_LAST_CH+NUM_TELEMETRY;
if (cstate == CS_VBOOL) {
putsSwitches(CSW_2ND_COLUMN, y, cs->v2, attr);
v2_min = SWITCH_OFF+1; v2_max = SWITCH_ON-1;
v2_min = SWSRC_OFF+1; v2_max = SWSRC_OFF-1;
}
else if (cstate == CS_VCOMP) {
putsChnRaw(CSW_2ND_COLUMN, y, cs->v2, attr);
putsMixerSource(CSW_2ND_COLUMN, y, cs->v2, attr);
}
else {
#if defined(FRSKY)
if (cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT) {
putsTelemetryChannel(CSW_2ND_COLUMN, y, cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT+1), convertCswTelemValue(cs), attr|LEFT);
v2_max = maxTelemValue(cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT));
if (cs->v1 > MIXSRC_LAST_CH) {
putsTelemetryChannel(CSW_2ND_COLUMN, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), attr|LEFT);
v2_max = maxTelemValue(cs->v1 - MIXSRC_LAST_CH);
if (cstate == CS_VOFS) {
v2_min = -128;
v2_max -= 128;
@@ -2873,7 +2924,7 @@ void menuModelCustomSwitches(uint8_t event)
CustomSwData * cs = cswaddress(k);
// CSW name
uint8_t sw = DSW(SW_SW1)+k;
uint8_t sw = SWSRC_SW1+k;
putsSwitches(0, y, sw, (sub==k ? INVERS : 0) | (getSwitch(sw, 0) ? BOLD : 0));
@@ -2889,15 +2940,15 @@ void menuModelCustomSwitches(uint8_t event)
putsSwitches(16*FW, y, cs->v2, 0);
}
else if (cstate == CS_VCOMP) {
putsChnRaw(10*FW, y, cs->v1, 0);
putsChnRaw(16*FW, y, cs->v2, 0);
putsMixerSource(10*FW, y, cs->v1, 0);
putsMixerSource(16*FW, y, cs->v2, 0);
}
else {
putsChnRaw(10*FW, y, cs->v1, 0);
putsMixerSource(10*FW, y, cs->v1, 0);
#if defined(FRSKY)
if (cs->v1 > NUM_XCHNCSW-NUM_TELEMETRY) {
putsTelemetryChannel(18*FW+2, y, cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT+1), convertCswTelemValue(cs), 0);
if (cs->v1 > MIXSRC_LAST_CH) {
putsTelemetryChannel(18*FW+2, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), 0);
}
else
#endif
@@ -2925,7 +2976,7 @@ void menuModelCustomSwitches(uint8_t event)
CustomSwData * cs = cswaddress(k);
// CSW name
uint8_t sw = DSW(SW_SW1)+k;
uint8_t sw = SWSRC_SW1+k;
putsSwitches(0, y, sw, getSwitch(sw, 0) ? BOLD : 0);
// CSW func
@@ -2933,25 +2984,25 @@ void menuModelCustomSwitches(uint8_t event)
// CSW params
uint8_t cstate = CS_STATE(cs->func);
int8_t v1_min=0, v1_max=NUM_XCHNCSW, v2_min=0, v2_max=NUM_XCHNCSW;
int8_t v1_min=0, v1_max=MIXSRC_LAST_CH+NUM_TELEMETRY, v2_min=0, v2_max=MIXSRC_LAST_CH+NUM_TELEMETRY;
if (cstate == CS_VBOOL) {
putsSwitches(10*FW, y, cs->v1, m_posHorz==1 ? attr : 0);
putsSwitches(16*FW, y, cs->v2, m_posHorz==2 ? attr : 0);
v1_min = SWITCH_OFF+1; v1_max = SWITCH_ON-1;
v2_min = SWITCH_OFF+1; v2_max = SWITCH_ON-1;
v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1;
v2_min = SWSRC_OFF+1; v2_max = SWSRC_ON-1;
}
else if (cstate == CS_VCOMP) {
putsChnRaw(10*FW, y, cs->v1, m_posHorz==1 ? attr : 0);
putsChnRaw(16*FW, y, cs->v2, m_posHorz==2 ? attr : 0);
putsMixerSource(10*FW, y, cs->v1, m_posHorz==1 ? attr : 0);
putsMixerSource(16*FW, y, cs->v2, m_posHorz==2 ? attr : 0);
}
else {
putsChnRaw(10*FW, y, cs->v1, (m_posHorz==1 ? attr : 0));
putsMixerSource(10*FW, y, cs->v1, (m_posHorz==1 ? attr : 0));
#if defined(FRSKY)
if (cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT) {
putsTelemetryChannel(18*FW+2, y, cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT+1), convertCswTelemValue(cs), m_posHorz==2 ? attr : 0);
v2_max = maxTelemValue(cs->v1 - (CSW_CHOUT_BASE+NUM_CHNOUT));
if (cs->v1 > MIXSRC_LAST_CH) {
putsTelemetryChannel(18*FW+2, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), m_posHorz==2 ? attr : 0);
v2_max = maxTelemValue(cs->v1 - MIXSRC_LAST_CH);
if (cstate == CS_VOFS) {
v2_min = -128;
v2_max -= 128;
@@ -3033,20 +3084,8 @@ void menuModelCustomFunctions(uint8_t event)
uint8_t active = (attr && (s_editMode>0 || p1valdiff));
switch (j) {
case 0:
if (sd->func <= FUNC_TRAINER_AIL && sd->active) {
if (sd->swtch > MAX_SWITCH+1) sd->swtch -= (MAX_SWITCH+1);
if (sd->swtch < -MAX_SWITCH-1) sd->swtch += (MAX_SWITCH+1);
}
putsSwitches(3, y, sd->swtch, SWONOFF | attr | ((activeFnSwitches & ((MASK_FUNC_TYPE)1 << k)) ? BOLD : 0));
if (active || AUTOSWITCH_ENTER_LONG()) {
#if defined(PCBX9D)
CHECK_INCDEC_MODELSWITCH(event, sd->swtch, -127, +127);
#elif defined(CPUARM)
CHECK_INCDEC_MODELSWITCH(event, sd->swtch, SWITCH_OFF-MAX_SWITCH, SWITCH_ON+MAX_SWITCH+1+2*MAX_PSWITCH);
#else
CHECK_INCDEC_MODELSWITCH(event, sd->swtch, SWITCH_OFF-MAX_SWITCH, SWITCH_ON+MAX_SWITCH+1);
#endif
}
putsSwitches(3, y, sd->swtch, attr | ((activeFnSwitches & ((MASK_FUNC_TYPE)1 << k)) ? BOLD : 0));
if (active || AUTOSWITCH_ENTER_LONG()) CHECK_INCDEC_MODELSWITCH(event, sd->swtch, SWSRC_FIRST, SWSRC_LAST);
break;
case 1:
@@ -3059,7 +3098,7 @@ void menuModelCustomFunctions(uint8_t event)
else if (sd->func < 16 + NUM_STICKS + 1) {
func_displayed = 1;
if (sd->func != FUNC_TRAINER)
putsChnRaw(MODEL_CUSTOM_FUNC_2ND_COLUMN+8*FW, y, sd->func-FUNC_TRAINER, attr);
putsMixerSource(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, sd->func-FUNC_TRAINER, attr);
}
#if defined(DEBUG)
else if (sd->func == FUNC_TEST) {
@@ -3127,27 +3166,27 @@ void menuModelCustomFunctions(uint8_t event)
break;
}
else if (sd->func == FUNC_PLAY_VALUE) {
val_max = NUM_XCHNPLAY-1;
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN-FW-2, y, val_displayed+1, attr);
val_max = MIXSRC_LAST_CH + TELEM_DISPLAY_MAX - 1;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
#endif
#if defined(CPUARM)
else if (sd->func == FUNC_VOLUME) {
val_max = NUM_XCHNRAW-1;
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
val_max = MIXSRC_LAST_CH-1;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
#elif defined(VOICE)
else if (sd->func == FUNC_PLAY_TRACK) {
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+PROMPT_CUSTOM_BASE, attr|LEFT);
}
else if (sd->func == FUNC_PLAY_BOTH) {
lcd_putcAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN-1, y, '|', attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+1, y, val_displayed+PROMPT_CUSTOM_BASE, attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+3, y, val_displayed+PROMPT_CUSTOM_BASE+1, attr|LEFT);
lcd_putcAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN-2+3*FWNUM, y, '|', attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+3*FWNUM, y, val_displayed+PROMPT_CUSTOM_BASE, attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+2+3*FWNUM, y, (val_displayed+PROMPT_CUSTOM_BASE+1)%10, attr|LEFT);
}
else if (sd->func == FUNC_PLAY_VALUE) {
val_max = NUM_XCHNPLAY-1;
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN-2*FW-2, y, val_displayed+1, attr);
val_max = MIXSRC_LAST_CH + TELEM_DISPLAY_MAX - 1;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
#endif
#if defined(SDCARD)
@@ -3176,8 +3215,8 @@ void menuModelCustomFunctions(uint8_t event)
&& sd->func != FUNC_TEST
#endif
) {
val_max = NUM_XCHNRAW-1;
putsChnRaw(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
val_max = MIXSRC_LAST_CH-1;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
#endif
else {
@@ -3202,16 +3241,16 @@ void menuModelCustomFunctions(uint8_t event)
#if defined(VOICE)
else if (sd->swtch && sd->func >= FUNC_PLAY_TRACK && sd->func <= FUNC_PLAY_VALUE) {
#if defined(CPUARM)
if (sd->active) {
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2, y, sd->active*5, attr);
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2, y, '\'', attr);
}
else {
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN-1, y, '-', attr);
}
if (sd->active)
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, sd->active*5, attr);
else
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+1, y, '-', attr);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 12);
#else
lcd_putsiAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN-2*FWNUM, y, PSTR("\003\002\001-15'30'60'"), sd->active, attr);
if (sd->active)
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, 15 << (sd->active-1), attr);
else
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+1, y, '-', attr);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 3);
#endif
}
@@ -3312,7 +3351,7 @@ void menuModelTelemetry(uint8_t event)
switch (event) {
case EVT_KEY_BREAK(KEY_DOWN):
case EVT_KEY_BREAK(KEY_UP):
#if !defined(PCBX9D) && !defined(PCBACT)
#if !defined(PCBX9D)
case EVT_KEY_BREAK(KEY_LEFT):
case EVT_KEY_BREAK(KEY_RIGHT):
#endif
+194 -85
View File
@@ -49,12 +49,10 @@
#define WARN_MEM (!(g_eeGeneral.warnOpts & WARN_MEM_BIT))
#define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 )
#if defined(PCBACT)
#define EEPROM_VER 213
#elif defined(PCBX9D)
#define EEPROM_VER 213
#if defined(PCBX9D)
#define EEPROM_VER 214
#elif defined(PCBSKY9X)
#define EEPROM_VER 213
#define EEPROM_VER 214
#elif defined(PCBGRUVIN9X)
#define EEPROM_VER 213
#else
@@ -271,17 +269,17 @@ PACK(typedef struct t_MixData {
uint8_t noExpo:1;
int8_t carryTrim:3;
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
uint8_t offsetMode:1; // TODO change offset to 16bits in future EEPROM
int16_t weight;
int8_t swtch;
int8_t curveParam;
uint8_t mixWarn; // mixer warning
uint8_t mixWarn:4; // mixer warning
uint8_t srcVariant:4;
uint8_t delayUp;
uint8_t delayDown;
uint8_t speedUp;
uint8_t speedDown;
uint8_t srcRaw;
int8_t offset;
int16_t offset;
char name[LEN_EXPOMIX_NAME];
}) MixData;
#define MD_WEIGHT(md) (md->weight)
@@ -317,7 +315,7 @@ PACK(typedef struct t_MixData {
#endif
#endif
#if defined(GVARS)
#if defined(GVARS) && !defined(CPUARM)
#define MD_OFFSET(md) (md->offsetMode ? (int16_t)GV1_LARGE+md->offset : md->offset)
#else
#define MD_OFFSET(md) (md->offset)
@@ -329,7 +327,8 @@ PACK(typedef struct t_MixData {
PACK(typedef struct t_CustomSwData { // Custom Switches data
int8_t v1; //input
int8_t v2; //offset
uint8_t func;
uint8_t func:5;
uint8_t andsw:3; // TODO 8bits for next EEPROM
uint8_t delay;
uint8_t duration;
}) CustomSwData;
@@ -337,7 +336,8 @@ PACK(typedef struct t_CustomSwData { // Custom Switches data
PACK(typedef struct t_CustomSwData { // Custom Switches data
int8_t v1; //input
int8_t v2; //offset
uint8_t func;
uint8_t func:4;
uint8_t andsw:4;
}) CustomSwData;
#endif
@@ -380,6 +380,22 @@ enum Functions {
FUNC_MAX
};
enum ResetFunctionParam {
FUNC_RESET_TIMER1,
FUNC_RESET_TIMER2,
FUNC_RESET_ALL,
#if defined(FRSKY)
FUNC_RESET_TELEMETRY,
#endif
#if ROTARY_ENCODERS > 0
FUNC_RESET_ROTENC1,
#endif
#if ROTARY_ENCODERS > 1
FUNC_RESET_ROTENC2,
#endif
FUNC_RESET_PARAMS_COUNT
};
#if defined(CPUARM)
PACK(typedef struct t_CustomFnData { // Function Switches data
int8_t swtch; //input
@@ -713,88 +729,181 @@ PACK(typedef struct t_PhaseData {
#define CURVTYPE int8_t
#endif
enum MixSources {
MIXSRC_Rud = 1,
MIXSRC_Ele,
MIXSRC_Thr,
MIXSRC_Ail,
MIXSRC_Pot1,
#if defined(PCBX9D) || defined(PCBACT)
MIXSRC_S1 = MIXSRC_Pot1,
MIXSRC_S2,
MIXSRC_S3,
MIXSRC_S4,
#define MAX_SWITCH (MAX_PSWITCH+NUM_CSW)
enum SwitchSources {
SWSRC_NONE = 0,
#if defined(PCBX9D)
SWSRC_SA0,
SWSRC_SA1,
SWSRC_SA2,
SWSRC_SB0,
SWSRC_SB1,
SWSRC_SB2,
SWSRC_SC0,
SWSRC_SC1,
SWSRC_SC2,
SWSRC_SD0,
SWSRC_SD1,
SWSRC_SD2,
SWSRC_SE0,
SWSRC_SE1,
SWSRC_SE2,
SWSRC_SF0,
SWSRC_SF2,
SWSRC_SG0,
SWSRC_SG1,
SWSRC_SG2,
SWSRC_SH0,
SWSRC_SH2,
#else
MIXSRC_P1 = MIXSRC_Pot1,
MIXSRC_P2,
MIXSRC_P3,
SWSRC_ID0,
SWSRC_ID1,
SWSRC_ID2,
#if defined(EXTRA_3POS)
SWSRC_ID3,
SWSRC_ID4,
SWSRC_ID5,
#endif
SWSRC_THR,
SWSRC_RUD,
SWSRC_ELE,
SWSRC_AIL,
SWSRC_GEA,
SWSRC_TRN,
#endif
SWSRC_SW1,
SWSRC_SW2,
SWSRC_SW3,
SWSRC_SW4,
SWSRC_SW5,
SWSRC_SW6,
SWSRC_SW7,
SWSRC_SW8,
SWSRC_SW9,
SWSRC_SWA,
SWSRC_SWB,
SWSRC_SWC,
SWSRC_LAST_CSW = SWSRC_SW1+NUM_CSW-1,
SWSRC_ON,
SWSRC_FIRST_MOMENT_SWITCH,
SWSRC_LAST_MOMENT_SWITCH = SWSRC_FIRST_MOMENT_SWITCH+SWSRC_ON-1,
#if ROTARY_ENCODERS > 0
SWSRC_FIRST_ROTENC_SWITCH,
SWSRC_LAST_ROTENC_SWITCH = SWSRC_FIRST_ROTENC_SWITCH+(2*ROTARY_ENCODERS)-1,
#endif
#if defined(CPUARM)
SWSRC_FIRST_SHORT_SWITCH,
SWSRC_LAST_SHORT_SWITCH = SWSRC_FIRST_SHORT_SWITCH + MAX_PSWITCH - 1,
SWSRC_FIRST_LONG_SWITCH,
SWSRC_LAST_LONG_SWITCH = SWSRC_FIRST_LONG_SWITCH + MAX_PSWITCH - 1,
#endif
SWSRC_COUNT,
SWSRC_FIRST = -SWSRC_LAST_MOMENT_SWITCH,
SWSRC_LAST = SWSRC_COUNT-1,
SWSRC_OFF = -SWSRC_ON
};
enum MixSources {
MIXSRC_NONE,
MIXSRC_Rud,
MIXSRC_Ele,
MIXSRC_Thr,
MIXSRC_Ail,
MIXSRC_Pot1,
#if defined(PCBX9D)
MIXSRC_S1 = MIXSRC_Pot1,
MIXSRC_S2,
MIXSRC_S3,
MIXSRC_S4,
#else
MIXSRC_P1 = MIXSRC_Pot1,
MIXSRC_P2,
#if !defined(EXTRA_3POS)
MIXSRC_P3,
#endif
#endif
#if defined(PCBSKY9X)
MIXSRC_REa,
MIXSRC_REa,
#elif defined(PCBGRUVIN9X)
MIXSRC_REa,
MIXSRC_REb,
#if ROTARY_ENCODERS > 2
MIXSRC_REa,
MIXSRC_REb,
#if ROTARY_ENCODERS > 2
MIXSRC_REc,
MIXSRC_REd,
#endif
#endif
#endif
MIXSRC_TrimRud,
MIXSRC_TrimEle,
MIXSRC_TrimThr,
MIXSRC_TrimAil,
MIXSRC_MAX,
#if defined(PCBX9D) || defined(PCBACT)
MIXSRC_SA,
MIXSRC_SB,
MIXSRC_SC,
MIXSRC_SD,
MIXSRC_SE,
MIXSRC_SF,
MIXSRC_SG,
MIXSRC_SH,
MIXSRC_MAX,
MIXSRC_CYC1,
MIXSRC_CYC2,
MIXSRC_CYC3,
MIXSRC_TrimRud,
MIXSRC_TrimEle,
MIXSRC_TrimThr,
MIXSRC_TrimAil,
#if defined(PCBX9D)
MIXSRC_SA,
MIXSRC_SB,
MIXSRC_SC,
MIXSRC_SD,
MIXSRC_SE,
MIXSRC_SF,
MIXSRC_SG,
MIXSRC_SH,
#else
MIXSRC_3POS,
MIXSRC_THR,
MIXSRC_RUD,
MIXSRC_ELE,
MIXSRC_ID0,
MIXSRC_ID1,
MIXSRC_ID2,
MIXSRC_AIL,
MIXSRC_GEA,
MIXSRC_TRN,
MIXSRC_3POS,
#if defined(EXTRA_3POS)
MIXSRC_3POS2,
#endif
MIXSRC_THR,
MIXSRC_RUD,
MIXSRC_ELE,
MIXSRC_AIL,
MIXSRC_GEA,
MIXSRC_TRN,
#endif
MIXSRC_SW1,
MIXSRC_SW9 = MIXSRC_SW1 + 8,
MIXSRC_SWA,
MIXSRC_SWB,
MIXSRC_SWC,
#if defined(CPUARM)
MIXSRC_SWW=MIXSRC_SWC+'W'-'C',
#endif
MIXSRC_CYC1,
MIXSRC_CYC2,
MIXSRC_CYC3,
MIXSRC_PPM1,
MIXSRC_PPM8 = MIXSRC_PPM1 + 7,
MIXSRC_CH1,
MIXSRC_CH2,
MIXSRC_CH3,
MIXSRC_CH4,
MIXSRC_CH5,
MIXSRC_CH6,
MIXSRC_CH7,
MIXSRC_CH8,
MIXSRC_CH9,
MIXSRC_CH10,
MIXSRC_CH11,
MIXSRC_CH12,
MIXSRC_CH13,
MIXSRC_CH14,
MIXSRC_CH15,
MIXSRC_CH16,
MIXSRC_CHMAX = MIXSRC_CH1+NUM_CHNOUT-1
MIXSRC_SW1,
MIXSRC_SW9 = MIXSRC_SW1 + 8,
MIXSRC_SWA,
MIXSRC_SWB,
MIXSRC_SWC,
MIXSRC_LAST_CSW = MIXSRC_SW1+NUM_CSW-1, // TODO same naming convention
MIXSRC_PPM1,
MIXSRC_LAST_PPM = MIXSRC_PPM1 + 7,
MIXSRC_CH1,
MIXSRC_CH2,
MIXSRC_CH3,
MIXSRC_CH4,
MIXSRC_CH5,
MIXSRC_CH6,
MIXSRC_CH7,
MIXSRC_CH8,
MIXSRC_CH9,
MIXSRC_CH10,
MIXSRC_CH11,
MIXSRC_CH12,
MIXSRC_CH13,
MIXSRC_CH14,
MIXSRC_CH15,
MIXSRC_CH16,
MIXSRC_LAST_CH = MIXSRC_CH1+NUM_CHNOUT-1
};
#define MIN_POINTS 3
@@ -881,7 +990,7 @@ PACK(typedef struct t_ModelData {
int8_t points[NUM_POINTS];
CustomSwData customSw[NUM_CSW];
CustomFnData funcSw[NUM_CFN];
CustomFnData funcSw[NUM_CFN];
SwashRingData swashR;
PhaseData phaseData[MAX_PHASES];
+216 -211
View File
@@ -72,9 +72,7 @@ char modelNames[MAX_MODELS][sizeof(g_model.name)];
#if defined(SPLASH)
const pm_uchar splashdata[] PROGMEM = { 'S','P','S',0,
#if defined(PCBACT)
#include "splash_ACT.lbm"
#elif defined(PCBX9D)
#if defined(PCBX9D)
#include "splash_X9D.lbm"
#else
#include "splash_9x.lbm"
@@ -660,6 +658,10 @@ int16_t ex_chans[NUM_CHNOUT] = {0}; // Outputs (before LIMITS) of the last perMa
int16_t cyc_anas[3] = {0};
#endif
// TODO same naming convention than the putsMixerSource
bool __getSwitch(int8_t swtch);
int16_t getValue(uint8_t i)
{
/*srcRaw is shifted +1!*/
@@ -668,9 +670,15 @@ int16_t getValue(uint8_t i)
#if defined(PCBGRUVIN9X) || defined(PCBSKY9X)
else if (i<NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS) return getRotaryEncoder(i-(NUM_STICKS+NUM_POTS));
#endif
else if (i<MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(s_perout_flight_phase, i-(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS)));
else if (i<MIXSRC_MAX) return 1024;
#if defined(PCBX9D) || defined(PCBACT)
else if (i<MIXSRC_CYC3)
#if defined(HELI)
return cyc_anas[i-MIXSRC_MAX];
#else
return 0;
#endif
else if (i<MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(s_perout_flight_phase, i-MIXSRC_CYC3));
#if defined(PCBX9D)
else if (i<MIXSRC_SA) return (switchState(SW_SA0) ? -1024 : (switchState(SW_SA1) ? 0 : 1024));
else if (i<MIXSRC_SB) return (switchState(SW_SB0) ? -1024 : (switchState(SW_SB1) ? 0 : 1024));
else if (i<MIXSRC_SC) return (switchState(SW_SC0) ? -1024 : (switchState(SW_SC1) ? 0 : 1024));
@@ -681,47 +689,44 @@ int16_t getValue(uint8_t i)
else if (i<MIXSRC_SH) return (switchState(SW_SH0) ? -1024 : 1024);
#else
else if (i<MIXSRC_3POS) return (switchState(SW_ID0) ? -1024 : (switchState(SW_ID1) ? 0 : 1024));
// here the switches are skipped
else if (i<MIXSRC_3POS+3)
#if defined(HELI)
return cyc_anas[i-MIXSRC_3POS];
#else
return 0;
#if defined(EXTRA_3POS)
else if (i<MIXSRC_3POS2) return (switchState(SW_ID3) ? -1024 : (switchState(SW_ID4) ? 0 : 1024));
#endif
else if (i<MIXSRC_LAST_CSW) return __getSwitch(SWSRC_THR+i-MIXSRC_3POS) ? 1024 : -1024;
#endif
else if(i<CSW_PPM_BASE+NUM_CAL_PPM) return (g_ppmIns[i-CSW_PPM_BASE] - g_eeGeneral.trainer.calib[i-CSW_PPM_BASE])*2;
else if(i<CSW_PPM_BASE+NUM_PPM) return g_ppmIns[i-CSW_PPM_BASE]*2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT) return ex_chans[i-CSW_CHOUT_BASE];
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_TM2) return s_timerVal[i-CSW_CHOUT_BASE-NUM_CHNOUT];
else if (i<MIXSRC_PPM1+NUM_CAL_PPM) return (g_ppmIns[i-MIXSRC_LAST_CSW] - g_eeGeneral.trainer.calib[i-MIXSRC_LAST_CSW])*2;
else if (i<MIXSRC_LAST_PPM) return g_ppmIns[i-MIXSRC_LAST_CSW]*2;
else if (i<MIXSRC_LAST_CH) return ex_chans[i-MIXSRC_LAST_PPM];
else if (i<MIXSRC_LAST_CH+TELEM_TM2) return s_timerVal[i-MIXSRC_LAST_CH];
#if defined(FRSKY)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_TX) return frskyData.rssi[1].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_RX) return frskyData.rssi[0].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_A2) return frskyData.analog[i-CSW_CHOUT_BASE-NUM_CHNOUT-4].value;
else if (i<MIXSRC_LAST_CH+TELEM_RSSI_TX) return frskyData.rssi[1].value;
else if(i<MIXSRC_LAST_CH+TELEM_RSSI_RX) return frskyData.rssi[0].value;
else if(i<MIXSRC_LAST_CH+TELEM_A2) return frskyData.analog[i-MIXSRC_LAST_CH-TELEM_RSSI_RX].value;
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ALT) return frskyData.hub.baroAltitude_bp;
else if(i<MIXSRC_LAST_CH+TELEM_ALT) return frskyData.hub.baroAltitude_bp;
#endif
#if defined(FRSKY_HUB)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RPM) return frskyData.hub.rpm;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_FUEL) return frskyData.hub.fuelLevel;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T1) return frskyData.hub.temperature1;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T2) return frskyData.hub.temperature2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_SPEED) return frskyData.hub.gpsSpeed_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_DIST) return frskyData.hub.gpsDistance;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_GPSALT) return frskyData.hub.gpsAltitude_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELL) return (int16_t)frskyData.hub.minCellVolts * 2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VFAS) return (int16_t)frskyData.hub.vfas;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CURRENT) return (int16_t)frskyData.hub.current;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_POWER) return frskyData.power;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCx) return frskyData.hub.accelX;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCy) return frskyData.hub.accelY;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCz) return frskyData.hub.accelZ;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_HDG) return frskyData.hub.gpsCourse_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyData.hub.varioSpeed;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A1) return frskyData.analog[0].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A2) return frskyData.analog[1].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_CURRENT) return *(((int16_t*)(&frskyData.hub.minAltitude))+i-(CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_ALT-1));
else if (i<MIXSRC_LAST_CH+TELEM_RPM) return frskyData.hub.rpm;
else if (i<MIXSRC_LAST_CH+TELEM_FUEL) return frskyData.hub.fuelLevel;
else if (i<MIXSRC_LAST_CH+TELEM_T1) return frskyData.hub.temperature1;
else if (i<MIXSRC_LAST_CH+TELEM_T2) return frskyData.hub.temperature2;
else if (i<MIXSRC_LAST_CH+TELEM_SPEED) return frskyData.hub.gpsSpeed_bp;
else if (i<MIXSRC_LAST_CH+TELEM_DIST) return frskyData.hub.gpsDistance;
else if (i<MIXSRC_LAST_CH+TELEM_GPSALT) return frskyData.hub.gpsAltitude_bp;
else if (i<MIXSRC_LAST_CH+TELEM_CELL) return (int16_t)frskyData.hub.minCellVolts * 2;
else if (i<MIXSRC_LAST_CH+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum;
else if (i<MIXSRC_LAST_CH+TELEM_VFAS) return (int16_t)frskyData.hub.vfas;
else if (i<MIXSRC_LAST_CH+TELEM_CURRENT) return (int16_t)frskyData.hub.current;
else if (i<MIXSRC_LAST_CH+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if (i<MIXSRC_LAST_CH+TELEM_POWER) return frskyData.power;
else if (i<MIXSRC_LAST_CH+TELEM_ACCx) return frskyData.hub.accelX;
else if (i<MIXSRC_LAST_CH+TELEM_ACCy) return frskyData.hub.accelY;
else if (i<MIXSRC_LAST_CH+TELEM_ACCz) return frskyData.hub.accelZ;
else if (i<MIXSRC_LAST_CH+TELEM_HDG) return frskyData.hub.gpsCourse_bp;
else if (i<MIXSRC_LAST_CH+TELEM_VSPD) return frskyData.hub.varioSpeed;
else if (i<MIXSRC_LAST_CH+TELEM_MIN_A1) return frskyData.analog[0].min;
else if (i<MIXSRC_LAST_CH+TELEM_MIN_A2) return frskyData.analog[1].min;
else if (i<MIXSRC_LAST_CH+TELEM_MAX_CURRENT) return *(((int16_t*)(&frskyData.hub.minAltitude))+i-(MIXSRC_LAST_CH+TELEM_MAX_CURRENT-1));
#endif
#endif
else return 0;
@@ -759,7 +764,7 @@ bool __getSwitch(int8_t swtch)
uint8_t cs_idx = abs(swtch);
if (cs_idx == SWITCH_ON) {
if (cs_idx == SWSRC_ON) {
result = true;
}
else if (cs_idx <= MAX_PSWITCH) {
@@ -767,17 +772,21 @@ bool __getSwitch(int8_t swtch)
}
else {
cs_idx -= MAX_PSWITCH+1;
CustomSwData * cs = cswaddress(cs_idx);
if (cs->func == CS_OFF) return false;
uint8_t s = CS_STATE(cs->func);
if (s == CS_VBOOL) {
GETSWITCH_RECURSIVE_TYPE mask = ((GETSWITCH_RECURSIVE_TYPE)1 << cs_idx);
if (s_last_switch_used & mask) {
result = (s_last_switch_value & mask);
GETSWITCH_RECURSIVE_TYPE mask = ((GETSWITCH_RECURSIVE_TYPE)1 << cs_idx);
if (s_last_switch_used & mask) {
result = (s_last_switch_value & mask);
}
else {
s_last_switch_used |= mask;
CustomSwData * cs = cswaddress(cs_idx);
uint8_t s = cs->andsw;
// TODO why? if (s > 8) s += 1;
if (cs->func == CS_OFF || (s && !__getSwitch(s))) {
result = false;
}
else {
s_last_switch_used |= mask;
else if ((s=CS_STATE(cs->func)) == CS_VBOOL) {
bool res1 = __getSwitch(cs->v1);
bool res2 = __getSwitch(cs->v2);
switch (cs->func) {
@@ -793,127 +802,114 @@ bool __getSwitch(int8_t swtch)
break;
}
}
#if !defined(CPUARM)
if (result)
s_last_switch_value |= ((GETSWITCH_RECURSIVE_TYPE)1<<cs_idx);
#endif
}
else {
int16_t x = getValue(cs->v1-1);
int16_t y;
if (s == CS_VCOMP) {
y = getValue(cs->v2-1);
switch (cs->func) {
case CS_EQUAL:
result = (x==y);
break;
case CS_NEQUAL:
result = (x!=y);
break;
case CS_GREATER:
result = (x>y);
break;
case CS_LESS:
result = (x<y);
break;
case CS_EGREATER:
result = (x>=y);
break;
// case CS_ELESS:
default:
result = (x<=y);
break;
}
}
else {
#if defined(FRSKY)
// Telemetry
if (cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT) {
if (frskyStreaming <= 0 && cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS)
return swtch > 0 ? false : true;
int16_t x = getValue(cs->v1-1);
int16_t y;
if (s == CS_VCOMP) {
y = getValue(cs->v2-1);
y = convertCswTelemValue(cs);
switch (cs->func) {
case CS_EQUAL:
result = (x==y);
break;
case CS_GREATER:
result = (x>y);
break;
default:
result = (x<y);
break;
}
}
else {
#if defined(FRSKY)
// Telemetry
if (cs->v1 > MIXSRC_LAST_CH) {
if (frskyStreaming <= 0 && cs->v1 > MIXSRC_LAST_CH+MAX_TIMERS)
return swtch > 0 ? false : true;
y = convertCswTelemValue(cs);
#if defined(FRSKY_HUB)
if (s == CS_VOFS) {
uint8_t idx = cs->v1-CSW_CHOUT_BASE-NUM_CHNOUT-TELEM_ALT;
if (idx < THLD_MAX) {
// Fill the threshold array
barsThresholds[idx] = 128 + cs->v2;
if (s == CS_VOFS) {
uint8_t idx = cs->v1-MIXSRC_LAST_CH-TELEM_ALT;
if (idx < THLD_MAX) {
// Fill the threshold array
barsThresholds[idx] = 128 + cs->v2;
}
}
#endif
}
else {
y = calc100toRESX(cs->v2);
}
#else
if (cs->v1 > MIXSRC_LAST_CH) {
y = cs->v2; // it's a timer
}
else {
y = calc100toRESX(cs->v2);
}
#endif
switch (cs->func) {
case CS_VEQUAL:
result = (x==y);
break;
case CS_VPOS:
result = (x>y);
break;
case CS_VNEG:
result = (x<y);
break;
case CS_APOS:
result = (abs(x)>y);
break;
case CS_ANEG:
result = (abs(x)<y);
break;
default:
{
if (csLastValue[cs_idx] == -32668)
csLastValue[cs_idx] = x;
int16_t diff = x - csLastValue[cs_idx];
if (cs->func == CS_DIFFEGREATER)
result = (y >= 0 ? (diff >= y) : (diff <= y));
else
result = (abs(diff) >= y);
if (result)
csLastValue[cs_idx] = x;
break;
}
}
#endif
}
else {
y = calc100toRESX(cs->v2);
}
#else
if (cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT) {
y = cs->v2; // it's a timer
}
else {
y = calc100toRESX(cs->v2);
}
#endif
switch (cs->func) {
case CS_VPOS:
result = (x>y);
break;
case CS_VNEG:
result = (x<y);
break;
case CS_APOS:
result = (abs(x)>y);
break;
case CS_ANEG:
result = (abs(x)<y);
break;
default:
{
if (csLastValue[cs_idx] == -32668)
csLastValue[cs_idx] = x;
int16_t diff = x - csLastValue[cs_idx];
if (cs->func == CS_DIFFEGREATER)
result = (y >= 0 ? (diff >= y) : (diff <= y));
else
result = (abs(diff) >= y);
if (result)
csLastValue[cs_idx] = x;
break;
}
}
}
}
#if defined(CPUARM)
if (cs->delay) {
if (result) {
if (cswDelays[cs_idx] > get_tmr10ms())
result = false;
if (cs->delay) {
if (result) {
if (cswDelays[cs_idx] > get_tmr10ms())
result = false;
}
else {
cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
}
}
else {
cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
if (cs->duration) {
if (result && !cswStates[cs_idx])
cswDurations[cs_idx] = get_tmr10ms() + (cs->duration*50);
cswStates[cs_idx] = result;
if (cswDurations[cs_idx] > get_tmr10ms()) {
result = true;
if (cs->delay) cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
}
}
}
if (cs->duration) {
if (result && !cswStates[cs_idx])
cswDurations[cs_idx] = get_tmr10ms() + (cs->duration*50);
cswStates[cs_idx] = result;
if (cswDurations[cs_idx] > get_tmr10ms()) {
result = true;
if (cs->delay) cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
}
}
if (result)
s_last_switch_value |= ((GETSWITCH_RECURSIVE_TYPE)1<<cs_idx);
#endif
if (result)
s_last_switch_value |= ((GETSWITCH_RECURSIVE_TYPE)1<<cs_idx);
}
}
return swtch > 0 ? result : !result;
@@ -961,11 +957,7 @@ int8_t getMovedSwitch()
bool prev;
swstate_t mask = 0;
if (i <= 3) {
mask = (1<<(i-1));
prev = (switches_states & mask);
}
else if (i <= 6) {
prev = ((switches_states & 0x18) == ((i-4) << 3));
prev = ((switches_states & 0x03) == (i-1));
}
else {
mask = (1<<(i-2));
@@ -977,8 +969,9 @@ int8_t getMovedSwitch()
result = next ? i : -i;
if (mask)
switches_states ^= mask;
else
switches_states = (switches_states & 0xE7) | ((i-4) << 3);
else {
switches_states = (switches_states & 0x8C) | (i-1);
}
}
}
#endif
@@ -1413,9 +1406,9 @@ void checkSwitches()
uint8_t x = 2;
for (uint8_t i=1; i<8; i++) {
uint8_t attr = (states & (1 << i)) == (switches_states & (1 << i)) ? 0 : INVERS;
putsSwitches(x, 5*FH, (i>5?(i+1):(i>=4?(4+((states>>4)&0x3)):i)), attr);
if (i == 4 && attr) i++;
if (i != 4) x += 3*FW+FW/2;
putsSwitches(x, 5*FH, (i>2?(i+1):1+((states>>4)&0x3)), attr);
if (i == 1 && attr) i++;
if (i != 1) x += 3*FW+FW/2;
}
#endif
lcdRefresh();
@@ -1946,23 +1939,26 @@ tmr10ms_t lastFunctionTime[NUM_CFN] = { 0 };
PLAY_FUNCTION(playValue, uint8_t idx)
{
int16_t val = getValue(idx);
// TODO add the MIXSRC_TELEM_TM1 and so on.
switch (idx) {
case NUM_XCHNRAW+TELEM_TM1-1:
case NUM_XCHNRAW+TELEM_TM2-1:
case MIXSRC_LAST_CH+TELEM_TM1-1:
case MIXSRC_LAST_CH+TELEM_TM2-1:
PLAY_DURATION(val);
break;
#if defined(FRSKY)
case NUM_XCHNRAW+TELEM_RSSI_TX-1:
case NUM_XCHNRAW+TELEM_RSSI_RX-1:
case MIXSRC_LAST_CH+TELEM_RSSI_TX-1:
case MIXSRC_LAST_CH+TELEM_RSSI_RX-1:
PLAY_NUMBER(val, 1+UNIT_DBM, 0);
break;
case NUM_XCHNRAW+TELEM_MIN_A1-1:
case NUM_XCHNRAW+TELEM_MIN_A2-1:
case MIXSRC_LAST_CH+TELEM_MIN_A1-1:
case MIXSRC_LAST_CH+TELEM_MIN_A2-1:
idx -= TELEM_MIN_A1-TELEM_A1;
// no break
case NUM_XCHNRAW+TELEM_A1-1:
case NUM_XCHNRAW+TELEM_A2-1:
idx -= (NUM_XCHNRAW+TELEM_A1-1);
case MIXSRC_LAST_CH+TELEM_A1-1:
case MIXSRC_LAST_CH+TELEM_A2-1:
idx -= (MIXSRC_LAST_CH+TELEM_A1-1);
// A1 and A2
{
uint8_t att = 0;
@@ -1974,41 +1970,41 @@ PLAY_FUNCTION(playValue, uint8_t idx)
break;
}
case NUM_XCHNRAW+TELEM_CELL-1:
case MIXSRC_LAST_CH+TELEM_CELL-1:
PLAY_NUMBER(val/10, 1+UNIT_VOLTS, PREC1);
break;
case NUM_XCHNRAW+TELEM_VFAS-1:
case NUM_XCHNRAW+TELEM_CELLS_SUM-1:
case MIXSRC_LAST_CH+TELEM_VFAS-1:
case MIXSRC_LAST_CH+TELEM_CELLS_SUM-1:
PLAY_NUMBER(val, 1+UNIT_VOLTS, PREC1);
break;
case NUM_XCHNRAW+TELEM_CURRENT-1:
case NUM_XCHNRAW+TELEM_MAX_CURRENT-1:
case MIXSRC_LAST_CH+TELEM_CURRENT-1:
case MIXSRC_LAST_CH+TELEM_MAX_CURRENT-1:
PLAY_NUMBER(val, 1+UNIT_AMPS, PREC1);
break;
case NUM_XCHNRAW+TELEM_ACCx-1:
case NUM_XCHNRAW+TELEM_ACCy-1:
case NUM_XCHNRAW+TELEM_ACCz-1:
case MIXSRC_LAST_CH+TELEM_ACCx-1:
case MIXSRC_LAST_CH+TELEM_ACCy-1:
case MIXSRC_LAST_CH+TELEM_ACCz-1:
PLAY_NUMBER(val/10, 1+UNIT_G, PREC1);
break;
case NUM_XCHNRAW+TELEM_VSPD-1:
case MIXSRC_LAST_CH+TELEM_VSPD-1:
PLAY_NUMBER(val/10, 1+UNIT_METERS_PER_SECOND, PREC1);
break;
case NUM_XCHNRAW+TELEM_CONSUMPTION-1:
case MIXSRC_LAST_CH+TELEM_CONSUMPTION-1:
PLAY_NUMBER(val, 1+UNIT_MAH, 0);
break;
case NUM_XCHNRAW+TELEM_POWER-1:
case MIXSRC_LAST_CH+TELEM_POWER-1:
PLAY_NUMBER(val, 1+UNIT_WATTS, 0);
break;
case NUM_XCHNRAW+TELEM_ALT-1:
case NUM_XCHNRAW+TELEM_MIN_ALT-1:
case NUM_XCHNRAW+TELEM_MAX_ALT-1:
case MIXSRC_LAST_CH+TELEM_ALT-1:
case MIXSRC_LAST_CH+TELEM_MIN_ALT-1:
case MIXSRC_LAST_CH+TELEM_MAX_ALT-1:
#if defined(IMPERIAL_UNITS)
if (g_model.frsky.usrProto == USR_PROTO_WS_HOW_HIGH)
PLAY_NUMBER(val, 1+UNIT_FEET, 0);
@@ -2017,24 +2013,24 @@ PLAY_FUNCTION(playValue, uint8_t idx)
PLAY_NUMBER(val, 1+UNIT_METERS, 0);
break;
case NUM_XCHNRAW+TELEM_RPM-1:
case NUM_XCHNRAW+TELEM_MAX_RPM-1:
case MIXSRC_LAST_CH+TELEM_RPM-1:
case MIXSRC_LAST_CH+TELEM_MAX_RPM-1:
PLAY_NUMBER(val, 1+UNIT_RPMS, 0);
break;
case NUM_XCHNRAW+TELEM_HDG-1:
case MIXSRC_LAST_CH+TELEM_HDG-1:
PLAY_NUMBER(val, 1+UNIT_DEGREES, 0);
break;
default:
{
uint8_t unit = 1;
if (idx < NUM_XCHNRAW+TELEM_TM1-1)
if (idx < MIXSRC_LAST_CH+TELEM_TM1-1)
val = (val * 25) / 256;
if (idx >= NUM_XCHNRAW+TELEM_ALT-1 && idx <= NUM_XCHNRAW+TELEM_GPSALT-1)
unit = idx - (NUM_XCHNRAW+TELEM_ALT-1);
else if (idx >= NUM_XCHNRAW+TELEM_MAX_T1-1 && idx <= NUM_XCHNRAW+TELEM_MAX_DIST-1)
unit = 3 + idx - (NUM_XCHNRAW+TELEM_MAX_T1-1);
if (idx >= MIXSRC_LAST_CH+TELEM_ALT-1 && idx <= MIXSRC_LAST_CH+TELEM_GPSALT-1)
unit = idx - (MIXSRC_LAST_CH+TELEM_ALT-1);
else if (idx >= MIXSRC_LAST_CH+TELEM_MAX_T1-1 && idx <= MIXSRC_LAST_CH+TELEM_MAX_DIST-1)
unit = 3 + idx - (MIXSRC_LAST_CH+TELEM_MAX_T1-1);
unit = pgm_read_byte(bchunit_ar+unit);
#if !defined(IMPERIAL_UNITS)
@@ -2208,17 +2204,25 @@ void evalFunctions()
if (sd->func == FUNC_RESET) {
switch (CFN_PARAM(sd)) {
case 0:
case 1:
case FUNC_RESET_TIMER1:
case FUNC_RESET_TIMER2:
resetTimer(CFN_PARAM(sd));
break;
case 2:
case FUNC_RESET_ALL:
resetAll();
break;
#if defined(FRSKY)
case 3:
case FUNC_RESET_TELEMETRY:
resetTelemetry();
break;
#endif
#if ROTARY_ENCODERS > 0
case FUNC_RESET_ROTENC1:
#if ROTARY_ENCODERS > 1
case FUNC_RESET_ROTENC2:
#endif
g_rotenc[CFN_PARAM(sd)-FUNC_RESET_ROTENC1] = 0;
break;
#endif
}
}
@@ -2447,11 +2451,13 @@ void perOut(uint8_t mode, uint8_t tick10ms)
else {
if (k < NUM_STICKS)
v = md->noExpo ? rawAnas[k] : anas[k]; //Switch is on. MAX=FULL=512 or value.
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
else {
v = getValue(k);
// TODO switches: if (v < 0 && !md->swtch) sw = false;
if (k>=MIXSRC_CH1-1 && k<=MIXSRC_CHMAX-1 && md->destCh != k-MIXSRC_CH1+1) {
if (k >= MIXSRC_SA-1 && k <= MIXSRC_LAST_CSW-1) {
if (v < 0 && !md->swtch) sw = false;
}
if (k>=MIXSRC_CH1-1 && k<=MIXSRC_LAST_CH-1 && md->destCh != k-MIXSRC_CH1+1) {
if (dirtyChannels & ((bitfield_channels_t)1 << (k-MIXSRC_CH1+1)) & (passDirtyChannels|~(((bitfield_channels_t) 1 << md->destCh)-1)))
passDirtyChannels |= (bitfield_channels_t) 1 << md->destCh;
if (k-MIXSRC_CH1+1 < md->destCh || pass > 0)
@@ -2459,13 +2465,12 @@ void perOut(uint8_t mode, uint8_t tick10ms)
}
}
#else
else if (k >= MIXSRC_THR-1 && k <= MIXSRC_SWC-1) {
v = getSwitch(k-MIXSRC_THR+1+1, 0) ? +1024 : -1024;
if (v < 0 && !md->swtch) sw = false;
}
else {
v = getValue(k<=MIXSRC_3POS ? k : k-MAX_SWITCH);
if (k>=MIXSRC_CH1-1 && k<=MIXSRC_CHMAX-1 && md->destCh != k-MIXSRC_CH1+1) {
v = getValue(k);
if (k >= MIXSRC_THR-1 && k <= MIXSRC_LAST_CSW-1) {
if (v < 0 && !md->swtch) sw = false;
}
else if (k>=MIXSRC_CH1-1 && k<=MIXSRC_LAST_CH-1 && md->destCh != k-MIXSRC_CH1+1) {
if (dirtyChannels & ((bitfield_channels_t)1 << (k-MIXSRC_CH1+1)) & (passDirtyChannels|~(((bitfield_channels_t) 1 << md->destCh)-1)))
passDirtyChannels |= (bitfield_channels_t) 1 << md->destCh;
if (k-MIXSRC_CH1+1 < md->destCh || pass > 0)
+113 -174
View File
@@ -40,7 +40,7 @@
#include <stddef.h>
#include <stdlib.h>
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
#define IF_9X(x)
#else
#define IF_9X(x) x,
@@ -175,9 +175,7 @@
#define CONVERT_PTR(x) ((uint32_t)(x))
#endif
#if defined(PCBACT)
#include "act/board_act.h"
#elif defined(PCBX9D)
#if defined(PCBX9D)
#include "x9d/board_x9d.h"
#elif defined(PCBSKY9X)
#include "sky9x/board_sky9x.h"
@@ -223,18 +221,116 @@ extern void boardInit();
#define NUM_STICKS 4
#if defined(PCBX9D) || defined(PCBACT)
#define NUM_SWITCHES 8
#define IS_3POS(sw) ((sw) != 5 && (sw) != 7)
#define MAX_PSWITCH (SW_SH2-SW_SA0+1)
#define NUM_POTS 4
#define NUM_SW_SRCRAW 8
enum EnumKeys {
KEY_MENU,
KEY_EXIT,
#if defined(PCBX9D)
KEY_ENTER,
KEY_PAGE,
KEY_PLUS,
KEY_MINUS,
#else
#define NUM_SWITCHES 7
#define IS_3POS(sw) ((sw) == 3)
#define MAX_PSWITCH (SW_TRN-SW_THR+1) // 9 physical switches
#define NUM_POTS 3
#define NUM_SW_SRCRAW 1
KEY_DOWN,
KEY_UP,
KEY_RIGHT,
KEY_LEFT,
#endif
TRM_BASE,
TRM_LH_DWN = TRM_BASE,
TRM_LH_UP,
TRM_LV_DWN,
TRM_LV_UP,
TRM_RV_DWN,
TRM_RV_UP,
TRM_RH_DWN,
TRM_RH_UP,
#if ROTARY_ENCODERS > 0 || defined(ROTARY_ENCODER_NAVIGATION)
BTN_REa,
#endif
#if ROTARY_ENCODERS > 0
BTN_REb,
#endif
NUM_KEYS,
SW_BASE=NUM_KEYS,
#if defined(PCBX9D)
SW_SA0=SW_BASE,
SW_SA1,
SW_SA2,
SW_SB0,
SW_SB1,
SW_SB2,
SW_SC0,
SW_SC1,
SW_SC2,
SW_SD0,
SW_SD1,
SW_SD2,
SW_SE0,
SW_SE1,
SW_SE2,
SW_SF0,
SW_SF2,
SW_SG0,
SW_SG1,
SW_SG2,
SW_SH0,
SW_SH2,
#else
SW_ID0=SW_BASE,
SW_ID1,
SW_ID2,
#if defined(EXTRA_3POS)
SW_ID3,
SW_ID4,
SW_ID5,
#endif
SW_THR,
SW_RUD,
SW_ELE,
SW_AIL,
SW_GEA,
SW_TRN,
#endif
};
#if defined(PCBX9D)
#define NUM_SWITCHES 8
#define IS_3POS(sw) ((sw) != 5 && (sw) != 7)
#define IS_MOMENTARY(sw) (sw == SWSRC_SH0)
#define MAX_PSWITCH (SW_SH2-SW_SA0+1)
#define NUM_POTS 4
#define NUM_SW_SRCRAW 8
#define SWSRC_THR SWSRC_SF2
#define SWSRC_GEA SWSRC_SG2
#define SWSRC_ID0 SWSRC_SA0
#define SWSRC_ID1 SWSRC_SA1
#define SWSRC_ID2 SWSRC_SA2
#else
#define NUM_SWITCHES 7
#define IS_3POS(sw) ((sw) == 0)
#define IS_MOMENTARY(sw) (sw == SWSRC_TRN)
#define MAX_PSWITCH (SW_TRN-SW_ID0+1) // 9 physical switches
#define NUM_POTS 3
#define NUM_SW_SRCRAW 1
#endif
#define MAX_SWITCH (MAX_PSWITCH+NUM_CSW)
#if defined(PCBX9D)
#define KEY_RIGHT KEY_PLUS
#define KEY_LEFT KEY_MINUS
#define KEY_UP KEY_PLUS
#define KEY_DOWN KEY_MINUS
#else
#define KEY_ENTER KEY_MENU
#define KEY_PLUS KEY_RIGHT
#define KEY_MINUS KEY_LEFT
#endif
#include "myeeprom.h"
@@ -364,131 +460,7 @@ extern uint8_t stickMode;
extern uint8_t channel_order(uint8_t x);
enum EnumKeys {
KEY_MENU,
KEY_EXIT,
#if defined(PCBACT)
KEY_CLR,
KEY_PAGE,
KEY_PLUS, /* Fake, used for rotary encoder */
KEY_MINUS, /* Fake, used for rotary encoder */
#elif defined(PCBX9D)
KEY_ENTER,
KEY_PAGE,
KEY_PLUS,
KEY_MINUS,
#else
KEY_DOWN,
KEY_UP,
KEY_RIGHT,
KEY_LEFT,
#endif
TRM_LH_DWN,
TRM_LH_UP,
TRM_LV_DWN,
TRM_LV_UP,
TRM_RV_DWN,
TRM_RV_UP,
TRM_RH_DWN,
TRM_RH_UP,
#if ROTARY_ENCODERS > 0 || defined(ROTARY_ENCODER_NAVIGATION)
BTN_REa,
#endif
#if ROTARY_ENCODERS > 0
BTN_REb,
#endif
NUM_KEYS,
SW_BASE=NUM_KEYS,
//SW_NC,
//SW_ON,
#if defined(PCBX9D) || defined(PCBACT)
SW_SA0=SW_BASE,
SW_SA1,
SW_SA2,
SW_SB0,
SW_SB1,
SW_SB2,
SW_SC0,
SW_SC1,
SW_SC2,
SW_SD0,
SW_SD1,
SW_SD2,
SW_SE0,
SW_SE1,
SW_SE2,
SW_SF0,
SW_SF2,
SW_SG0,
SW_SG1,
SW_SG2,
SW_SH0,
SW_SH2,
#else
SW_THR=SW_BASE,
SW_RUD,
SW_ELE,
SW_ID0,
SW_ID1,
SW_ID2,
#if 0
SW_ID3,
SW_ID4,
SW_ID5,
#endif
SW_AIL,
SW_GEA,
SW_TRN,
#endif
SW_SW1,
SW_SW2,
SW_SW3,
SW_SW4,
SW_SW5,
SW_SW6,
SW_SW7,
SW_SW8,
SW_SW9,
SW_SWA,
SW_SWB,
SW_SWC,
};
#define DSW(x) (1+(x)-SW_BASE)
#if defined(PCBACT)
#define KEY_ENTER BTN_REa
#define KEY_RIGHT KEY_PLUS
#define KEY_LEFT KEY_MINUS
#define KEY_UP KEY_MINUS
#define KEY_DOWN KEY_PLUS
#elif defined(PCBX9D)
#define KEY_RIGHT KEY_PLUS
#define KEY_LEFT KEY_MINUS
#define KEY_UP KEY_PLUS
#define KEY_DOWN KEY_MINUS
#else
#define KEY_ENTER KEY_MENU
#define KEY_PLUS KEY_RIGHT
#define KEY_MINUS KEY_LEFT
#endif
#if defined(PCBX9D) || defined(PCBACT)
/* mapping of 9x switches */
#define SW_THR SW_SA2
#define SW_RUD SW_SB2
#define SW_ELE SW_SC2
#define SW_ID0 SW_SD0
#define SW_ID1 SW_SD1
#define SW_ID2 SW_SD2
#define SW_AIL SW_SF2
#define SW_GEA SW_SG2
#define SW_TRN SW_SH2
#endif
class Key
{
@@ -534,7 +506,7 @@ enum BaseCurves {
enum CswFunctions {
CS_OFF,
// TODO add CS_VEQUAL,
CS_VEQUAL, // v==offset
CS_VPOS, // v>offset
CS_VNEG, // v<offset
CS_APOS, // |v|>offset
@@ -543,11 +515,8 @@ enum CswFunctions {
CS_OR,
CS_XOR,
CS_EQUAL,
CS_NEQUAL, // TODO remove
CS_GREATER,
CS_LESS,
CS_EGREATER, // TODO remove
CS_ELESS, // TODO remove
CS_DIFFEGREATER,
CS_ADIFFEGREATER,
// TODO add CS_TIMER,
@@ -560,19 +529,9 @@ enum CswFunctions {
#define CS_VDIFF 3
#define CS_STATE(x) ((x)<CS_AND ? CS_VOFS : ((x)<CS_EQUAL ? CS_VBOOL : ((x)<CS_DIFFEGREATER ? CS_VCOMP : CS_VDIFF)))
#define MAX_SWITCH (MAX_PSWITCH+NUM_CSW)
#define SWITCH_ON (1+MAX_SWITCH)
#define SWITCH_OFF (-SWITCH_ON)
#define NUM_CYC 3
#if defined(PCBX9D) || defined(PCBACT)
#define CSW_PPM_BASE 24 // TODO garbage to compile ...
#else
#define CSW_PPM_BASE (MIXSRC_3POS+NUM_CYC) // because srcRaw is shifted +1!
#endif
#define NUM_CAL_PPM 4
#define NUM_PPM 8
#define CSW_CHOUT_BASE (CSW_PPM_BASE+NUM_PPM)
#if defined(FRSKY_HUB)
#define NUM_TELEMETRY TELEM_CSW_MAX
@@ -581,29 +540,11 @@ enum CswFunctions {
#elif defined(FRSKY)
#define NUM_TELEMETRY TELEM_A2
#elif defined(MAVLINK)
// Number sw position
#define NUM_TELEMETRY 4
#define ROTARY_SW_CHANNEL "UP DOWN"
// Channel number for rotary switch
//#define MIX_SW_ROLL_CHAN (CSW_CHOUT_BASE+NUM_CHNOUT+NUM_VIRTUAL) // GVA:Rotary switch
#define MIX_INC_ROTARY_SW (CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+1)
#define MIX_DEC_ROTARY_SW (CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+1)
#else
#define NUM_TELEMETRY TELEM_TM2
#endif
#define NUM_XCHNRAW (NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+1/*MAX*/+NUM_SW_SRCRAW+NUM_CYC+NUM_PPM+NUM_CHNOUT)
#if defined(PCBX9D) || defined(PCBACT)
#define NUM_XCHNMIX (NUM_XCHNRAW+NUM_CSW)
#define NUM_XCHNCSW (NUM_XCHNRAW+NUM_CSW+NUM_TELEMETRY)
#define NUM_XCHNPLAY (NUM_XCHNRAW+NUM_CSW+TELEM_DISPLAY_MAX)
#else
#define NUM_XCHNMIX (NUM_XCHNRAW+MAX_SWITCH)
#define NUM_XCHNCSW (NUM_XCHNRAW+NUM_TELEMETRY)
#define NUM_XCHNPLAY (NUM_XCHNRAW+TELEM_DISPLAY_MAX)
#endif
#define THRCHK_DEADBAND 16
#if defined(FSPLASH) || defined(XSPLASH)
@@ -612,8 +553,6 @@ enum CswFunctions {
#define SPLASH_TIMEOUT (4*100) // 4 seconds
#endif
#define TRM_BASE TRM_LH_DWN
#define EVT_KEY_MASK(e) ((e) & 0x0f)
#define _MSK_KEY_BREAK 0x20
@@ -858,7 +797,7 @@ extern uint8_t s_traceWr;
extern int8_t s_traceCnt;
#endif
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
static inline uint16_t getTmr2MHz() { return 0; }
#elif defined(PCBSKY9X)
static inline uint16_t getTmr2MHz() { return TC1->TC_CHANNEL[0].TC_CV; }
+7 -1
View File
@@ -15,7 +15,12 @@
#ifndef rotarysw_h
#define rotarysw_h
#include "myeeprom.h"
#define ROTARY_SW_CHANNEL "UP DOWN"
// Channel number for rotary switch
//#define MIX_SW_ROLL_CHAN (MIXSRC_LAST_CH+NUM_VIRTUAL) // GVA:Rotary switch
#define MIX_INC_ROTARY_SW (MIXSRC_LAST_CH+MAX_TIMERS+1)
#define MIX_DEC_ROTARY_SW (MIXSRC_LAST_CH+MAX_TIMERS+1)
extern int8_t rotarySwIdx;
extern int8_t rotarySwLastPPMVal;
@@ -79,6 +84,7 @@ inline void init_rotary_sw() {
#endif
}
}
inline int8_t find_rotary_sw_pos(uint8_t srcRaw, uint8_t swTog, uint8_t swOn) {
if ((swOn && swTog) || rotarySwIdx == -1) { // toggle switch on
int8_t idx = rotarySwIdx;
+1 -1
View File
@@ -185,7 +185,7 @@ bool switchState(EnumKeys enuk)
result = !(PINE & (1<<INP_E_ID2));
break;
#if 0
#if defined(EXTRA_3POS)
case SW_ID3:
result = (calibratedStick[POT1+EXTRA_3POS-1] < 0);
break;
+14 -16
View File
@@ -148,10 +148,10 @@ void applyTemplate(uint8_t idx)
// Sticky-T-Cut
case TMPL_STI_THR_CUT:
md=setDest(ICC(STK_THR), MIXSRC_MAX); md->weight=-100; md->swtch=DSW(SW_SWC); md->mltpx=MLTPX_REP;
md=setDest(ICC(STK_THR), MIXSRC_MAX); md->weight=-100; md->swtch=SWSRC_SWC; md->mltpx=MLTPX_REP;
md=setDest(13, MIXSRC_CH11+3); md->weight= 100;
md=setDest(13, MIXSRC_MAX); md->weight=-100; md->swtch=DSW(SW_SWB); md->mltpx=MLTPX_REP;
md=setDest(13, MIXSRC_MAX); md->weight= 100; md->swtch=DSW(SW_THR); md->mltpx=MLTPX_REP;
md=setDest(13, MIXSRC_MAX); md->weight=-100; md->swtch=SWSRC_SWB; md->mltpx=MLTPX_REP;
md=setDest(13, MIXSRC_MAX); md->weight= 100; md->swtch=SWSRC_THR; md->mltpx=MLTPX_REP;
setSwitch(11, CS_VNEG, STK_THR, -99);
setSwitch(12, CS_VPOS, 38, 0);
break;
@@ -198,25 +198,23 @@ void applyTemplate(uint8_t idx)
md=setDest(3, MIXSRC_Rud); md->weight=100;
// throttle
md=setDest(4, MIXSRC_Thr); md->swtch=DSW(SW_ID0); md->curveMode=MODE_CURVE; md->curveParam=CV(1); md->carryTrim=TRIM_OFF;
md=setDest(4, MIXSRC_Thr); md->swtch=DSW(SW_ID1); md->curveMode=MODE_CURVE; md->curveParam=CV(2); md->carryTrim=TRIM_OFF;
md=setDest(4, MIXSRC_Thr); md->swtch=DSW(SW_ID2); md->curveMode=MODE_CURVE; md->curveParam=CV(3); md->carryTrim=TRIM_OFF;
md=setDest(4, MIXSRC_MAX); md->weight=-100; md->swtch=DSW(SW_THR); md->mltpx=MLTPX_REP;
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID0; md->curveMode=MODE_CURVE; md->curveParam=CV(1); md->carryTrim=TRIM_OFF;
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID1; md->curveMode=MODE_CURVE; md->curveParam=CV(2); md->carryTrim=TRIM_OFF;
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID2; md->curveMode=MODE_CURVE; md->curveParam=CV(3); md->carryTrim=TRIM_OFF;
md=setDest(4, MIXSRC_MAX); md->weight=-100; md->swtch=SWSRC_THR; md->mltpx=MLTPX_REP;
// gyro gain
md=setDest(5, MIXSRC_MAX); md->weight= 30; md->swtch=-DSW(SW_GEA);
md=setDest(5, MIXSRC_MAX); md->weight=-30; md->swtch= DSW(SW_GEA);
md=setDest(5, MIXSRC_MAX); md->weight= 30; md->swtch=-SWSRC_GEA;
md=setDest(5, MIXSRC_MAX); md->weight=-30; md->swtch= SWSRC_GEA;
// collective
md=setDest(11, MIXSRC_Thr); md->weight= 100; md->swtch=DSW(SW_ID0); md->curveMode=MODE_CURVE; md->curveParam=CV(4); md->carryTrim=TRIM_OFF;
md=setDest(11, MIXSRC_Thr); md->weight= 100; md->swtch=DSW(SW_ID1); md->curveMode=MODE_CURVE; md->curveParam=CV(5); md->carryTrim=TRIM_OFF;
md=setDest(11, MIXSRC_Thr); md->weight= 100; md->swtch=DSW(SW_ID2); md->curveMode=MODE_CURVE; md->curveParam=CV(6); md->carryTrim=TRIM_OFF;
md=setDest(11, MIXSRC_Thr); md->weight= 100; md->swtch=SWSRC_ID0; md->curveMode=MODE_CURVE; md->curveParam=CV(4); md->carryTrim=TRIM_OFF;
md=setDest(11, MIXSRC_Thr); md->weight= 100; md->swtch=SWSRC_ID1; md->curveMode=MODE_CURVE; md->curveParam=CV(5); md->carryTrim=TRIM_OFF;
md=setDest(11, MIXSRC_Thr); md->weight= 100; md->swtch=SWSRC_ID2; md->curveMode=MODE_CURVE; md->curveParam=CV(6); md->carryTrim=TRIM_OFF;
g_model.swashR.collectiveSource = MIXSRC_CH11 - MAX_SWITCH;
//g_model.swashRingData.type = HELI_SWASH_TYPE_120;
g_model.swashR.type = SWASH_TYPE_120;
//g_model.swashRingData.collectiveSource = RawSource(SOURCE_TYPE_CH, 10);
//Set up Curves
setCurve(CURVE5(1), heli_ar1);
setCurve(CURVE5(2), heli_ar2);
@@ -229,7 +227,7 @@ void applyTemplate(uint8_t idx)
// Servo Test
case TMPL_SERVO_TEST:
md=setDest(15, MIXSRC_SW1, true); md->weight=110; md->mltpx=MLTPX_ADD; md->delayUp = 6; md->delayDown = 6; md->speedUp = 8; md->speedDown = 8;
setSwitch(1, CS_VNEG, CSW_CHOUT_BASE+16, 0);
setSwitch(1, CS_VNEG, MIXSRC_LAST_CH, 0);
break;
default:
+7 -2
View File
@@ -312,11 +312,16 @@ const pm_char STR_CURRENT[] PROGMEM = TR_CURRENT;
const pm_char STR_CURRENT_CALIB[] PROGMEM = TR_CURRENT_CALIB;
#endif
#if defined(SDCARD)
#if defined(NAVIGATION_MENUS)
const pm_char STR_SELECT_MODEL[] PROGMEM = TR_SELECT_MODEL;
const pm_char STR_CREATE_MODEL[] PROGMEM = TR_CREATE_MODEL;
const pm_char STR_BACKUP_MODEL[] PROGMEM = TR_BACKUP_MODEL;
const pm_char STR_COPY_MODEL[] PROGMEM = TR_COPY_MODEL;
const pm_char STR_MOVE_MODEL[] PROGMEM = TR_MOVE_MODEL;
const pm_char STR_DELETE_MODEL[] PROGMEM = TR_DELETE_MODEL;
#endif
#if defined(SDCARD)
const pm_char STR_BACKUP_MODEL[] PROGMEM = TR_BACKUP_MODEL;
const pm_char STR_RESTORE_MODEL[] PROGMEM = TR_RESTORE_MODEL;
const pm_char STR_SDCARD_ERROR[] PROGMEM = TR_SDCARD_ERROR;
const pm_char STR_NO_SDCARD[] PROGMEM = TR_NO_SDCARD;
+21 -16
View File
@@ -400,26 +400,31 @@ extern const pm_char STR_CURRENT[];
#endif
#if defined(CPUARM)
extern const pm_char STR_CURRENT_CALIB[];
#define LEN_CALIB_FIELDS (PSIZE(TR_BATT_CALIB) > PSIZE(TR_CURRENT_CALIB) ? PSIZE(TR_BATT_CALIB) : PSIZE(TR_CURRENT_CALIB))
extern const pm_char STR_CURRENT_CALIB[];
#define LEN_CALIB_FIELDS (PSIZE(TR_BATT_CALIB) > PSIZE(TR_CURRENT_CALIB) ? PSIZE(TR_BATT_CALIB) : PSIZE(TR_CURRENT_CALIB))
#else
#define LEN_CALIB_FIELDS PSIZE(TR_BATT_CALIB)
#define LEN_CALIB_FIELDS PSIZE(TR_BATT_CALIB)
#endif
#if defined(NAVIGATION_MENUS)
extern const pm_char STR_SELECT_MODEL[];
extern const pm_char STR_CREATE_MODEL[];
extern const pm_char STR_COPY_MODEL[];
extern const pm_char STR_MOVE_MODEL[];
extern const pm_char STR_DELETE_MODEL[];
#endif
#if defined(SDCARD)
extern const pm_char STR_SELECT_MODEL[];
extern const pm_char STR_CREATE_MODEL[];
extern const pm_char STR_BACKUP_MODEL[];
extern const pm_char STR_DELETE_MODEL[];
extern const pm_char STR_RESTORE_MODEL[];
extern const pm_char STR_SDCARD_ERROR[];
extern const pm_char STR_NO_SDCARD[];
extern const pm_char STR_INCOMPATIBLE[];
extern const pm_char STR_LOGS_PATH[];
extern const pm_char STR_LOGS_EXT[];
extern const pm_char STR_MODELS_PATH[];
extern const pm_char STR_MODELS_EXT[];
#define STR_UPDATE_LIST STR_DELAYDOWN
extern const pm_char STR_BACKUP_MODEL[];
extern const pm_char STR_RESTORE_MODEL[];
extern const pm_char STR_SDCARD_ERROR[];
extern const pm_char STR_NO_SDCARD[];
extern const pm_char STR_INCOMPATIBLE[];
extern const pm_char STR_LOGS_PATH[];
extern const pm_char STR_LOGS_EXT[];
extern const pm_char STR_MODELS_PATH[];
extern const pm_char STR_MODELS_EXT[];
#define STR_UPDATE_LIST STR_DELAYDOWN
#endif
extern const pm_uchar font_5x7[];
+160 -152
View File
@@ -1,74 +1,74 @@
// NON ZERO TERMINATED STRINGS
#define LEN_OFFON "\003"
#define TR_OFFON "OFF""ON\0"
#define LEN_OFFON "\003"
#define TR_OFFON "OFF""ON\0"
#define LEN_MMMINV "\003"
#define TR_MMMINV "---""INV"
#define LEN_MMMINV "\003"
#define TR_MMMINV "---""INV"
#define LEN_NCHANNELS "\004"
#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH"
#define LEN_NCHANNELS "\004"
#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH"
#define LEN_VBEEPMODE "\005"
#define TR_VBEEPMODE "Quiet""Alarm""NoKey""All "
#define LEN_VBEEPMODE "\005"
#define TR_VBEEPMODE "Quiet""Alarm""NoKey""All "
#define LEN_VBEEPLEN "\005"
#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0"
#define LEN_VBEEPLEN "\005"
#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0"
#define LEN_VRENAVIG "\003"
#define TR_VRENAVIG "No REaREb"
#define LEN_VRENAVIG "\003"
#define TR_VRENAVIG "No REaREb"
#define LEN_VBLMODE "\004"
#define TR_VBLMODE "OFF ""Keys""Stks""Both""ON\0"
#define LEN_VBLMODE "\004"
#define TR_VBLMODE "OFF ""Keys""Stks""Both""ON\0"
#define LEN_TRNMODE "\003"
#define TR_TRNMODE "OFF"" +="" :="
#define LEN_TRNMODE "\003"
#define TR_TRNMODE "OFF"" +="" :="
#define LEN_TRNCHN "\003"
#define TR_TRNCHN "CH1CH2CH3CH4"
#define LEN_TRNCHN "\003"
#define TR_TRNCHN "CH1CH2CH3CH4"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATE:""TIME:"
#define LEN_DATETIME "\005"
#define TR_DATETIME "DATE:""TIME:"
#define LEN_VLCD "\006"
#define TR_VLCD "NormalOptrex"
#define LEN_VLCD "\006"
#define TR_VLCD "NormalOptrex"
#define LEN_VTRIMINC TR("\006","\013")
#define TR_VTRIMINC TR("Expo ""ExFine""Fine ""Medium""Coarse","Exponential""Extra Fine ""Fine ""Medium ""Coarse ")
#define LEN_VTRIMINC TR("\006","\013")
#define TR_VTRIMINC TR("Expo ""ExFine""Fine ""Medium""Coarse","Exponential""Extra Fine ""Fine ""Medium ""Coarse ")
#define LEN_RETA123 "\001"
#define LEN_RETA123 "\001"
#if defined(PCBGRUVIN9X)
#if ROTARY_ENCODERS > 2
#define TR_RETA123 "RETA123abcd"
#define TR_RETA123 "RETA123abcd"
#else
#define TR_RETA123 "RETA123ab"
#define TR_RETA123 "RETA123ab"
#endif
#elif defined(PCBX9D)
#define TR_RETA123 "RETA12LR"
#define TR_RETA123 "RETA12LR"
#else
#define TR_RETA123 "RETA123"
#define TR_RETA123 "RETA123"
#endif
#define LEN_VPROTOS "\006"
#define LEN_VPROTOS "\006"
#if defined(PXX)
#define TR_PXX "PXX\0 "
#define TR_PXX "PXX\0 "
#elif defined(DSM2) || defined(IRPROTOS)
#define TR_PXX "[PXX]\0"
#define TR_PXX "[PXX]\0"
#else
#define TR_PXX
#endif
#if defined(DSM2)
#define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 "
#define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 "
#elif defined(IRPROTOS)
#define TR_DSM2 "[LP45]""[DSM2]""[DSMX]"
#define TR_DSM2 "[LP45]""[DSM2]""[DSMX]"
#else
#define TR_DSM2
#endif
#if defined(IRPROTOS)
#define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0"
#define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0"
#else
#define TR_IRPROTOS
#endif
@@ -76,187 +76,193 @@
#if defined(CPUARM)
#define TR_XPPM
#else
#define TR_XPPM "PPM16\0""PPMsim"
#define TR_XPPM "PPM16\0""PPMsim"
#endif
#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS
#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS
#define LEN_POSNEG "\003"
#define TR_POSNEG "POS""NEG"
#define LEN_POSNEG "\003"
#define TR_POSNEG "POS""NEG"
#define LEN_VCURVEFUNC "\003"
#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|"
#define LEN_VCURVEFUNC "\003"
#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|"
#define LEN_VMLTPX "\010"
#define TR_VMLTPX "Add ""Multiply""Replace "
#define LEN_VMLTPX "\010"
#define TR_VMLTPX "Add ""Multiply""Replace "
#define LEN_VMLTPX2 "\002"
#define TR_VMLTPX2 "+=""*="":="
#define LEN_VMLTPX2 "\002"
#define TR_VMLTPX2 "+=""*="":="
#define LEN_VMIXTRIMS "\003"
#define TR_VMIXTRIMS "OFF""ON\0""Rud""Ele""Thr""Ail"
#define LEN_VMIXTRIMS "\003"
#define TR_VMIXTRIMS "OFF""ON\0""Rud""Ele""Thr""Ail"
#define LEN_VCSWFUNC "\006"
#define TR_VCSWFUNC "---\0 ""v1>x\0 ""v1<x\0 ""|v1|>x""|v1|<x""AND\0 ""OR\0 ""XOR\0 ""v1==v2""v1!=v2""v1>v2\0""v1<v2\0""v1>=v2""v1<=v2""d>=x\0 ""|d|>=x"
#define LEN_VCSWFUNC "\006"
#define TR_VCSWFUNC "---\0 ""v1==x\0""v1>x\0 ""v1<x\0 ""|v1|>x""|v1|<x""AND\0 ""OR\0 ""XOR\0 ""v1==v2""v1>v2\0""v1<v2\0""d>=x\0 ""|d|>=x"
#define LEN_VFSWFUNC "\013"
#define LEN_VFSWFUNC "\012"
#if defined(VARIO)
#define TR_VVARIO "Vario\0 "
#define TR_VVARIO "Vario\0 "
#else
#define TR_VVARIO "[Vario]\0 "
#define TR_VVARIO "[Vario]\0 "
#endif
#if defined(AUDIO)
#define TR_SOUND "Play Sound\0"
#define TR_SOUND "Play Sound"
#else
#define TR_SOUND "Beep\0 "
#define TR_SOUND "Beep\0 "
#endif
#if defined(HAPTIC)
#define TR_HAPTIC "Haptic\0 "
#define TR_HAPTIC "Haptic\0 "
#else
#define TR_HAPTIC "[Haptic]\0 "
#define TR_HAPTIC "[Haptic]\0 "
#endif
#if defined(VOICE)
#if defined(PCBSKY9X)
#define TR_PLAY_TRACK "Play\0 "
#define TR_PLAY_TRACK "Play\0 "
#else
#define TR_PLAY_TRACK "Play Track\0"
#define TR_PLAY_TRACK "Play Track"
#endif
#define TR_PLAY_BOTH "Play Bth\0 "
#define TR_PLAY_VALUE "Play Val\0 "
#define TR_PLAY_BOTH "Play Both\0"
#define TR_PLAY_VALUE "Play Val\0 "
#else
#define TR_PLAY_TRACK "[PlayTrack]"
#define TR_PLAY_BOTH "[Play Both]"
#define TR_PLAY_VALUE "[PlayValue]"
#define TR_PLAY_TRACK "[Play Trk]"
#define TR_PLAY_BOTH "[Play Bth]"
#define TR_PLAY_VALUE "[Play Val]"
#endif
#define TR_CFN_VOLUME "Volume\0 "
#define TR_CFN_BG_MUSIC "BgMusic\0 ""BgMusic ||\0"
#define TR_CFN_VOLUME "Volume\0 "
#define TR_CFN_BG_MUSIC "BgMusic\0 ""BgMusic ||"
#if defined(SDCARD)
#define TR_SDCLOGS "SD Logs\0 "
#define TR_SDCLOGS "SD Logs\0 "
#else
#define TR_SDCLOGS "[SD Logs]\0 "
#define TR_SDCLOGS "[SD Logs]\0"
#endif
#ifdef GVARS
#define TR_CFN_ADJUST_GVAR "Adjust \0 "
#define TR_CFN_ADJUST_GVAR "Adjust \0 "
#else
#define TR_CFN_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_CFN_TEST "Test\0"
#define TR_CFN_TEST "Test\0"
#else
#define TR_CFN_TEST
#endif
#if defined(CPUARM)
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Backlight\0 " TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_CFN_VOLUME "Backlight\0" TR_CFN_BG_MUSIC TR_CFN_ADJUST_GVAR TR_CFN_TEST
#elif defined(PCBGRUVIN9X)
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_SDCLOGS "Backlight\0 " TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE TR_SDCLOGS "Backlight\0" TR_CFN_ADJUST_GVAR TR_CFN_TEST
#else
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Inst. Trim\0" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE "Backlight\0 " TR_CFN_ADJUST_GVAR TR_CFN_TEST
#define TR_VFSWFUNC "Safety\0 ""Trainer\0 ""Inst. Trim" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_BOTH TR_PLAY_VALUE "Backlight\0" TR_CFN_ADJUST_GVAR TR_CFN_TEST
#endif
#define LEN_VFSWRESET TR("\006","\012")
#define TR_VFSWRESET "Timer 1 ""Timer 2 ""All ""Telemetry"
#define LEN_VFSWRESET TR("\005", "\011")
#define LEN_FUNCSOUNDS "\006"
#define TR_FUNCSOUNDS "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#if defined(FRSKY)
#define TR_FSW_RESET_TELEM TR("Telem", "Telemetry")
#else
#define TR_FSW_RESET_TELEM
#endif
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""Tx\0 ""Rx\0 ""A1\0 ""A2\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
#if ROTARY_ENCODERS > 0
#define TR_FSW_RESET_ROTENC TR("R.Enc", "RotEnc ")
#else
#define TR_FSW_RESET_ROTENC
#endif
#define TR_VFSWRESET TR("Tmr1\0""Tmr2\0""All\0 " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC, "Timer 1 ""Timer 2 ""All " TR_FSW_RESET_TELEM TR_FSW_RESET_ROTENC)
#define LEN_FUNCSOUNDS "\006"
#define TR_FUNCSOUNDS "Beep1 ""Beep2 ""Beep3 ""Warn1 ""Warn2 ""Cheep ""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""Siren ""AlmClk""Ratata""Tick "
#define LEN_VTELEMCHNS "\004"
#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""Tx\0 ""Rx\0 ""A1\0 ""A2\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+""Cur+""Acc\0""Time"
#ifdef IMPERIAL_UNITS
#define LENGTH_UNIT "ft\0"
#define SPEED_UNIT "kts"
#define LENGTH_UNIT "ft\0"
#define SPEED_UNIT "kts"
#else
#define LENGTH_UNIT "m\0 "
#define SPEED_UNIT "kmh"
#define LENGTH_UNIT "m\0 "
#define SPEED_UNIT "kmh"
#endif
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh""W\0 "
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
#define LEN_VTELEMUNIT "\003"
#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh""W\0 "
#define STR_V (STR_VTELEMUNIT+1)
#define STR_A (STR_VTELEMUNIT+4)
#define LEN_VALARM "\003"
#define TR_VALARM "---""Yel""Org""Red"
#define LEN_VALARM "\003"
#define TR_VALARM "---""Yel""Org""Red"
#define LEN_VALARMFN "\001"
#define TR_VALARMFN "<>"
#define LEN_VALARMFN "\001"
#define TR_VALARMFN "<>"
#define LEN_VTELPROTO "\007"
#define TR_VTELPROTO "None\0 ""Hub\0 ""WSHHigh"
#define LEN_VTELPROTO "\007"
#define TR_VTELPROTO "None\0 ""Hub\0 ""WSHHigh"
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VOLTSRC "\003"
#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VARIOSRC "\005"
#define TR_VARIOSRC "Alti\0""Alti+""Vario""A1\0 ""A2\0"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
#define LEN_VSCREEN "\004"
#define TR_VSCREEN "Nums""Bars"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN_GPSFORMAT "\004"
#define TR_GPSFORMAT "HMS NMEA"
#define LEN2_VTEMPLATES 13
#define LEN_VTEMPLATES "\015"
#define TR_VTEMPLATES "Clear Mixes\0\0""Simple 4-CH \0""Sticky-T-Cut\0""V-Tail \0""Elevon\\Delta\0""eCCPM \0""Heli Setup \0""Servo Test \0"
#define LEN2_VTEMPLATES 13
#define LEN_VTEMPLATES "\015"
#define TR_VTEMPLATES "Clear Mixes\0\0""Simple 4-CH \0""Sticky-T-Cut\0""V-Tail \0""Elevon\\Delta\0""eCCPM \0""Heli Setup \0""Servo Test \0"
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS " Menu"" Exit"" Down"" Up""Right"" Left"
#define LEN_VKEYS "\005"
#define TR_VKEYS " Menu"" Exit"" Down"" Up""Right"" Left"
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
#define LEN_VSWITCHES "\003"
#define LEN_VSWITCHES "\003"
#define LEN_VSRCRAW "\004"
#if 0
#define TR_EXTRA_3POS_SWITCHES "ID3""ID4""ID5"
#if defined(PCBX9D)
#define TR_POTS_VSRCRAW "S1\0 ""S2\0 ""LS\0 ""RS\0 "
#define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SD\0 ""SE\0 ""SF\0 ""SG\0 ""SH\0 "
#elif defined(EXTRA_3POS)
#define TR_POTS_VSRCRAW "P1\0 ""P2\0 "
#define TR_SW_VSRCRAW "3P1\0""3P2\0"
#define TR_9X_3POS_SWITCHES "ID0""ID1""ID2""ID3""ID4""ID5"
#else
#define TR_EXTRA_3POS_SWITCHES
#define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 "
#define TR_SW_VSRCRAW "3POS"
#define TR_9X_3POS_SWITCHES "ID0""ID1""ID2"
#endif
#if defined(CPUARM)
#define TR_CUSTOMSW "CS1""CS2""CS3""CS4""CS5""CS6""CS7""CS8""CS9""CSA""CSB""CSC""CSD""CSE""CSF""CSG""CSH""CSI""CSJ""CSK""CSL""CSM""CSN""CSO""CSP""CSQ""CSR""CSS""CST""CSU""CSV""CSW"
#else
#define TR_CUSTOMSW "CS1""CS2""CS3""CS4""CS5""CS6""CS7""CS8""CS9""CSA""CSB""CSC"
#endif
#if defined(PCBX9D)
#define TR_VSWITCHES "SA\300""SA-""SA\301""SB\300""SB-""SB\301""SC\300""SC-""SC\301""SD\300""SD-""SD\301""SE\300""SE-""SE\301""SF\300""SF\301""SG\300""SG-""SG\301""SH\300""SH\301""CS1""CS2""CS3""CS4""CS5""CS6""CS7""CS8""CS9""CSA""CSB""CSC""CSD""CSE""CSF""CSG""CSH""CSI""CSJ""CSK""CSL""CSM""CSN""CSO""CSP""CSQ""CSR""CSS""CST""CSU""CSV""CSW"" ON"
#elif defined(PCBSKY9X)
#define TR_VSWITCHES "THR""RUD""ELE""ID0""ID1""ID2" TR_EXTRA_3POS_SWITCHES "AIL""GEA""TRN""CS1""CS2""CS3""CS4""CS5""CS6""CS7""CS8""CS9""CSA""CSB""CSC""CSD""CSE""CSF""CSG""CSH""CSI""CSJ""CSK""CSL""CSM""CSN""CSO""CSP""CSQ""CSR""CSS""CST""CSU""CSV""CSW"" ON"
#define TR_VSWITCHES "SA\300""SA-""SA\301""SB\300""SB-""SB\301""SC\300""SC-""SC\301""SD\300""SD-""SD\301""SE\300""SE-""SE\301""SF\300""SF\301""SG\300""SG-""SG\301""SH\300""SH\301" TR_CUSTOMSW " ON"
#else
#define TR_VSWITCHES "THR""RUD""ELE""ID0""ID1""ID2" TR_EXTRA_3POS_SWITCHES "AIL""GEA""TRN""CS1""CS2""CS3""CS4""CS5""CS6""CS7""CS8""CS9""CSA""CSB""CSC"" ON"
#endif
#define LEN_VSRCRAW "\004"
#if defined(PCBX9D)
#define TR_POTS_VSRCRAW "S1\0 ""S2\0 ""LS\0 ""RS\0 "
#define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SD\0 ""SE\0 ""SF\0 ""SG\0 ""SH\0 "
#elif EXTRA_3POS == 1
#define TR_POTS_VSRCRAW "3PO2""P2\0 ""P3\0 "
#define TR_SW_VSRCRAW "3PO1"
#elif EXTRA_3POS == 2
#define TR_POTS_VSRCRAW "P1\0 ""3PO2""P3\0 "
#define TR_SW_VSRCRAW "3PO1"
#elif EXTRA_3POS == 3
#define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""3PO2"
#define TR_SW_VSRCRAW "3PO1"
#else
#define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 "
#define TR_SW_VSRCRAW "3POS"
#define TR_VSWITCHES TR_9X_3POS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" TR_CUSTOMSW " ON"
#endif
#if defined(PCBX9D)
#define TR_ROTARY_ENCODERS_VSRCRAW
#elif defined(PCBSKY9X)
#define TR_ROTARY_ENCODERS_VSRCRAW "REa "
#define TR_ROTARY_ENCODERS_VSRCRAW "REnc"
#elif defined(PCBGRUVIN9X) && ROTARY_ENCODERS > 2
#define TR_ROTARY_ENCODERS_VSRCRAW "REa ""REb ""REc ""REd "
#elif defined(PCBGRUVIN9X) && ROTARY_ENCODERS <= 2
@@ -266,15 +272,15 @@
#endif
#if defined(HELI)
#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3"
#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3"
#else
#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]"
#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]"
#endif
#define TR_VSRCRAW "Rud\0""Ele\0""Thr\0""Ail\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODERS_VSRCRAW "TrmR" "TrmE" "TrmT" "TrmA" "MAX " TR_SW_VSRCRAW TR_CYC_VSRCRAW
#define TR_VSRCRAW "---\0""Rud\0""Ele\0""Thr\0""Ail\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODERS_VSRCRAW "MAX\0" TR_CYC_VSRCRAW "TrmR" "TrmE" "TrmT" "TrmA" TR_SW_VSRCRAW
#define LEN_VTMRMODES "\003"
#define TR_VTMRMODES "OFF""ABS""THs""TH%""THt"
#define LEN_VTMRMODES "\003"
#define TR_VTMRMODES "OFF""ABS""THs""TH%""THt"
// ZERO TERMINATED STRINGS
#define INDENT "\001"
@@ -288,9 +294,9 @@
#endif
#define OFS_EXIT 7
#if defined(PCBX9D)
#define TR_MENUWHENDONE CENTER"\006[ENTER] WHEN DONE"
#define TR_MENUWHENDONE CENTER"\006[ENTER] WHEN DONE"
#else
#define TR_MENUWHENDONE CENTER"\006[MENU] WHEN DONE"
#define TR_MENUWHENDONE CENTER"\006[MENU] WHEN DONE"
#endif
#define TR_FREE "free"
#define TR_DELETEMODEL "DELETE MODEL"
@@ -391,9 +397,9 @@
#define TR_BG "BG:"
#if defined(PCBX9D)
#define TR_MENUTOSTART CENTER"\006[ENTER] TO START"
#define TR_MENUTOSTART CENTER"\006[ENTER] TO START"
#else
#define TR_MENUTOSTART CENTER"\006[MENU] TO START"
#define TR_MENUTOSTART CENTER"\006[MENU] TO START"
#endif
#define TR_SETMIDPOINT CENTER"\003SET STICKS MIDPOINT"
@@ -412,9 +418,9 @@
#define TR_TMR1JITTERUS "Tmr1 Jitter\006us"
#if defined(CPUARM)
#define TR_TMIXMAXMS "Tmix max\012ms"
#define TR_TMIXMAXMS "Tmix max\012ms"
#else
#define TR_TMIXMAXMS "Tmix max\014ms"
#define TR_TMIXMAXMS "Tmix max\014ms"
#endif
#define TR_T10MSUS "T10ms\016us"
@@ -449,11 +455,11 @@
#define TR_MENUHELISETUP "HELI SETUP"
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
#define TR_MENUDREXPO "STICKS"
#define TR_MENULIMITS "OUTPUTS"
#define TR_MENUDREXPO "STICKS"
#define TR_MENULIMITS "OUTPUTS"
#else
#define TR_MENUDREXPO "DR/EXPO"
#define TR_MENULIMITS "LIMITS"
#define TR_MENUDREXPO "DR/EXPO"
#define TR_MENULIMITS "LIMITS"
#endif
#define TR_MENUCURVES "CURVES"
@@ -480,6 +486,8 @@
#define TR_CURRENT INDENT"Current"
#define TR_SELECT_MODEL "Select Model"
#define TR_CREATE_MODEL "Create Model"
#define TR_COPY_MODEL "Copy Model"
#define TR_MOVE_MODEL "Move Model"
#define TR_BACKUP_MODEL "Backup Model"
#define TR_DELETE_MODEL "Delete Model"
#define TR_RESTORE_MODEL "Restore Model"