diff --git a/openrtx/include/core/ui.h b/openrtx/include/core/ui.h index 232ba06e..8ac059ed 100644 --- a/openrtx/include/core/ui.h +++ b/openrtx/include/core/ui.h @@ -60,6 +60,7 @@ enum uiScreen SETTINGS_DISPLAY, SETTINGS_GPS, SETTINGS_M17, + SETTINGS_VOICE, SETTINGS_RESET2DEFAULTS, LOW_BAT }; @@ -96,6 +97,7 @@ enum settingsItems ,S_GPS #endif ,S_M17 + ,S_VOICE ,S_RESET2DEFAULTS }; @@ -122,6 +124,11 @@ enum settingsGPSItems G_TIMEZONE }; #endif +enum settingsVoicePromptItems +{ + VP_LEVEL = 0, + VP_PHONETIC, +}; /** * Struct containing a set of positions and sizes that get @@ -197,6 +204,8 @@ extern const char *menu_items[]; extern const char *settings_items[]; extern const char *display_items[]; extern const char *settings_gps_items[]; +extern const char * settings_voice_items[]; + extern const char *backup_restore_items[]; extern const char *info_items[]; extern const char *authors[]; @@ -204,6 +213,7 @@ extern const uint8_t menu_num; extern const uint8_t settings_num; extern const uint8_t display_num; extern const uint8_t settings_gps_num; +extern const uint8_t settings_voice_num; extern const uint8_t backup_restore_num; extern const uint8_t info_num; extern const uint8_t author_num; diff --git a/openrtx/include/ui/EnglishStrings.h b/openrtx/include/ui/EnglishStrings.h index 2b3270ab..c056bdce 100644 --- a/openrtx/include/ui/EnglishStrings.h +++ b/openrtx/include/ui/EnglishStrings.h @@ -45,6 +45,10 @@ const stringsTable_t englishStrings = .gpsEnabled = "GPS Enabled", .gpsSetTime = "GPS Set Time", .UTCTimeZone = "UTC Timezone", + .voice = "Voice", + .level = "Level", + .phonetic = "Phonetic", + .beep = "Beep", .backup = "Backup", .restore = "Restore", .batteryVoltage = "Bat. Voltage", diff --git a/openrtx/include/ui/UIStrings.h b/openrtx/include/ui/UIStrings.h index e9b78501..9b40f122 100644 --- a/openrtx/include/ui/UIStrings.h +++ b/openrtx/include/ui/UIStrings.h @@ -50,6 +50,10 @@ typedef struct const char* gpsEnabled; const char* gpsSetTime; const char* UTCTimeZone; + const char* voice; + const char* level; + const char* phonetic; + const char* beep; const char* backup; const char* restore; const char* batteryVoltage; diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index 6ad5263e..7b669cbc 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -98,6 +98,7 @@ extern void _ui_drawMenuContacts(ui_state_t* ui_state); extern void _ui_drawMenuGPS(); extern void _ui_drawSettingsGPS(ui_state_t* ui_state); #endif +extern void _ui_drawSettingsVoicePrompts(ui_state_t* ui_state); extern void _ui_drawMenuSettings(ui_state_t* ui_state); extern void _ui_drawMenuBackupRestore(ui_state_t* ui_state); extern void _ui_drawMenuBackup(ui_state_t* ui_state); @@ -110,6 +111,7 @@ extern void _ui_drawSettingsTimeDateSet(ui_state_t* ui_state); #endif extern void _ui_drawSettingsDisplay(ui_state_t* ui_state); extern void _ui_drawSettingsM17(ui_state_t* ui_state); +extern void _ui_drawSettingsVoicePrompts(ui_state_t* ui_state); extern void _ui_drawSettingsReset2Defaults(ui_state_t* ui_state); extern bool _ui_drawMacroMenu(); @@ -137,6 +139,7 @@ const char *settings_items[] = "GPS", #endif "M17", + "Voice", "Default Settings" }; @@ -157,6 +160,11 @@ const char *settings_gps_items[] = "UTC Timezone" }; #endif +const char * settings_voice_items[] = +{ + "Voice Level", + "Phonetic" +}; const char *backup_restore_items[] = { @@ -224,6 +232,7 @@ const uint8_t display_num = sizeof(display_items)/sizeof(display_items[0]); #ifdef GPS_PRESENT const uint8_t settings_gps_num = sizeof(settings_gps_items)/sizeof(settings_gps_items[0]); #endif +const uint8_t settings_voice_num = sizeof(settings_voice_items)/sizeof(settings_voice_items[0]); const uint8_t backup_restore_num = sizeof(backup_restore_items)/sizeof(backup_restore_items[0]); const uint8_t info_num = sizeof(info_items)/sizeof(info_items[0]); const uint8_t author_num = sizeof(authors)/sizeof(authors[0]); @@ -703,6 +712,21 @@ void _ui_changeTimer(int variation) state.settings.display_timer += variation; } +void _ui_changeVoiceLevel(int variation) +{ + if ((state.settings.vpLevel == vpNone && variation < 0) || + (state.settings.vpLevel == vpHigh && variation > 0)) + { + return; + } + state.settings.vpLevel += variation; +} + +void _ui_changePhoneticSpell(bool newVal) +{ + state.settings.vpPhoneticSpell = newVal ? 1 : 0; +} + bool _ui_checkStandby(long long time_since_last_event) { if (standby) @@ -1422,7 +1446,10 @@ void ui_updateFSM(bool *sync_rtx) case S_M17: state.ui_screen = SETTINGS_M17; break; - case S_RESET2DEFAULTS: + case S_VOICE: + state.ui_screen = SETTINGS_VOICE; + break; + case S_RESET2DEFAULTS: state.ui_screen = SETTINGS_RESET2DEFAULTS; break; default: @@ -1641,6 +1668,46 @@ void ui_updateFSM(bool *sync_rtx) _ui_menuBack(MENU_SETTINGS); } break; + case SETTINGS_VOICE: + if(msg.keys & KEY_LEFT || (ui_state.edit_mode && + (msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT))) + { + switch(ui_state.menu_selected) + { + case VP_LEVEL: + _ui_changeVoiceLevel(-1); + break; + case VP_PHONETIC: + _ui_changePhoneticSpell(false); + break; + default: + state.ui_screen = SETTINGS_VOICE; + } + } + else if(msg.keys & KEY_RIGHT || (ui_state.edit_mode && + (msg.keys & KEY_UP || msg.keys & KNOB_RIGHT))) + { + switch(ui_state.menu_selected) + { + case VP_LEVEL: + _ui_changeVoiceLevel(1); + break; + case VP_PHONETIC: + _ui_changePhoneticSpell(true); + break; + default: + state.ui_screen = SETTINGS_VOICE; + } + } + else if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) + _ui_menuUp(settings_voice_num); + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) + _ui_menuDown(settings_voice_num); + else if(msg.keys & KEY_ENTER) + ui_state.edit_mode = !ui_state.edit_mode; + else if(msg.keys & KEY_ESC) + _ui_menuBack(MENU_SETTINGS); + break; case SETTINGS_RESET2DEFAULTS: if(! ui_state.edit_mode){ //require a confirmation ENTER, then another @@ -1784,6 +1851,9 @@ bool ui_updateGUI() case SETTINGS_M17: _ui_drawSettingsM17(&ui_state); break; + case SETTINGS_VOICE: + _ui_drawSettingsVoicePrompts(&ui_state); + break; // Screen to support resetting Settings and VFO to defaults case SETTINGS_RESET2DEFAULTS: _ui_drawSettingsReset2Defaults(&ui_state); diff --git a/openrtx/src/ui/ui_menu.c b/openrtx/src/ui/ui_menu.c index 62a6e4fb..f951a120 100644 --- a/openrtx/src/ui/ui_menu.c +++ b/openrtx/src/ui/ui_menu.c @@ -265,6 +265,43 @@ int _ui_getSettingsGPSValueName(char *buf, uint8_t max_len, uint8_t index) } #endif +int _ui_getVoiceEntryName(char *buf, uint8_t max_len, uint8_t index) +{ + if(index >= settings_voice_num) return -1; + snprintf(buf, max_len, "%s", settings_voice_items[index]); + return 0; +} + +int _ui_getVoiceValueName(char *buf, uint8_t max_len, uint8_t index) +{ + if(index >= settings_voice_num) return -1; + uint8_t value = 0; + switch(index) + { + case VP_LEVEL: + { + value = last_state.settings.vpLevel; + switch (value) + { + case vpNone: + snprintf(buf, max_len, "%s", currentLanguage->off); + break; + case vpBeep: + snprintf(buf, max_len, "%s", currentLanguage->beep); + break; + default: + snprintf(buf, max_len, "%s %d", currentLanguage->level, (value-vpBeep)); + break; + } + break; + } + case VP_PHONETIC: + snprintf(buf, max_len, "%s", last_state.settings.vpPhoneticSpell ? currentLanguage->on : currentLanguage->off); + break; + } + return 0; +} + int _ui_getBackupRestoreEntryName(char *buf, uint8_t max_len, uint8_t index) { if(index >= backup_restore_num) return -1; @@ -698,6 +735,17 @@ void _ui_drawSettingsM17(ui_state_t* ui_state) } } +void _ui_drawSettingsVoicePrompts(ui_state_t* ui_state) +{ + gfx_clearScreen(); + // Print "Voice" on top bar + gfx_print(layout.top_pos, layout.top_font, TEXT_ALIGN_CENTER, + color_white, currentLanguage->voice); + // Print voice settings entries + _ui_drawMenuListValue(ui_state, ui_state->menu_selected, _ui_getVoiceEntryName, + _ui_getVoiceValueName); +} + void _ui_drawSettingsReset2Defaults(ui_state_t* ui_state) { (void) ui_state;