Apply clang-format
This commit is contained in:
parent
29de1d36d4
commit
1f71789a9d
|
|
@ -16,14 +16,14 @@
|
|||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/> *
|
||||
***************************************************************************/
|
||||
// This file contains functions for announcing radio operations using the
|
||||
// building blocks in voicePrompts.h/c.
|
||||
#ifndef VOICE_PROMPT_UTILS_H_INCLUDED
|
||||
#define VOICE_PROMPT_UTILS_H_INCLUDED
|
||||
// This file contains functions for announcing radio operations using the
|
||||
// building blocks in voicePrompts.h/c.
|
||||
#ifndef VOICE_PROMPT_UTILS_H_INCLUDED
|
||||
#define VOICE_PROMPT_UTILS_H_INCLUDED
|
||||
|
||||
#include "voicePrompts.h"
|
||||
#include "ui/UIStrings.h"
|
||||
#include "cps.h"
|
||||
#include "ui/UIStrings.h"
|
||||
#include "voicePrompts.h"
|
||||
|
||||
/*
|
||||
Please Note!
|
||||
|
|
@ -38,12 +38,14 @@ should be used to ensure that the message interupts the current prompt and
|
|||
plays immediately.
|
||||
*/
|
||||
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 announceFrequencies(freq_t rx, freq_t tx, VoicePromptQueueFlags_T flags);
|
||||
void announceRadioMode(uint8_t mode, 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 announceInputReceiveOrTransmit(bool tx, VoicePromptQueueFlags_T flags);
|
||||
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
|
||||
character by character.
|
||||
*/
|
||||
void announceText( char* text, VoicePromptQueueFlags_T flags);
|
||||
void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8_t txTone, 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 anouncePower(float power, VoicePromptQueueFlags_T flags);
|
||||
void announceBrightness(uint8_t brightness, VoicePromptQueueFlags_T flags);
|
||||
void announceSquelch(uint8_t squelch, VoicePromptQueueFlags_T flags);
|
||||
void announceContact(contact_t* contact, VoicePromptQueueFlags_T flags);
|
||||
void announceContactWithIndex(uint16_t index, 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 announceM17Info(channel_t* channel, VoicePromptQueueFlags_T flags);
|
||||
#ifdef GPS_PRESENT
|
||||
|
|
@ -76,4 +80,4 @@ void announceSettingsTimeDate();
|
|||
#endif // RTC_PRESENT
|
||||
VoicePromptQueueFlags_T GetQueueFlagsForVoiceLevel();
|
||||
|
||||
#endif //VOICE_PROMPT_UTILS_H_INCLUDED
|
||||
#endif // VOICE_PROMPT_UTILS_H_INCLUDED
|
||||
|
|
|
|||
|
|
@ -34,154 +34,156 @@ wordlist.csv file in the voicePrompts generator project.
|
|||
*/
|
||||
typedef enum
|
||||
{
|
||||
PROMPT_SILENCE, //
|
||||
PROMPT_0, // 0
|
||||
PROMPT_1, // 1
|
||||
PROMPT_2, // 2
|
||||
PROMPT_3, // 3
|
||||
PROMPT_4, // 4
|
||||
PROMPT_5, // 5
|
||||
PROMPT_6, // 6
|
||||
PROMPT_7, // 7
|
||||
PROMPT_8, // 8
|
||||
PROMPT_9, // 9
|
||||
PROMPT_A, // A
|
||||
PROMPT_B, // B
|
||||
PROMPT_C, // C
|
||||
PROMPT_D, // D
|
||||
PROMPT_E, // E
|
||||
PROMPT_F, // F
|
||||
PROMPT_G, // G
|
||||
PROMPT_H, // H
|
||||
PROMPT_I, // I
|
||||
PROMPT_J, // J
|
||||
PROMPT_K, // K
|
||||
PROMPT_L, // L
|
||||
PROMPT_M, // M
|
||||
PROMPT_N, // N
|
||||
PROMPT_O, // O
|
||||
PROMPT_P, // P
|
||||
PROMPT_Q, // Q
|
||||
PROMPT_R, // R
|
||||
PROMPT_S, // S
|
||||
PROMPT_T, // T
|
||||
PROMPT_U, // U
|
||||
PROMPT_V, // V
|
||||
PROMPT_W, // W
|
||||
PROMPT_X, // X
|
||||
PROMPT_Y, // Y
|
||||
PROMPT_Z, // Zed
|
||||
PROMPT_A_PHONETIC, // alpha
|
||||
PROMPT_B_PHONETIC, // bravo
|
||||
PROMPT_C_PHONETIC, // charlie
|
||||
PROMPT_D_PHONETIC, // delta
|
||||
PROMPT_E_PHONETIC, // echo
|
||||
PROMPT_F_PHONETIC, // foxtrot
|
||||
PROMPT_G_PHONETIC, // golf
|
||||
PROMPT_H_PHONETIC, // hotel
|
||||
PROMPT_I_PHONETIC, // india
|
||||
PROMPT_J_PHONETIC, // juliet
|
||||
PROMPT_K_PHONETIC, // kilo
|
||||
PROMPT_L_PHONETIC, // lema
|
||||
PROMPT_M_PHONETIC, // mike
|
||||
PROMPT_N_PHONETIC, // november
|
||||
PROMPT_O_PHONETIC, // oscar
|
||||
PROMPT_P_PHONETIC, // papa
|
||||
PROMPT_Q_PHONETIC, // quebec
|
||||
PROMPT_R_PHONETIC, // romeo
|
||||
PROMPT_S_PHONETIC, // siera
|
||||
PROMPT_T_PHONETIC, // tango
|
||||
PROMPT_U_PHONETIC, // uniform
|
||||
PROMPT_V_PHONETIC, // victor
|
||||
PROMPT_W_PHONETIC, // whisky
|
||||
PROMPT_X_PHONETIC, // exray
|
||||
PROMPT_Y_PHONETIC, // yankie
|
||||
PROMPT_Z_PHONETIC, // zulu
|
||||
PROMPT_CAP, // cap
|
||||
PROMPT_HERTZ, // hertz
|
||||
PROMPT_KILOHERTZ, // Kilohertz
|
||||
PROMPT_MEGAHERTZ, // Megahertz
|
||||
PROMPT_CHANNEL,
|
||||
PROMPT_VFO, // V F O
|
||||
PROMPT_MILLISECONDS, // Milliseconds
|
||||
PROMPT_SECONDS, // Seconds
|
||||
PROMPT_MINUTES, // Minutes
|
||||
PROMPT_VOLTS, // Volts
|
||||
PROMPT_MILLIWATTS, // Milliwatts
|
||||
PROMPT_WATT, // Wattt
|
||||
PROMPT_WATTS, // Watts
|
||||
PROMPT_RECEIVE, // Receive
|
||||
PROMPT_TRANSMIT, // Transmit
|
||||
PROMPT_MODE, // Mode
|
||||
PROMPT_BANDWIDTH, // bandwidth
|
||||
PROMPT_POWER, // power
|
||||
PROMPT_SQUELCH, // squelch
|
||||
PROMPT_SOURCE_ID, // Source ID
|
||||
PROMPT_DEST_ID, // Destination ID
|
||||
PROMPT_DMR_ID, // DMR ID
|
||||
PROMPT_TALKGROUP, // Talk group
|
||||
PROMPT_TIMESLOT, // timeslot
|
||||
PROMPT_COLORCODE, // color code
|
||||
PROMPT_TONE, // tone
|
||||
PROMPT_CONTACT, // contact
|
||||
PROMPT_NORTH, // north
|
||||
PROMPT_SOUTH, // south
|
||||
PROMPT_EAST, // east
|
||||
PROMPT_WEST, // west
|
||||
PROMPT_LATITUDE, // latitude
|
||||
PROMPT_LONGITUDE, // longitude
|
||||
PROMPT_SPEED, // speed
|
||||
PROMPT_ALTITUDE, // altitude
|
||||
PROMPT_SATELLITES, // satellites
|
||||
PROMPT_COMPASS, // compass
|
||||
PROMPT_DEGREES, // degrees
|
||||
PROMPT_VP_UNAVAILABLE, // Voice prompts will be unavailable during this operation.
|
||||
PROMPT_CHARACTER, // character
|
||||
PROMPT_SPACE, // space
|
||||
PROMPT_PERCENT, // Percent
|
||||
PROMPT_POINT, // POINT
|
||||
PROMPT_PLUS, // Plus
|
||||
PROMPT_MINUS, // Minus
|
||||
PROMPT_STAR, // Star
|
||||
PROMPT_HASH, // Hash
|
||||
PROMPT_EXCLAIM, // exclaim
|
||||
PROMPT_COMMA, // comma
|
||||
PROMPT_AT, // at
|
||||
PROMPT_COLON, // colon
|
||||
PROMPT_QUESTION, // question
|
||||
PROMPT_LEFT_PAREN, // left paren
|
||||
PROMPT_RIGHT_PAREN, // right paren
|
||||
PROMPT_TILDE, // tilde
|
||||
PROMPT_SLASH, // slash
|
||||
PROMPT_LEFT_BRACKET, // left bracket
|
||||
PROMPT_RIGHT_BRACKET, // right bracket
|
||||
PROMPT_LESS, // less
|
||||
PROMPT_GREATER, // greater
|
||||
PROMPT_EQUALS, // equals
|
||||
PROMPT_DOLLAR, // dollar
|
||||
PROMPT_APOSTROPHE, // apostrophe
|
||||
PROMPT_GRAVE, // grave
|
||||
PROMPT_AMPERSAND, // and
|
||||
PROMPT_BAR, // bar
|
||||
PROMPT_UNDERLINE, // underline
|
||||
PROMPT_CARET, // caret
|
||||
PROMPT_LEFT_BRACE, // left brace
|
||||
PROMPT_CUSTOM1, // Hotspot
|
||||
PROMPT_CUSTOM2, // ClearNode
|
||||
PROMPT_CUSTOM3, // ShariNode
|
||||
PROMPT_CUSTOM4, // MicroHub
|
||||
PROMPT_CUSTOM5, // Openspot
|
||||
PROMPT_CUSTOM6, // repeater
|
||||
PROMPT_CUSTOM7, // BlindHams
|
||||
PROMPT_CUSTOM8, // Allstar
|
||||
PROMPT_CUSTOM9, // parrot
|
||||
PROMPT_CUSTOM10, // unused
|
||||
NUM_VOICE_PROMPTS,
|
||||
PROMPT_SILENCE, //
|
||||
PROMPT_0, // 0
|
||||
PROMPT_1, // 1
|
||||
PROMPT_2, // 2
|
||||
PROMPT_3, // 3
|
||||
PROMPT_4, // 4
|
||||
PROMPT_5, // 5
|
||||
PROMPT_6, // 6
|
||||
PROMPT_7, // 7
|
||||
PROMPT_8, // 8
|
||||
PROMPT_9, // 9
|
||||
PROMPT_A, // A
|
||||
PROMPT_B, // B
|
||||
PROMPT_C, // C
|
||||
PROMPT_D, // D
|
||||
PROMPT_E, // E
|
||||
PROMPT_F, // F
|
||||
PROMPT_G, // G
|
||||
PROMPT_H, // H
|
||||
PROMPT_I, // I
|
||||
PROMPT_J, // J
|
||||
PROMPT_K, // K
|
||||
PROMPT_L, // L
|
||||
PROMPT_M, // M
|
||||
PROMPT_N, // N
|
||||
PROMPT_O, // O
|
||||
PROMPT_P, // P
|
||||
PROMPT_Q, // Q
|
||||
PROMPT_R, // R
|
||||
PROMPT_S, // S
|
||||
PROMPT_T, // T
|
||||
PROMPT_U, // U
|
||||
PROMPT_V, // V
|
||||
PROMPT_W, // W
|
||||
PROMPT_X, // X
|
||||
PROMPT_Y, // Y
|
||||
PROMPT_Z, // Zed
|
||||
PROMPT_A_PHONETIC, // alpha
|
||||
PROMPT_B_PHONETIC, // bravo
|
||||
PROMPT_C_PHONETIC, // charlie
|
||||
PROMPT_D_PHONETIC, // delta
|
||||
PROMPT_E_PHONETIC, // echo
|
||||
PROMPT_F_PHONETIC, // foxtrot
|
||||
PROMPT_G_PHONETIC, // golf
|
||||
PROMPT_H_PHONETIC, // hotel
|
||||
PROMPT_I_PHONETIC, // india
|
||||
PROMPT_J_PHONETIC, // juliet
|
||||
PROMPT_K_PHONETIC, // kilo
|
||||
PROMPT_L_PHONETIC, // lema
|
||||
PROMPT_M_PHONETIC, // mike
|
||||
PROMPT_N_PHONETIC, // november
|
||||
PROMPT_O_PHONETIC, // oscar
|
||||
PROMPT_P_PHONETIC, // papa
|
||||
PROMPT_Q_PHONETIC, // quebec
|
||||
PROMPT_R_PHONETIC, // romeo
|
||||
PROMPT_S_PHONETIC, // siera
|
||||
PROMPT_T_PHONETIC, // tango
|
||||
PROMPT_U_PHONETIC, // uniform
|
||||
PROMPT_V_PHONETIC, // victor
|
||||
PROMPT_W_PHONETIC, // whisky
|
||||
PROMPT_X_PHONETIC, // exray
|
||||
PROMPT_Y_PHONETIC, // yankie
|
||||
PROMPT_Z_PHONETIC, // zulu
|
||||
PROMPT_CAP, // cap
|
||||
PROMPT_HERTZ, // hertz
|
||||
PROMPT_KILOHERTZ, // Kilohertz
|
||||
PROMPT_MEGAHERTZ, // Megahertz
|
||||
PROMPT_CHANNEL,
|
||||
PROMPT_VFO, // V F O
|
||||
PROMPT_MILLISECONDS, // Milliseconds
|
||||
PROMPT_SECONDS, // Seconds
|
||||
PROMPT_MINUTES, // Minutes
|
||||
PROMPT_VOLTS, // Volts
|
||||
PROMPT_MILLIWATTS, // Milliwatts
|
||||
PROMPT_WATT, // Wattt
|
||||
PROMPT_WATTS, // Watts
|
||||
PROMPT_RECEIVE, // Receive
|
||||
PROMPT_TRANSMIT, // Transmit
|
||||
PROMPT_MODE, // Mode
|
||||
PROMPT_BANDWIDTH, // bandwidth
|
||||
PROMPT_POWER, // power
|
||||
PROMPT_SQUELCH, // squelch
|
||||
PROMPT_SOURCE_ID, // Source ID
|
||||
PROMPT_DEST_ID, // Destination ID
|
||||
PROMPT_DMR_ID, // DMR ID
|
||||
PROMPT_TALKGROUP, // Talk group
|
||||
PROMPT_TIMESLOT, // timeslot
|
||||
PROMPT_COLORCODE, // color code
|
||||
PROMPT_TONE, // tone
|
||||
PROMPT_CONTACT, // contact
|
||||
PROMPT_NORTH, // north
|
||||
PROMPT_SOUTH, // south
|
||||
PROMPT_EAST, // east
|
||||
PROMPT_WEST, // west
|
||||
PROMPT_LATITUDE, // latitude
|
||||
PROMPT_LONGITUDE, // longitude
|
||||
PROMPT_SPEED, // speed
|
||||
PROMPT_ALTITUDE, // altitude
|
||||
PROMPT_SATELLITES, // satellites
|
||||
PROMPT_COMPASS, // compass
|
||||
PROMPT_DEGREES, // degrees
|
||||
PROMPT_VP_UNAVAILABLE, // Voice prompts will be unavailable during this
|
||||
// operation.
|
||||
PROMPT_CHARACTER, // character
|
||||
PROMPT_SPACE, // space
|
||||
PROMPT_PERCENT, // Percent
|
||||
PROMPT_POINT, // POINT
|
||||
PROMPT_PLUS, // Plus
|
||||
PROMPT_MINUS, // Minus
|
||||
PROMPT_STAR, // Star
|
||||
PROMPT_HASH, // Hash
|
||||
PROMPT_EXCLAIM, // exclaim
|
||||
PROMPT_COMMA, // comma
|
||||
PROMPT_AT, // at
|
||||
PROMPT_COLON, // colon
|
||||
PROMPT_QUESTION, // question
|
||||
PROMPT_LEFT_PAREN, // left paren
|
||||
PROMPT_RIGHT_PAREN, // right paren
|
||||
PROMPT_TILDE, // tilde
|
||||
PROMPT_SLASH, // slash
|
||||
PROMPT_LEFT_BRACKET, // left bracket
|
||||
PROMPT_RIGHT_BRACKET, // right bracket
|
||||
PROMPT_LESS, // less
|
||||
PROMPT_GREATER, // greater
|
||||
PROMPT_EQUALS, // equals
|
||||
PROMPT_DOLLAR, // dollar
|
||||
PROMPT_APOSTROPHE, // apostrophe
|
||||
PROMPT_GRAVE, // grave
|
||||
PROMPT_AMPERSAND, // and
|
||||
PROMPT_BAR, // bar
|
||||
PROMPT_UNDERLINE, // underline
|
||||
PROMPT_CARET, // caret
|
||||
PROMPT_LEFT_BRACE, // left brace
|
||||
PROMPT_CUSTOM1, // Hotspot
|
||||
PROMPT_CUSTOM2, // ClearNode
|
||||
PROMPT_CUSTOM3, // ShariNode
|
||||
PROMPT_CUSTOM4, // MicroHub
|
||||
PROMPT_CUSTOM5, // Openspot
|
||||
PROMPT_CUSTOM6, // repeater
|
||||
PROMPT_CUSTOM7, // BlindHams
|
||||
PROMPT_CUSTOM8, // Allstar
|
||||
PROMPT_CUSTOM9, // parrot
|
||||
PROMPT_CUSTOM10, // unused
|
||||
NUM_VOICE_PROMPTS,
|
||||
} voicePrompt_t;
|
||||
|
||||
// PROMPT_VOICE_NAME is always the very last prompt after the indexed prompts
|
||||
// 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.
|
||||
For example, when editing, it is desireable to hear spaces, capitals and
|
||||
|
|
@ -191,13 +193,13 @@ announced.
|
|||
*/
|
||||
typedef enum
|
||||
{
|
||||
vpAnnounceCaps=0x01,
|
||||
vpAnnounceCustomPrompts=0x02,
|
||||
vpAnnounceSpace=0x04,
|
||||
vpAnnounceCommonSymbols=0x08,
|
||||
vpAnnounceLessCommonSymbols=0x10,
|
||||
vpAnnounceASCIIValueForUnknownChars=0x20,
|
||||
vpAnnouncePhoneticRendering=0x40,
|
||||
vpAnnounceCaps = 0x01,
|
||||
vpAnnounceCustomPrompts = 0x02,
|
||||
vpAnnounceSpace = 0x04,
|
||||
vpAnnounceCommonSymbols = 0x08,
|
||||
vpAnnounceLessCommonSymbols = 0x10,
|
||||
vpAnnounceASCIIValueForUnknownChars = 0x20,
|
||||
vpAnnouncePhoneticRendering = 0x40,
|
||||
} VoicePromptFlags_T;
|
||||
/*
|
||||
These queuing flags determine if speech is interrupted, played
|
||||
|
|
@ -215,16 +217,16 @@ prompt.
|
|||
typedef enum
|
||||
{
|
||||
vpqDefault = 0,
|
||||
vpqInit=0x01, // stop any voice prompts already in progress.
|
||||
vpqPlayImmediately=0x02, // call play after queue at all levels.
|
||||
vpqPlayImmediatelyAtMediumOrHigher =0x04,
|
||||
vpqIncludeDescriptions=0x08,
|
||||
vpqAddSeparatingSilence=0x10
|
||||
vpqInit = 0x01, // stop any voice prompts already in progress.
|
||||
vpqPlayImmediately = 0x02, // call play after queue at all levels.
|
||||
vpqPlayImmediatelyAtMediumOrHigher = 0x04,
|
||||
vpqIncludeDescriptions = 0x08,
|
||||
vpqAddSeparatingSilence = 0x10
|
||||
} VoicePromptQueueFlags_T;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
vpNone=0,
|
||||
vpNone = 0,
|
||||
vpBeep,
|
||||
vpLow,
|
||||
vpMedium,
|
||||
|
|
@ -251,20 +253,20 @@ void vpInit(void);
|
|||
void vpQueuePrompt(uint16_t prompt);
|
||||
// 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
|
||||
//prompt.
|
||||
void vpQueueString(char *promptString, VoicePromptFlags_T flags);
|
||||
// This function appends a signed integer to the queue.
|
||||
// prompt.
|
||||
void vpQueueString(char* promptString, VoicePromptFlags_T flags);
|
||||
// This function appends a signed integer to the queue.
|
||||
void vpQueueInteger(int32_t value);
|
||||
// This function appends a text string from the current language to the queue.
|
||||
// e.g. currentLanguage->off
|
||||
// These are recorded prompts which correspond to the strings in the strings
|
||||
// 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);
|
||||
bool vpHasDataToPlay(void);
|
||||
void vpTerminate(void);
|
||||
bool vpCheckHeader(uint32_t *bufferAddress);
|
||||
bool vpCheckHeader(uint32_t* bufferAddress);
|
||||
|
||||
#endif
|
||||
|
|
@ -20,8 +20,8 @@
|
|||
#ifndef EnglishStrings_h_included
|
||||
#define EnglishStrings_h_included
|
||||
#include "ui/UIStrings.h"
|
||||
const stringsTable_t englishStrings =
|
||||
{
|
||||
|
||||
const stringsTable_t englishStrings = {
|
||||
.languageName = "English",
|
||||
.off = "OFF",
|
||||
.on = "ON",
|
||||
|
|
@ -65,7 +65,7 @@ const stringsTable_t englishStrings =
|
|||
.Fred = "Fred IU2NRO",
|
||||
.Joseph = "Joseph VK7JS",
|
||||
.allChannels = "All channels",
|
||||
.menu= "Menu",
|
||||
.menu = "Menu",
|
||||
.gpsOff = "GPS OFF",
|
||||
.noFix = "No Fix",
|
||||
.fixLost = "Fix Lost",
|
||||
|
|
@ -87,4 +87,4 @@ const stringsTable_t englishStrings =
|
|||
.forEmergencyUse = "For emergency use",
|
||||
.pressAnyButton = "press any button.",
|
||||
};
|
||||
#endif //EnglishStrings_h_included
|
||||
#endif // EnglishStrings_h_included
|
||||
|
|
|
|||
|
|
@ -18,8 +18,9 @@
|
|||
* 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.
|
||||
Also, menus may be printed using string table offsets.
|
||||
This string table's order must not be altered as voice prompts will be indexed
|
||||
in the same order as these strings. Also, menus may be printed using string
|
||||
table offsets.
|
||||
*/
|
||||
#ifndef UIStrings_h_included
|
||||
#define UIStrings_h_included
|
||||
|
|
@ -96,6 +97,6 @@ typedef struct
|
|||
extern const stringsTable_t languages[];
|
||||
extern const stringsTable_t* currentLanguage;
|
||||
|
||||
int GetEnglishStringTableOffset( char* text);
|
||||
int GetEnglishStringTableOffset(char* text);
|
||||
|
||||
#endif
|
||||
|
|
@ -16,43 +16,48 @@
|
|||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/> *
|
||||
***************************************************************************/
|
||||
// This file contains functions for announcing radio functions using the building blocks in voicePrompts.h/c.
|
||||
|
||||
/**
|
||||
* This file contains functions for announcing radio functions using the
|
||||
* building blocks in voicePrompts.h/c.
|
||||
*/
|
||||
|
||||
#include "core/voicePromptUtils.h"
|
||||
|
||||
#include <state.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <state.h>
|
||||
|
||||
#include "interfaces/cps_io.h"
|
||||
#include "core/voicePromptUtils.h"
|
||||
|
||||
static void vpInitIfNeeded(VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
if (flags & vpqInit)
|
||||
vpInit();
|
||||
if (flags & vpqInit) vpInit();
|
||||
}
|
||||
|
||||
static void vpPlayIfNeeded(VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
uint8_t vpLevel = state.settings.vpLevel;
|
||||
|
||||
if ((flags & vpqPlayImmediately)
|
||||
|| ((flags & vpqPlayImmediatelyAtMediumOrHigher) && (vpLevel >= vpMedium)))
|
||||
if ((flags & vpqPlayImmediately) ||
|
||||
((flags & vpqPlayImmediatelyAtMediumOrHigher) && (vpLevel >= vpMedium)))
|
||||
vpPlay();
|
||||
}
|
||||
|
||||
static void addSilenceIfNeeded(VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
if ((flags & vpqAddSeparatingSilence) == 0)
|
||||
return;
|
||||
if ((flags & vpqAddSeparatingSilence) == 0) return;
|
||||
|
||||
vpQueuePrompt(PROMPT_SILENCE);
|
||||
vpQueuePrompt(PROMPT_SILENCE);
|
||||
}
|
||||
|
||||
static void removeUnnecessaryZerosFromVoicePrompts(char *str)
|
||||
static void removeUnnecessaryZerosFromVoicePrompts(char* str)
|
||||
{
|
||||
const int NUM_DECIMAL_PLACES = 1;
|
||||
int len = strlen(str);
|
||||
for(int i = len; i > 2; i--)
|
||||
for (int i = len; i > 2; i--)
|
||||
{
|
||||
if ((str[i - 1] != '0') || (str[i - (NUM_DECIMAL_PLACES + 1)] == '.'))
|
||||
{
|
||||
|
|
@ -72,7 +77,7 @@ void announceVFO()
|
|||
}
|
||||
|
||||
void announceChannelName(channel_t* channel, uint16_t channelIndex,
|
||||
VoicePromptQueueFlags_T flags)
|
||||
VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
|
|
@ -84,7 +89,7 @@ VoicePromptQueueFlags_T flags)
|
|||
|
||||
// Only queue the name if it is not the same as the raw number.
|
||||
// Otherwise the radio will say channel 1 1 for channel 1.
|
||||
char numAsStr[16]="\0";
|
||||
char numAsStr[16] = "\0";
|
||||
snprintf(numAsStr, 16, "%d", channelIndex);
|
||||
if (strcmp(numAsStr, channel->name) != 0)
|
||||
vpQueueString(channel->name, vpAnnounceCommonSymbols);
|
||||
|
|
@ -96,7 +101,7 @@ void vpQueueFrequency(freq_t freq)
|
|||
{
|
||||
char buffer[16];
|
||||
int mhz = (freq / 1000000);
|
||||
int khz = ((freq%1000000) / 10);
|
||||
int khz = ((freq % 1000000) / 10);
|
||||
|
||||
snprintf(buffer, 16, "%d.%05d", mhz, khz);
|
||||
removeUnnecessaryZerosFromVoicePrompts(buffer);
|
||||
|
|
@ -109,8 +114,7 @@ void vpQueueFrequency(freq_t freq)
|
|||
void announceFrequencies(freq_t rx, freq_t tx, VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
vpInitIfNeeded(flags);
|
||||
// if rx and tx frequencies differ, announce both, otherwise just announce
|
||||
// one.
|
||||
// If rx and tx frequencies differ, announce both, otherwise just one
|
||||
if (rx == tx)
|
||||
vpQueueFrequency(rx);
|
||||
else
|
||||
|
|
@ -127,10 +131,9 @@ void announceRadioMode(uint8_t mode, VoicePromptQueueFlags_T flags)
|
|||
{
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_MODE);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_MODE);
|
||||
|
||||
switch(mode)
|
||||
switch (mode)
|
||||
{
|
||||
case OPMODE_DMR:
|
||||
vpQueueStringTableEntry(¤tLanguage->dmr);
|
||||
|
|
@ -148,15 +151,13 @@ void announceRadioMode(uint8_t mode, VoicePromptQueueFlags_T flags)
|
|||
|
||||
void announceBandwidth(uint8_t bandwidth, VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
if (bandwidth > BW_25)
|
||||
bandwidth = BW_25; // should probably never happen!
|
||||
if (bandwidth > BW_25) bandwidth = BW_25; // Should probably never happen!
|
||||
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_BANDWIDTH);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_BANDWIDTH);
|
||||
|
||||
char* bandwidths[]={"12.5", "20", "25"};
|
||||
char* bandwidths[] = {"12.5", "20", "25"};
|
||||
vpQueueString(bandwidths[bandwidth], vpAnnounceCommonSymbols);
|
||||
vpQueuePrompt(PROMPT_KILOHERTZ);
|
||||
|
||||
|
|
@ -169,8 +170,7 @@ void anouncePower(float power, VoicePromptQueueFlags_T flags)
|
|||
|
||||
char buffer[16] = "\0";
|
||||
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_POWER);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_POWER);
|
||||
|
||||
snprintf(buffer, 16, "%1.1f", power);
|
||||
vpQueueString(buffer, vpAnnounceCommonSymbols);
|
||||
|
|
@ -179,25 +179,25 @@ void anouncePower(float power, VoicePromptQueueFlags_T flags)
|
|||
vpPlayIfNeeded(flags);
|
||||
}
|
||||
|
||||
void announceChannelSummary(channel_t* channel, uint16_t channelIndex, uint16_t bank)
|
||||
void announceChannelSummary(channel_t* channel, uint16_t channelIndex,
|
||||
uint16_t bank)
|
||||
{
|
||||
if (!channel) return;
|
||||
|
||||
vpInit();
|
||||
|
||||
VoicePromptQueueFlags_T localFlags= vpqAddSeparatingSilence;
|
||||
VoicePromptQueueFlags_T localFlags = vpqAddSeparatingSilence;
|
||||
// Force on the descriptions for level 3.
|
||||
if (state.settings.vpLevel == vpHigh)
|
||||
localFlags |= vpqIncludeDescriptions;
|
||||
// if VFO mode, announce VFO.
|
||||
if (state.settings.vpLevel == vpHigh) localFlags |= vpqIncludeDescriptions;
|
||||
// If VFO mode, announce VFO.
|
||||
// channelIndex will be 0 if called from VFO mode.
|
||||
if (channelIndex == 0)
|
||||
vpQueuePrompt(PROMPT_VFO);
|
||||
else
|
||||
announceChannelName(channel, channelIndex, localFlags);
|
||||
announceFrequencies(channel->rx_frequency , channel->tx_frequency, localFlags);
|
||||
announceFrequencies(channel->rx_frequency, channel->tx_frequency,
|
||||
localFlags);
|
||||
announceRadioMode(channel->mode, localFlags);
|
||||
|
||||
if (channel->mode == OPMODE_FM)
|
||||
{
|
||||
announceBandwidth(channel->bandwidth, localFlags);
|
||||
|
|
@ -206,8 +206,7 @@ void announceChannelSummary(channel_t* channel, uint16_t channelIndex, uint16_t
|
|||
if (channel->fm.rxToneEn || channel->fm.txToneEn)
|
||||
{
|
||||
announceCTCSS(channel->fm.rxToneEn, channel->fm.rxTone,
|
||||
channel->fm.txToneEn, channel->fm.txTone,
|
||||
localFlags);
|
||||
channel->fm.txToneEn, channel->fm.txTone, localFlags);
|
||||
}
|
||||
}
|
||||
else if (channel->mode == OPMODE_M17)
|
||||
|
|
@ -219,9 +218,12 @@ void announceChannelSummary(channel_t* channel, uint16_t channelIndex, uint16_t
|
|||
{
|
||||
addSilenceIfNeeded(localFlags);
|
||||
announceContactWithIndex(channel->dmr.contact_index, localFlags);
|
||||
// Force announcement of the words timeslot and colorcode to avoid ambiguity.
|
||||
announceTimeslot(channel->dmr.dmr_timeslot, (localFlags | vpqIncludeDescriptions));
|
||||
announceColorCode(channel->dmr.rxColorCode, channel->dmr.txColorCode, (localFlags | vpqIncludeDescriptions));
|
||||
// Force announcement of the words timeslot and colorcode to avoid
|
||||
// ambiguity.
|
||||
announceTimeslot(channel->dmr.dmr_timeslot,
|
||||
(localFlags | vpqIncludeDescriptions));
|
||||
announceColorCode(channel->dmr.rxColorCode, channel->dmr.txColorCode,
|
||||
(localFlags | vpqIncludeDescriptions));
|
||||
}
|
||||
addSilenceIfNeeded(localFlags);
|
||||
|
||||
|
|
@ -241,7 +243,8 @@ void AnnounceInputChar(char ch)
|
|||
|
||||
vpInit();
|
||||
|
||||
uint8_t flags = vpAnnounceCaps | vpAnnounceSpace | vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols;
|
||||
uint8_t flags = vpAnnounceCaps | vpAnnounceSpace | vpAnnounceCommonSymbols |
|
||||
vpAnnounceLessCommonSymbols;
|
||||
|
||||
vpQueueString(buf, flags);
|
||||
|
||||
|
|
@ -277,24 +280,25 @@ void announceError(VoicePromptQueueFlags_T flags)
|
|||
vpPlayIfNeeded(flags);
|
||||
}
|
||||
|
||||
void announceText( char* text, VoicePromptQueueFlags_T flags)
|
||||
void announceText(char* text, VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
if (!text || !*text)
|
||||
return;
|
||||
if (!text || !*text) return;
|
||||
|
||||
vpInitIfNeeded(flags);
|
||||
// see if we have a prompt for this string.
|
||||
// See if we have a prompt for this string.
|
||||
int offset = GetEnglishStringTableOffset(text);
|
||||
|
||||
if (offset != -1)
|
||||
vpQueueStringTableEntry((const char* const *)(¤tLanguage->languageName + offset));
|
||||
else // just spel it out
|
||||
vpQueueStringTableEntry(
|
||||
(const char* const*)(¤tLanguage->languageName + offset));
|
||||
else // Just spell it out
|
||||
vpQueueString(text, vpAnnounceCommonSymbols);
|
||||
|
||||
vpPlayIfNeeded(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)
|
||||
{
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
|
|
@ -312,18 +316,18 @@ void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8
|
|||
if ((rxToneEnabled && txToneEnabled) && (rxTone == txTone))
|
||||
{
|
||||
vpQueuePrompt(PROMPT_TONE);
|
||||
snprintf(buffer, 16, "%3.1f", ctcss_tone[rxTone]/10.0f);
|
||||
snprintf(buffer, 16, "%3.1f", ctcss_tone[rxTone] / 10.0f);
|
||||
vpQueueString(buffer, vpqDefault);
|
||||
vpQueuePrompt(PROMPT_HERTZ);
|
||||
vpPlayIfNeeded(flags);
|
||||
return;
|
||||
}
|
||||
// speak the individual rx and tx tones.
|
||||
// Speak the individual rx and tx tones.
|
||||
if (rxToneEnabled)
|
||||
{
|
||||
vpQueuePrompt(PROMPT_RECEIVE);
|
||||
vpQueuePrompt(PROMPT_TONE);
|
||||
snprintf(buffer, 16, "%3.1f", ctcss_tone[rxTone]/10.0f);
|
||||
snprintf(buffer, 16, "%3.1f", ctcss_tone[rxTone] / 10.0f);
|
||||
vpQueueString(buffer, vpqDefault);
|
||||
vpQueuePrompt(PROMPT_HERTZ);
|
||||
}
|
||||
|
|
@ -331,7 +335,7 @@ void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8
|
|||
{
|
||||
vpQueuePrompt(PROMPT_TRANSMIT);
|
||||
vpQueuePrompt(PROMPT_TONE);
|
||||
snprintf(buffer, 16, "%3.1f", ctcss_tone[txTone]/10.0f);
|
||||
snprintf(buffer, 16, "%3.1f", ctcss_tone[txTone] / 10.0f);
|
||||
vpQueueString(buffer, vpqDefault);
|
||||
vpQueuePrompt(PROMPT_HERTZ);
|
||||
}
|
||||
|
|
@ -355,8 +359,7 @@ void announceSquelch(uint8_t squelch, VoicePromptQueueFlags_T flags)
|
|||
{
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_SQUELCH);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_SQUELCH);
|
||||
|
||||
vpQueueInteger(squelch);
|
||||
|
||||
|
|
@ -365,29 +368,24 @@ void announceSquelch(uint8_t squelch, VoicePromptQueueFlags_T flags)
|
|||
|
||||
void announceContact(contact_t* contact, VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
if (!contact)
|
||||
return;
|
||||
if (!contact) return;
|
||||
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_CONTACT);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_CONTACT);
|
||||
|
||||
if (contact->name[0])
|
||||
vpQueueString(contact->name, vpAnnounceCommonSymbols);
|
||||
if (contact->name[0]) vpQueueString(contact->name, vpAnnounceCommonSymbols);
|
||||
|
||||
vpPlayIfNeeded(flags);
|
||||
}
|
||||
|
||||
void announceContactWithIndex(uint16_t index, VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
if (index == 0)
|
||||
return;
|
||||
if (index == 0) return;
|
||||
|
||||
contact_t contact;
|
||||
|
||||
if (cps_readContact(&contact, index) == -1)
|
||||
return;
|
||||
if (cps_readContact(&contact, index) == -1) return;
|
||||
|
||||
announceContact(&contact, flags);
|
||||
}
|
||||
|
|
@ -396,20 +394,19 @@ void announceTimeslot(uint8_t timeslot, VoicePromptQueueFlags_T flags)
|
|||
{
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_TIMESLOT);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_TIMESLOT);
|
||||
|
||||
vpQueueInteger(timeslot);
|
||||
|
||||
vpPlayIfNeeded(flags);
|
||||
}
|
||||
|
||||
void announceColorCode(uint8_t rxColorCode, uint8_t txColorCode, VoicePromptQueueFlags_T flags)
|
||||
void announceColorCode(uint8_t rxColorCode, uint8_t txColorCode,
|
||||
VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_COLORCODE);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_COLORCODE);
|
||||
|
||||
if (rxColorCode == txColorCode)
|
||||
{
|
||||
|
|
@ -434,7 +431,7 @@ void announceBank(uint16_t bank, VoicePromptQueueFlags_T flags)
|
|||
|
||||
if (state.bank_enabled)
|
||||
{
|
||||
bankHdr_t bank_hdr = { 0 };
|
||||
bankHdr_t bank_hdr = {0};
|
||||
cps_readBankHeader(&bank_hdr, bank);
|
||||
vpQueueString(bank_hdr.name, vpAnnounceCommonSymbols);
|
||||
}
|
||||
|
|
@ -451,8 +448,7 @@ void announceM17Info(channel_t* channel, VoicePromptQueueFlags_T flags)
|
|||
vpInitIfNeeded(flags);
|
||||
if (state.m17_data.dst_addr[0])
|
||||
{
|
||||
if (flags & vpqIncludeDescriptions)
|
||||
vpQueuePrompt(PROMPT_DEST_ID);
|
||||
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_DEST_ID);
|
||||
vpQueueString(state.m17_data.dst_addr, vpAnnounceCommonSymbols);
|
||||
}
|
||||
else if (channel->m17.contact_index)
|
||||
|
|
@ -464,11 +460,11 @@ void announceM17Info(channel_t* channel, VoicePromptQueueFlags_T flags)
|
|||
#ifdef GPS_PRESENT
|
||||
void announceGPSInfo()
|
||||
{
|
||||
if (!state.settings.gps_enabled)
|
||||
return;
|
||||
if (!state.settings.gps_enabled) return;
|
||||
|
||||
vpInit();
|
||||
VoicePromptQueueFlags_T flags = vpqIncludeDescriptions | vpqAddSeparatingSilence;
|
||||
VoicePromptQueueFlags_T flags =
|
||||
vpqIncludeDescriptions | vpqAddSeparatingSilence;
|
||||
|
||||
vpQueueStringTableEntry(¤tLanguage->gps);
|
||||
|
||||
|
|
@ -498,7 +494,7 @@ void announceGPSInfo()
|
|||
}
|
||||
addSilenceIfNeeded(flags);
|
||||
|
||||
switch(state.gps_data.fix_type)
|
||||
switch (state.gps_data.fix_type)
|
||||
{
|
||||
case 2:
|
||||
vpQueueString("2D", vpAnnounceCommonSymbols);
|
||||
|
|
@ -597,33 +593,37 @@ void announceSettingsTimeDate()
|
|||
datetime_t local_time = utcToLocalTime(state.time, state.settings.utc_timezone);
|
||||
|
||||
char buffer[16] = "\0";
|
||||
snprintf(buffer, 16, "%02d/%02d/%02d",
|
||||
local_time.date, local_time.month, local_time.year);
|
||||
vpQueueString(buffer, (vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
||||
snprintf(buffer, 16, "%02d/%02d/%02d", local_time.date, local_time.month,
|
||||
local_time.year);
|
||||
vpQueueString(buffer,
|
||||
(vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
||||
|
||||
snprintf(buffer, 16, "%02d:%02d:%02d",
|
||||
local_time.hour, local_time.minute, local_time.second);
|
||||
vpQueueString(buffer, (vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
||||
snprintf(buffer, 16, "%02d:%02d:%02d", local_time.hour, local_time.minute,
|
||||
local_time.second);
|
||||
vpQueueString(buffer,
|
||||
(vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
||||
|
||||
vpPlay();
|
||||
}
|
||||
#endif // RTC_PRESENT
|
||||
|
||||
/*
|
||||
there are 5 levels of verbosity:
|
||||
* There are 5 levels of verbosity:
|
||||
*
|
||||
* vpNone: no voice or beeps.
|
||||
* vpBeep: beeps only.
|
||||
* vpLow: menus talk, but channel and frequency changes are indicated with a
|
||||
* beep and only voiced on demand with f1.
|
||||
* vpMedium: menus, channel and frequency changes talk but with extra
|
||||
* descriptions eliminated unless ambiguity would result. E.g. We'd say "FM"
|
||||
* rather than "Mode: FM" in the channel summary.
|
||||
* vpHigh: like vpMedium except with extra descriptions: e.g. "Mode fm".
|
||||
*
|
||||
* Also, if a voice prompt is in progress, e.g. changing a menu item, the
|
||||
* descriptions are eliminated, e.g., changing ctcss tones would not repeat
|
||||
* "ctcss" when arrowing through the options rapidly.
|
||||
*/
|
||||
|
||||
vpNone: no voice or beeps.
|
||||
vpBeep: beeps only.
|
||||
vpLow: menus talk, but channel and frequency changes are indicated with a beep
|
||||
and only voiced on demand with f1.
|
||||
vpMedium: menus, channel and frequency changes talk but with extra
|
||||
descriptions eliminated unless ambiguity would result. E.g. We'd say "FM"
|
||||
rather than "Mode: FM" in the channel summary.
|
||||
vpHigh: like vpMedium except with extra descriptions: e.g. "Mode fm".
|
||||
Also, if a voice prompt is in progress, e.g. changing a menu item, the descriptions are eliminated.
|
||||
e.g. changing ctcss tones would not repeat "ctcss" when arrowing through the
|
||||
options rapidly.
|
||||
*/
|
||||
VoicePromptQueueFlags_T GetQueueFlagsForVoiceLevel()
|
||||
{
|
||||
VoicePromptQueueFlags_T flags = vpqInit | vpqAddSeparatingSilence;
|
||||
|
|
@ -634,24 +634,23 @@ VoicePromptQueueFlags_T GetQueueFlagsForVoiceLevel()
|
|||
case vpNone:
|
||||
case vpBeep:
|
||||
return vpqDefault;
|
||||
// play some immediately, other things on demand.
|
||||
// Play some immediately, other things on demand.
|
||||
case vpLow:
|
||||
flags |= vpqPlayImmediatelyAtMediumOrHigher;
|
||||
break;
|
||||
// play all immediatley but without extra descriptions
|
||||
// Play all immediately but without extra descriptions
|
||||
case vpMedium:
|
||||
{
|
||||
flags |= vpqPlayImmediately;
|
||||
break;
|
||||
}
|
||||
// play immediatley with descriptions unless speech is in progress.
|
||||
// Play immediately with descriptions unless speech is in progress.
|
||||
case vpHigh:
|
||||
flags |= vpqPlayImmediately;
|
||||
if (!vpIsPlaying())
|
||||
flags |= vpqIncludeDescriptions;
|
||||
if (!vpIsPlaying()) flags |= vpqIncludeDescriptions;
|
||||
break;
|
||||
}
|
||||
|
||||
return flags;
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,23 +17,25 @@
|
|||
* You should have received a copy of the GNU General Public License *
|
||||
* 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 <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"
|
||||
#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.
|
||||
#define VOICE_PROMPTS_TOC_SIZE 350
|
||||
// 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 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
|
||||
{
|
||||
|
|
@ -45,7 +47,10 @@ typedef struct
|
|||
// Address of voice prompt header for checking version etc.
|
||||
const uint32_t VOICE_PROMPTS_FLASH_HEADER_ADDRESS = 0x8F400;
|
||||
// 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.
|
||||
// 76 x 27 byte Codec2 frames
|
||||
#define Codec2DataBufferSize 2052
|
||||
|
|
@ -71,16 +76,11 @@ typedef struct
|
|||
int Length;
|
||||
} vpSequence_t;
|
||||
|
||||
static vpSequence_t vpCurrentSequence =
|
||||
{
|
||||
.Pos = 0,
|
||||
.Length = 0
|
||||
};
|
||||
static vpSequence_t vpCurrentSequence = {.Pos = 0, .Length = 0};
|
||||
|
||||
uint32_t tableOfContents[VOICE_PROMPTS_TOC_SIZE];
|
||||
|
||||
const userDictEntry userDictionary[]=
|
||||
{
|
||||
const userDictEntry userDictionary[] = {
|
||||
{"hotspot", PROMPT_CUSTOM1}, // Hotspot
|
||||
{"clearnode", PROMPT_CUSTOM2}, // ClearNode
|
||||
{"sharinode", PROMPT_CUSTOM3}, // ShariNode
|
||||
|
|
@ -90,47 +90,53 @@ const userDictEntry userDictionary[]=
|
|||
{"blindhams", PROMPT_CUSTOM7}, // BlindHams
|
||||
{"allstar", PROMPT_CUSTOM8}, // Allstar
|
||||
{"parrot", PROMPT_CUSTOM9}, // Parrot
|
||||
{"channel",PROMPT_CHANNEL},
|
||||
{0, 0}
|
||||
};
|
||||
{"channel", PROMPT_CHANNEL}, {0, 0}};
|
||||
|
||||
void vpCacheInit(void)
|
||||
{
|
||||
voicePromptsDataHeader_t header;
|
||||
// ToDo not sure where this is coming from yet.
|
||||
//SPI_Flash_read(VOICE_PROMPTS_FLASH_HEADER_ADDRESS,(uint8_t *)&header,sizeof(voicePromptsDataHeader_t));
|
||||
// ToDo not sure where this is coming from yet.
|
||||
// SPI_Flash_read(VOICE_PROMPTS_FLASH_HEADER_ADDRESS,(uint8_t
|
||||
// *)&header,sizeof(voicePromptsDataHeader_t));
|
||||
|
||||
if (vpCheckHeader((uint32_t *)&header))
|
||||
{// 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);
|
||||
vpFlashDataAddress = VOICE_PROMPTS_FLASH_HEADER_ADDRESS + sizeof(voicePromptsDataHeader_t) + sizeof(uint32_t)*VOICE_PROMPTS_TOC_SIZE ;
|
||||
if (vpCheckHeader((uint32_t*)&header))
|
||||
{ // 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);
|
||||
vpFlashDataAddress = VOICE_PROMPTS_FLASH_HEADER_ADDRESS +
|
||||
sizeof(voicePromptsDataHeader_t) +
|
||||
sizeof(uint32_t) * VOICE_PROMPTS_TOC_SIZE;
|
||||
}
|
||||
if (vpDataIsLoaded)
|
||||
{// if the hash key is down, set vpLevel to high, if beep or less.
|
||||
{ // if the hash key is down, set vpLevel to high, if beep or less.
|
||||
if ((kbd_getKeys() & KEY_HASH) && (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;
|
||||
{ // 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))
|
||||
{// ToDo where are we reading this from?
|
||||
{ // ToDo where are we reading this from?
|
||||
// Just so we can build,
|
||||
;
|
||||
//SPI_Flash_read(vpFlashDataAddress + offset, (uint8_t *)&Codec2Data, length);
|
||||
// SPI_Flash_read(vpFlashDataAddress + offset, (uint8_t *)&Codec2Data,
|
||||
// length);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -139,31 +145,36 @@ void vpTick(void)
|
|||
if (voicePromptIsActive)
|
||||
{
|
||||
if (promptDataPosition < currentPromptLength)
|
||||
{// ToDo figure out buffering.
|
||||
//if (wavbuffer_count <= (WAV_BUFFER_COUNT / 2))
|
||||
{ // ToDo figure out buffering.
|
||||
// if (wavbuffer_count <= (WAV_BUFFER_COUNT / 2))
|
||||
{
|
||||
// codecDecode((uint8_t *)&Codec2Data[promptDataPosition], 3);
|
||||
// codecDecode((uint8_t
|
||||
// *)&Codec2Data[promptDataPosition], 3);
|
||||
promptDataPosition += 27;
|
||||
}
|
||||
|
||||
//soundTickRXBuffer();
|
||||
// soundTickRXBuffer();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( vpCurrentSequence.Pos < (vpCurrentSequence.Length - 1))
|
||||
if (vpCurrentSequence.Pos < (vpCurrentSequence.Length - 1))
|
||||
{
|
||||
vpCurrentSequence.Pos++;
|
||||
promptDataPosition = 0;
|
||||
|
||||
int promptNumber = vpCurrentSequence.Buffer[vpCurrentSequence.Pos];
|
||||
currentPromptLength = tableOfContents[promptNumber + 1] - tableOfContents[promptNumber];
|
||||
GetCodec2Data(tableOfContents[promptNumber], currentPromptLength);
|
||||
int promptNumber =
|
||||
vpCurrentSequence.Buffer[vpCurrentSequence.Pos];
|
||||
currentPromptLength = tableOfContents[promptNumber + 1] -
|
||||
tableOfContents[promptNumber];
|
||||
GetCodec2Data(tableOfContents[promptNumber],
|
||||
currentPromptLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
// wait for wave buffer to empty when prompt has finished playing
|
||||
// wait for wave buffer to empty when prompt has finished
|
||||
// playing
|
||||
|
||||
// if (wavbuffer_count == 0)
|
||||
// if (wavbuffer_count == 0)
|
||||
{
|
||||
vpTerminate();
|
||||
}
|
||||
|
|
@ -176,9 +187,11 @@ void vpTick(void)
|
|||
{
|
||||
promptTail--;
|
||||
|
||||
/*if ((promptTail == 0) && trxCarrierDetected() && (trxGetMode() == RADIO_MODE_ANALOG))
|
||||
/*if ((promptTail == 0) && trxCarrierDetected() && (trxGetMode() ==
|
||||
RADIO_MODE_ANALOG))
|
||||
{// ToDo enable amp.
|
||||
//GPIO_PinWrite(GPIO_RX_audio_mux, Pin_RX_audio_mux, 1); // Set the audio path to AT1846 -> audio amp.
|
||||
//GPIO_PinWrite(GPIO_RX_audio_mux, Pin_RX_audio_mux, 1); // Set
|
||||
the audio path to AT1846 -> audio amp.
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
|
@ -188,11 +201,11 @@ void vpTerminate(void)
|
|||
{
|
||||
if (voicePromptIsActive)
|
||||
{
|
||||
//disableAudioAmp(AUDIO_AMP_MODE_PROMPT);
|
||||
// disableAudioAmp(AUDIO_AMP_MODE_PROMPT);
|
||||
|
||||
vpCurrentSequence.Pos = 0;
|
||||
//soundTerminateSound();
|
||||
//soundInit();
|
||||
// soundTerminateSound();
|
||||
// soundInit();
|
||||
promptTail = PROMPT_TAIL;
|
||||
|
||||
voicePromptIsActive = false;
|
||||
|
|
@ -212,8 +225,7 @@ void vpInit(void)
|
|||
|
||||
void vpQueuePrompt(uint16_t prompt)
|
||||
{
|
||||
if (state.settings.vpLevel < vpLow)
|
||||
return;
|
||||
if (state.settings.vpLevel < vpLow) return;
|
||||
|
||||
if (voicePromptIsActive)
|
||||
{
|
||||
|
|
@ -230,12 +242,12 @@ static uint16_t UserDictLookup(char* ptr, int* advanceBy)
|
|||
{
|
||||
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);
|
||||
if (strncasecmp(userDictionary[index].userWord, ptr, len)==0)
|
||||
int len = strlen(userDictionary[index].userWord);
|
||||
if (strncasecmp(userDictionary[index].userWord, ptr, len) == 0)
|
||||
{
|
||||
*advanceBy=len;
|
||||
*advanceBy = len;
|
||||
return userDictionary[index].vp;
|
||||
}
|
||||
}
|
||||
|
|
@ -244,46 +256,50 @@ static uint16_t UserDictLookup(char* ptr, int* advanceBy)
|
|||
}
|
||||
|
||||
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[] =
|
||||
"%.+-*#!,@:?()~/[]<>=$'`&|_^{}"; // Must match order of symbols in
|
||||
// voicePrompt_t enum.
|
||||
const char commonSymbols[] = "%.+-*#";
|
||||
|
||||
bool announceCommonSymbols = (flags & vpAnnounceCommonSymbols) ? true : false;
|
||||
bool announceLessCommonSymbols=(flags & vpAnnounceLessCommonSymbols) ? true : false;
|
||||
bool announceCommonSymbols =
|
||||
(flags & vpAnnounceCommonSymbols) ? true : false;
|
||||
bool announceLessCommonSymbols =
|
||||
(flags & vpAnnounceLessCommonSymbols) ? true : false;
|
||||
|
||||
char* symbolPtr = strchr(indexedSymbols, symbol);
|
||||
|
||||
if (symbolPtr == NULL)
|
||||
{// we don't have a prompt for this character.
|
||||
return (flags&vpAnnounceASCIIValueForUnknownChars) ? true : false;
|
||||
{ // we don't have a prompt for this character.
|
||||
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.
|
||||
void vpQueueString(char *promptString, VoicePromptFlags_T flags)
|
||||
void vpQueueString(char* promptString, VoicePromptFlags_T flags)
|
||||
{
|
||||
if (state.settings.vpLevel < vpLow)
|
||||
return;
|
||||
if (state.settings.vpLevel < vpLow) return;
|
||||
|
||||
if (voicePromptIsActive)
|
||||
{
|
||||
vpInit();
|
||||
}
|
||||
|
||||
if (state.settings.vpPhoneticSpell)
|
||||
flags|=vpAnnouncePhoneticRendering;
|
||||
if (state.settings.vpPhoneticSpell) flags |= vpAnnouncePhoneticRendering;
|
||||
while (*promptString != 0)
|
||||
{
|
||||
int advanceBy=0;
|
||||
int advanceBy = 0;
|
||||
voicePrompt_t vp = UserDictLookup(promptString, &advanceBy);
|
||||
if (vp)
|
||||
{
|
||||
|
|
@ -297,21 +313,20 @@ void vpQueueString(char *promptString, VoicePromptFlags_T flags)
|
|||
}
|
||||
else if ((*promptString >= 'A') && (*promptString <= 'Z'))
|
||||
{
|
||||
if (flags&vpAnnounceCaps)
|
||||
vpQueuePrompt(PROMPT_CAP);
|
||||
if (flags&vpAnnouncePhoneticRendering)
|
||||
if (flags & vpAnnounceCaps) vpQueuePrompt(PROMPT_CAP);
|
||||
if (flags & vpAnnouncePhoneticRendering)
|
||||
vpQueuePrompt((*promptString - 'A') + PROMPT_A_PHONETIC);
|
||||
else
|
||||
vpQueuePrompt(*promptString - 'A' + PROMPT_A);
|
||||
}
|
||||
else if ((*promptString >= 'a') && (*promptString <= 'z'))
|
||||
{
|
||||
if (flags&vpAnnouncePhoneticRendering)
|
||||
if (flags & vpAnnouncePhoneticRendering)
|
||||
vpQueuePrompt((*promptString - 'a') + PROMPT_A_PHONETIC);
|
||||
else
|
||||
vpQueuePrompt(*promptString - 'a' + PROMPT_A);
|
||||
}
|
||||
else if ((*promptString==' ') && (flags&vpAnnounceSpace))
|
||||
else if ((*promptString == ' ') && (flags & vpAnnounceSpace))
|
||||
{
|
||||
vpQueuePrompt(PROMPT_SPACE);
|
||||
}
|
||||
|
|
@ -322,7 +337,8 @@ void vpQueueString(char *promptString, VoicePromptFlags_T flags)
|
|||
else // announce ASCII
|
||||
{
|
||||
int32_t val = *promptString;
|
||||
vpQueuePrompt(PROMPT_CHARACTER); // just the word "code" as we don't have character.
|
||||
vpQueuePrompt(PROMPT_CHARACTER); // just the word "code" as we
|
||||
// don't have character.
|
||||
vpQueueInteger(val);
|
||||
}
|
||||
}
|
||||
|
|
@ -334,15 +350,12 @@ void vpQueueString(char *promptString, VoicePromptFlags_T flags)
|
|||
|
||||
promptString++;
|
||||
}
|
||||
if (flags & vpqAddSeparatingSilence)
|
||||
vpQueuePrompt(PROMPT_SILENCE);
|
||||
|
||||
if (flags & vpqAddSeparatingSilence) vpQueuePrompt(PROMPT_SILENCE);
|
||||
}
|
||||
|
||||
void vpQueueInteger(int32_t value)
|
||||
{
|
||||
if (state.settings.vpLevel < vpLow)
|
||||
return;
|
||||
if (state.settings.vpLevel < vpLow) return;
|
||||
|
||||
char buf[12] = {0}; // min: -2147483648, max: 2147483647
|
||||
snprintf(buf, 12, "%d", value);
|
||||
|
|
@ -353,39 +366,39 @@ void vpQueueInteger(int32_t value)
|
|||
// These are stored in the voice data after the voice prompts with no
|
||||
// corresponding string table entry, hence the offset calculation:
|
||||
// NUM_VOICE_PROMPTS + (stringTableStringPtr - currentLanguage->languageName)
|
||||
void vpQueueStringTableEntry(const char * const *stringTableStringPtr)
|
||||
void vpQueueStringTableEntry(const char* const* stringTableStringPtr)
|
||||
{
|
||||
if (state.settings.vpLevel < vpLow)
|
||||
return;
|
||||
if (state.settings.vpLevel < vpLow) return;
|
||||
|
||||
if (stringTableStringPtr == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
vpQueuePrompt(NUM_VOICE_PROMPTS + (stringTableStringPtr - ¤tLanguage->languageName));
|
||||
vpQueuePrompt(NUM_VOICE_PROMPTS +
|
||||
(stringTableStringPtr - ¤tLanguage->languageName));
|
||||
}
|
||||
|
||||
void vpPlay(void)
|
||||
{
|
||||
if (state.settings.vpLevel < vpLow)
|
||||
return;
|
||||
if (state.settings.vpLevel < vpLow) return;
|
||||
|
||||
if ((voicePromptIsActive == false) && (vpCurrentSequence.Length > 0))
|
||||
{
|
||||
voicePromptIsActive = true;// Start the playback
|
||||
voicePromptIsActive = true; // Start the playback
|
||||
int promptNumber = vpCurrentSequence.Buffer[0];
|
||||
|
||||
vpCurrentSequence.Pos = 0;
|
||||
|
||||
currentPromptLength = tableOfContents[promptNumber + 1] - 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
|
||||
//enableAudioAmp(AUDIO_AMP_MODE_PROMPT);
|
||||
// GPIO_PinWrite(GPIO_RX_audio_mux, Pin_RX_audio_mux, 0);// set
|
||||
// the audio mux HR-C6000 -> audio amp
|
||||
// enableAudioAmp(AUDIO_AMP_MODE_PROMPT);
|
||||
|
||||
//codecInit(true);
|
||||
// codecInit(true);
|
||||
promptDataPosition = 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,18 +18,20 @@
|
|||
* 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/EnglishStrings.h"
|
||||
#include <stdint.h>
|
||||
|
||||
// add more languages here.
|
||||
const stringsTable_t languages[NUM_LANGUAGES]={ englishStrings };
|
||||
// default to English.
|
||||
const stringsTable_t* currentLanguage=&languages[0];
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#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,
|
||||
|
|
@ -37,12 +39,11 @@ 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
|
||||
struct, or to announce an indexed voice prompt.
|
||||
*/
|
||||
int GetEnglishStringTableOffset( char* text)
|
||||
int GetEnglishStringTableOffset(char* text)
|
||||
{
|
||||
if (!text || !*text)
|
||||
return -1; // error.
|
||||
if (!text || !*text) 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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue