Apply clang-format
This commit is contained in:
parent
29de1d36d4
commit
1f71789a9d
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 *)(¤tLanguage->languageName + offset));
|
||||
else // just spel it out
|
||||
vpQueueStringTableEntry(
|
||||
(const char* const*)(¤tLanguage->languageName + offset));
|
||||
else // Just spell it out
|
||||
vpQueueString(text, vpAnnounceCommonSymbols);
|
||||
|
||||
vpPlayIfNeeded(flags);
|
||||
}
|
||||
|
||||
void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled, uint8_t txTone, VoicePromptQueueFlags_T flags)
|
||||
void announceCTCSS(bool rxToneEnabled, uint8_t rxTone, bool txToneEnabled,
|
||||
uint8_t txTone, VoicePromptQueueFlags_T flags)
|
||||
{
|
||||
vpInitIfNeeded(flags);
|
||||
|
||||
|
|
@ -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(¤tLanguage->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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 - ¤tLanguage->languageName));
|
||||
vpQueuePrompt(NUM_VOICE_PROMPTS +
|
||||
(stringTableStringPtr - ¤tLanguage->languageName));
|
||||
}
|
||||
|
||||
void vpPlay(void)
|
||||
{
|
||||
if (state.settings.vpLevel < vpLow)
|
||||
return;
|
||||
if (state.settings.vpLevel < vpLow) return;
|
||||
|
||||
if ((voicePromptIsActive == false) && (vpCurrentSequence.Length > 0))
|
||||
{
|
||||
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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*);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue