From 0e824f8e8a453f50547b3829075723ffde587c28 Mon Sep 17 00:00:00 2001 From: "bsongis@gmail.com" Date: Wed, 24 Apr 2013 19:33:56 +0000 Subject: [PATCH] [all] Sticks calibration launched automatically when needed [Taranis] Curves again! [Taranis] Trainer menu --- src/eeprom_raw.cpp | 13 +-- src/eeprom_rlc.cpp | 18 ++-- src/menu_general.cpp | 4 +- src/menu_model.cpp | 234 +++++++++++++++++++++---------------------- src/menus.cpp | 48 ++++++--- src/menus.h | 24 ++++- src/myeeprom.h | 5 +- src/opentx.cpp | 61 +++++------ src/opentx.h | 5 +- src/simpgmspace.cpp | 12 +-- 10 files changed, 223 insertions(+), 201 deletions(-) diff --git a/src/eeprom_raw.cpp b/src/eeprom_raw.cpp index 06365a7a9..234080cbf 100644 --- a/src/eeprom_raw.cpp +++ b/src/eeprom_raw.cpp @@ -332,21 +332,12 @@ bool eeLoadGeneral() } if (g_eeGeneral.version != EEPROM_VER) { + TRACE_DEBUG("EEPROM version %d (%d) instead of %d (%d)\n", g_eeGeneral.version, g_eeGeneral.variant, EEPROM_VER, EEPROM_VARIANT); if (!eeConvert()) return false; } - uint16_t sum = evalChkSum(); - if (g_eeGeneral.chkSum == sum) { - return true; - } - -#ifdef SIMU - printf("EEPROM version %d (%d) instead of %d (%d)\n", g_eeGeneral.version, g_eeGeneral.variant, EEPROM_VER, EEPROM_VARIANT); - fflush(stdout); -#endif - - return false; + return true; } void eeLoadModel(uint8_t id) diff --git a/src/eeprom_rlc.cpp b/src/eeprom_rlc.cpp index fbe0cc736..8a3b5b62b 100644 --- a/src/eeprom_rlc.cpp +++ b/src/eeprom_rlc.cpp @@ -857,21 +857,19 @@ void RlcFile::DisplayProgressBar(uint8_t x) } #endif +#if defined(PCBSTD) + #define CHECK_EEPROM_VARIANT() (g_eeGeneral.variant == EEPROM_VARIANT) +#else + #define CHECK_EEPROM_VARIANT() (1) +#endif + bool eeLoadGeneral() { theFile.openRlc(FILE_GENERAL); if (theFile.readRlc((uint8_t*)&g_eeGeneral, 1) == 1 && g_eeGeneral.version == EEPROM_VER) { theFile.openRlc(FILE_GENERAL); - if (theFile.readRlc((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral)) <= sizeof(EEGeneral)) { -#if defined(PCBSTD) - if (g_eeGeneral.variant == EEPROM_VARIANT && g_eeGeneral.chkSum == evalChkSum()) { - return true; - } -#else - if (g_eeGeneral.chkSum == evalChkSum()) { - return true; - } -#endif + if (theFile.readRlc((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral)) <= sizeof(EEGeneral) && CHECK_EEPROM_VARIANT()) { + return true; } } diff --git a/src/menu_general.cpp b/src/menu_general.cpp index 9e769ce57..239113a6f 100644 --- a/src/menu_general.cpp +++ b/src/menu_general.cpp @@ -574,7 +574,7 @@ void onSdManagerMenu(const char *result) reusableBuffer.sdmanager.offset = -1; } else { - s_warning = STR_SDCARD_ERROR; + POPUP_WARNING(STR_SDCARD_ERROR); } } else if (result == STR_DELETE_FILE) { @@ -593,7 +593,7 @@ void onSdManagerMenu(const char *result) f_getcwd(lfn, SD_SCREEN_FILE_LENGTH); strcat(lfn, "/"); strcat(lfn, reusableBuffer.sdmanager.lines[index]); - s_warning = eeLoadModelSD(lfn); + POPUP_WARNING(eeLoadModelSD(lfn)); } */ else if (result == STR_PLAY_FILE) { f_getcwd(lfn, SD_SCREEN_FILE_LENGTH); diff --git a/src/menu_model.cpp b/src/menu_model.cpp index 53968a5be..e3cfbdb5a 100644 --- a/src/menu_model.cpp +++ b/src/menu_model.cpp @@ -264,18 +264,17 @@ void onModelSelectMenu(const char *result) #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); + POPUP_WARNING(eeBackupModel(sub)); } else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { if (!listSdFiles(MODELS_PATH, MODELS_EXT, sizeof(g_model.header.name), NULL)) { - s_warning = STR_NO_MODELS_ON_SD; + POPUP_WARNING(STR_NO_MODELS_ON_SD); s_menu_flags = 0; } } #endif else if (result == STR_DELETE_MODEL) { - s_warning = STR_DELETEMODEL; - s_warning_type = WARNING_TYPE_CONFIRM; + POPUP_CONFIRMATION(STR_DELETEMODEL); #if defined(CPUARM) s_warning_info = modelHeaders[sub].name; #else @@ -288,7 +287,7 @@ void onModelSelectMenu(const char *result) #if defined(SDCARD) else { // The user choosed a file on SD to restore - s_warning = eeRestoreModel(sub, (char *)result); + POPUP_WARNING(eeRestoreModel(sub, (char *)result)); if (!s_warning && g_eeGeneral.currModel == sub) eeLoadModel(sub); } @@ -350,8 +349,7 @@ void menuModelSelect(uint8_t event) break; case EVT_KEY_LONG(KEY_EXIT): if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { - s_warning = STR_DELETEMODEL; - s_warning_type = WARNING_TYPE_CONFIRM; + POPUP_CONFIRMATION(STR_DELETEMODEL); #if defined(CPUARM) s_warning_info = modelHeaders[sub].name; #else @@ -851,7 +849,10 @@ enum menuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_BIND, ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_TRAINER, + ITEM_MODEL_TRAINER_LABEL, + ITEM_MODEL_TRAINER_MODE, + ITEM_MODEL_TRAINER_CHANNELS, + ITEM_MODEL_TRAINER_SETTINGS, #else ITEM_MODEL_PROTOCOL, IF_PCBSKY9X(ITEM_MODEL_PPM2_PROTOCOL) @@ -877,7 +878,7 @@ void onModelSetupMenu(const char *result) { if (result == STR_UPDATE_LIST) { if (!listSdFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), NULL)) { - s_warning = STR_NO_BITMAPS_ON_SD; + POPUP_WARNING(STR_NO_BITMAPS_ON_SD); s_menu_flags = 0; } } @@ -911,12 +912,14 @@ void menuModelSetup(uint8_t event) bool CURSOR_ON_CELL = (m_posHorz >= 0); #define IF_PORT1_ON(x) (g_model.moduleData[0].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x)) #define IF_PORT2_ON(x) (g_model.externalModule == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) - #define IF_PORT_ON(idx, x) (idx==0 ? IS_PORT1_ON(x) : IS_PORT2_ON(x)) + #define IF_TRAINER_ON(x) (g_model.trainerMode ? (uint8_t)(x) : HIDDEN_ROW) + #define IF_PORT_ON(idx, x) (idx==0 ? IS_PORT1_ON(x) : (idx==1 ? IS_PORT2_ON(x) : IS_TRAINER_ON())) #define IF_PORT2_XJT(x) (IS_MODULE_XJT(1) ? (uint8_t)x : HIDDEN_ROW) #define PORT1_CHANNELS_ROWS() IF_PORT1_ON(1) #define PORT2_CHANNELS_ROWS() IF_PORT2_ON(g_model.externalModule == MODULE_TYPE_DJT ? (uint8_t)0 : (g_model.externalModule == MODULE_TYPE_DSM2 ? (uint8_t)0 : ((uint8_t)1))) - #define PORT_CHANNELS_ROWS(x) (x==0 ? PORT1_CHANNELS_ROWS() : PORT2_CHANNELS_ROWS()) - MENU(STR_MENUSETUP, menuTabModel, e_ModelSetup, 1+ITEM_MODEL_SETUP_MAX, { 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_PORT1_ON(1), IF_PORT1_ON(2), IF_PORT1_ON(g_model.moduleData[0].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0), LABEL(ExternalModule), g_model.externalModule==MODULE_TYPE_XJT ? (uint8_t)1 : (uint8_t)0, PORT2_CHANNELS_ROWS(), (IS_MODULE_PPM(1) || IS_MODULE_XJT(1) ? (uint8_t)2 : HIDDEN_ROW), IF_PORT2_XJT(g_model.moduleData[1].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0), 0}); + #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) + #define PORT_CHANNELS_ROWS(x) (x==0 ? PORT1_CHANNELS_ROWS() : (x==1 ? PORT2_CHANNELS_ROWS() : TRAINER_CHANNELS_ROWS())) + MENU(STR_MENUSETUP, menuTabModel, e_ModelSetup, 1+ITEM_MODEL_SETUP_MAX, { 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_PORT1_ON(1), IF_PORT1_ON(2), IF_PORT1_ON(g_model.moduleData[0].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0), LABEL(ExternalModule), g_model.externalModule==MODULE_TYPE_XJT ? (uint8_t)1 : (uint8_t)0, PORT2_CHANNELS_ROWS(), (IS_MODULE_PPM(1) || IS_MODULE_XJT(1) ? (uint8_t)2 : HIDDEN_ROW), IF_PORT2_XJT(g_model.moduleData[1].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #elif defined(CPUM64) #define CURSOR_ON_CELL (true) uint8_t protocol = g_model.protocol; @@ -965,7 +968,7 @@ void menuModelSetup(uint8_t event) menuHandler = onModelSetupMenu; } else { - s_warning = STR_NO_BITMAPS_ON_SD; + POPUP_WARNING(STR_NO_BITMAPS_ON_SD); s_menu_flags = 0; } } @@ -1189,8 +1192,9 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: case ITEM_MODEL_EXTERNAL_MODULE_CHANNELS: + case ITEM_MODEL_TRAINER_CHANNELS: { - uint8_t moduleIdx = (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? 1 : 0); + uint8_t moduleIdx = (k>=ITEM_MODEL_TRAINER_LABEL ? 2 : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? 1 : 0)); ModuleData & moduleData = g_model.moduleData[moduleIdx]; lcd_putsLeft(y, PSTR(INDENT "Channels Range")); if ((int8_t)PORT_CHANNELS_ROWS(moduleIdx) >= 0) { @@ -1214,26 +1218,28 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_INTERNAL_MODULE_BIND: case ITEM_MODEL_EXTERNAL_MODULE_BIND: + case ITEM_MODEL_TRAINER_SETTINGS: { - uint8_t moduleIdx = (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? 1 : 0); + uint8_t moduleIdx = (k>=ITEM_MODEL_TRAINER_LABEL ? 2 : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? 1 : 0)); + ModuleData & moduleData = g_model.moduleData[moduleIdx]; if (IS_MODULE_PPM(moduleIdx)) { lcd_putsLeft(y, STR_PPMFRAME); lcd_puts(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); - lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.ppmFrameLength*5 + 225, (m_posHorz<=0 ? attr : 0) | PREC1|LEFT); + lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppmFrameLength*5 + 225, (m_posHorz<=0 ? attr : 0) | PREC1|LEFT); lcd_putc(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); - lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.ppmDelay*50)+300, (m_posHorz < 0 || m_posHorz==1) ? attr : 0); - lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.pulsePol ? '+' : '-', (m_posHorz < 0 || m_posHorz==2) ? attr : 0); + lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppmDelay*50)+300, (m_posHorz < 0 || m_posHorz==1) ? attr : 0); + lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, moduleData.ppmPulsePol ? '+' : '-', (m_posHorz < 0 || m_posHorz==2) ? attr : 0); if (attr && (editMode>0 || p1valdiff)) { switch (m_posHorz) { case 0: - CHECK_INCDEC_MODELVAR(event, g_model.ppmFrameLength, -20, 35); + CHECK_INCDEC_MODELVAR(event, moduleData.ppmFrameLength, -20, 35); break; case 1: - CHECK_INCDEC_MODELVAR(event, g_model.ppmDelay, -4, 10); + CHECK_INCDEC_MODELVAR(event, moduleData.ppmDelay, -4, 10); break; case 2: - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.pulsePol, 1); + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.ppmPulsePol, 1); break; } } @@ -1303,10 +1309,16 @@ void menuModelSetup(uint8_t event) break; } - case ITEM_MODEL_TRAINER: - g_model.trainerMode = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, PSTR("Trainer Mode"), PSTR("\006MasterSlave"), g_model.trainerMode, 0, 1, attr, event); + case ITEM_MODEL_TRAINER_LABEL: + lcd_putsLeft(y, PSTR("Trainer")); break; + + case ITEM_MODEL_TRAINER_MODE: + g_model.trainerMode = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_MODE, PSTR("\006MasterSlave"), g_model.trainerMode, 0, 1, attr, event); break; + break; + #else + case ITEM_MODEL_PROTOCOL: #if defined(PCBSKY9X) lcd_putsLeft(y, PSTR("Port1")); @@ -2103,28 +2115,32 @@ bool moveCurve(uint8_t index, int8_t shift, int8_t custom=0) } #if defined(PCBTARANIS) -const pm_char STR_CURVE_NAME[] PROGMEM = "Curve Name..."; -const pm_char STR_CURVE_TYPE[] PROGMEM = "Curve Type..."; const pm_char STR_CURVE_PRESET[] PROGMEM = "Preset..."; const pm_char STR_PRESET[] PROGMEM = "Preset"; const pm_char STR_CURVE_MIRROR[] PROGMEM = "Mirror"; const pm_char STR_CURVE_CLEAR[] PROGMEM = "Clear"; -int8_t presetIdx = 0; -uint8_t paramsEditMode = 0; + +void displayPresetChoice(uint8_t event) +{ + displayWarning(event); + lcd_outdezAtt(WARNING_LINE_X+FW*sizeof(STR_PRESET), WARNING_LINE_Y, 45*s_warning_input_value/4, LEFT|INVERS); + lcd_putcAtt(lcdLastPos, WARNING_LINE_Y, '@', INVERS); + + if (s_warning_result) { + CurveInfo crv = curveinfo(s_curveChan); + for (uint8_t i=0; i0 ? INVERS|BLINK : INVERS) : 0); lcd_putsLeft(3*FH+3, STR_TYPE); - lcd_outdezAtt(INDENT_WIDTH, 4*FH+3, crv.points, LEFT|(paramsEditMode==2 ? INVERS|BLINK : 0)); - lcd_putsAtt(lcdLastPos, 4*FH+3, crv.custom ? PSTR("pt'") : PSTR("pt"), (paramsEditMode==2 ? INVERS|BLINK : 0)); - if (paramsEditMode==2) { + lcd_outdezAtt(INDENT_WIDTH, 4*FH+3, crv.points, LEFT|attr); + lcd_putsAtt(lcdLastPos, 4*FH+3, crv.custom ? PSTR("pt'") : PSTR("pt"), attr); + if (attr==(INVERS|BLINK)) { switch(event) { case EVT_KEY_REPT(KEY_LEFT): case EVT_KEY_FIRST(KEY_LEFT): @@ -2194,87 +2212,61 @@ void menuModelCurveOne(uint8_t event) break; } crv = curveinfo(s_curveChan); - m_posVert = 0; } - if (paramsEditMode==3) { - lcd_putsLeft(5*FH+5, STR_PRESET); - lcd_outdezAtt(INDENT_WIDTH, 6*FH+5, 45*presetIdx/4, LEFT|INVERS|BLINK); - lcd_putcAtt(lcdLastPos, 6*FH+5, '@', INVERS|BLINK); - presetIdx = checkIncDecModel(event, presetIdx, -4, 4); - if (checkIncDec_Ret) { - for (uint8_t i=0; i 0 ? INVERS|BLINK : INVERS); for (uint8_t i=0; i=s_pgOfs && i0 && i0 && m_posVert==1+2*i) + selectionMode = 1; + } + else if (m_posVert == 2+i) { + selectionMode = 2; } - if (paramsEditMode==0 && m_posVert==i) { + if (i>=pointsOfs && i0 && i 0) { // do selection square lcd_filled_rect(point.x-FW-1, point.y-2, 5, 5, SOLID, FORCE); lcd_filled_rect(point.x-FW, point.y-1, 3, 3, SOLID); if (s_editMode > 0) { - if (event==EVT_KEY_BREAK(KEY_ENTER)) { - if (s_editMode == EDIT_MODIFY_FIELD) - s_editMode = (crv.custom && i>0 && i= s_pgOfs+5) - s_pgOfs = m_posVert-4; + if (i < pointsOfs) + pointsOfs = i; + else if (i > pointsOfs+6) + pointsOfs = i-6; } } } @@ -2302,10 +2294,10 @@ void menuModelCurveOne(uint8_t event) break; case EVT_KEY_LONG(KEY_ENTER): if (s_editMode <= 0) { - if (++m_posHorz > 4) + if (int8_t(++m_posHorz) > 4) m_posHorz = -4; for (uint8_t i=0; i= (expo ? MAX_EXPOS : MAX_MIXERS)) { - s_warning = (expo ? STR_NOFREEEXPO : STR_NOFREEMIXER); + POPUP_WARNING(expo ? STR_NOFREEEXPO : STR_NOFREEMIXER); return true; } return false; @@ -3434,8 +3426,7 @@ void menuModelLimits(uint8_t event) if (active) { uint8_t revert_new = checkIncDecModel(event, revert, 0, 1); if (checkIncDec_Ret && thrOutput(k)) { - s_warning = STR_INVERT_THR; - s_warning_type = WARNING_TYPE_CONFIRM; + POPUP_CONFIRMATION(STR_INVERT_THR); } else { ld->revert = revert_new; @@ -3467,10 +3458,10 @@ void menuModelLimits(uint8_t event) #if defined(CURVES) #if defined(GVARS) -#define CURVE_SELECTED() (sub >= 0 && sub < MAX_CURVES) -#define GVAR_SELECTED() (sub >= MAX_CURVES) + #define CURVE_SELECTED() (sub >= 0 && sub < MAX_CURVES) + #define GVAR_SELECTED() (sub >= MAX_CURVES) #else -#define CURVE_SELECTED() (sub >= 0) + #define CURVE_SELECTED() (sub >= 0) #endif void menuModelCurvesAll(uint8_t event) @@ -3974,7 +3965,7 @@ void onCustomFunctionsMenu(const char *result) if (result == STR_UPDATE_LIST) { if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT, sizeof(g_model.funcSw[sub].param), NULL)) { - s_warning = STR_NO_SOUNDS_ON_SD; + POPUP_WARNING(STR_NO_SOUNDS_ON_SD); s_menu_flags = 0; } } @@ -4101,7 +4092,7 @@ void menuModelCustomFunctions(uint8_t event) menuHandler = onCustomFunctionsMenu; } else { - s_warning = STR_NO_SOUNDS_ON_SD; + POPUP_WARNING(STR_NO_SOUNDS_ON_SD); s_menu_flags = 0; } } @@ -4650,8 +4641,7 @@ void menuModelTemplates(uint8_t event) AUDIO_WARNING2(); } if (event==EVT_KEY_BREAK(KEY_ENTER)) { - s_warning = STR_VTEMPLATES+1 + (sub * LEN2_VTEMPLATES); - s_warning_type = WARNING_TYPE_CONFIRM; + POPUP_CONFIRMATION(STR_VTEMPLATES+1 + (sub * LEN2_VTEMPLATES)); s_editMode = 0; } } diff --git a/src/menus.cpp b/src/menus.cpp index 22a498a48..ee58de4b1 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -412,11 +412,6 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t s_noScroll = 0; displayScreenIndex(curr, menuTabSize, attr); -#if LCD_W >= 212 - if (maxrow > LCD_LINES-1) - displayScrollbar(LCD_W-1, FH, LCD_H-FH, s_pgOfs, maxrow, LCD_LINES-1); -#endif - #if defined(PCBTARANIS) lcd_filled_rect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT); #endif @@ -686,8 +681,10 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t else if (menuTab && horTab) { vertpos_t realPosVert = l_posVert; vertpos_t realPgOfs = s_pgOfs; + vertpos_t realMaxrow = maxrow; for (vertpos_t i=1; i<=maxrow; i++) { if (horTab[i] == HIDDEN_ROW) { + realMaxrow--; if (i < l_posVert) realPosVert--; if (i < s_pgOfs) @@ -702,12 +699,19 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t s_pgOfs++; } } + maxrow = realMaxrow; } else { uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2; if (l_posVert>max+s_pgOfs) s_pgOfs = l_posVert-max; else if (l_posVert<1+s_pgOfs) s_pgOfs = l_posVert-1; } + +#if LCD_W >= 212 + if (maxrow > LCD_LINES-1) + displayScrollbar(LCD_W-1, FH, LCD_H-FH, s_pgOfs, maxrow, LCD_LINES-1); +#endif + #else uint8_t max = menuTab ? LCD_LINES-1 : LCD_LINES-2; if (l_posVert<1) s_pgOfs=0; @@ -774,19 +778,25 @@ void pushMenu(MenuFuncP newMenu) (*newMenu)(EVT_ENTRY); } -const pm_char * s_warning = 0; +const pm_char * s_warning = NULL; const pm_char * s_warning_info; uint8_t s_warning_info_len; // uint8_t s_warning_info_att not needed now uint8_t s_warning_type; uint8_t s_warning_result = 0; -const pm_char * s_global_warning = 0; +const pm_char * s_global_warning = NULL; + +#if defined(CPUARM) +int16_t s_warning_input_value; +int16_t s_warning_input_min; +int16_t s_warning_input_max; +#endif void displayBox() { lcd_filled_rect(10, 16, LCD_W-20, 40, SOLID, ERASE); lcd_rect(10, 16, LCD_W-20, 40); - lcd_puts(16, 3*FH, s_warning); + lcd_puts(WARNING_LINE_X, WARNING_LINE_Y, s_warning); // could be a place for a s_warning_info } @@ -794,7 +804,7 @@ void displayPopup(const pm_char * pstr) { s_warning = pstr; displayBox(); - s_warning = 0; + s_warning = NULL; lcdRefresh(); } @@ -803,9 +813,9 @@ void displayWarning(uint8_t event) s_warning_result = false; displayBox(); if (s_warning_info) - 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) { + lcd_putsnAtt(16, WARNING_LINE_Y+FH, s_warning_info, s_warning_info_len, ZCHAR); + lcd_puts(16, WARNING_LINE_Y+2*FH, s_warning_type == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS); + switch (event) { #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ROTARY_BREAK: #endif @@ -819,9 +829,17 @@ void displayWarning(uint8_t event) killEvents(event); #endif case EVT_KEY_BREAK(KEY_EXIT): - s_warning = 0; + s_warning = NULL; s_warning_type = WARNING_TYPE_ASTERISK; break; +#if defined(CPUARM) + default: + if (s_warning_type != WARNING_TYPE_INPUT) break; + s_editMode = EDIT_MODIFY_FIELD; + s_warning_input_value = checkIncDec(event, s_warning_input_value, s_warning_input_min, s_warning_input_max); + s_editMode = EDIT_SELECT_FIELD; + break; +#endif } } @@ -916,6 +934,10 @@ int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int16_t min, int16_t max #define MENU_W LCD_W-20 #endif +#if defined(CPUARM) +void (*popupFunc)(uint8_t event) = NULL; +#endif + #if defined(NAVIGATION_MENUS) const char *s_menu[MENU_MAX_LINES]; uint8_t s_menu_item = 0; diff --git a/src/menus.h b/src/menus.h index 12a9bc231..175f66c5b 100644 --- a/src/menus.h +++ b/src/menus.h @@ -158,7 +158,7 @@ extern int8_t s_editMode; // global editmode #define TITLE_ROW ((uint8_t)-1) #define HIDDEN_ROW ((uint8_t)-2) -int16_t checkIncDec(uint8_t event, int16_t i_pval, int16_t i_min, int16_t i_max, uint8_t i_flags); +int16_t checkIncDec(uint8_t event, int16_t i_pval, int16_t i_min, int16_t i_max, uint8_t i_flags=0); #if defined(CPUM64) int8_t checkIncDecModel(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max); @@ -258,6 +258,7 @@ int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int16_t min, int16_t max #define WARNING_TYPE_ASTERISK 0 #define WARNING_TYPE_CONFIRM 1 +#define WARNING_TYPE_INPUT 2 extern const pm_char * s_warning; extern const pm_char * s_warning_info; @@ -267,10 +268,31 @@ extern uint8_t s_warning_type; extern const pm_char * s_global_warning; +#define WARNING_LINE_X 16 +#define WARNING_LINE_Y 3*FH + void displayBox(); void displayPopup(const pm_char * pstr); void displayWarning(uint8_t event); +#if defined(CPUARM) + extern void (*popupFunc)(uint8_t event); + extern int16_t s_warning_input_value; + extern int16_t s_warning_input_min; + extern int16_t s_warning_input_max; +#endif + +#if defined(CPUARM) + #define DISPLAY_WARNING (*popupFunc) + #define POPUP_WARNING(s) do { s_warning = s; popupFunc = displayWarning; } while(0) + #define POPUP_CONFIRMATION(s) do { s_warning = s; s_warning_type = WARNING_TYPE_CONFIRM; popupFunc = displayWarning; } while(0) + #define POPUP_INPUT(s, func, start, min, max) do { s_warning = s; s_warning_type = WARNING_TYPE_INPUT; popupFunc = func; s_warning_input_value = start; s_warning_input_min = min; s_warning_input_max = max; } while(0) +#else + #define DISPLAY_WARNING displayWarning + #define POPUP_WARNING(s) s_warning = s + #define POPUP_CONFIRMATION(s) do { s_warning = s; s_warning_type = WARNING_TYPE_CONFIRM; } while(0) +#endif + #if defined(SDCARD) || (defined(ROTARY_ENCODER_NAVIGATION) && !defined(CPUM64)) #define NAVIGATION_MENUS #define MENU_ADD_ITEM(s) s_menu[s_menu_count++] = s diff --git a/src/myeeprom.h b/src/myeeprom.h index 624b9933e..60951b5a1 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -222,11 +222,14 @@ PACK(typedef struct t_ModuleData { int8_t channelsCount; // 0=8 channels uint8_t failsafeMode; int16_t failsafeChannels[NUM_CHNOUT]; + int8_t ppmDelay; + int8_t ppmFrameLength; + uint8_t ppmPulsePol; }) ModuleData; #if defined(PCBTARANIS) #define MODELDATA_BITMAP char bitmap[LEN_BITMAP_NAME]; -#define MODELDATA_EXTRA uint8_t externalModule; ModuleData moduleData[NUM_MODULES]; uint8_t trainerMode; char curveNames[MAX_CURVES][6]; ModuleData trainerData; +#define MODELDATA_EXTRA uint8_t externalModule; uint8_t trainerMode; ModuleData moduleData[NUM_MODULES+1]; char curveNames[MAX_CURVES][6]; #define LIMITDATA_EXTRA char name[6]; #define swstate_t uint16_t #elif defined(PCBSKY9X) diff --git a/src/opentx.cpp b/src/opentx.cpp index d007bdd48..d1517a4e2 100644 --- a/src/opentx.cpp +++ b/src/opentx.cpp @@ -372,12 +372,7 @@ void generalDefault() g_eeGeneral.vBatWarn = 90; #endif - for (int i = 0; i < NUM_STICKS+NUM_POTS; ++i) { - g_eeGeneral.calibMid[i] = 0x200; - g_eeGeneral.calibSpanNeg[i] = 0x180; - g_eeGeneral.calibSpanPos[i] = 0x180; - } - g_eeGeneral.chkSum = 0x200 * (NUM_STICKS+NUM_POTS) + 0x180 * 5; + g_eeGeneral.chkSum = 0xFFFF; } uint16_t evalChkSum() @@ -407,8 +402,7 @@ void checkModelIdUnique(uint8_t id) { for (uint8_t i=0; i