Apply clang-format

This commit is contained in:
Niccolò Izzo 2022-06-22 20:21:18 +02:00 committed by Silvano Seva
parent 29de1d36d4
commit 1f71789a9d
7 changed files with 1153 additions and 1133 deletions

View File

@ -16,14 +16,14 @@
* You should have received a copy of the GNU General Public License * * You should have received a copy of the GNU General Public License *
* along with this program; if not, see <http://www.gnu.org/licenses/> * * along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/ ***************************************************************************/
// This file contains functions for announcing radio operations using the // This file contains functions for announcing radio operations using the
// building blocks in voicePrompts.h/c. // building blocks in voicePrompts.h/c.
#ifndef VOICE_PROMPT_UTILS_H_INCLUDED #ifndef VOICE_PROMPT_UTILS_H_INCLUDED
#define VOICE_PROMPT_UTILS_H_INCLUDED #define VOICE_PROMPT_UTILS_H_INCLUDED
#include "voicePrompts.h"
#include "ui/UIStrings.h"
#include "cps.h" #include "cps.h"
#include "ui/UIStrings.h"
#include "voicePrompts.h"
/* /*
Please Note! Please Note!
@ -38,12 +38,14 @@ should be used to ensure that the message interupts the current prompt and
plays immediately. plays immediately.
*/ */
void announceVFO(); void announceVFO();
void announceChannelName(channel_t* channel, uint16_t channelIndex, VoicePromptQueueFlags_T flags); void announceChannelName(channel_t* channel, uint16_t channelIndex,
VoicePromptQueueFlags_T flags);
void vpQueueFrequency(freq_t freq); void vpQueueFrequency(freq_t freq);
void announceFrequencies(freq_t rx, freq_t tx, VoicePromptQueueFlags_T flags); void announceFrequencies(freq_t rx, freq_t tx, VoicePromptQueueFlags_T flags);
void announceRadioMode(uint8_t mode, VoicePromptQueueFlags_T flags); void announceRadioMode(uint8_t mode, VoicePromptQueueFlags_T flags);
void announceBandwidth(uint8_t bandwidth, VoicePromptQueueFlags_T flags); void announceBandwidth(uint8_t bandwidth, VoicePromptQueueFlags_T flags);
void announceChannelSummary(channel_t* channel, uint16_t channelIndex, uint16_t bank); void announceChannelSummary(channel_t* channel, uint16_t channelIndex,
uint16_t bank);
void AnnounceInputChar(char ch); void AnnounceInputChar(char ch);
void announceInputReceiveOrTransmit(bool tx, VoicePromptQueueFlags_T flags); void announceInputReceiveOrTransmit(bool tx, VoicePromptQueueFlags_T flags);
void ReplayLastPrompt(); void ReplayLastPrompt();
@ -54,15 +56,17 @@ This function first tries to see if we have a prompt for the text
passed in and if so, queues it, but if not, just spells the text passed in and if so, queues it, but if not, just spells the text
character by character. character by character.
*/ */
void announceText( char* text, VoicePromptQueueFlags_T flags); void announceText(char* text, VoicePromptQueueFlags_T flags);
void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8_t txTone, VoicePromptQueueFlags_T flags); void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled,
uint8_t txTone, VoicePromptQueueFlags_T flags);
void anouncePower(float power, VoicePromptQueueFlags_T flags); void anouncePower(float power, VoicePromptQueueFlags_T flags);
void announceBrightness(uint8_t brightness, VoicePromptQueueFlags_T flags); void announceBrightness(uint8_t brightness, VoicePromptQueueFlags_T flags);
void announceSquelch(uint8_t squelch, VoicePromptQueueFlags_T flags); void announceSquelch(uint8_t squelch, VoicePromptQueueFlags_T flags);
void announceContact(contact_t* contact, VoicePromptQueueFlags_T flags); void announceContact(contact_t* contact, VoicePromptQueueFlags_T flags);
void announceContactWithIndex(uint16_t index, VoicePromptQueueFlags_T flags); void announceContactWithIndex(uint16_t index, VoicePromptQueueFlags_T flags);
void announceTimeslot(uint8_t timeslot, VoicePromptQueueFlags_T flags); void announceTimeslot(uint8_t timeslot, VoicePromptQueueFlags_T flags);
void announceColorCode(uint8_t rxColorCode, uint8_t txColorCode, VoicePromptQueueFlags_T flags); void announceColorCode(uint8_t rxColorCode, uint8_t txColorCode,
VoicePromptQueueFlags_T flags);
void announceBank(uint16_t bank, VoicePromptQueueFlags_T flags); void announceBank(uint16_t bank, VoicePromptQueueFlags_T flags);
void announceM17Info(channel_t* channel, VoicePromptQueueFlags_T flags); void announceM17Info(channel_t* channel, VoicePromptQueueFlags_T flags);
#ifdef GPS_PRESENT #ifdef GPS_PRESENT
@ -76,4 +80,4 @@ void announceSettingsTimeDate();
#endif // RTC_PRESENT #endif // RTC_PRESENT
VoicePromptQueueFlags_T GetQueueFlagsForVoiceLevel(); VoicePromptQueueFlags_T GetQueueFlagsForVoiceLevel();
#endif //VOICE_PROMPT_UTILS_H_INCLUDED #endif // VOICE_PROMPT_UTILS_H_INCLUDED

View File

@ -34,154 +34,156 @@ wordlist.csv file in the voicePrompts generator project.
*/ */
typedef enum typedef enum
{ {
PROMPT_SILENCE, // PROMPT_SILENCE, //
PROMPT_0, // 0 PROMPT_0, // 0
PROMPT_1, // 1 PROMPT_1, // 1
PROMPT_2, // 2 PROMPT_2, // 2
PROMPT_3, // 3 PROMPT_3, // 3
PROMPT_4, // 4 PROMPT_4, // 4
PROMPT_5, // 5 PROMPT_5, // 5
PROMPT_6, // 6 PROMPT_6, // 6
PROMPT_7, // 7 PROMPT_7, // 7
PROMPT_8, // 8 PROMPT_8, // 8
PROMPT_9, // 9 PROMPT_9, // 9
PROMPT_A, // A PROMPT_A, // A
PROMPT_B, // B PROMPT_B, // B
PROMPT_C, // C PROMPT_C, // C
PROMPT_D, // D PROMPT_D, // D
PROMPT_E, // E PROMPT_E, // E
PROMPT_F, // F PROMPT_F, // F
PROMPT_G, // G PROMPT_G, // G
PROMPT_H, // H PROMPT_H, // H
PROMPT_I, // I PROMPT_I, // I
PROMPT_J, // J PROMPT_J, // J
PROMPT_K, // K PROMPT_K, // K
PROMPT_L, // L PROMPT_L, // L
PROMPT_M, // M PROMPT_M, // M
PROMPT_N, // N PROMPT_N, // N
PROMPT_O, // O PROMPT_O, // O
PROMPT_P, // P PROMPT_P, // P
PROMPT_Q, // Q PROMPT_Q, // Q
PROMPT_R, // R PROMPT_R, // R
PROMPT_S, // S PROMPT_S, // S
PROMPT_T, // T PROMPT_T, // T
PROMPT_U, // U PROMPT_U, // U
PROMPT_V, // V PROMPT_V, // V
PROMPT_W, // W PROMPT_W, // W
PROMPT_X, // X PROMPT_X, // X
PROMPT_Y, // Y PROMPT_Y, // Y
PROMPT_Z, // Zed PROMPT_Z, // Zed
PROMPT_A_PHONETIC, // alpha PROMPT_A_PHONETIC, // alpha
PROMPT_B_PHONETIC, // bravo PROMPT_B_PHONETIC, // bravo
PROMPT_C_PHONETIC, // charlie PROMPT_C_PHONETIC, // charlie
PROMPT_D_PHONETIC, // delta PROMPT_D_PHONETIC, // delta
PROMPT_E_PHONETIC, // echo PROMPT_E_PHONETIC, // echo
PROMPT_F_PHONETIC, // foxtrot PROMPT_F_PHONETIC, // foxtrot
PROMPT_G_PHONETIC, // golf PROMPT_G_PHONETIC, // golf
PROMPT_H_PHONETIC, // hotel PROMPT_H_PHONETIC, // hotel
PROMPT_I_PHONETIC, // india PROMPT_I_PHONETIC, // india
PROMPT_J_PHONETIC, // juliet PROMPT_J_PHONETIC, // juliet
PROMPT_K_PHONETIC, // kilo PROMPT_K_PHONETIC, // kilo
PROMPT_L_PHONETIC, // lema PROMPT_L_PHONETIC, // lema
PROMPT_M_PHONETIC, // mike PROMPT_M_PHONETIC, // mike
PROMPT_N_PHONETIC, // november PROMPT_N_PHONETIC, // november
PROMPT_O_PHONETIC, // oscar PROMPT_O_PHONETIC, // oscar
PROMPT_P_PHONETIC, // papa PROMPT_P_PHONETIC, // papa
PROMPT_Q_PHONETIC, // quebec PROMPT_Q_PHONETIC, // quebec
PROMPT_R_PHONETIC, // romeo PROMPT_R_PHONETIC, // romeo
PROMPT_S_PHONETIC, // siera PROMPT_S_PHONETIC, // siera
PROMPT_T_PHONETIC, // tango PROMPT_T_PHONETIC, // tango
PROMPT_U_PHONETIC, // uniform PROMPT_U_PHONETIC, // uniform
PROMPT_V_PHONETIC, // victor PROMPT_V_PHONETIC, // victor
PROMPT_W_PHONETIC, // whisky PROMPT_W_PHONETIC, // whisky
PROMPT_X_PHONETIC, // exray PROMPT_X_PHONETIC, // exray
PROMPT_Y_PHONETIC, // yankie PROMPT_Y_PHONETIC, // yankie
PROMPT_Z_PHONETIC, // zulu PROMPT_Z_PHONETIC, // zulu
PROMPT_CAP, // cap PROMPT_CAP, // cap
PROMPT_HERTZ, // hertz PROMPT_HERTZ, // hertz
PROMPT_KILOHERTZ, // Kilohertz PROMPT_KILOHERTZ, // Kilohertz
PROMPT_MEGAHERTZ, // Megahertz PROMPT_MEGAHERTZ, // Megahertz
PROMPT_CHANNEL, PROMPT_CHANNEL,
PROMPT_VFO, // V F O PROMPT_VFO, // V F O
PROMPT_MILLISECONDS, // Milliseconds PROMPT_MILLISECONDS, // Milliseconds
PROMPT_SECONDS, // Seconds PROMPT_SECONDS, // Seconds
PROMPT_MINUTES, // Minutes PROMPT_MINUTES, // Minutes
PROMPT_VOLTS, // Volts PROMPT_VOLTS, // Volts
PROMPT_MILLIWATTS, // Milliwatts PROMPT_MILLIWATTS, // Milliwatts
PROMPT_WATT, // Wattt PROMPT_WATT, // Wattt
PROMPT_WATTS, // Watts PROMPT_WATTS, // Watts
PROMPT_RECEIVE, // Receive PROMPT_RECEIVE, // Receive
PROMPT_TRANSMIT, // Transmit PROMPT_TRANSMIT, // Transmit
PROMPT_MODE, // Mode PROMPT_MODE, // Mode
PROMPT_BANDWIDTH, // bandwidth PROMPT_BANDWIDTH, // bandwidth
PROMPT_POWER, // power PROMPT_POWER, // power
PROMPT_SQUELCH, // squelch PROMPT_SQUELCH, // squelch
PROMPT_SOURCE_ID, // Source ID PROMPT_SOURCE_ID, // Source ID
PROMPT_DEST_ID, // Destination ID PROMPT_DEST_ID, // Destination ID
PROMPT_DMR_ID, // DMR ID PROMPT_DMR_ID, // DMR ID
PROMPT_TALKGROUP, // Talk group PROMPT_TALKGROUP, // Talk group
PROMPT_TIMESLOT, // timeslot PROMPT_TIMESLOT, // timeslot
PROMPT_COLORCODE, // color code PROMPT_COLORCODE, // color code
PROMPT_TONE, // tone PROMPT_TONE, // tone
PROMPT_CONTACT, // contact PROMPT_CONTACT, // contact
PROMPT_NORTH, // north PROMPT_NORTH, // north
PROMPT_SOUTH, // south PROMPT_SOUTH, // south
PROMPT_EAST, // east PROMPT_EAST, // east
PROMPT_WEST, // west PROMPT_WEST, // west
PROMPT_LATITUDE, // latitude PROMPT_LATITUDE, // latitude
PROMPT_LONGITUDE, // longitude PROMPT_LONGITUDE, // longitude
PROMPT_SPEED, // speed PROMPT_SPEED, // speed
PROMPT_ALTITUDE, // altitude PROMPT_ALTITUDE, // altitude
PROMPT_SATELLITES, // satellites PROMPT_SATELLITES, // satellites
PROMPT_COMPASS, // compass PROMPT_COMPASS, // compass
PROMPT_DEGREES, // degrees PROMPT_DEGREES, // degrees
PROMPT_VP_UNAVAILABLE, // Voice prompts will be unavailable during this operation. PROMPT_VP_UNAVAILABLE, // Voice prompts will be unavailable during this
PROMPT_CHARACTER, // character // operation.
PROMPT_SPACE, // space PROMPT_CHARACTER, // character
PROMPT_PERCENT, // Percent PROMPT_SPACE, // space
PROMPT_POINT, // POINT PROMPT_PERCENT, // Percent
PROMPT_PLUS, // Plus PROMPT_POINT, // POINT
PROMPT_MINUS, // Minus PROMPT_PLUS, // Plus
PROMPT_STAR, // Star PROMPT_MINUS, // Minus
PROMPT_HASH, // Hash PROMPT_STAR, // Star
PROMPT_EXCLAIM, // exclaim PROMPT_HASH, // Hash
PROMPT_COMMA, // comma PROMPT_EXCLAIM, // exclaim
PROMPT_AT, // at PROMPT_COMMA, // comma
PROMPT_COLON, // colon PROMPT_AT, // at
PROMPT_QUESTION, // question PROMPT_COLON, // colon
PROMPT_LEFT_PAREN, // left paren PROMPT_QUESTION, // question
PROMPT_RIGHT_PAREN, // right paren PROMPT_LEFT_PAREN, // left paren
PROMPT_TILDE, // tilde PROMPT_RIGHT_PAREN, // right paren
PROMPT_SLASH, // slash PROMPT_TILDE, // tilde
PROMPT_LEFT_BRACKET, // left bracket PROMPT_SLASH, // slash
PROMPT_RIGHT_BRACKET, // right bracket PROMPT_LEFT_BRACKET, // left bracket
PROMPT_LESS, // less PROMPT_RIGHT_BRACKET, // right bracket
PROMPT_GREATER, // greater PROMPT_LESS, // less
PROMPT_EQUALS, // equals PROMPT_GREATER, // greater
PROMPT_DOLLAR, // dollar PROMPT_EQUALS, // equals
PROMPT_APOSTROPHE, // apostrophe PROMPT_DOLLAR, // dollar
PROMPT_GRAVE, // grave PROMPT_APOSTROPHE, // apostrophe
PROMPT_AMPERSAND, // and PROMPT_GRAVE, // grave
PROMPT_BAR, // bar PROMPT_AMPERSAND, // and
PROMPT_UNDERLINE, // underline PROMPT_BAR, // bar
PROMPT_CARET, // caret PROMPT_UNDERLINE, // underline
PROMPT_LEFT_BRACE, // left brace PROMPT_CARET, // caret
PROMPT_CUSTOM1, // Hotspot PROMPT_LEFT_BRACE, // left brace
PROMPT_CUSTOM2, // ClearNode PROMPT_CUSTOM1, // Hotspot
PROMPT_CUSTOM3, // ShariNode PROMPT_CUSTOM2, // ClearNode
PROMPT_CUSTOM4, // MicroHub PROMPT_CUSTOM3, // ShariNode
PROMPT_CUSTOM5, // Openspot PROMPT_CUSTOM4, // MicroHub
PROMPT_CUSTOM6, // repeater PROMPT_CUSTOM5, // Openspot
PROMPT_CUSTOM7, // BlindHams PROMPT_CUSTOM6, // repeater
PROMPT_CUSTOM8, // Allstar PROMPT_CUSTOM7, // BlindHams
PROMPT_CUSTOM9, // parrot PROMPT_CUSTOM8, // Allstar
PROMPT_CUSTOM10, // unused PROMPT_CUSTOM9, // parrot
NUM_VOICE_PROMPTS, PROMPT_CUSTOM10, // unused
NUM_VOICE_PROMPTS,
} voicePrompt_t; } voicePrompt_t;
// PROMPT_VOICE_NAME is always the very last prompt after the indexed prompts // PROMPT_VOICE_NAME is always the very last prompt after the indexed prompts
// from the strings table. // from the strings table.
#define PROMPT_VOICE_NAME (NUM_VOICE_PROMPTS + (sizeof(stringsTable_t)/sizeof(char*))) #define PROMPT_VOICE_NAME \
(NUM_VOICE_PROMPTS + (sizeof(stringsTable_t) / sizeof(char*)))
/* /*
These flags govern how vpQueueString operates. These flags govern how vpQueueString operates.
For example, when editing, it is desireable to hear spaces, capitals and For example, when editing, it is desireable to hear spaces, capitals and
@ -191,13 +193,13 @@ announced.
*/ */
typedef enum typedef enum
{ {
vpAnnounceCaps=0x01, vpAnnounceCaps = 0x01,
vpAnnounceCustomPrompts=0x02, vpAnnounceCustomPrompts = 0x02,
vpAnnounceSpace=0x04, vpAnnounceSpace = 0x04,
vpAnnounceCommonSymbols=0x08, vpAnnounceCommonSymbols = 0x08,
vpAnnounceLessCommonSymbols=0x10, vpAnnounceLessCommonSymbols = 0x10,
vpAnnounceASCIIValueForUnknownChars=0x20, vpAnnounceASCIIValueForUnknownChars = 0x20,
vpAnnouncePhoneticRendering=0x40, vpAnnouncePhoneticRendering = 0x40,
} VoicePromptFlags_T; } VoicePromptFlags_T;
/* /*
These queuing flags determine if speech is interrupted, played These queuing flags determine if speech is interrupted, played
@ -214,27 +216,27 @@ prompt.
*/ */
typedef enum typedef enum
{ {
vpqDefault = 0, vpqDefault = 0,
vpqInit=0x01, // stop any voice prompts already in progress. vpqInit = 0x01, // stop any voice prompts already in progress.
vpqPlayImmediately=0x02, // call play after queue at all levels. vpqPlayImmediately = 0x02, // call play after queue at all levels.
vpqPlayImmediatelyAtMediumOrHigher =0x04, vpqPlayImmediatelyAtMediumOrHigher = 0x04,
vpqIncludeDescriptions=0x08, vpqIncludeDescriptions = 0x08,
vpqAddSeparatingSilence=0x10 vpqAddSeparatingSilence = 0x10
} VoicePromptQueueFlags_T; } VoicePromptQueueFlags_T;
typedef enum typedef enum
{ {
vpNone=0, vpNone = 0,
vpBeep, vpBeep,
vpLow, vpLow,
vpMedium, vpMedium,
vpHigh vpHigh
} VoicePromptVerbosity_T; } VoicePromptVerbosity_T;
typedef struct typedef struct
{ {
const char* userWord; const char* userWord;
const voicePrompt_t vp; const voicePrompt_t vp;
} userDictEntry; } userDictEntry;
extern bool vpDataIsLoaded; extern bool vpDataIsLoaded;
@ -251,20 +253,20 @@ void vpInit(void);
void vpQueuePrompt(uint16_t prompt); void vpQueuePrompt(uint16_t prompt);
// This function appends the spelling of a complete string to the queue. // This function appends the spelling of a complete string to the queue.
// It is used to pronounce strings for which we do not have a recorded voice // It is used to pronounce strings for which we do not have a recorded voice
//prompt. // prompt.
void vpQueueString(char *promptString, VoicePromptFlags_T flags); void vpQueueString(char* promptString, VoicePromptFlags_T flags);
// This function appends a signed integer to the queue. // This function appends a signed integer to the queue.
void vpQueueInteger(int32_t value); void vpQueueInteger(int32_t value);
// This function appends a text string from the current language to the queue. // This function appends a text string from the current language to the queue.
// e.g. currentLanguage->off // e.g. currentLanguage->off
// These are recorded prompts which correspond to the strings in the strings // These are recorded prompts which correspond to the strings in the strings
// table. // table.
void vpQueueStringTableEntry(const char * const *); void vpQueueStringTableEntry(const char* const*);
void vpPlay(void);// Starts prompt playback void vpPlay(void); // Starts prompt playback
extern bool vpIsPlaying(void); extern bool vpIsPlaying(void);
bool vpHasDataToPlay(void); bool vpHasDataToPlay(void);
void vpTerminate(void); void vpTerminate(void);
bool vpCheckHeader(uint32_t *bufferAddress); bool vpCheckHeader(uint32_t* bufferAddress);
#endif #endif

View File

@ -20,71 +20,71 @@
#ifndef EnglishStrings_h_included #ifndef EnglishStrings_h_included
#define EnglishStrings_h_included #define EnglishStrings_h_included
#include "ui/UIStrings.h" #include "ui/UIStrings.h"
const stringsTable_t englishStrings =
{ const stringsTable_t englishStrings = {
.languageName = "English", .languageName = "English",
.off = "OFF", .off = "OFF",
.on = "ON", .on = "ON",
.banks = "Banks", .banks = "Banks",
.channels = "Channels", .channels = "Channels",
.contacts = "Contacts", .contacts = "Contacts",
.gps = "GPS", .gps = "GPS",
.settings = "Settings", .settings = "Settings",
.backupAndRestore = "Backup & Restore", .backupAndRestore = "Backup & Restore",
.info = "Info", .info = "Info",
.about = "About", .about = "About",
.display = "Display", .display = "Display",
.timeAndDate = "Time & Date", .timeAndDate = "Time & Date",
.fm = "FM", .fm = "FM",
.m17 = "M17", .m17 = "M17",
.dmr = "DMR", .dmr = "DMR",
.defaultSettings = "Default Settings", .defaultSettings = "Default Settings",
.brightness = "Brightness", .brightness = "Brightness",
.contrast = "Contrast", .contrast = "Contrast",
.timer = "Timer", .timer = "Timer",
.gpsEnabled = "GPS Enabled", .gpsEnabled = "GPS Enabled",
.gpsSetTime = "GPS Set Time", .gpsSetTime = "GPS Set Time",
.UTCTimeZone = "UTC Timezone", .UTCTimeZone = "UTC Timezone",
.voice = "Voice", .voice = "Voice",
.level = "Level", .level = "Level",
.phonetic = "Phonetic", .phonetic = "Phonetic",
.beep = "Beep", .beep = "Beep",
.backup = "Backup", .backup = "Backup",
.restore = "Restore", .restore = "Restore",
.batteryVoltage = "Bat. Voltage", .batteryVoltage = "Bat. Voltage",
.batteryCharge = "Bat. Charge", .batteryCharge = "Bat. Charge",
.RSSI = "RSSI", .RSSI = "RSSI",
.model = "Model", .model = "Model",
.band = "Band", .band = "Band",
.VHF = "VHF", .VHF = "VHF",
.UHF = "UHF", .UHF = "UHF",
.LCDType = "LCD Type", .LCDType = "LCD Type",
.Niccolo = "Niccolo' IU2KIN", .Niccolo = "Niccolo' IU2KIN",
.Silvano = "Silvano IU2KWO", .Silvano = "Silvano IU2KWO",
.Federico = "Federico IU2NUO", .Federico = "Federico IU2NUO",
.Fred = "Fred IU2NRO", .Fred = "Fred IU2NRO",
.Joseph = "Joseph VK7JS", .Joseph = "Joseph VK7JS",
.allChannels = "All channels", .allChannels = "All channels",
.menu= "Menu", .menu = "Menu",
.gpsOff = "GPS OFF", .gpsOff = "GPS OFF",
.noFix = "No Fix", .noFix = "No Fix",
.fixLost = "Fix Lost", .fixLost = "Fix Lost",
.error = "ERROR", .error = "ERROR",
.flashBackup = "Flash Backup", .flashBackup = "Flash Backup",
.connectToRTXTool = "Connect to RTXTool", .connectToRTXTool = "Connect to RTXTool",
.toBackupFlashAnd = "to backup flash and", .toBackupFlashAnd = "to backup flash and",
.pressPTTToStart = "press PTT to start.", .pressPTTToStart = "press PTT to start.",
.flashRestore = "Flash Restore", .flashRestore = "Flash Restore",
.toRestoreFlashAnd = "to restore flash and", .toRestoreFlashAnd = "to restore flash and",
.openRTX = "OpenRTX", .openRTX = "OpenRTX",
.gpsSettings = "GPS Settings", .gpsSettings = "GPS Settings",
.m17settings = "M17 Settings", .m17settings = "M17 Settings",
.callsign = "Callsign:", .callsign = "Callsign:",
.resetToDefaults = "Reset to Defaults", .resetToDefaults = "Reset to Defaults",
.toReset = "To reset:", .toReset = "To reset:",
.pressEnterTwice = "Press Enter twice", .pressEnterTwice = "Press Enter twice",
.macroMenu = "Macro Menu", .macroMenu = "Macro Menu",
.forEmergencyUse = "For emergency use", .forEmergencyUse = "For emergency use",
.pressAnyButton = "press any button.", .pressAnyButton = "press any button.",
}; };
#endif //EnglishStrings_h_included #endif // EnglishStrings_h_included

View File

@ -18,8 +18,9 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> * * along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/ ***************************************************************************/
/* /*
This string table's order must not be altered as voice prompts will be indexed in the same order as these strings. This string table's order must not be altered as voice prompts will be indexed
Also, menus may be printed using string table offsets. in the same order as these strings. Also, menus may be printed using string
table offsets.
*/ */
#ifndef UIStrings_h_included #ifndef UIStrings_h_included
#define UIStrings_h_included #define UIStrings_h_included
@ -27,75 +28,75 @@ Also, menus may be printed using string table offsets.
typedef struct typedef struct
{ {
const char* languageName; const char* languageName;
const char* off; const char* off;
const char* on; const char* on;
const char* banks; const char* banks;
const char* channels; const char* channels;
const char* contacts; const char* contacts;
const char* gps; const char* gps;
const char* settings; const char* settings;
const char* backupAndRestore; const char* backupAndRestore;
const char* info; const char* info;
const char* about; const char* about;
const char* display; const char* display;
const char* timeAndDate; const char* timeAndDate;
const char* fm; const char* fm;
const char* m17; const char* m17;
const char* dmr; const char* dmr;
const char* defaultSettings; const char* defaultSettings;
const char* brightness; const char* brightness;
const char* contrast; const char* contrast;
const char* timer; const char* timer;
const char* gpsEnabled; const char* gpsEnabled;
const char* gpsSetTime; const char* gpsSetTime;
const char* UTCTimeZone; const char* UTCTimeZone;
const char* voice; const char* voice;
const char* level; const char* level;
const char* phonetic; const char* phonetic;
const char* beep; const char* beep;
const char* backup; const char* backup;
const char* restore; const char* restore;
const char* batteryVoltage; const char* batteryVoltage;
const char* batteryCharge; const char* batteryCharge;
const char* RSSI; const char* RSSI;
const char* model; const char* model;
const char* band; const char* band;
const char* VHF; const char* VHF;
const char* UHF; const char* UHF;
const char* LCDType; const char* LCDType;
const char* Niccolo; const char* Niccolo;
const char* Silvano; const char* Silvano;
const char* Federico; const char* Federico;
const char* Fred; const char* Fred;
const char* Joseph; const char* Joseph;
const char* allChannels; const char* allChannels;
const char* menu; const char* menu;
const char* gpsOff; const char* gpsOff;
const char* noFix; const char* noFix;
const char* fixLost; const char* fixLost;
const char* error; const char* error;
const char* flashBackup; const char* flashBackup;
const char* connectToRTXTool; const char* connectToRTXTool;
const char* toBackupFlashAnd; const char* toBackupFlashAnd;
const char* pressPTTToStart; const char* pressPTTToStart;
const char* flashRestore; const char* flashRestore;
const char* toRestoreFlashAnd; const char* toRestoreFlashAnd;
const char* openRTX; const char* openRTX;
const char* gpsSettings; const char* gpsSettings;
const char* callsign; const char* callsign;
const char* m17settings; const char* m17settings;
const char* resetToDefaults; const char* resetToDefaults;
const char* toReset; const char* toReset;
const char* pressEnterTwice; const char* pressEnterTwice;
const char* macroMenu; const char* macroMenu;
const char* forEmergencyUse; const char* forEmergencyUse;
const char* pressAnyButton; const char* pressAnyButton;
} stringsTable_t; } stringsTable_t;
extern const stringsTable_t languages[]; extern const stringsTable_t languages[];
extern const stringsTable_t* currentLanguage; extern const stringsTable_t* currentLanguage;
int GetEnglishStringTableOffset( char* text); int GetEnglishStringTableOffset(char* text);
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -17,47 +17,52 @@
* You should have received a copy of the GNU General Public License * * You should have received a copy of the GNU General Public License *
* along with this program; if not, see <http://www.gnu.org/licenses/> * * along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/ ***************************************************************************/
#include "core/voicePrompts.h"
#include <ctype.h>
#include <state.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include <ctype.h>
#include "interfaces/keyboard.h"
#include "core/voicePrompts.h"
#include "ui/UIStrings.h"
#include <state.h>
const uint32_t VOICE_PROMPTS_DATA_MAGIC = 0x5056;//'VP' #include "interfaces/keyboard.h"
const uint32_t VOICE_PROMPTS_DATA_VERSION = 0x1000; // v1000 OpenRTX #include "ui/UIStrings.h"
const uint32_t VOICE_PROMPTS_DATA_MAGIC = 0x5056; //'VP'
const uint32_t VOICE_PROMPTS_DATA_VERSION = 0x1000; // v1000 OpenRTX
// Must match the number of voice prompts allowed by the generator script. // Must match the number of voice prompts allowed by the generator script.
#define VOICE_PROMPTS_TOC_SIZE 350 #define VOICE_PROMPTS_TOC_SIZE 350
// This gets the data for a voice prompt to be demodulated using Codec2. // This gets the data for a voice prompt to be demodulated using Codec2.
// The offset is relative to the start of the voice prompt data. // The offset is relative to the start of the voice prompt data.
// The length is the length in bytes of the data. // The length is the length in bytes of the data.
static void GetCodec2Data(int offset,int length); static void GetCodec2Data(int offset, int length);
typedef struct typedef struct
{ {
uint32_t magic; uint32_t magic;
uint32_t version; uint32_t version;
} voicePromptsDataHeader_t; } voicePromptsDataHeader_t;
// ToDo: may be a file on flashdisk. // ToDo: may be a file on flashdisk.
// ToDo figure this out for OpenRTX // ToDo figure this out for OpenRTX
// Address of voice prompt header for checking version etc. // Address of voice prompt header for checking version etc.
const uint32_t VOICE_PROMPTS_FLASH_HEADER_ADDRESS = 0x8F400; const uint32_t VOICE_PROMPTS_FLASH_HEADER_ADDRESS = 0x8F400;
// Start of actual voice prompt data. // Start of actual voice prompt data.
static uint32_t vpFlashDataAddress;// = VOICE_PROMPTS_FLASH_HEADER_ADDRESS + sizeof(voicePromptsDataHeader_t) + sizeof(uint32_t)*VOICE_PROMPTS_TOC_SIZE ; static uint32_t
vpFlashDataAddress; // = VOICE_PROMPTS_FLASH_HEADER_ADDRESS +
// sizeof(voicePromptsDataHeader_t) +
// sizeof(uint32_t)*VOICE_PROMPTS_TOC_SIZE ;
// TODO figure out Codec2 frame equivalent. // TODO figure out Codec2 frame equivalent.
// 76 x 27 byte Codec2 frames // 76 x 27 byte Codec2 frames
#define Codec2DataBufferSize 2052 #define Codec2DataBufferSize 2052
bool vpDataIsLoaded = false; bool vpDataIsLoaded = false;
static bool voicePromptIsActive = false; static bool voicePromptIsActive = false;
// Uninitialized is -1. // Uninitialized is -1.
static int promptDataPosition = -1; static int promptDataPosition = -1;
static int currentPromptLength = -1; static int currentPromptLength = -1;
// Number of ms from end of playing prompt to disabling amp. // Number of ms from end of playing prompt to disabling amp.
#define PROMPT_TAIL 30 #define PROMPT_TAIL 30
static int promptTail = 0; static int promptTail = 0;
static uint8_t Codec2Data[Codec2DataBufferSize]; static uint8_t Codec2Data[Codec2DataBufferSize];
@ -66,335 +71,343 @@ static uint8_t Codec2Data[Codec2DataBufferSize];
typedef struct typedef struct
{ {
uint16_t Buffer[VOICE_PROMPTS_SEQUENCE_BUFFER_SIZE]; uint16_t Buffer[VOICE_PROMPTS_SEQUENCE_BUFFER_SIZE];
int Pos; int Pos;
int Length; int Length;
} vpSequence_t; } vpSequence_t;
static vpSequence_t vpCurrentSequence = static vpSequence_t vpCurrentSequence = {.Pos = 0, .Length = 0};
{
.Pos = 0,
.Length = 0
};
uint32_t tableOfContents[VOICE_PROMPTS_TOC_SIZE]; uint32_t tableOfContents[VOICE_PROMPTS_TOC_SIZE];
const userDictEntry userDictionary[]= const userDictEntry userDictionary[] = {
{ {"hotspot", PROMPT_CUSTOM1}, // Hotspot
{"hotspot", PROMPT_CUSTOM1}, // Hotspot {"clearnode", PROMPT_CUSTOM2}, // ClearNode
{"clearnode", PROMPT_CUSTOM2}, // ClearNode {"sharinode", PROMPT_CUSTOM3}, // ShariNode
{"sharinode", PROMPT_CUSTOM3}, // ShariNode {"microhub", PROMPT_CUSTOM4}, // MicroHub
{"microhub", PROMPT_CUSTOM4}, // MicroHub {"openspot", PROMPT_CUSTOM5}, // Openspot
{"openspot", PROMPT_CUSTOM5}, // Openspot {"repeater", PROMPT_CUSTOM6}, // repeater
{"repeater", PROMPT_CUSTOM6}, // repeater {"blindhams", PROMPT_CUSTOM7}, // BlindHams
{"blindhams", PROMPT_CUSTOM7}, // BlindHams {"allstar", PROMPT_CUSTOM8}, // Allstar
{"allstar", PROMPT_CUSTOM8}, // Allstar {"parrot", PROMPT_CUSTOM9}, // Parrot
{"parrot", PROMPT_CUSTOM9}, // Parrot {"channel", PROMPT_CHANNEL}, {0, 0}};
{"channel",PROMPT_CHANNEL},
{0, 0}
};
void vpCacheInit(void) void vpCacheInit(void)
{ {
voicePromptsDataHeader_t header; voicePromptsDataHeader_t header;
// ToDo not sure where this is coming from yet. // ToDo not sure where this is coming from yet.
//SPI_Flash_read(VOICE_PROMPTS_FLASH_HEADER_ADDRESS,(uint8_t *)&header,sizeof(voicePromptsDataHeader_t)); // SPI_Flash_read(VOICE_PROMPTS_FLASH_HEADER_ADDRESS,(uint8_t
// *)&header,sizeof(voicePromptsDataHeader_t));
if (vpCheckHeader((uint32_t *)&header)) if (vpCheckHeader((uint32_t*)&header))
{// ToDo see above { // ToDo see above
vpDataIsLoaded = false; //SPI_Flash_read(VOICE_PROMPTS_FLASH_HEADER_ADDRESS + sizeof(voicePromptsDataHeader_t), (uint8_t *)&tableOfContents, sizeof(uint32_t) * VOICE_PROMPTS_TOC_SIZE); vpDataIsLoaded = false; // SPI_Flash_read(VOICE_PROMPTS_FLASH_HEADER_ADDRESS
vpFlashDataAddress = VOICE_PROMPTS_FLASH_HEADER_ADDRESS + sizeof(voicePromptsDataHeader_t) + sizeof(uint32_t)*VOICE_PROMPTS_TOC_SIZE ; // + sizeof(voicePromptsDataHeader_t), (uint8_t
} // *)&tableOfContents, sizeof(uint32_t) *
if (vpDataIsLoaded) // VOICE_PROMPTS_TOC_SIZE);
{// if the hash key is down, set vpLevel to high, if beep or less. vpFlashDataAddress = VOICE_PROMPTS_FLASH_HEADER_ADDRESS +
if ((kbd_getKeys() & KEY_HASH) && (state.settings.vpLevel <= vpBeep)) sizeof(voicePromptsDataHeader_t) +
state.settings.vpLevel = vpHigh; sizeof(uint32_t) * VOICE_PROMPTS_TOC_SIZE;
} }
else if (vpDataIsLoaded)
{ // ensure we at least have beeps in the event no voice prompts are loaded. { // if the hash key is down, set vpLevel to high, if beep or less.
if (state.settings.vpLevel > vpBeep) if ((kbd_getKeys() & KEY_HASH) && (state.settings.vpLevel <= vpBeep))
state.settings.vpLevel = vpBeep; state.settings.vpLevel = vpHigh;
} }
else
{ // ensure we at least have beeps in the event no voice prompts are
// loaded.
if (state.settings.vpLevel > vpBeep) state.settings.vpLevel = vpBeep;
}
} }
bool vpCheckHeader(uint32_t *bufferAddress) bool vpCheckHeader(uint32_t* bufferAddress)
{ {
voicePromptsDataHeader_t *header = (voicePromptsDataHeader_t *)bufferAddress; voicePromptsDataHeader_t* header = (voicePromptsDataHeader_t*)bufferAddress;
return ((header->magic == VOICE_PROMPTS_DATA_MAGIC) && (header->version == VOICE_PROMPTS_DATA_VERSION)); return ((header->magic == VOICE_PROMPTS_DATA_MAGIC) &&
(header->version == VOICE_PROMPTS_DATA_VERSION));
} }
static void GetCodec2Data(int offset,int length) static void GetCodec2Data(int offset, int length)
{ {
if ((offset >= 0) && (length <= Codec2DataBufferSize)) if ((offset >= 0) && (length <= Codec2DataBufferSize))
{// ToDo where are we reading this from? { // ToDo where are we reading this from?
// Just so we can build, // Just so we can build,
; ;
//SPI_Flash_read(vpFlashDataAddress + offset, (uint8_t *)&Codec2Data, length); // SPI_Flash_read(vpFlashDataAddress + offset, (uint8_t *)&Codec2Data,
} // length);
}
} }
void vpTick(void) void vpTick(void)
{ {
if (voicePromptIsActive) if (voicePromptIsActive)
{ {
if (promptDataPosition < currentPromptLength) if (promptDataPosition < currentPromptLength)
{// ToDo figure out buffering. { // ToDo figure out buffering.
//if (wavbuffer_count <= (WAV_BUFFER_COUNT / 2)) // if (wavbuffer_count <= (WAV_BUFFER_COUNT / 2))
{ {
// codecDecode((uint8_t *)&Codec2Data[promptDataPosition], 3); // codecDecode((uint8_t
promptDataPosition += 27; // *)&Codec2Data[promptDataPosition], 3);
} promptDataPosition += 27;
}
//soundTickRXBuffer(); // soundTickRXBuffer();
} }
else else
{ {
if ( vpCurrentSequence.Pos < (vpCurrentSequence.Length - 1)) if (vpCurrentSequence.Pos < (vpCurrentSequence.Length - 1))
{ {
vpCurrentSequence.Pos++; vpCurrentSequence.Pos++;
promptDataPosition = 0; promptDataPosition = 0;
int promptNumber = vpCurrentSequence.Buffer[vpCurrentSequence.Pos]; int promptNumber =
currentPromptLength = tableOfContents[promptNumber + 1] - tableOfContents[promptNumber]; vpCurrentSequence.Buffer[vpCurrentSequence.Pos];
GetCodec2Data(tableOfContents[promptNumber], currentPromptLength); currentPromptLength = tableOfContents[promptNumber + 1] -
} tableOfContents[promptNumber];
else GetCodec2Data(tableOfContents[promptNumber],
{ currentPromptLength);
// wait for wave buffer to empty when prompt has finished playing }
else
{
// wait for wave buffer to empty when prompt has finished
// playing
// if (wavbuffer_count == 0) // if (wavbuffer_count == 0)
{ {
vpTerminate(); vpTerminate();
} }
} }
} }
} }
else else
{ {
if (promptTail > 0) if (promptTail > 0)
{ {
promptTail--; promptTail--;
/*if ((promptTail == 0) && trxCarrierDetected() && (trxGetMode() == RADIO_MODE_ANALOG)) /*if ((promptTail == 0) && trxCarrierDetected() && (trxGetMode() ==
{// ToDo enable amp. RADIO_MODE_ANALOG))
//GPIO_PinWrite(GPIO_RX_audio_mux, Pin_RX_audio_mux, 1); // Set the audio path to AT1846 -> audio amp. {// ToDo enable amp.
}*/ //GPIO_PinWrite(GPIO_RX_audio_mux, Pin_RX_audio_mux, 1); // Set
} the audio path to AT1846 -> audio amp.
} }*/
}
}
} }
void vpTerminate(void) void vpTerminate(void)
{ {
if (voicePromptIsActive) if (voicePromptIsActive)
{ {
//disableAudioAmp(AUDIO_AMP_MODE_PROMPT); // disableAudioAmp(AUDIO_AMP_MODE_PROMPT);
vpCurrentSequence.Pos = 0; vpCurrentSequence.Pos = 0;
//soundTerminateSound(); // soundTerminateSound();
//soundInit(); // soundInit();
promptTail = PROMPT_TAIL; promptTail = PROMPT_TAIL;
voicePromptIsActive = false; voicePromptIsActive = false;
} }
} }
void vpInit(void) void vpInit(void)
{ {
if (voicePromptIsActive) if (voicePromptIsActive)
{ {
vpTerminate(); vpTerminate();
} }
vpCurrentSequence.Length = 0; vpCurrentSequence.Length = 0;
vpCurrentSequence.Pos = 0; vpCurrentSequence.Pos = 0;
} }
void vpQueuePrompt(uint16_t prompt) void vpQueuePrompt(uint16_t prompt)
{ {
if (state.settings.vpLevel < vpLow) if (state.settings.vpLevel < vpLow) return;
return;
if (voicePromptIsActive) if (voicePromptIsActive)
{ {
vpInit(); vpInit();
} }
if (vpCurrentSequence.Length < VOICE_PROMPTS_SEQUENCE_BUFFER_SIZE) if (vpCurrentSequence.Length < VOICE_PROMPTS_SEQUENCE_BUFFER_SIZE)
{ {
vpCurrentSequence.Buffer[vpCurrentSequence.Length] = prompt; vpCurrentSequence.Buffer[vpCurrentSequence.Length] = prompt;
vpCurrentSequence.Length++; vpCurrentSequence.Length++;
} }
} }
static uint16_t UserDictLookup(char* ptr, int* advanceBy) static uint16_t UserDictLookup(char* ptr, int* advanceBy)
{ {
if (!ptr || !*ptr) return 0; if (!ptr || !*ptr) return 0;
for (int index=0; userDictionary[index].userWord!=0; ++index) for (int index = 0; userDictionary[index].userWord != 0; ++index)
{ {
int len=strlen(userDictionary[index].userWord); int len = strlen(userDictionary[index].userWord);
if (strncasecmp(userDictionary[index].userWord, ptr, len)==0) if (strncasecmp(userDictionary[index].userWord, ptr, len) == 0)
{ {
*advanceBy=len; *advanceBy = len;
return userDictionary[index].vp; return userDictionary[index].vp;
} }
} }
return 0; return 0;
} }
static bool GetSymbolVPIfItShouldBeAnnounced(char symbol, static bool GetSymbolVPIfItShouldBeAnnounced(char symbol,
VoicePromptFlags_T flags, voicePrompt_t* vp) VoicePromptFlags_T flags,
voicePrompt_t* vp)
{ {
*vp=PROMPT_SILENCE; *vp = PROMPT_SILENCE;
const char indexedSymbols[] = "%.+-*#!,@:?()~/[]<>=$'`&|_^{}"; // Must match order of symbols in voicePrompt_t enum. const char indexedSymbols[] =
const char commonSymbols[] = "%.+-*#"; "%.+-*#!,@:?()~/[]<>=$'`&|_^{}"; // Must match order of symbols in
// voicePrompt_t enum.
const char commonSymbols[] = "%.+-*#";
bool announceCommonSymbols = (flags & vpAnnounceCommonSymbols) ? true : false; bool announceCommonSymbols =
bool announceLessCommonSymbols=(flags & vpAnnounceLessCommonSymbols) ? true : false; (flags & vpAnnounceCommonSymbols) ? true : false;
bool announceLessCommonSymbols =
(flags & vpAnnounceLessCommonSymbols) ? true : false;
char* symbolPtr = strchr(indexedSymbols, symbol); char* symbolPtr = strchr(indexedSymbols, symbol);
if (symbolPtr == NULL) if (symbolPtr == NULL)
{// we don't have a prompt for this character. { // we don't have a prompt for this character.
return (flags&vpAnnounceASCIIValueForUnknownChars) ? true : false; return (flags & vpAnnounceASCIIValueForUnknownChars) ? true : false;
} }
bool commonSymbol= strchr(commonSymbols, symbol) != NULL; bool commonSymbol = strchr(commonSymbols, symbol) != NULL;
*vp = PROMPT_PERCENT+(symbolPtr-indexedSymbols); *vp = PROMPT_PERCENT + (symbolPtr - indexedSymbols);
return ((commonSymbol && announceCommonSymbols) || (!commonSymbol && announceLessCommonSymbols)); return ((commonSymbol && announceCommonSymbols) ||
(!commonSymbol && announceLessCommonSymbols));
} }
// This function spells out a string letter by letter. // This function spells out a string letter by letter.
void vpQueueString(char *promptString, VoicePromptFlags_T flags) void vpQueueString(char* promptString, VoicePromptFlags_T flags)
{ {
if (state.settings.vpLevel < vpLow) if (state.settings.vpLevel < vpLow) return;
return;
if (voicePromptIsActive) if (voicePromptIsActive)
{ {
vpInit(); vpInit();
} }
if (state.settings.vpPhoneticSpell) if (state.settings.vpPhoneticSpell) flags |= vpAnnouncePhoneticRendering;
flags|=vpAnnouncePhoneticRendering; while (*promptString != 0)
while (*promptString != 0) {
{ int advanceBy = 0;
int advanceBy=0; voicePrompt_t vp = UserDictLookup(promptString, &advanceBy);
voicePrompt_t vp = UserDictLookup(promptString, &advanceBy); if (vp)
if (vp) {
{ vpQueuePrompt(vp);
vpQueuePrompt(vp); promptString += advanceBy;
promptString += advanceBy; continue;
continue; }
} else if ((*promptString >= '0') && (*promptString <= '9'))
else if ((*promptString >= '0') && (*promptString <= '9')) {
{ vpQueuePrompt(*promptString - '0' + PROMPT_0);
vpQueuePrompt(*promptString - '0' + PROMPT_0); }
} else if ((*promptString >= 'A') && (*promptString <= 'Z'))
else if ((*promptString >= 'A') && (*promptString <= 'Z')) {
{ if (flags & vpAnnounceCaps) vpQueuePrompt(PROMPT_CAP);
if (flags&vpAnnounceCaps) if (flags & vpAnnouncePhoneticRendering)
vpQueuePrompt(PROMPT_CAP); vpQueuePrompt((*promptString - 'A') + PROMPT_A_PHONETIC);
if (flags&vpAnnouncePhoneticRendering) else
vpQueuePrompt((*promptString - 'A') + PROMPT_A_PHONETIC); vpQueuePrompt(*promptString - 'A' + PROMPT_A);
else }
vpQueuePrompt(*promptString - 'A' + PROMPT_A); else if ((*promptString >= 'a') && (*promptString <= 'z'))
} {
else if ((*promptString >= 'a') && (*promptString <= 'z')) if (flags & vpAnnouncePhoneticRendering)
{ vpQueuePrompt((*promptString - 'a') + PROMPT_A_PHONETIC);
if (flags&vpAnnouncePhoneticRendering) else
vpQueuePrompt((*promptString - 'a') + PROMPT_A_PHONETIC); vpQueuePrompt(*promptString - 'a' + PROMPT_A);
else }
vpQueuePrompt(*promptString - 'a' + PROMPT_A); else if ((*promptString == ' ') && (flags & vpAnnounceSpace))
} {
else if ((*promptString==' ') && (flags&vpAnnounceSpace)) vpQueuePrompt(PROMPT_SPACE);
{ }
vpQueuePrompt(PROMPT_SPACE); else if (GetSymbolVPIfItShouldBeAnnounced(*promptString, flags, &vp))
} {
else if (GetSymbolVPIfItShouldBeAnnounced(*promptString, flags, &vp)) if (vp != PROMPT_SILENCE)
{ vpQueuePrompt(vp);
if (vp != PROMPT_SILENCE) else // announce ASCII
vpQueuePrompt(vp); {
else // announce ASCII int32_t val = *promptString;
{ vpQueuePrompt(PROMPT_CHARACTER); // just the word "code" as we
int32_t val = *promptString; // don't have character.
vpQueuePrompt(PROMPT_CHARACTER); // just the word "code" as we don't have character. vpQueueInteger(val);
vpQueueInteger(val); }
} }
} else
else {
{ // otherwise just add silence
// otherwise just add silence vpQueuePrompt(PROMPT_SILENCE);
vpQueuePrompt(PROMPT_SILENCE); }
}
promptString++;
}
if (flags & vpqAddSeparatingSilence)
vpQueuePrompt(PROMPT_SILENCE);
promptString++;
}
if (flags & vpqAddSeparatingSilence) vpQueuePrompt(PROMPT_SILENCE);
} }
void vpQueueInteger(int32_t value) void vpQueueInteger(int32_t value)
{ {
if (state.settings.vpLevel < vpLow) if (state.settings.vpLevel < vpLow) return;
return;
char buf[12] = {0}; // min: -2147483648, max: 2147483647 char buf[12] = {0}; // min: -2147483648, max: 2147483647
snprintf(buf, 12, "%d", value); snprintf(buf, 12, "%d", value);
vpQueueString(buf, 0); vpQueueString(buf, 0);
} }
// This function looks up a voice prompt corresponding to a string table entry. // This function looks up a voice prompt corresponding to a string table entry.
// These are stored in the voice data after the voice prompts with no // These are stored in the voice data after the voice prompts with no
// corresponding string table entry, hence the offset calculation: // corresponding string table entry, hence the offset calculation:
// NUM_VOICE_PROMPTS + (stringTableStringPtr - currentLanguage->languageName) // NUM_VOICE_PROMPTS + (stringTableStringPtr - currentLanguage->languageName)
void vpQueueStringTableEntry(const char * const *stringTableStringPtr) void vpQueueStringTableEntry(const char* const* stringTableStringPtr)
{ {
if (state.settings.vpLevel < vpLow) if (state.settings.vpLevel < vpLow) return;
return;
if (stringTableStringPtr == NULL) if (stringTableStringPtr == NULL)
{ {
return; return;
} }
vpQueuePrompt(NUM_VOICE_PROMPTS + (stringTableStringPtr - &currentLanguage->languageName)); vpQueuePrompt(NUM_VOICE_PROMPTS +
(stringTableStringPtr - &currentLanguage->languageName));
} }
void vpPlay(void) void vpPlay(void)
{ {
if (state.settings.vpLevel < vpLow) if (state.settings.vpLevel < vpLow) return;
return;
if ((voicePromptIsActive == false) && (vpCurrentSequence.Length > 0)) if ((voicePromptIsActive == false) && (vpCurrentSequence.Length > 0))
{ {
voicePromptIsActive = true;// Start the playback voicePromptIsActive = true; // Start the playback
int promptNumber = vpCurrentSequence.Buffer[0]; int promptNumber = vpCurrentSequence.Buffer[0];
vpCurrentSequence.Pos = 0; vpCurrentSequence.Pos = 0;
currentPromptLength = tableOfContents[promptNumber + 1] - tableOfContents[promptNumber]; currentPromptLength =
GetCodec2Data(tableOfContents[promptNumber], currentPromptLength); tableOfContents[promptNumber + 1] - tableOfContents[promptNumber];
GetCodec2Data(tableOfContents[promptNumber], currentPromptLength);
// GPIO_PinWrite(GPIO_RX_audio_mux, Pin_RX_audio_mux, 0);// set the audio mux HR-C6000 -> audio amp // GPIO_PinWrite(GPIO_RX_audio_mux, Pin_RX_audio_mux, 0);// set
//enableAudioAmp(AUDIO_AMP_MODE_PROMPT); // the audio mux HR-C6000 -> audio amp
// enableAudioAmp(AUDIO_AMP_MODE_PROMPT);
//codecInit(true); // codecInit(true);
promptDataPosition = 0; promptDataPosition = 0;
}
}
} }
inline bool vpIsPlaying(void) inline bool vpIsPlaying(void)
{ {
return (voicePromptIsActive || (promptTail > 0)); return (voicePromptIsActive || (promptTail > 0));
} }
bool vpHasDataToPlay(void) bool vpHasDataToPlay(void)
{ {
return (vpCurrentSequence.Length > 0); return (vpCurrentSequence.Length > 0);
} }

View File

@ -18,18 +18,20 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> * * along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/ ***************************************************************************/
/* /*
This string table's order must not be altered as voice prompts will be indexed in the same order as these strings. This string table's order must not be altered as voice prompts will be indexed
in the same order as these strings.
*/ */
#include <string.h>
#include "ui/UIStrings.h" #include "ui/UIStrings.h"
#include "ui/EnglishStrings.h"
#include <stdint.h>
// add more languages here. #include <stdint.h>
const stringsTable_t languages[NUM_LANGUAGES]={ englishStrings }; #include <string.h>
// default to English.
const stringsTable_t* currentLanguage=&languages[0];
#include "ui/EnglishStrings.h"
// add more languages here.
const stringsTable_t languages[NUM_LANGUAGES] = {englishStrings};
// default to English.
const stringsTable_t* currentLanguage = &languages[0];
/* /*
Given an english string such as a menu item or value, Given an english string such as a menu item or value,
@ -37,22 +39,21 @@ search the english string table and return the offset if found.
This can then be used to look up the localized string in the currentLanguages This can then be used to look up the localized string in the currentLanguages
struct, or to announce an indexed voice prompt. struct, or to announce an indexed voice prompt.
*/ */
int GetEnglishStringTableOffset( char* text) int GetEnglishStringTableOffset(char* text)
{ {
if (!text || !*text) if (!text || !*text) return -1; // error.
return -1; // error.
uint8_t stringCount =sizeof(stringsTable_t)/sizeof(char*); uint8_t stringCount = sizeof(stringsTable_t) / sizeof(char*);
for (uint8_t i = 0; i < stringCount; ++i) for (uint8_t i = 0; i < stringCount; ++i)
{ {
const char* strPtr = ((const char **)&englishStrings)[i]; const char* strPtr = ((const char **)&englishStrings)[i];
if (strcmp(text, strPtr) == 0) if (strcmp(text, strPtr) == 0)
{ {
return (i * sizeof(char *)); return (i * sizeof(char *));
} }
} }
return -1; return -1;
} }