diff --git a/src/eeprom_arm.cpp b/src/eeprom_arm.cpp index e3d6b0ddd..d1dbda47e 100644 --- a/src/eeprom_arm.cpp +++ b/src/eeprom_arm.cpp @@ -686,7 +686,6 @@ void eeWaitFinished() #ifdef SIMU sleep(5/*ms*/); #endif - // TODO perMain()? } } diff --git a/src/frsky.cpp b/src/frsky.cpp index 1b0b9d47d..fe9c176a9 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -66,22 +66,6 @@ FrskyData frskyData; uint8_t barsThresholds[THLD_MAX]; #endif -void frskyPushValue(uint8_t *&ptr, uint8_t value) -{ - // byte stuff the only byte than might need it - if (value == START_STOP) { - *ptr++ = 0x5e; - *ptr++ = BYTESTUFF; - } - else if (value == BYTESTUFF) { - *ptr++ = 0x5d; - *ptr++ = BYTESTUFF; - } - else { - *ptr++ = value; - } -} - #ifdef DISPLAY_USER_DATA /* Copies all available bytes (up to max bufsize) from frskyUserData circular @@ -563,50 +547,118 @@ void frskyTransmitBuffer() #endif uint8_t frskyAlarmsSendState = 0 ; + +#if defined(PCBARM) +void frskyPushValue(uint8_t *&ptr, uint8_t value) +{ + // byte stuff the only byte than might need it + if (value == START_STOP) { + *ptr++ = BYTESTUFF; + *ptr++ = 0x5e; + } + else if (value == BYTESTUFF) { + *ptr++ = BYTESTUFF; + *ptr++ = 0x5d; + } + else { + *ptr++ = value; + } +} + inline void FRSKY10mspoll(void) { -#if defined(PCBARM) if (txPdcPending()) -#else - if (frskyTxBufferCount) -#endif return; // we only have one buffer. If it's in use, then we can't send yet. uint8_t *ptr = &frskyTxBuffer[0]; + *ptr++ = START_STOP; // Start of packet + + // Now send a packet + frskyAlarmsSendState -= 1; + uint8_t alarm = 1 - (frskyAlarmsSendState % 2); + if (frskyAlarmsSendState < 4) { + uint8_t channel = 1 - (frskyAlarmsSendState / 2); + *ptr++ = (A22PKT + frskyAlarmsSendState); // fc - fb - fa - f9 + frskyPushValue(ptr, g_model.frsky.channels[channel].alarms_value[alarm]); + *ptr++ = ALARM_GREATER(channel, alarm); + *ptr++ = (g_eeGeneral.beeperMode != e_mode_quiet ? ALARM_LEVEL(channel, alarm) : alarm_off); + } + else { + *ptr++ = (RSSI1PKT-alarm); // f7 - f6 + frskyPushValue(ptr, getRssiAlarmValue(alarm)); + *ptr++ = 0x00; + *ptr++ = (g_eeGeneral.beeperMode != e_mode_quiet ? ((2+alarm+g_model.frsky.rssiAlarms[alarm].level) % 4) : alarm_off); + } + + *ptr++ = 0x00; + *ptr++ = 0x00; + *ptr++ = 0x00; + *ptr++ = 0x00; + *ptr++ = 0x00; + *ptr++ = START_STOP; // End of packet + + frskyTransmitBuffer(ptr - &frskyTxBuffer[0]); +} + +#else + +void frskyPushValue(uint8_t *&ptr, uint8_t value) +{ + // byte stuff the only byte than might need it + bool bytestuff = false; + + if (value == START_STOP) { + bytestuff = true; + value = 0x5e; + } + else if (value == BYTESTUFF) { + bytestuff = true; + value = 0x5d; + } + + *ptr++ = value; + if (bytestuff) + *ptr = BYTESTUFF; +} + +void FRSKY_setTxPacket(uint8_t type, uint8_t value, uint8_t p1, uint8_t p2) +{ + uint8_t *ptr = &frskyTxBuffer[0]; + *ptr++ = START_STOP; // End of packet *ptr++ = 0x00; *ptr++ = 0x00; *ptr++ = 0x00; *ptr++ = 0x00; *ptr++ = 0x00; + *ptr++ = (g_eeGeneral.beeperMode == e_mode_quiet ? alarm_off : p2); + *ptr++ = p1; + frskyPushValue(ptr, value); + *ptr++ = type; + *ptr++ = START_STOP; // Start of packet + + frskyTxBufferCount = ptr - &frskyTxBuffer[0]; + frskyTransmitBuffer(); +} + +inline void FRSKY10mspoll(void) +{ + if (frskyTxBufferCount) + return; // we only have one buffer. If it's in use, then we can't send yet. // Now send a packet frskyAlarmsSendState -= 1; uint8_t alarm = 1 - (frskyAlarmsSendState % 2); if (frskyAlarmsSendState < 4) { uint8_t channel = 1 - (frskyAlarmsSendState / 2); - *ptr++ = (g_eeGeneral.beeperMode != e_mode_quiet ? ALARM_LEVEL(channel, alarm) : alarm_off); - *ptr++ = ALARM_GREATER(channel, alarm); - frskyPushValue(ptr, g_model.frsky.channels[channel].alarms_value[alarm]); - *ptr++ = (A22PKT + frskyAlarmsSendState); // fc - fb - fa - f9 + FRSKY_setTxPacket(A22PKT + frskyAlarmsSendState, g_model.frsky.channels[channel].alarms_value[alarm], ALARM_GREATER(channel, alarm), ALARM_LEVEL(channel, alarm)); } else { - *ptr++ = (g_eeGeneral.beeperMode != e_mode_quiet ? ((2+alarm+g_model.frsky.rssiAlarms[alarm].level) % 4) : alarm_off); - *ptr++ = 0x00 ; - frskyPushValue(ptr, getRssiAlarmValue(alarm)); - *ptr++ = (RSSI1PKT-alarm); // f7 - f6 + FRSKY_setTxPacket(RSSI1PKT-alarm, getRssiAlarmValue(alarm), 0, (2+alarm+g_model.frsky.rssiAlarms[alarm].level) % 4); } - - *ptr++ = START_STOP; // Start of packet - -#if defined(PCBARM) - frskyTransmitBuffer(ptr - &frskyTxBuffer[0]); -#else - frskyTxBufferCount = ptr - &frskyTxBuffer[0]; - frskyTransmitBuffer(); -#endif } +#endif void check_frsky() { diff --git a/src/general_menus.cpp b/src/general_menus.cpp index 80b90ba26..6ba99bc46 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -118,7 +118,7 @@ void displaySlider(uint8_t x, uint8_t y, uint8_t value, uint8_t attr) enum menuProcSetupItems { ITEM_SETUP_BEEPER_MODE, -#if defined(PCBARM) +#if defined(VOICE) ITEM_SETUP_SPEAKER_VOLUME, #endif ITEM_SETUP_BEEPER_LENGTH, @@ -212,14 +212,27 @@ void menuProcSetup(uint8_t event) #endif break; -#if defined(PCBARM) +#if defined(VOICE) case ITEM_SETUP_SPEAKER_VOLUME: { lcd_putsLeft(y, STR_SPEAKER_VOLUME); +#if defined(PCBARM) lcd_outdezAtt(GENERAL_PARAM_OFS, y, g_eeGeneral.speakerVolume, attr|LEFT); if (attr) { CHECK_INCDEC_GENVAR(event, g_eeGeneral.speakerVolume, 0, NUM_VOL_LEVELS-1); } +#else + uint8_t b ; + b = g_eeGeneral.speakerVolume+7; + lcd_outdezAtt(GENERAL_PARAM_OFS, y, b, attr|LEFT); + if (attr) { + CHECK_INCDEC_GENVAR(event, b, 0, 7); + if (g_eeGeneral.speakerVolume != (int8_t)b-7) { + g_eeGeneral.speakerVolume = (int8_t)b-7; + pushPrompt(b | 0xF0); + } + } +#endif break; } #endif diff --git a/src/gruvin9x/somo14d.h b/src/gruvin9x/somo14d.h index 417f0a75f..6dfdb8acf 100644 --- a/src/gruvin9x/somo14d.h +++ b/src/gruvin9x/somo14d.h @@ -32,7 +32,7 @@ */ #define PROMPT_SYSTEM_BASE 230 -#define PROMPT_CUSTOM_BASE 256 +#define PROMPT_CUSTOM_BASE 260 #define pushCustomPrompt(p) pushPrompt(PROMPT_CUSTOM_BASE+v) extern void pushPrompt(uint16_t prompt); diff --git a/src/model_menus.cpp b/src/model_menus.cpp index d01b8c881..c150d0ed9 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -1431,13 +1431,14 @@ bool swapExpoMix(uint8_t expo, uint8_t &idx, uint8_t up) } y = (MixData *)mixaddress(tgt_idx); - if(!((MixData *)y)->srcRaw || ((MixData *)x)->destCh != ((MixData *)y)->destCh) { + uint8_t destCh = ((MixData *)x)->destCh; + if(!((MixData *)y)->srcRaw || destCh != ((MixData *)y)->destCh) { if (up) { - if (((MixData *)x)->destCh>0) ((MixData *)x)->destCh--; + if (destCh>0) ((MixData *)x)->destCh--; else return false; } else { - if (((MixData *)x)->destChdestCh++; + if (destChdestCh++; else return false; } return true; @@ -1590,6 +1591,15 @@ enum MixFields { #else #define MIXES_2ND_COLUMN (9*FW) #endif + +uint8_t editMixDelay(const uint8_t y, const uint8_t event, const uint8_t attr, const pm_char *str, uint8_t delay) +{ + lcd_putsLeft(y, str); + lcd_outdezAtt(MIXES_2ND_COLUMN, y, 5*delay, attr|PREC1|LEFT); + if (attr) CHECK_INCDEC_MODELVAR(event, delay, 0, MAX_DELAY); + return delay; +} + void menuProcMixOne(uint8_t event) { TITLEP(s_currCh ? STR_INSERTMIX : STR_EDITMIX); @@ -1651,9 +1661,10 @@ void menuProcMixOne(uint8_t event) lcd_putsLeft(y, STR_CURVE); if (attr) { + int8_t curveParam = md2->curveParam; if (md2->curveMode==MODE_CURVE) { - if (event==EVT_KEY_FIRST(KEY_MENU) && (md2->curveParam<0 || md2->curveParam>=CURVE_BASE)){ - s_curveChan = (md2->curveParam<0 ? -md2->curveParam-1 : md2->curveParam-CURVE_BASE); + if (event==EVT_KEY_FIRST(KEY_MENU) && (curveParam<0 || curveParam>=CURVE_BASE)){ + s_curveChan = (curveParam<0 ? -curveParam-1 : curveParam-CURVE_BASE); pushMenu(menuProcCurveOne); } CHECK_INCDEC_MODELVAR(event, md2->curveParam, -MAX_CURVES, CURVE_BASE+MAX_CURVES-1); @@ -1708,11 +1719,11 @@ void menuProcMixOne(uint8_t event) #endif case MIX_FIELD_WARNING: lcd_putsLeft(y, STR_MIXWARNING); - if(md2->mixWarn) - lcd_outdezAtt(MIXES_2ND_COLUMN,y,md2->mixWarn,attr|LEFT); + if (md2->mixWarn) + lcd_outdezAtt(MIXES_2ND_COLUMN, y, md2->mixWarn, attr|LEFT); else lcd_putsAtt(MIXES_2ND_COLUMN, y, STR_OFF, attr); - if(attr) CHECK_INCDEC_MODELVAR( event, md2->mixWarn, 0,3); + if(attr) CHECK_INCDEC_MODELVAR( event, md2->mixWarn, 0, 3); break; case MIX_FIELD_MLTPX: lcd_putsLeft(y, STR_MULTPX); @@ -1720,24 +1731,16 @@ void menuProcMixOne(uint8_t event) if(attr) CHECK_INCDEC_MODELVAR( event, md2->mltpx, 0, 2); break; case MIX_FIELD_DELAY_UP: - lcd_putsLeft(y, STR_DELAYUP); - lcd_outdezAtt(MIXES_2ND_COLUMN,y,5*md2->delayUp,attr|PREC1|LEFT); - if(attr) CHECK_INCDEC_MODELVAR( event, md2->delayUp, 0, MAX_DELAY); + md2->delayUp = editMixDelay(y, event, attr, STR_DELAYUP, md2->delayUp); break; case MIX_FIELD_DELAY_DOWN: - lcd_putsLeft(y, STR_DELAYDOWN); - lcd_outdezAtt(MIXES_2ND_COLUMN,y,5*md2->delayDown,attr|PREC1|LEFT); - if(attr) CHECK_INCDEC_MODELVAR( event, md2->delayDown, 0, MAX_DELAY); + md2->delayDown = editMixDelay(y, event, attr, STR_DELAYDOWN, md2->delayDown); break; case MIX_FIELD_SLOW_UP: - lcd_putsLeft(y, STR_SLOWUP); - lcd_outdezAtt(MIXES_2ND_COLUMN,y,5*md2->speedUp,attr|PREC1|LEFT); - if(attr) CHECK_INCDEC_MODELVAR( event, md2->speedUp, 0, MAX_SLOW); + md2->speedUp = editMixDelay(y, event, attr, STR_SLOWUP, md2->speedUp); break; case MIX_FIELD_SLOW_DOWN: - lcd_putsLeft(y, STR_SLOWDOWN); - lcd_outdezAtt(MIXES_2ND_COLUMN,y,5*md2->speedDown,attr|PREC1|LEFT); - if(attr) CHECK_INCDEC_MODELVAR( event, md2->speedDown, 0, MAX_SLOW); + md2->speedDown = editMixDelay(y, event, attr, STR_SLOWDOWN, md2->speedDown); break; } } diff --git a/src/myeeprom.h b/src/myeeprom.h index 9c7d6b551..85416f122 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -96,8 +96,11 @@ enum BeeperMode { uint8_t speakerVolume; \ uint8_t backlightBright; \ int8_t currentCalib; +#define EXTRA_NON_ARM_FIELDS #else #define EXTRA_ARM_FIELDS +#define EXTRA_NON_ARM_FIELDS \ + int8_t speakerVolume; #endif enum AdcInput { @@ -159,7 +162,8 @@ PACK(typedef struct t_EEGeneral { EXTRA_ARM_FIELDS uint8_t variants; - + + EXTRA_NON_ARM_FIELDS; }) EEGeneral; // eeprom modelspec diff --git a/src/open9x.cpp b/src/open9x.cpp index 00181d278..be296c84c 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -2965,10 +2965,7 @@ void instantTrim() if (i!=THR_STICK) { // don't instant trim the throttle stick uint8_t trim_phase = getTrimFlightPhase(s_perout_flight_phase, i); - int16_t trim = (anas[i] + trims[i]) / 2; - // TODO limit - if (trim < TRIM_EXTENDED_MIN) trim = TRIM_EXTENDED_MIN; - if (trim > TRIM_EXTENDED_MAX) trim = TRIM_EXTENDED_MAX; + int16_t trim = limit((int16_t)TRIM_EXTENDED_MIN, (int16_t)((anas[i] + trims[i]) / 2), (int16_t)TRIM_EXTENDED_MAX); setTrimValue(trim_phase, i, trim); } } diff --git a/src/stock/voice.h b/src/stock/voice.h index 13aa317ab..13a1ea1d4 100644 --- a/src/stock/voice.h +++ b/src/stock/voice.h @@ -49,7 +49,7 @@ #define V_WAIT_BUSY_DELAY 5 #define PROMPT_SYSTEM_BASE 230 -#define PROMPT_CUSTOM_BASE 256 +#define PROMPT_CUSTOM_BASE 260 struct t_voice { diff --git a/util/tts.py b/util/tts.py index b2b8e66f0..8689b59c7 100644 --- a/util/tts.py +++ b/util/tts.py @@ -167,7 +167,7 @@ if __name__ == "__main__": (u"flight mode eight", "fltmd8"), (u"flight mode nine", "fltmd9"), ]): - sounds.extend(generate(s, f, 256+i)) + sounds.extend(generate(s, f, 260+i)) elif "fr" in sys.argv: @@ -204,7 +204,7 @@ if __name__ == "__main__": (u"fin écolage", "trnoff"), (u"moteur coupé", "engoff"), ]): - sounds.extend(generate(s, f, 256+i)) + sounds.extend(generate(s, f, 260+i)) elif "it" in sys.argv: @@ -263,7 +263,7 @@ if __name__ == "__main__": (u"fase di volo 8", "fltmd8"), (u"fase di volo 9", "fltmd9"), ]): - sounds.extend(generate(s, f, 256+i)) + sounds.extend(generate(s, f, 260+i)) if 'ad4' in sys.argv: voice += "-stock"