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 *
|
* 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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -215,16 +217,16 @@ 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,
|
||||||
|
|
@ -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
|
||||||
|
|
@ -20,8 +20,8 @@
|
||||||
#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",
|
||||||
|
|
@ -65,7 +65,7 @@ const stringsTable_t englishStrings =
|
||||||
.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",
|
||||||
|
|
@ -87,4 +87,4 @@ const stringsTable_t englishStrings =
|
||||||
.forEmergencyUse = "For emergency use",
|
.forEmergencyUse = "For emergency use",
|
||||||
.pressAnyButton = "press any button.",
|
.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/> *
|
* 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
|
||||||
|
|
@ -96,6 +97,6 @@ typedef struct
|
||||||
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
|
||||||
|
|
@ -16,43 +16,48 @@
|
||||||
* 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 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 <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <state.h>
|
|
||||||
#include "interfaces/cps_io.h"
|
#include "interfaces/cps_io.h"
|
||||||
#include "core/voicePromptUtils.h"
|
|
||||||
|
|
||||||
static void vpInitIfNeeded(VoicePromptQueueFlags_T flags)
|
static void vpInitIfNeeded(VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
if (flags & vpqInit)
|
if (flags & vpqInit) vpInit();
|
||||||
vpInit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vpPlayIfNeeded(VoicePromptQueueFlags_T flags)
|
static void vpPlayIfNeeded(VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
uint8_t vpLevel = state.settings.vpLevel;
|
uint8_t vpLevel = state.settings.vpLevel;
|
||||||
|
|
||||||
if ((flags & vpqPlayImmediately)
|
if ((flags & vpqPlayImmediately) ||
|
||||||
|| ((flags & vpqPlayImmediatelyAtMediumOrHigher) && (vpLevel >= vpMedium)))
|
((flags & vpqPlayImmediatelyAtMediumOrHigher) && (vpLevel >= vpMedium)))
|
||||||
vpPlay();
|
vpPlay();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addSilenceIfNeeded(VoicePromptQueueFlags_T flags)
|
static void addSilenceIfNeeded(VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
if ((flags & vpqAddSeparatingSilence) == 0)
|
if ((flags & vpqAddSeparatingSilence) == 0) return;
|
||||||
return;
|
|
||||||
|
|
||||||
vpQueuePrompt(PROMPT_SILENCE);
|
vpQueuePrompt(PROMPT_SILENCE);
|
||||||
vpQueuePrompt(PROMPT_SILENCE);
|
vpQueuePrompt(PROMPT_SILENCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void removeUnnecessaryZerosFromVoicePrompts(char *str)
|
static void removeUnnecessaryZerosFromVoicePrompts(char* str)
|
||||||
{
|
{
|
||||||
const int NUM_DECIMAL_PLACES = 1;
|
const int NUM_DECIMAL_PLACES = 1;
|
||||||
int len = strlen(str);
|
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)] == '.'))
|
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,
|
void announceChannelName(channel_t* channel, uint16_t channelIndex,
|
||||||
VoicePromptQueueFlags_T flags)
|
VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
|
|
@ -84,7 +89,7 @@ VoicePromptQueueFlags_T flags)
|
||||||
|
|
||||||
// Only queue the name if it is not the same as the raw number.
|
// 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.
|
// Otherwise the radio will say channel 1 1 for channel 1.
|
||||||
char numAsStr[16]="\0";
|
char numAsStr[16] = "\0";
|
||||||
snprintf(numAsStr, 16, "%d", channelIndex);
|
snprintf(numAsStr, 16, "%d", channelIndex);
|
||||||
if (strcmp(numAsStr, channel->name) != 0)
|
if (strcmp(numAsStr, channel->name) != 0)
|
||||||
vpQueueString(channel->name, vpAnnounceCommonSymbols);
|
vpQueueString(channel->name, vpAnnounceCommonSymbols);
|
||||||
|
|
@ -96,7 +101,7 @@ void vpQueueFrequency(freq_t freq)
|
||||||
{
|
{
|
||||||
char buffer[16];
|
char buffer[16];
|
||||||
int mhz = (freq / 1000000);
|
int mhz = (freq / 1000000);
|
||||||
int khz = ((freq%1000000) / 10);
|
int khz = ((freq % 1000000) / 10);
|
||||||
|
|
||||||
snprintf(buffer, 16, "%d.%05d", mhz, khz);
|
snprintf(buffer, 16, "%d.%05d", mhz, khz);
|
||||||
removeUnnecessaryZerosFromVoicePrompts(buffer);
|
removeUnnecessaryZerosFromVoicePrompts(buffer);
|
||||||
|
|
@ -109,8 +114,7 @@ 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)
|
||||||
{
|
{
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
// if rx and tx frequencies differ, announce both, otherwise just announce
|
// If rx and tx frequencies differ, announce both, otherwise just one
|
||||||
// one.
|
|
||||||
if (rx == tx)
|
if (rx == tx)
|
||||||
vpQueueFrequency(rx);
|
vpQueueFrequency(rx);
|
||||||
else
|
else
|
||||||
|
|
@ -127,10 +131,9 @@ void announceRadioMode(uint8_t mode, VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_MODE);
|
||||||
vpQueuePrompt(PROMPT_MODE);
|
|
||||||
|
|
||||||
switch(mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case OPMODE_DMR:
|
case OPMODE_DMR:
|
||||||
vpQueueStringTableEntry(¤tLanguage->dmr);
|
vpQueueStringTableEntry(¤tLanguage->dmr);
|
||||||
|
|
@ -148,15 +151,13 @@ void announceRadioMode(uint8_t mode, VoicePromptQueueFlags_T flags)
|
||||||
|
|
||||||
void announceBandwidth(uint8_t bandwidth, VoicePromptQueueFlags_T flags)
|
void announceBandwidth(uint8_t bandwidth, VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
if (bandwidth > BW_25)
|
if (bandwidth > BW_25) bandwidth = BW_25; // Should probably never happen!
|
||||||
bandwidth = BW_25; // should probably never happen!
|
|
||||||
|
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_BANDWIDTH);
|
||||||
vpQueuePrompt(PROMPT_BANDWIDTH);
|
|
||||||
|
|
||||||
char* bandwidths[]={"12.5", "20", "25"};
|
char* bandwidths[] = {"12.5", "20", "25"};
|
||||||
vpQueueString(bandwidths[bandwidth], vpAnnounceCommonSymbols);
|
vpQueueString(bandwidths[bandwidth], vpAnnounceCommonSymbols);
|
||||||
vpQueuePrompt(PROMPT_KILOHERTZ);
|
vpQueuePrompt(PROMPT_KILOHERTZ);
|
||||||
|
|
||||||
|
|
@ -169,8 +170,7 @@ void anouncePower(float power, VoicePromptQueueFlags_T flags)
|
||||||
|
|
||||||
char buffer[16] = "\0";
|
char buffer[16] = "\0";
|
||||||
|
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_POWER);
|
||||||
vpQueuePrompt(PROMPT_POWER);
|
|
||||||
|
|
||||||
snprintf(buffer, 16, "%1.1f", power);
|
snprintf(buffer, 16, "%1.1f", power);
|
||||||
vpQueueString(buffer, vpAnnounceCommonSymbols);
|
vpQueueString(buffer, vpAnnounceCommonSymbols);
|
||||||
|
|
@ -179,25 +179,25 @@ void anouncePower(float power, VoicePromptQueueFlags_T flags)
|
||||||
vpPlayIfNeeded(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;
|
if (!channel) return;
|
||||||
|
|
||||||
vpInit();
|
vpInit();
|
||||||
|
|
||||||
VoicePromptQueueFlags_T localFlags= vpqAddSeparatingSilence;
|
VoicePromptQueueFlags_T localFlags = vpqAddSeparatingSilence;
|
||||||
// Force on the descriptions for level 3.
|
// Force on the descriptions for level 3.
|
||||||
if (state.settings.vpLevel == vpHigh)
|
if (state.settings.vpLevel == vpHigh) localFlags |= vpqIncludeDescriptions;
|
||||||
localFlags |= vpqIncludeDescriptions;
|
// If VFO mode, announce VFO.
|
||||||
// if VFO mode, announce VFO.
|
|
||||||
// channelIndex will be 0 if called from VFO mode.
|
// channelIndex will be 0 if called from VFO mode.
|
||||||
if (channelIndex == 0)
|
if (channelIndex == 0)
|
||||||
vpQueuePrompt(PROMPT_VFO);
|
vpQueuePrompt(PROMPT_VFO);
|
||||||
else
|
else
|
||||||
announceChannelName(channel, channelIndex, localFlags);
|
announceChannelName(channel, channelIndex, localFlags);
|
||||||
announceFrequencies(channel->rx_frequency , channel->tx_frequency, localFlags);
|
announceFrequencies(channel->rx_frequency, channel->tx_frequency,
|
||||||
|
localFlags);
|
||||||
announceRadioMode(channel->mode, localFlags);
|
announceRadioMode(channel->mode, localFlags);
|
||||||
|
|
||||||
if (channel->mode == OPMODE_FM)
|
if (channel->mode == OPMODE_FM)
|
||||||
{
|
{
|
||||||
announceBandwidth(channel->bandwidth, localFlags);
|
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)
|
if (channel->fm.rxToneEn || channel->fm.txToneEn)
|
||||||
{
|
{
|
||||||
announceCTCSS(channel->fm.rxToneEn, channel->fm.rxTone,
|
announceCTCSS(channel->fm.rxToneEn, channel->fm.rxTone,
|
||||||
channel->fm.txToneEn, channel->fm.txTone,
|
channel->fm.txToneEn, channel->fm.txTone, localFlags);
|
||||||
localFlags);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (channel->mode == OPMODE_M17)
|
else if (channel->mode == OPMODE_M17)
|
||||||
|
|
@ -219,9 +218,12 @@ void announceChannelSummary(channel_t* channel, uint16_t channelIndex, uint16_t
|
||||||
{
|
{
|
||||||
addSilenceIfNeeded(localFlags);
|
addSilenceIfNeeded(localFlags);
|
||||||
announceContactWithIndex(channel->dmr.contact_index, localFlags);
|
announceContactWithIndex(channel->dmr.contact_index, localFlags);
|
||||||
// Force announcement of the words timeslot and colorcode to avoid ambiguity.
|
// Force announcement of the words timeslot and colorcode to avoid
|
||||||
announceTimeslot(channel->dmr.dmr_timeslot, (localFlags | vpqIncludeDescriptions));
|
// ambiguity.
|
||||||
announceColorCode(channel->dmr.rxColorCode, channel->dmr.txColorCode, (localFlags | vpqIncludeDescriptions));
|
announceTimeslot(channel->dmr.dmr_timeslot,
|
||||||
|
(localFlags | vpqIncludeDescriptions));
|
||||||
|
announceColorCode(channel->dmr.rxColorCode, channel->dmr.txColorCode,
|
||||||
|
(localFlags | vpqIncludeDescriptions));
|
||||||
}
|
}
|
||||||
addSilenceIfNeeded(localFlags);
|
addSilenceIfNeeded(localFlags);
|
||||||
|
|
||||||
|
|
@ -241,7 +243,8 @@ void AnnounceInputChar(char ch)
|
||||||
|
|
||||||
vpInit();
|
vpInit();
|
||||||
|
|
||||||
uint8_t flags = vpAnnounceCaps | vpAnnounceSpace | vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols;
|
uint8_t flags = vpAnnounceCaps | vpAnnounceSpace | vpAnnounceCommonSymbols |
|
||||||
|
vpAnnounceLessCommonSymbols;
|
||||||
|
|
||||||
vpQueueString(buf, flags);
|
vpQueueString(buf, flags);
|
||||||
|
|
||||||
|
|
@ -277,24 +280,25 @@ void announceError(VoicePromptQueueFlags_T flags)
|
||||||
vpPlayIfNeeded(flags);
|
vpPlayIfNeeded(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void announceText( char* text, VoicePromptQueueFlags_T flags)
|
void announceText(char* text, VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
if (!text || !*text)
|
if (!text || !*text) return;
|
||||||
return;
|
|
||||||
|
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
// see if we have a prompt for this string.
|
// See if we have a prompt for this string.
|
||||||
int offset = GetEnglishStringTableOffset(text);
|
int offset = GetEnglishStringTableOffset(text);
|
||||||
|
|
||||||
if (offset != -1)
|
if (offset != -1)
|
||||||
vpQueueStringTableEntry((const char* const *)(¤tLanguage->languageName + offset));
|
vpQueueStringTableEntry(
|
||||||
else // just spel it out
|
(const char* const*)(¤tLanguage->languageName + offset));
|
||||||
|
else // Just spell it out
|
||||||
vpQueueString(text, vpAnnounceCommonSymbols);
|
vpQueueString(text, vpAnnounceCommonSymbols);
|
||||||
|
|
||||||
vpPlayIfNeeded(flags);
|
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);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
|
|
@ -312,18 +316,18 @@ void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8
|
||||||
if ((rxToneEnabled && txToneEnabled) && (rxTone == txTone))
|
if ((rxToneEnabled && txToneEnabled) && (rxTone == txTone))
|
||||||
{
|
{
|
||||||
vpQueuePrompt(PROMPT_TONE);
|
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);
|
vpQueueString(buffer, vpqDefault);
|
||||||
vpQueuePrompt(PROMPT_HERTZ);
|
vpQueuePrompt(PROMPT_HERTZ);
|
||||||
vpPlayIfNeeded(flags);
|
vpPlayIfNeeded(flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// speak the individual rx and tx tones.
|
// Speak the individual rx and tx tones.
|
||||||
if (rxToneEnabled)
|
if (rxToneEnabled)
|
||||||
{
|
{
|
||||||
vpQueuePrompt(PROMPT_RECEIVE);
|
vpQueuePrompt(PROMPT_RECEIVE);
|
||||||
vpQueuePrompt(PROMPT_TONE);
|
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);
|
vpQueueString(buffer, vpqDefault);
|
||||||
vpQueuePrompt(PROMPT_HERTZ);
|
vpQueuePrompt(PROMPT_HERTZ);
|
||||||
}
|
}
|
||||||
|
|
@ -331,7 +335,7 @@ void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8
|
||||||
{
|
{
|
||||||
vpQueuePrompt(PROMPT_TRANSMIT);
|
vpQueuePrompt(PROMPT_TRANSMIT);
|
||||||
vpQueuePrompt(PROMPT_TONE);
|
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);
|
vpQueueString(buffer, vpqDefault);
|
||||||
vpQueuePrompt(PROMPT_HERTZ);
|
vpQueuePrompt(PROMPT_HERTZ);
|
||||||
}
|
}
|
||||||
|
|
@ -355,8 +359,7 @@ void announceSquelch(uint8_t squelch, VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_SQUELCH);
|
||||||
vpQueuePrompt(PROMPT_SQUELCH);
|
|
||||||
|
|
||||||
vpQueueInteger(squelch);
|
vpQueueInteger(squelch);
|
||||||
|
|
||||||
|
|
@ -365,29 +368,24 @@ void announceSquelch(uint8_t squelch, VoicePromptQueueFlags_T flags)
|
||||||
|
|
||||||
void announceContact(contact_t* contact, VoicePromptQueueFlags_T flags)
|
void announceContact(contact_t* contact, VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
if (!contact)
|
if (!contact) return;
|
||||||
return;
|
|
||||||
|
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_CONTACT);
|
||||||
vpQueuePrompt(PROMPT_CONTACT);
|
|
||||||
|
|
||||||
if (contact->name[0])
|
if (contact->name[0]) vpQueueString(contact->name, vpAnnounceCommonSymbols);
|
||||||
vpQueueString(contact->name, vpAnnounceCommonSymbols);
|
|
||||||
|
|
||||||
vpPlayIfNeeded(flags);
|
vpPlayIfNeeded(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void announceContactWithIndex(uint16_t index, VoicePromptQueueFlags_T flags)
|
void announceContactWithIndex(uint16_t index, VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
if (index == 0)
|
if (index == 0) return;
|
||||||
return;
|
|
||||||
|
|
||||||
contact_t contact;
|
contact_t contact;
|
||||||
|
|
||||||
if (cps_readContact(&contact, index) == -1)
|
if (cps_readContact(&contact, index) == -1) return;
|
||||||
return;
|
|
||||||
|
|
||||||
announceContact(&contact, flags);
|
announceContact(&contact, flags);
|
||||||
}
|
}
|
||||||
|
|
@ -396,20 +394,19 @@ void announceTimeslot(uint8_t timeslot, VoicePromptQueueFlags_T flags)
|
||||||
{
|
{
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_TIMESLOT);
|
||||||
vpQueuePrompt(PROMPT_TIMESLOT);
|
|
||||||
|
|
||||||
vpQueueInteger(timeslot);
|
vpQueueInteger(timeslot);
|
||||||
|
|
||||||
vpPlayIfNeeded(flags);
|
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);
|
vpInitIfNeeded(flags);
|
||||||
|
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_COLORCODE);
|
||||||
vpQueuePrompt(PROMPT_COLORCODE);
|
|
||||||
|
|
||||||
if (rxColorCode == txColorCode)
|
if (rxColorCode == txColorCode)
|
||||||
{
|
{
|
||||||
|
|
@ -434,7 +431,7 @@ void announceBank(uint16_t bank, VoicePromptQueueFlags_T flags)
|
||||||
|
|
||||||
if (state.bank_enabled)
|
if (state.bank_enabled)
|
||||||
{
|
{
|
||||||
bankHdr_t bank_hdr = { 0 };
|
bankHdr_t bank_hdr = {0};
|
||||||
cps_readBankHeader(&bank_hdr, bank);
|
cps_readBankHeader(&bank_hdr, bank);
|
||||||
vpQueueString(bank_hdr.name, vpAnnounceCommonSymbols);
|
vpQueueString(bank_hdr.name, vpAnnounceCommonSymbols);
|
||||||
}
|
}
|
||||||
|
|
@ -451,8 +448,7 @@ void announceM17Info(channel_t* channel, VoicePromptQueueFlags_T flags)
|
||||||
vpInitIfNeeded(flags);
|
vpInitIfNeeded(flags);
|
||||||
if (state.m17_data.dst_addr[0])
|
if (state.m17_data.dst_addr[0])
|
||||||
{
|
{
|
||||||
if (flags & vpqIncludeDescriptions)
|
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_DEST_ID);
|
||||||
vpQueuePrompt(PROMPT_DEST_ID);
|
|
||||||
vpQueueString(state.m17_data.dst_addr, vpAnnounceCommonSymbols);
|
vpQueueString(state.m17_data.dst_addr, vpAnnounceCommonSymbols);
|
||||||
}
|
}
|
||||||
else if (channel->m17.contact_index)
|
else if (channel->m17.contact_index)
|
||||||
|
|
@ -464,11 +460,11 @@ void announceM17Info(channel_t* channel, VoicePromptQueueFlags_T flags)
|
||||||
#ifdef GPS_PRESENT
|
#ifdef GPS_PRESENT
|
||||||
void announceGPSInfo()
|
void announceGPSInfo()
|
||||||
{
|
{
|
||||||
if (!state.settings.gps_enabled)
|
if (!state.settings.gps_enabled) return;
|
||||||
return;
|
|
||||||
|
|
||||||
vpInit();
|
vpInit();
|
||||||
VoicePromptQueueFlags_T flags = vpqIncludeDescriptions | vpqAddSeparatingSilence;
|
VoicePromptQueueFlags_T flags =
|
||||||
|
vpqIncludeDescriptions | vpqAddSeparatingSilence;
|
||||||
|
|
||||||
vpQueueStringTableEntry(¤tLanguage->gps);
|
vpQueueStringTableEntry(¤tLanguage->gps);
|
||||||
|
|
||||||
|
|
@ -498,7 +494,7 @@ void announceGPSInfo()
|
||||||
}
|
}
|
||||||
addSilenceIfNeeded(flags);
|
addSilenceIfNeeded(flags);
|
||||||
|
|
||||||
switch(state.gps_data.fix_type)
|
switch (state.gps_data.fix_type)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
vpQueueString("2D", vpAnnounceCommonSymbols);
|
vpQueueString("2D", vpAnnounceCommonSymbols);
|
||||||
|
|
@ -597,33 +593,37 @@ void announceSettingsTimeDate()
|
||||||
datetime_t local_time = utcToLocalTime(state.time, state.settings.utc_timezone);
|
datetime_t local_time = utcToLocalTime(state.time, state.settings.utc_timezone);
|
||||||
|
|
||||||
char buffer[16] = "\0";
|
char buffer[16] = "\0";
|
||||||
snprintf(buffer, 16, "%02d/%02d/%02d",
|
snprintf(buffer, 16, "%02d/%02d/%02d", local_time.date, local_time.month,
|
||||||
local_time.date, local_time.month, local_time.year);
|
local_time.year);
|
||||||
vpQueueString(buffer, (vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
vpQueueString(buffer,
|
||||||
|
(vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
||||||
|
|
||||||
snprintf(buffer, 16, "%02d:%02d:%02d",
|
snprintf(buffer, 16, "%02d:%02d:%02d", local_time.hour, local_time.minute,
|
||||||
local_time.hour, local_time.minute, local_time.second);
|
local_time.second);
|
||||||
vpQueueString(buffer, (vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
vpQueueString(buffer,
|
||||||
|
(vpAnnounceCommonSymbols | vpAnnounceLessCommonSymbols));
|
||||||
|
|
||||||
vpPlay();
|
vpPlay();
|
||||||
}
|
}
|
||||||
#endif // RTC_PRESENT
|
#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 GetQueueFlagsForVoiceLevel()
|
||||||
{
|
{
|
||||||
VoicePromptQueueFlags_T flags = vpqInit | vpqAddSeparatingSilence;
|
VoicePromptQueueFlags_T flags = vpqInit | vpqAddSeparatingSilence;
|
||||||
|
|
@ -634,24 +634,23 @@ VoicePromptQueueFlags_T GetQueueFlagsForVoiceLevel()
|
||||||
case vpNone:
|
case vpNone:
|
||||||
case vpBeep:
|
case vpBeep:
|
||||||
return vpqDefault;
|
return vpqDefault;
|
||||||
// play some immediately, other things on demand.
|
// Play some immediately, other things on demand.
|
||||||
case vpLow:
|
case vpLow:
|
||||||
flags |= vpqPlayImmediatelyAtMediumOrHigher;
|
flags |= vpqPlayImmediatelyAtMediumOrHigher;
|
||||||
break;
|
break;
|
||||||
// play all immediatley but without extra descriptions
|
// Play all immediately but without extra descriptions
|
||||||
case vpMedium:
|
case vpMedium:
|
||||||
{
|
{
|
||||||
flags |= vpqPlayImmediately;
|
flags |= vpqPlayImmediately;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// play immediatley with descriptions unless speech is in progress.
|
// Play immediately with descriptions unless speech is in progress.
|
||||||
case vpHigh:
|
case vpHigh:
|
||||||
flags |= vpqPlayImmediately;
|
flags |= vpqPlayImmediately;
|
||||||
if (!vpIsPlaying())
|
if (!vpIsPlaying()) flags |= vpqIncludeDescriptions;
|
||||||
flags |= vpqIncludeDescriptions;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,23 +17,25 @@
|
||||||
* 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"
|
||||||
|
#include "ui/UIStrings.h"
|
||||||
|
|
||||||
|
const uint32_t VOICE_PROMPTS_DATA_MAGIC = 0x5056; //'VP'
|
||||||
const uint32_t VOICE_PROMPTS_DATA_VERSION = 0x1000; // v1000 OpenRTX
|
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
|
||||||
{
|
{
|
||||||
|
|
@ -45,7 +47,10 @@ typedef struct
|
||||||
// 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
|
||||||
|
|
@ -71,16 +76,11 @@ typedef struct
|
||||||
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
|
||||||
|
|
@ -90,47 +90,53 @@ const userDictEntry userDictionary[]=
|
||||||
{"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},
|
{"channel", PROMPT_CHANNEL}, {0, 0}};
|
||||||
{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) *
|
||||||
|
// VOICE_PROMPTS_TOC_SIZE);
|
||||||
|
vpFlashDataAddress = VOICE_PROMPTS_FLASH_HEADER_ADDRESS +
|
||||||
|
sizeof(voicePromptsDataHeader_t) +
|
||||||
|
sizeof(uint32_t) * VOICE_PROMPTS_TOC_SIZE;
|
||||||
}
|
}
|
||||||
if (vpDataIsLoaded)
|
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))
|
if ((kbd_getKeys() & KEY_HASH) && (state.settings.vpLevel <= vpBeep))
|
||||||
state.settings.vpLevel = vpHigh;
|
state.settings.vpLevel = vpHigh;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // ensure we at least have beeps in the event no voice prompts are loaded.
|
{ // ensure we at least have beeps in the event no voice prompts are
|
||||||
if (state.settings.vpLevel > vpBeep)
|
// loaded.
|
||||||
state.settings.vpLevel = vpBeep;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -139,31 +145,36 @@ 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
|
||||||
|
// *)&Codec2Data[promptDataPosition], 3);
|
||||||
promptDataPosition += 27;
|
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];
|
||||||
|
GetCodec2Data(tableOfContents[promptNumber],
|
||||||
|
currentPromptLength);
|
||||||
}
|
}
|
||||||
else
|
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();
|
vpTerminate();
|
||||||
}
|
}
|
||||||
|
|
@ -176,9 +187,11 @@ void vpTick(void)
|
||||||
{
|
{
|
||||||
promptTail--;
|
promptTail--;
|
||||||
|
|
||||||
/*if ((promptTail == 0) && trxCarrierDetected() && (trxGetMode() == RADIO_MODE_ANALOG))
|
/*if ((promptTail == 0) && trxCarrierDetected() && (trxGetMode() ==
|
||||||
|
RADIO_MODE_ANALOG))
|
||||||
{// ToDo enable amp.
|
{// 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)
|
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;
|
||||||
|
|
@ -212,8 +225,7 @@ void vpInit(void)
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
@ -230,12 +242,12 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -244,46 +256,50 @@ static uint16_t UserDictLookup(char* ptr, int* advanceBy)
|
||||||
}
|
}
|
||||||
|
|
||||||
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[] =
|
||||||
|
"%.+-*#!,@:?()~/[]<>=$'`&|_^{}"; // Must match order of symbols in
|
||||||
|
// voicePrompt_t enum.
|
||||||
const char commonSymbols[] = "%.+-*#";
|
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)
|
||||||
{
|
{
|
||||||
|
|
@ -297,21 +313,20 @@ void vpQueueString(char *promptString, VoicePromptFlags_T flags)
|
||||||
}
|
}
|
||||||
else if ((*promptString >= 'A') && (*promptString <= 'Z'))
|
else if ((*promptString >= 'A') && (*promptString <= 'Z'))
|
||||||
{
|
{
|
||||||
if (flags&vpAnnounceCaps)
|
if (flags & vpAnnounceCaps) vpQueuePrompt(PROMPT_CAP);
|
||||||
vpQueuePrompt(PROMPT_CAP);
|
if (flags & vpAnnouncePhoneticRendering)
|
||||||
if (flags&vpAnnouncePhoneticRendering)
|
|
||||||
vpQueuePrompt((*promptString - 'A') + PROMPT_A_PHONETIC);
|
vpQueuePrompt((*promptString - 'A') + PROMPT_A_PHONETIC);
|
||||||
else
|
else
|
||||||
vpQueuePrompt(*promptString - 'A' + PROMPT_A);
|
vpQueuePrompt(*promptString - 'A' + PROMPT_A);
|
||||||
}
|
}
|
||||||
else if ((*promptString >= 'a') && (*promptString <= 'z'))
|
else if ((*promptString >= 'a') && (*promptString <= 'z'))
|
||||||
{
|
{
|
||||||
if (flags&vpAnnouncePhoneticRendering)
|
if (flags & vpAnnouncePhoneticRendering)
|
||||||
vpQueuePrompt((*promptString - 'a') + PROMPT_A_PHONETIC);
|
vpQueuePrompt((*promptString - 'a') + PROMPT_A_PHONETIC);
|
||||||
else
|
else
|
||||||
vpQueuePrompt(*promptString - 'a' + PROMPT_A);
|
vpQueuePrompt(*promptString - 'a' + PROMPT_A);
|
||||||
}
|
}
|
||||||
else if ((*promptString==' ') && (flags&vpAnnounceSpace))
|
else if ((*promptString == ' ') && (flags & vpAnnounceSpace))
|
||||||
{
|
{
|
||||||
vpQueuePrompt(PROMPT_SPACE);
|
vpQueuePrompt(PROMPT_SPACE);
|
||||||
}
|
}
|
||||||
|
|
@ -322,7 +337,8 @@ void vpQueueString(char *promptString, VoicePromptFlags_T flags)
|
||||||
else // announce ASCII
|
else // announce ASCII
|
||||||
{
|
{
|
||||||
int32_t val = *promptString;
|
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);
|
vpQueueInteger(val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -334,15 +350,12 @@ void vpQueueString(char *promptString, VoicePromptFlags_T flags)
|
||||||
|
|
||||||
promptString++;
|
promptString++;
|
||||||
}
|
}
|
||||||
if (flags & vpqAddSeparatingSilence)
|
if (flags & vpqAddSeparatingSilence) vpQueuePrompt(PROMPT_SILENCE);
|
||||||
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);
|
||||||
|
|
@ -353,39 +366,39 @@ void vpQueueInteger(int32_t value)
|
||||||
// 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 - ¤tLanguage->languageName));
|
vpQueuePrompt(NUM_VOICE_PROMPTS +
|
||||||
|
(stringTableStringPtr - ¤tLanguage->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 =
|
||||||
|
tableOfContents[promptNumber + 1] - tableOfContents[promptNumber];
|
||||||
GetCodec2Data(tableOfContents[promptNumber], currentPromptLength);
|
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,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
|
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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue