diff --git a/.travis.yml b/.travis.yml index f7e9021f8..3e9230aac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,4 +24,4 @@ install: - sudo dpkg --install gcc-avr_1%3a4.8-2.1_amd64.deb avr-libc_1%3a1.8.0-4.1_all.deb libmpfr4_3.1.2-1_amd64.deb binutils-avr_2.23.1-2.1_amd64.deb libmpc3_1.0.1-1ubuntu1_amd64.deb script: - - ./tools/commit-tests.sh . + - ./tools/commit-tests.sh diff --git a/radio/src/audio_arm.cpp b/radio/src/audio_arm.cpp index e90ab3c16..5b2357257 100644 --- a/radio/src/audio_arm.cpp +++ b/radio/src/audio_arm.cpp @@ -217,15 +217,10 @@ const char * const audioFilenames[] = { "timovr3" }; -uint64_t sdAvailableSystemAudioFiles = 0; -uint32_t sdAvailablePhaseAudioFiles = 0; -uint64_t sdAvailableSwitchAudioFiles = 0; -uint64_t sdAvailableLogicalSwitchAudioFiles = 0; - -#define MASK_SYSTEM_AUDIO_FILE(index) ((uint64_t)1 << (index)) -#define MASK_PHASE_AUDIO_FILE(index, event) ((uint32_t)1 << (2*(index)+(event))) -#define MASK_SWITCH_AUDIO_FILE(index) ((uint64_t)1 << (index)) -#define MASK_LOGICAL_SWITCH_AUDIO_FILE(index, event) ((uint64_t)1 << (2*(index)+(event))) +BitField<(AU_SPECIAL_SOUND_FIRST)> sdAvailableSystemAudioFiles; +BitField<(MAX_FLIGHT_MODES * 2/*on, off*/)> sdAvailablePhaseAudioFiles; +BitField<(SWSRC_LAST_SWITCH+NUM_XPOTS*XPOTS_MULTIPOS_COUNT)> sdAvailableSwitchAudioFiles; +BitField<(MAX_LOGICAL_SWITCHES * 2/*on, off*/)> sdAvailableLogicalSwitchAudioFiles; char * getAudioPath(char * path) { @@ -258,10 +253,9 @@ void referenceSystemAudioFiles() fno.lfname = lfn; fno.lfsize = sizeof(lfn); - uint64_t availableAudioFiles = 0; + sdAvailableSystemAudioFiles.reset(); assert(sizeof(audioFilenames)==AU_SPECIAL_SOUND_FIRST*sizeof(char *)); - assert(sizeof(sdAvailableSystemAudioFiles)*8 >= AU_SPECIAL_SOUND_FIRST); char * filename = strAppendSystemAudioPath(path); *(filename-1) = '\0'; @@ -280,15 +274,13 @@ void referenceSystemAudioFiles() for (int i=0; i-[up|mid|down].wav for (int i=SWSRC_FIRST_SWITCH; i<=SWSRC_LAST_SWITCH+NUM_XPOTS*XPOTS_MULTIPOS_COUNT && !found; i++) { getSwitchAudioFile(path, i); - // TRACE("referenceModelAudioFiles(): searching for %s in %s", filename, fn); + // TRACE("referenceModelAudioFiles(): searching for %s in %s (%d)", path, fn, i); if (!strcasecmp(filename, fn)) { - sdAvailableSwitchAudioFiles |= MASK_SWITCH_AUDIO_FILE(i-SWSRC_FIRST_SWITCH); + sdAvailableSwitchAudioFiles.setBit(i-SWSRC_FIRST_SWITCH); found = true; TRACE("\tfound: %s", filename); } @@ -424,7 +416,7 @@ void referenceModelAudioFiles() getLogicalSwitchAudioFile(path, i, event); // TRACE("referenceModelAudioFiles(): searching for %s in %s", filename, fn); if (!strcasecmp(filename, fn)) { - sdAvailableLogicalSwitchAudioFiles |= MASK_LOGICAL_SWITCH_AUDIO_FILE(i, event); + sdAvailableLogicalSwitchAudioFiles.setBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(i, event)); found = true; TRACE("\tfound: %s", filename); break; @@ -445,25 +437,25 @@ bool isAudioFileReferenced(uint32_t i, char * filename) // TRACE("isAudioFileReferenced(%08x)", i); if (category == SYSTEM_AUDIO_CATEGORY) { - if (sdAvailableSystemAudioFiles & MASK_SYSTEM_AUDIO_FILE(event)) { + if (sdAvailableSystemAudioFiles.getBit(event)) { getSystemAudioFile(filename, event); return true; } } else if (category == PHASE_AUDIO_CATEGORY) { - if (sdAvailablePhaseAudioFiles & MASK_PHASE_AUDIO_FILE(index, event)) { + if (sdAvailablePhaseAudioFiles.getBit(INDEX_PHASE_AUDIO_FILE(index, event))) { getPhaseAudioFile(filename, index, event); return true; } } else if (category == SWITCH_AUDIO_CATEGORY) { - if (sdAvailableSwitchAudioFiles & MASK_SWITCH_AUDIO_FILE(index)) { + if (sdAvailableSwitchAudioFiles.getBit(index)) { getSwitchAudioFile(filename, SWSRC_FIRST_SWITCH+index); return true; } } else if (category == LOGICAL_SWITCH_AUDIO_CATEGORY) { - if (sdAvailableLogicalSwitchAudioFiles & MASK_LOGICAL_SWITCH_AUDIO_FILE(index, event)) { + if (sdAvailableLogicalSwitchAudioFiles.getBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(index, event))) { getLogicalSwitchAudioFile(filename, index, event); return true; } @@ -527,13 +519,16 @@ void audioTask(void * pdata) } setSampleRate(AUDIO_SAMPLE_RATE); - + if (!unexpectedShutdown) { AUDIO_HELLO(); } while (1) { + DEBUG_TIMER_SAMPLE(debugTimerAudioIterval); + DEBUG_TIMER_START(debugTimerAudioDuration); audioQueue.wakeup(); + DEBUG_TIMER_STOP(debugTimerAudioDuration); CoTickDelay(2/*4ms*/); } } @@ -743,7 +738,9 @@ int ToneContext::mixBuffer(AudioBuffer * buffer, int volume, unsigned int fade) void AudioQueue::wakeup() { + DEBUG_TIMER_START(debugTimerAudioConsume); audioConsumeCurrentBuffer(); + DEBUG_TIMER_STOP(debugTimerAudioConsume); AudioBuffer * buffer = getEmptyBuffer(); if (buffer) { @@ -818,7 +815,9 @@ void AudioQueue::wakeup() buffer->data[i] = (int16_t) (((tmpSample * currentSpeakerVolume) / VOLUME_LEVEL_MAX) + AUDIO_DATA_SILENCE); } #endif + DEBUG_TIMER_START(debugTimerAudioPush); audioPushBuffer(buffer); + DEBUG_TIMER_STOP(debugTimerAudioPush); audioEnableIrq(); } } @@ -981,7 +980,7 @@ void AudioQueue::stopPlay(uint8_t id) void AudioQueue::stopSD() { - sdAvailableSystemAudioFiles = 0; + sdAvailableSystemAudioFiles.reset(); stopAll(); playTone(0, 0, 100, PLAY_NOW); // insert a 100ms pause } diff --git a/radio/src/audio_arm.h b/radio/src/audio_arm.h index 3b6b0820b..54e351f6a 100644 --- a/radio/src/audio_arm.h +++ b/radio/src/audio_arm.h @@ -24,6 +24,47 @@ #include #include "ff.h" +/* + Implements a bit field, number of bits is set by the template, + each bit can be modified and read by the provided methods. +*/ +template class BitField { + private: + uint8_t bits[(NUM_BITS+7)/8]; + public: + BitField() + { + reset(); + } + + void reset() + { + memset(bits, 0, sizeof(bits)); + } + + void setBit(unsigned int bitNo) + { + if (bitNo >= NUM_BITS) return; + bits[bitNo >> 3] = bits[bitNo >> 3] | (1 << (bitNo & 0x07)); + } + + bool getBit(unsigned int bitNo) const + { + // assert(bitNo < NUM_BITS); + if (bitNo >= NUM_BITS) return false; + return bits[bitNo >> 3] & (1 << (bitNo & 0x07)); + } + + void getSize() const + { + return NUM_BITS; + } +}; + +#define INDEX_LOGICAL_SWITCH_AUDIO_FILE(index, event) (2*(index)+(event)) +#define INDEX_PHASE_AUDIO_FILE(index, event) (2*(index)+(event)) + + #define AUDIO_FILENAME_MAXLEN (42) // max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) #define AUDIO_QUEUE_LENGTH (20) diff --git a/radio/src/debug.cpp b/radio/src/debug.cpp index 171df5c65..dc5969de0 100644 --- a/radio/src/debug.cpp +++ b/radio/src/debug.cpp @@ -224,6 +224,11 @@ const char * debugTimerNames[DEBUG_TIMERS_COUNT] = { ,"ADC read " // debugTimerAdcRead, ,"mix-pulses " // debugTimerMixerCalcToUsage ,"mix-int. " // debugTimerMixerIterval + ,"Audio int. " // debugTimerAudioIterval + ,"Audio dur. " // debugTimerAudioDuration + ," A. consume" // debugTimerAudioConsume, + ," A push " // debugTimerAudioPush, + }; #endif diff --git a/radio/src/debug.h b/radio/src/debug.h index b04e2f55c..8acfc981d 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -335,6 +335,11 @@ enum DebugTimers { debugTimerMixerCalcToUsage, debugTimerMixerIterval, + debugTimerAudioIterval, + debugTimerAudioDuration, + debugTimerAudioConsume, + debugTimerAudioPush, + DEBUG_TIMERS_COUNT }; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 95ae73cb9..6e1d7b9da 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -993,6 +993,7 @@ void checkSDVersion() if (f_read(&versionFile, &version, sizeof(version), &read) != FR_OK || read != sizeof(version) || strncmp(version, REQUIRED_SDCARD_VERSION, sizeof(version)) != 0) { + TRACE("SD card version mismatch: %.*s, %s", sizeof(REQUIRED_SDCARD_VERSION)-1, version, REQUIRED_SDCARD_VERSION); ALERT(STR_SD_CARD, STR_WRONG_SDCARDVERSION, AU_ERROR); } f_close(&versionFile); diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index f06973057..5c2b221e1 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -787,7 +787,7 @@ TEST(Mixer, DelayOnSwitch) g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) || defined(PCBHORUS) g_model.mixData[0].swtch = SWSRC_SA2; #else g_model.mixData[0].swtch = SWSRC_THR; diff --git a/radio/src/tests/switches.cpp b/radio/src/tests/switches.cpp index b0bdca6cb..197c56a39 100644 --- a/radio/src/tests/switches.cpp +++ b/radio/src/tests/switches.cpp @@ -150,7 +150,7 @@ TEST(getSwitch, inputWithTrim) } #endif -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) || defined(PCBHORUS) TEST(evalLogicalSwitches, playFile) { SYSTEM_RESET(); @@ -158,8 +158,7 @@ TEST(evalLogicalSwitches, playFile) modelDefault(0); MIXER_RESET(); - extern uint64_t sdAvailableLogicalSwitchAudioFiles; - sdAvailableLogicalSwitchAudioFiles = 0xffffffffffffffff; + extern BitField<(MAX_LOGICAL_SWITCHES * 2/*on, off*/)> sdAvailableLogicalSwitchAudioFiles; char filename[AUDIO_FILENAME_MAXLEN+1]; #if defined(EEPROM) @@ -168,6 +167,11 @@ TEST(evalLogicalSwitches, playFile) #define MODELNAME "Model00" #endif + sdAvailableLogicalSwitchAudioFiles.setBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(0,AUDIO_EVENT_OFF)); + sdAvailableLogicalSwitchAudioFiles.setBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(0,AUDIO_EVENT_ON)); + sdAvailableLogicalSwitchAudioFiles.setBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(31,AUDIO_EVENT_OFF)); + sdAvailableLogicalSwitchAudioFiles.setBit(INDEX_LOGICAL_SWITCH_AUDIO_FILE(31,AUDIO_EVENT_ON)); + isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (0 << 16) + AUDIO_EVENT_OFF, filename); EXPECT_EQ(strcmp(filename, "/SOUNDS/en/" MODELNAME "/L1-off.wav"), 0); isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (0 << 16) + AUDIO_EVENT_ON, filename); @@ -177,6 +181,9 @@ TEST(evalLogicalSwitches, playFile) isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (31 << 16) + AUDIO_EVENT_ON, filename); EXPECT_EQ(strcmp(filename, "/SOUNDS/en/" MODELNAME "/L32-on.wav"), 0); + EXPECT_EQ(isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (31 << 16) + AUDIO_EVENT_ON, filename), true); + EXPECT_EQ(isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (32 << 16) + AUDIO_EVENT_ON, filename), false); + #undef MODELNAME } #endif diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index b3bad3822..d2a019a76 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -102,24 +102,24 @@ make -j${CORES} gtests ; ./gtests # OpenTX on Taranis X9E rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=X9E -DHELI=YES -DLUA=YES -DWARNINGS_AS_ERRORS=YES -DPPM_UNIT=PERCENT_PREC1 ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=X9E -DHELI=YES -DLUA=YES -DGVARS=YES -DWARNINGS_AS_ERRORS=YES -DPPM_UNIT=PERCENT_PREC1 ${SRCDIR} make -j${CORES} firmware make -j${CORES} simu make -j${CORES} gtests ; ./gtests # OpenTX on Horus beta boards rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=HORUS -DPCBREV=10 -DHELI=NO -DUSB=SERIAL -DCLI=YES -DDEBUG=YES -DGVARS=YES ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=HORUS -DPCBREV=10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} make -j${CORES} firmware make -j${CORES} simu -# make -j${CORES} gtests ; ./gtests +make -j${CORES} gtests ; ./gtests # OpenTX on Horus rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=HORUS -DHELI=NO -DUSB=SERIAL -DCLI=YES -DDEBUG=YES -DGVARS=YES ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=HORUS -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} make -j${CORES} firmware make -j${CORES} simu -# make -j${CORES} gtests ; ./gtests +make -j${CORES} gtests ; ./gtests # Companion rm -rf *