From 10049de852b41df8d0fc49edc8bdb042e49ceb80 Mon Sep 17 00:00:00 2001 From: "bsongis@gmail.com" Date: Mon, 17 Jun 2013 17:21:36 +0000 Subject: [PATCH] [Taranis / sky9x] Specific volume for beeps/wav/vario/background [Taranis] New alarm when TELEMETRY lost/back --- src/audio_arm.cpp | 63 +++++++++++++++++++++++----------------- src/audio_arm.h | 9 ++++-- src/gui/menu_general.cpp | 51 ++++++++++++++++++++++---------- src/logs.cpp | 2 +- src/myeeprom.h | 6 +++- src/opentx.cpp | 5 ++++ src/opentx.h | 4 +++ src/translations.cpp | 4 +++ src/translations.h | 4 +++ 9 files changed, 101 insertions(+), 47 deletions(-) diff --git a/src/audio_arm.cpp b/src/audio_arm.cpp index 89fd48787..39dc31e80 100644 --- a/src/audio_arm.cpp +++ b/src/audio_arm.cpp @@ -37,6 +37,15 @@ #include "opentx.h" #include +const unsigned int toneVolumes[] = { + 4000, + 8000, + 16000, + 24000, + 32000 +}; + + #if defined(SDCARD) const char * audioFilenames[] = { "tada", @@ -76,11 +85,13 @@ const char * audioFilenames[] = { "rssi_red", "swr_red", #endif + "telemko", + "telemok" }; -uint32_t sdAvailableSystemAudioFiles = 0; -uint8_t sdAvailablePhaseAudioFiles[MAX_PHASES] = { 0 }; -uint8_t sdAvailableMixerAudioFiles[MAX_MIXERS] = { 0 }; +uint64_t sdAvailableSystemAudioFiles = 0; +uint8_t sdAvailablePhaseAudioFiles[MAX_PHASES] = { 0 }; +uint8_t sdAvailableMixerAudioFiles[MAX_MIXERS] = { 0 }; void refreshSystemAudioFiles() { @@ -97,13 +108,13 @@ void refreshSystemAudioFiles() assert(sizeof(audioFilenames)==AU_FRSKY_FIRST*sizeof(char *)); assert(sizeof(sdAvailableSystemAudioFiles)*8 >= AU_FRSKY_FIRST); - uint32_t availableAudioFiles = 0; + uint64_t availableAudioFiles = 0; for (uint32_t i=0; iid, 2); strcpy(filename+sizeof(SYSTEM_SOUNDS_PATH), audioFilenames[i]); @@ -316,7 +327,7 @@ void mix(uint16_t * result, int sample, unsigned int fade) #define RIFF_CHUNK_SIZE 12 uint8_t wavBuffer[AUDIO_BUFFER_SIZE*2]; -int AudioQueue::mixWav(AudioContext &context, AudioBuffer *buffer, unsigned int weight) +int AudioQueue::mixWav(AudioContext &context, AudioBuffer *buffer, int volume, unsigned int fade) { FRESULT result = FR_OK; UINT read = 0; @@ -379,18 +390,18 @@ int AudioQueue::mixWav(AudioContext &context, AudioBuffer *buffer, unsigned int read /= 2; for (uint32_t i=0; idata; @@ -401,13 +412,13 @@ int AudioQueue::mixWav(AudioContext &context, AudioBuffer *buffer, unsigned int return -result; } #else -int AudioQueue::mixWav(AudioContext &context, AudioBuffer *buffer, unsigned int weight) +int AudioQueue::mixWav(AudioContext &context, AudioBuffer *buffer, int volume, unsigned int fade) { return 0; } #endif -int AudioQueue::mixTone(AudioContext &context, AudioBuffer *buffer, unsigned int weight) +int AudioQueue::mixBeep(AudioContext &context, AudioBuffer *buffer, int volume, unsigned int fade) { AudioFragment & fragment = context.fragment; unsigned int duration = 0; @@ -421,7 +432,7 @@ int AudioQueue::mixTone(AudioContext &context, AudioBuffer *buffer, unsigned int if (context.state.tone.idx >= context.state.tone.count) context.state.tone.idx = 0; double t = (M_PI * 2 * periods) / context.state.tone.count; for (unsigned int i=0; i(AUDIO_BUFFER_DURATION, fragment.tone.duration); for (unsigned int i=0; idata[i], context.state.tone.points[context.state.tone.idx], weight); + mix(&buffer->data[i], context.state.tone.points[context.state.tone.idx], fade); context.state.tone.idx = context.state.tone.idx + 1; if (context.state.tone.idx >= context.state.tone.count) context.state.tone.idx = 0; } @@ -452,16 +463,16 @@ int AudioQueue::mixTone(AudioContext &context, AudioBuffer *buffer, unsigned int return result; } -int AudioQueue::mixAudioContext(AudioContext &context, AudioBuffer *buffer, unsigned int weight) +int AudioQueue::mixAudioContext(AudioContext &context, AudioBuffer *buffer, int beepVolume, int wavVolume, unsigned int fade) { int result; AudioFragment & fragment = context.fragment; - if (fragment.type == FRAGMENT_FILE) { - result = mixWav(context, buffer, weight); + if (fragment.type == FRAGMENT_TONE) { + result = mixBeep(context, buffer, beepVolume, fade); } - else if (fragment.type == FRAGMENT_TONE) { - result = mixTone(context, buffer, weight); + else if (fragment.type == FRAGMENT_FILE) { + result = mixWav(context, buffer, wavVolume, fade); } else { result = 0; @@ -475,7 +486,7 @@ void AudioQueue::wakeup() int result; AudioBuffer *buffer = getEmptyBuffer(); if (buffer) { - unsigned int weight = 0; + unsigned int fade = 0; int size = 0; // write silence in the buffer @@ -484,17 +495,17 @@ void AudioQueue::wakeup() } // mix the foreground context - result = mixAudioContext(foregroundContext, buffer, weight); + result = mixAudioContext(foregroundContext, buffer, g_eeGeneral.beepVolume, g_eeGeneral.wavVolume, fade); if (result > 0) { size = max(size, result); - weight += 1; + fade += 1; } // mix the normal context - result = mixAudioContext(currentContext, buffer, weight); + result = mixAudioContext(currentContext, buffer, g_eeGeneral.beepVolume, g_eeGeneral.wavVolume, fade); if (result > 0) { size = max(size, result); - weight += 1; + fade += 1; } else { CoEnterMutexSection(audioMutex); @@ -510,7 +521,7 @@ void AudioQueue::wakeup() // mix the background context if (!isFunctionActive(FUNC_BACKGND_MUSIC_PAUSE)) { - result = mixAudioContext(backgroundContext, buffer, weight); + result = mixAudioContext(backgroundContext, buffer, g_eeGeneral.varioVolume, g_eeGeneral.backgroundVolume, fade); if (result > 0) { size = max(size, result); } @@ -530,7 +541,7 @@ inline unsigned int getToneLength(uint16_t len) if (g_eeGeneral.beepLength < 0) { result /= (1-g_eeGeneral.beepLength); } - if (g_eeGeneral.beepLength > 0) { + else if (g_eeGeneral.beepLength > 0) { result *= (1+g_eeGeneral.beepLength); } return result; diff --git a/src/audio_arm.h b/src/audio_arm.h index 9f2bc9de0..76b77d6d3 100644 --- a/src/audio_arm.h +++ b/src/audio_arm.h @@ -177,9 +177,9 @@ class AudioQueue { void wakeup(); - int mixAudioContext(AudioContext &context, AudioBuffer *buffer, unsigned int weight); - int mixTone(AudioContext &context, AudioBuffer *buffer, unsigned int weight); - int mixWav(AudioContext &context, AudioBuffer *buffer, unsigned int weight); + int mixAudioContext(AudioContext &context, AudioBuffer *buffer, int beepVolume, int wavVolume, unsigned int fade); + int mixBeep(AudioContext &context, AudioBuffer *buffer, int volume, unsigned int fade); + int mixWav(AudioContext &context, AudioBuffer *buffer, int volume, unsigned int fade); volatile bool state; uint8_t ridx; @@ -270,6 +270,9 @@ void audioStart(); #define AUDIO_SWR_RED() audioEvent(AU_SWR_RED) #endif +#define AUDIO_TELEMETRY_LOST() audioEvent(AU_TELEMETRY_LOST) +#define AUDIO_TELEMETRY_BACK() audioEvent(AU_TELEMETRY_BACK) + #define AUDIO_HEARTBEAT() #define SYSTEM_AUDIO_CATEGORY 0 diff --git a/src/gui/menu_general.cpp b/src/gui/menu_general.cpp index 6e7d8bad1..91cf576c1 100644 --- a/src/gui/menu_general.cpp +++ b/src/gui/menu_general.cpp @@ -142,9 +142,13 @@ enum menuGeneralSetupItems { ITEM_SETUP_SOUND_LABEL, IF_AUDIO(ITEM_SETUP_BEEP_MODE) IF_BUZZER(ITEM_SETUP_BUZZER_MODE) + IF_VOICE(ITEM_SETUP_SPEAKER_VOLUME) + IF_CPUARM(ITEM_SETUP_BEEP_VOLUME) + IF_CPUARM(ITEM_SETUP_WAV_VOLUME) + IF_CPUARM(ITEM_SETUP_VARIO_VOLUME) + IF_CPUARM(ITEM_SETUP_BACKGROUND_VOLUME) ITEM_SETUP_BEEP_LENGTH, IF_AUDIO(ITEM_SETUP_SPEAKER_PITCH) - IF_VOICE(ITEM_SETUP_SPEAKER_VOLUME) IF_HAPTIC(ITEM_SETUP_HAPTIC_LABEL) IF_HAPTIC(ITEM_SETUP_HAPTIC_MODE) IF_HAPTIC(ITEM_SETUP_HAPTIC_LENGTH) @@ -201,7 +205,7 @@ void menuGeneralSetup(uint8_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) IF_BATTGRAPH(1) LABEL(SOUND), IF_AUDIO(0) IF_BUZZER(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_PCBSKY9X(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_GPS(0) IF_GPS(0) IF_PXX(0) IF_CPUARM(0) IF_CPUARM(0) IF_FAI_CHOICE(0) 0, LABEL(TX_MODE), CASE_PCBTARANIS(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), IF_AUDIO(0) IF_BUZZER(0) IF_VOICE(0) IF_CPUARM(0) IF_CPUARM(0) IF_CPUARM(0) IF_CPUARM(0) 0, IF_AUDIO(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_PCBSKY9X(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_GPS(0) IF_GPS(0) IF_PXX(0) IF_CPUARM(0) IF_CPUARM(0) IF_FAI_CHOICE(0) 0, LABEL(TX_MODE), CASE_PCBTARANIS(0) 1/*to force edit mode*/}); uint8_t sub = m_posVert - 1; @@ -321,20 +325,6 @@ void menuGeneralSetup(uint8_t event) break; #endif - case ITEM_SETUP_BEEP_LENGTH: - SLIDER_5POS(y, g_eeGeneral.beepLength, STR_LENGTH, event, attr); - break; - -#if defined(AUDIO) - case ITEM_SETUP_SPEAKER_PITCH: - lcd_putsLeft( y, STR_SPKRPITCH); - lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.speakerPitch, attr|LEFT); - if (attr) { - CHECK_INCDEC_GENVAR(event, g_eeGeneral.speakerPitch, 0, 20); - } - break; -#endif - #if defined(VOICE) case ITEM_SETUP_SPEAKER_VOLUME: { @@ -354,6 +344,35 @@ void menuGeneralSetup(uint8_t event) } #endif +#if defined(CPUARM) + case ITEM_SETUP_BEEP_VOLUME: + SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr); + break; + case ITEM_SETUP_WAV_VOLUME: + SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr); + break; + case ITEM_SETUP_VARIO_VOLUME: + SLIDER_5POS(y, g_eeGeneral.varioVolume, STR_VARIO_VOLUME, event, attr); + break; + case ITEM_SETUP_BACKGROUND_VOLUME: + SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr); + break; +#endif + + case ITEM_SETUP_BEEP_LENGTH: + SLIDER_5POS(y, g_eeGeneral.beepLength, STR_LENGTH, event, attr); + break; + +#if defined(AUDIO) + case ITEM_SETUP_SPEAKER_PITCH: + lcd_putsLeft( y, STR_SPKRPITCH); + lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.speakerPitch, attr|LEFT); + if (attr) { + CHECK_INCDEC_GENVAR(event, g_eeGeneral.speakerPitch, 0, 20); + } + break; +#endif + #if defined(HAPTIC) case ITEM_SETUP_HAPTIC_LABEL: lcd_putsLeft(y, STR_HAPTIC_LABEL); diff --git a/src/logs.cpp b/src/logs.cpp index 968a99ecf..105447777 100644 --- a/src/logs.cpp +++ b/src/logs.cpp @@ -173,7 +173,7 @@ void writeLogs() #if defined(RTCLOCK) struct gtm utm; gettime(&utm); - f_printf(&g_oLogFile, "%4d-%02d-%02d,%02d:%02d:%02d.%02d,", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100); + f_printf(&g_oLogFile, "%4d-%02d-%02d,%02d:%02d:%02d.%02d0,", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100); #else f_printf(&g_oLogFile, "%d,", tmr10ms); #endif diff --git a/src/myeeprom.h b/src/myeeprom.h index 22803cdbb..1c342e173 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -210,7 +210,11 @@ enum BeeperMode { uint8_t rotarySteps; \ uint8_t countryCode; \ uint8_t imperial; \ - char ttsLanguage[2]; + char ttsLanguage[2]; \ + int8_t beepVolume; \ + int8_t wavVolume; \ + int8_t varioVolume; \ + int8_t backgroundVolume; #elif defined(PXX) #define EXTRA_GENERAL_FIELDS uint8_t countryCode; #else diff --git a/src/opentx.cpp b/src/opentx.cpp index 885a8f0c4..8fc9b81d2 100644 --- a/src/opentx.cpp +++ b/src/opentx.cpp @@ -406,6 +406,11 @@ void generalDefault() g_eeGeneral.inactivityTimer = 10; #endif +#if defined(CPUARM) + g_eeGeneral.wavVolume = 2; + g_eeGeneral.backgroundVolume = 1; +#endif + g_eeGeneral.chkSum = 0xFFFF; } diff --git a/src/opentx.h b/src/opentx.h index b3be90fd2..292c8ae99 100644 --- a/src/opentx.h +++ b/src/opentx.h @@ -1304,6 +1304,10 @@ enum AUDIO_SOUNDS { AU_RSSI_ORANGE, AU_RSSI_RED, AU_SWR_RED, +#endif +#if defined(CPUARM) + AU_TELEMETRY_LOST, + AU_TELEMETRY_BACK, #endif AU_FRSKY_FIRST, AU_FRSKY_BEEP1 = AU_FRSKY_FIRST, diff --git a/src/translations.cpp b/src/translations.cpp index fe9450626..83c75c91d 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -343,6 +343,10 @@ const pm_char STR_CURRENT_CALIB[] PROGMEM = TR_CURRENT_CALIB; const pm_char STR_UNITSSYSTEM[] PROGMEM = TR_UNITSSYSTEM; const pm_char STR_VOICELANG[] PROGMEM = TR_VOICELANG; const pm_char STR_MODELIDUSED[] PROGMEM = TR_MODELIDUSED; +const pm_char STR_BEEP_VOLUME[] PROGMEM = INDENT "Beep Volume"; +const pm_char STR_WAV_VOLUME[] PROGMEM = INDENT "Wav Volume"; +const pm_char STR_VARIO_VOLUME[] PROGMEM = INDENT "Vario Volume"; +const pm_char STR_BG_VOLUME[] PROGMEM = INDENT "Bg Volume"; #endif #if defined(NAVIGATION_MENUS) diff --git a/src/translations.h b/src/translations.h index 6a63c0345..ca9ccf4d4 100644 --- a/src/translations.h +++ b/src/translations.h @@ -473,6 +473,10 @@ extern const pm_char STR_CURRENT[]; extern const pm_char STR_UNITSSYSTEM[]; extern const pm_char STR_VOICELANG[]; extern const pm_char STR_MODELIDUSED[]; + extern const pm_char STR_BEEP_VOLUME[]; + extern const pm_char STR_WAV_VOLUME[]; + extern const pm_char STR_VARIO_VOLUME[]; + extern const pm_char STR_BG_VOLUME[]; #else #define LEN_CALIB_FIELDS PSIZE(TR_BATT_CALIB) #endif