From be3c202e5ef6b3be05996df04b8426e265c5996c Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Wed, 30 Jan 2019 22:20:58 +0100 Subject: [PATCH 01/37] remove voice map and read voice.ini on demand --- src/config/model.c | 4 +++- src/config/voice.c | 28 +++++++---------------- src/config/voice.h | 2 +- src/extended_audio.c | 33 +++++++++++++++------------- src/extended_audio.h | 3 ++- src/music.h | 7 +++++- src/pages/common/_voiceconfig_page.c | 14 ++++++------ src/timer.c | 21 +++++++++--------- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/config/model.c b/src/config/model.c index 625ecbf59e..99add0e57c 100644 --- a/src/config/model.c +++ b/src/config/model.c @@ -19,6 +19,7 @@ #include "tx.h" #include "music.h" #include "extended_audio.h" +#include "voice.h" #include #include @@ -1076,7 +1077,8 @@ int assign_int(void* ptr, const struct struct_map *map, int map_size) if (MATCH_SECTION(SECTION_VOICE)) { u16 val = atoi(value); - if(val>MAX_VOICEMAP_ENTRIES-1 || voice_map[val].duration == 0 || val < CUSTOM_ALARM_ID) { + CONFIG_VoiceParse(val); + if(current_voice_mapping.duration == 0 || val < CUSTOM_ALARM_ID) { printf("%s: Music %s not found in voice.ini or below ID %d\n", section, value, CUSTOM_ALARM_ID); return 0; } diff --git a/src/config/voice.c b/src/config/voice.c index 4371bc45bf..1d019faa8a 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -32,7 +32,6 @@ const char SECTION_VOICE_CUSTOM[] = "custom"; static int ini_handler(void* user, const char* section, const char* name, const char* value) { - // ini_handler returns a requested mp3 label passed at *user to tempstring u16 req_id = *((long*)user); u16 id = atoi(name); const char* ptr = value; @@ -47,31 +46,20 @@ static int ini_handler(void* user, const char* section, const char* name, const duration = atoi(ptr + 1); } -#if HAS_MUSIC_CONFIG if ( k && (req_id != MAX_VOICEMAP_ENTRIES) && (req_id == id) ) { - strlcpy(tempstring, value, k+1); - tempstring[MAX_VOICE_LABEL] = '\0'; // limit label length + current_voice_mapping.duration = duration; +#if HAS_MUSIC_CONFIG + strlcpy(tempstring, value, k+1); // return a requested mp3 label passed at *user to tempstring +#endif +// printf("returning for id %d:duration %d, label %s\n", id, current_voice_mapping.duration, current_voice_mapping.label); return 1; } -#endif if ( req_id == MAX_VOICEMAP_ENTRIES ) { - if (MATCH_SECTION(SECTION_VOICE_GLOBAL)) { - for (int i = 0; i < CUSTOM_ALARM_ID; i++) { - snprintf(tempstring, 4, "%d", i); - if (MATCH_KEY(tempstring)) { - voice_map[i].duration = duration; - voice_map[i].id = i; - return 1; - } - } - } if (MATCH_SECTION(SECTION_VOICE_CUSTOM)) { - voice_map[voice_map_entries].duration = duration; - voice_map[voice_map_entries].id = id; + //Initiai count of custom voicemap entries voice_map_entries++; return 1; } - printf("Unknown entry in voice.ini: %s\n", value); return 0; } return 1; // voice label ignored @@ -98,11 +86,11 @@ const char* CONFIG_VoiceParse(unsigned id) voice_map_entries = CUSTOM_ALARM_ID; // Reserve space in map for global alerts if (CONFIG_IniParse(filename, ini_handler, &id)) { printf("Failed to parse voice.ini\n"); - Transmitter.audio_player = AUDIO_NONE; // disable external voice output + //Transmitter.audio_player = AUDIO_NONE; // disable external voice output tempstring[0] = '\0'; } } - if ( (id < MAX_VOICEMAP_ENTRIES) && (id >= CUSTOM_ALARM_ID) ) { + if ( (id < MAX_VOICEMAP_ENTRIES) ) { if (CONFIG_IniParse(filename, ini_handler, &id)) { // ini handler will return tempstring with label of id } diff --git a/src/config/voice.h b/src/config/voice.h index abd6db56df..7f4de70aea 100644 --- a/src/config/voice.h +++ b/src/config/voice.h @@ -1 +1 @@ -const char* CONFIG_VoiceParse(); +const char* CONFIG_VoiceParse(unsigned id); diff --git a/src/extended_audio.c b/src/extended_audio.c index ff02221d8b..7e6d282570 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -17,6 +17,7 @@ #include "music.h" #include "config/tx.h" #include "config/model.h" +#include "config/voice.h" #include "extended_audio.h" #include "stdlib.h" @@ -26,8 +27,9 @@ #if HAS_EXTENDED_AUDIO u16 voice_map_entries; -struct VoiceMap voice_map[MAX_VOICEMAP_ENTRIES]; -u16 audio_queue[AUDIO_QUEUE_LENGTH]; +//struct VoiceMap voice_map[MAX_VOICEMAP_ENTRIES]; +struct VoiceMap current_voice_mapping; +struct AudioQueue audio_queue[AUDIO_QUEUE_LENGTH]; u8 next_audio; u8 num_audio; u32 audio_queue_time; @@ -97,22 +99,21 @@ u16 AUDIO_CalculateChecksum(u8 *buffer) { } // Generate a string to play. -int AUDIO_Play(u16 music) { - +int AUDIO_Play(u16 id) { // If we are just playing beeps.... - if (music == MUSIC_KEY_PRESSING || music == MUSIC_MAXLEN) { + if (id == MUSIC_KEY_PRESSING || id == MUSIC_MAXLEN) { printf("Voice: beep only\n"); return 0; } - printf("Voice: Playing mp3 #%d\n", voice_map[music].id); + printf("Voice: Playing mp3 #%d\n", id); #ifdef EMULATOR // On emulators call mpg123 to play mp3s char cmd[70]; u16 vol_val = Transmitter.audio_vol * 32786/10; #ifdef _WIN32 - sprintf(cmd, "start /B ..\\..\\mpg123 -f %d -q ..\\..\\mp3\\%04d*.mp3 > nul 2>&1", vol_val, voice_map[music].id); + sprintf(cmd, "start /B ..\\..\\mpg123 -f %d -q ..\\..\\mp3\\%04d*.mp3 > nul 2>&1", vol_val, id); #else - sprintf(cmd, "mpg123 -f %d -q ../../mp3/%04d*.mp3 > /dev/null 2>&1 &", vol_val, voice_map[music].id); + sprintf(cmd, "mpg123 -f %d -q ../../mp3/%04d*.mp3 > /dev/null 2>&1 &", vol_val, id); #endif // _WIN32 system(cmd); return 1; @@ -125,14 +126,14 @@ int AUDIO_Play(u16 music) { case AUDIO_NONE: return 0; // Play beeps... case AUDIO_AUDIOFX: { char buffer[5]; - snprintf(buffer, sizeof(buffer), "#%d\n", voice_map[music].id); + snprintf(buffer, sizeof(buffer), "#%d\n", id); AUDIO_Print(buffer); break; } case AUDIO_DF_PLAYER: // Fill in track number and checksum player_buffer[3] = 0x12; - u16ToArray(voice_map[music].id, player_buffer+5); + u16ToArray(id, player_buffer+5); u16ToArray(AUDIO_CalculateChecksum(player_buffer), player_buffer+7); AUDIO_Send(player_buffer, sizeof(player_buffer)); break; @@ -176,8 +177,8 @@ void AUDIO_CheckQueue() { u32 t = CLOCK_getms(); if (next_audio < num_audio) { if (t > audio_queue_time) { - AUDIO_Play(audio_queue[next_audio]); - audio_queue_time = CLOCK_getms() + voice_map[audio_queue[next_audio]].duration; + AUDIO_Play(audio_queue[next_audio].id); + audio_queue_time = CLOCK_getms() + audio_queue[next_audio].duration; next_audio++; } } else if (num_audio && t > audio_queue_time) { @@ -216,12 +217,14 @@ int AUDIO_AddQueue(u16 music) { printf("Voice: Queue full, cannot add new mp3 #%d\n",music); return 0; } - if (!voice_map[music].duration) { + CONFIG_VoiceParse(music); + if (!current_voice_mapping.duration) { printf("Voice: mp3 length is zero\n"); return 0; } - - audio_queue[num_audio++] = music; + audio_queue[num_audio].duration = current_voice_mapping.duration; + audio_queue[num_audio].id = music; + num_audio++; return 1; } diff --git a/src/extended_audio.h b/src/extended_audio.h index ae9cd65f5c..bdb25e3e5d 100644 --- a/src/extended_audio.h +++ b/src/extended_audio.h @@ -12,7 +12,8 @@ void AUDIO_CheckQueue(); int AUDIO_AddQueue(u16 music); int AUDIO_VoiceAvailable(); -extern u16 audio_queue[AUDIO_QUEUE_LENGTH]; +extern struct AudioQueue audio_queue[AUDIO_QUEUE_LENGTH]; +extern struct VoiceMap current_voice_mapping; extern u8 next_audio; extern u8 num_audio; extern u32 audio_queue_time; diff --git a/src/music.h b/src/music.h index 59d78b480f..4fa145bc4f 100644 --- a/src/music.h +++ b/src/music.h @@ -113,7 +113,12 @@ struct VoiceMap { u16 duration; }; -extern struct VoiceMap voice_map[MAX_VOICEMAP_ENTRIES]; +struct AudioQueue { + u16 id; + u16 duration; +}; + +//extern struct VoiceMap voice_map[MAX_VOICEMAP_ENTRIES]; u16 MUSIC_GetTelemetryAlarm(enum Music music); u16 MUSIC_GetTimerAlarm(enum Music music); diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index 15916fe8e3..8c4a56046e 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -123,25 +123,25 @@ static const char *voicelbl_cb(guiObject_t *obj, const void *data) switch (voiceconfig_getsrctype(idx)) { case VOICE_SRC_SWITCH: if (Model.voice.switches[idx - VOICE_SRC_SWITCH].music) - return CONFIG_VoiceParse(voice_map[Model.voice.switches[idx - VOICE_SRC_SWITCH].music].id); + return CONFIG_VoiceParse(Model.voice.switches[idx - VOICE_SRC_SWITCH].music); break; #if NUM_AUX_KNOBS case VOICE_SRC_AUX: - if(Model.voice.aux[idx - VOICE_SRC_AUX].music) - return CONFIG_VoiceParse(voice_map[Model.voice.aux[idx - VOICE_SRC_AUX].music].id); + if (Model.voice.aux[idx - VOICE_SRC_AUX].music) + return CONFIG_VoiceParse(Model.voice.aux[idx - VOICE_SRC_AUX].music); break; #endif case VOICE_SRC_TIMER: if (Model.voice.timer[idx - VOICE_SRC_TIMER].music) - return CONFIG_VoiceParse(voice_map[Model.voice.timer[idx - VOICE_SRC_TIMER].music].id); + return CONFIG_VoiceParse(Model.voice.timer[idx - VOICE_SRC_TIMER].music); break; case VOICE_SRC_TELEMETRY: if (Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY].music) - return CONFIG_VoiceParse(voice_map[Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY].music].id); + return CONFIG_VoiceParse(Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY].music); break; case VOICE_SRC_MIXER: if (Model.voice.mixer[idx - VOICE_SRC_MIXER].music) - return CONFIG_VoiceParse(voice_map[Model.voice.mixer[idx - VOICE_SRC_MIXER].music].id); + return CONFIG_VoiceParse(Model.voice.mixer[idx - VOICE_SRC_MIXER].music); break; } return strcpy(tempstring, ""); @@ -185,7 +185,7 @@ static const char *voiceid_cb(guiObject_t *obj, int dir, void *data) return strcpy(tempstring, _tr("None")); } vpt->music = GUI_TextSelectHelper(vpt->music - CUSTOM_ALARM_ID + 1, //Relabling so voice in menu starts with 1 - 1, voice_map_entries - CUSTOM_ALARM_ID, dir, 1, 10, NULL) + CUSTOM_ALARM_ID - 1; + 1, voice_map_entries, dir, 1, 10, NULL) + CUSTOM_ALARM_ID - 1; snprintf(tempstring, 5, "%d", vpt->music - CUSTOM_ALARM_ID + 1); GUI_Redraw(&gui->voicelbl[cur_row]); return tempstring; diff --git a/src/timer.c b/src/timer.c index b18f6fe116..c47fc3e514 100644 --- a/src/timer.c +++ b/src/timer.c @@ -186,6 +186,7 @@ void TIMER_Update() } else if (Model.timer[i].type == TIMER_STOPWATCH || Model.timer[i].type == TIMER_STOPWATCH_PROP) { timer_val[i] += delta; #if HAS_EXTENDED_AUDIO +// CONFIG_VoiceParse(MUSIC_ALARM1 + i); warn_time = 60000; // Begin stopwatch alerts after 1 minute while(timer_val[i]/(warn_time+1)){ if (timer_val[i] >= 60000 && timer_val[i] < 360000) @@ -195,10 +196,10 @@ void TIMER_Update() if (timer_val[i] >= 600000) warn_time += 300000; // 5-minute alerts above 10 minutes } - warn_time -= voice_map[MUSIC_ALARM1 + i].duration; - if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) - MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), - (timer_val[i]+voice_map[MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i)].duration)/1000, VOICE_UNIT_TIME, 0); +// warn_time -= voice_map[MUSIC_ALARM1 + i].duration; +// if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) +// MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), +// (timer_val[i]+voice_map[MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i)].duration)/1000, VOICE_UNIT_TIME, 0); #endif } else { // start to beep for each prealert_interval at the last prealert_time(seconds) @@ -209,12 +210,12 @@ void TIMER_Update() warn_time = ((timer_val[i] / Transmitter.countdown_timer_settings.prealert_interval) * Transmitter.countdown_timer_settings.prealert_interval); #if HAS_EXTENDED_AUDIO - warn_time += voice_map[MUSIC_TIMER_WARNING].duration + 1000; +// warn_time += voice_map[MUSIC_TIMER_WARNING].duration + 1000; #endif if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) { #if HAS_EXTENDED_AUDIO - MUSIC_PlayValue(MUSIC_TIMER_WARNING, - (timer_val[i]-voice_map[MUSIC_TIMER_WARNING].duration-1000)/1000,VOICE_UNIT_TIME,0); +// MUSIC_PlayValue(MUSIC_TIMER_WARNING, +// (timer_val[i]-voice_map[MUSIC_TIMER_WARNING].duration-1000)/1000,VOICE_UNIT_TIME,0); #else MUSIC_Play(MUSIC_TIMER_WARNING); #endif @@ -225,12 +226,12 @@ void TIMER_Update() warn_time = ((timer_val[i] - Transmitter.countdown_timer_settings.timeup_interval) / Transmitter.countdown_timer_settings.timeup_interval) * Transmitter.countdown_timer_settings.timeup_interval; #if HAS_EXTENDED_AUDIO - warn_time += voice_map[MUSIC_ALARM1 + i].duration; +// warn_time += voice_map[MUSIC_ALARM1 + i].duration; #endif if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) { #if HAS_EXTENDED_AUDIO - MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), - (timer_val[i]-voice_map[MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i)].duration)/-1000+1,VOICE_UNIT_TIME,0); +// MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), +// (timer_val[i]-voice_map[MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i)].duration)/-1000+1,VOICE_UNIT_TIME,0); #else MUSIC_Play(MUSIC_ALARM1 + i + 2); #endif From 63a386a52d8aadc843be1c8173583c4e83f59a10 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 1 Feb 2019 18:17:04 +0100 Subject: [PATCH 02/37] Handle timers in on demand voice.ini reading --- src/config/model.c | 8 ++++++++ src/extended_audio.c | 1 - src/pages/common/_voiceconfig_page.c | 15 ++++++++++++--- src/timer.c | 20 +++++++++----------- src/timer.h | 3 +++ 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/config/model.c b/src/config/model.c index 99add0e57c..8bd0d81c6a 100644 --- a/src/config/model.c +++ b/src/config/model.c @@ -1108,6 +1108,8 @@ int assign_int(void* ptr, const struct struct_map *map, int map_size) for (int i = 0; i < NUM_TIMERS; i++) { if (MATCH_KEY(VOICE_TIMER[i])) { m->voice.timer[i].music = val; + CONFIG_VoiceParse(MUSIC_ALARM1+i); + m->timer[i].duration = current_voice_mapping.duration; return 1; } } @@ -1496,6 +1498,12 @@ static void clear_model(u8 full) } Model.ppmin_centerpw = 1500; Model.ppmin_deltapw = 400; +#if HAS_EXTENDED_AUDIO + for (int i = 0; i < NUM_TIMERS; i++) { + CONFIG_VoiceParse(MUSIC_ALARM1 + i); + Model.timer[i].duration = current_voice_mapping.duration; + } +#endif } u8 CONFIG_ReadModel(u8 model_num) { diff --git a/src/extended_audio.c b/src/extended_audio.c index 7e6d282570..03c42c308a 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -27,7 +27,6 @@ #if HAS_EXTENDED_AUDIO u16 voice_map_entries; -//struct VoiceMap voice_map[MAX_VOICEMAP_ENTRIES]; struct VoiceMap current_voice_mapping; struct AudioQueue audio_queue[AUDIO_QUEUE_LENGTH]; u8 next_audio; diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index 8c4a56046e..e87decd8cd 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -174,18 +174,27 @@ static const char *voiceid_cb(guiObject_t *obj, int dir, void *data) vpt = &Model.voice.mixer[idx - VOICE_SRC_MIXER]; break; } - if (dir == -1 && vpt->music == CUSTOM_ALARM_ID) // set to none below 1 + if (dir == -1 && vpt->music == CUSTOM_ALARM_ID) // set to none below 1 vpt->music = 0; - if (dir == 1 && vpt->music == 0) // set to CUSTOM_ALARM_ID when currently none + if (dir == 1 && vpt->music == 0) // set to CUSTOM_ALARM_ID when currently none vpt->music = CUSTOM_ALARM_ID - 1; GUI_TextSelectEnablePress((guiTextSelect_t *)obj, vpt->music); if (vpt->music == 0) { GUI_Redraw(&gui->voicelbl[cur_row]); + if (voiceconfig_getsrctype(idx) == VOICE_SRC_TIMER) { // Setting duration to global alarm value for timers + CONFIG_VoiceParse(idx - VOICE_SRC_TIMER + MUSIC_ALARM1); + Model.timer[idx - VOICE_SRC_TIMER].duration = current_voice_mapping.duration; + } return strcpy(tempstring, _tr("None")); } - vpt->music = GUI_TextSelectHelper(vpt->music - CUSTOM_ALARM_ID + 1, //Relabling so voice in menu starts with 1 + vpt->music = GUI_TextSelectHelper(vpt->music - CUSTOM_ALARM_ID + 1, // Relabling so voice in menu starts with 1 1, voice_map_entries, dir, 1, 10, NULL) + CUSTOM_ALARM_ID - 1; + + if (voiceconfig_getsrctype(idx) == VOICE_SRC_TIMER) { // Setting duration for custom timer alarms + CONFIG_VoiceParse(vpt->music); + Model.timer[idx - VOICE_SRC_TIMER].duration = current_voice_mapping.duration; + } snprintf(tempstring, 5, "%d", vpt->music - CUSTOM_ALARM_ID + 1); GUI_Redraw(&gui->voicelbl[cur_row]); return tempstring; diff --git a/src/timer.c b/src/timer.c index c47fc3e514..4605289e9b 100644 --- a/src/timer.c +++ b/src/timer.c @@ -186,7 +186,6 @@ void TIMER_Update() } else if (Model.timer[i].type == TIMER_STOPWATCH || Model.timer[i].type == TIMER_STOPWATCH_PROP) { timer_val[i] += delta; #if HAS_EXTENDED_AUDIO -// CONFIG_VoiceParse(MUSIC_ALARM1 + i); warn_time = 60000; // Begin stopwatch alerts after 1 minute while(timer_val[i]/(warn_time+1)){ if (timer_val[i] >= 60000 && timer_val[i] < 360000) @@ -196,10 +195,10 @@ void TIMER_Update() if (timer_val[i] >= 600000) warn_time += 300000; // 5-minute alerts above 10 minutes } -// warn_time -= voice_map[MUSIC_ALARM1 + i].duration; -// if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) -// MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), -// (timer_val[i]+voice_map[MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i)].duration)/1000, VOICE_UNIT_TIME, 0); + warn_time -= Model.timer[MUSIC_ALARM1 + i].duration; + if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) + MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), + (timer_val[i]+Model.timer[MUSIC_ALARM1 + i].duration)/1000, VOICE_UNIT_TIME, 0); #endif } else { // start to beep for each prealert_interval at the last prealert_time(seconds) @@ -210,12 +209,11 @@ void TIMER_Update() warn_time = ((timer_val[i] / Transmitter.countdown_timer_settings.prealert_interval) * Transmitter.countdown_timer_settings.prealert_interval); #if HAS_EXTENDED_AUDIO -// warn_time += voice_map[MUSIC_TIMER_WARNING].duration + 1000; + warn_time += 2000; // Play voice prealerts earlier to optimize timing #endif if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) { #if HAS_EXTENDED_AUDIO -// MUSIC_PlayValue(MUSIC_TIMER_WARNING, -// (timer_val[i]-voice_map[MUSIC_TIMER_WARNING].duration-1000)/1000,VOICE_UNIT_TIME,0); + MUSIC_PlayValue(MUSIC_TIMER_WARNING, (timer_val[i]-2000)/1000, VOICE_UNIT_TIME, 0); #else MUSIC_Play(MUSIC_TIMER_WARNING); #endif @@ -226,12 +224,12 @@ void TIMER_Update() warn_time = ((timer_val[i] - Transmitter.countdown_timer_settings.timeup_interval) / Transmitter.countdown_timer_settings.timeup_interval) * Transmitter.countdown_timer_settings.timeup_interval; #if HAS_EXTENDED_AUDIO -// warn_time += voice_map[MUSIC_ALARM1 + i].duration; + warn_time += Model.timer[MUSIC_ALARM1 + i].duration; #endif if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) { #if HAS_EXTENDED_AUDIO -// MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), -// (timer_val[i]-voice_map[MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i)].duration)/-1000+1,VOICE_UNIT_TIME,0); + MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), + (timer_val[i]-Model.timer[MUSIC_ALARM1 + i].duration)/-1000+1,VOICE_UNIT_TIME,0); #else MUSIC_Play(MUSIC_ALARM1 + i + 2); #endif diff --git a/src/timer.h b/src/timer.h index 78c1b1b620..abad0b0d0f 100644 --- a/src/timer.h +++ b/src/timer.h @@ -24,6 +24,9 @@ struct Timer { u8 resetsrc; u16 timer; u32 val; +#if HAS_EXTENDED_AUDIO + u16 duration; +#endif enum TimerType type; u8 padding_1[3]; //Needed to ensure structure is word aligned }; From a195aa15b7ef3d80c621da5b857c8fbbd9ddacb6 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 1 Feb 2019 21:06:42 +0100 Subject: [PATCH 03/37] Cleanup and fix linter errors --- src/config/model.c | 2 +- src/config/tx.c | 2 +- src/config/voice.c | 11 +++++++---- src/extended_audio.c | 4 ++-- src/music.h | 2 -- src/timer.c | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/config/model.c b/src/config/model.c index 8bd0d81c6a..dd69a2e4f5 100644 --- a/src/config/model.c +++ b/src/config/model.c @@ -1078,7 +1078,7 @@ int assign_int(void* ptr, const struct struct_map *map, int map_size) if (MATCH_SECTION(SECTION_VOICE)) { u16 val = atoi(value); CONFIG_VoiceParse(val); - if(current_voice_mapping.duration == 0 || val < CUSTOM_ALARM_ID) { + if (current_voice_mapping.duration == 0 || val < CUSTOM_ALARM_ID) { printf("%s: Music %s not found in voice.ini or below ID %d\n", section, value, CUSTOM_ALARM_ID); return 0; } diff --git a/src/config/tx.c b/src/config/tx.c index d4cbfe7850..267ebeffe0 100644 --- a/src/config/tx.c +++ b/src/config/tx.c @@ -349,7 +349,7 @@ void CONFIG_LoadTx() CONFIG_LoadHardware(); CONFIG_IniParse("tx.ini", ini_handler, (void *)&Transmitter); crc32 = Crc(&Transmitter, sizeof(Transmitter)); -#if HAS_EXTENDED_AUDIO +#if HAS_MUSIC_CONFIG CONFIG_VoiceParse(MAX_VOICEMAP_ENTRIES); #endif return; diff --git a/src/config/voice.c b/src/config/voice.c index 1d019faa8a..80c05a0718 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -51,17 +51,18 @@ static int ini_handler(void* user, const char* section, const char* name, const #if HAS_MUSIC_CONFIG strlcpy(tempstring, value, k+1); // return a requested mp3 label passed at *user to tempstring #endif -// printf("returning for id %d:duration %d, label %s\n", id, current_voice_mapping.duration, current_voice_mapping.label); return 1; } +#if HAS_MUSIC_CONFIG if ( req_id == MAX_VOICEMAP_ENTRIES ) { if (MATCH_SECTION(SECTION_VOICE_CUSTOM)) { - //Initiai count of custom voicemap entries + // Initial count of custom voicemap entries voice_map_entries++; return 1; } return 0; } +#endif return 1; // voice label ignored } @@ -83,16 +84,18 @@ const char* CONFIG_VoiceParse(unsigned id) char filename[] = "media/voice.ini"; #endif if (id == MAX_VOICEMAP_ENTRIES) { // initial parse of voice.ini +#if HAS_MUSIC_CONFIG voice_map_entries = CUSTOM_ALARM_ID; // Reserve space in map for global alerts +#endif if (CONFIG_IniParse(filename, ini_handler, &id)) { printf("Failed to parse voice.ini\n"); - //Transmitter.audio_player = AUDIO_NONE; // disable external voice output + // Transmitter.audio_player = AUDIO_NONE; // disable external voice output tempstring[0] = '\0'; } } if ( (id < MAX_VOICEMAP_ENTRIES) ) { if (CONFIG_IniParse(filename, ini_handler, &id)) { - // ini handler will return tempstring with label of id + // ini handler will return tempstring with label of id and fill current_voice_mapping } } return tempstring; diff --git a/src/extended_audio.c b/src/extended_audio.c index 03c42c308a..46460991d5 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -110,9 +110,9 @@ int AUDIO_Play(u16 id) { char cmd[70]; u16 vol_val = Transmitter.audio_vol * 32786/10; #ifdef _WIN32 - sprintf(cmd, "start /B ..\\..\\mpg123 -f %d -q ..\\..\\mp3\\%04d*.mp3 > nul 2>&1", vol_val, id); + snprintf(cmd, sizeof(cmd), "start /B ..\\..\\mpg123 -f %d -q ..\\..\\mp3\\%04d*.mp3 > nul 2>&1", vol_val, id); #else - sprintf(cmd, "mpg123 -f %d -q ../../mp3/%04d*.mp3 > /dev/null 2>&1 &", vol_val, id); + snprintf(cmd, sizeof(cmd), "mpg123 -f %d -q ../../mp3/%04d*.mp3 > /dev/null 2>&1 &", vol_val, id); #endif // _WIN32 system(cmd); return 1; diff --git a/src/music.h b/src/music.h index 4fa145bc4f..5300d8e4fa 100644 --- a/src/music.h +++ b/src/music.h @@ -118,8 +118,6 @@ struct AudioQueue { u16 duration; }; -//extern struct VoiceMap voice_map[MAX_VOICEMAP_ENTRIES]; - u16 MUSIC_GetTelemetryAlarm(enum Music music); u16 MUSIC_GetTimerAlarm(enum Music music); void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec); diff --git a/src/timer.c b/src/timer.c index 4605289e9b..8489320f24 100644 --- a/src/timer.c +++ b/src/timer.c @@ -229,7 +229,7 @@ void TIMER_Update() if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) { #if HAS_EXTENDED_AUDIO MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), - (timer_val[i]-Model.timer[MUSIC_ALARM1 + i].duration)/-1000+1,VOICE_UNIT_TIME,0); + (timer_val[i]-Model.timer[MUSIC_ALARM1 + i].duration)/-1000+1, VOICE_UNIT_TIME, 0); #else MUSIC_Play(MUSIC_ALARM1 + i + 2); #endif From d3ee876d09fad8fe3bbe799ab066f40fac8b1da8 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 10:11:51 +0100 Subject: [PATCH 04/37] Correct voice file count and small rom save --- src/config/voice.c | 3 --- src/pages/common/_voiceconfig_page.c | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/config/voice.c b/src/config/voice.c index 80c05a0718..acfbdc49aa 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -84,9 +84,6 @@ const char* CONFIG_VoiceParse(unsigned id) char filename[] = "media/voice.ini"; #endif if (id == MAX_VOICEMAP_ENTRIES) { // initial parse of voice.ini -#if HAS_MUSIC_CONFIG - voice_map_entries = CUSTOM_ALARM_ID; // Reserve space in map for global alerts -#endif if (CONFIG_IniParse(filename, ini_handler, &id)) { printf("Failed to parse voice.ini\n"); // Transmitter.audio_player = AUDIO_NONE; // disable external voice output diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index e87decd8cd..2e9b929dcf 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -144,7 +144,8 @@ static const char *voicelbl_cb(guiObject_t *obj, const void *data) return CONFIG_VoiceParse(Model.voice.mixer[idx - VOICE_SRC_MIXER].music); break; } - return strcpy(tempstring, ""); + tempstring[0] = '\0'; + return tempstring; } static const char *voiceid_cb(guiObject_t *obj, int dir, void *data) From ea09e02017ef6edf60be61bcea6dcc820997ada5 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 12:11:12 +0100 Subject: [PATCH 05/37] fix build error when disabling voice-menu --- src/config/voice.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config/voice.c b/src/config/voice.c index acfbdc49aa..c764af6bd0 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -32,6 +32,9 @@ const char SECTION_VOICE_CUSTOM[] = "custom"; static int ini_handler(void* user, const char* section, const char* name, const char* value) { +#if !HAS_MUSIC_CONFIG + (void) section; +#endif u16 req_id = *((long*)user); u16 id = atoi(name); const char* ptr = value; From 30ede8dea0c46f621de1b4504f7cc103fab4dca5 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 13:07:19 +0100 Subject: [PATCH 06/37] Reduce function calls in MIXER_ApplyMixers --- src/mixer.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/mixer.c b/src/mixer.c index 47554e57a7..813310fa77 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -319,6 +319,9 @@ void MIXER_ApplyMixer(struct Mixer *mixer, volatile s32 *raw, s32 *orig_value) //4th: multiplex result s32 scaled_value = raw[mixer->dest + NUM_INPUTS + 1]; +#if HAS_EXTENDED_AUDIO + u16 diff_value = abs(value-scaled_value); +#endif switch(MIXER_MUX(mixer)) { case MUX_REPLACE: break; @@ -360,12 +363,12 @@ void MIXER_ApplyMixer(struct Mixer *mixer, volatile s32 *raw, s32 *orig_value) #if HAS_EXTENDED_AUDIO case MUX_BEEP: if (orig_value) { - if (abs(value - scaled_value) > 100) + if (diff_value > 100) MIXER_SET_BEEP_LOCK(mixer, 0); if (! MIXER_BEEP_LOCK(mixer)) { if ((value > *orig_value && value < scaled_value) || (value < *orig_value && value > scaled_value) || - (abs(value - scaled_value) <= 10)) { + (diff_value <= 10)) { MIXER_SET_BEEP_LOCK(mixer, 1); MUSIC_Play(MUSIC_MAXLEN); } @@ -375,12 +378,12 @@ void MIXER_ApplyMixer(struct Mixer *mixer, volatile s32 *raw, s32 *orig_value) break; case MUX_VOICE: if (orig_value) { - if (abs(value - scaled_value) > 100) + if (diff_value > 100) MIXER_SET_VOICE_LOCK(mixer, 0); if (! MIXER_VOICE_LOCK(mixer)) { if ((value > *orig_value && value < scaled_value) || (value < *orig_value && value > scaled_value) || - (abs(value - scaled_value) <= 10)) { + (diff_value <= 10)) { MIXER_SET_VOICE_LOCK(mixer, 1); if (Model.voice.mixer[mixer->dest].music) MUSIC_Play(Model.voice.mixer[mixer->dest].music); From 2724b8c4663e50589406083e2c2f8d9188ad9e5c Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 16:47:40 +0100 Subject: [PATCH 07/37] remove unnecessary pp line --- src/config/voice.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config/voice.c b/src/config/voice.c index c764af6bd0..72fc70d0b1 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -32,9 +32,7 @@ const char SECTION_VOICE_CUSTOM[] = "custom"; static int ini_handler(void* user, const char* section, const char* name, const char* value) { -#if !HAS_MUSIC_CONFIG (void) section; -#endif u16 req_id = *((long*)user); u16 id = atoi(name); const char* ptr = value; From da6c5cb4d9a0d0590ea449e4103aa8f1d8869165 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 18:25:33 +0100 Subject: [PATCH 08/37] use ptr to save rom in voiceconfig --- src/pages/common/_voiceconfig_page.c | 106 +++++++++------------------ 1 file changed, 35 insertions(+), 71 deletions(-) diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index 2e9b929dcf..bfd90c355b 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -29,8 +29,6 @@ static struct voiceconfig_obj * const gui = &gui_objs.u.voiceconfig; static u16 current_selected = 0; - - static u8 voiceconfig_getsrctype (u8 idx) { if (idx < NUM_SWITCHES) @@ -48,6 +46,29 @@ static u8 voiceconfig_getsrctype (u8 idx) return VOICE_SRC_MIXER; } +static struct CustomVoice *voiceconfig_setsrcptr(u8 idx) { + switch(voiceconfig_getsrctype(idx)) { + case VOICE_SRC_SWITCH: + return &Model.voice.switches[idx - VOICE_SRC_SWITCH]; + break; +#if NUM_AUX_KNOBS + case VOICE_SRC_AUX: + return &Model.voice.aux[idx - VOICE_SRC_AUX]; + break; +#endif + case VOICE_SRC_TIMER: + return &Model.voice.timer[idx - VOICE_SRC_TIMER]; + break; + case VOICE_SRC_TELEMETRY: + return &Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY]; + break; + case VOICE_SRC_MIXER: + return &Model.voice.mixer[idx - VOICE_SRC_MIXER]; + break; + } + return NULL; +} + const char *voiceconfig_str_cb(guiObject_t *obj, const void *data) { (void)obj; @@ -90,62 +111,24 @@ static void voice_test_cb(guiObject_t *obj, void *data) { (void) obj; u8 idx = (long)data; - switch(voiceconfig_getsrctype(idx)) { - case VOICE_SRC_SWITCH: - if (Model.voice.switches[idx - VOICE_SRC_SWITCH].music) - MUSIC_Play(Model.voice.switches[idx - VOICE_SRC_SWITCH].music); - break; -#if NUM_AUX_KNOBS - case VOICE_SRC_AUX: - if (Model.voice.aux[idx - VOICE_SRC_AUX].music) - MUSIC_Play(Model.voice.aux[idx - VOICE_SRC_AUX].music); - break; -#endif - case VOICE_SRC_TIMER: - if (Model.voice.timer[idx - VOICE_SRC_TIMER].music) - MUSIC_Play(Model.voice.timer[idx - VOICE_SRC_TIMER].music); - break; - case VOICE_SRC_TELEMETRY: - if (Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY].music) - MUSIC_Play(Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY].music); - break; - case VOICE_SRC_MIXER: - if (Model.voice.mixer[idx - VOICE_SRC_MIXER].music) - MUSIC_Play(Model.voice.mixer[idx - VOICE_SRC_MIXER].music); - break; - } + struct CustomVoice *vpt; + vpt = voiceconfig_setsrcptr(idx); + if (vpt == NULL) + return; + MUSIC_Play(vpt->music); } static const char *voicelbl_cb(guiObject_t *obj, const void *data) { (void) obj; int idx = (long)data; - switch (voiceconfig_getsrctype(idx)) { - case VOICE_SRC_SWITCH: - if (Model.voice.switches[idx - VOICE_SRC_SWITCH].music) - return CONFIG_VoiceParse(Model.voice.switches[idx - VOICE_SRC_SWITCH].music); - break; -#if NUM_AUX_KNOBS - case VOICE_SRC_AUX: - if (Model.voice.aux[idx - VOICE_SRC_AUX].music) - return CONFIG_VoiceParse(Model.voice.aux[idx - VOICE_SRC_AUX].music); - break; -#endif - case VOICE_SRC_TIMER: - if (Model.voice.timer[idx - VOICE_SRC_TIMER].music) - return CONFIG_VoiceParse(Model.voice.timer[idx - VOICE_SRC_TIMER].music); - break; - case VOICE_SRC_TELEMETRY: - if (Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY].music) - return CONFIG_VoiceParse(Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY].music); - break; - case VOICE_SRC_MIXER: - if (Model.voice.mixer[idx - VOICE_SRC_MIXER].music) - return CONFIG_VoiceParse(Model.voice.mixer[idx - VOICE_SRC_MIXER].music); - break; + struct CustomVoice *vpt; + vpt = voiceconfig_setsrcptr(idx); + if (!vpt->music) { + tempstring[0] = '\0'; + return tempstring; } - tempstring[0] = '\0'; - return tempstring; + return CONFIG_VoiceParse(vpt->music); } static const char *voiceid_cb(guiObject_t *obj, int dir, void *data) @@ -154,27 +137,8 @@ static const char *voiceid_cb(guiObject_t *obj, int dir, void *data) int idx = (long)data; int cur_row = idx - GUI_ScrollableCurrentRow(&gui->scrollable); struct CustomVoice *vpt; - vpt = NULL; + vpt = voiceconfig_setsrcptr(idx); - switch (voiceconfig_getsrctype(idx)) { - case VOICE_SRC_SWITCH: - vpt = &Model.voice.switches[idx - VOICE_SRC_SWITCH]; - break; -#if NUM_AUX_KNOBS - case VOICE_SRC_AUX: - vpt = &Model.voice.aux[idx - VOICE_SRC_AUX]; - break; -#endif - case VOICE_SRC_TIMER: - vpt = &Model.voice.timer[idx - VOICE_SRC_TIMER]; - break; - case VOICE_SRC_TELEMETRY: - vpt = &Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY]; - break; - case VOICE_SRC_MIXER: - vpt = &Model.voice.mixer[idx - VOICE_SRC_MIXER]; - break; - } if (dir == -1 && vpt->music == CUSTOM_ALARM_ID) // set to none below 1 vpt->music = 0; if (dir == 1 && vpt->music == 0) // set to CUSTOM_ALARM_ID when currently none From f1cf456a12ce8666ed99225273d5add2314d8ef1 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 18:41:29 +0100 Subject: [PATCH 09/37] fix linter error --- src/pages/common/_voiceconfig_page.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index bfd90c355b..bcb660299c 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -47,7 +47,7 @@ static u8 voiceconfig_getsrctype (u8 idx) } static struct CustomVoice *voiceconfig_setsrcptr(u8 idx) { - switch(voiceconfig_getsrctype(idx)) { + switch (voiceconfig_getsrctype(idx)) { case VOICE_SRC_SWITCH: return &Model.voice.switches[idx - VOICE_SRC_SWITCH]; break; From f17b9170c09365733d58e76fb6fb5fd5fd46229c Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 21:08:15 +0100 Subject: [PATCH 10/37] save rom in telemetry.c for voice --- src/telemetry.c | 55 +++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/telemetry.c b/src/telemetry.c index d040c68c45..b52ea7fa1c 100644 --- a/src/telemetry.c +++ b/src/telemetry.c @@ -380,14 +380,16 @@ void TELEMETRY_Alarm() #if HAS_EXTENDED_AUDIO u16 telem_music = MUSIC_GetTelemetryAlarm(MUSIC_TELEMALARM1 + telem_idx); s32 telem_value = TELEMETRY_GetValue(alarm->src); + unsigned telem_unit, telem_prec; + telem_unit = VOICE_UNIT_NONE; if (TELEMETRY_Type() == TELEM_DEVO) { switch (alarm->src) { case TELEM_DEVO_VOLT1: case TELEM_DEVO_VOLT2: - case TELEM_DEVO_VOLT3: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_VOLT,1); break; + case TELEM_DEVO_VOLT3: telem_unit = VOICE_UNIT_VOLT; telem_prec = 1; break; case TELEM_DEVO_RPM1: - case TELEM_DEVO_RPM2: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_RPM,0); break; - default: MUSIC_PlayValue(telem_music, telem_value-20,VOICE_UNIT_TEMP,0); break; + case TELEM_DEVO_RPM2: telem_unit = VOICE_UNIT_RPM; break; + default: telem_value -= 20; telem_unit = VOICE_UNIT_TEMP; break; } } if (TELEMETRY_Type() == TELEM_DSM) { @@ -396,7 +398,7 @@ void TELEMETRY_Alarm() case TELEM_DSM_JETCAT_RPM: case TELEM_DSM_ESC_RPM: #endif - case TELEM_DSM_FLOG_RPM1: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_RPM,0); break; + case TELEM_DSM_FLOG_RPM1: telem_unit = VOICE_UNIT_RPM; break; #if HAS_EXTENDED_TELEMETRY case TELEM_DSM_PBOX_VOLT1: case TELEM_DSM_PBOX_VOLT2: @@ -407,20 +409,20 @@ void TELEMETRY_Alarm() case TELEM_DSM_ESC_VOLT2: #endif case TELEM_DSM_FLOG_VOLT1: - case TELEM_DSM_FLOG_VOLT2: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_VOLT,2); break; + case TELEM_DSM_FLOG_VOLT2: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; #if HAS_EXTENDED_TELEMETRY - case TELEM_DSM_JETCAT_TEMPEGT: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_TEMP,0); break; + case TELEM_DSM_JETCAT_TEMPEGT: telem_unit = VOICE_UNIT_TEMP; break; case TELEM_DSM_ESC_TEMP1: case TELEM_DSM_ESC_TEMP2: #endif - case TELEM_DSM_FLOG_TEMP1: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_TEMP,1); break; + case TELEM_DSM_FLOG_TEMP1: telem_unit = VOICE_UNIT_TEMP; telem_prec = 1; break; #if HAS_EXTENDED_TELEMETRY case TELEM_DSM_RXPCAP_AMPS: - case TELEM_DSM_ESC_AMPS1: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_AMPS,2); break; + case TELEM_DSM_ESC_AMPS1: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; case TELEM_DSM_FPCAP_AMPS: case TELEM_DSM_ESC_AMPS2: #endif - case TELEM_DSM_AMPS1: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_AMPS,1); break; + case TELEM_DSM_AMPS1: telem_unit = VOICE_UNIT_AMPS; telem_prec = 1; break; case TELEM_DSM_ALTITUDE: case TELEM_DSM_ALTITUDE_MAX: case TELEM_DSM_VARIO_CLIMBRATE1: @@ -429,7 +431,7 @@ void TELEMETRY_Alarm() case TELEM_DSM_VARIO_CLIMBRATE4: case TELEM_DSM_VARIO_CLIMBRATE5: case TELEM_DSM_VARIO_CLIMBRATE6: - case TELEM_DSM_VARIO_ALTITUDE: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_ALTITUDE,1); break; + case TELEM_DSM_VARIO_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 1; break; case TELEM_DSM_GFORCE_X: case TELEM_DSM_GFORCE_Y: @@ -437,11 +439,11 @@ void TELEMETRY_Alarm() case TELEM_DSM_GFORCE_XMAX: case TELEM_DSM_GFORCE_YMAX: case TELEM_DSM_GFORCE_ZMAX: - case TELEM_DSM_GFORCE_ZMIN: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_GFORCE,2); break; + case TELEM_DSM_GFORCE_ZMIN: telem_unit = VOICE_UNIT_GFORCE; telem_prec = 2; break; #if HAS_EXTENDED_TELEMETRY - case TELEM_DSM_FLOG_RSSI_DBM: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_DB,0); break; + case TELEM_DSM_FLOG_RSSI_DBM: telem_unit = VOICE_UNIT_DB; break; #endif - default: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_NONE,0); + //default: telem_unit = VOICE_UNIT_NONE,0); } } @@ -460,37 +462,36 @@ void TELEMETRY_Alarm() case TELEM_FRSKY_CELL6: #endif case TELEM_FRSKY_VOLT1: - case TELEM_FRSKY_VOLT2: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_VOLT,2); break; + case TELEM_FRSKY_VOLT2: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; #if HAS_EXTENDED_TELEMETRY case TELEM_FRSKY_TEMP1: - case TELEM_FRSKY_TEMP2: MUSIC_PlayValue(telem_music, telem_value-20,VOICE_UNIT_TEMP,0); break; - case TELEM_FRSKY_RPM: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_RPM,0); break; - case TELEM_FRSKY_CURRENT: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_AMPS,2); break; - case TELEM_FRSKY_ALTITUDE: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_ALTITUDE,2); break; + case TELEM_FRSKY_TEMP2: telem_value -=20; telem_unit = VOICE_UNIT_TEMP; break; + case TELEM_FRSKY_RPM: telem_unit = VOICE_UNIT_RPM; break; + case TELEM_FRSKY_CURRENT: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; + case TELEM_FRSKY_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 2; break; #endif case TELEM_FRSKY_LRSSI: - case TELEM_FRSKY_RSSI: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_DB,0); break; - default: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_NONE,0); + case TELEM_FRSKY_RSSI: telem_unit = VOICE_UNIT_DB; break; + //default: telem_unit = VOICE_UNIT_NONE,0); } } #if HAS_EXTENDED_TELEMETRY if (TELEMETRY_Type() == TELEM_CRSF) { switch (alarm->src) { - case TELEM_CRSF_BATT_VOLTAGE: - MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_VOLT,2); break; - case TELEM_CRSF_BATT_CURRENT: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_AMPS,2); break; - case TELEM_CRSF_GPS_ALTITUDE: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_ALTITUDE,2); break; + case TELEM_CRSF_BATT_VOLTAGE: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; + case TELEM_CRSF_BATT_CURRENT: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; + case TELEM_CRSF_GPS_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 2; break; case TELEM_CRSF_TX_SNR: case TELEM_CRSF_TX_RSSI: case TELEM_CRSF_RX_SNR: case TELEM_CRSF_RX_RSSI1: - case TELEM_CRSF_RX_RSSI2: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_DB,0); break; - default: MUSIC_PlayValue(telem_music, telem_value,VOICE_UNIT_NONE,0); + case TELEM_CRSF_RX_RSSI2: telem_unit = VOICE_UNIT_DB; break; + //default: telem_unit = VOICE_UNIT_NONE,0); } } #endif //HAS_EXTENDED_TELEMETRY - + MUSIC_PlayValue(telem_music, telem_value, telem_unit, telem_prec); #else MUSIC_Play(MUSIC_TELEMALARM1 + telem_idx); #endif //HAS_EXTENDED_AUDIO From 4d36b63098d1f04a120142838c43e042202a9d79 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 21:18:36 +0100 Subject: [PATCH 11/37] fix linter errors --- src/telemetry.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/telemetry.c b/src/telemetry.c index b52ea7fa1c..d855728fdb 100644 --- a/src/telemetry.c +++ b/src/telemetry.c @@ -443,7 +443,6 @@ void TELEMETRY_Alarm() #if HAS_EXTENDED_TELEMETRY case TELEM_DSM_FLOG_RSSI_DBM: telem_unit = VOICE_UNIT_DB; break; #endif - //default: telem_unit = VOICE_UNIT_NONE,0); } } @@ -465,14 +464,13 @@ void TELEMETRY_Alarm() case TELEM_FRSKY_VOLT2: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; #if HAS_EXTENDED_TELEMETRY case TELEM_FRSKY_TEMP1: - case TELEM_FRSKY_TEMP2: telem_value -=20; telem_unit = VOICE_UNIT_TEMP; break; + case TELEM_FRSKY_TEMP2: telem_value -= 20; telem_unit = VOICE_UNIT_TEMP; break; case TELEM_FRSKY_RPM: telem_unit = VOICE_UNIT_RPM; break; case TELEM_FRSKY_CURRENT: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; case TELEM_FRSKY_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 2; break; #endif case TELEM_FRSKY_LRSSI: case TELEM_FRSKY_RSSI: telem_unit = VOICE_UNIT_DB; break; - //default: telem_unit = VOICE_UNIT_NONE,0); } } @@ -487,7 +485,6 @@ void TELEMETRY_Alarm() case TELEM_CRSF_RX_SNR: case TELEM_CRSF_RX_RSSI1: case TELEM_CRSF_RX_RSSI2: telem_unit = VOICE_UNIT_DB; break; - //default: telem_unit = VOICE_UNIT_NONE,0); } } #endif //HAS_EXTENDED_TELEMETRY From 8617d34a73667d4409c2cc8307e6fdf95d774005 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 22:32:56 +0100 Subject: [PATCH 12/37] move if to switch statement to save rom --- src/telemetry.c | 182 ++++++++++++++++++++++++------------------------ 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/src/telemetry.c b/src/telemetry.c index d855728fdb..caa816fe0d 100644 --- a/src/telemetry.c +++ b/src/telemetry.c @@ -380,112 +380,112 @@ void TELEMETRY_Alarm() #if HAS_EXTENDED_AUDIO u16 telem_music = MUSIC_GetTelemetryAlarm(MUSIC_TELEMALARM1 + telem_idx); s32 telem_value = TELEMETRY_GetValue(alarm->src); - unsigned telem_unit, telem_prec; - telem_unit = VOICE_UNIT_NONE; - if (TELEMETRY_Type() == TELEM_DEVO) { - switch (alarm->src) { - case TELEM_DEVO_VOLT1: - case TELEM_DEVO_VOLT2: - case TELEM_DEVO_VOLT3: telem_unit = VOICE_UNIT_VOLT; telem_prec = 1; break; - case TELEM_DEVO_RPM1: - case TELEM_DEVO_RPM2: telem_unit = VOICE_UNIT_RPM; break; - default: telem_value -= 20; telem_unit = VOICE_UNIT_TEMP; break; - } - } - if (TELEMETRY_Type() == TELEM_DSM) { - switch (alarm->src) { + unsigned telem_unit = VOICE_UNIT_NONE; + unsigned telem_prec = 0; + switch (TELEMETRY_Type()) { + case TELEM_DEVO: + switch (alarm->src]) { + case TELEM_DEVO_VOLT1: + case TELEM_DEVO_VOLT2: + case TELEM_DEVO_VOLT3: telem_unit = VOICE_UNIT_VOLT; telem_prec = 1; break; + case TELEM_DEVO_RPM1: + case TELEM_DEVO_RPM2: telem_unit = VOICE_UNIT_RPM; break; + default: telem_value -= 20; telem_unit = VOICE_UNIT_TEMP; break; + } + break; + case TELEM_DSM: + switch (alarm->src) { #if HAS_EXTENDED_TELEMETRY - case TELEM_DSM_JETCAT_RPM: - case TELEM_DSM_ESC_RPM: + case TELEM_DSM_JETCAT_RPM: + case TELEM_DSM_ESC_RPM: #endif - case TELEM_DSM_FLOG_RPM1: telem_unit = VOICE_UNIT_RPM; break; + case TELEM_DSM_FLOG_RPM1: telem_unit = VOICE_UNIT_RPM; break; #if HAS_EXTENDED_TELEMETRY - case TELEM_DSM_PBOX_VOLT1: - case TELEM_DSM_PBOX_VOLT2: - case TELEM_DSM_JETCAT_PACKVOLT: - case TELEM_DSM_JETCAT_PUMPVOLT: - case TELEM_DSM_RXPCAP_VOLT: - case TELEM_DSM_ESC_VOLT1: - case TELEM_DSM_ESC_VOLT2: + case TELEM_DSM_PBOX_VOLT1: + case TELEM_DSM_PBOX_VOLT2: + case TELEM_DSM_JETCAT_PACKVOLT: + case TELEM_DSM_JETCAT_PUMPVOLT: + case TELEM_DSM_RXPCAP_VOLT: + case TELEM_DSM_ESC_VOLT1: + case TELEM_DSM_ESC_VOLT2: #endif - case TELEM_DSM_FLOG_VOLT1: - case TELEM_DSM_FLOG_VOLT2: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; + case TELEM_DSM_FLOG_VOLT1: + case TELEM_DSM_FLOG_VOLT2: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; #if HAS_EXTENDED_TELEMETRY - case TELEM_DSM_JETCAT_TEMPEGT: telem_unit = VOICE_UNIT_TEMP; break; - case TELEM_DSM_ESC_TEMP1: - case TELEM_DSM_ESC_TEMP2: + case TELEM_DSM_JETCAT_TEMPEGT: telem_unit = VOICE_UNIT_TEMP; break; + case TELEM_DSM_ESC_TEMP1: + case TELEM_DSM_ESC_TEMP2: #endif - case TELEM_DSM_FLOG_TEMP1: telem_unit = VOICE_UNIT_TEMP; telem_prec = 1; break; + case TELEM_DSM_FLOG_TEMP1: telem_unit = VOICE_UNIT_TEMP; telem_prec = 1; break; #if HAS_EXTENDED_TELEMETRY - case TELEM_DSM_RXPCAP_AMPS: - case TELEM_DSM_ESC_AMPS1: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; - case TELEM_DSM_FPCAP_AMPS: - case TELEM_DSM_ESC_AMPS2: + case TELEM_DSM_RXPCAP_AMPS: + case TELEM_DSM_ESC_AMPS1: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; + case TELEM_DSM_FPCAP_AMPS: + case TELEM_DSM_ESC_AMPS2: #endif - case TELEM_DSM_AMPS1: telem_unit = VOICE_UNIT_AMPS; telem_prec = 1; break; - case TELEM_DSM_ALTITUDE: - case TELEM_DSM_ALTITUDE_MAX: - case TELEM_DSM_VARIO_CLIMBRATE1: - case TELEM_DSM_VARIO_CLIMBRATE2: - case TELEM_DSM_VARIO_CLIMBRATE3: - case TELEM_DSM_VARIO_CLIMBRATE4: - case TELEM_DSM_VARIO_CLIMBRATE5: - case TELEM_DSM_VARIO_CLIMBRATE6: - case TELEM_DSM_VARIO_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 1; break; - - case TELEM_DSM_GFORCE_X: - case TELEM_DSM_GFORCE_Y: - case TELEM_DSM_GFORCE_Z: - case TELEM_DSM_GFORCE_XMAX: - case TELEM_DSM_GFORCE_YMAX: - case TELEM_DSM_GFORCE_ZMAX: - case TELEM_DSM_GFORCE_ZMIN: telem_unit = VOICE_UNIT_GFORCE; telem_prec = 2; break; + case TELEM_DSM_AMPS1: telem_unit = VOICE_UNIT_AMPS; telem_prec = 1; break; + case TELEM_DSM_ALTITUDE: + case TELEM_DSM_ALTITUDE_MAX: + case TELEM_DSM_VARIO_CLIMBRATE1: + case TELEM_DSM_VARIO_CLIMBRATE2: + case TELEM_DSM_VARIO_CLIMBRATE3: + case TELEM_DSM_VARIO_CLIMBRATE4: + case TELEM_DSM_VARIO_CLIMBRATE5: + case TELEM_DSM_VARIO_CLIMBRATE6: + case TELEM_DSM_VARIO_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 1; break; + + case TELEM_DSM_GFORCE_X: + case TELEM_DSM_GFORCE_Y: + case TELEM_DSM_GFORCE_Z: + case TELEM_DSM_GFORCE_XMAX: + case TELEM_DSM_GFORCE_YMAX: + case TELEM_DSM_GFORCE_ZMAX: + case TELEM_DSM_GFORCE_ZMIN: telem_unit = VOICE_UNIT_GFORCE; telem_prec = 2; break; #if HAS_EXTENDED_TELEMETRY - case TELEM_DSM_FLOG_RSSI_DBM: telem_unit = VOICE_UNIT_DB; break; + case TELEM_DSM_FLOG_RSSI_DBM: telem_unit = VOICE_UNIT_DB; break; #endif - } - } - - if (TELEMETRY_Type() == TELEM_FRSKY) { - switch (alarm->src) { + } + break; + case TELEM_FRSKY: + switch (alarm->src) { #if HAS_EXTENDED_TELEMETRY - case TELEM_FRSKY_VOLT3: - case TELEM_FRSKY_VOLTA: - case TELEM_FRSKY_MIN_CELL: - case TELEM_FRSKY_ALL_CELL: - case TELEM_FRSKY_CELL1: - case TELEM_FRSKY_CELL2: - case TELEM_FRSKY_CELL3: - case TELEM_FRSKY_CELL4: - case TELEM_FRSKY_CELL5: - case TELEM_FRSKY_CELL6: + case TELEM_FRSKY_VOLT3: + case TELEM_FRSKY_VOLTA: + case TELEM_FRSKY_MIN_CELL: + case TELEM_FRSKY_ALL_CELL: + case TELEM_FRSKY_CELL1: + case TELEM_FRSKY_CELL2: + case TELEM_FRSKY_CELL3: + case TELEM_FRSKY_CELL4: + case TELEM_FRSKY_CELL5: + case TELEM_FRSKY_CELL6: #endif - case TELEM_FRSKY_VOLT1: - case TELEM_FRSKY_VOLT2: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; + case TELEM_FRSKY_VOLT1: + case TELEM_FRSKY_VOLT2: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; #if HAS_EXTENDED_TELEMETRY - case TELEM_FRSKY_TEMP1: - case TELEM_FRSKY_TEMP2: telem_value -= 20; telem_unit = VOICE_UNIT_TEMP; break; - case TELEM_FRSKY_RPM: telem_unit = VOICE_UNIT_RPM; break; - case TELEM_FRSKY_CURRENT: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; - case TELEM_FRSKY_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 2; break; + case TELEM_FRSKY_TEMP1: + case TELEM_FRSKY_TEMP2: telem_value -= 20; telem_unit = VOICE_UNIT_TEMP; break; + case TELEM_FRSKY_RPM: telem_unit = VOICE_UNIT_RPM; break; + case TELEM_FRSKY_CURRENT: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; + case TELEM_FRSKY_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 2; break; #endif - case TELEM_FRSKY_LRSSI: - case TELEM_FRSKY_RSSI: telem_unit = VOICE_UNIT_DB; break; - } - } - + case TELEM_FRSKY_LRSSI: + case TELEM_FRSKY_RSSI: telem_unit = VOICE_UNIT_DB; break; + } + break; #if HAS_EXTENDED_TELEMETRY - if (TELEMETRY_Type() == TELEM_CRSF) { - switch (alarm->src) { - case TELEM_CRSF_BATT_VOLTAGE: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; - case TELEM_CRSF_BATT_CURRENT: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; - case TELEM_CRSF_GPS_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 2; break; - case TELEM_CRSF_TX_SNR: - case TELEM_CRSF_TX_RSSI: - case TELEM_CRSF_RX_SNR: - case TELEM_CRSF_RX_RSSI1: - case TELEM_CRSF_RX_RSSI2: telem_unit = VOICE_UNIT_DB; break; - } + case TELEM_CRSF: + switch (alarm->src) { + case TELEM_CRSF_BATT_VOLTAGE: telem_unit = VOICE_UNIT_VOLT; telem_prec = 2; break; + case TELEM_CRSF_BATT_CURRENT: telem_unit = VOICE_UNIT_AMPS; telem_prec = 2; break; + case TELEM_CRSF_GPS_ALTITUDE: telem_unit = VOICE_UNIT_ALTITUDE; telem_prec = 2; break; + case TELEM_CRSF_TX_SNR: + case TELEM_CRSF_TX_RSSI: + case TELEM_CRSF_RX_SNR: + case TELEM_CRSF_RX_RSSI1: + case TELEM_CRSF_RX_RSSI2: telem_unit = VOICE_UNIT_DB; break; + } + break; } #endif //HAS_EXTENDED_TELEMETRY MUSIC_PlayValue(telem_music, telem_value, telem_unit, telem_prec); From ad40cf0b42d0731b84349f9d268b4a503425ee8c Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 22:43:20 +0100 Subject: [PATCH 13/37] fix error --- src/telemetry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry.c b/src/telemetry.c index caa816fe0d..b6ac7bfa69 100644 --- a/src/telemetry.c +++ b/src/telemetry.c @@ -489,10 +489,10 @@ void TELEMETRY_Alarm() } #endif //HAS_EXTENDED_TELEMETRY MUSIC_PlayValue(telem_music, telem_value, telem_unit, telem_prec); + } #else MUSIC_Play(MUSIC_TELEMALARM1 + telem_idx); #endif //HAS_EXTENDED_AUDIO - } } From 327081eb412b430f0732db1262e0cb5590e16d28 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 22:47:22 +0100 Subject: [PATCH 14/37] fix error --- src/telemetry.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/telemetry.c b/src/telemetry.c index b6ac7bfa69..22f4058ae6 100644 --- a/src/telemetry.c +++ b/src/telemetry.c @@ -486,10 +486,9 @@ void TELEMETRY_Alarm() case TELEM_CRSF_RX_RSSI2: telem_unit = VOICE_UNIT_DB; break; } break; - } #endif //HAS_EXTENDED_TELEMETRY - MUSIC_PlayValue(telem_music, telem_value, telem_unit, telem_prec); } + MUSIC_PlayValue(telem_music, telem_value, telem_unit, telem_prec); #else MUSIC_Play(MUSIC_TELEMALARM1 + telem_idx); #endif //HAS_EXTENDED_AUDIO From 0998b41f815560ba0d79ed885ac304b1d8941ba2 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 23:16:02 +0100 Subject: [PATCH 15/37] Fix timer alarms --- src/timer.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/timer.c b/src/timer.c index 8489320f24..6654c42111 100644 --- a/src/timer.c +++ b/src/timer.c @@ -141,6 +141,7 @@ void TIMER_Update() unsigned i; unsigned chan_val = 0; u32 t = CLOCK_getms(); + if (PROTOCOL_WaitingForSafe()) return; if( Transmitter.power_alarm > 0 ) @@ -173,6 +174,9 @@ void TIMER_Update() } } if (timer_state[i]) { +#if HAS_EXTENDED_AUDIO + unsigned timer_music = MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i); +#endif s32 delta = t - last_time[i]; s32 warn_time; if (Model.timer[i].type == TIMER_STOPWATCH_PROP || Model.timer[i].type == TIMER_COUNTDOWN_PROP) { @@ -195,10 +199,10 @@ void TIMER_Update() if (timer_val[i] >= 600000) warn_time += 300000; // 5-minute alerts above 10 minutes } - warn_time -= Model.timer[MUSIC_ALARM1 + i].duration; + warn_time -= Model.timer[i].duration; if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) - MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), - (timer_val[i]+Model.timer[MUSIC_ALARM1 + i].duration)/1000, VOICE_UNIT_TIME, 0); + MUSIC_PlayValue(timer_music, + (timer_val[i]+Model.timer[i].duration)/1000, VOICE_UNIT_TIME, 0); #endif } else { // start to beep for each prealert_interval at the last prealert_time(seconds) @@ -224,12 +228,12 @@ void TIMER_Update() warn_time = ((timer_val[i] - Transmitter.countdown_timer_settings.timeup_interval) / Transmitter.countdown_timer_settings.timeup_interval) * Transmitter.countdown_timer_settings.timeup_interval; #if HAS_EXTENDED_AUDIO - warn_time += Model.timer[MUSIC_ALARM1 + i].duration; + warn_time += Model.timer[i].duration; #endif if (timer_val[i] > warn_time && (timer_val[i] - delta) <= warn_time) { #if HAS_EXTENDED_AUDIO - MUSIC_PlayValue(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i), - (timer_val[i]-Model.timer[MUSIC_ALARM1 + i].duration)/-1000+1, VOICE_UNIT_TIME, 0); + MUSIC_PlayValue(timer_music, + (timer_val[i]-Model.timer[i].duration)/-1000+1, VOICE_UNIT_TIME, 0); #else MUSIC_Play(MUSIC_ALARM1 + i + 2); #endif @@ -237,7 +241,7 @@ void TIMER_Update() } if (timer_val[i] >= 0 && timer_val[i] < delta) { #if HAS_EXTENDED_AUDIO - MUSIC_Play(MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i)); + MUSIC_Play(timer_music); #else MUSIC_Play(MUSIC_ALARM1+i); #endif From f09c27aec7695b9d9c440a9ee36d48e91cdfde88 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 3 Feb 2019 23:35:58 +0100 Subject: [PATCH 16/37] Remove old trim button voice logic. The same can now be achieved with mux voice on the virtual channel --- doc/Extended-audio.txt | 3 --- src/mixer.c | 37 ---------------------------- src/music.h | 7 +----- src/pages/common/_voiceconfig_page.c | 2 -- 4 files changed, 1 insertion(+), 48 deletions(-) diff --git a/doc/Extended-audio.txt b/doc/Extended-audio.txt index 16f05c3d29..2bd9dce487 100644 --- a/doc/Extended-audio.txt +++ b/doc/Extended-audio.txt @@ -2,9 +2,6 @@ A. Voice Feedback on the following are supported. For additional details, refer - Changing Switch Positions. - Turning of Auxiliary Knobs. Different voice files can be specified for turning up & turning down of knobs. - - Trim buttons as virtual switches. - Different voice files can be specified for the same trim button when used as - Momentary or Toggle switch. B. Following options have been added to media/sound.ini file. 1) Specify a different playback device for each alert message. diff --git a/src/mixer.c b/src/mixer.c index 813310fa77..f63fa0bc2c 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -724,25 +724,6 @@ void MIXER_InitMixer(struct Mixer *mixer, unsigned ch) mixer->curve.points[i] = 0; } -#if HAS_EXTENDED_AUDIO -static void _trim_music_play(int trim_idx, int is_neg, int on_state) -{ - int button_idx; - - if (is_neg) - button_idx = Model.trims[trim_idx].neg - 1; - else - button_idx = Model.trims[trim_idx].pos - 1; - if (on_state) { - if (Model.voice.buttons[button_idx].on) - MUSIC_Play(Model.voice.buttons[button_idx].on); - } else { - if (Model.voice.buttons[button_idx].off) - MUSIC_Play(Model.voice.buttons[button_idx].off); - } -} -#endif - static void _trim_as_switch(unsigned flags, int i, int is_neg) { s8 *value = MIXER_GetTrim(i); @@ -750,40 +731,22 @@ static void _trim_as_switch(unsigned flags, int i, int is_neg) //Momentarty if (flags & BUTTON_PRESS) { *value = 100; -#if HAS_EXTENDED_AUDIO - _trim_music_play(i, is_neg, 1); -#endif } else if (flags & BUTTON_RELEASE) { *value = -100; -#if HAS_EXTENDED_AUDIO - _trim_music_play(i, is_neg, 0); -#endif } } else if (Model.trims[i].step == TRIM_3POS) { if (flags & BUTTON_PRESS) { *value = is_neg ? -100 : 100; -#if HAS_EXTENDED_AUDIO - _trim_music_play(i, is_neg, 1); -#endif } else if (flags & BUTTON_RELEASE) { *value = 0; -#if HAS_EXTENDED_AUDIO - _trim_music_play(i, is_neg, 0); -#endif } } else if (flags & BUTTON_PRESS) { if (Model.trims[i].step == TRIM_ONOFF) { //On/Off *value = is_neg ? -100 : 100; -#if HAS_EXTENDED_AUDIO - _trim_music_play(i, is_neg, 1); -#endif } else { //Toggle *value = *value == -100 ? 100 : -100; -#if HAS_EXTENDED_AUDIO - _trim_music_play(i, is_neg, *value == -100 ? 0 : 1); -#endif } } } diff --git a/src/music.h b/src/music.h index 5300d8e4fa..503816ac78 100644 --- a/src/music.h +++ b/src/music.h @@ -85,11 +85,7 @@ enum { VOICE_UNIT_TOTAL }; -struct ButtonVoice { - u16 on; // Music to be played when button is On - u16 off; - u16 music; // Music to be played when button is Off -}; + struct CustomVoice { u16 music; @@ -100,7 +96,6 @@ struct Voice { struct CustomVoice telemetry[TELEM_NUM_ALARMS]; //Telemetry Alarm array to point to music file number struct CustomVoice timer[NUM_TIMERS]; //Timer Alarm array to point to music file number struct CustomVoice mixer[NUM_OUT_CHANNELS + NUM_VIRT_CHANNELS]; - struct ButtonVoice buttons[NUM_TX_BUTTONS]; //Button array to point to music file number #if NUM_AUX_KNOBS struct CustomVoice aux[NUM_AUX_KNOBS * 2]; //two per knob for up and down #endif diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index bcb660299c..fb4819ff18 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -33,8 +33,6 @@ static u8 voiceconfig_getsrctype (u8 idx) { if (idx < NUM_SWITCHES) return VOICE_SRC_SWITCH; -/* if (idx < NUM_INPUTS - INP_HAS_CALIBRATION + NUM_TX_BUTTONS) - return VOICE_SRC_BUTTON;*/ #if NUM_AUX_KNOBS if (idx < NUM_SWITCHES + NUM_AUX_KNOBS * 2) return VOICE_SRC_AUX; From 55381d92330b30eb373c805c79b0f77afead4056 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Mon, 4 Feb 2019 16:24:30 +0100 Subject: [PATCH 17/37] Increase custom voice limit --- src/music.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/music.h b/src/music.h index 503816ac78..6c9967145e 100644 --- a/src/music.h +++ b/src/music.h @@ -29,7 +29,7 @@ enum Music { }; #if HAS_EXTENDED_AUDIO -#define MAX_VOICEMAP_ENTRIES 400 // arbitraty chosen +#define MAX_VOICEMAP_ENTRIES 999 // arbitraty chosen #ifdef _DEVO12_TARGET_H_ // Check for Devo12 screen #define MAX_VOICE_LABEL 35 // limit label length due to limited screen width #else From 4cf14b71b3b64089e4d6b641beb07e7085e72899 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Mon, 4 Feb 2019 16:53:49 +0100 Subject: [PATCH 18/37] Limit scope of some AUDIO functions --- src/extended_audio.c | 25 ++++++++++++------------- src/extended_audio.h | 1 - 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index 46460991d5..afe73c965e 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -69,8 +69,7 @@ void AUDIO_Init() { #ifndef EMULATOR // Send a block of len bytes to the Audio device. -void -AUDIO_Send(u8 *data, int len) { +static void AUDIO_Send(u8 *data, int len) { void AUDIO_send_char(char c); for (u16 iter = 0; iter < len; iter += 1) { AUDIO_send_char(data[iter]); @@ -78,19 +77,18 @@ AUDIO_Send(u8 *data, int len) { } // Send a string to the Audio device. -void -AUDIO_Print(char *string) { +static void AUDIO_Print(char *string) { AUDIO_Send((u8 *)string, strlen(string)); } #endif // EMULATOR -void u16ToArray(u16 value, u8 *array){ +static void u16ToArray(u16 value, u8 *array){ *array = (u8)(value>>8); *(array+1) = (u8)value; } // generate Checksum for DFPlyer commands -u16 AUDIO_CalculateChecksum(u8 *buffer) { +static u16 AUDIO_CalculateChecksum(u8 *buffer) { u16 sum = 0; for (int i=1; i < 7; i += 1) sum += buffer[i]; @@ -98,7 +96,7 @@ u16 AUDIO_CalculateChecksum(u8 *buffer) { } // Generate a string to play. -int AUDIO_Play(u16 id) { +static int AUDIO_Play(u16 id) { // If we are just playing beeps.... if (id == MUSIC_KEY_PRESSING || id == MUSIC_MAXLEN) { printf("Voice: beep only\n"); @@ -171,6 +169,10 @@ void AUDIO_SetVolume() { } #endif } +static void AUDIO_ResetQueue() { + num_audio = 0; + next_audio = 0; +} void AUDIO_CheckQueue() { u32 t = CLOCK_getms(); @@ -182,8 +184,7 @@ void AUDIO_CheckQueue() { } } else if (num_audio && t > audio_queue_time) { printf("Voice: Queue finished, resetting.\n"); - num_audio = 0; - next_audio = 0; + AUDIO_ResetQueue(); AUDIO_SetVolume(); } } @@ -196,15 +197,13 @@ int AUDIO_VoiceAvailable() { if ( PPMin_Mode() || Model.protocol == PROTOCOL_PPM ) { // don't send play command when using PPM port #endif printf("Voice: PPM port in use\n"); - num_audio = 0; // Reset queue when audio not available - next_audio = 0; + AUDIO_ResetQueue(); return 0; } #endif // _DEVO12_TARGET_H_ if ( (Transmitter.audio_player == AUDIO_NONE) || (Transmitter.audio_player == AUDIO_DISABLED) || !Transmitter.audio_vol ) { - num_audio = 0; // Reset queue when audio not available - next_audio = 0; + AUDIO_ResetQueue(); return 0; } diff --git a/src/extended_audio.h b/src/extended_audio.h index bdb25e3e5d..7006982eb3 100644 --- a/src/extended_audio.h +++ b/src/extended_audio.h @@ -6,7 +6,6 @@ #define AUDIO_QUEUE_LENGTH 20 // arbitraty chosen, do we need more? void AUDIO_Init(); -int AUDIO_Play(u16 music); void AUDIO_SetVolume(); void AUDIO_CheckQueue(); int AUDIO_AddQueue(u16 music); From 84a1f1c1498c54342056debdd953ab92fcf5ca64 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Mon, 4 Feb 2019 16:58:21 +0100 Subject: [PATCH 19/37] Fix linter errors --- src/extended_audio.c | 2 +- src/music.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index afe73c965e..1d8556ed2c 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -82,7 +82,7 @@ static void AUDIO_Print(char *string) { } #endif // EMULATOR -static void u16ToArray(u16 value, u8 *array){ +static void u16ToArray(u16 value, u8 *array) { *array = (u8)(value>>8); *(array+1) = (u8)value; } diff --git a/src/music.h b/src/music.h index 6c9967145e..340066230a 100644 --- a/src/music.h +++ b/src/music.h @@ -29,7 +29,7 @@ enum Music { }; #if HAS_EXTENDED_AUDIO -#define MAX_VOICEMAP_ENTRIES 999 // arbitraty chosen +#define MAX_VOICEMAP_ENTRIES 999 // arbitraty chosen #ifdef _DEVO12_TARGET_H_ // Check for Devo12 screen #define MAX_VOICE_LABEL 35 // limit label length due to limited screen width #else From 1d8f208619e72f301634d6a4595ee1683b1a9ba7 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Thu, 7 Feb 2019 20:42:02 +0100 Subject: [PATCH 20/37] small improvment of debug messages --- src/extended_audio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index 1d8556ed2c..26651a709e 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -172,6 +172,7 @@ void AUDIO_SetVolume() { static void AUDIO_ResetQueue() { num_audio = 0; next_audio = 0; + printf("Voice: Queue finished, resetting.\n"); } void AUDIO_CheckQueue() { @@ -183,7 +184,6 @@ void AUDIO_CheckQueue() { next_audio++; } } else if (num_audio && t > audio_queue_time) { - printf("Voice: Queue finished, resetting.\n"); AUDIO_ResetQueue(); AUDIO_SetVolume(); } @@ -222,6 +222,7 @@ int AUDIO_AddQueue(u16 music) { } audio_queue[num_audio].duration = current_voice_mapping.duration; audio_queue[num_audio].id = music; + printf("Voice: added ID %d with duration %d to queue position %d.\n", music, current_voice_mapping.duration, num_audio); num_audio++; return 1; } From 5bdcebfa6b53e363b483bf40f39dbc3dfe3f8050 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Thu, 7 Feb 2019 20:59:52 +0100 Subject: [PATCH 21/37] Reduce AUDIO_VoiceAvailable calls --- src/extended_audio.c | 6 +++--- src/extended_audio.h | 1 - src/main.c | 7 +------ src/music.c | 5 ++--- src/pages/128x64x1/voiceconfig_page.c | 2 +- src/pages/320x240x16/voiceconfig_page.c | 2 +- 6 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index 26651a709e..0988bc1bea 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -189,7 +189,7 @@ void AUDIO_CheckQueue() { } } -int AUDIO_VoiceAvailable() { +static int AUDIO_VoiceAvailable() { #ifndef _DEVO12_TARGET_H_ #if HAS_AUDIO_UART if ( !Transmitter.audio_uart && (PPMin_Mode() || Model.protocol == PROTOCOL_PPM) ) { // don't send play command when using PPM port @@ -211,8 +211,8 @@ int AUDIO_VoiceAvailable() { } int AUDIO_AddQueue(u16 music) { - if (num_audio == AUDIO_QUEUE_LENGTH) { - printf("Voice: Queue full, cannot add new mp3 #%d\n",music); + if (!AUDIO_VoiceAvailable() || num_audio == AUDIO_QUEUE_LENGTH) { + printf("Voice: queue full or voice not available, cannot add new mp3 #%d\n",music); return 0; } CONFIG_VoiceParse(music); diff --git a/src/extended_audio.h b/src/extended_audio.h index 7006982eb3..fd26de99fb 100644 --- a/src/extended_audio.h +++ b/src/extended_audio.h @@ -9,7 +9,6 @@ void AUDIO_Init(); void AUDIO_SetVolume(); void AUDIO_CheckQueue(); int AUDIO_AddQueue(u16 music); -int AUDIO_VoiceAvailable(); extern struct AudioQueue audio_queue[AUDIO_QUEUE_LENGTH]; extern struct VoiceMap current_voice_mapping; diff --git a/src/main.c b/src/main.c index 12f960b89f..c8264c8787 100644 --- a/src/main.c +++ b/src/main.c @@ -232,15 +232,12 @@ void EventLoop() } if(Transmitter.music_shutdown) { #if HAS_EXTENDED_AUDIO - if(AUDIO_VoiceAvailable()) { MUSIC_Play(MUSIC_SHUTDOWN); - while (CLOCK_getms() < audio_queue_time) { + while (CLOCK_getms() MUSIC_TOTAL ) { - if (AUDIO_VoiceAvailable()) AUDIO_AddQueue(music); return; } @@ -229,7 +228,7 @@ void MUSIC_Play(u16 music) #if HAS_EXTENDED_AUDIO if ( !(playback_device == AUDDEV_BUZZER) ) { - if ( AUDIO_VoiceAvailable() && AUDIO_AddQueue(music) ) { + if (AUDIO_AddQueue(music)) { if ((playback_device == AUDDEV_EXTAUDIO) || (playback_device == AUDDEV_UNDEF)) { Volume = 0; return; @@ -273,7 +272,7 @@ void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) } } - if ( !AUDIO_VoiceAvailable() || !AUDIO_AddQueue(music)) { + if (!AUDIO_AddQueue(music)) { if (music < MUSIC_TOTAL) MUSIC_Play(music); return; diff --git a/src/pages/128x64x1/voiceconfig_page.c b/src/pages/128x64x1/voiceconfig_page.c index 6792f0f112..9fd9c9a5f8 100644 --- a/src/pages/128x64x1/voiceconfig_page.c +++ b/src/pages/128x64x1/voiceconfig_page.c @@ -56,7 +56,7 @@ void PAGE_VoiceconfigInit(int page) { (void)page; PAGE_SetModal(0); - if ( !AUDIO_VoiceAvailable() ) { + if ( !AUDIO_AddQueue(MUSIC_KEY_PRESSING) ) { // MUSIC_KEY_PRESSING is empty by default GUI_CreateLabelBox(&gui->msg, MSG_X, MSG_Y, 0, 0, &LABEL_FONT, GUI_Localize, NULL, _tr_noop("External voice\ncurrently not\navailable")); return; diff --git a/src/pages/320x240x16/voiceconfig_page.c b/src/pages/320x240x16/voiceconfig_page.c index d7eac68c9c..6a3be008c0 100644 --- a/src/pages/320x240x16/voiceconfig_page.c +++ b/src/pages/320x240x16/voiceconfig_page.c @@ -46,7 +46,7 @@ void PAGE_VoiceconfigInit(int page) PAGE_SetModal(0); PAGE_ShowHeader(PAGE_GetName(PAGEID_VOICECFG)); - if ( !AUDIO_VoiceAvailable() ) { + if ( !AUDIO_AddQueue(MUSIC_KEY_PRESSING) ) { // MUSIC_KEY_PRESSING is empty by default GUI_CreateLabelBox(&gui->msg, 20, 80, 280, 100, &NARROW_FONT, GUI_Localize, NULL, _tr_noop("External voice\ncurrently not\navailable")); return; From ffd8c30fb0d44459686d7db31d6f94eec2cc9e69 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Thu, 7 Feb 2019 21:53:40 +0100 Subject: [PATCH 22/37] Optimize MUSIC_PlayValue --- src/extended_audio.c | 2 +- src/music.c | 29 ++++++++++++++--------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index 0988bc1bea..824aa0093f 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -212,7 +212,7 @@ static int AUDIO_VoiceAvailable() { int AUDIO_AddQueue(u16 music) { if (!AUDIO_VoiceAvailable() || num_audio == AUDIO_QUEUE_LENGTH) { - printf("Voice: queue full or voice not available, cannot add new mp3 #%d\n",music); + printf("Voice: queue full or voice not available, cannot add new mp3 #%d\n", music); return 0; } CONFIG_VoiceParse(music); diff --git a/src/music.c b/src/music.c index 9424e1a5df..6b21d2beb0 100644 --- a/src/music.c +++ b/src/music.c @@ -272,9 +272,8 @@ void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) } } - if (!AUDIO_AddQueue(music)) { - if (music < MUSIC_TOTAL) - MUSIC_Play(music); + if ( !AUDIO_AddQueue(music) && (music < MUSIC_TOTAL) ) { + MUSIC_Play(music); return; } @@ -282,15 +281,15 @@ void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) if (unit == VOICE_UNIT_TIME) { if (value >= 3600) { i = value / 3600; + value %= 3600; AUDIO_AddQueue(i + MUSIC_TOTAL); AUDIO_AddQueue(VOICE_UNIT_HOURS + VOICE_UNIT_OFFSET); - value %= 3600; } if (value >= 60) { i = value / 60; + value %= 60; AUDIO_AddQueue(i + MUSIC_TOTAL); AUDIO_AddQueue(VOICE_UNIT_MINUTES + VOICE_UNIT_OFFSET); - value %= 60; } if (value > 0) { AUDIO_AddQueue(value + MUSIC_TOTAL); @@ -302,7 +301,7 @@ void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) // Add minus sign for negative number if (value < 0) { AUDIO_AddQueue(VOICE_UNIT_MINUS + VOICE_UNIT_OFFSET); - value *= -1; + value = -value; } //Add precision digits @@ -315,31 +314,31 @@ void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) digits[digit_count++] = VOICE_DEC_SEP; } - // Special case value == 0 and not playing TIME - if (value == 0 && unit != VOICE_UNIT_TIME) + // Special case value == 0 + if (value == 0) digits[digit_count++] = 0; // Get single digits from remaining value while (value > 0) { - if(value > 999) { + if (value > 999) { thousands = value / 1000; value %= 1000; } - if(value > 100) { + if (value > 100) { digits[digit_count++] = value % 100; value /= 100; digits[digit_count++] = value + 99; - if (thousands){ - digits[digit_count++] = 109; // MP3 for "thousands" - digits[digit_count++] = thousands; + if (thousands) { + digits[digit_count++] = 109; // MP3 for "thousands" + digits[digit_count++] = thousands; } break; } - if(value < 101 && value > 0) { + if (value < 101 && value > 0) { digits[digit_count++] = value; break; } else { - if (thousands){ + if (thousands) { digits[digit_count++] = 109; // MP3 for "thousands" digits[digit_count++] = thousands; } From 0fae09000ca9de621ec7e082dd6d001197845a60 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Thu, 7 Feb 2019 22:37:31 +0100 Subject: [PATCH 23/37] Remove MUSIC_GetTimerAlarm as it is only called once --- src/music.c | 6 ------ src/music.h | 1 - src/timer.c | 4 +++- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/music.c b/src/music.c index 6b21d2beb0..cf582cbbea 100644 --- a/src/music.c +++ b/src/music.c @@ -250,12 +250,6 @@ u16 MUSIC_GetTelemetryAlarm(enum Music music) { return music; } -u16 MUSIC_GetTimerAlarm(enum Music music) { - if ( Model.voice.timer[music - MUSIC_ALARM1].music > 0 ) - return Model.voice.timer[music - MUSIC_ALARM1].music; - return music; -} - void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) { u32 i; diff --git a/src/music.h b/src/music.h index 340066230a..64629e20b4 100644 --- a/src/music.h +++ b/src/music.h @@ -114,7 +114,6 @@ struct AudioQueue { }; u16 MUSIC_GetTelemetryAlarm(enum Music music); -u16 MUSIC_GetTimerAlarm(enum Music music); void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec); #endif //HAS_EXTENDED_AUDIO diff --git a/src/timer.c b/src/timer.c index 6654c42111..71c4bf95be 100644 --- a/src/timer.c +++ b/src/timer.c @@ -175,7 +175,9 @@ void TIMER_Update() } if (timer_state[i]) { #if HAS_EXTENDED_AUDIO - unsigned timer_music = MUSIC_GetTimerAlarm(MUSIC_ALARM1 + i); + unsigned timer_music = MUSIC_ALARM1 + i; + if (Model.voice.timer[i].music) + timer_music = Model.voice.timer[i].music; #endif s32 delta = t - last_time[i]; s32 warn_time; From 39142453278b781fbfe4dfda8137c1ade1305465 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Thu, 7 Feb 2019 23:50:48 +0100 Subject: [PATCH 24/37] fix lint error --- src/music.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/music.c b/src/music.c index cf582cbbea..db7087bf42 100644 --- a/src/music.c +++ b/src/music.c @@ -322,7 +322,7 @@ void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) value /= 100; digits[digit_count++] = value + 99; if (thousands) { - digits[digit_count++] = 109; // MP3 for "thousands" + digits[digit_count++] = 109; // MP3 for "thousands" digits[digit_count++] = thousands; } break; @@ -333,7 +333,7 @@ void MUSIC_PlayValue(u16 music, s32 value, u8 unit, u8 prec) } else { if (thousands) { - digits[digit_count++] = 109; // MP3 for "thousands" + digits[digit_count++] = 109; // MP3 for "thousands" digits[digit_count++] = thousands; } } From 7147d6a77bfdf266ba449b87ee0093db8c0ac0a8 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 8 Feb 2019 20:34:20 +0100 Subject: [PATCH 25/37] avoid preprocessor ifs --- src/config/voice.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/config/voice.c b/src/config/voice.c index 72fc70d0b1..83feec1605 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -49,21 +49,20 @@ static int ini_handler(void* user, const char* section, const char* name, const if ( k && (req_id != MAX_VOICEMAP_ENTRIES) && (req_id == id) ) { current_voice_mapping.duration = duration; -#if HAS_MUSIC_CONFIG - strlcpy(tempstring, value, k+1); // return a requested mp3 label passed at *user to tempstring -#endif + if (HAS_MUSIC_CONFIG) + strlcpy(tempstring, value, k+1); // return a requested mp3 label passed at *user to tempstring return 1; } -#if HAS_MUSIC_CONFIG - if ( req_id == MAX_VOICEMAP_ENTRIES ) { - if (MATCH_SECTION(SECTION_VOICE_CUSTOM)) { - // Initial count of custom voicemap entries - voice_map_entries++; - return 1; + if (HAS_MUSIC_CONFIG) { + if ( req_id == MAX_VOICEMAP_ENTRIES ) { + if (MATCH_SECTION(SECTION_VOICE_CUSTOM)) { + // Initial count of custom voicemap entries + voice_map_entries++; + return 1; + } + return 0; } - return 0; } -#endif return 1; // voice label ignored } From 682a87ecb58f90ca2aaf548ea46f677725ca8e05 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Mon, 18 Feb 2019 14:18:16 +0100 Subject: [PATCH 26/37] address review --- src/config/voice.c | 7 ++++--- src/extended_audio.c | 4 ++-- src/extended_audio.h | 4 ++-- src/music.h | 7 +------ src/pages/common/_voiceconfig_page.c | 5 ----- 5 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/config/voice.c b/src/config/voice.c index 83feec1605..063d1c43b8 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -84,10 +84,11 @@ const char* CONFIG_VoiceParse(unsigned id) char filename[] = "media/voice.ini"; #endif if (id == MAX_VOICEMAP_ENTRIES) { // initial parse of voice.ini - if (CONFIG_IniParse(filename, ini_handler, &id)) { - printf("Failed to parse voice.ini\n"); - // Transmitter.audio_player = AUDIO_NONE; // disable external voice output + if (CONFIG_IniParse(filename, ini_handler, &id)) tempstring[0] = '\0'; + if (voice_map_entries == 0) { + printf("Failed to parse voice.ini\n"); + Transmitter.audio_player = AUDIO_NONE; // disable external voice when no custom voices are found in voice.ini } } if ( (id < MAX_VOICEMAP_ENTRIES) ) { diff --git a/src/extended_audio.c b/src/extended_audio.c index 824aa0093f..e9a1de229c 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -27,8 +27,8 @@ #if HAS_EXTENDED_AUDIO u16 voice_map_entries; -struct VoiceMap current_voice_mapping; -struct AudioQueue audio_queue[AUDIO_QUEUE_LENGTH]; +struct QueueEntry current_voice_mapping; +struct QueueEntry audio_queue[AUDIO_QUEUE_LENGTH]; u8 next_audio; u8 num_audio; u32 audio_queue_time; diff --git a/src/extended_audio.h b/src/extended_audio.h index fd26de99fb..f3e4343cab 100644 --- a/src/extended_audio.h +++ b/src/extended_audio.h @@ -10,8 +10,8 @@ void AUDIO_SetVolume(); void AUDIO_CheckQueue(); int AUDIO_AddQueue(u16 music); -extern struct AudioQueue audio_queue[AUDIO_QUEUE_LENGTH]; -extern struct VoiceMap current_voice_mapping; +extern struct QueueEntry audio_queue[AUDIO_QUEUE_LENGTH]; +extern struct QueueEntry current_voice_mapping; extern u8 next_audio; extern u8 num_audio; extern u32 audio_queue_time; diff --git a/src/music.h b/src/music.h index 64629e20b4..904d7df179 100644 --- a/src/music.h +++ b/src/music.h @@ -103,12 +103,7 @@ struct Voice { extern u16 voice_map_entries; -struct VoiceMap { - u16 id; - u16 duration; -}; - -struct AudioQueue { +struct QueueEntry { u16 id; u16 duration; }; diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index fb4819ff18..5455d2f57b 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -48,21 +48,16 @@ static struct CustomVoice *voiceconfig_setsrcptr(u8 idx) { switch (voiceconfig_getsrctype(idx)) { case VOICE_SRC_SWITCH: return &Model.voice.switches[idx - VOICE_SRC_SWITCH]; - break; #if NUM_AUX_KNOBS case VOICE_SRC_AUX: return &Model.voice.aux[idx - VOICE_SRC_AUX]; - break; #endif case VOICE_SRC_TIMER: return &Model.voice.timer[idx - VOICE_SRC_TIMER]; - break; case VOICE_SRC_TELEMETRY: return &Model.voice.telemetry[idx - VOICE_SRC_TELEMETRY]; - break; case VOICE_SRC_MIXER: return &Model.voice.mixer[idx - VOICE_SRC_MIXER]; - break; } return NULL; } From 8583924c5bc1d9f5e0738280d030eedd968ba559 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Wed, 20 Feb 2019 21:01:54 +0100 Subject: [PATCH 27/37] fix merge errors --- src/main.c | 2 +- src/telemetry.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index c8264c8787..c69cc297fd 100644 --- a/src/main.c +++ b/src/main.c @@ -233,7 +233,7 @@ void EventLoop() if(Transmitter.music_shutdown) { #if HAS_EXTENDED_AUDIO MUSIC_Play(MUSIC_SHUTDOWN); - while (CLOCK_getms()src]) { + switch (alarm->src) { case TELEM_DEVO_VOLT1: case TELEM_DEVO_VOLT2: case TELEM_DEVO_VOLT3: telem_unit = VOICE_UNIT_VOLT; telem_prec = 1; break; From 529de21acb4ab6c1e8fd10fd38ec52c14d9ffb3b Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 8 Mar 2019 11:03:18 +0100 Subject: [PATCH 28/37] Allow empty custom music section --- src/music.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/music.h b/src/music.h index 904d7df179..b170b0ac5d 100644 --- a/src/music.h +++ b/src/music.h @@ -101,7 +101,7 @@ struct Voice { #endif }; -extern u16 voice_map_entries; +extern s16 voice_map_entries; struct QueueEntry { u16 id; From 7ce4bc1cc0dfa2313d2d35a7dfb424e113f05c2e Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 8 Mar 2019 11:06:41 +0100 Subject: [PATCH 29/37] Allow empty custom voice section #2 --- src/extended_audio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index e9a1de229c..e5a83e0a23 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -26,7 +26,7 @@ #endif // EMULATOR #if HAS_EXTENDED_AUDIO -u16 voice_map_entries; +s16 voice_map_entries; struct QueueEntry current_voice_mapping; struct QueueEntry audio_queue[AUDIO_QUEUE_LENGTH]; u8 next_audio; From ed12dc7068d7d645af89d98190ccfd926246bd9c Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 8 Mar 2019 11:11:46 +0100 Subject: [PATCH 30/37] Allow empty custom section in voice.ini --- src/config/voice.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/config/voice.c b/src/config/voice.c index 063d1c43b8..b57cfd3668 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -55,6 +55,9 @@ static int ini_handler(void* user, const char* section, const char* name, const } if (HAS_MUSIC_CONFIG) { if ( req_id == MAX_VOICEMAP_ENTRIES ) { + if (MATCH_SECTION(SECTION_VOICE_GLOBAL)) { + voice_map_entries = 0; + } if (MATCH_SECTION(SECTION_VOICE_CUSTOM)) { // Initial count of custom voicemap entries voice_map_entries++; @@ -86,9 +89,9 @@ const char* CONFIG_VoiceParse(unsigned id) if (id == MAX_VOICEMAP_ENTRIES) { // initial parse of voice.ini if (CONFIG_IniParse(filename, ini_handler, &id)) tempstring[0] = '\0'; - if (voice_map_entries == 0) { + if (voice_map_entries < 0) { printf("Failed to parse voice.ini\n"); - Transmitter.audio_player = AUDIO_NONE; // disable external voice when no custom voices are found in voice.ini + Transmitter.audio_player = AUDIO_NONE; // disable external voice when no global voices are found in voice.ini } } if ( (id < MAX_VOICEMAP_ENTRIES) ) { From 304060c0786fedcf6ece1ca626c9c8af58942d11 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 8 Mar 2019 11:12:47 +0100 Subject: [PATCH 31/37] Fix error --- src/extended_audio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index e5a83e0a23..6f3539ff80 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -26,7 +26,7 @@ #endif // EMULATOR #if HAS_EXTENDED_AUDIO -s16 voice_map_entries; +s16 voice_map_entries = -1; struct QueueEntry current_voice_mapping; struct QueueEntry audio_queue[AUDIO_QUEUE_LENGTH]; u8 next_audio; From 336532ab2edcc23faec7d0db1d65630805a09764 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 8 Mar 2019 12:39:09 +0100 Subject: [PATCH 32/37] Fix screenshot test --- src/tests/test_pages.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/test_pages.c b/src/tests/test_pages.c index 6ea03913ba..877458c7b2 100644 --- a/src/tests/test_pages.c +++ b/src/tests/test_pages.c @@ -19,6 +19,7 @@ void TestAllPages(CuTest* t) CONFIG_ReadTemplate("heli_std.ini"); Transmitter.audio_player = AUDIO_AUDIOFX; Transmitter.current_model = 1; + voice_map_entries = 0; PAGE_Init(); for (int i = 0; i < PAGEID_LAST; i++) { From 3785845b93736bd3a21cb3c50ce3e69978a5ca3a Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Fri, 8 Mar 2019 12:40:07 +0100 Subject: [PATCH 33/37] Fix lint error --- src/config/voice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/voice.c b/src/config/voice.c index b57cfd3668..496c46126e 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -57,7 +57,7 @@ static int ini_handler(void* user, const char* section, const char* name, const if ( req_id == MAX_VOICEMAP_ENTRIES ) { if (MATCH_SECTION(SECTION_VOICE_GLOBAL)) { voice_map_entries = 0; - } + } if (MATCH_SECTION(SECTION_VOICE_CUSTOM)) { // Initial count of custom voicemap entries voice_map_entries++; From 0416d69ee6c390cc49ad9f86ab7929495f4b5c22 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Tue, 12 Mar 2019 23:11:40 +0100 Subject: [PATCH 34/37] remove voice config from screenshot tests --- src/tests/320x240x16/Voice_config.png | Bin 11198 -> 0 bytes src/tests/test_pages.c | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 src/tests/320x240x16/Voice_config.png diff --git a/src/tests/320x240x16/Voice_config.png b/src/tests/320x240x16/Voice_config.png deleted file mode 100644 index 78aa51de145bdb8e6212ff3c2784d81239effaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11198 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 Date: Wed, 13 Mar 2019 00:04:10 +0100 Subject: [PATCH 35/37] address review --- src/config/tx.c | 1 + src/config/tx.h | 1 + src/config/voice.c | 6 +++--- src/config/voice.h | 5 +++++ src/extended_audio.c | 1 - src/music.h | 7 ++++--- src/pages/common/_voiceconfig_page.c | 2 +- src/timer.h | 6 ++---- 8 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/config/tx.c b/src/config/tx.c index 267ebeffe0..fbb4bdf50c 100644 --- a/src/config/tx.c +++ b/src/config/tx.c @@ -338,6 +338,7 @@ void CONFIG_LoadTx() #if HAS_EXTENDED_AUDIO Transmitter.audio_player = AUDIO_NONE; Transmitter.audio_vol = 10; + Transmitter.voice_ini_entries = VOICE_INI_EMPTY; #endif #if HAS_AUDIO_UART Transmitter.audio_uart = 0; diff --git a/src/config/tx.h b/src/config/tx.h index c6b9a04123..8f89afbfa0 100644 --- a/src/config/tx.h +++ b/src/config/tx.h @@ -58,6 +58,7 @@ struct Transmitter { #if HAS_EXTENDED_AUDIO enum AudioPlayers audio_player; u8 audio_vol; + s16 voice_ini_entries; #endif #if HAS_AUDIO_UART u8 audio_uart; diff --git a/src/config/voice.c b/src/config/voice.c index 496c46126e..3ce3dbc946 100644 --- a/src/config/voice.c +++ b/src/config/voice.c @@ -56,11 +56,11 @@ static int ini_handler(void* user, const char* section, const char* name, const if (HAS_MUSIC_CONFIG) { if ( req_id == MAX_VOICEMAP_ENTRIES ) { if (MATCH_SECTION(SECTION_VOICE_GLOBAL)) { - voice_map_entries = 0; + Transmitter.voice_ini_entries = VOICE_INI_GLOBAL_ONLY; } if (MATCH_SECTION(SECTION_VOICE_CUSTOM)) { // Initial count of custom voicemap entries - voice_map_entries++; + Transmitter.voice_ini_entries++; return 1; } return 0; @@ -89,7 +89,7 @@ const char* CONFIG_VoiceParse(unsigned id) if (id == MAX_VOICEMAP_ENTRIES) { // initial parse of voice.ini if (CONFIG_IniParse(filename, ini_handler, &id)) tempstring[0] = '\0'; - if (voice_map_entries < 0) { + if (Transmitter.voice_ini_entries == VOICE_INI_EMPTY) { printf("Failed to parse voice.ini\n"); Transmitter.audio_player = AUDIO_NONE; // disable external voice when no global voices are found in voice.ini } diff --git a/src/config/voice.h b/src/config/voice.h index 7f4de70aea..479e5f48d5 100644 --- a/src/config/voice.h +++ b/src/config/voice.h @@ -1 +1,6 @@ +#ifndef _VOICE_H_ +#define _VOICE_H_ + const char* CONFIG_VoiceParse(unsigned id); + +#endif \ No newline at end of file diff --git a/src/extended_audio.c b/src/extended_audio.c index 6f3539ff80..cb94cc7dcc 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -26,7 +26,6 @@ #endif // EMULATOR #if HAS_EXTENDED_AUDIO -s16 voice_map_entries = -1; struct QueueEntry current_voice_mapping; struct QueueEntry audio_queue[AUDIO_QUEUE_LENGTH]; u8 next_audio; diff --git a/src/music.h b/src/music.h index b170b0ac5d..c5960911b0 100644 --- a/src/music.h +++ b/src/music.h @@ -85,7 +85,10 @@ enum { VOICE_UNIT_TOTAL }; - +enum { + VOICE_INI_EMPTY = -1, + VOICE_INI_GLOBAL_ONLY = 0, +}; struct CustomVoice { u16 music; @@ -101,8 +104,6 @@ struct Voice { #endif }; -extern s16 voice_map_entries; - struct QueueEntry { u16 id; u16 duration; diff --git a/src/pages/common/_voiceconfig_page.c b/src/pages/common/_voiceconfig_page.c index 5455d2f57b..5afe1681e1 100644 --- a/src/pages/common/_voiceconfig_page.c +++ b/src/pages/common/_voiceconfig_page.c @@ -147,7 +147,7 @@ static const char *voiceid_cb(guiObject_t *obj, int dir, void *data) return strcpy(tempstring, _tr("None")); } vpt->music = GUI_TextSelectHelper(vpt->music - CUSTOM_ALARM_ID + 1, // Relabling so voice in menu starts with 1 - 1, voice_map_entries, dir, 1, 10, NULL) + CUSTOM_ALARM_ID - 1; + 1, Transmitter.voice_ini_entries, dir, 1, 10, NULL) + CUSTOM_ALARM_ID - 1; if (voiceconfig_getsrctype(idx) == VOICE_SRC_TIMER) { // Setting duration for custom timer alarms CONFIG_VoiceParse(vpt->music); diff --git a/src/timer.h b/src/timer.h index abad0b0d0f..bed80a492e 100644 --- a/src/timer.h +++ b/src/timer.h @@ -24,11 +24,9 @@ struct Timer { u8 resetsrc; u16 timer; u32 val; -#if HAS_EXTENDED_AUDIO - u16 duration; -#endif + u16 duration; // only needed for voice, but we're padding anyways enum TimerType type; - u8 padding_1[3]; //Needed to ensure structure is word aligned + u8 padding_1[1]; // Needed to ensure structure is word aligned }; struct CountDownTimerSettings { From 942a33cd38deb22fe26086471d663a5d82a3914c Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Wed, 13 Mar 2019 00:07:04 +0100 Subject: [PATCH 36/37] fix lint error --- src/config/voice.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/voice.h b/src/config/voice.h index 479e5f48d5..6497754945 100644 --- a/src/config/voice.h +++ b/src/config/voice.h @@ -3,4 +3,4 @@ const char* CONFIG_VoiceParse(unsigned id); -#endif \ No newline at end of file +#endif From db82aefac103870119f071e2ecef45c7c1ea02c5 Mon Sep 17 00:00:00 2001 From: TheRealMoeder Date: Sun, 24 Mar 2019 22:44:57 +0100 Subject: [PATCH 37/37] fix merge error --- src/extended_audio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extended_audio.c b/src/extended_audio.c index 7ff0c1b96a..aeba2428ce 100644 --- a/src/extended_audio.c +++ b/src/extended_audio.c @@ -200,7 +200,7 @@ void AUDIO_CheckQueue() { next_audio++; } } else if (num_audio && t > audio_queue_time) { - printf("Voice: Queue finished.") + printf("Voice: Queue finished.\n"); AUDIO_ResetQueue(); AUDIO_SetVolume(); }