Apply clang-format

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

View File

@ -21,9 +21,9 @@
#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();
@ -55,14 +57,16 @@ 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 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

View File

@ -135,7 +135,8 @@ PROMPT_ALTITUDE, // altitude
PROMPT_SATELLITES, // satellites
PROMPT_COMPASS, // compass
PROMPT_DEGREES, // degrees
PROMPT_VP_UNAVAILABLE, // Voice prompts will be unavailable during this operation.
PROMPT_VP_UNAVAILABLE, // Voice prompts will be unavailable during this
// operation.
PROMPT_CHARACTER, // character
PROMPT_SPACE, // space
PROMPT_PERCENT, // Percent
@ -181,7 +182,8 @@ NUM_VOICE_PROMPTS,
// 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

View File

@ -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",

View File

@ -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

View File

@ -16,33 +16,38 @@
* 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);
@ -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,8 +131,7 @@ void announceRadioMode(uint8_t mode, VoicePromptQueueFlags_T flags)
{
vpInitIfNeeded(flags);
if (flags & vpqIncludeDescriptions)
vpQueuePrompt(PROMPT_MODE);
if (flags & vpqIncludeDescriptions) vpQueuePrompt(PROMPT_MODE);
switch (mode)
{
@ -148,13 +151,11 @@ 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"};
vpQueueString(bandwidths[bandwidth], vpAnnounceCommonSymbols);
@ -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,7 +179,8 @@ 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;
@ -187,17 +188,16 @@ void announceChannelSummary(channel_t* channel, uint16_t channelIndex, uint16_t
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);
@ -279,22 +282,23 @@ void announceError(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 *)(&currentLanguage->languageName + offset));
else // just spel it out
vpQueueStringTableEntry(
(const char* const*)(&currentLanguage->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);
@ -318,7 +322,7 @@ void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8
vpPlayIfNeeded(flags);
return;
}
// speak the individual rx and tx tones.
// Speak the individual rx and tx tones.
if (rxToneEnabled)
{
vpQueuePrompt(PROMPT_RECEIVE);
@ -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)
{
@ -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(&currentLanguage->gps);
@ -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:
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.
* 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.
*/
VoicePromptQueueFlags_T GetQueueFlagsForVoiceLevel()
{
VoicePromptQueueFlags_T flags = vpqInit | vpqAddSeparatingSilence;
@ -634,21 +634,20 @@ 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;
}

View File

@ -17,14 +17,16 @@
* 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'
const uint32_t VOICE_PROMPTS_DATA_VERSION = 0x1000; // v1000 OpenRTX
@ -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,20 +90,24 @@ 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));
// 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 ;
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.
@ -111,9 +115,9 @@ void vpCacheInit(void)
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;
}
}
@ -121,7 +125,8 @@ bool vpCheckHeader(uint32_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)
@ -130,7 +135,8 @@ static void GetCodec2Data(int offset,int length)
{ // 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);
}
}
@ -142,7 +148,8 @@ void vpTick(void)
{ // 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;
}
@ -155,13 +162,17 @@ void vpTick(void)
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)
{
@ -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.
}*/
}
}
@ -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)
{
@ -244,15 +256,20 @@ 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;
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);
@ -265,22 +282,21 @@ VoicePromptFlags_T flags, voicePrompt_t* vp)
*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)
{
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;
@ -297,8 +313,7 @@ void vpQueueString(char *promptString, VoicePromptFlags_T flags)
}
else if ((*promptString >= 'A') && (*promptString <= 'Z'))
{
if (flags&vpAnnounceCaps)
vpQueuePrompt(PROMPT_CAP);
if (flags & vpAnnounceCaps) vpQueuePrompt(PROMPT_CAP);
if (flags & vpAnnouncePhoneticRendering)
vpQueuePrompt((*promptString - 'A') + PROMPT_A_PHONETIC);
else
@ -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);
@ -355,20 +368,19 @@ void vpQueueInteger(int32_t value)
// NUM_VOICE_PROMPTS + (stringTableStringPtr - currentLanguage->languageName)
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 - &currentLanguage->languageName));
vpQueuePrompt(NUM_VOICE_PROMPTS +
(stringTableStringPtr - &currentLanguage->languageName));
}
void vpPlay(void)
{
if (state.settings.vpLevel < vpLow)
return;
if (state.settings.vpLevel < vpLow) return;
if ((voicePromptIsActive == false) && (vpCurrentSequence.Length > 0))
{
@ -377,15 +389,16 @@ void vpPlay(void)
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
// 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);
promptDataPosition = 0;
}
}

View File

@ -18,19 +18,21 @@
* 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>
#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,
search the english string table and return the offset if found.
@ -39,8 +41,7 @@ struct, or to announce an indexed voice prompt.
*/
int GetEnglishStringTableOffset(char* text)
{
if (!text || !*text)
return -1; // error.
if (!text || !*text) return -1; // error.
uint8_t stringCount = sizeof(stringsTable_t) / sizeof(char*);