[9x] BATTGRAPH option added to display the Tx voltage

[all] AdjustGVARs feature reworked (now 4 modes)
[!ARM] PlayTrack can now play GVARs
This commit is contained in:
bsongis
2013-02-25 18:48:11 +00:00
parent d1b862a4f3
commit e35cf751de
9 changed files with 386 additions and 207 deletions
+8 -1
View File
@@ -113,9 +113,10 @@ PWM_BACKLIGHT = NO
# Values = YES, NO, FIXED
SPLASH = YES
# GRAPHICS (sliders / checkboxes / bold)
# GRAPHICS (sliders / checkboxes / bold / batt graph)
GRAPHICS = YES
BOLD = YES
BATTGRAPH = YES
# THR trace (in STATS screen)
THR_TRACE = YES
@@ -389,6 +390,12 @@ ifeq ($(BOLD), YES)
CPPDEFS += -DBOLD_FONT
endif
ifneq ($(PCB), X9D)
ifeq ($(BATTGRAPH), YES)
CPPDEFS += -DBATTGRAPH
endif
endif
ifeq ($(THR_TRACE), YES)
CPPDEFS += -DTHRTRACE
endif
+4 -4
View File
@@ -1039,9 +1039,9 @@ int16_t convertCswTelemValue(CustomSwData * cs)
{
int16_t val;
if (CS_STATE(cs->func)==CS_VOFS)
val = convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128+cs->v2);
val = convertTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1, 128+cs->v2);
else
val = convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128+cs->v2) - convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128);
val = convertTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1, 128+cs->v2) - convertTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1, 128);
return val;
}
@@ -1308,7 +1308,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(MIXSRC_LAST_CH+source-1);
int16_t value = getValue(MIXSRC_FIRST_TELEM+source-2);
int16_t threshold = 0;
uint8_t thresholdX = 0;
if (source <= TELEM_TM2)
@@ -1381,7 +1381,7 @@ void menuTelemetryFrsky(uint8_t event)
}
if (field) {
fields_count++;
int16_t value = getValue(MIXSRC_LAST_CH+field-1);
int16_t value = getValue(MIXSRC_FIRST_TELEM+field-2);
uint8_t att = (i==3 ? NO_UNIT : DBLSIZE|NO_UNIT);
if (field >= TELEM_TM1 && field <= TELEM_TM2) {
uint8_t x = (i==3 ? j?80:20 : j?74:10);
+20 -4
View File
@@ -76,8 +76,8 @@ const MenuFuncP_PROGMEM menuTabDiag[] PROGMEM = {
#define RADIO_SETUP_DATE_COLUMN RADIO_SETUP_2ND_COLUMN + 4*FWNUM
#define RADIO_SETUP_TIME_COLUMN RADIO_SETUP_2ND_COLUMN + 2*FWNUM
#else
#define RADIO_SETUP_2ND_COLUMN (LCD_W-5*FW-MENUS_SCROLLBAR_WIDTH)
#define RADIO_SETUP_TIME_COLUMN (FW*15+5)
#define RADIO_SETUP_2ND_COLUMN (LCD_W-6*FW-3-MENUS_SCROLLBAR_WIDTH)
#define RADIO_SETUP_TIME_COLUMN (FW*15+9)
#define RADIO_SETUP_DATE_COLUMN (FW*15+5)
#endif
@@ -114,6 +114,7 @@ const MenuFuncP_PROGMEM menuTabDiag[] PROGMEM = {
enum menuGeneralSetupItems {
IF_RTCLOCK(ITEM_SETUP_DATE)
IF_RTCLOCK(ITEM_SETUP_TIME)
IF_BATTGRAPH(ITEM_SETUP_BATT_RANGE)
ITEM_SETUP_SOUND_LABEL,
ITEM_SETUP_BEEPER_MODE,
ITEM_SETUP_BEEPER_LENGTH,
@@ -166,7 +167,7 @@ void menuGeneralSetup(uint8_t event)
}
#endif
MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(TIMER_EVENTS), 0, 0, LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/});
MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) IF_BATTGRAPH(1) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(TIMER_EVENTS), 0, 0, LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/});
uint8_t sub = m_posVert - 1;
@@ -233,6 +234,21 @@ void menuGeneralSetup(uint8_t event)
break;
#endif
#if defined(BATTGRAPH)
case ITEM_SETUP_BATT_RANGE:
lcd_putsLeft(y, PSTR("Battery Range"));
lcd_putc(g_eeGeneral.vBatMin >= 10 ? RADIO_SETUP_2ND_COLUMN+2*FW+FWNUM-1 : RADIO_SETUP_2ND_COLUMN+2*FW+FWNUM-FW/2, y, '-');
putsVolts(RADIO_SETUP_2ND_COLUMN, y, 90+g_eeGeneral.vBatMin, (m_posHorz==0 ? attr : 0)|LEFT|NO_UNIT);
putsVolts(RADIO_SETUP_2ND_COLUMN+4*FW-2, y, 120+g_eeGeneral.vBatMax, (m_posHorz!=0 ? attr : 0)|LEFT|NO_UNIT);
if (attr && s_editMode>0) {
if (m_posHorz==0)
CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMin, -50, g_eeGeneral.vBatMax+20); // min=4.0V
else
CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMax, g_eeGeneral.vBatMin-20, +40); // max=16.0V
}
break;
#endif
case ITEM_SETUP_SOUND_LABEL:
lcd_putsLeft(y, STR_SOUND_LABEL);
break;
@@ -327,7 +343,7 @@ void menuGeneralSetup(uint8_t event)
break;
case ITEM_SETUP_BATTERY_WARNING:
lcd_putsLeft( y,STR_BATTERYWARNING);
lcd_putsLeft(y, STR_BATTERYWARNING);
putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT);
if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V
break;
+5 -1
View File
@@ -771,8 +771,12 @@ void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att)
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);
#if defined(GVARS)
else if (idx <= MIXSRC_LAST_GVAR)
putsStrIdx(x, y, STR_GV, idx-MIXSRC_GVAR1+1, att);
#endif
else
lcd_putsiAtt(x, y, STR_VTELEMCHNS, idx-MIXSRC_LAST_CH, att);
lcd_putsiAtt(x, y, STR_VTELEMCHNS, idx-MIXSRC_FIRST_TELEM+1, att);
}
void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags attr)
+25 -15
View File
@@ -224,9 +224,30 @@ void displayTimers()
}
#endif
void displayBattVoltage()
{
#if defined(BATTGRAPH)
putsVBat(VBATT_X-8, VBATT_Y+1, 0);
lcd_filled_rect(VBATT_X-25, VBATT_Y+9, 22, 5);
lcd_vline(VBATT_X-3, VBATT_Y+10, 3);
uint8_t count = limit<uint8_t>(2, 20 * (g_vbat100mV - g_eeGeneral.vBatMin - 90) / (30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin), 20);
for (uint8_t i=0; i<count; i+=2)
lcd_vline(VBATT_X-24+i, VBATT_Y+10, 3);
if (g_vbat100mV > g_eeGeneral.vBatWarn || BLINK_ON_PHASE)
lcd_filled_rect(VBATT_X-26, VBATT_Y, 25, 15);
#else
LcdFlags att = (g_vbat100mV <= g_eeGeneral.vBatWarn ? BLINK|INVERS : 0) | BIGSIZE;
putsVBat(VBATT_X-1, VBATT_Y, att|NO_UNIT);
#if LCD_W >= 212
lcd_putcAtt(VBATTUNIT_X, VBATTUNIT_Y, 'v', MIDSIZE);
#else
lcd_putc(VBATT_X, VBATTUNIT_Y, 'V');
#endif
#endif
}
#if defined(CPUARM)
void displayVoltage()
void displayVoltageOrAlarm()
{
if (g_vbat100mV > g_eeGeneral.vBatWarn && g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) {
putsTelemetryValue(6*FW-1, 3*FH, getTemperature(), UNIT_DEGREES, BLINK|INVERS|DBLSIZE);
@@ -237,22 +258,11 @@ void displayVoltage()
}
#endif
else {
LcdFlags att = (g_vbat100mV <= g_eeGeneral.vBatWarn ? BLINK|INVERS : 0) | BIGSIZE;
putsVBat(VBATT_X-1, VBATT_Y, att|NO_UNIT);
#if LCD_W >= 212
lcd_putcAtt(VBATTUNIT_X, VBATTUNIT_Y, 'v', MIDSIZE);
#else
lcd_putc(VBATT_X, VBATTUNIT_Y, 'V');
#endif
displayBattVoltage();
}
}
#else
void displayVoltage()
{
LcdFlags att = (g_vbat100mV <= g_eeGeneral.vBatWarn ? BLINK|INVERS : 0) | BIGSIZE;
putsVBat(VBATT_X-1, VBATT_Y, att|NO_UNIT);
lcd_putc(VBATT_X, VBATTUNIT_Y, 'V');
}
#define displayVoltageOrAlarm() displayBattVoltage()
#endif
#if defined(PCBX9D) || defined(PCBACT)
@@ -431,7 +441,7 @@ void menuMainView(uint8_t event)
putsModelName(MODELNAME_X, 0*FH, g_model.name, g_eeGeneral.currModel, BIGSIZE);
// Main Voltage (or alarm if any)
displayVoltage();
displayVoltageOrAlarm();
// Timers
displayTimers();
+116 -58
View File
@@ -899,6 +899,7 @@ void menuModelSetup(uint8_t event)
getMovedSwitch();
g_model.switchWarningStates = 0x01 + (switches_states << 1);
// no break
CASE_EVT_ROTARY_BREAK
case EVT_KEY_BREAK(KEY_ENTER):
#if !defined(PCBX9D)
case EVT_KEY_BREAK(KEY_LEFT):
@@ -1036,7 +1037,7 @@ void menuModelSetup(uint8_t event)
lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.ppmDelay*50)+300, m_posHorz==1 ? attr : 0);
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.pulsePol ? '+' : '-', m_posHorz==2 ? attr : 0);
if(attr && (editMode>0 || p1valdiff)) {
if (attr && (editMode>0 || p1valdiff)) {
switch (m_posHorz) {
case 0:
CHECK_INCDEC_MODELVAR(event, g_model.ppmFrameLength, -20, 35);
@@ -3021,7 +3022,7 @@ void menuModelCustomSwitchOne(uint8_t event)
case CSW_FIELD_V1:
{
lcd_putsLeft(y, STR_V1);
int8_t v1_min=0, v1_max=MIXSRC_LAST_CH+NUM_TELEMETRY;
int8_t v1_min=0, v1_max=MIXSRC_LAST_TELEM;
if (cstate == CS_VBOOL) {
putsSwitches(CSWONE_2ND_COLUMN, y, cs->v1, attr);
v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1;
@@ -3037,7 +3038,7 @@ void menuModelCustomSwitchOne(uint8_t event)
case CSW_FIELD_V2:
{
lcd_putsLeft(y, STR_V2);
int8_t v2_min=0, v2_max=MIXSRC_LAST_CH+NUM_TELEMETRY;
int8_t v2_min=0, v2_max=MIXSRC_LAST_TELEM;
if (cstate == CS_VBOOL) {
putsSwitches(CSWONE_2ND_COLUMN, y, cs->v2, attr);
v2_min = SWSRC_OFF+1; v2_max = SWSRC_OFF-1;
@@ -3047,9 +3048,9 @@ void menuModelCustomSwitchOne(uint8_t event)
}
else {
#if defined(FRSKY)
if (cs->v1 > MIXSRC_LAST_CH) {
putsTelemetryChannel(CSWONE_2ND_COLUMN, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), attr|LEFT);
v2_max = maxTelemValue(cs->v1 - MIXSRC_LAST_CH);
if (cs->v1 >= MIXSRC_FIRST_TELEM) {
putsTelemetryChannel(CSWONE_2ND_COLUMN, y, cs->v1 - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), attr|LEFT);
v2_max = maxTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1);
if (cstate == CS_VOFS) {
v2_min = -128;
v2_max -= 128;
@@ -3158,8 +3159,8 @@ void menuModelCustomSwitches(uint8_t event)
putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, 0);
#if defined(FRSKY)
if (cs->v1 > MIXSRC_LAST_CH) {
putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), 0);
if (cs->v1 >= MIXSRC_FIRST_TELEM) {
putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), 0);
}
else
#endif
@@ -3205,7 +3206,7 @@ void menuModelCustomSwitches(uint8_t event)
// CSW params
uint8_t cstate = CS_STATE(cs->func);
int8_t v1_min=0, v1_max=MIXSRC_LAST_CH+NUM_TELEMETRY, v2_min=0, v2_max=MIXSRC_LAST_CH+NUM_TELEMETRY;
int8_t v1_min=0, v1_max=MIXSRC_LAST_TELEM, v2_min=0, v2_max=MIXSRC_LAST_TELEM;
if (cstate == CS_VBOOL) {
putsSwitches(CSW_2ND_COLUMN, y, cs->v1, m_posHorz==1 ? attr : 0);
@@ -3221,9 +3222,9 @@ void menuModelCustomSwitches(uint8_t event)
putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, (m_posHorz==1 ? attr : 0));
#if defined(FRSKY)
if (cs->v1 > MIXSRC_LAST_CH) {
putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), m_posHorz==2 ? attr : 0);
v2_max = maxTelemValue(cs->v1 - MIXSRC_LAST_CH);
if (cs->v1 >= MIXSRC_FIRST_TELEM) {
putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), m_posHorz==2 ? attr : 0);
v2_max = maxTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1);
if (cstate == CS_VOFS) {
v2_min = -128;
v2_max -= 128;
@@ -3348,37 +3349,49 @@ void menuModelCustomFunctions(uint8_t event)
case 1:
if (sd->swtch) {
uint8_t func_displayed;
if (sd->func < FUNC_TRAINER) {
if (CFN_FUNC(sd) < FUNC_TRAINER) {
func_displayed = 0;
putsChn(MODEL_CUSTOM_FUNC_2ND_COLUMN+6*FW, y, sd->func+1, attr);
putsChn(MODEL_CUSTOM_FUNC_2ND_COLUMN+6*FW, y, CFN_CH_NUMBER(sd)+1, attr);
}
else if (sd->func < 16 + NUM_STICKS + 1) {
else if (CFN_FUNC(sd) <= FUNC_TRAINER + NUM_STICKS) {
func_displayed = 1;
if (sd->func != FUNC_TRAINER)
putsMixerSource(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, sd->func-FUNC_TRAINER, attr);
if (CFN_FUNC(sd) != FUNC_TRAINER)
putsMixerSource(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, CFN_FUNC(sd)-FUNC_TRAINER, attr);
}
#if defined(DEBUG)
else if (sd->func == FUNC_TEST) {
else if (CFN_FUNC(sd) == FUNC_TEST) {
#if defined(GVARS)
func_displayed = FUNC_TEST - 16 - NUM_STICKS - MAX_GVARS + 2;
func_displayed = FUNC_TEST - FUNC_TRAINER - NUM_STICKS - MAX_GVARS + 2;
#else
func_displayed = FUNC_TEST - 16 - NUM_STICKS + 1;
func_displayed = FUNC_TEST - FUNC_TRAINER - NUM_STICKS + 1;
#endif
}
#endif
#if defined(GVARS)
else if (sd->func >= FUNC_ADJUST_GV1) {
func_displayed = FUNC_ADJUST_GV1 - 16 - NUM_STICKS + 1;
putsStrIdx(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, STR_GV, sd->func-FUNC_ADJUST_GV1+1, attr);
else if (CFN_FUNC(sd) >= FUNC_ADJUST_GV1) {
func_displayed = FUNC_ADJUST_GV1 - FUNC_TRAINER - NUM_STICKS + 1;
putsStrIdx(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, STR_GV, CFN_FUNC(sd)-FUNC_ADJUST_GV1+1, attr);
}
#endif
else {
func_displayed = 2 + sd->func - 16 - NUM_STICKS - 1;
func_displayed = 2 + CFN_FUNC(sd) - FUNC_TRAINER - NUM_STICKS - 1;
}
lcd_putsiAtt(MODEL_CUSTOM_FUNC_2ND_COLUMN, y, STR_VFSWFUNC, func_displayed, attr);
if (active) {
CHECK_INCDEC_MODELVAR_ZERO(event, sd->func, FUNC_MAX-1);
if (checkIncDec_Ret) CFN_RESET_PARAM(sd);
#if defined(CPUARM)
CHECK_INCDEC_MODELVAR_ZERO(event, CFN_FUNC(sd), FUNC_MAX-1);
if (checkIncDec_Ret)
CFN_RESET_PARAM(sd);
#else
if (CFN_FUNC(sd) < FUNC_TRAINER) {
CHECK_INCDEC_MODELVAR_ZERO(event, sd->internal.func_safety.func, 16);
}
else {
CHECK_INCDEC_MODELVAR_ZERO(event, CFN_FUNC(sd), FUNC_MAX-1);
if (CFN_FUNC(sd) < FUNC_TRAINER)
sd->internal.func_safety.func = 15;
}
#endif
}
}
else if (attr) {
@@ -3391,7 +3404,7 @@ void menuModelCustomFunctions(uint8_t event)
int16_t val_displayed = CFN_PARAM(sd);
int8_t val_min = 0;
uint8_t val_max = 255;
if (sd->func == FUNC_PLAY_SOUND) {
if (CFN_FUNC(sd) == FUNC_PLAY_SOUND) {
#if defined(AUDIO)
val_max = AU_FRSKY_LAST-AU_FRSKY_FIRST-1;
lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_FUNCSOUNDS, val_displayed, attr);
@@ -3400,54 +3413,69 @@ void menuModelCustomFunctions(uint8_t event)
#endif
}
#if defined(HAPTIC)
else if (sd->func == FUNC_HAPTIC) {
else if (CFN_FUNC(sd) == FUNC_HAPTIC) {
val_max = 3;
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
}
#endif
#if defined(CPUARM) && defined(SDCARD)
else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_BACKGND_MUSIC) {
uint8_t x = (sd->func == FUNC_PLAY_TRACK ? MODEL_CUSTOM_FUNC_2ND_COLUMN + FW + FW*strlen(TR_PLAY_TRACK) : MODEL_CUSTOM_FUNC_3RD_COLUMN);
if (ZLEN(sd->param))
lcd_putsnAtt(x, y, sd->param, sizeof(sd->param), attr);
else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK || CFN_FUNC(sd) == FUNC_BACKGND_MUSIC) {
uint8_t x = (CFN_FUNC(sd) == FUNC_PLAY_TRACK ? MODEL_CUSTOM_FUNC_2ND_COLUMN + FW + FW*strlen(TR_PLAY_TRACK) : MODEL_CUSTOM_FUNC_3RD_COLUMN);
if (ZLEN(sd->param.name))
lcd_putsnAtt(x, y, sd->param.name, sizeof(sd->param.name), attr);
else
lcd_putsiAtt(x, y, STR_VCSWFUNC, 0, attr);
if (active && event==EVT_KEY_BREAK(KEY_ENTER)) {
s_editMode = 0;
_event = 0;
if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT, sizeof(sd->param), sd->param)) {
if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT, sizeof(sd->param.name), sd->param.name)) {
s_warning = STR_NO_SOUNDS_ON_SD;
s_menu_flags = 0;
}
}
break;
}
else if (sd->func == FUNC_PLAY_VALUE) {
val_max = MIXSRC_LAST_CH + TELEM_DISPLAY_MAX - 1;
else if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) {
val_max = MIXSRC_FIRST_TELEM + TELEM_DISPLAY_MAX - 2;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
#endif
#if defined(CPUARM)
else if (sd->func == FUNC_VOLUME) {
else if (CFN_FUNC(sd) == FUNC_VOLUME) {
val_max = MIXSRC_LAST_CH-1;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
#elif defined(VOICE)
else if (sd->func == FUNC_PLAY_TRACK) {
else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK) {
#if defined(GVARS)
if (attr && event==EVT_KEY_LONG(KEY_ENTER)) {
killEvents(event);
s_editMode = !s_editMode;
active = true;
val_displayed = (val_displayed > 250 ? 0 : 251);
}
if (val_displayed > 250) {
putsStrIdx(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_GV, val_displayed-250, attr);
}
else {
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+PROMPT_CUSTOM_BASE, attr|LEFT);
}
#else
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+PROMPT_CUSTOM_BASE, attr|LEFT);
#endif
}
else if (sd->func == FUNC_PLAY_BOTH) {
else if (CFN_FUNC(sd) == FUNC_PLAY_BOTH) {
lcd_putcAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN-2+3*FWNUM, y, '|', attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+3*FWNUM, y, val_displayed+PROMPT_CUSTOM_BASE, attr);
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+2+3*FWNUM, y, (val_displayed+PROMPT_CUSTOM_BASE+1)%10, attr|LEFT);
}
else if (sd->func == FUNC_PLAY_VALUE) {
val_max = MIXSRC_LAST_CH + TELEM_DISPLAY_MAX - 1;
else if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) {
val_max = MIXSRC_FIRST_TELEM + TELEM_DISPLAY_MAX - 2;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
}
#endif
#if defined(SDCARD)
else if (sd->func == FUNC_LOGS) {
else if (CFN_FUNC(sd) == FUNC_LOGS) {
if (val_displayed) {
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|PREC1|LEFT);
lcd_putc(lcdLastPos, y, 's');
@@ -3457,23 +3485,46 @@ void menuModelCustomFunctions(uint8_t event)
}
}
#endif
else if (sd->func == FUNC_RESET) {
else if (CFN_FUNC(sd) == FUNC_RESET) {
val_max = 3;
lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, CFN_PARAM(sd), attr);
}
else if (sd->func <= FUNC_SAFETY_CH16) {
else if (CFN_FUNC(sd) < FUNC_TRAINER) {
val_displayed = (int8_t)CFN_PARAM(sd);
val_min = -125; val_max = 125;
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
}
#if defined(GVARS)
else if (sd->func >= FUNC_ADJUST_GV1
else if (CFN_FUNC(sd) >= FUNC_ADJUST_GV1
#if defined(DEBUG)
&& sd->func != FUNC_TEST
&& CFN_FUNC(sd) <= FUNC_ADJUST_GV5
#endif
) {
val_max = MIXSRC_LAST_CH-1;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
switch (CFN_GVAR_MODE(sd)) {
case 0:
val_min = -125; val_max = +125;
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
break;
case 1:
val_max = MIXSRC_LAST_CH-1;
putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr);
break;
case 2:
val_max = MAX_GVARS-1;
putsStrIdx(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_GV, val_displayed+1, attr);
break;
default:
val_max = 1;
lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, PSTR("\002+1-1"), val_displayed, attr);
break;
}
if (attr && event==EVT_KEY_LONG(KEY_ENTER)) {
s_editMode = !s_editMode;
killEvents(event);
CFN_GVAR_MODE(sd) += 1;
val_displayed = 0;
}
}
#endif
else {
@@ -3491,24 +3542,31 @@ void menuModelCustomFunctions(uint8_t event)
break;
case 3:
if (sd->swtch && sd->func <= FUNC_INSTANT_TRIM) {
menu_lcd_onoff(MODEL_CUSTOM_FUNC_4TH_COLUMN, y, sd->active, attr);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 1);
if (sd->swtch && (CFN_FUNC(sd) <= FUNC_INSTANT_TRIM
#if defined(GVARS)
|| CFN_FUNC(sd) >= FUNC_ADJUST_GV1
#endif
#if defined(CPUARM)
|| CFN_FUNC(sd) == FUNC_VOLUME
#endif
)) {
menu_lcd_onoff(MODEL_CUSTOM_FUNC_4TH_COLUMN, y, CFN_ACTIVE(sd), attr);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_ACTIVE(sd), 1);
}
#if defined(VOICE)
else if (sd->swtch && sd->func >= FUNC_PLAY_TRACK && sd->func <= FUNC_PLAY_VALUE) {
else if (sd->swtch && CFN_FUNC(sd) >= FUNC_PLAY_TRACK && CFN_FUNC(sd) <= FUNC_PLAY_VALUE) {
#if defined(CPUARM)
if (sd->active)
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, sd->active*5, attr);
if (CFN_PLAY_REPEAT(sd))
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, CFN_PLAY_REPEAT(sd)*5, attr);
else
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+1, y, '-', attr);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 12);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_PLAY_REPEAT(sd), 12);
#else
if (sd->active)
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, 15 << (sd->active-1), attr);
if (CFN_PLAY_REPEAT(sd))
lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, CFN_PLAY_REPEAT(sd)*10, attr);
else
lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+1, y, '-', attr);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 3);
if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_PLAY_REPEAT(sd), 6);
#endif
}
#endif
@@ -3532,7 +3590,7 @@ void menuModelCustomFunctions(uint8_t event)
}
else {
// The user choosed a wav file in the list
memcpy(g_model.funcSw[sub].param, result, sizeof(g_model.funcSw[sub].param));
memcpy(g_model.funcSw[sub].param.name, result, sizeof(g_model.funcSw[sub].param.name));
eeDirty(EE_MODEL);
}
}
+67 -8
View File
@@ -190,6 +190,8 @@ PACK(typedef struct t_EEGeneral {
uint8_t unexpectedShutdown:1;
uint8_t speakerPitch;
int8_t speakerVolume;
int8_t vBatMin;
int8_t vBatMax;
EXTRA_GENERAL_FIELDS;
@@ -345,8 +347,15 @@ PACK(typedef struct t_CustomSwData { // Custom Switches data
#endif
enum Functions {
#if defined(CPUARM)
FUNC_SAFETY_CH1,
FUNC_SAFETY_CH16=FUNC_SAFETY_CH1+15,
#else
FUNC_SAFETY_GROUP1,
FUNC_SAFETY_GROUP2,
FUNC_SAFETY_GROUP3,
FUNC_SAFETY_GROUP4,
#endif
FUNC_TRAINER,
FUNC_TRAINER_RUD,
FUNC_TRAINER_ELE,
@@ -401,20 +410,52 @@ enum ResetFunctionParam {
#if defined(CPUARM)
PACK(typedef struct t_CustomFnData { // Function Switches data
int8_t swtch; //input
int8_t swtch;
uint8_t func;
char param[6];
uint8_t active;
union {
char name[6];
struct {
uint32_t val;
uint16_t spare;
} composite;
} param;
uint8_t mode:2;
uint8_t active:6;
}) CustomFnData;
#define CFN_PARAM(p) (*((uint32_t*)(p)->param))
#define CFN_RESET_PARAM(p) memset(p->param, 0, sizeof(p->param))
#define CFN_FUNC(p) ((p)->func)
#define CFN_ACTIVE(p) ((p)->active)
#define CFN_CH_NUMBER(p) (CFN_FUNC(p))
#define CFN_PLAY_REPEAT(p) ((p)->active)
#define CFN_GVAR_MODE(p) ((p)->mode)
#define CFN_PARAM(p) ((p)->param.composite.val)
#define CFN_RESET_PARAM(p) memset(&(p)->param, 0, sizeof((p)->param))
#else
PACK(typedef struct t_CustomFnData { // Function Switches data
int8_t swtch; // input
uint8_t func:6;
uint8_t active:2;
union {
struct {
uint8_t param:3;
uint8_t func:5;
} func_param;
struct {
uint8_t active:1;
uint8_t param:2;
uint8_t func:5;
} func_param_enable;
struct {
uint8_t active:1;
uint8_t func:7;
} func_safety;
} internal;
uint8_t param;
}) CustomFnData;
#define CFN_FUNC(p) ((p)->internal.func_param.func)
#define CFN_ACTIVE(p) ((p)->internal.func_param_enable.active)
#define CFN_CH_NUMBER(p) ((p)->internal.func_safety.func)
#define CFN_PLAY_REPEAT(p) ((p)->internal.func_param.param)
#define CFN_GVAR_MODE(p) ((p)->internal.func_param_enable.param)
#define CFN_PARAM(p) ((p)->param)
#define CFN_RESET_PARAM(p) CFN_PARAM(p) = 0
#endif
@@ -521,6 +562,18 @@ enum VarioSource {
VARIO_SOURCE_LAST = VARIO_SOURCE_A2
};
#if defined(FRSKY_HUB)
#define NUM_TELEMETRY TELEM_CSW_MAX
#elif defined(WS_HOW_HIGH)
#define NUM_TELEMETRY TELEM_ALT
#elif defined(FRSKY)
#define NUM_TELEMETRY TELEM_A2
#elif defined(MAVLINK)
#define NUM_TELEMETRY 4
#else
#define NUM_TELEMETRY TELEM_TM2
#endif
PACK(typedef struct t_FrSkyBarData {
uint8_t source;
uint8_t barMin; // minimum for bar display
@@ -918,7 +971,13 @@ enum MixSources {
MIXSRC_CH14,
MIXSRC_CH15,
MIXSRC_CH16,
MIXSRC_LAST_CH = MIXSRC_CH1+NUM_CHNOUT-1
MIXSRC_LAST_CH = MIXSRC_CH1+NUM_CHNOUT-1,
MIXSRC_GVAR1,
MIXSRC_LAST_GVAR = MIXSRC_GVAR1+MAX_GVARS-1,
MIXSRC_FIRST_TELEM,
MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+NUM_TELEMETRY-1,
};
#define MIN_POINTS 3
+135 -104
View File
@@ -706,37 +706,40 @@ int16_t getValue(uint8_t i)
else if (i<MIXSRC_PPM1+NUM_CAL_PPM) return (g_ppmIns[i+1-MIXSRC_PPM1] - g_eeGeneral.trainer.calib[i+1-MIXSRC_PPM1])*2;
else if (i<MIXSRC_LAST_PPM) return g_ppmIns[i+1-MIXSRC_PPM1]*2;
else if (i<MIXSRC_LAST_CH) return ex_chans[i+1-MIXSRC_CH1];
else if (i<MIXSRC_LAST_CH+TELEM_TX_VOLTAGE) return g_vbat100mV;
else if (i<MIXSRC_LAST_CH+TELEM_TM2) return s_timerVal[i+1-MIXSRC_LAST_CH-TELEM_TM1];
#if defined(GVARS)
else if (i<MIXSRC_LAST_GVAR) return GVAR_VALUE(i+1-MIXSRC_GVAR1, getGVarFlightPhase(s_perout_flight_phase, i+1-MIXSRC_GVAR1));
#endif
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE) return g_vbat100mV;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_TM2) return s_timerVal[i+1-MIXSRC_FIRST_TELEM+1-TELEM_TM1];
#if defined(FRSKY)
else if (i<MIXSRC_LAST_CH+TELEM_RSSI_TX) return frskyData.rssi[1].value;
else if(i<MIXSRC_LAST_CH+TELEM_RSSI_RX) return frskyData.rssi[0].value;
else if(i<MIXSRC_LAST_CH+TELEM_A2) return frskyData.analog[i+1-MIXSRC_LAST_CH-TELEM_A1].value;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX) return frskyData.rssi[1].value;
else if(i<MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX) return frskyData.rssi[0].value;
else if(i<MIXSRC_FIRST_TELEM-1+TELEM_A2) return frskyData.analog[i+1-MIXSRC_FIRST_TELEM+1-TELEM_A1].value;
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
else if(i<MIXSRC_LAST_CH+TELEM_ALT) return frskyData.hub.baroAltitude_bp;
else if(i<MIXSRC_FIRST_TELEM-1+TELEM_ALT) return frskyData.hub.baroAltitude_bp;
#endif
#if defined(FRSKY_HUB)
else if (i<MIXSRC_LAST_CH+TELEM_RPM) return frskyData.hub.rpm;
else if (i<MIXSRC_LAST_CH+TELEM_FUEL) return frskyData.hub.fuelLevel;
else if (i<MIXSRC_LAST_CH+TELEM_T1) return frskyData.hub.temperature1;
else if (i<MIXSRC_LAST_CH+TELEM_T2) return frskyData.hub.temperature2;
else if (i<MIXSRC_LAST_CH+TELEM_SPEED) return frskyData.hub.gpsSpeed_bp;
else if (i<MIXSRC_LAST_CH+TELEM_DIST) return frskyData.hub.gpsDistance;
else if (i<MIXSRC_LAST_CH+TELEM_GPSALT) return frskyData.hub.gpsAltitude_bp;
else if (i<MIXSRC_LAST_CH+TELEM_CELL) return (int16_t)frskyData.hub.minCellVolts * 2;
else if (i<MIXSRC_LAST_CH+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum;
else if (i<MIXSRC_LAST_CH+TELEM_VFAS) return (int16_t)frskyData.hub.vfas;
else if (i<MIXSRC_LAST_CH+TELEM_CURRENT) return (int16_t)frskyData.hub.current;
else if (i<MIXSRC_LAST_CH+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if (i<MIXSRC_LAST_CH+TELEM_POWER) return frskyData.power;
else if (i<MIXSRC_LAST_CH+TELEM_ACCx) return frskyData.hub.accelX;
else if (i<MIXSRC_LAST_CH+TELEM_ACCy) return frskyData.hub.accelY;
else if (i<MIXSRC_LAST_CH+TELEM_ACCz) return frskyData.hub.accelZ;
else if (i<MIXSRC_LAST_CH+TELEM_HDG) return frskyData.hub.gpsCourse_bp;
else if (i<MIXSRC_LAST_CH+TELEM_VSPD) return frskyData.hub.varioSpeed;
else if (i<MIXSRC_LAST_CH+TELEM_MIN_A1) return frskyData.analog[0].min;
else if (i<MIXSRC_LAST_CH+TELEM_MIN_A2) return frskyData.analog[1].min;
else if (i<MIXSRC_LAST_CH+TELEM_MAX_CURRENT) return *(((int16_t*)(&frskyData.hub.minAltitude))+i+1-(MIXSRC_LAST_CH+TELEM_MAX_CURRENT));
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_RPM) return frskyData.hub.rpm;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_FUEL) return frskyData.hub.fuelLevel;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_T1) return frskyData.hub.temperature1;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_T2) return frskyData.hub.temperature2;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_SPEED) return frskyData.hub.gpsSpeed_bp;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_DIST) return frskyData.hub.gpsDistance;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_GPSALT) return frskyData.hub.gpsAltitude_bp;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_CELL) return (int16_t)frskyData.hub.minCellVolts * 2;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_VFAS) return (int16_t)frskyData.hub.vfas;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_CURRENT) return (int16_t)frskyData.hub.current;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_POWER) return frskyData.power;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_ACCx) return frskyData.hub.accelX;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_ACCy) return frskyData.hub.accelY;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_ACCz) return frskyData.hub.accelZ;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_HDG) return frskyData.hub.gpsCourse_bp;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_VSPD) return frskyData.hub.varioSpeed;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1) return frskyData.analog[0].min;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2) return frskyData.analog[1].min;
else if (i<MIXSRC_FIRST_TELEM-1+TELEM_MAX_CURRENT) return *(((int16_t*)(&frskyData.hub.minAltitude))+i+1-(MIXSRC_FIRST_TELEM-1+TELEM_MAX_CURRENT));
#endif
#endif
else return 0;
@@ -835,15 +838,15 @@ bool __getSwitch(int8_t swtch)
else {
#if defined(FRSKY)
// Telemetry
if (cs->v1 > MIXSRC_LAST_CH) {
if (frskyStreaming <= 0 && cs->v1 > MIXSRC_LAST_CH+MAX_TIMERS)
if (cs->v1 >= MIXSRC_FIRST_TELEM) {
if (frskyStreaming <= 0 && cs->v1 > MIXSRC_FIRST_TELEM-1+MAX_TIMERS)
return swtch > 0 ? false : true;
y = convertCswTelemValue(cs);
#if defined(FRSKY_HUB)
if (s == CS_VOFS) {
uint8_t idx = cs->v1-MIXSRC_LAST_CH-TELEM_ALT;
uint8_t idx = cs->v1-MIXSRC_FIRST_TELEM+1-TELEM_ALT;
if (idx < THLD_MAX) {
// Fill the threshold array
barsThresholds[idx] = 128 + cs->v2;
@@ -855,7 +858,7 @@ bool __getSwitch(int8_t swtch)
y = calc100toRESX(cs->v2);
}
#else
if (cs->v1 > MIXSRC_LAST_CH) {
if (cs->v1 >= MIXSRC_FIRST_TELEM) {
y = cs->v2; // it's a timer
}
else {
@@ -865,7 +868,12 @@ bool __getSwitch(int8_t swtch)
switch (cs->func) {
case CS_VEQUAL:
result = (abs(x-y) < STICK_TOLERANCE);
#if defined(GVARS)
if (cs->v1 >= MIXSRC_GVAR1 && cs->v1 <= MIXSRC_LAST_GVAR)
result = (x==y);
else
#endif
result = (abs(x-y) < (1024 / STICK_TOLERANCE));
break;
case CS_VPOS:
result = (x>y);
@@ -1955,25 +1963,25 @@ PLAY_FUNCTION(playValue, uint8_t idx)
// TODO add the MIXSRC_TELEM_TM1 and so on.
switch (idx) {
case MIXSRC_LAST_CH+TELEM_TX_VOLTAGE-1:
case MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE-1:
PLAY_NUMBER(val, 1+UNIT_VOLTS, PREC1);
break;
case MIXSRC_LAST_CH+TELEM_TM1-1:
case MIXSRC_LAST_CH+TELEM_TM2-1:
case MIXSRC_FIRST_TELEM-1+TELEM_TM1-1:
case MIXSRC_FIRST_TELEM-1+TELEM_TM2-1:
PLAY_DURATION(val);
break;
#if defined(FRSKY)
case MIXSRC_LAST_CH+TELEM_RSSI_TX-1:
case MIXSRC_LAST_CH+TELEM_RSSI_RX-1:
case MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX-1:
case MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX-1:
PLAY_NUMBER(val, 1+UNIT_DBM, 0);
break;
case MIXSRC_LAST_CH+TELEM_MIN_A1-1:
case MIXSRC_LAST_CH+TELEM_MIN_A2-1:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1-1:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2-1:
idx -= TELEM_MIN_A1-TELEM_A1;
// no break
case MIXSRC_LAST_CH+TELEM_A1-1:
case MIXSRC_LAST_CH+TELEM_A2-1:
idx -= (MIXSRC_LAST_CH+TELEM_A1-1);
case MIXSRC_FIRST_TELEM-1+TELEM_A1-1:
case MIXSRC_FIRST_TELEM-1+TELEM_A2-1:
idx -= (MIXSRC_FIRST_TELEM-1+TELEM_A1-1);
// A1 and A2
{
uint8_t att = 0;
@@ -1985,41 +1993,41 @@ PLAY_FUNCTION(playValue, uint8_t idx)
break;
}
case MIXSRC_LAST_CH+TELEM_CELL-1:
case MIXSRC_FIRST_TELEM-1+TELEM_CELL-1:
PLAY_NUMBER(val/10, 1+UNIT_VOLTS, PREC1);
break;
case MIXSRC_LAST_CH+TELEM_VFAS-1:
case MIXSRC_LAST_CH+TELEM_CELLS_SUM-1:
case MIXSRC_FIRST_TELEM-1+TELEM_VFAS-1:
case MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM-1:
PLAY_NUMBER(val, 1+UNIT_VOLTS, PREC1);
break;
case MIXSRC_LAST_CH+TELEM_CURRENT-1:
case MIXSRC_LAST_CH+TELEM_MAX_CURRENT-1:
case MIXSRC_FIRST_TELEM-1+TELEM_CURRENT-1:
case MIXSRC_FIRST_TELEM-1+TELEM_MAX_CURRENT-1:
PLAY_NUMBER(val, 1+UNIT_AMPS, PREC1);
break;
case MIXSRC_LAST_CH+TELEM_ACCx-1:
case MIXSRC_LAST_CH+TELEM_ACCy-1:
case MIXSRC_LAST_CH+TELEM_ACCz-1:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCx-1:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCy-1:
case MIXSRC_FIRST_TELEM-1+TELEM_ACCz-1:
PLAY_NUMBER(val/10, 1+UNIT_G, PREC1);
break;
case MIXSRC_LAST_CH+TELEM_VSPD-1:
case MIXSRC_FIRST_TELEM-1+TELEM_VSPD-1:
PLAY_NUMBER(val/10, 1+UNIT_METERS_PER_SECOND, PREC1);
break;
case MIXSRC_LAST_CH+TELEM_CONSUMPTION-1:
case MIXSRC_FIRST_TELEM-1+TELEM_CONSUMPTION-1:
PLAY_NUMBER(val, 1+UNIT_MAH, 0);
break;
case MIXSRC_LAST_CH+TELEM_POWER-1:
case MIXSRC_FIRST_TELEM-1+TELEM_POWER-1:
PLAY_NUMBER(val, 1+UNIT_WATTS, 0);
break;
case MIXSRC_LAST_CH+TELEM_ALT-1:
case MIXSRC_LAST_CH+TELEM_MIN_ALT-1:
case MIXSRC_LAST_CH+TELEM_MAX_ALT-1:
case MIXSRC_FIRST_TELEM-1+TELEM_ALT-1:
case MIXSRC_FIRST_TELEM-1+TELEM_MIN_ALT-1:
case MIXSRC_FIRST_TELEM-1+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);
@@ -2028,24 +2036,24 @@ PLAY_FUNCTION(playValue, uint8_t idx)
PLAY_NUMBER(val, 1+UNIT_METERS, 0);
break;
case MIXSRC_LAST_CH+TELEM_RPM-1:
case MIXSRC_LAST_CH+TELEM_MAX_RPM-1:
case MIXSRC_FIRST_TELEM-1+TELEM_RPM-1:
case MIXSRC_FIRST_TELEM-1+TELEM_MAX_RPM-1:
PLAY_NUMBER(val, 1+UNIT_RPMS, 0);
break;
case MIXSRC_LAST_CH+TELEM_HDG-1:
case MIXSRC_FIRST_TELEM-1+TELEM_HDG-1:
PLAY_NUMBER(val, 1+UNIT_DEGREES, 0);
break;
default:
{
uint8_t unit = 1;
if (idx < MIXSRC_LAST_CH+TELEM_TM1-1)
if (idx < MIXSRC_FIRST_TELEM-1+TELEM_TM1-1)
val = calcRESXto100(val);
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);
if (idx >= MIXSRC_FIRST_TELEM-1+TELEM_ALT-1 && idx <= MIXSRC_FIRST_TELEM-1+TELEM_GPSALT-1)
unit = idx - (MIXSRC_FIRST_TELEM-1+TELEM_ALT-1);
else if (idx >= MIXSRC_FIRST_TELEM-1+TELEM_MAX_T1-1 && idx <= MIXSRC_FIRST_TELEM-1+TELEM_MAX_DIST-1)
unit = 3 + idx - (MIXSRC_FIRST_TELEM-1+TELEM_MAX_T1-1);
unit = pgm_read_byte(bchunit_ar+unit);
#if !defined(IMPERIAL_UNITS)
@@ -2078,8 +2086,8 @@ uint8_t fnSwitchDuration[NUM_CFN] = { 0 };
inline void playCustomFunctionFile(CustomFnData *sd, uint8_t id)
{
char lfn[] = SOUNDS_PATH "/xxxxxx.wav";
strncpy(lfn+sizeof(SOUNDS_PATH), sd->param, sizeof(sd->param));
lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param)] = '\0';
strncpy(lfn+sizeof(SOUNDS_PATH), sd->param.name, sizeof(sd->param.name));
lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param.name)] = '\0';
strcat(lfn+sizeof(SOUNDS_PATH), SOUNDS_EXT);
PLAY_FILE(lfn, sd->func==FUNC_BACKGND_MUSIC ? PLAY_BACKGROUND : 0, id);
}
@@ -2108,7 +2116,7 @@ void evalFunctions()
CustomFnData *sd = &g_model.funcSw[i];
int8_t swtch = sd->swtch;
if (swtch) {
MASK_FUNC_TYPE function_mask = (sd->func >= FUNC_TRAINER ? ((MASK_FUNC_TYPE)1 << (sd->func-FUNC_TRAINER)) : 0);
MASK_FUNC_TYPE function_mask = (CFN_FUNC(sd) >= FUNC_TRAINER ? ((MASK_FUNC_TYPE)1 << (CFN_FUNC(sd)-FUNC_TRAINER)) : 0);
MASK_CFN_TYPE switch_mask = ((MASK_CFN_TYPE)1 << i);
uint8_t momentary = 0;
@@ -2158,7 +2166,7 @@ void evalFunctions()
active = !(activeFnSwitches & switch_mask);
#if !defined(CPUARM)
if (sd->func == FUNC_PLAY_BOTH && !active) {
if (CFN_FUNC(sd) == FUNC_PLAY_BOTH && !active) {
momentary = 1;
}
else
@@ -2184,19 +2192,19 @@ void evalFunctions()
#endif
}
#if !defined(CPUARM)
else if (sd->func == FUNC_PLAY_BOTH) {
else if (CFN_FUNC(sd) == FUNC_PLAY_BOTH) {
momentary = 1;
}
#endif
if (active || momentary) {
if (sd->active) {
if (sd->func < FUNC_TRAINER) {
safetyCh[sd->func] = CFN_PARAM(sd);
if (CFN_ACTIVE(sd)) {
if (CFN_FUNC(sd) < FUNC_TRAINER) {
safetyCh[CFN_FUNC(sd)] = CFN_CH_NUMBER(sd);
}
if (!(activeFunctions & function_mask)) {
if (sd->func == FUNC_INSTANT_TRIM) {
if (CFN_FUNC(sd) == FUNC_INSTANT_TRIM) {
if (g_menuStack[0] == menuMainView
#if defined(FRSKY)
|| g_menuStack[0] == menuTelemetryFrsky
@@ -2206,18 +2214,17 @@ void evalFunctions()
}
}
}
else if (sd->func <= FUNC_INSTANT_TRIM) {
function_mask = 0;
switch_mask = 0;
else if (CFN_FUNC(sd) <= FUNC_INSTANT_TRIM) {
active = false;
}
#if defined(SDCARD)
if (sd->func == FUNC_LOGS) {
if (CFN_FUNC(sd) == FUNC_LOGS) {
logDelay = CFN_PARAM(sd);
}
#endif
if (sd->func == FUNC_RESET) {
if (CFN_FUNC(sd) == FUNC_RESET) {
switch (CFN_PARAM(sd)) {
case FUNC_RESET_TIMER1:
case FUNC_RESET_TIMER2:
@@ -2242,24 +2249,24 @@ void evalFunctions()
}
}
if (sd->func == FUNC_PLAY_SOUND) {
if (CFN_FUNC(sd) == FUNC_PLAY_SOUND) {
AUDIO_PLAY(AU_FRSKY_FIRST+CFN_PARAM(sd));
}
#if defined(HAPTIC)
if (sd->func == FUNC_HAPTIC) {
if (CFN_FUNC(sd) == FUNC_HAPTIC) {
haptic.event(AU_FRSKY_LAST+CFN_PARAM(sd));
}
#endif
#if defined(CPUARM) && defined(SDCARD)
else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_PLAY_VALUE) {
else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK || CFN_FUNC(sd) == FUNC_PLAY_VALUE) {
tmr10ms_t tmr10ms = get_tmr10ms();
uint8_t repeatParam = sd->active;
uint8_t repeatParam = CFN_PLAY_REPEAT(sd);
if (!lastFunctionTime[i] || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=500*repeatParam)) {
if (!IS_PLAYING(i+1)) {
lastFunctionTime[i] = tmr10ms;
if (sd->func == FUNC_PLAY_VALUE) {
if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) {
PLAY_VALUE(CFN_PARAM(sd), i+1);
}
else {
@@ -2268,51 +2275,75 @@ void evalFunctions()
}
}
}
else if (sd->func == FUNC_BACKGND_MUSIC) {
else if (CFN_FUNC(sd) == FUNC_BACKGND_MUSIC) {
if (!IS_PLAYING(i+1)) {
playCustomFunctionFile(sd, i+1);
}
}
else if (sd->func == FUNC_VOLUME) {
requiredSpeakerVolume = ((1024 + getValue(CFN_PARAM(sd))) * VOLUME_LEVEL_MAX) / 2048;
else if (CFN_FUNC(sd) == FUNC_VOLUME) {
if (CFN_ACTIVE(sd)) {
requiredSpeakerVolume = ((1024 + getValue(CFN_PARAM(sd))) * VOLUME_LEVEL_MAX) / 2048;
}
else {
active = false;
}
}
#elif defined(VOICE)
else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_PLAY_BOTH || sd->func == FUNC_PLAY_VALUE) {
else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK || CFN_FUNC(sd) == FUNC_PLAY_BOTH || CFN_FUNC(sd) == FUNC_PLAY_VALUE) {
tmr10ms_t tmr10ms = get_tmr10ms();
uint8_t repeatParam = sd->active;
if (!lastFunctionTime[i] || (sd->func==FUNC_PLAY_BOTH && active!=(bool)(activeFnSwitches&switch_mask)) || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=(1500<<(repeatParam-1)))) {
uint8_t repeatParam = CFN_PLAY_REPEAT(sd);
if (!lastFunctionTime[i] || (CFN_FUNC(sd)==FUNC_PLAY_BOTH && active!=(bool)(activeFnSwitches&switch_mask)) || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=1000*repeatParam)) {
lastFunctionTime[i] = tmr10ms;
if (sd->func == FUNC_PLAY_VALUE) {
PLAY_VALUE(CFN_PARAM(sd), i+1);
uint8_t param = CFN_PARAM(sd);
if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) {
PLAY_VALUE(param, i+1);
}
else {
PUSH_CUSTOM_PROMPT(active ? sd->param : sd->param+1, i+1);
if (CFN_FUNC(sd) == FUNC_PLAY_TRACK && param > 250)
param = GVAR_VALUE(param-251, getGVarFlightPhase(s_perout_flight_phase, param-251));
PUSH_CUSTOM_PROMPT(active ? param : param+1, i+1);
}
}
}
#endif
#if defined(DEBUG)
else if (sd->func == FUNC_TEST) {
else if (CFN_FUNC(sd) == FUNC_TEST) {
testFunc();
}
#endif
#if defined(GVARS)
else if (sd->func >= FUNC_ADJUST_GV1) {
if (CFN_PARAM(sd) >= MIXSRC_TrimRud-1 && CFN_PARAM(sd) <= MIXSRC_TrimAil-1) {
trimGvar[CFN_PARAM(sd)-MIXSRC_TrimRud+1] = sd->func-FUNC_ADJUST_GV1;
}
else if (CFN_FUNC(sd) >= FUNC_ADJUST_GV1) {
if (CFN_ACTIVE(sd)) {
if (CFN_GVAR_MODE(sd) == 0) {
SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, CFN_PARAM(sd), s_perout_flight_phase);
}
else if (CFN_GVAR_MODE(sd) == 2) {
SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, GVAR_VALUE(CFN_PARAM(sd), s_perout_flight_phase), s_perout_flight_phase);
}
else if (CFN_GVAR_MODE(sd) == 3) {
if (!(activeFnSwitches & switch_mask)) {
SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, GVAR_VALUE(CFN_FUNC(sd)-FUNC_ADJUST_GV1, getGVarFlightPhase(s_perout_flight_phase, CFN_FUNC(sd)-FUNC_ADJUST_GV1)) + (CFN_PARAM(sd) ? +1 : -1), s_perout_flight_phase);
}
}
else if (CFN_PARAM(sd) >= MIXSRC_TrimRud-1 && CFN_PARAM(sd) <= MIXSRC_TrimAil-1) {
trimGvar[CFN_PARAM(sd)-MIXSRC_TrimRud+1] = CFN_FUNC(sd)-FUNC_ADJUST_GV1;
}
#if defined(ROTARY_ENCODERS)
else if (CFN_PARAM(sd) >= MIXSRC_REa-1 && CFN_PARAM(sd) < MIXSRC_TrimRud-1) {
int8_t scroll = rePreviousValues[CFN_PARAM(sd)-MIXSRC_REa+1] - (g_rotenc[CFN_PARAM(sd)-MIXSRC_REa+1] / ROTARY_ENCODER_GRANULARITY);
if (scroll) {
SET_GVAR(sd->func-FUNC_ADJUST_GV1, GVAR_VALUE(sd->func-FUNC_ADJUST_GV1, s_perout_flight_phase) + scroll, s_perout_flight_phase);
else if (CFN_PARAM(sd) >= MIXSRC_REa-1 && CFN_PARAM(sd) < MIXSRC_TrimRud-1) {
int8_t scroll = rePreviousValues[CFN_PARAM(sd)-MIXSRC_REa+1] - (g_rotenc[CFN_PARAM(sd)-MIXSRC_REa+1] / ROTARY_ENCODER_GRANULARITY);
if (scroll) {
SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, GVAR_VALUE(CFN_FUNC(sd)-FUNC_ADJUST_GV1, getGVarFlightPhase(s_perout_flight_phase, CFN_FUNC(sd)-FUNC_ADJUST_GV1)) + scroll, s_perout_flight_phase);
}
}
#endif
else {
SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(CFN_PARAM(sd)), (int16_t)1250) / 10, s_perout_flight_phase);
}
}
#endif
else {
SET_GVAR(sd->func-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(CFN_PARAM(sd)), (int16_t)1250) / 10, s_perout_flight_phase);
active = false;
}
}
#endif
@@ -2328,7 +2359,7 @@ void evalFunctions()
fnSwitchDuration[i] = 0;
#endif
#if defined(CPUARM) && defined(SDCARD)
if (sd->func == FUNC_BACKGND_MUSIC && isFunctionActive(FUNC_BACKGND_MUSIC)) {
if (CFN_FUNC(sd) == FUNC_BACKGND_MUSIC && isFunctionActive(FUNC_BACKGND_MUSIC)) {
STOP_PLAY(i+1);
}
#endif
+6 -12
View File
@@ -68,6 +68,12 @@
#define IF_CPUARM(x)
#endif
#if defined(BATTGRAPH)
#define IF_BATTGRAPH(x) x,
#else
#define IF_BATTGRAPH(x)
#endif
#if defined(RTCLOCK)
#define IF_RTCLOCK(x) x,
#else
@@ -534,18 +540,6 @@ enum CswFunctions {
#define NUM_CAL_PPM 4
#define NUM_PPM 8
#if defined(FRSKY_HUB)
#define NUM_TELEMETRY TELEM_CSW_MAX
#elif defined(WS_HOW_HIGH)
#define NUM_TELEMETRY TELEM_ALT
#elif defined(FRSKY)
#define NUM_TELEMETRY TELEM_A2
#elif defined(MAVLINK)
#define NUM_TELEMETRY 4
#else
#define NUM_TELEMETRY TELEM_TM2
#endif
#define THRCHK_DEADBAND 16
#if defined(FSPLASH) || defined(XSPLASH)