[all] Sticks calibration launched automatically when needed

[Taranis] Curves again!
[Taranis] Trainer menu
This commit is contained in:
bsongis@gmail.com
2013-04-24 19:33:56 +00:00
parent f565f3c893
commit 0e824f8e8a
10 changed files with 223 additions and 201 deletions
+2 -11
View File
@@ -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)
+8 -10
View File
@@ -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;
}
}
+2 -2
View File
@@ -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);
+112 -122
View File
@@ -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; i<crv.points; i++)
crv.crv[i] = (i-(crv.points/2)) * s_warning_input_value * 50 / (crv.points-1);
if (crv.custom) {
for (int i=0; i<crv.points-2; i++)
crv.crv[crv.points+i] = -100 + ((i+1)*200) / (crv.points-1);
}
}
}
void onCurveOneMenu(const char *result)
{
if (result == STR_CURVE_NAME) {
paramsEditMode = 1;
s_editMode = 2;
editNameCursorPos = 0;
}
else if (result == STR_CURVE_TYPE) {
paramsEditMode = 2;
s_editMode = 1;
}
else if (result == STR_CURVE_PRESET) {
paramsEditMode = 3;
s_editMode = 1;
if (result == STR_CURVE_PRESET) {
POPUP_INPUT(STR_PRESET, displayPresetChoice, 0, -4, 4);
}
else if (result == STR_CURVE_MIRROR) {
CurveInfo crv = curveinfo(s_curveChan);
@@ -2144,21 +2160,23 @@ void onCurveOneMenu(const char *result)
void menuModelCurveOne(uint8_t event)
{
static uint8_t pointsOfs = 0;
CurveInfo crv = curveinfo(s_curveChan);
lcd_puts(9*FW, 0, "pt\003X\006Y");
lcd_filled_rect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT);
SIMPLE_SUBMENU(STR_MENUCURVE, crv.points);
SIMPLE_SUBMENU(STR_MENUCURVE, 2 + crv.points + (crv.custom ? crv.points-2 : 0));
lcd_outdezAtt(PSIZE(TR_MENUCURVE)*FW+1, 0, s_curveChan+1, INVERS|LEFT);
lcd_putsLeft(FH+1, STR_NAME);
editName(INDENT_WIDTH, 2*FH+1, g_model.curveNames[s_curveChan], sizeof(g_model.curveNames[s_curveChan]), event, paramsEditMode==1);
editName(INDENT_WIDTH, 2*FH+1, g_model.curveNames[s_curveChan], sizeof(g_model.curveNames[s_curveChan]), event, m_posVert==0);
uint8_t attr = (m_posVert==1 ? (s_editMode>0 ? 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<crv.points; i++)
crv.crv[i] = (i-(crv.points/2)) * presetIdx * 50 / (crv.points-1);
if (crv.custom) {
for (int i=0; i<crv.points-2; i++)
crv.crv[crv.points+i] = -100 + ((i+1)*200) / (crv.points-1);
}
}
}
if (paramsEditMode==0) {
switch(event) {
case EVT_ENTRY:
presetIdx = 0;
paramsEditMode = 0;
break;
case EVT_KEY_LONG(KEY_ENTER):
killEvents(event);
MENU_ADD_ITEM(STR_CURVE_NAME);
MENU_ADD_ITEM(STR_CURVE_TYPE);
MENU_ADD_ITEM(STR_CURVE_PRESET);
MENU_ADD_ITEM(STR_CURVE_MIRROR);
MENU_ADD_ITEM(STR_CURVE_CLEAR);
menuHandler = onCurveOneMenu;
break;
}
}
else if (s_editMode==0) {
paramsEditMode = 0;
switch(event) {
case EVT_ENTRY:
pointsOfs = 0;
break;
case EVT_KEY_LONG(KEY_ENTER):
killEvents(event);
MENU_ADD_ITEM(STR_CURVE_PRESET);
MENU_ADD_ITEM(STR_CURVE_MIRROR);
MENU_ADD_ITEM(STR_CURVE_CLEAR);
menuHandler = onCurveOneMenu;
break;
}
DrawCurve(FW);
uint8_t posY = FH+4;
uint8_t posY = FH+1;
attr = (s_editMode > 0 ? INVERS|BLINK : INVERS);
for (uint8_t i=0; i<crv.points; i++) {
point_t point = getPoint(i);
if (i>=s_pgOfs && i<s_pgOfs+5) {
int8_t x = -100 + 200*i/(crv.points-1);
if (crv.custom && i>0 && i<crv.points-1) x = crv.crv[crv.points+i-1];
lcd_outdezAtt(6+8*FW, posY, i+1, LEFT|((paramsEditMode==0 && m_posVert==i && s_editMode==0) ? INVERS : 0));
lcd_outdezAtt(3+12*FW, posY, x, LEFT|((paramsEditMode==0 && m_posVert==i && s_editMode==2) ? BLINK|INVERS : 0));
lcd_outdezAtt(3+16*FW, posY, crv.crv[i], LEFT|((paramsEditMode==0 && m_posVert==i && s_editMode==3) ? BLINK|INVERS : 0));
if (paramsEditMode==0 && m_posVert == i) {
lcd_rect(10+7*FW, posY-2, 12*FW-2, FH+3);
}
posY += FH+2;
uint8_t selectionMode = 0;
if (crv.custom) {
if (m_posVert==2+2*i || (i==crv.points-1 && m_posVert==2+crv.points+crv.points-2-1))
selectionMode = 2;
else if (i>0 && m_posVert==1+2*i)
selectionMode = 1;
}
else if (m_posVert == 2+i) {
selectionMode = 2;
}
if (paramsEditMode==0 && m_posVert==i) {
if (i>=pointsOfs && i<pointsOfs+7) {
int8_t x = -100 + 200*i/(crv.points-1);
if (crv.custom && i>0 && i<crv.points-1) x = crv.crv[crv.points+i-1];
lcd_outdezAtt(6+8*FW, posY, i+1, LEFT);
lcd_outdezAtt(3+12*FW, posY, x, LEFT|(selectionMode==1?attr:0));
lcd_outdezAtt(3+16*FW, posY, crv.crv[i], LEFT|(selectionMode==2?attr:0));
posY += FH;
}
if (selectionMode > 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<crv.points-1) ? 2 : 3;
else if (s_editMode == 2)
s_editMode = 3;
else
s_editMode = 0;
}
else if (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_FIRST(KEY_PLUS) || event==EVT_KEY_REPT(KEY_MINUS) || event==EVT_KEY_REPT(KEY_PLUS)) {
if (s_editMode == 2)
CHECK_INCDEC_MODELVAR(event, crv.crv[crv.points+i-1], i==1 ? -99 : crv.crv[crv.points+i-2]+1, i==crv.points-2 ? 99 : crv.crv[crv.points+i]-1); // edit X
else if (s_editMode == 3)
CHECK_INCDEC_MODELVAR(event, crv.crv[i], -100, 100);
}
if (selectionMode == 1)
CHECK_INCDEC_MODELVAR(event, crv.crv[crv.points+i-1], i==1 ? -99 : crv.crv[crv.points+i-2]+1, i==crv.points-2 ? 99 : crv.crv[crv.points+i]-1); // edit X
else if (selectionMode == 2)
CHECK_INCDEC_MODELVAR(event, crv.crv[i], -100, 100);
}
if (m_posVert < s_pgOfs)
s_pgOfs = m_posVert;
else if (m_posVert >= 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<crv.points; i++)
crv.crv[i] = (i-(crv.points/2)) * m_posHorz * 50 / (crv.points-1);
crv.crv[i] = (i-(crv.points/2)) * int8_t(m_posHorz) * 50 / (crv.points-1);
eeDirty(EE_MODEL);
killEvents(event);
}
@@ -2414,7 +2406,7 @@ bool reachExpoMixCountLimit(uint8_t expo)
{
// check mixers count limit
if (getExpoMixCount(expo) >= (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;
}
}
+35 -13
View File
@@ -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;
+23 -1
View File
@@ -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
+4 -1
View File
@@ -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)
+32 -29
View File
@@ -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<MAX_MODELS; i++) {
if (i!=id && g_model.header.modelId!=0 && g_model.header.modelId==modelHeaders[i].modelId) {
s_warning = PSTR("Model ID already used");
s_warning_type = WARNING_TYPE_ASTERISK;
POPUP_WARNING(PSTR("Model ID already used"));
}
}
}
@@ -3605,7 +3599,7 @@ void perMain()
}
else {
g_menuStack[g_menuStackPtr]((warn || menu) ? 0 : evt);
if (warn) displayWarning(evt);
if (warn) DISPLAY_WARNING(evt);
#if defined(NAVIGATION_MENUS)
if (menu) {
const char * result = displayMenu(evt);
@@ -3961,11 +3955,33 @@ void saveTimers()
#endif
#if defined(ROTARY_ENCODERS)
volatile rotenc_t g_rotenc[ROTARY_ENCODERS] = {0};
volatile rotenc_t g_rotenc[ROTARY_ENCODERS] = {0};
#elif defined(ROTARY_ENCODER_NAVIGATION)
volatile rotenc_t g_rotenc[1] = {0};
volatile rotenc_t g_rotenc[1] = {0};
#endif
void opentxStart()
{
doSplash();
#if defined(PCBSKY9X) && defined(SDCARD)
for (int i=0; i<500 && !Card_initialized; i++) {
CoTickDelay(1); // 2ms
}
#endif
#if defined(CPUARM)
eeLoadModel(g_eeGeneral.currModel);
#endif
checkAlarm();
checkAll();
if (g_eeGeneral.chkSum != evalChkSum()) {
pushMenu(menuGeneralCalib);
}
}
#ifndef SIMU
#if defined(CPUARM)
@@ -4044,14 +4060,14 @@ uint16_t stack_free()
#endif
#if defined(PCBGRUVIN9X)
#define OPEN9X_INIT_ARGS const uint8_t mcusr
#define OPENTX_INIT_ARGS const uint8_t mcusr
#elif defined(PCBSTD)
#define OPEN9X_INIT_ARGS const uint8_t mcusr
#define OPENTX_INIT_ARGS const uint8_t mcusr
#else
#define OPEN9X_INIT_ARGS
#define OPENTX_INIT_ARGS
#endif
inline void opentxInit(OPEN9X_INIT_ARGS)
inline void opentxInit(OPENTX_INIT_ARGS)
{
#if defined(PCBTARANIS)
BACKLIGHT_ON();
@@ -4100,20 +4116,7 @@ inline void opentxInit(OPEN9X_INIT_ARGS)
#endif
}
else {
doSplash();
#if defined(PCBSKY9X) && defined(SDCARD)
for (int i=0; i<500 && !Card_initialized; i++) {
CoTickDelay(1); // 2ms
}
#endif
#if defined(CPUARM)
eeLoadModel(g_eeGeneral.currModel);
#endif
checkAlarm();
checkAll();
opentxStart();
}
#if defined(CPUARM) || defined(PCBGRUVIN9X)
+3 -2
View File
@@ -459,11 +459,12 @@ enum EnumKeys {
static const int8_t maxChannelsModules[] = { 0, 8, 8, 0, 0 };
static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 };
#define IS_MODULE_XJT(idx) ((idx==0 || g_model.externalModule == MODULE_TYPE_XJT) && (g_model.moduleData[idx].rfProtocol != RF_PROTO_OFF))
#define IS_MODULE_PPM(idx) (idx==1 && g_model.externalModule == MODULE_TYPE_PPM)
#define IS_MODULE_PPM(idx) (idx==2 || (idx==1 && g_model.externalModule == MODULE_TYPE_PPM))
#define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount)
#define MAX_PORT1_CHANNELS() (maxChannelsXJT[1+g_model.moduleData[0].rfProtocol])
#define MAX_PORT2_CHANNELS() ((g_model.externalModule == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.externalModule])
#define MAX_CHANNELS(idx) (idx==0 ? MAX_PORT1_CHANNELS() : MAX_PORT2_CHANNELS())
#define MAX_TRAINER_CHANNELS() (8)
#define MAX_CHANNELS(idx) (idx==0 ? MAX_PORT1_CHANNELS() : (idx==1 ? MAX_PORT2_CHANNELS() : MAX_TRAINER_CHANNELS()))
#else
#define NUM_PORT1_CHANNELS() (IS_PXX_PROTOCOL(g_model.protocol) ? 8 : (IS_DSM2_PROTOCOL(g_model.protocol) ? 6 : (8+(g_model.ppmNCH*2))))
#define NUM_PORT2_CHANNELS() (8+(g_model.ppm2NCH*2))
+2 -10
View File
@@ -260,6 +260,7 @@ void *eeprom_write_function(void *)
uint8_t main_thread_running = 0;
char * main_thread_error = NULL;
extern void opentxStart();
void *main_thread(void *)
{
#ifdef SIMU_EXCEPTIONS
@@ -280,16 +281,7 @@ void *main_thread(void *)
if (g_eeGeneral.backlightMode != e_backlight_mode_off) backlightOn(); // on Tx start turn the light on
if (main_thread_running == 1) {
#if defined(SPLASH)
doSplash();
#endif
#if defined(CPUARM)
eeLoadModel(g_eeGeneral.currModel);
#endif
checkAlarm(); // TODO why not in checkAll()
checkAll();
opentxStart();
}
else {
#if defined(CPUARM)