diff --git a/src/frsky.cpp b/src/frsky.cpp index 492d80674..67e7db48f 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -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); diff --git a/src/general_menus.cpp b/src/general_menus.cpp index 1e8310718..6dfbdcd89 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -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++) { diff --git a/src/gtests.cpp b/src/gtests.cpp index bdb00018d..abca9a12b 100644 --- a/src/gtests.cpp +++ b/src/gtests.cpp @@ -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); } } } diff --git a/src/lcd.cpp b/src/lcd.cpp index 775f884a8..38ab3f4a3 100644 --- a/src/lcd.cpp +++ b/src/lcd.cpp @@ -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; diff --git a/src/lcd.h b/src/lcd.h index a0f3bf021..26272474e 100644 --- a/src/lcd.h +++ b/src/lcd.h @@ -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); diff --git a/src/main_views.cpp b/src/main_views.cpp index cc0c806c2..8453d5cab 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -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; i0) { 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) { - 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 - - - diff --git a/src/menus.h b/src/menus.h index 38c63af9a..d2b5bd9bb 100644 --- a/src/menus.h +++ b/src/menus.h @@ -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; diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 7e5b02a91..538b434da 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -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_posHorz0 && iactive, 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 diff --git a/src/myeeprom.h b/src/myeeprom.h index 6608fc7e7..3cc9af3f1 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -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]; diff --git a/src/open9x.cpp b/src/open9x.cpp index c1b322cd0..b7af65b17 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -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 (ifunc == 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<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_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 = (xv1 > 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 = (xy); + break; + case CS_ANEG: + result = (abs(x)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 = (xy); - break; - case CS_ANEG: - result = (abs(x)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< 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) diff --git a/src/open9x.h b/src/open9x.h index d4b454336..d36d89214 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -40,7 +40,7 @@ #include #include -#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, // voffset @@ -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)TC_CHANNEL[0].TC_CV; } diff --git a/src/rotarysw.h b/src/rotarysw.h index cbe5a6bae..ed0c36842 100644 --- a/src/rotarysw.h +++ b/src/rotarysw.h @@ -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; diff --git a/src/stock/board_stock.cpp b/src/stock/board_stock.cpp index 2f2a169d7..750c0a98c 100644 --- a/src/stock/board_stock.cpp +++ b/src/stock/board_stock.cpp @@ -185,7 +185,7 @@ bool switchState(EnumKeys enuk) result = !(PINE & (1<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: diff --git a/src/translations.cpp b/src/translations.cpp index 135649065..8aecad56e 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -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; diff --git a/src/translations.h b/src/translations.h index 5f3e48d1e..4b449c378 100644 --- a/src/translations.h +++ b/src/translations.h @@ -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[]; diff --git a/src/translations/en.h b/src/translations/en.h index c4bc851d0..ba7cc3eca 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -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 ""v1x""|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 ""v1x""|v1|v2\0""v1=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"