diff --git a/radio/src/audio_arm.h b/radio/src/audio_arm.h index 7627e59bd..88b8cfad3 100644 --- a/radio/src/audio_arm.h +++ b/radio/src/audio_arm.h @@ -86,12 +86,14 @@ template class BitField { #define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+150) #define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-150) +#if defined(PCBSKY9X) enum AudioBufferState { AUDIO_BUFFER_FREE, AUDIO_BUFFER_FILLED, AUDIO_BUFFER_PLAYING }; +#endif #if defined(SIMU) typedef uint16_t audio_data_t; @@ -116,6 +118,7 @@ enum AudioBufferState struct AudioBuffer { audio_data_t data[AUDIO_BUFFER_SIZE]; uint16_t size; + uint8_t state; }; extern AudioBuffer audioBuffers[AUDIO_BUFFER_COUNT]; @@ -314,38 +317,79 @@ class AudioBufferFifo { // returns an empty buffer to be filled wit data and put back into FIFO with audioPushBuffer() AudioBuffer * getEmptyBuffer() const { - return full() ? 0 : &audioBuffers[writeIdx]; +#if defined(PCBSKY9X) + AudioBuffer * buffer = &audioBuffers[writeIdx]; + return buffer->state == AUDIO_BUFFER_FREE ? buffer : NULL; +#else + return full() ? NULL : &audioBuffers[writeIdx]; +#endif } // puts filled buffer into FIFO void audioPushBuffer() { - // AudioBuffer * buffer = &audioBuffers[writeIdx]; audioDisableIrq(); +#if defined(PCBSKY9X) + AudioBuffer * buffer = &audioBuffers[writeIdx]; + buffer->state = AUDIO_BUFFER_FILLED; +#endif writeIdx = nextBufferIdx(writeIdx); bufferFull = (writeIdx == readIdx); audioEnableIrq(); - // buffer->state = AUDIO_BUFFER_FILLED; } // returns a pointer to the audio buffer to be played - const AudioBuffer * getNextFilledBuffer() const + const AudioBuffer * getNextFilledBuffer() { - return empty() ? 0 : &audioBuffers[readIdx]; +#if defined(PCBSKY9X) + uint8_t idx = readIdx; + do { + AudioBuffer * buffer = &audioBuffers[idx]; + if (buffer->state == AUDIO_BUFFER_FILLED) { + buffer->state = AUDIO_BUFFER_PLAYING; + readIdx = idx; + return buffer; + } + idx = nextBufferIdx(idx); + } while (idx != writeIdx); // this fixes a bug if all buffers are filled + return NULL; +#else + return empty() ? NULL : &audioBuffers[readIdx]; +#endif } // frees the last played buffer void freeNextFilledBuffer() { audioDisableIrq(); +#if defined(PCBSKY9X) + if (audioBuffers[readIdx].state == AUDIO_BUFFER_PLAYING) { + audioBuffers[readIdx].state = AUDIO_BUFFER_FREE; + readIdx = nextBufferIdx(readIdx); + bufferFull = false; + } +#else readIdx = nextBufferIdx(readIdx); bufferFull = false; +#endif audioEnableIrq(); } bool filledAtleast(int noBuffers) const { +#if defined(PCBSKY9X) + int count = 0; + for(int n= 0; n= noBuffers) { + return true; + } + } + } + return false; +#else return used() >= noBuffers; +#endif } }; diff --git a/radio/src/targets/sky9x/audio_driver.cpp b/radio/src/targets/sky9x/audio_driver.cpp index de814b3a8..9b81f1974 100644 --- a/radio/src/targets/sky9x/audio_driver.cpp +++ b/radio/src/targets/sky9x/audio_driver.cpp @@ -19,7 +19,8 @@ */ #include "opentx.h" -const AudioBuffer * nextBuffer = 0; + +volatile uint8_t dacStarted = false; const int8_t volumeScale[VOLUME_LEVEL_MAX+1] = { @@ -94,13 +95,23 @@ void dacInit() NVIC_EnableIRQ(DACC_IRQn) ; } +inline void dacStart() +{ + PMC->PMC_PCER0 |= 0x40000000L ; // Enable peripheral clock to DAC + DACC->DACC_IER = DACC_IER_ENDTX ; + dacStarted = true; +} + +inline void dacStop() +{ + DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt + dacStarted = false; +} + void audioConsumeCurrentBuffer() { - if (nextBuffer == 0) { - nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer(); - if (nextBuffer) { - dacStart(); - } + if (!dacStarted) { + dacStart(); } } @@ -109,9 +120,8 @@ extern "C" void DAC_IRQHandler() { uint32_t sr = DACC->DACC_ISR; if (sr & DACC_ISR_ENDTX) { - if (nextBuffer) audioQueue.buffersFifo.freeNextFilledBuffer(); - - nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer(); + audioQueue.buffersFifo.freeNextFilledBuffer(); + const AudioBuffer * nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer(); if (nextBuffer) { // Try the first PDC buffer if ((DACC->DACC_TCR == 0) && (DACC->DACC_TNCR == 0)) { @@ -137,7 +147,7 @@ extern "C" void DAC_IRQHandler() // Sound routines void audioInit() { - Pio *pioptr ; + Pio * pioptr ; dacInit() ; diff --git a/radio/src/targets/sky9x/audio_driver.h b/radio/src/targets/sky9x/audio_driver.h index 61e97b2b7..dc2e14008 100644 --- a/radio/src/targets/sky9x/audio_driver.h +++ b/radio/src/targets/sky9x/audio_driver.h @@ -29,17 +29,6 @@ void audioConsumeCurrentBuffer(); void setSampleRate( uint32_t frequency ) ; -inline void dacStart() -{ - PMC->PMC_PCER0 |= 0x40000000L ; // Enable peripheral clock to DAC - DACC->DACC_IER = DACC_IER_ENDTX ; -} - -inline void dacStop() -{ - DACC->DACC_IDR = DACC_IDR_ENDTX ; // Disable interrupt -} - #define VOLUME_LEVEL_MAX 23 #define VOLUME_LEVEL_DEF 12 diff --git a/radio/src/targets/taranis/bootloader/boot.cpp b/radio/src/targets/taranis/bootloader/boot.cpp index 1ebdc5df2..115312022 100644 --- a/radio/src/targets/taranis/bootloader/boot.cpp +++ b/radio/src/targets/taranis/bootloader/boot.cpp @@ -21,19 +21,34 @@ #include "opentx.h" #include "stamp.h" -#define BOOTLOADER_TITLE " Taranis BootLoader - " VERSION -#if defined(PCBX9E) || defined(PCBX7D) - #define BOOT_KEY_UP KEY_MINUS - #define BOOT_KEY_DOWN KEY_PLUS +#if defined(PCBX7D) + #define BOOTLOADER_TITLE " X7 Bootloader - " VERSION +#elif defined(PCBTARANIS) + #define BOOTLOADER_TITLE " Taranis Bootloader - " VERSION #else - #define BOOT_KEY_UP KEY_PLUS - #define BOOT_KEY_DOWN KEY_MINUS + #error "Not implemented" +#endif + +#if defined(PCBX9E) || defined(PCBX7D) + #define BOOT_KEY_UP KEY_MINUS + #define BOOT_KEY_DOWN KEY_PLUS +#else + #define BOOT_KEY_UP KEY_PLUS + #define BOOT_KEY_DOWN KEY_MINUS +#endif +#define BOOT_KEY_LEFT KEY_MENU +#define BOOT_KEY_RIGHT KEY_PAGE +#define BOOT_KEY_MENU KEY_ENTER +#define BOOT_KEY_EXIT KEY_EXIT +#define DISPLAY_CHAR_WIDTH 35 + +#if LCD_W >= 212 + #define STR_OR_PLUGIN_USB_CABLE INDENT "Or plug in a USB cable for mass storage" + #define STR_USB_CONNECTED "\026USB Connected" +#else + #define STR_OR_PLUGIN_USB_CABLE INDENT "Or plug in a USB cable" + #define STR_USB_CONNECTED "\012USB Connected " #endif -#define BOOT_KEY_LEFT KEY_MENU -#define BOOT_KEY_RIGHT KEY_PAGE -#define BOOT_KEY_MENU KEY_ENTER -#define BOOT_KEY_EXIT KEY_EXIT -#define DISPLAY_CHAR_WIDTH 35 const uint8_t bootloaderVersion[] __attribute__ ((section(".version"), used)) = { @@ -377,7 +392,7 @@ int main() lcdDrawTextAlignedLeft(3*FH, "\010Restore EEPROM"); lcdDrawTextAlignedLeft(4*FH, "\010Exit"); lcdInvertLine(2+vpos); - lcdDrawTextAlignedLeft(7*FH, INDENT "Or plug in a USB cable for mass storage"); + lcdDrawTextAlignedLeft(7*FH, STR_OR_PLUGIN_USB_CABLE); if (event == EVT_KEY_FIRST(BOOT_KEY_DOWN)) { vpos == 2 ? vpos = 0 : vpos = vpos+1; } @@ -399,7 +414,7 @@ int main() } if (state == ST_USB) { - lcdDrawTextAlignedLeft(4*FH, "\026USB Connected"); + lcdDrawTextAlignedLeft(4*FH, STR_USB_CONNECTED); if (usbPlugged() == 0) { vpos = 0; if (unlocked) {