From 3824939030442a4c589b15f19081aa920147cf98 Mon Sep 17 00:00:00 2001 From: bsongis Date: Thu, 21 Feb 2013 20:25:40 +0000 Subject: [PATCH] [all] And switches added to Custom Switches [ARM] No Init of SD after a reboot (not tested) [X9D] Bug when [EXIT] on MODELSEL --- src/audio_arm.cpp | 9 +++++++ src/audio_arm.h | 12 ++++++---- src/frsky.cpp | 2 +- src/model_menus.cpp | 56 +++++++++++++++++++++++++++++++++---------- src/open9x.cpp | 3 ++- src/open9x.h | 20 ++++++++++------ src/translations.cpp | 1 + src/translations.h | 4 +++- src/translations/en.h | 3 +++ 9 files changed, 84 insertions(+), 26 deletions(-) diff --git a/src/audio_arm.cpp b/src/audio_arm.cpp index 874ed9b52..df5d3c334 100644 --- a/src/audio_arm.cpp +++ b/src/audio_arm.cpp @@ -265,6 +265,12 @@ AudioQueue::AudioQueue() prioIdx = -1; } +void AudioQueue::start() +{ + state = AUDIO_RESUMING; + CoSetFlag(audioFlag); +} + void audioTimerHandle(void) { CoSetFlag(audioFlag); @@ -277,6 +283,9 @@ void audioTimerHandle(void) #ifndef SIMU void audioTask(void* pdata) { + while (audioQueue.busy()) + CoWaitForSingleFlag(audioFlag, 0); + #if defined(SDCARD) if (!unexpectedShutdown) { codecsInit(); diff --git a/src/audio_arm.h b/src/audio_arm.h index 794bd62c5..72b5836f1 100644 --- a/src/audio_arm.h +++ b/src/audio_arm.h @@ -65,10 +65,11 @@ class AudioFragment : public ToneFragment { extern "C" void DAC_IRQHandler(); -#define AUDIO_SLEEPING 0 -#define AUDIO_RESUMING 1 -#define AUDIO_PLAYING_TONE 2 -#define AUDIO_PLAYING_WAV 3 +#define AUDIO_NOT_STARTED 0 +#define AUDIO_SLEEPING 1 +#define AUDIO_RESUMING 2 +#define AUDIO_PLAYING_TONE 3 +#define AUDIO_PLAYING_WAV 4 extern bool playingBackground; @@ -92,6 +93,8 @@ class AudioQueue { AudioQueue(); + void start(); + void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags=0, int8_t tFreqIncr=0); void playFile(const char *filename, uint8_t flags=0, uint8_t id=0); @@ -141,6 +144,7 @@ extern AudioQueue audioQueue; void codecsInit(); void audioEvent(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ); +void audioStart(); #define AUDIO_TADA() audioEvent(AU_TADA) #define AUDIO_KEYPAD_UP() audioEvent(AU_KEYPAD_UP) diff --git a/src/frsky.cpp b/src/frsky.cpp index fb8014df6..4395565fd 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -1141,7 +1141,7 @@ void putsTelemetryChannel(xcoord_t x, uint8_t y, uint8_t channel, lcdint_t val, if (channel >= TELEM_MAX_T1-1 && channel <= TELEM_MAX_DIST-1) channel -= TELEM_MAX_T1 - TELEM_T1; if (channel <= TELEM_GPSALT-1) - unit = channel - 6; + unit = channel + 1 - TELEM_ALT; if (channel >= TELEM_MIN_ALT-1 && channel <= TELEM_MAX_ALT-1) unit = 0; if (channel == TELEM_HDG-1) diff --git a/src/model_menus.cpp b/src/model_menus.cpp index ee83af4f9..cabc5e811 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -244,8 +244,13 @@ void menuModelSelect(uint8_t event) uint8_t _event_ = (IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event) ? 0 : event); +#if defined(PCBX9D) + if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT)) + _event_ -= KEY_EXIT; +#else if (s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) _event_ -= KEY_EXIT; +#endif int8_t oldSub = m_posVert; @@ -307,6 +312,18 @@ void menuModelSelect(uint8_t event) sub = m_posVert = (s_copyMode == MOVE_MODE || s_copySrcRow<0) ? (MAX_MODELS+sub+s_copyTgtOfs) % MAX_MODELS : s_copySrcRow; s_copyMode = 0; } +#if defined(PCBX9D) + else { + if (m_posVert != g_eeGeneral.currModel) { + m_posVert = g_eeGeneral.currModel; + s_pgOfs = 0; + } + else { + popMenu(); + return; + } + } +#endif break; #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ROTARY_BREAK: @@ -349,7 +366,11 @@ void menuModelSelect(uint8_t event) s_copyMode = 0; event = EVT_ENTRY_UP; } - else if (event == EVT_KEY_LONG(KEY_MENU) || IS_ROTARY_BREAK(event)) { + else if (event == EVT_KEY_LONG(KEY_ENTER) +#if !defined(PCBX9D) + || IS_ROTARY_BREAK(event) +#endif + ) { s_copyMode = 0; killEvents(event); #if defined(NAVIGATION_MENUS) @@ -435,14 +456,14 @@ void menuModelSelect(uint8_t event) case EVT_KEY_FIRST(KEY_MOVE_UP): case EVT_KEY_FIRST(KEY_MOVE_DOWN): if (s_copyMode) { - int8_t next_ofs = (IS_ROTARY_LEFT(event) || event == EVT_KEY_FIRST(KEY_MOVE_UP)) ? s_copyTgtOfs+1 : s_copyTgtOfs-1; + int8_t next_ofs = (IS_ROTARY_UP(event) || event == EVT_KEY_FIRST(KEY_MOVE_UP)) ? s_copyTgtOfs+1 : s_copyTgtOfs-1; if (next_ofs == MAX_MODELS || next_ofs == -MAX_MODELS) next_ofs = 0; if (s_copySrcRow < 0 && s_copyMode==COPY_MODE) { s_copySrcRow = oldSub; // find a hole (in the first empty slot above / below) - sub = eeFindEmptyModel(s_copySrcRow, IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_MOVE_DOWN)); + sub = eeFindEmptyModel(s_copySrcRow, IS_ROTARY_DOWN(event) || event==EVT_KEY_FIRST(KEY_MOVE_DOWN)); if (sub < 0) { // no free room for duplicating the model AUDIO_ERROR(); @@ -3100,9 +3121,14 @@ void menuModelCustomSwitches(uint8_t event) } #else +#define CSW_1ST_COLUMN (4*FW-3) +#define CSW_2ND_COLUMN (10*FW+1) +#define CSW_3RD_COLUMN (18*FW+2) +#define CSW_4TH_COLUMN (20*FW+1) + void menuModelCustomSwitches(uint8_t event) { - MENU(STR_MENUCUSTOMSWITCHES, menuTabModel, e_CustomSwitches, NUM_CSW+1, {0, 2/*repeated...*/}); + MENU(STR_MENUCUSTOMSWITCHES, menuTabModel, e_CustomSwitches, NUM_CSW+1, {0, 3/*repeated...*/}); uint8_t y = 0; uint8_t k = 0; @@ -3119,28 +3145,28 @@ void menuModelCustomSwitches(uint8_t event) putsSwitches(0, y, sw, getSwitch(sw, 0) ? BOLD : 0); // CSW func - lcd_putsiAtt(4*FW-3, y, STR_VCSWFUNC, cs->func, m_posHorz==0 ? attr : 0); + lcd_putsiAtt(CSW_1ST_COLUMN, y, STR_VCSWFUNC, cs->func, m_posHorz==0 ? attr : 0); // 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; if (cstate == CS_VBOOL) { - putsSwitches(10*FW, y, cs->v1, m_posHorz==1 ? attr : 0); - putsSwitches(16*FW, y, cs->v2, m_posHorz==2 ? attr : 0); + putsSwitches(CSW_2ND_COLUMN, y, cs->v1, m_posHorz==1 ? attr : 0); + putsSwitches(CSW_3RD_COLUMN, y, cs->v2, m_posHorz==2 ? attr : 0); v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1; v2_min = SWSRC_OFF+1; v2_max = SWSRC_ON-1; } else if (cstate == CS_VCOMP) { - putsMixerSource(10*FW, y, cs->v1, m_posHorz==1 ? attr : 0); - putsMixerSource(16*FW, y, cs->v2, m_posHorz==2 ? attr : 0); + putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, m_posHorz==1 ? attr : 0); + putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, m_posHorz==2 ? attr : 0); } else { - putsMixerSource(10*FW, y, cs->v1, (m_posHorz==1 ? attr : 0)); + putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, (m_posHorz==1 ? attr : 0)); #if defined(FRSKY) if (cs->v1 > MIXSRC_LAST_CH) { - putsTelemetryChannel(18*FW+2, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), m_posHorz==2 ? attr : 0); + 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 (cstate == CS_VOFS) { v2_min = -128; @@ -3158,11 +3184,14 @@ void menuModelCustomSwitches(uint8_t event) else #endif { - lcd_outdezAtt(19*FW, y, cs->v2, m_posHorz==2 ? attr : 0); + lcd_outdezAtt(CSW_3RD_COLUMN, y, cs->v2, m_posHorz==2 ? attr : 0); v2_min = -125; v2_max = 125; } } + // CSW and switch + lcd_putsiAtt(CSW_4TH_COLUMN, y, STR_VSWITCHES_SHORT, cs->andsw, m_posHorz==3 ? attr : 0); + if ((s_editMode>0 || p1valdiff) && attr) { switch (m_posHorz) { case 0: @@ -3178,6 +3207,9 @@ void menuModelCustomSwitches(uint8_t event) case 2: CHECK_INCDEC_MODELVAR(event, cs->v2, v2_min, v2_max); break; + case 3: + CHECK_INCDEC_MODELVAR(event, cs->andsw, 0, 15); + break; } } } diff --git a/src/open9x.cpp b/src/open9x.cpp index acda3a60d..8f9895594 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -791,7 +791,7 @@ bool __getSwitch(int8_t swtch) CustomSwData * cs = cswaddress(cs_idx); uint8_t s = cs->andsw; - // TODO why? if (s > 8) s += 1; + if (s >= SWSRC_TRN) s += SWSRC_SW3-SWSRC_TRN; if (cs->func == CS_OFF || (s && !__getSwitch(s))) { result = false; } @@ -3532,6 +3532,7 @@ inline void open9xInit(OPEN9X_INIT_ARGS) #endif #if defined(CPUARM) + audioQueue.start(); setBacklight(g_eeGeneral.backlightBright); #endif diff --git a/src/open9x.h b/src/open9x.h index f8a7c7381..14f5b377c 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -583,8 +583,10 @@ enum CswFunctions { #endif #if defined(PCBX9D) - #define IS_ROTARY_LEFT(evt) (evt==EVT_KEY_FIRST(KEY_MOVE_DOWN) || evt==EVT_KEY_REPT(KEY_MOVE_DOWN)) - #define IS_ROTARY_RIGHT(evt) (evt==EVT_KEY_FIRST(KEY_MOVE_UP) || evt==EVT_KEY_REPT(KEY_MOVE_UP)) + #define IS_ROTARY_LEFT(evt) (evt==EVT_KEY_FIRST(KEY_MINUS) || evt==EVT_KEY_REPT(KEY_MINUS)) + #define IS_ROTARY_RIGHT(evt) (evt==EVT_KEY_FIRST(KEY_PLUS) || evt==EVT_KEY_REPT(KEY_PLUS)) + #define IS_ROTARY_UP(evt) (evt==EVT_KEY_FIRST(KEY_PLUS) || evt==EVT_KEY_REPT(KEY_PLUS)) + #define IS_ROTARY_DOWN(evt) (evt==EVT_KEY_FIRST(KEY_MINUS) || evt==EVT_KEY_REPT(KEY_MINUS)) #define IS_ROTARY_BREAK(evt) (evt==EVT_KEY_BREAK(KEY_ENTER)) #define IS_ROTARY_LONG(evt) (evt==EVT_KEY_LONG(KEY_ENTER)) #define IS_ROTARY_EVENT(evt) (0) @@ -595,6 +597,8 @@ enum CswFunctions { #elif defined(ROTARY_ENCODER_NAVIGATION) #define IS_ROTARY_LEFT(evt) (evt == EVT_ROTARY_LEFT) #define IS_ROTARY_RIGHT(evt) (evt == EVT_ROTARY_RIGHT) + #define IS_ROTARY_UP(evt) IS_ROTARY_LEFT(evt) + #define IS_ROTARY_DOWN(evt) IS_ROTARY_RIGHT(evt) #define IS_ROTARY_BREAK(evt) (evt == EVT_ROTARY_BREAK) #define IS_ROTARY_LONG(evt) (evt == EVT_ROTARY_LONG) #define IS_ROTARY_EVENT(evt) (EVT_KEY_MASK(evt) >= 0x0e) @@ -603,11 +607,13 @@ enum CswFunctions { #define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT: #define CASE_EVT_ROTARY_RIGHT case EVT_ROTARY_RIGHT: #else - #define IS_ROTARY_LEFT(evt) (0) - #define IS_ROTARY_RIGHT(evt) (0) - #define IS_ROTARY_BREAK(evt) (0) - #define IS_ROTARY_LONG(evt) (0) - #define IS_ROTARY_EVENT(evt) (0) + #define IS_ROTARY_LEFT(evt) (0) + #define IS_ROTARY_RIGHT(evt) (0) + #define IS_ROTARY_UP(evt) (0) + #define IS_ROTARY_DOWN(evt) (0) + #define IS_ROTARY_BREAK(evt) (0) + #define IS_ROTARY_LONG(evt) (0) + #define IS_ROTARY_EVENT(evt) (0) #define CASE_EVT_ROTARY_BREAK #define CASE_EVT_ROTARY_LONG #define CASE_EVT_ROTARY_LEFT diff --git a/src/translations.cpp b/src/translations.cpp index bec5a1036..4e9059e4f 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -87,6 +87,7 @@ const pm_char STR_OPEN9X[] PROGMEM = #endif ISTR(VKEYS) ISTR(VSWITCHES) + ISTR(VSWITCHES_SHORT) ISTR(VSRCRAW) ISTR(VTMRMODES) #if defined(PCBGRUVIN9X) || defined (CPUARM) diff --git a/src/translations.h b/src/translations.h index c2e8ed302..27cf23602 100644 --- a/src/translations.h +++ b/src/translations.h @@ -137,7 +137,8 @@ extern const pm_char STR_OPEN9X[]; #endif #define OFS_VKEYS (OFS_ENDHELI) #define OFS_VSWITCHES (OFS_VKEYS + sizeof(TR_VKEYS)) -#define OFS_VSRCRAW (OFS_VSWITCHES + sizeof(TR_VSWITCHES)) +#define OFS_VSWITCHES_SHORT (OFS_VSWITCHES + sizeof(TR_VSWITCHES)) +#define OFS_VSRCRAW (OFS_VSWITCHES_SHORT + sizeof(TR_VSWITCHES_SHORT)) #define OFS_VTMRMODES (OFS_VSRCRAW + sizeof(TR_VSRCRAW)) #if defined(PCBGRUVIN9X) || defined(CPUARM) #define OFS_DATETIME (OFS_VTMRMODES + sizeof(TR_VTMRMODES)) @@ -194,6 +195,7 @@ extern const pm_char STR_OPEN9X[]; #define STR_VKEYS (STR_OPEN9X + OFS_VKEYS) #define STR_VSWITCHES (STR_OPEN9X + OFS_VSWITCHES) +#define STR_VSWITCHES_SHORT (STR_OPEN9X + OFS_VSWITCHES_SHORT) #define STR_VSRCRAW (STR_OPEN9X + OFS_VSRCRAW) #define STR_VTMRMODES (STR_OPEN9X + OFS_VTMRMODES) diff --git a/src/translations/en.h b/src/translations/en.h index e76272dfe..80a048ac4 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -297,6 +297,9 @@ #define TR_VSWITCHES TR_9X_3POS_SWITCHES "THR""RUD""ELE""AIL""GEA""TRN" TR_CUSTOMSW " ON" #endif +#define LEN_VSWITCHES_SHORT "\001" +#define TR_VSWITCHES_SHORT "-012TREAG3456789" + #if defined(PCBX9D) #define TR_ROTARY_ENCODERS_VSRCRAW #elif defined(PCBSKY9X)