Apply my changes v1
Some checks failed
Build Firmware / build (push) Failing after 3m21s

This commit is contained in:
2025-02-27 16:49:04 +01:00
parent ba5257f2f6
commit f4ff2e6048
37 changed files with 3890 additions and 4607 deletions

View File

@@ -4,12 +4,12 @@
# 1 = enable # 1 = enable
# ---- STOCK QUANSHENG FEATURES ---- # ---- STOCK QUANSHENG FEATURES ----
ENABLE_FMRADIO ?= 0 ENABLE_FMRADIO ?= 1
ENABLE_UART ?= 1 ENABLE_UART ?= 1
ENABLE_AIRCOPY ?= 0 ENABLE_AIRCOPY ?= 0
ENABLE_NOAA ?= 0 ENABLE_NOAA ?= 0
ENABLE_VOICE ?= 0 ENABLE_VOICE ?= 0
ENABLE_VOX ?= 1 ENABLE_VOX ?= 0
ENABLE_ALARM ?= 0 ENABLE_ALARM ?= 0
ENABLE_TX1750 ?= 1 ENABLE_TX1750 ?= 1
ENABLE_PWRON_PASSWORD ?= 0 ENABLE_PWRON_PASSWORD ?= 0
@@ -17,15 +17,15 @@ ENABLE_DTMF_CALLING ?= 0
ENABLE_FLASHLIGHT ?= 1 ENABLE_FLASHLIGHT ?= 1
# ---- CUSTOM MODS ---- # ---- CUSTOM MODS ----
ENABLE_SPECTRUM ?= 0 ENABLE_SPECTRUM ?= 1
ENABLE_BIG_FREQ ?= 1 ENABLE_BIG_FREQ ?= 0
ENABLE_SMALL_BOLD ?= 1 ENABLE_SMALL_BOLD ?= 0
ENABLE_CUSTOM_MENU_LAYOUT ?= 1 ENABLE_CUSTOM_MENU_LAYOUT ?= 1
ENABLE_KEEP_MEM_NAME ?= 1 ENABLE_KEEP_MEM_NAME ?= 1
ENABLE_WIDE_RX ?= 1 ENABLE_WIDE_RX ?= 1
ENABLE_TX_WHEN_AM ?= 0 ENABLE_TX_WHEN_AM ?= 0
ENABLE_F_CAL_MENU ?= 0 ENABLE_F_CAL_MENU ?= 1
ENABLE_CTCSS_TAIL_PHASE_SHIFT ?= 0 ENABLE_CTCSS_TAIL_PHASE_SHIFT ?= 1
ENABLE_BOOT_BEEPS ?= 0 ENABLE_BOOT_BEEPS ?= 0
ENABLE_SHOW_CHARGE_LEVEL ?= 0 ENABLE_SHOW_CHARGE_LEVEL ?= 0
ENABLE_REVERSE_BAT_SYMBOL ?= 0 ENABLE_REVERSE_BAT_SYMBOL ?= 0
@@ -36,26 +36,26 @@ ENABLE_FASTER_CHANNEL_SCAN ?= 1
ENABLE_RSSI_BAR ?= 1 ENABLE_RSSI_BAR ?= 1
ENABLE_AUDIO_BAR ?= 1 ENABLE_AUDIO_BAR ?= 1
ENABLE_COPY_CHAN_TO_VFO ?= 1 ENABLE_COPY_CHAN_TO_VFO ?= 1
ENABLE_REDUCE_LOW_MID_TX_POWER ?= 0 ENABLE_REDUCE_LOW_MID_TX_POWER ?= 1
ENABLE_BYP_RAW_DEMODULATORS ?= 0 ENABLE_BYP_RAW_DEMODULATORS ?= 1
ENABLE_BLMIN_TMP_OFF ?= 0 ENABLE_BLMIN_TMP_OFF ?= 1
ENABLE_SCAN_RANGES ?= 1 ENABLE_SCAN_RANGES ?= 1
ENABLE_FEAT_F4HWN ?= 1 ENABLE_FEAT_F4HWN ?= 1
ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0 ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0
ENABLE_FEAT_F4HWN_SPECTRUM ?= 1 ENABLE_FEAT_F4HWN_SPECTRUM ?= 1
ENABLE_FEAT_F4HWN_RX_TX_TIMER ?= 1 ENABLE_FEAT_F4HWN_RX_TX_TIMER ?= 0
ENABLE_FEAT_F4HWN_CHARGING_C ?= 0 ENABLE_FEAT_F4HWN_CHARGING_C ?= 0
ENABLE_FEAT_F4HWN_SLEEP ?= 1 ENABLE_FEAT_F4HWN_SLEEP ?= 1
ENABLE_FEAT_F4HWN_RESUME_STATE ?= 1 ENABLE_FEAT_F4HWN_RESUME_STATE ?= 1
ENABLE_FEAT_F4HWN_NARROWER ?= 1 ENABLE_FEAT_F4HWN_NARROWER ?= 1
ENABLE_FEAT_F4HWN_INV ?= 1 ENABLE_FEAT_F4HWN_INV ?= 0
ENABLE_FEAT_F4HWN_CTR ?= 1 ENABLE_FEAT_F4HWN_CTR ?= 1
ENABLE_FEAT_F4HWN_RESCUE_OPS ?= 0 ENABLE_FEAT_F4HWN_RESCUE_OPS ?= 0
ENABLE_FEAT_F4HWN_VOL ?= 0 ENABLE_FEAT_F4HWN_VOL ?= 1
ENABLE_FEAT_F4HWN_RESET_CHANNEL ?= 0 ENABLE_FEAT_F4HWN_RESET_CHANNEL ?= 0
ENABLE_FEAT_F4HWN_PMR ?= 0 ENABLE_FEAT_F4HWN_PMR ?= 0
ENABLE_FEAT_F4HWN_GMRS_FRS_MURS ?= 0 ENABLE_FEAT_F4HWN_GMRS_FRS_MURS ?= 0
ENABLE_FEAT_F4HWN_CA ?= 1 ENABLE_FEAT_F4HWN_CA ?= 0
ENABLE_FEAT_F4HWN_DEBUG ?= 0 ENABLE_FEAT_F4HWN_DEBUG ?= 0
ENABLE_REGA ?= 0 ENABLE_REGA ?= 0
@@ -138,6 +138,7 @@ OBJS += app/app.o
OBJS += app/chFrScanner.o OBJS += app/chFrScanner.o
OBJS += app/common.o OBJS += app/common.o
OBJS += app/dtmf.o OBJS += app/dtmf.o
OBJS += app/fskmodem.o
ifeq ($(ENABLE_REGA),1) ifeq ($(ENABLE_REGA),1)
OBJS += app/rega.o OBJS += app/rega.o
endif endif

View File

@@ -45,16 +45,13 @@ uint8_t gAirCopyIsSendMode;
uint16_t g_FSK_Buffer[36]; uint16_t g_FSK_Buffer[36];
static void AIRCOPY_clear() static void AIRCOPY_clear() {
{ for (uint8_t i = 0; i < 15; i++) {
for (uint8_t i = 0; i < 15; i++)
{
crc[i] = 0; crc[i] = 0;
} }
} }
bool AIRCOPY_SendMessage(void) bool AIRCOPY_SendMessage(void) {
{
static uint8_t gAircopySendCountdown = 1; static uint8_t gAircopySendCountdown = 1;
if (gAircopyState != AIRCOPY_TRANSFER) { if (gAircopyState != AIRCOPY_TRANSFER) {
@@ -94,8 +91,7 @@ bool AIRCOPY_SendMessage(void)
return 0; return 0;
} }
void AIRCOPY_StorePacket(void) void AIRCOPY_StorePacket(void) {
{
if (gFSKWriteIndex < 36) { if (gFSKWriteIndex < 36) {
return; return;
} }
@@ -146,8 +142,7 @@ void AIRCOPY_StorePacket(void)
gAirCopyBlockNumber++; gAirCopyBlockNumber++;
} }
static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
{
if (bKeyHeld || !bKeyPressed) { if (bKeyHeld || !bKeyPressed) {
return; return;
} }
@@ -194,8 +189,7 @@ static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gRequestDisplayScreen = DISPLAY_AIRCOPY; gRequestDisplayScreen = DISPLAY_AIRCOPY;
} }
static void AIRCOPY_Key_EXIT(bool bKeyPressed, bool bKeyHeld) static void AIRCOPY_Key_EXIT(bool bKeyPressed, bool bKeyHeld) {
{
if (bKeyHeld || !bKeyPressed) { if (bKeyHeld || !bKeyPressed) {
return; return;
} }
@@ -220,8 +214,7 @@ static void AIRCOPY_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
gRequestDisplayScreen = DISPLAY_AIRCOPY; gRequestDisplayScreen = DISPLAY_AIRCOPY;
} }
static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld) static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld) {
{
if (bKeyHeld || !bKeyPressed) { if (bKeyHeld || !bKeyPressed) {
return; return;
} }
@@ -242,8 +235,7 @@ static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld)
gAircopyState = AIRCOPY_TRANSFER; gAircopyState = AIRCOPY_TRANSFER;
} }
void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
{
switch (Key) { switch (Key) {
case KEY_0: case KEY_0:
case KEY_1: case KEY_1:

472
app/app.c

File diff suppressed because it is too large Load Diff

View File

@@ -24,12 +24,20 @@
#include "radio.h" #include "radio.h"
void APP_EndTransmission(void); void APP_EndTransmission(void);
void APP_StartListening(FUNCTION_Type_t function); void APP_StartListening(FUNCTION_Type_t function);
uint32_t APP_SetFreqByStepAndLimits(VFO_Info_t *pInfo, int8_t direction, uint32_t lower, uint32_t upper); uint32_t APP_SetFreqByStepAndLimits(VFO_Info_t *pInfo, int8_t direction, uint32_t lower, uint32_t upper);
uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t direction); uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t direction);
void APP_Update(void); void APP_Update(void);
void APP_TimeSlice10ms(void); void APP_TimeSlice10ms(void);
void APP_TimeSlice500ms(void); void APP_TimeSlice500ms(void);
void APP_EndTransmission(void);
#endif #endif

View File

@@ -248,7 +248,7 @@ void DTMF_HandleRequest(void)
return; return;
} }
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED) if (!gRxVfo->DTMF_DECODING_ENABLE)
{ // D-DCD is disabled or we're alive { // D-DCD is disabled or we're alive
DTMF_clear_RX(); DTMF_clear_RX();
return; return;
@@ -266,28 +266,28 @@ void DTMF_HandleRequest(void)
if (CompareMessage(gDTMF_RX + Offset, String, strlen(String), true)) if (CompareMessage(gDTMF_RX + Offset, String, strlen(String), true))
{ // bugger { // bugger
if (gEeprom.PERMIT_REMOTE_KILL) // if (gEeprom.PERMIT_REMOTE_KILL)
{ // {
gSetting_KILLED = true; // oooerr ! // gSetting_KILLED = true; // oooerr !
//
DTMF_clear_RX(); // DTMF_clear_RX();
//
SETTINGS_SaveSettings(); // SETTINGS_SaveSettings();
//
gDTMF_ReplyState = DTMF_REPLY_AB; // gDTMF_ReplyState = DTMF_REPLY_AB;
//
#ifdef ENABLE_FMRADIO // #ifdef ENABLE_FMRADIO
if (gFmRadioMode) // if (gFmRadioMode)
{ // {
FM_TurnOff(); // FM_TurnOff();
GUI_SelectNextDisplay(DISPLAY_MAIN); // GUI_SelectNextDisplay(DISPLAY_MAIN);
} // }
#endif // #endif
} // }
else // else
{ // {
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
} // }
gDTMF_CallState = DTMF_CALL_STATE_NONE; gDTMF_CallState = DTMF_CALL_STATE_NONE;
@@ -297,30 +297,30 @@ void DTMF_HandleRequest(void)
} }
} }
if (gDTMF_RX_index >= 9) // if (gDTMF_RX_index >= 9)
{ // look for the REVIVE code // { // look for the REVIVE code
//
sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.REVIVE_CODE); // sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.REVIVE_CODE);
//
Offset = gDTMF_RX_index - strlen(String); // Offset = gDTMF_RX_index - strlen(String);
//
if (CompareMessage(gDTMF_RX + Offset, String, strlen(String), true)) // if (CompareMessage(gDTMF_RX + Offset, String, strlen(String), true))
{ // shit, we're back ! // { // shit, we're back !
//
gSetting_KILLED = false; // gSetting_KILLED = false;
//
DTMF_clear_RX(); // DTMF_clear_RX();
//
SETTINGS_SaveSettings(); // SETTINGS_SaveSettings();
//
gDTMF_ReplyState = DTMF_REPLY_AB; // gDTMF_ReplyState = DTMF_REPLY_AB;
gDTMF_CallState = DTMF_CALL_STATE_NONE; // gDTMF_CallState = DTMF_CALL_STATE_NONE;
//
gUpdateDisplay = true; // gUpdateDisplay = true;
gUpdateStatus = true; // gUpdateStatus = true;
return; // return;
} // }
} // }
if (gDTMF_RX_index >= 2) if (gDTMF_RX_index >= 2)
{ // look for ACK reply { // look for ACK reply
@@ -360,7 +360,7 @@ void DTMF_HandleRequest(void)
} }
} }
if (gSetting_KILLED || gDTMF_CallState != DTMF_CALL_STATE_NONE) if (gDTMF_CallState != DTMF_CALL_STATE_NONE)
{ // we've been killed or expecting a reply { // we've been killed or expecting a reply
return; return;
} }

View File

@@ -20,15 +20,21 @@
#include "app/app.h" #include "app/app.h"
#include "app/chFrScanner.h" #include "app/chFrScanner.h"
#include "app/common.h" #include "app/common.h"
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
#include "app/fm.h" #include "app/fm.h"
#endif #endif
#include "app/generic.h" #include "app/generic.h"
#include "app/main.h" #include "app/main.h"
#include "app/scanner.h" #include "app/scanner.h"
#ifdef ENABLE_SPECTRUM #ifdef ENABLE_SPECTRUM
#include "app/spectrum.h" #include "app/spectrum.h"
#endif #endif
#include "audio.h" #include "audio.h"
@@ -43,8 +49,22 @@
#include "ui/ui.h" #include "ui/ui.h"
#include <stdlib.h> #include <stdlib.h>
static void toggle_chan_scanlist(void) #define T9Count 9
{ // toggle the selected channels scanlist setting
const char T9Table[10][T9Count] = {
{'#', '(', ')', ';', ':', '<', '>', '/', '0'},
{',', '.', '?', '&', '!', ' ', '-', '_', '1'},
{'a', 'b', 'c', 'A', 'B', 'C', '[', ']', '2'},
{'d', 'e', 'f', 'D', 'E', 'F', '@', '%', '3'},
{'g', 'h', 'i', 'G', 'H', 'I', '~', '$', '4'},
{'j', 'k', 'l', 'J', 'K', 'L', '|', '*', '5'},
{'m', 'n', 'o', 'M', 'N', 'O', '{', '}', '6'},
{'p', 'q', 'r', 's', 'P', 'Q', 'R', 'S', '7'},
{'t', 'u', 'v', 'T', 'U', 'V', '"', '\'', '8'},
{'w', 'x', 'y', 'z', 'W', 'X', 'Y', 'Z', '9'}
};
static void toggle_chan_scanlist(void) { // toggle the selected channels scanlist setting
if (SCANNER_IsScanning()) if (SCANNER_IsScanning())
return; return;
@@ -60,13 +80,13 @@ static void toggle_chan_scanlist(void)
} }
// Remove exclude // Remove exclude
if(gMR_ChannelExclude[gTxVfo->CHANNEL_SAVE] == true) if (gMR_ChannelExclude[gTxVfo->CHANNEL_SAVE] == true) {
{
gMR_ChannelExclude[gTxVfo->CHANNEL_SAVE] = false; gMR_ChannelExclude[gTxVfo->CHANNEL_SAVE] = false;
return; return;
} }
uint8_t scanTmp = gTxVfo->SCANLIST1_PARTICIPATION | (gTxVfo->SCANLIST2_PARTICIPATION << 1) | (gTxVfo->SCANLIST3_PARTICIPATION << 2); uint8_t scanTmp = gTxVfo->SCANLIST1_PARTICIPATION | (gTxVfo->SCANLIST2_PARTICIPATION << 1) |
(gTxVfo->SCANLIST3_PARTICIPATION << 2);
scanTmp = (scanTmp++ < 7) ? scanTmp : 0; scanTmp = (scanTmp++ < 7) ? scanTmp : 0;
@@ -80,8 +100,7 @@ static void toggle_chan_scanlist(void)
gFlagResetVfos = true; gFlagResetVfos = true;
} }
static void processFKeyFunction(const KEY_Code_t Key, const bool beep) static void processFKeyFunction(const KEY_Code_t Key, const bool beep) {
{
uint8_t Vfo = gEeprom.TX_VFO; uint8_t Vfo = gEeprom.TX_VFO;
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
@@ -126,16 +145,14 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
if (gScanStateDir != SCAN_OFF) { if (gScanStateDir != SCAN_OFF) {
if (gCurrentFunction != FUNCTION_INCOMING || if (gCurrentFunction != FUNCTION_INCOMING ||
gRxReceptionMode == RX_MODE_NONE || gRxReceptionMode == RX_MODE_NONE ||
gScanPauseDelayIn_10ms == 0) gScanPauseDelayIn_10ms == 0) { // scan is running (not paused)
{ // scan is running (not paused)
return; return;
} }
} }
const uint8_t vfo = gEeprom.TX_VFO; const uint8_t vfo = gEeprom.TX_VFO;
if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo])) if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo])) { // copy channel to VFO, then swap to the VFO
{ // copy channel to VFO, then swap to the VFO
gEeprom.ScreenChannel[vfo] = FREQ_CHANNEL_FIRST + gEeprom.VfoInfo[vfo].Band; gEeprom.ScreenChannel[vfo] = FREQ_CHANNEL_FIRST + gEeprom.VfoInfo[vfo].Band;
gEeprom.VfoInfo[vfo].CHANNEL_SAVE = gEeprom.ScreenChannel[vfo]; gEeprom.VfoInfo[vfo].CHANNEL_SAVE = gEeprom.ScreenChannel[vfo];
@@ -234,8 +251,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
APP_RunSpectrum(); APP_RunSpectrum();
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
#endif #endif
} } else {
else {
toggle_chan_scanlist(); toggle_chan_scanlist();
} }
@@ -290,12 +306,10 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
case KEY_SIDE1: case KEY_SIDE1:
uint8_t a = FREQUENCY_GetSortedIdxFromStepIdx(gTxVfo->STEP_SETTING); uint8_t a = FREQUENCY_GetSortedIdxFromStepIdx(gTxVfo->STEP_SETTING);
if (a < STEP_N_ELEM - 1) if (a < STEP_N_ELEM - 1) {
{
gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(a + 1); gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(a + 1);
} }
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) {
{
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
} }
gVfoConfigureMode = VFO_CONFIGURE; gVfoConfigureMode = VFO_CONFIGURE;
@@ -303,12 +317,10 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
break; break;
case KEY_SIDE2: case KEY_SIDE2:
uint8_t b = FREQUENCY_GetSortedIdxFromStepIdx(gTxVfo->STEP_SETTING); uint8_t b = FREQUENCY_GetSortedIdxFromStepIdx(gTxVfo->STEP_SETTING);
if (b > 0) if (b > 0) {
{
gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(b - 1); gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(b - 1);
} }
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) {
{
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
} }
gVfoConfigureMode = VFO_CONFIGURE; gVfoConfigureMode = VFO_CONFIGURE;
@@ -326,8 +338,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
} }
} }
void channelMove(uint16_t Channel) void channelMove(uint16_t Channel) {
{
const uint8_t Vfo = gEeprom.TX_VFO; const uint8_t Vfo = gEeprom.TX_VFO;
if (!RADIO_CheckValidChannel(Channel, false, 0)) { if (!RADIO_CheckValidChannel(Channel, false, 0)) {
@@ -400,8 +411,7 @@ void channelMoveSwitch(void) {
} }
} }
static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
{
if (bKeyHeld) { // key held down if (bKeyHeld) { // key held down
if (bKeyPressed) { if (bKeyPressed) {
if (gScreenToDisplay == DISPLAY_MAIN) { if (gScreenToDisplay == DISPLAY_MAIN) {
@@ -419,8 +429,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
return; return;
} }
if (bKeyPressed) if (bKeyPressed) { // key is pressed
{ // key is pressed
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; // beep when key is pressed gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; // beep when key is pressed
return; // don't use the key till it's released return; // don't use the key till it's released
} }
@@ -463,8 +472,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
// #ifdef ENABLE_NOAA // #ifdef ENABLE_NOAA
// if (!IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) // if (!IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
// #endif // #endif
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering a frequency
{ // user is entering a frequency
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
@@ -479,7 +487,8 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
return; return;
} }
gKeyInputCountdown = (gInputBoxIndex == totalDigits) ? (key_input_timeout_500ms / 16) : (key_input_timeout_500ms / 3); gKeyInputCountdown = (gInputBoxIndex == totalDigits) ? (key_input_timeout_500ms / 16) : (
key_input_timeout_500ms / 3);
const char *inputStr = INPUTBOX_GetAscii(); const char *inputStr = INPUTBOX_GetAscii();
uint8_t inputLength = gInputBoxIndex; uint8_t inputLength = gInputBoxIndex;
@@ -500,12 +509,10 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
// clamp the frequency entered to some valid value // clamp the frequency entered to some valid value
if (Frequency < frequencyBandTable[0].lower) { if (Frequency < frequencyBandTable[0].lower) {
Frequency = frequencyBandTable[0].lower; Frequency = frequencyBandTable[0].lower;
} } else if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) {
else if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) {
const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2; const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2;
Frequency = (Frequency < center) ? BX4819_band1.upper : BX4819_band2.lower; Frequency = (Frequency < center) ? BX4819_band1.upper : BX4819_band2.lower;
} } else if (Frequency > frequencyBandTable[BAND_N_ELEM - 1].upper) {
else if (Frequency > frequencyBandTable[BAND_N_ELEM - 1].upper) {
Frequency = frequencyBandTable[BAND_N_ELEM - 1].upper; Frequency = frequencyBandTable[BAND_N_ELEM - 1].upper;
} }
@@ -523,8 +530,8 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
Frequency = FREQUENCY_RoundToStep(Frequency, gTxVfo->StepFrequency); Frequency = FREQUENCY_RoundToStep(Frequency, gTxVfo->StepFrequency);
if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) if (Frequency >= BX4819_band1.upper &&
{ // clamp the frequency to the limit Frequency < BX4819_band2.lower) { // clamp the frequency to the limit
const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2; const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2;
Frequency = (Frequency < center) ? BX4819_band1.upper - gTxVfo->StepFrequency : BX4819_band2.lower; Frequency = (Frequency < center) ? BX4819_band1.upper - gTxVfo->StepFrequency : BX4819_band2.lower;
} }
@@ -572,13 +579,10 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gWasFKeyPressed = false; gWasFKeyPressed = false;
gUpdateStatus = true; gUpdateStatus = true;
if(Key == 8) if (Key == 8) {
{
ACTION_BackLightOnDemand(); ACTION_BackLightOnDemand();
return; return;
} } else if (Key == 9) {
else if(Key == 9)
{
ACTION_BackLight(); ACTION_BackLight();
return; return;
} }
@@ -586,8 +590,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
processFKeyFunction(Key, true); processFKeyFunction(Key, true);
} }
static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) {
{
if (!bKeyHeld && bKeyPressed) { // exit key pressed if (!bKeyHeld && bKeyPressed) { // exit key pressed
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
@@ -615,8 +618,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
if (gInputBoxIndex == 0) if (gInputBoxIndex == 0)
gAnotherVoiceID = VOICE_ID_CANCEL; gAnotherVoiceID = VOICE_ID_CANCEL;
#endif #endif
} } else {
else {
gScanKeepResult = false; gScanKeepResult = false;
CHFRSCANNER_Stop(); CHFRSCANNER_Stop();
@@ -636,8 +638,8 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
} }
if (bKeyHeld && bKeyPressed) { // exit key held down if (bKeyHeld && bKeyPressed) { // exit key held down
if (gInputBoxIndex > 0 || gDTMF_InputBox_Index > 0 || gDTMF_InputMode) if (gInputBoxIndex > 0 || gDTMF_InputBox_Index > 0 ||
{ // cancel key input mode (channel/frequency entry) gDTMF_InputMode) { // cancel key input mode (channel/frequency entry)
gDTMF_InputMode = false; gDTMF_InputMode = false;
gDTMF_InputBox_Index = 0; gDTMF_InputBox_Index = 0;
memset(gDTMF_String, 0, sizeof(gDTMF_String)); memset(gDTMF_String, 0, sizeof(gDTMF_String));
@@ -648,8 +650,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
} }
} }
static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld) {
{
if (bKeyPressed && !bKeyHeld) // menu key pressed if (bKeyPressed && !bKeyHeld) // menu key pressed
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
@@ -658,10 +659,8 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld)
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
// Exclude work with list 1, 2, 3 or all list // Exclude work with list 1, 2, 3 or all list
if(gScanStateDir != SCAN_OFF) if (gScanStateDir != SCAN_OFF) {
{ if (FUNCTION_IsRx()) {
if(FUNCTION_IsRx())
{
gMR_ChannelExclude[gTxVfo->CHANNEL_SAVE] = true; gMR_ChannelExclude[gTxVfo->CHANNEL_SAVE] = true;
gVfoConfigureMode = VFO_CONFIGURE; gVfoConfigureMode = VFO_CONFIGURE;
@@ -717,15 +716,13 @@ static void MAIN_Key_MENU(bool bKeyPressed, bool bKeyHeld)
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
} }
#endif #endif
} } else {
else {
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
} }
} }
} }
static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) {
{
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
if(gEeprom.MENU_LOCK == true) { if(gEeprom.MENU_LOCK == true) {
@@ -780,8 +777,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
#ifdef ENABLE_SCAN_RANGES #ifdef ENABLE_SCAN_RANGES
&& gScanRangeStart == 0 && gScanRangeStart == 0
#endif #endif
) ) { // start entering a DTMF string
{ // start entering a DTMF string
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
memcpy(gDTMF_InputBox, gDTMF_String, MIN(sizeof(gDTMF_InputBox), sizeof(gDTMF_String) - 1)); memcpy(gDTMF_InputBox, gDTMF_String, MIN(sizeof(gDTMF_InputBox), sizeof(gDTMF_String) - 1));
gDTMF_InputBox_Index = 0; gDTMF_InputBox_Index = 0;
@@ -790,12 +786,9 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
gKeyInputCountdown = key_input_timeout_500ms; gKeyInputCountdown = key_input_timeout_500ms;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
} } else
else
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
} } else { // with the F-key
else
{ // with the F-key
gWasFKeyPressed = false; gWasFKeyPressed = false;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
@@ -816,13 +809,11 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
gUpdateStatus = true; gUpdateStatus = true;
} }
static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) {
{
#ifdef ENABLE_FEAT_F4HWN // Set Squelch F + UP or Down #ifdef ENABLE_FEAT_F4HWN // Set Squelch F + UP or Down
if (gWasFKeyPressed) { if (gWasFKeyPressed) {
switch(Direction) switch (Direction) {
{
case 1: case 1:
processFKeyFunction(KEY_UP, false); processFKeyFunction(KEY_UP, false);
break; break;
@@ -855,8 +846,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
#endif #endif
return; return;
} }
} } else { // short pressed
else { // short pressed
if (gInputBoxIndex > 0) { if (gInputBoxIndex > 0) {
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return; return;
@@ -920,8 +910,13 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
gPttWasReleased = true; gPttWasReleased = true;
} }
void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) void updatePrevChar(KEY_Code_t Key) {
{ if (Key != prevKey) {
prevKey = Key;
}
}
void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFmRadioMode && Key != KEY_PTT && Key != KEY_EXIT) { if (gFmRadioMode && Key != KEY_PTT && Key != KEY_EXIT) {
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed)
@@ -932,8 +927,7 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (gDTMF_InputMode && bKeyPressed && !bKeyHeld) { if (gDTMF_InputMode && bKeyPressed && !bKeyHeld) {
const char Character = DTMF_GetCharacter(Key); const char Character = DTMF_GetCharacter(Key);
if (Character != 0xFF) if (Character != 0xFF) { // add key to DTMF string
{ // add key to DTMF string
DTMF_Append(Character); DTMF_Append(Character);
gKeyInputCountdown = key_input_timeout_500ms; gKeyInputCountdown = key_input_timeout_500ms;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
@@ -949,31 +943,138 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
// Key = KEY_SIDE2; // what's this doing ??? // Key = KEY_SIDE2; // what's this doing ???
// } // }
if (Key == KEY_9 && bKeyHeld) {
if (bKeyPressed) {
if (gEnteringSMS == SMS_NOT_ENTERING) {
gEnteringSMS = SMS_ENTERING_DEST;
updatePrevChar(Key);
return;
}
}
}
if (Key == KEY_MENU) {
if (gEnteringSMS == SMS_ENTERING_DEST) {
if (bKeyPressed) {
memset(dataPacket.data, 0, DataPacketDataSize);
prepareDataPacket();
dataPacket.flags = 126;
gEnteringSMS = SMS_ENTERING_MESSAGE;
}
return;
}
if (gEnteringSMS == SMS_ENTERING_MESSAGE) {
if (bKeyPressed) {
if (strlen((char *) dataPacket.data)) {
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, true);
AUDIO_AudioPathOff();
gEnableSpeaker = false;
RADIO_PrepareTX();
if (gCurrentVfo->SCRAMBLING_TYPE > 0)
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
else
BK4819_DisableScramble();
MSG_FSKSendData();
AUDIO_AudioPathOn();
gEnableSpeaker = true;
BK4819_ExitTxMute();
MSG_EnableRX(true);
gVfoConfigureMode = VFO_CONFIGURE;
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false);
dataPTR = dataPacket.data;
memset(dataPacket.data, 0, DataPacketDataSize);
gEnteringSMS = SMS_NOT_ENTERING;
}
}
return;
}
}
if (Key == KEY_EXIT && gEnteringSMS != SMS_NOT_ENTERING) {
if (bKeyHeld) {
if (bKeyPressed) {
gEnteringSMS = SMS_NOT_ENTERING;
dataPTR = dataPacket.data;
memset(dataPacket.data, 0, DataPacketDataSize);
}
} else {
if (bKeyPressed) {
if (gEnteringSMS == SMS_ENTERING_MESSAGE) {
if (dataPacket.data <= dataPTR) {
*dataPTR = '\0';
if (dataPacket.data < dataPTR) {
dataPTR--;
}
*dataPTR = '\0';
}
} else if (gEnteringSMS == SMS_ENTERING_DEST) {
dataPacket.dest /= 10;
}
}
}
updatePrevChar(Key);
return;
}
if (gEnteringSMS != SMS_NOT_ENTERING && !bKeyHeld) {
if (!dataPTR) {
dataPTR = dataPacket.data;
}
if (gEnteringSMS == SMS_ENTERING_MESSAGE) {
if (bKeyPressed) {
if (prevKey != Key) {
dataPTR++;
if (dataPTR - dataPacket.data >= DataPacketDataSize) {
dataPTR = dataPacket.data;
}
prevLetter = 0;
}
*(dataPTR - 1) = T9Table[Key][(prevLetter++) % T9Count];
updatePrevChar(Key);
}
return;
} else if (gEnteringSMS == SMS_ENTERING_DEST) {
if (bKeyPressed) {
dataPacket.dest *= 10;
dataPacket.dest += Key;
prevLetter = 0;
}
return;
}
}
switch (Key) { switch (Key) {
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case KEY_SIDE1: case KEY_SIDE1:
case KEY_SIDE2: case KEY_SIDE2:
#endif #endif
case KEY_0...KEY_9: case
MAIN_Key_DIGITS(Key, bKeyPressed, bKeyHeld); KEY_0...KEY_9
:
MAIN_Key_DIGITS(Key, bKeyPressed, bKeyHeld
);
break; break;
case KEY_MENU: case KEY_MENU:
MAIN_Key_MENU(bKeyPressed, bKeyHeld); MAIN_Key_MENU(bKeyPressed, bKeyHeld
);
break; break;
case KEY_UP: case KEY_UP:
MAIN_Key_UP_DOWN(bKeyPressed, bKeyHeld, 1); MAIN_Key_UP_DOWN(bKeyPressed, bKeyHeld,
1);
break; break;
case KEY_DOWN: case KEY_DOWN:
MAIN_Key_UP_DOWN(bKeyPressed, bKeyHeld, -1); MAIN_Key_UP_DOWN(bKeyPressed, bKeyHeld,
-1);
break; break;
case KEY_EXIT: case KEY_EXIT:
MAIN_Key_EXIT(bKeyPressed, bKeyHeld); MAIN_Key_EXIT(bKeyPressed, bKeyHeld
);
break; break;
case KEY_STAR: case KEY_STAR:
MAIN_Key_STAR(bKeyPressed, bKeyHeld); MAIN_Key_STAR(bKeyPressed, bKeyHeld
);
break; break;
case KEY_F: case KEY_F:
GENERIC_Key_F(bKeyPressed, bKeyHeld); GENERIC_Key_F(bKeyPressed, bKeyHeld
);
break; break;
case KEY_PTT: case KEY_PTT:
GENERIC_Key_PTT(bKeyPressed); GENERIC_Key_PTT(bKeyPressed);

View File

@@ -17,8 +17,11 @@
#include <string.h> #include <string.h>
#if !defined(ENABLE_OVERLAY) #if !defined(ENABLE_OVERLAY)
#include "ARMCM0.h" #include "ARMCM0.h"
#endif #endif
#include "app/dtmf.h" #include "app/dtmf.h"
#include "app/generic.h" #include "app/generic.h"
#include "app/menu.h" #include "app/menu.h"
@@ -35,9 +38,11 @@
#include "helper/battery.h" #include "helper/battery.h"
#include "misc.h" #include "misc.h"
#include "settings.h" #include "settings.h"
#if defined(ENABLE_OVERLAY) #if defined(ENABLE_OVERLAY)
#include "sram-overlay.h" #include "sram-overlay.h"
#endif #endif
#include "ui/inputbox.h" #include "ui/inputbox.h"
#include "ui/menu.h" #include "ui/menu.h"
#include "ui/ui.h" #include "ui/ui.h"
@@ -76,8 +81,7 @@ uint8_t gUnlockAllTxConfCnt;
} }
#endif #endif
void MENU_StartCssScan(void) void MENU_StartCssScan(void) {
{
SCANNER_Start(true); SCANNER_Start(true);
gUpdateStatus = true; gUpdateStatus = true;
gCssBackgroundScan = true; gCssBackgroundScan = true;
@@ -85,12 +89,10 @@ void MENU_StartCssScan(void)
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
} }
void MENU_CssScanFound(void) void MENU_CssScanFound(void) {
{
if (gScanCssResultType == CODE_TYPE_DIGITAL || gScanCssResultType == CODE_TYPE_REVERSE_DIGITAL) { if (gScanCssResultType == CODE_TYPE_DIGITAL || gScanCssResultType == CODE_TYPE_REVERSE_DIGITAL) {
gMenuCursor = UI_MENU_GetMenuIdx(MENU_R_DCS); gMenuCursor = UI_MENU_GetMenuIdx(MENU_R_DCS);
} } else if (gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE) {
else if(gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE) {
gMenuCursor = UI_MENU_GetMenuIdx(MENU_R_CTCS); gMenuCursor = UI_MENU_GetMenuIdx(MENU_R_CTCS);
} }
@@ -100,8 +102,7 @@ void MENU_CssScanFound(void)
gUpdateDisplay = true; gUpdateDisplay = true;
} }
void MENU_StopCssScan(void) void MENU_StopCssScan(void) {
{
gCssBackgroundScan = false; gCssBackgroundScan = false;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -111,12 +112,10 @@ void MENU_StopCssScan(void)
gUpdateStatus = true; gUpdateStatus = true;
} }
int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) {
{
*pMin = 0; *pMin = 0;
switch (menu_id) switch (menu_id) {
{
case MENU_SQL: case MENU_SQL:
//*pMin = 0; //*pMin = 0;
*pMax = 9; *pMax = 9;
@@ -184,9 +183,9 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
*pMax = ARRAY_SIZE(gSubMenu_ROGER) - 1; *pMax = ARRAY_SIZE(gSubMenu_ROGER) - 1;
break; break;
case MENU_PONMSG: case MENU_FSKMOD:
//*pMin = 0; //*pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_PONMSG) - 1; *pMax = ARRAY_SIZE(gSubMenu_FSKMod) - 1;
break; break;
case MENU_R_DCS: case MENU_R_DCS:
@@ -253,9 +252,6 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
case MENU_500TX: case MENU_500TX:
#endif #endif
case MENU_350EN: case MENU_350EN:
#ifndef ENABLE_FEAT_F4HWN
case MENU_SCREN:
#endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_TMR: case MENU_SET_TMR:
#endif #endif
@@ -267,17 +263,20 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
*pMax = ARRAY_SIZE(gModulationStr) - 1; *pMax = ARRAY_SIZE(gModulationStr) - 1;
break; break;
#ifndef ENABLE_FEAT_F4HWN
case MENU_SCR: case MENU_SCR:
//*pMin = 0; //*pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1; *pMax = ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1;
break; break;
#endif
case MENU_AUTOLK: case MENU_AUTOLK:
*pMax = 40; *pMax = 40;
break; break;
case MENU_FSKSRC:
*pMax = INT32_MAX;
*pMin = 0;
break;
case MENU_TOT: case MENU_TOT:
//*pMin = 0; //*pMin = 0;
*pMin = 5; *pMin = 5;
@@ -449,21 +448,17 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
return 0; return 0;
} }
void MENU_AcceptSetting(void) void MENU_AcceptSetting(void) {
{
int32_t Min; int32_t Min;
int32_t Max; int32_t Max;
FREQ_Config_t *pConfig = &gTxVfo->freq_config_RX; FREQ_Config_t *pConfig = &gTxVfo->freq_config_RX;
if (!MENU_GetLimits(UI_MENU_GetCurrentMenuId(), &Min, &Max)) if (!MENU_GetLimits(UI_MENU_GetCurrentMenuId(), &Min, &Max)) {
{
if (gSubMenuSelection < Min) gSubMenuSelection = Min; if (gSubMenuSelection < Min) gSubMenuSelection = Min;
else else if (gSubMenuSelection > Max) gSubMenuSelection = Max;
if (gSubMenuSelection > Max) gSubMenuSelection = Max;
} }
switch (UI_MENU_GetCurrentMenuId()) switch (UI_MENU_GetCurrentMenuId()) {
{
default: default:
return; return;
@@ -474,8 +469,7 @@ void MENU_AcceptSetting(void)
case MENU_STEP: case MENU_STEP:
gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection); gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection);
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) {
{
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
} }
return; return;
@@ -497,12 +491,10 @@ void MENU_AcceptSetting(void)
} }
pConfig->Code = 0; pConfig->Code = 0;
pConfig->CodeType = CODE_TYPE_OFF; pConfig->CodeType = CODE_TYPE_OFF;
} } else if (gSubMenuSelection < 105) {
else if (gSubMenuSelection < 105) {
pConfig->CodeType = CODE_TYPE_DIGITAL; pConfig->CodeType = CODE_TYPE_DIGITAL;
pConfig->Code = gSubMenuSelection - 1; pConfig->Code = gSubMenuSelection - 1;
} } else {
else {
pConfig->CodeType = CODE_TYPE_REVERSE_DIGITAL; pConfig->CodeType = CODE_TYPE_REVERSE_DIGITAL;
pConfig->Code = gSubMenuSelection - 105; pConfig->Code = gSubMenuSelection - 105;
} }
@@ -520,8 +512,7 @@ void MENU_AcceptSetting(void)
} }
pConfig->Code = 0; pConfig->Code = 0;
pConfig->CodeType = CODE_TYPE_OFF; pConfig->CodeType = CODE_TYPE_OFF;
} } else {
else {
pConfig->Code = gSubMenuSelection - 1; pConfig->Code = gSubMenuSelection - 1;
pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE; pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE;
} }
@@ -544,18 +535,14 @@ void MENU_AcceptSetting(void)
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
#ifndef ENABLE_FEAT_F4HWN
case MENU_SCR: case MENU_SCR:
gTxVfo->SCRAMBLING_TYPE = gSubMenuSelection; gTxVfo->SCRAMBLING_TYPE = gSubMenuSelection;
#if 0 if (gSubMenuSelection > 0)
if (gSubMenuSelection > 0 && gSetting_ScrambleEnable)
BK4819_EnableScramble(gSubMenuSelection - 1); BK4819_EnableScramble(gSubMenuSelection - 1);
else else
BK4819_DisableScramble(); BK4819_DisableScramble();
#endif
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
#endif
case MENU_BCL: case MENU_BCL:
gTxVfo->BUSY_CHANNEL_LOCK = gSubMenuSelection; gTxVfo->BUSY_CHANNEL_LOCK = gSubMenuSelection;
@@ -772,8 +759,7 @@ void MENU_AcceptSetting(void)
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
case MENU_D_LIST: case MENU_D_LIST:
gDTMF_chosen_contact = gSubMenuSelection - 1; gDTMF_chosen_contact = gSubMenuSelection - 1;
if (gIsDtmfContactValid) if (gIsDtmfContactValid) {
{
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
gDTMF_InputMode = true; gDTMF_InputMode = true;
gDTMF_InputBox_Index = 3; gDTMF_InputBox_Index = 3;
@@ -782,8 +768,12 @@ void MENU_AcceptSetting(void)
} }
return; return;
#endif #endif
case MENU_PONMSG: case MENU_FSKMOD:
gEeprom.POWER_ON_DISPLAY_MODE = gSubMenuSelection; gEeprom.FSKMode = gSubMenuSelection;
break;
case MENU_FSKSRC:
gEeprom.FSKSRCAddress = gSubMenuSelection;
break; break;
case MENU_ROGER: case MENU_ROGER:
@@ -829,18 +819,6 @@ void MENU_AcceptSetting(void)
#endif #endif
case MENU_F_LOCK: { case MENU_F_LOCK: {
if(gSubMenuSelection == F_LOCK_NONE) { // select 10 times to enable
gUnlockAllTxConfCnt++;
#ifdef ENABLE_FEAT_F4HWN
if(gUnlockAllTxConfCnt < 3)
#else
if(gUnlockAllTxConfCnt < 10)
#endif
return;
}
else
gUnlockAllTxConfCnt = 0;
gSetting_F_LOCK = gSubMenuSelection; gSetting_F_LOCK = gSubMenuSelection;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
@@ -864,12 +842,10 @@ void MENU_AcceptSetting(void)
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
gFlagResetVfos = true; gFlagResetVfos = true;
break; break;
#ifndef ENABLE_FEAT_F4HWN // case MENU_SCREN:
case MENU_SCREN: // gSetting_ScrambleEnable = gSubMenuSelection;
gSetting_ScrambleEnable = gSubMenuSelection; // gFlagReconfigureVfos = true;
gFlagReconfigureVfos = true; // break;
break;
#endif
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
case MENU_F_CALI: case MENU_F_CALI:
@@ -877,8 +853,7 @@ void MENU_AcceptSetting(void)
return; return;
#endif #endif
case MENU_BATCAL: case MENU_BATCAL: { // voltages are averages between discharge curves of 1600 and 2200 mAh
{ // voltages are averages between discharge curves of 1600 and 2200 mAh
// gBatteryCalibration[0] = (520ul * gSubMenuSelection) / 760; // 5.20V empty, blinking above this value, reduced functionality below // gBatteryCalibration[0] = (520ul * gSubMenuSelection) / 760; // 5.20V empty, blinking above this value, reduced functionality below
// gBatteryCalibration[1] = (689ul * gSubMenuSelection) / 760; // 6.89V, ~5%, 1 bars above this value // gBatteryCalibration[1] = (689ul * gSubMenuSelection) / 760; // 6.89V, ~5%, 1 bars above this value
// gBatteryCalibration[2] = (724ul * gSubMenuSelection) / 760; // 7.24V, ~17%, 2 bars above this value // gBatteryCalibration[2] = (724ul * gSubMenuSelection) / 760; // 7.24V, ~17%, 2 bars above this value
@@ -897,8 +872,7 @@ void MENU_AcceptSetting(void)
case MENU_F1LONG: case MENU_F1LONG:
case MENU_F2SHRT: case MENU_F2SHRT:
case MENU_F2LONG: case MENU_F2LONG:
case MENU_MLONG: case MENU_MLONG: {
{
uint8_t *fun[] = { uint8_t *fun[] = {
&gEeprom.KEY_1_SHORT_PRESS_ACTION, &gEeprom.KEY_1_SHORT_PRESS_ACTION,
&gEeprom.KEY_1_LONG_PRESS_ACTION, &gEeprom.KEY_1_LONG_PRESS_ACTION,
@@ -977,25 +951,20 @@ void MENU_AcceptSetting(void)
gRequestSaveSettings = true; gRequestSaveSettings = true;
} }
static void MENU_ClampSelection(int8_t Direction) static void MENU_ClampSelection(int8_t Direction) {
{
int32_t Min; int32_t Min;
int32_t Max; int32_t Max;
if (!MENU_GetLimits(UI_MENU_GetCurrentMenuId(), &Min, &Max)) if (!MENU_GetLimits(UI_MENU_GetCurrentMenuId(), &Min, &Max)) {
{
int32_t Selection = gSubMenuSelection; int32_t Selection = gSubMenuSelection;
if (Selection < Min) Selection = Min; if (Selection < Min) Selection = Min;
else else if (Selection > Max) Selection = Max;
if (Selection > Max) Selection = Max;
gSubMenuSelection = NUMBER_AddWithWraparound(Selection, Direction, Min, Max); gSubMenuSelection = NUMBER_AddWithWraparound(Selection, Direction, Min, Max);
} }
} }
void MENU_ShowCurrentSetting(void) void MENU_ShowCurrentSetting(void) {
{ switch (UI_MENU_GetCurrentMenuId()) {
switch (UI_MENU_GetCurrentMenuId())
{
case MENU_SQL: case MENU_SQL:
gSubMenuSelection = gEeprom.SQUELCH_LEVEL; gSubMenuSelection = gEeprom.SQUELCH_LEVEL;
break; break;
@@ -1013,8 +982,7 @@ void MENU_ShowCurrentSetting(void)
break; break;
case MENU_R_DCS: case MENU_R_DCS:
case MENU_R_CTCS: case MENU_R_CTCS: {
{
DCS_CodeType_t type = gTxVfo->freq_config_RX.CodeType; DCS_CodeType_t type = gTxVfo->freq_config_RX.CodeType;
uint8_t code = gTxVfo->freq_config_RX.Code; uint8_t code = gTxVfo->freq_config_RX.Code;
int menuid = UI_MENU_GetCurrentMenuId(); int menuid = UI_MENU_GetCurrentMenuId();
@@ -1045,8 +1013,7 @@ void MENU_ShowCurrentSetting(void)
} }
case MENU_T_DCS: case MENU_T_DCS:
switch (gTxVfo->freq_config_TX.CodeType) switch (gTxVfo->freq_config_TX.CodeType) {
{
case CODE_TYPE_DIGITAL: case CODE_TYPE_DIGITAL:
gSubMenuSelection = gTxVfo->freq_config_TX.Code + 1; gSubMenuSelection = gTxVfo->freq_config_TX.Code + 1;
break; break;
@@ -1060,7 +1027,8 @@ void MENU_ShowCurrentSetting(void)
break; break;
case MENU_T_CTCS: case MENU_T_CTCS:
gSubMenuSelection = (gTxVfo->freq_config_TX.CodeType == CODE_TYPE_CONTINUOUS_TONE) ? gTxVfo->freq_config_TX.Code + 1 : 0; gSubMenuSelection = (gTxVfo->freq_config_TX.CodeType == CODE_TYPE_CONTINUOUS_TONE) ?
gTxVfo->freq_config_TX.Code + 1 : 0;
break; break;
case MENU_SFT_D: case MENU_SFT_D:
@@ -1075,11 +1043,9 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gTxVfo->CHANNEL_BANDWIDTH; gSubMenuSelection = gTxVfo->CHANNEL_BANDWIDTH;
break; break;
#ifndef ENABLE_FEAT_F4HWN
case MENU_SCR: case MENU_SCR:
gSubMenuSelection = gTxVfo->SCRAMBLING_TYPE; gSubMenuSelection = gTxVfo->SCRAMBLING_TYPE;
break; break;
#endif
case MENU_BCL: case MENU_BCL:
gSubMenuSelection = gTxVfo->BUSY_CHANNEL_LOCK; gSubMenuSelection = gTxVfo->BUSY_CHANNEL_LOCK;
@@ -1109,12 +1075,9 @@ void MENU_ShowCurrentSetting(void)
case MENU_ABR: case MENU_ABR:
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if(gBackLight) if (gBackLight) {
{
gSubMenuSelection = gBacklightTimeOriginal; gSubMenuSelection = gBacklightTimeOriginal;
} } else {
else
{
gSubMenuSelection = gEeprom.BACKLIGHT_TIME; gSubMenuSelection = gEeprom.BACKLIGHT_TIME;
} }
#else #else
@@ -1135,7 +1098,8 @@ void MENU_ShowCurrentSetting(void)
break; break;
case MENU_TDR: case MENU_TDR:
gSubMenuSelection = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) * 2; gSubMenuSelection =
(gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) * 2;
break; break;
case MENU_BEEP: case MENU_BEEP:
@@ -1256,8 +1220,12 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gSetting_live_DTMF_decoder; gSubMenuSelection = gSetting_live_DTMF_decoder;
break; break;
case MENU_PONMSG: case MENU_FSKMOD:
gSubMenuSelection = gEeprom.POWER_ON_DISPLAY_MODE; gSubMenuSelection = gEeprom.FSKMode;
break;
case MENU_FSKSRC:
gSubMenuSelection = (int32_t) gEeprom.FSKSRCAddress;
break; break;
case MENU_ROGER: case MENU_ROGER:
@@ -1309,15 +1277,6 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gSetting_500TX; gSubMenuSelection = gSetting_500TX;
break; break;
#endif
case MENU_350EN:
gSubMenuSelection = gSetting_350EN;
break;
#ifndef ENABLE_FEAT_F4HWN
case MENU_SCREN:
gSubMenuSelection = gSetting_ScrambleEnable;
break;
#endif #endif
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
@@ -1338,8 +1297,7 @@ void MENU_ShowCurrentSetting(void)
case MENU_F1LONG: case MENU_F1LONG:
case MENU_F2SHRT: case MENU_F2SHRT:
case MENU_F2LONG: case MENU_F2LONG:
case MENU_MLONG: case MENU_MLONG: {
{
uint8_t *fun[] = { uint8_t *fun[] = {
&gEeprom.KEY_1_SHORT_PRESS_ACTION, &gEeprom.KEY_1_SHORT_PRESS_ACTION,
&gEeprom.KEY_1_LONG_PRESS_ACTION, &gEeprom.KEY_1_LONG_PRESS_ACTION,
@@ -1422,8 +1380,7 @@ void MENU_ShowCurrentSetting(void)
} }
} }
static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
{
uint8_t Offset; uint8_t Offset;
int32_t Min; int32_t Min;
int32_t Max; int32_t Max;
@@ -1434,17 +1391,13 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0) if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0) { // currently editing the channel name
{ // currently editing the channel name
if (edit_index < 10) if (edit_index < 10) {
{ if (Key <= KEY_9) {
if (Key <= KEY_9)
{
edit[edit_index] = '0' + Key - KEY_0; edit[edit_index] = '0' + Key - KEY_0;
if (++edit_index >= 10) if (++edit_index >= 10) { // exit edit
{ // exit edit
gFlagAcceptSetting = false; gFlagAcceptSetting = false;
gAskForConfirmation = 1; gAskForConfirmation = 1;
} }
@@ -1460,17 +1413,14 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
if (!gIsInSubMenu) if (!gIsInSubMenu) {
{ switch (gInputBoxIndex) {
switch (gInputBoxIndex)
{
case 2: case 2:
gInputBoxIndex = 0; gInputBoxIndex = 0;
Value = (gInputBox[0] * 10) + gInputBox[1]; Value = (gInputBox[0] * 10) + gInputBox[1];
if (Value > 0 && Value <= gMenuListCount) if (Value > 0 && Value <= gMenuListCount) {
{
gMenuCursor = Value - 1; gMenuCursor = Value - 1;
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
return; return;
@@ -1484,8 +1434,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
[[fallthrough]]; [[fallthrough]];
case 1: case 1:
Value = gInputBox[0]; Value = gInputBox[0];
if (Value > 0 && Value <= gMenuListCount) if (Value > 0 && Value <= gMenuListCount) {
{
gMenuCursor = Value - 1; gMenuCursor = Value - 1;
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
return; return;
@@ -1499,12 +1448,10 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
return; return;
} }
if (UI_MENU_GetCurrentMenuId() == MENU_OFFSET) if (UI_MENU_GetCurrentMenuId() == MENU_OFFSET) {
{
uint32_t Frequency; uint32_t Frequency;
if (gInputBoxIndex < 6) if (gInputBoxIndex < 6) { // invalid frequency
{ // invalid frequency
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
@@ -1525,11 +1472,9 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (UI_MENU_GetCurrentMenuId() == MENU_MEM_CH || if (UI_MENU_GetCurrentMenuId() == MENU_MEM_CH ||
UI_MENU_GetCurrentMenuId() == MENU_DEL_CH || UI_MENU_GetCurrentMenuId() == MENU_DEL_CH ||
UI_MENU_GetCurrentMenuId() == MENU_1_CALL || UI_MENU_GetCurrentMenuId() == MENU_1_CALL ||
UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME) UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME) { // enter 3-digit channel number
{ // enter 3-digit channel number
if (gInputBoxIndex < 3) if (gInputBoxIndex < 3) {
{
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
@@ -1541,8 +1486,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1;
if (IS_MR_CHANNEL(Value)) if (IS_MR_CHANNEL(Value)) {
{
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
@@ -1554,8 +1498,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
return; return;
} }
if (MENU_GetLimits(UI_MENU_GetCurrentMenuId(), &Min, &Max)) if (MENU_GetLimits(UI_MENU_GetCurrentMenuId(), &Min, &Max)) {
{
gInputBoxIndex = 0; gInputBoxIndex = 0;
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return; return;
@@ -1585,8 +1528,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (Offset == gInputBoxIndex) if (Offset == gInputBoxIndex)
gInputBoxIndex = 0; gInputBoxIndex = 0;
if (Value <= Max) if (Value <= Max) {
{
gSubMenuSelection = Value; gSubMenuSelection = Value;
return; return;
} }
@@ -1594,23 +1536,19 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
} }
static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) {
{
if (bKeyHeld || !bKeyPressed) if (bKeyHeld || !bKeyPressed)
return; return;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (!gCssBackgroundScan) if (!gCssBackgroundScan) {
{
/* Backlight related menus set full brightness. Set it back to the configured value, /* Backlight related menus set full brightness. Set it back to the configured value,
just in case we are exiting from one of them. */ just in case we are exiting from one of them. */
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
if (gIsInSubMenu) if (gIsInSubMenu) {
{ if (gInputBoxIndex == 0 || UI_MENU_GetCurrentMenuId() != MENU_OFFSET) {
if (gInputBoxIndex == 0 || UI_MENU_GetCurrentMenuId() != MENU_OFFSET)
{
gAskForConfirmation = 0; gAskForConfirmation = 0;
gIsInSubMenu = false; gIsInSubMenu = false;
gInputBoxIndex = 0; gInputBoxIndex = 0;
@@ -1619,8 +1557,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_CANCEL; gAnotherVoiceID = VOICE_ID_CANCEL;
#endif #endif
} } else
else
gInputBox[--gInputBoxIndex] = 10; gInputBox[--gInputBoxIndex] = 10;
// *********************** // ***********************
@@ -1639,9 +1576,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
{ {
BACKLIGHT_TurnOff(); // turn the backlight OFF BACKLIGHT_TurnOff(); // turn the backlight OFF
} }
} } else {
else
{
MENU_StopCssScan(); MENU_StopCssScan();
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -1654,16 +1589,14 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
gPttWasReleased = true; gPttWasReleased = true;
} }
static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) {
{
if (bKeyHeld || !bKeyPressed) if (bKeyHeld || !bKeyPressed)
return; return;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
if (!gIsInSubMenu) if (!gIsInSubMenu) {
{
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
if (UI_MENU_GetCurrentMenuId() != MENU_SCR) if (UI_MENU_GetCurrentMenuId() != MENU_SCR)
gAnotherVoiceID = MenuList[gMenuCursor].voice_id; gAnotherVoiceID = MenuList[gMenuCursor].voice_id;
@@ -1693,10 +1626,8 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
return; return;
} }
if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME) if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME) {
{ if (edit_index < 0) { // enter channel name edit mode
if (edit_index < 0)
{ // enter channel name edit mode
if (!RADIO_CheckValidChannel(gSubMenuSelection, false, 0)) if (!RADIO_CheckValidChannel(gSubMenuSelection, false, 0))
return; return;
@@ -1713,10 +1644,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
memcpy(edit_original, edit, sizeof(edit_original)); memcpy(edit_original, edit, sizeof(edit_original));
return; return;
} } else if (edit_index >= 0 && edit_index < 10) { // editing the channel name characters
else
if (edit_index >= 0 && edit_index < 10)
{ // editing the channel name characters
if (++edit_index < 10) if (++edit_index < 10)
return; // next char return; // next char
@@ -1733,15 +1661,12 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
// exiting the sub menu // exiting the sub menu
if (gIsInSubMenu) if (gIsInSubMenu) {
{
if (UI_MENU_GetCurrentMenuId() == MENU_RESET || if (UI_MENU_GetCurrentMenuId() == MENU_RESET ||
UI_MENU_GetCurrentMenuId() == MENU_MEM_CH || UI_MENU_GetCurrentMenuId() == MENU_MEM_CH ||
UI_MENU_GetCurrentMenuId() == MENU_DEL_CH || UI_MENU_GetCurrentMenuId() == MENU_DEL_CH ||
UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME) UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME) {
{ switch (gAskForConfirmation) {
switch (gAskForConfirmation)
{
case 0: case 0:
gAskForConfirmation = 1; gAskForConfirmation = 1;
break; break;
@@ -1751,8 +1676,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
UI_DisplayMenu(); UI_DisplayMenu();
if (UI_MENU_GetCurrentMenuId() == MENU_RESET) if (UI_MENU_GetCurrentMenuId() == MENU_RESET) {
{
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_CONFIRM); AUDIO_SetVoiceID(0, VOICE_ID_CONFIRM);
AUDIO_PlaySingleVoice(true); AUDIO_PlaySingleVoice(true);
@@ -1771,9 +1695,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
gIsInSubMenu = false; gIsInSubMenu = false;
gAskForConfirmation = 0; gAskForConfirmation = 0;
} }
} } else {
else
{
gFlagAcceptSetting = true; gFlagAcceptSetting = true;
gIsInSubMenu = false; gIsInSubMenu = false;
} }
@@ -1791,22 +1713,18 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
gInputBoxIndex = 0; gInputBoxIndex = 0;
} }
static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld) static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld) {
{
if (bKeyHeld || !bKeyPressed) if (bKeyHeld || !bKeyPressed)
return; return;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0) if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0) { // currently editing the channel name
{ // currently editing the channel name
if (edit_index < 10) if (edit_index < 10) {
{
edit[edit_index] = '-'; edit[edit_index] = '-';
if (++edit_index >= 10) if (++edit_index >= 10) { // exit edit
{ // exit edit
gFlagAcceptSetting = false; gFlagAcceptSetting = false;
gAskForConfirmation = 1; gAskForConfirmation = 1;
} }
@@ -1825,8 +1743,8 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld)
if (gRxVfo->Modulation == MODULATION_FM) if (gRxVfo->Modulation == MODULATION_FM)
#endif #endif
{ {
if ((UI_MENU_GetCurrentMenuId() == MENU_R_CTCS || UI_MENU_GetCurrentMenuId() == MENU_R_DCS) && gIsInSubMenu) if ((UI_MENU_GetCurrentMenuId() == MENU_R_CTCS || UI_MENU_GetCurrentMenuId() == MENU_R_DCS) &&
{ // scan CTCSS or DCS to find the tone/code of the incoming signal gIsInSubMenu) { // scan CTCSS or DCS to find the tone/code of the incoming signal
if (!SCANNER_IsScanning()) if (!SCANNER_IsScanning())
MENU_StartCssScan(); MENU_StartCssScan();
else else
@@ -1840,23 +1758,18 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld)
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
} }
static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) {
{
uint8_t VFO; uint8_t VFO;
uint8_t Channel; uint8_t Channel;
bool bCheckScanList; bool bCheckScanList;
if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME && gIsInSubMenu && edit_index >= 0) if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME && gIsInSubMenu && edit_index >= 0) { // change the character
{ // change the character if (bKeyPressed && edit_index < 10 && Direction != 0) {
if (bKeyPressed && edit_index < 10 && Direction != 0)
{
const char unwanted[] = "$%&!\"':;?^`|{}"; const char unwanted[] = "$%&!\"':;?^`|{}";
char c = edit[edit_index] + Direction; char c = edit[edit_index] + Direction;
unsigned int i = 0; unsigned int i = 0;
while (i < sizeof(unwanted) && c >= 32 && c <= 126) while (i < sizeof(unwanted) && c >= 32 && c <= 126) {
{ if (c == unwanted[i++]) { // choose next character
if (c == unwanted[i++])
{ // choose next character
c += Direction; c += Direction;
i = 0; i = 0;
} }
@@ -1868,25 +1781,21 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
return; return;
} }
if (!bKeyHeld) if (!bKeyHeld) {
{
if (!bKeyPressed) if (!bKeyPressed)
return; return;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
gInputBoxIndex = 0; gInputBoxIndex = 0;
} } else if (!bKeyPressed)
else
if (!bKeyPressed)
return; return;
if (SCANNER_IsScanning()) { if (SCANNER_IsScanning()) {
return; return;
} }
if (!gIsInSubMenu) if (!gIsInSubMenu) {
{
gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1); gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1);
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
@@ -1904,15 +1813,12 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
return; return;
} }
if (UI_MENU_GetCurrentMenuId() == MENU_OFFSET) if (UI_MENU_GetCurrentMenuId() == MENU_OFFSET) {
{
int32_t Offset = (Direction * gTxVfo->StepFrequency) + gSubMenuSelection; int32_t Offset = (Direction * gTxVfo->StepFrequency) + gSubMenuSelection;
if (Offset < 99999990) if (Offset < 99999990) {
{
if (Offset < 0) if (Offset < 0)
Offset = 99999990; Offset = 99999990;
} } else
else
Offset = 0; Offset = 0;
gSubMenuSelection = FREQUENCY_RoundToStep(Offset, gTxVfo->StepFrequency); gSubMenuSelection = FREQUENCY_RoundToStep(Offset, gTxVfo->StepFrequency);
@@ -1922,8 +1828,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
VFO = 0; VFO = 0;
switch (UI_MENU_GetCurrentMenuId()) switch (UI_MENU_GetCurrentMenuId()) {
{
case MENU_DEL_CH: case MENU_DEL_CH:
case MENU_1_CALL: case MENU_1_CALL:
case MENU_MEM_NAME: case MENU_MEM_NAME:
@@ -1956,10 +1861,8 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
} }
void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
{ switch (Key) {
switch (Key)
{
case KEY_0: case KEY_0:
case KEY_1: case KEY_1:
case KEY_2: case KEY_2:
@@ -1988,16 +1891,13 @@ void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
MENU_Key_STAR(bKeyPressed, bKeyHeld); MENU_Key_STAR(bKeyPressed, bKeyHeld);
break; break;
case KEY_F: case KEY_F:
if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME && edit_index >= 0) if (UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME &&
{ // currently editing the channel name edit_index >= 0) { // currently editing the channel name
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed) {
{
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (edit_index < 10) if (edit_index < 10) {
{
edit[edit_index] = ' '; edit[edit_index] = ' ';
if (++edit_index >= 10) if (++edit_index >= 10) { // exit edit
{ // exit edit
gFlagAcceptSetting = false; gFlagAcceptSetting = false;
gAskForConfirmation = 1; gAskForConfirmation = 1;
} }
@@ -2018,18 +1918,14 @@ void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
break; break;
} }
if (gScreenToDisplay == DISPLAY_MENU) if (gScreenToDisplay == DISPLAY_MENU) {
{ if (
if (UI_MENU_GetCurrentMenuId() == MENU_VOL ||
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
UI_MENU_GetCurrentMenuId() == MENU_F_CALI || UI_MENU_GetCurrentMenuId() == MENU_F_CALI ||
#endif #endif
UI_MENU_GetCurrentMenuId() == MENU_BATCAL) UI_MENU_GetCurrentMenuId() == MENU_BATCAL) {
{
gMenuCountdown = menu_timeout_long_500ms; gMenuCountdown = menu_timeout_long_500ms;
} } else {
else
{
gMenuCountdown = menu_timeout_500ms; gMenuCountdown = menu_timeout_500ms;
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -68,12 +68,6 @@ void BACKLIGHT_InitHardware()
static void BACKLIGHT_Sound(void) static void BACKLIGHT_Sound(void)
{ {
if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_SOUND || gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_ALL)
{
AUDIO_PlayBeep(BEEP_880HZ_60MS_DOUBLE_BEEP);
AUDIO_PlayBeep(BEEP_880HZ_60MS_DOUBLE_BEEP);
}
gK5startup = false; gK5startup = false;
} }

View File

@@ -74,6 +74,7 @@ enum BK4819_REGISTER_t {
BK4819_REG_3D = 0x3DU, BK4819_REG_3D = 0x3DU,
BK4819_REG_3E = 0x3EU, BK4819_REG_3E = 0x3EU,
BK4819_REG_3F = 0x3FU, BK4819_REG_3F = 0x3FU,
BK4819_REG_40 = 0x40U,
BK4819_REG_43 = 0x43U, BK4819_REG_43 = 0x43U,
BK4819_REG_46 = 0x46U, BK4819_REG_46 = 0x46U,
BK4819_REG_47 = 0x47U, BK4819_REG_47 = 0x47U,
@@ -96,6 +97,7 @@ enum BK4819_REGISTER_t {
BK4819_REG_5A = 0x5AU, BK4819_REG_5A = 0x5AU,
BK4819_REG_5B = 0x5BU, BK4819_REG_5B = 0x5BU,
BK4819_REG_5C = 0x5CU, BK4819_REG_5C = 0x5CU,
BK4819_REG_5E = 0x5EU,
BK4819_REG_5D = 0x5DU, BK4819_REG_5D = 0x5DU,
BK4819_REG_5F = 0x5FU, BK4819_REG_5F = 0x5FU,
BK4819_REG_63 = 0x63U, BK4819_REG_63 = 0x63U,

View File

@@ -48,6 +48,21 @@ __inline uint16_t scale_freq(const uint16_t freq)
return (((uint32_t)freq * 1353245u) + (1u << 16)) >> 17; // with rounding return (((uint32_t)freq * 1353245u) + (1u << 16)) >> 17; // with rounding
} }
void BK4819_FskEnableTx(void){
const uint16_t fsk_reg59 = BK4819_ReadRegister(BK4819_REG_59);
BK4819_WriteRegister(BK4819_REG_59, (1u << 11) | fsk_reg59);
}
void BK4819_FskClearFifo(void){
const uint16_t fsk_reg59 = BK4819_ReadRegister(BK4819_REG_59);
BK4819_WriteRegister(BK4819_REG_59, (1u << 15) | (1u << 14) | fsk_reg59);
}
void BK4819_FskEnableRx(void){
const uint16_t fsk_reg59 = BK4819_ReadRegister(BK4819_REG_59);
BK4819_WriteRegister(BK4819_REG_59, (1u << 12) | fsk_reg59);
}
void BK4819_Init(void) void BK4819_Init(void)
{ {
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_SCN); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_SCN);

View File

@@ -77,6 +77,11 @@ void BK4819_InitAGC(bool amModulation);
void BK4819_ToggleGpioOut(BK4819_GPIO_PIN_t Pin, bool bSet); void BK4819_ToggleGpioOut(BK4819_GPIO_PIN_t Pin, bool bSet);
void BK4819_ResetFSK(void);
void BK4819_FskClearFifo(void);
void BK4819_FskEnableRx(void);
void BK4819_FskEnableTx(void);
void BK4819_SetCDCSSCodeWord(uint32_t CodeWord); void BK4819_SetCDCSSCodeWord(uint32_t CodeWord);
void BK4819_SetCTCSSFrequency(uint32_t BaudRate); void BK4819_SetCTCSSFrequency(uint32_t BaudRate);
void BK4819_SetTailDetection(const uint32_t freq_10Hz); void BK4819_SetTailDetection(const uint32_t freq_10Hz);

View File

@@ -26,6 +26,8 @@ KEY_Code_t gKeyReading0 = KEY_INVALID;
KEY_Code_t gKeyReading1 = KEY_INVALID; KEY_Code_t gKeyReading1 = KEY_INVALID;
uint16_t gDebounceCounter = 0; uint16_t gDebounceCounter = 0;
bool gWasFKeyPressed = false; bool gWasFKeyPressed = false;
uint8_t prevLetter = 0;
KEY_Code_t prevKey = KEY_INVALID;
static const struct { static const struct {

View File

@@ -49,6 +49,8 @@ extern KEY_Code_t gKeyReading0;
extern KEY_Code_t gKeyReading1; extern KEY_Code_t gKeyReading1;
extern uint16_t gDebounceCounter; extern uint16_t gDebounceCounter;
extern bool gWasFKeyPressed; extern bool gWasFKeyPressed;
extern uint8_t prevLetter;
extern KEY_Code_t prevKey;
KEY_Code_t KEYBOARD_Poll(void); KEY_Code_t KEYBOARD_Poll(void);

View File

@@ -4084,9 +4084,9 @@ called in the following order:
a=>b [label="GetVersion ()", textcolor="gray", linecolor="gray"]; a=>b [label="GetVersion ()", textcolor="gray", linecolor="gray"];
--- [label="Obtain driver features"]; --- [label="Obtain driver features"];
a=>b [label="GetCapabilities (...)", textcolor="gray", linecolor="gray"]; a=>b [label="GetCapabilities (...)", textcolor="gray", linecolor="gray"];
--- [label="Setup software resources"]; --- [label="Sup software resources"];
a=>b [label="Initialize (...)", textcolor="red", linecolor="red"]; a=>b [label="Initialize (...)", textcolor="red", linecolor="red"];
--- [label="Setup the peripheral"]; --- [label="Sup the peripheral"];
a=>b [label="PowerControl (ARM_POWER_FULL)", textcolor="red", linecolor="red"]; a=>b [label="PowerControl (ARM_POWER_FULL)", textcolor="red", linecolor="red"];
--- [label="Operate with the peripheral"]; --- [label="Operate with the peripheral"];
a=>b [label="Data Transfer Functions"]; a=>b [label="Data Transfer Functions"];

420
font.c
View File

@@ -18,202 +18,202 @@
// removed last and middle column which was all 0x00 // removed last and middle column which was all 0x00
// also the space char is not needed // also the space char is not needed
const uint8_t gFontBig[95 - 1][16 - 2] = //const uint8_t gFontBig[95 - 1][16 - 2] =
{ //{
#if 0 //#if 0
// {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // ' ' //// {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // ' '
{0x00, 0x00, 0x70, 0xF8, 0xF8, 0x70, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00}, // , 0x00}, // '!' // {0x00, 0x00, 0x70, 0xF8, 0xF8, 0x70, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00}, // , 0x00}, // '!'
{0x00, 0x1E, 0x3E, 0x00, 0x00, 0x3E, 0x1E, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '"' // {0x00, 0x1E, 0x3E, 0x00, 0x00, 0x3E, 0x1E, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '"'
{0x40, 0xF0, 0xF0, 0x40, 0xF0, 0xF0, 0x40, /*0x00,*/ 0x04, 0x1F, 0x1F, 0x04, 0x1F, 0x1F, 0x04}, // , 0x00}, // '#' // {0x40, 0xF0, 0xF0, 0x40, 0xF0, 0xF0, 0x40, /*0x00,*/ 0x04, 0x1F, 0x1F, 0x04, 0x1F, 0x1F, 0x04}, // , 0x00}, // '#'
{0x70, 0xF8, 0x88, 0x8F, 0x8F, 0x98, 0x30, /*0x00,*/ 0x06, 0x0C, 0x08, 0x38, 0x38, 0x0F, 0x07}, // , 0x00}, // '$' // {0x70, 0xF8, 0x88, 0x8F, 0x8F, 0x98, 0x30, /*0x00,*/ 0x06, 0x0C, 0x08, 0x38, 0x38, 0x0F, 0x07}, // , 0x00}, // '$'
{0x60, 0x60, 0x00, 0x00, 0x80, 0xC0, 0x60, /*0x00,*/ 0x18, 0x0C, 0x06, 0x03, 0x01, 0x18, 0x18}, // , 0x00}, // '%' // {0x60, 0x60, 0x00, 0x00, 0x80, 0xC0, 0x60, /*0x00,*/ 0x18, 0x0C, 0x06, 0x03, 0x01, 0x18, 0x18}, // , 0x00}, // '%'
{0x00, 0xB0, 0xF8, 0xC8, 0x78, 0xB0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x11, 0x0F, 0x1F, 0x10}, // , 0x00}, // '&' // {0x00, 0xB0, 0xF8, 0xC8, 0x78, 0xB0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x11, 0x0F, 0x1F, 0x10}, // , 0x00}, // '&'
{0x00, 0x20, 0x3E, 0x1E, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // ''' // {0x00, 0x20, 0x3E, 0x1E, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '''
{0x00, 0x00, 0xE0, 0xF0, 0x18, 0x08, 0x00, /*0x00,*/ 0x00, 0x00, 0x07, 0x0F, 0x18, 0x10, 0x00}, // , 0x00}, // '(' // {0x00, 0x00, 0xE0, 0xF0, 0x18, 0x08, 0x00, /*0x00,*/ 0x00, 0x00, 0x07, 0x0F, 0x18, 0x10, 0x00}, // , 0x00}, // '('
{0x00, 0x00, 0x08, 0x18, 0xF0, 0xE0, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x18, 0x0F, 0x07, 0x00}, // , 0x00}, // ')' // {0x00, 0x00, 0x08, 0x18, 0xF0, 0xE0, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x18, 0x0F, 0x07, 0x00}, // , 0x00}, // ')'
{0x00, 0x40, 0xC0, 0x80, 0x80, 0xC0, 0x40, /*0x00,*/ 0x01, 0x05, 0x07, 0x03, 0x03, 0x07, 0x05}, // , 0x01}, // '*' // {0x00, 0x40, 0xC0, 0x80, 0x80, 0xC0, 0x40, /*0x00,*/ 0x01, 0x05, 0x07, 0x03, 0x03, 0x07, 0x05}, // , 0x01}, // '*'
{0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, /*0x00,*/ 0x00, 0x01, 0x01, 0x07, 0x07, 0x01, 0x01}, // , 0x00}, // '+' // {0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, /*0x00,*/ 0x00, 0x01, 0x01, 0x07, 0x07, 0x01, 0x01}, // , 0x00}, // '+'
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x20, 0x3C, 0x1C, 0x00, 0x00}, // , 0x00}, // ',' // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x20, 0x3C, 0x1C, 0x00, 0x00}, // , 0x00}, // ','
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, // , 0x00}, // '-' // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, // , 0x00}, // '-'
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00}, // , 0x00}, // '.' // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00}, // , 0x00}, // '.'
{0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, /*0x00,*/ 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00, 0x00}, // , 0x00}, // '/' // {0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, /*0x00,*/ 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00, 0x00}, // , 0x00}, // '/'
{0xF0, 0xF8, 0x08, 0x88, 0x48, 0xF8, 0xF0, /*0x00,*/ 0x0F, 0x1F, 0x12, 0x11, 0x10, 0x1F, 0x0F}, // , 0x00}, // '0' // {0xF0, 0xF8, 0x08, 0x88, 0x48, 0xF8, 0xF0, /*0x00,*/ 0x0F, 0x1F, 0x12, 0x11, 0x10, 0x1F, 0x0F}, // , 0x00}, // '0'
{0x00, 0x20, 0x30, 0xF8, 0xF8, 0x00, 0x00, /*0x00,*/ 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10}, // , 0x00}, // '1' // {0x00, 0x20, 0x30, 0xF8, 0xF8, 0x00, 0x00, /*0x00,*/ 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10}, // , 0x00}, // '1'
{0x10, 0x18, 0x08, 0x88, 0xC8, 0x78, 0x30, /*0x00,*/ 0x1C, 0x1E, 0x13, 0x11, 0x10, 0x18, 0x18}, // , 0x00}, // '2' // {0x10, 0x18, 0x08, 0x88, 0xC8, 0x78, 0x30, /*0x00,*/ 0x1C, 0x1E, 0x13, 0x11, 0x10, 0x18, 0x18}, // , 0x00}, // '2'
{0x10, 0x18, 0x88, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x08, 0x18, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // '3' // {0x10, 0x18, 0x88, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x08, 0x18, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // '3'
{0x80, 0xC0, 0x60, 0x30, 0xF8, 0xF8, 0x00, /*0x00,*/ 0x01, 0x01, 0x01, 0x11, 0x1F, 0x1F, 0x11}, // , 0x00}, // '4' // {0x80, 0xC0, 0x60, 0x30, 0xF8, 0xF8, 0x00, /*0x00,*/ 0x01, 0x01, 0x01, 0x11, 0x1F, 0x1F, 0x11}, // , 0x00}, // '4'
{0xF8, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x08, /*0x00,*/ 0x08, 0x18, 0x10, 0x10, 0x11, 0x1F, 0x0F}, // , 0x00}, // '5' // {0xF8, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x08, /*0x00,*/ 0x08, 0x18, 0x10, 0x10, 0x11, 0x1F, 0x0F}, // , 0x00}, // '5'
{0xE0, 0xF0, 0x98, 0x88, 0x88, 0x80, 0x00, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // '6' // {0xE0, 0xF0, 0x98, 0x88, 0x88, 0x80, 0x00, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // '6'
{0x18, 0x18, 0x08, 0x08, 0x88, 0xF8, 0x78, /*0x00,*/ 0x00, 0x00, 0x1E, 0x1F, 0x01, 0x00, 0x00}, // , 0x00}, // '7' // {0x18, 0x18, 0x08, 0x08, 0x88, 0xF8, 0x78, /*0x00,*/ 0x00, 0x00, 0x1E, 0x1F, 0x01, 0x00, 0x00}, // , 0x00}, // '7'
{0x70, 0xF8, 0x88, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // '8' // {0x70, 0xF8, 0x88, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // '8'
{0x70, 0xF8, 0x88, 0x88, 0x88, 0xF8, 0xF0, /*0x00,*/ 0x00, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x07}, // , 0x00}, // '9' // {0x70, 0xF8, 0x88, 0x88, 0x88, 0xF8, 0xF0, /*0x00,*/ 0x00, 0x10, 0x10, 0x10, 0x18, 0x0F, 0x07}, // , 0x00}, // '9'
{0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00}, // , 0x00}, // ':' // {0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00}, // , 0x00}, // ':'
{0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1C, 0x0C, 0x00, 0x00}, // , 0x00}, // ';' // {0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1C, 0x0C, 0x00, 0x00}, // , 0x00}, // ';'
{0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x10, /*0x00,*/ 0x00, 0x01, 0x03, 0x06, 0x0C, 0x18, 0x10}, // , 0x00}, // '<' // {0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x10, /*0x00,*/ 0x00, 0x01, 0x03, 0x06, 0x0C, 0x18, 0x10}, // , 0x00}, // '<'
{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, /*0x00,*/ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, // , 0x00}, // '=' // {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, /*0x00,*/ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, // , 0x00}, // '='
{0x00, 0x10, 0x30, 0x60, 0xC0, 0x80, 0x00, /*0x00,*/ 0x00, 0x10, 0x18, 0x0C, 0x06, 0x03, 0x01}, // , 0x00}, // '>' // {0x00, 0x10, 0x30, 0x60, 0xC0, 0x80, 0x00, /*0x00,*/ 0x00, 0x10, 0x18, 0x0C, 0x06, 0x03, 0x01}, // , 0x00}, // '>'
{0x30, 0x38, 0x08, 0x88, 0xC8, 0x78, 0x30, /*0x00,*/ 0x00, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00}, // , 0x00}, // '?' // {0x30, 0x38, 0x08, 0x88, 0xC8, 0x78, 0x30, /*0x00,*/ 0x00, 0x00, 0x00, 0x1B, 0x1B, 0x00, 0x00}, // , 0x00}, // '?'
{0xE0, 0xF0, 0x10, 0x90, 0x90, 0xF0, 0xE0, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x17, 0x17, 0x17, 0x03}, // , 0x00}, // '@' // {0xE0, 0xF0, 0x10, 0x90, 0x90, 0xF0, 0xE0, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x17, 0x17, 0x17, 0x03}, // , 0x00}, // '@'
{0xC0, 0xE0, 0x30, 0x18, 0x30, 0xE0, 0xC0, /*0x00,*/ 0x1F, 0x1F, 0x01, 0x01, 0x01, 0x1F, 0x1F}, // , 0x00}, // 'A' // {0xC0, 0xE0, 0x30, 0x18, 0x30, 0xE0, 0xC0, /*0x00,*/ 0x1F, 0x1F, 0x01, 0x01, 0x01, 0x1F, 0x1F}, // , 0x00}, // 'A'
{0x08, 0xF8, 0xF8, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'B' // {0x08, 0xF8, 0xF8, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'B'
{0xE0, 0xF0, 0x18, 0x08, 0x08, 0x18, 0x30, /*0x00,*/ 0x07, 0x0F, 0x18, 0x10, 0x10, 0x18, 0x0C}, // , 0x00}, // 'C' // {0xE0, 0xF0, 0x18, 0x08, 0x08, 0x18, 0x30, /*0x00,*/ 0x07, 0x0F, 0x18, 0x10, 0x10, 0x18, 0x0C}, // , 0x00}, // 'C'
{0x08, 0xF8, 0xF8, 0x08, 0x18, 0xF0, 0xE0, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x18, 0x0F, 0x07}, // , 0x00}, // 'D' // {0x08, 0xF8, 0xF8, 0x08, 0x18, 0xF0, 0xE0, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x18, 0x0F, 0x07}, // , 0x00}, // 'D'
{0x08, 0xF8, 0xF8, 0x88, 0xC8, 0x18, 0x38, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x11, 0x18, 0x1C}, // , 0x00}, // 'E' // {0x08, 0xF8, 0xF8, 0x88, 0xC8, 0x18, 0x38, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x11, 0x18, 0x1C}, // , 0x00}, // 'E'
{0x08, 0xF8, 0xF8, 0x88, 0xC8, 0x18, 0x38, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x01, 0x00, 0x00}, // , 0x00}, // 'F' // {0x08, 0xF8, 0xF8, 0x88, 0xC8, 0x18, 0x38, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x01, 0x00, 0x00}, // , 0x00}, // 'F'
{0xE0, 0xF0, 0x18, 0x08, 0x08, 0x18, 0x30, /*0x00,*/ 0x07, 0x0F, 0x18, 0x11, 0x11, 0x0F, 0x1F}, // , 0x00}, // 'G' // {0xE0, 0xF0, 0x18, 0x08, 0x08, 0x18, 0x30, /*0x00,*/ 0x07, 0x0F, 0x18, 0x11, 0x11, 0x0F, 0x1F}, // , 0x00}, // 'G'
{0xF8, 0xF8, 0x80, 0x80, 0x80, 0xF8, 0xF8, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'H' // {0xF8, 0xF8, 0x80, 0x80, 0x80, 0xF8, 0xF8, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'H'
{0x00, 0x00, 0x08, 0xF8, 0xF8, 0x08, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'I' // {0x00, 0x00, 0x08, 0xF8, 0xF8, 0x08, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'I'
{0x00, 0x00, 0x00, 0x08, 0xF8, 0xF8, 0x08, /*0x00,*/ 0x0E, 0x1E, 0x10, 0x10, 0x1F, 0x0F, 0x00}, // , 0x00}, // 'J' // {0x00, 0x00, 0x00, 0x08, 0xF8, 0xF8, 0x08, /*0x00,*/ 0x0E, 0x1E, 0x10, 0x10, 0x1F, 0x0F, 0x00}, // , 0x00}, // 'J'
{0x08, 0xF8, 0xF8, 0x80, 0xE0, 0x78, 0x18, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x01, 0x03, 0x1E, 0x1C}, // , 0x00}, // 'K' // {0x08, 0xF8, 0xF8, 0x80, 0xE0, 0x78, 0x18, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x01, 0x03, 0x1E, 0x1C}, // , 0x00}, // 'K'
{0x08, 0xF8, 0xF8, 0x08, 0x00, 0x00, 0x00, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x18, 0x1C}, // , 0x00}, // 'L' // {0x08, 0xF8, 0xF8, 0x08, 0x00, 0x00, 0x00, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x10, 0x18, 0x1C}, // , 0x00}, // 'L'
{0xF8, 0xF8, 0x70, 0xE0, 0x70, 0xF8, 0xF8, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'M' // {0xF8, 0xF8, 0x70, 0xE0, 0x70, 0xF8, 0xF8, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'M'
{0xF8, 0xF8, 0x70, 0xE0, 0xC0, 0xF8, 0xF8, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x00, 0x01, 0x1F, 0x1F}, // , 0x00}, // 'N' // {0xF8, 0xF8, 0x70, 0xE0, 0xC0, 0xF8, 0xF8, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x00, 0x01, 0x1F, 0x1F}, // , 0x00}, // 'N'
{0xE0, 0xF0, 0x18, 0x08, 0x18, 0xF0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x18, 0x10, 0x18, 0x0F, 0x07}, // , 0x00}, // 'O' // {0xE0, 0xF0, 0x18, 0x08, 0x18, 0xF0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x18, 0x10, 0x18, 0x0F, 0x07}, // , 0x00}, // 'O'
{0x08, 0xF8, 0xF8, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00}, // , 0x00}, // 'P' // {0x08, 0xF8, 0xF8, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00}, // , 0x00}, // 'P'
{0xF0, 0xF8, 0x08, 0x08, 0x08, 0xF8, 0xF0, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x1C, 0x78, 0x7F, 0x4F}, // , 0x00}, // 'Q' // {0xF0, 0xF8, 0x08, 0x08, 0x08, 0xF8, 0xF0, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x1C, 0x78, 0x7F, 0x4F}, // , 0x00}, // 'Q'
{0x08, 0xF8, 0xF8, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x00, 0x01, 0x1F, 0x1E}, // , 0x00}, // 'R' // {0x08, 0xF8, 0xF8, 0x88, 0x88, 0xF8, 0x70, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x00, 0x01, 0x1F, 0x1E}, // , 0x00}, // 'R'
{0x30, 0x78, 0xC8, 0x88, 0x88, 0x38, 0x30, /*0x00,*/ 0x0C, 0x1C, 0x10, 0x10, 0x11, 0x1F, 0x0E}, // , 0x00}, // 'S' // {0x30, 0x78, 0xC8, 0x88, 0x88, 0x38, 0x30, /*0x00,*/ 0x0C, 0x1C, 0x10, 0x10, 0x11, 0x1F, 0x0E}, // , 0x00}, // 'S'
{0x00, 0x38, 0x18, 0xF8, 0xF8, 0x18, 0x38, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'T' // {0x00, 0x38, 0x18, 0xF8, 0xF8, 0x18, 0x38, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'T'
{0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'U' // {0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'U'
{0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, /*0x00,*/ 0x03, 0x07, 0x0C, 0x18, 0x0C, 0x07, 0x03}, // , 0x00}, // 'V' // {0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, /*0x00,*/ 0x03, 0x07, 0x0C, 0x18, 0x0C, 0x07, 0x03}, // , 0x00}, // 'V'
{0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, /*0x00,*/ 0x07, 0x1F, 0x1C, 0x07, 0x1C, 0x1F, 0x07}, // , 0x00}, // 'W' // {0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0xF8, /*0x00,*/ 0x07, 0x1F, 0x1C, 0x07, 0x1C, 0x1F, 0x07}, // , 0x00}, // 'W'
{0x18, 0x78, 0xE0, 0x80, 0xE0, 0x78, 0x18, /*0x00,*/ 0x18, 0x1E, 0x07, 0x01, 0x07, 0x1E, 0x18}, // , 0x00}, // 'X' // {0x18, 0x78, 0xE0, 0x80, 0xE0, 0x78, 0x18, /*0x00,*/ 0x18, 0x1E, 0x07, 0x01, 0x07, 0x1E, 0x18}, // , 0x00}, // 'X'
{0x00, 0x78, 0xF8, 0x80, 0x80, 0xF8, 0x78, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'Y' // {0x00, 0x78, 0xF8, 0x80, 0x80, 0xF8, 0x78, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'Y'
{0x38, 0x18, 0x08, 0x88, 0xC8, 0x78, 0x38, /*0x00,*/ 0x1C, 0x1E, 0x13, 0x11, 0x10, 0x18, 0x1C}, // , 0x00}, // 'Z' // {0x38, 0x18, 0x08, 0x88, 0xC8, 0x78, 0x38, /*0x00,*/ 0x1C, 0x1E, 0x13, 0x11, 0x10, 0x18, 0x1C}, // , 0x00}, // 'Z'
{0x00, 0x00, 0xF8, 0xF8, 0x08, 0x08, 0x00, /*0x00,*/ 0x00, 0x00, 0x1F, 0x1F, 0x10, 0x10, 0x00}, // , 0x00}, // '[' // {0x00, 0x00, 0xF8, 0xF8, 0x08, 0x08, 0x00, /*0x00,*/ 0x00, 0x00, 0x1F, 0x1F, 0x10, 0x10, 0x00}, // , 0x00}, // '['
{0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E, 0x1C}, // , 0x00}, // '"\' // {0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E, 0x1C}, // , 0x00}, // '"\'
{0x00, 0x00, 0x08, 0x08, 0xF8, 0xF8, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x00}, // , 0x00}, // ']' // {0x00, 0x00, 0x08, 0x08, 0xF8, 0xF8, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x10, 0x1F, 0x1F, 0x00}, // , 0x00}, // ']'
{0x10, 0x18, 0x0E, 0x07, 0x0E, 0x18, 0x10, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '^' // {0x10, 0x18, 0x0E, 0x07, 0x0E, 0x18, 0x10, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '^'
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}, // , 0x40}, // '_' // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}, // , 0x40}, // '_'
{0x00, 0x00, 0x07, 0x0F, 0x08, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '`' // {0x00, 0x00, 0x07, 0x0F, 0x08, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // , 0x00}, // '`'
{0x00, 0x40, 0x40, 0x40, 0xC0, 0x80, 0x00, /*0x00,*/ 0x0E, 0x1F, 0x11, 0x11, 0x0F, 0x1F, 0x10}, // , 0x00}, // 'a' // {0x00, 0x40, 0x40, 0x40, 0xC0, 0x80, 0x00, /*0x00,*/ 0x0E, 0x1F, 0x11, 0x11, 0x0F, 0x1F, 0x10}, // , 0x00}, // 'a'
{0x08, 0xF8, 0xF8, 0x40, 0xC0, 0x80, 0x00, /*0x00,*/ 0x10, 0x1F, 0x0F, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'b' // {0x08, 0xF8, 0xF8, 0x40, 0xC0, 0x80, 0x00, /*0x00,*/ 0x10, 0x1F, 0x0F, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'b'
{0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x18, 0x08}, // , 0x00}, // 'c' // {0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x18, 0x08}, // , 0x00}, // 'c'
{0x00, 0x80, 0xC0, 0x48, 0xF8, 0xF8, 0x00, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x0F, 0x1F, 0x10}, // , 0x00}, // 'd' // {0x00, 0x80, 0xC0, 0x48, 0xF8, 0xF8, 0x00, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x0F, 0x1F, 0x10}, // , 0x00}, // 'd'
{0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x11, 0x11, 0x11, 0x19, 0x09}, // , 0x00}, // 'e' // {0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x11, 0x11, 0x11, 0x19, 0x09}, // , 0x00}, // 'e'
{0x80, 0xF0, 0xF8, 0x88, 0x18, 0x30, 0x00, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00}, // , 0x00}, // 'f' // {0x80, 0xF0, 0xF8, 0x88, 0x18, 0x30, 0x00, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x00}, // , 0x00}, // 'f'
{0x80, 0xC0, 0x40, 0x40, 0x80, 0xC0, 0x40, /*0x00,*/ 0x4F, 0xDF, 0x90, 0x90, 0xFF, 0x7F, 0x00}, // , 0x00}, // 'g' // {0x80, 0xC0, 0x40, 0x40, 0x80, 0xC0, 0x40, /*0x00,*/ 0x4F, 0xDF, 0x90, 0x90, 0xFF, 0x7F, 0x00}, // , 0x00}, // 'g'
{0x08, 0xF8, 0xF8, 0x80, 0x40, 0xC0, 0x80, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'h' // {0x08, 0xF8, 0xF8, 0x80, 0x40, 0xC0, 0x80, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'h'
{0x00, 0x00, 0x40, 0xD8, 0xD8, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'i' // {0x00, 0x00, 0x40, 0xD8, 0xD8, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'i'
{0x00, 0x00, 0x00, 0x00, 0x40, 0xD8, 0xD8, /*0x00,*/ 0x00, 0x60, 0xE0, 0x80, 0x80, 0xFF, 0x7F}, // , 0x00}, // 'j' // {0x00, 0x00, 0x00, 0x00, 0x40, 0xD8, 0xD8, /*0x00,*/ 0x00, 0x60, 0xE0, 0x80, 0x80, 0xFF, 0x7F}, // , 0x00}, // 'j'
{0x08, 0xF8, 0xF8, 0x00, 0x80, 0xC0, 0x40, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x03, 0x07, 0x1C, 0x18}, // , 0x00}, // 'k' // {0x08, 0xF8, 0xF8, 0x00, 0x80, 0xC0, 0x40, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x03, 0x07, 0x1C, 0x18}, // , 0x00}, // 'k'
{0x00, 0x00, 0x08, 0xF8, 0xF8, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'l' // {0x00, 0x00, 0x08, 0xF8, 0xF8, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1F, 0x1F, 0x10, 0x00}, // , 0x00}, // 'l'
{0xC0, 0xC0, 0xC0, 0x80, 0xC0, 0xC0, 0x80, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'm' // {0xC0, 0xC0, 0xC0, 0x80, 0xC0, 0xC0, 0x80, /*0x00,*/ 0x1F, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'm'
{0x40, 0xC0, 0x80, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'n' // {0x40, 0xC0, 0x80, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x1F, 0x1F}, // , 0x00}, // 'n'
{0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'o' // {0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'o'
{0x40, 0xC0, 0x80, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x80, 0xFF, 0xFF, 0x90, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'p' // {0x40, 0xC0, 0x80, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x80, 0xFF, 0xFF, 0x90, 0x10, 0x1F, 0x0F}, // , 0x00}, // 'p'
{0x80, 0xC0, 0x40, 0x40, 0x80, 0xC0, 0x40, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x90, 0xFF, 0xFF, 0x80}, // , 0x00}, // 'q' // {0x80, 0xC0, 0x40, 0x40, 0x80, 0xC0, 0x40, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x90, 0xFF, 0xFF, 0x80}, // , 0x00}, // 'q'
{0x40, 0xC0, 0x80, 0xC0, 0x40, 0xC0, 0x80, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x01}, // , 0x00}, // 'r' // {0x40, 0xC0, 0x80, 0xC0, 0x40, 0xC0, 0x80, /*0x00,*/ 0x10, 0x1F, 0x1F, 0x10, 0x00, 0x00, 0x01}, // , 0x00}, // 'r'
{0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x08, 0x19, 0x13, 0x12, 0x16, 0x1C, 0x08}, // , 0x00}, // 's' // {0x80, 0xC0, 0x40, 0x40, 0x40, 0xC0, 0x80, /*0x00,*/ 0x08, 0x19, 0x13, 0x12, 0x16, 0x1C, 0x08}, // , 0x00}, // 's'
{0x40, 0x40, 0xF0, 0xF8, 0x40, 0x40, 0x00, /*0x00,*/ 0x00, 0x00, 0x0F, 0x1F, 0x10, 0x18, 0x08}, // , 0x00}, // 't' // {0x40, 0x40, 0xF0, 0xF8, 0x40, 0x40, 0x00, /*0x00,*/ 0x00, 0x00, 0x0F, 0x1F, 0x10, 0x18, 0x08}, // , 0x00}, // 't'
{0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x0F, 0x1F, 0x10}, // , 0x00}, // 'u' // {0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, /*0x00,*/ 0x0F, 0x1F, 0x10, 0x10, 0x0F, 0x1F, 0x10}, // , 0x00}, // 'u'
{0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, /*0x00,*/ 0x00, 0x07, 0x0F, 0x18, 0x18, 0x0F, 0x07}, // , 0x00}, // 'v' // {0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, /*0x00,*/ 0x00, 0x07, 0x0F, 0x18, 0x18, 0x0F, 0x07}, // , 0x00}, // 'v'
{0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, /*0x00,*/ 0x0F, 0x1F, 0x18, 0x0E, 0x18, 0x1F, 0x0F}, // , 0x00}, // 'w' // {0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, /*0x00,*/ 0x0F, 0x1F, 0x18, 0x0E, 0x18, 0x1F, 0x0F}, // , 0x00}, // 'w'
{0x40, 0xC0, 0x80, 0x00, 0x80, 0xC0, 0x40, /*0x00,*/ 0x10, 0x18, 0x0F, 0x07, 0x0F, 0x18, 0x10}, // , 0x00}, // 'x' // {0x40, 0xC0, 0x80, 0x00, 0x80, 0xC0, 0x40, /*0x00,*/ 0x10, 0x18, 0x0F, 0x07, 0x0F, 0x18, 0x10}, // , 0x00}, // 'x'
{0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, /*0x00,*/ 0x8F, 0x9F, 0x90, 0x90, 0xD0, 0x7F, 0x3F}, // , 0x00}, // 'y' // {0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, /*0x00,*/ 0x8F, 0x9F, 0x90, 0x90, 0xD0, 0x7F, 0x3F}, // , 0x00}, // 'y'
{0xC0, 0xC0, 0x40, 0x40, 0xC0, 0xC0, 0x40, /*0x00,*/ 0x18, 0x1C, 0x16, 0x13, 0x11, 0x18, 0x18}, // , 0x00}, // 'z' // {0xC0, 0xC0, 0x40, 0x40, 0xC0, 0xC0, 0x40, /*0x00,*/ 0x18, 0x1C, 0x16, 0x13, 0x11, 0x18, 0x18}, // , 0x00}, // 'z'
{0x00, 0x80, 0x80, 0xF0, 0x78, 0x08, 0x08, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x10, 0x10}, // , 0x00}, // '{' // {0x00, 0x80, 0x80, 0xF0, 0x78, 0x08, 0x08, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x10, 0x10}, // , 0x00}, // '{'
{0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00}, // , 0x00}, // '|' // {0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00}, // , 0x00}, // '|'
{0x00, 0x08, 0x08, 0x78, 0xF0, 0x80, 0x80, /*0x00,*/ 0x00, 0x10, 0x10, 0x1F, 0x0F, 0x00, 0x00}, // , 0x00}, // '}' // {0x00, 0x08, 0x08, 0x78, 0xF0, 0x80, 0x80, /*0x00,*/ 0x00, 0x10, 0x10, 0x1F, 0x0F, 0x00, 0x00}, // , 0x00}, // '}'
{0x10, 0x18, 0x08, 0x18, 0x10, 0x18, 0x08, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // , 0x00} // '->' // {0x10, 0x18, 0x08, 0x18, 0x10, 0x18, 0x08, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // , 0x00} // '->'
#else //#else
// {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ' ' // // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ' '
{0x00, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00}, // '!' // {0x00, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00}, // '!'
{0x00, 0x0F, 0x1F, 0x00, 0x00, 0x1F, 0x0F, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '"' // {0x00, 0x0F, 0x1F, 0x00, 0x00, 0x1F, 0x0F, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '"'
{0x20, 0xF8, 0xF8, 0x20, 0xF8, 0xF8, 0x20, /*0x00,*/ 0x02, 0x0F, 0x0F, 0x02, 0x0F, 0x0F, 0x02}, // '#' // {0x20, 0xF8, 0xF8, 0x20, 0xF8, 0xF8, 0x20, /*0x00,*/ 0x02, 0x0F, 0x0F, 0x02, 0x0F, 0x0F, 0x02}, // '#'
{0x70, 0xF8, 0x88, 0x8E, 0x8E, 0x98, 0x10, /*0x00,*/ 0x04, 0x0C, 0x08, 0x38, 0x38, 0x0F, 0x07}, // '$' // {0x70, 0xF8, 0x88, 0x8E, 0x8E, 0x98, 0x10, /*0x00,*/ 0x04, 0x0C, 0x08, 0x38, 0x38, 0x0F, 0x07}, // '$'
{0x30, 0x30, 0x00, 0x80, 0xC0, 0x60, 0x30, /*0x00,*/ 0x0C, 0x06, 0x03, 0x01, 0x00, 0x0C, 0x0C}, // '%' // {0x30, 0x30, 0x00, 0x80, 0xC0, 0x60, 0x30, /*0x00,*/ 0x0C, 0x06, 0x03, 0x01, 0x00, 0x0C, 0x0C}, // '%'
{0x80, 0xD8, 0x7C, 0xE4, 0xBC, 0xD8, 0x40, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x07, 0x0F, 0x08}, // '&' // {0x80, 0xD8, 0x7C, 0xE4, 0xBC, 0xD8, 0x40, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x07, 0x0F, 0x08}, // '&'
{0x00, 0x10, 0x1F, 0x0F, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ''' // {0x00, 0x10, 0x1F, 0x0F, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '''
{0x00, 0x00, 0xF0, 0xF8, 0x0C, 0x04, 0x00, /*0x00,*/ 0x00, 0x00, 0x03, 0x07, 0x0C, 0x08, 0x00}, // '(' // {0x00, 0x00, 0xF0, 0xF8, 0x0C, 0x04, 0x00, /*0x00,*/ 0x00, 0x00, 0x03, 0x07, 0x0C, 0x08, 0x00}, // '('
{0x00, 0x00, 0x04, 0x0C, 0xF8, 0xF0, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0C, 0x07, 0x03, 0x00}, // ')' // {0x00, 0x00, 0x04, 0x0C, 0xF8, 0xF0, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0C, 0x07, 0x03, 0x00}, // ')'
{0x00, 0x80, 0xA0, 0xE0, 0xC0, 0xE0, 0xA0, /*0x80,*/ 0x00, 0x00, 0x02, 0x03, 0x01, 0x03, 0x02}, // '*' // {0x00, 0x80, 0xA0, 0xE0, 0xC0, 0xE0, 0xA0, /*0x80,*/ 0x00, 0x00, 0x02, 0x03, 0x01, 0x03, 0x02}, // '*'
{0x00, 0x80, 0x80, 0xE0, 0xE0, 0x80, 0x80, /*0x00,*/ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00}, // '+' // {0x00, 0x80, 0x80, 0xE0, 0xE0, 0x80, 0x80, /*0x00,*/ 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00}, // '+'
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1E, 0x0E, 0x00, 0x00}, // ',' // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x10, 0x1E, 0x0E, 0x00, 0x00}, // ','
{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '-' // {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '-'
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00}, // '.' // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00}, // '.'
{0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, /*0x00,*/ 0x0C, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00}, // '/' // {0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, /*0x00,*/ 0x0C, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00}, // '/'
{0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '0' // {0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '0'
{0x00, 0x10, 0x18, 0xFC, 0xFC, 0x00, 0x00, /*0x00,*/ 0x00, 0x08, 0x08, 0x0F, 0x0F, 0x08, 0x08}, // '1' // {0x00, 0x10, 0x18, 0xFC, 0xFC, 0x00, 0x00, /*0x00,*/ 0x00, 0x08, 0x08, 0x0F, 0x0F, 0x08, 0x08}, // '1'
{0x18, 0x1C, 0x04, 0x84, 0xC4, 0x7C, 0x38, /*0x00,*/ 0x0C, 0x0E, 0x0B, 0x09, 0x08, 0x08, 0x08}, // '2' // {0x18, 0x1C, 0x04, 0x84, 0xC4, 0x7C, 0x38, /*0x00,*/ 0x0C, 0x0E, 0x0B, 0x09, 0x08, 0x08, 0x08}, // '2'
{0x18, 0x1C, 0x44, 0x44, 0x44, 0xFC, 0xB8, /*0x00,*/ 0x06, 0x0E, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '3' // {0x18, 0x1C, 0x44, 0x44, 0x44, 0xFC, 0xB8, /*0x00,*/ 0x06, 0x0E, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '3'
{0x80, 0xC0, 0x60, 0x30, 0x18, 0xFC, 0xFC, /*0x00,*/ 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x0F}, // '4' // {0x80, 0xC0, 0x60, 0x30, 0x18, 0xFC, 0xFC, /*0x00,*/ 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x0F}, // '4'
{0x7C, 0x7C, 0x44, 0x44, 0x44, 0xC4, 0x84, /*0x00,*/ 0x04, 0x0C, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '5' // {0x7C, 0x7C, 0x44, 0x44, 0x44, 0xC4, 0x84, /*0x00,*/ 0x04, 0x0C, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '5'
{0xF0, 0xF8, 0x4C, 0x44, 0x44, 0xC4, 0x80, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '6' // {0xF0, 0xF8, 0x4C, 0x44, 0x44, 0xC4, 0x80, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '6'
{0x04, 0x04, 0x04, 0x84, 0xE4, 0x7C, 0x1C, /*0x00,*/ 0x00, 0x00, 0x0E, 0x0F, 0x01, 0x00, 0x00}, // '7' // {0x04, 0x04, 0x04, 0x84, 0xE4, 0x7C, 0x1C, /*0x00,*/ 0x00, 0x00, 0x0E, 0x0F, 0x01, 0x00, 0x00}, // '7'
{0xB8, 0xFC, 0x44, 0x44, 0x44, 0xFC, 0xB8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '8' // {0xB8, 0xFC, 0x44, 0x44, 0x44, 0xFC, 0xB8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // '8'
{0x78, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0xF8, /*0x00,*/ 0x00, 0x08, 0x08, 0x08, 0x0C, 0x07, 0x03}, // '9' // {0x78, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0xF8, /*0x00,*/ 0x00, 0x08, 0x08, 0x08, 0x0C, 0x07, 0x03}, // '9'
{0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00}, // ':' // {0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00}, // ':'
{0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0E, 0x06, 0x00, 0x00}, // ';' // {0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0E, 0x06, 0x00, 0x00}, // ';'
{0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x08, /*0x00,*/ 0x00, 0x00, 0x01, 0x03, 0x06, 0x0C, 0x08}, // '<' // {0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x08, /*0x00,*/ 0x00, 0x00, 0x01, 0x03, 0x06, 0x0C, 0x08}, // '<'
{0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /*0x00,*/ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02}, // '=' // {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /*0x00,*/ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02}, // '='
{0x00, 0x08, 0x18, 0x30, 0x60, 0xC0, 0x80, /*0x00,*/ 0x00, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x00}, // '>' // {0x00, 0x08, 0x18, 0x30, 0x60, 0xC0, 0x80, /*0x00,*/ 0x00, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x00}, // '>'
{0x38, 0x3C, 0x04, 0x84, 0xC4, 0x7C, 0x38, /*0x00,*/ 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00}, // '?' // {0x38, 0x3C, 0x04, 0x84, 0xC4, 0x7C, 0x38, /*0x00,*/ 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, 0x00}, // '?'
{0xF0, 0xF8, 0x08, 0xC8, 0xC8, 0xF8, 0xF0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x0B, 0x0B, 0x0B, 0x01}, // '@' // {0xF0, 0xF8, 0x08, 0xC8, 0xC8, 0xF8, 0xF0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x0B, 0x0B, 0x0B, 0x01}, // '@'
{0xF8, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0xF8, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'A' // {0xF8, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0xF8, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'A'
{0xFC, 0xFC, 0x44, 0x44, 0x44, 0xFC, 0xB8, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'B' // {0xFC, 0xFC, 0x44, 0x44, 0x44, 0xFC, 0xB8, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'B'
{0xF8, 0xFC, 0x04, 0x04, 0x04, 0x1C, 0x18, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0E, 0x06}, // 'C' // {0xF8, 0xFC, 0x04, 0x04, 0x04, 0x1C, 0x18, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0E, 0x06}, // 'C'
{0xFC, 0xFC, 0x04, 0x04, 0x0C, 0xF8, 0xF0, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x0C, 0x07, 0x03}, // 'D' // {0xFC, 0xFC, 0x04, 0x04, 0x0C, 0xF8, 0xF0, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x0C, 0x07, 0x03}, // 'D'
{0xFC, 0xFC, 0x44, 0x44, 0x44, 0x04, 0x04, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08}, // 'E' // {0xFC, 0xFC, 0x44, 0x44, 0x44, 0x04, 0x04, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08}, // 'E'
{0xFC, 0xFC, 0x44, 0x44, 0x44, 0x04, 0x04, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00}, // 'F' // {0xFC, 0xFC, 0x44, 0x44, 0x44, 0x04, 0x04, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00}, // 'F'
{0xF8, 0xFC, 0x04, 0x84, 0x84, 0x9C, 0x98, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'G' // {0xF8, 0xFC, 0x04, 0x84, 0x84, 0x9C, 0x98, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'G'
{0xFC, 0xFC, 0x40, 0x40, 0x40, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'H' // {0xFC, 0xFC, 0x40, 0x40, 0x40, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'H'
{0x00, 0x00, 0x04, 0xFC, 0xFC, 0x04, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00}, // 'I' // {0x00, 0x00, 0x04, 0xFC, 0xFC, 0x04, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00}, // 'I'
{0x00, 0x00, 0x00, 0x04, 0xFC, 0xFC, 0x04, /*0x00,*/ 0x06, 0x0E, 0x08, 0x08, 0x0F, 0x07, 0x00}, // 'J' // {0x00, 0x00, 0x00, 0x04, 0xFC, 0xFC, 0x04, /*0x00,*/ 0x06, 0x0E, 0x08, 0x08, 0x0F, 0x07, 0x00}, // 'J'
{0xFC, 0xFC, 0xE0, 0x30, 0x18, 0x0C, 0x04, /*0x00,*/ 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08}, // 'K' // {0xFC, 0xFC, 0xE0, 0x30, 0x18, 0x0C, 0x04, /*0x00,*/ 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08}, // 'K'
{0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08}, // 'L' // {0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08}, // 'L'
{0xFC, 0xFC, 0x18, 0x70, 0x18, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'M' // {0xFC, 0xFC, 0x18, 0x70, 0x18, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'M'
{0xFC, 0xFC, 0x60, 0xC0, 0x80, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0F}, // 'N' // {0xFC, 0xFC, 0x60, 0xC0, 0x80, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0F}, // 'N'
{0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'O' // {0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'O'
{0xFC, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0x78, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00}, // 'P' // {0xFC, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0x78, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00}, // 'P'
{0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x0C, 0x0C, 0x1F, 0x17}, // 'Q' // {0xF8, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0xF8, /*0x00,*/ 0x07, 0x0F, 0x08, 0x0C, 0x0C, 0x1F, 0x17}, // 'Q'
{0xFC, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0x78, /*0x00,*/ 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08}, // 'R' // {0xFC, 0xFC, 0x84, 0x84, 0x84, 0xFC, 0x78, /*0x00,*/ 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08}, // 'R'
{0x38, 0x7C, 0x44, 0x44, 0x44, 0xCC, 0x88, /*0x00,*/ 0x06, 0x0E, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'S' // {0x38, 0x7C, 0x44, 0x44, 0x44, 0xCC, 0x88, /*0x00,*/ 0x06, 0x0E, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'S'
{0x00, 0x04, 0x04, 0xFC, 0xFC, 0x04, 0x04, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00}, // 'T' // {0x00, 0x04, 0x04, 0xFC, 0xFC, 0x04, 0x04, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00}, // 'T'
{0xFC, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0xFC, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'U' // {0xFC, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0xFC, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'U'
{0x7C, 0xFC, 0x80, 0x00, 0x80, 0xFC, 0x7C, /*0x00,*/ 0x00, 0x03, 0x0F, 0x0C, 0x0F, 0x03, 0x00}, // 'V' // {0x7C, 0xFC, 0x80, 0x00, 0x80, 0xFC, 0x7C, /*0x00,*/ 0x00, 0x03, 0x0F, 0x0C, 0x0F, 0x03, 0x00}, // 'V'
{0xFC, 0xFC, 0x00, 0x80, 0x00, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x06, 0x03, 0x06, 0x0F, 0x0F}, // 'W' // {0xFC, 0xFC, 0x00, 0x80, 0x00, 0xFC, 0xFC, /*0x00,*/ 0x0F, 0x0F, 0x06, 0x03, 0x06, 0x0F, 0x0F}, // 'W'
{0x0C, 0x3C, 0xF0, 0xC0, 0xF0, 0x3C, 0x0C, /*0x00,*/ 0x0C, 0x0F, 0x03, 0x00, 0x03, 0x0F, 0x0C}, // 'X' // {0x0C, 0x3C, 0xF0, 0xC0, 0xF0, 0x3C, 0x0C, /*0x00,*/ 0x0C, 0x0F, 0x03, 0x00, 0x03, 0x0F, 0x0C}, // 'X'
{0x00, 0x3C, 0x7C, 0xC0, 0xC0, 0x7C, 0x3C, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00}, // 'Y' // {0x00, 0x3C, 0x7C, 0xC0, 0xC0, 0x7C, 0x3C, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00}, // 'Y'
{0x04, 0x04, 0x84, 0xC4, 0x64, 0x3C, 0x1C, /*0x00,*/ 0x0E, 0x0F, 0x09, 0x08, 0x08, 0x08, 0x08}, // 'Z' // {0x04, 0x04, 0x84, 0xC4, 0x64, 0x3C, 0x1C, /*0x00,*/ 0x0E, 0x0F, 0x09, 0x08, 0x08, 0x08, 0x08}, // 'Z'
{0x00, 0x00, 0xFC, 0xFC, 0x04, 0x04, 0x00, /*0x00,*/ 0x00, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x00}, // '[' // {0x00, 0x00, 0xFC, 0xFC, 0x04, 0x04, 0x00, /*0x00,*/ 0x00, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x00}, // '['
{0x38, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E}, // '"\' // {0x38, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E}, // '"\'
{0x00, 0x00, 0x04, 0x04, 0xFC, 0xFC, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x08, 0x0F, 0x0F, 0x00}, // ']' // {0x00, 0x00, 0x04, 0x04, 0xFC, 0xFC, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x08, 0x0F, 0x0F, 0x00}, // ']'
{0x08, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x08, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '^' // {0x08, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x08, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '^'
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}, // '_' // {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*0x00,*/ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}, // '_'
{0x00, 0x00, 0x03, 0x07, 0x04, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '`' // {0x00, 0x00, 0x03, 0x07, 0x04, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '`'
{0x00, 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, 0xC0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F}, // 'a' // {0x00, 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, 0xC0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F}, // 'a'
{0xFC, 0xFC, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'b' // {0xFC, 0xFC, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'b'
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0x60, 0x40, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0C, 0x04}, // 'c' // {0xC0, 0xE0, 0x20, 0x20, 0x20, 0x60, 0x40, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0C, 0x04}, // 'c'
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xFC, 0xFC, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F}, // 'd' // {0xC0, 0xE0, 0x20, 0x20, 0x20, 0xFC, 0xFC, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F}, // 'd'
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x07, 0x0F, 0x09, 0x09, 0x09, 0x09, 0x01}, // 'e' // {0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x07, 0x0F, 0x09, 0x09, 0x09, 0x09, 0x01}, // 'e'
{0x20, 0x20, 0xF8, 0xFC, 0x24, 0x24, 0x04, /*0x00,*/ 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00}, // 'f' // {0x20, 0x20, 0xF8, 0xFC, 0x24, 0x24, 0x04, /*0x00,*/ 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00}, // 'f'
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x4F, 0x48, 0x48, 0x48, 0x7F, 0x3F}, // 'g' // {0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x4F, 0x48, 0x48, 0x48, 0x7F, 0x3F}, // 'g'
{0xFC, 0xFC, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'h' // {0xFC, 0xFC, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'h'
{0x00, 0x00, 0x20, 0xEC, 0xEC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00}, // 'i' // {0x00, 0x00, 0x20, 0xEC, 0xEC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00}, // 'i'
{0x00, 0x00, 0x00, 0x00, 0x20, 0xEC, 0xEC, /*0x00,*/ 0x00, 0x30, 0x70, 0x40, 0x40, 0x7F, 0x3F}, // 'j' // {0x00, 0x00, 0x00, 0x00, 0x20, 0xEC, 0xEC, /*0x00,*/ 0x00, 0x30, 0x70, 0x40, 0x40, 0x7F, 0x3F}, // 'j'
{0xFC, 0xFC, 0x00, 0x80, 0xC0, 0x60, 0x20, /*0x00,*/ 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08}, // 'k' // {0xFC, 0xFC, 0x00, 0x80, 0xC0, 0x60, 0x20, /*0x00,*/ 0x0F, 0x0F, 0x01, 0x03, 0x06, 0x0C, 0x08}, // 'k'
{0x00, 0x00, 0x04, 0xFC, 0xFC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00}, // 'l' // {0x00, 0x00, 0x04, 0xFC, 0xFC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x08, 0x0F, 0x0F, 0x08, 0x00}, // 'l'
{0xE0, 0xE0, 0x20, 0xE0, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x0F}, // 'm' // {0xE0, 0xE0, 0x20, 0xE0, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x0F}, // 'm'
{0xE0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'n' // {0xE0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x0F}, // 'n'
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'o' // {0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'o'
{0xE0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x7F, 0x7F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'p' // {0xE0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xC0, /*0x00,*/ 0x7F, 0x7F, 0x08, 0x08, 0x08, 0x0F, 0x07}, // 'p'
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x7F, 0x7F}, // 'q' // {0xC0, 0xE0, 0x20, 0x20, 0x20, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x7F, 0x7F}, // 'q'
{0xE0, 0xE0, 0x60, 0x20, 0x20, 0x20, 0x20, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00}, // 'r' // {0xE0, 0xE0, 0x60, 0x20, 0x20, 0x20, 0x20, /*0x00,*/ 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00}, // 'r'
{0xC0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, /*0x00,*/ 0x08, 0x09, 0x09, 0x09, 0x09, 0x0F, 0x06}, // 's' // {0xC0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, /*0x00,*/ 0x08, 0x09, 0x09, 0x09, 0x09, 0x0F, 0x06}, // 's'
{0x20, 0x20, 0xFC, 0xFC, 0x20, 0x20, 0x00, /*0x00,*/ 0x00, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08}, // 't' // {0x20, 0x20, 0xFC, 0xFC, 0x20, 0x20, 0x00, /*0x00,*/ 0x00, 0x00, 0x07, 0x0F, 0x08, 0x08, 0x08}, // 't'
{0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F}, // 'u' // {0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x08, 0x08, 0x0F, 0x0F}, // 'u'
{0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x00, 0x03, 0x0F, 0x0C, 0x0F, 0x03, 0x00}, // 'v' // {0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x00, 0x03, 0x0F, 0x0C, 0x0F, 0x03, 0x00}, // 'v'
{0xE0, 0xE0, 0x00, 0x80, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x0F, 0x08, 0x0F, 0x07}, // 'w' // {0xE0, 0xE0, 0x00, 0x80, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x0F, 0x08, 0x0F, 0x08, 0x0F, 0x07}, // 'w'
{0x60, 0xE0, 0x80, 0x00, 0x80, 0xE0, 0x60, /*0x00,*/ 0x0C, 0x0E, 0x03, 0x01, 0x03, 0x0E, 0x0C}, // 'x' // {0x60, 0xE0, 0x80, 0x00, 0x80, 0xE0, 0x60, /*0x00,*/ 0x0C, 0x0E, 0x03, 0x01, 0x03, 0x0E, 0x0C}, // 'x'
{0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x4F, 0x48, 0x48, 0x48, 0x7F, 0x3F}, // 'y' // {0xE0, 0xE0, 0x00, 0x00, 0x00, 0xE0, 0xE0, /*0x00,*/ 0x07, 0x4F, 0x48, 0x48, 0x48, 0x7F, 0x3F}, // 'y'
{0x20, 0x20, 0x20, 0xA0, 0xE0, 0x60, 0x20, /*0x00,*/ 0x0C, 0x0E, 0x0B, 0x09, 0x08, 0x08, 0x08}, // 'z' // {0x20, 0x20, 0x20, 0xA0, 0xE0, 0x60, 0x20, /*0x00,*/ 0x0C, 0x0E, 0x0B, 0x09, 0x08, 0x08, 0x08}, // 'z'
{0x00, 0x00, 0x40, 0xF8, 0xBC, 0x04, 0x04, /*0x00,*/ 0x00, 0x00, 0x00, 0x07, 0x0F, 0x08, 0x08}, // '{' // {0x00, 0x00, 0x40, 0xF8, 0xBC, 0x04, 0x04, /*0x00,*/ 0x00, 0x00, 0x00, 0x07, 0x0F, 0x08, 0x08}, // '{'
{0x00, 0x00, 0x00, 0xBC, 0xBC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00}, // '|' // {0x00, 0x00, 0x00, 0xBC, 0xBC, 0x00, 0x00, /*0x00,*/ 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00}, // '|'
{0x00, 0x04, 0x04, 0xBC, 0xF8, 0x40, 0x00, /*0x00,*/ 0x00, 0x08, 0x08, 0x0F, 0x07, 0x00, 0x00}, // '}' // {0x00, 0x04, 0x04, 0xBC, 0xF8, 0x40, 0x00, /*0x00,*/ 0x00, 0x08, 0x08, 0x0F, 0x07, 0x00, 0x00}, // '}'
{0x08, 0x0C, 0x04, 0x0C, 0x08, 0x0C, 0x04, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // '->' // {0x08, 0x0C, 0x04, 0x0C, 0x08, 0x0C, 0x04, /*0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // '->'
#endif //#endif
}; //};
#if 0 #if 0
// original font // original font
@@ -252,20 +252,20 @@ const uint8_t gFontBig[95 - 1][16 - 2] =
#else #else
// Terminus font // Terminus font
const uint8_t gFontBigDigits[11][26 - 6] = // const uint8_t gFontBigDigits[11][26 - 6] =
{ // {
{/*0x00, 0x00,*/ 0xFC, 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x06, 0xFE, 0xFE, 0xFC, /*0x00,*/ /*0x00, 0x00,*/ 0x3F, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, /*0x00*/}, // {/*0x00, 0x00,*/ 0xFC, 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x06, 0xFE, 0xFE, 0xFC, /*0x00,*/ /*0x00, 0x00,*/ 0x3F, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, /*0x00*/},
{/*0x00, 0x00,*/ 0x00, 0x00, 0x18, 0x1C, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, /*0x00,*/ /*0x00, 0x00,*/ 0x00, 0x00, 0x60, 0x60, 0x7F, 0x7F, 0x7F, 0x60, 0x60, 0x00, /*0x00*/}, // {/*0x00, 0x00,*/ 0x00, 0x00, 0x18, 0x1C, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, /*0x00,*/ /*0x00, 0x00,*/ 0x00, 0x00, 0x60, 0x60, 0x7F, 0x7F, 0x7F, 0x60, 0x60, 0x00, /*0x00*/},
{/*0x00, 0x00,*/ 0x1C, 0x1E, 0x1E, 0x06, 0x06, 0x06, 0x86, 0xFE, 0xFE, 0x7C, /*0x00,*/ /*0x00, 0x00,*/ 0x60, 0x70, 0x78, 0x7C, 0x6E, 0x67, 0x63, 0x61, 0x60, 0x60, /*0x00*/}, // {/*0x00, 0x00,*/ 0x1C, 0x1E, 0x1E, 0x06, 0x06, 0x06, 0x86, 0xFE, 0xFE, 0x7C, /*0x00,*/ /*0x00, 0x00,*/ 0x60, 0x70, 0x78, 0x7C, 0x6E, 0x67, 0x63, 0x61, 0x60, 0x60, /*0x00*/},
{/*0x00, 0x00,*/ 0x0C, 0x0E, 0x0E, 0x86, 0x86, 0x86, 0x86, 0xFE, 0xFE, 0x7C, /*0x00,*/ /*0x00, 0x00,*/ 0x30, 0x70, 0x70, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x7F, 0x3E, /*0x00*/}, // {/*0x00, 0x00,*/ 0x0C, 0x0E, 0x0E, 0x86, 0x86, 0x86, 0x86, 0xFE, 0xFE, 0x7C, /*0x00,*/ /*0x00, 0x00,*/ 0x30, 0x70, 0x70, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x7F, 0x3E, /*0x00*/},
{/*0x00, 0x00,*/ 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0xFE, 0xFE, 0xFE, /*0x00,*/ /*0x00, 0x00,*/ 0x0F, 0x0F, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x7F, 0x7F, 0x7F, /*0x00*/}, // {/*0x00, 0x00,*/ 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0xFE, 0xFE, 0xFE, /*0x00,*/ /*0x00, 0x00,*/ 0x0F, 0x0F, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x7F, 0x7F, 0x7F, /*0x00*/},
{/*0x00, 0x00,*/ 0xFE, 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x86, /*0x00,*/ /*0x00, 0x00,*/ 0x30, 0x70, 0x70, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, /*0x00*/}, // {/*0x00, 0x00,*/ 0xFE, 0xFE, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x86, /*0x00,*/ /*0x00, 0x00,*/ 0x30, 0x70, 0x70, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, /*0x00*/},
{/*0x00, 0x00,*/ 0xF8, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x80, /*0x00,*/ /*0x00, 0x00,*/ 0x3F, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, /*0x00*/}, // {/*0x00, 0x00,*/ 0xF8, 0xFC, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x80, /*0x00,*/ /*0x00, 0x00,*/ 0x3F, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x7F, 0x3F, /*0x00*/},
{/*0x00, 0x00,*/ 0x0E, 0x0E, 0x0E, 0x06, 0x06, 0x86, 0xE6, 0xFE, 0x7E, 0x1E, /*0x00,*/ /*0x00, 0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7F, 0x7F, 0x03, 0x00, 0x00, /*0x00*/}, // {/*0x00, 0x00,*/ 0x0E, 0x0E, 0x0E, 0x06, 0x06, 0x86, 0xE6, 0xFE, 0x7E, 0x1E, /*0x00,*/ /*0x00, 0x00,*/ 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7F, 0x7F, 0x03, 0x00, 0x00, /*0x00*/},
{/*0x00, 0x00,*/ 0x7C, 0xFE, 0xFE, 0x86, 0x86, 0x86, 0x86, 0xFE, 0xFE, 0x7C, /*0x00,*/ /*0x00, 0x00,*/ 0x3F, 0x7F, 0x7F, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x7F, 0x3F, /*0x00*/}, // {/*0x00, 0x00,*/ 0x7C, 0xFE, 0xFE, 0x86, 0x86, 0x86, 0x86, 0xFE, 0xFE, 0x7C, /*0x00,*/ /*0x00, 0x00,*/ 0x3F, 0x7F, 0x7F, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x7F, 0x3F, /*0x00*/},
{/*0x00, 0x00,*/ 0xFC, 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x06, 0xFE, 0xFE, 0xFC, /*0x00,*/ /*0x00, 0x00,*/ 0x01, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x7F, 0x3F, 0x1F, /*0x00*/}, // {/*0x00, 0x00,*/ 0xFC, 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x06, 0xFE, 0xFE, 0xFC, /*0x00,*/ /*0x00, 0x00,*/ 0x01, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x7F, 0x3F, 0x1F, /*0x00*/},
{/*0x00, 0x00,*/ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, /*0x00,*/ /*0x00, 0x00,*/ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /*0x00*/} // {/*0x00, 0x00,*/ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, /*0x00,*/ /*0x00, 0x00,*/ 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, /*0x00*/}
}; // };
#endif #endif
/* /*
const uint8_t gFontSmallDigits[11][7] = const uint8_t gFontSmallDigits[11][7] =

View File

@@ -195,40 +195,40 @@ int32_t TX_freq_check(const uint32_t Frequency)
return 0; return 0;
break; break;
case F_LOCK_FCC: // case F_LOCK_FCC:
if (Frequency >= 14400000 && Frequency < 14800000) // if (Frequency >= 14400000 && Frequency < 14800000)
return 0; // return 0;
if (Frequency >= 42000000 && Frequency < 45000000) // if (Frequency >= 42000000 && Frequency < 45000000)
return 0; // return 0;
break; // break;
//
case F_LOCK_CE: // case F_LOCK_CE:
if (Frequency >= 14400000 && Frequency < 14600000) // if (Frequency >= 14400000 && Frequency < 14600000)
return 0; // return 0;
if (Frequency >= 43000000 && Frequency < 44000000) // if (Frequency >= 43000000 && Frequency < 44000000)
return 0; // return 0;
break; // break;
//
case F_LOCK_GB: // case F_LOCK_GB:
if (Frequency >= 14400000 && Frequency < 14800000) // if (Frequency >= 14400000 && Frequency < 14800000)
return 0; // return 0;
if (Frequency >= 43000000 && Frequency < 44000000) // if (Frequency >= 43000000 && Frequency < 44000000)
return 0; // return 0;
break; // break;
//
case F_LOCK_430: // case F_LOCK_430:
if (Frequency >= frequencyBandTable[BAND3_137MHz].lower && Frequency < 17400000) // if (Frequency >= frequencyBandTable[BAND3_137MHz].lower && Frequency < 17400000)
return 0; // return 0;
if (Frequency >= 40000000 && Frequency < 43000000) // if (Frequency >= 40000000 && Frequency < 43000000)
return 0; // return 0;
break; // break;
//
case F_LOCK_438: // case F_LOCK_438:
if (Frequency >= frequencyBandTable[BAND3_137MHz].lower && Frequency < 17400000) // if (Frequency >= frequencyBandTable[BAND3_137MHz].lower && Frequency < 17400000)
return 0; // return 0;
if (Frequency >= 40000000 && Frequency < 43800000) // if (Frequency >= 40000000 && Frequency < 43800000)
return 0; // return 0;
break; // break;
#ifdef ENABLE_FEAT_F4HWN_PMR #ifdef ENABLE_FEAT_F4HWN_PMR
case F_LOCK_PMR: case F_LOCK_PMR:

View File

@@ -17,16 +17,24 @@
#include <string.h> #include <string.h>
#include "app/dtmf.h" #include "app/dtmf.h"
#if defined(ENABLE_FMRADIO) #if defined(ENABLE_FMRADIO)
#include "app/fm.h" #include "app/fm.h"
#endif #endif
#include "audio.h" #include "audio.h"
#include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/gpio.h"
#include "dcs.h" #include "dcs.h"
#include "driver/backlight.h" #include "driver/backlight.h"
#if defined(ENABLE_FMRADIO) #if defined(ENABLE_FMRADIO)
#include "driver/bk1080.h" #include "driver/bk1080.h"
#endif #endif
#include "driver/bk4819.h" #include "driver/bk4819.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "driver/system.h" #include "driver/system.h"
@@ -39,18 +47,18 @@
#include "settings.h" #include "settings.h"
#include "ui/status.h" #include "ui/status.h"
#include "ui/ui.h" #include "ui/ui.h"
#include "app/app.h"
FUNCTION_Type_t gCurrentFunction; FUNCTION_Type_t gCurrentFunction;
bool FUNCTION_IsRx() bool FUNCTION_IsRx() {
{
return gCurrentFunction == FUNCTION_MONITOR || return gCurrentFunction == FUNCTION_MONITOR ||
gCurrentFunction == FUNCTION_INCOMING || gCurrentFunction == FUNCTION_INCOMING ||
gCurrentFunction == FUNCTION_RECEIVE; gCurrentFunction == FUNCTION_RECEIVE;
} }
void FUNCTION_Init(void) void FUNCTION_Init(void) {
{
g_CxCSS_TAIL_Found = false; g_CxCSS_TAIL_Found = false;
g_CDCSS_Lost = false; g_CDCSS_Lost = false;
g_CTCSS_Lost = false; g_CTCSS_Lost = false;
@@ -86,8 +94,7 @@ void FUNCTION_Init(void)
gUpdateStatus = true; gUpdateStatus = true;
} }
void FUNCTION_Foreground(const FUNCTION_Type_t PreviousFunction) void FUNCTION_Foreground(const FUNCTION_Type_t PreviousFunction) {
{
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
if (gDTMF_ReplyState != DTMF_REPLY_NONE) if (gDTMF_ReplyState != DTMF_REPLY_NONE)
RADIO_PrepareCssTX(); RADIO_PrepareCssTX();
@@ -109,8 +116,7 @@ void FUNCTION_Foreground(const FUNCTION_Type_t PreviousFunction)
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT ||
gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED ||
gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) {
{
gDTMF_auto_reset_time_500ms = gEeprom.DTMF_auto_reset_time * 2; gDTMF_auto_reset_time_500ms = gEeprom.DTMF_auto_reset_time * 2;
} }
#endif #endif
@@ -119,12 +125,9 @@ void FUNCTION_Foreground(const FUNCTION_Type_t PreviousFunction)
void FUNCTION_PowerSave() { void FUNCTION_PowerSave() {
#ifdef ENABLE_FEAT_F4HWN_SLEEP #ifdef ENABLE_FEAT_F4HWN_SLEEP
if(gWakeUp) if (gWakeUp) {
{
gPowerSave_10ms = gEeprom.BATTERY_SAVE * 200; // deep sleep now indexed on BatSav gPowerSave_10ms = gEeprom.BATTERY_SAVE * 200; // deep sleep now indexed on BatSav
} } else {
else
{
gPowerSave_10ms = gEeprom.BATTERY_SAVE * 10; gPowerSave_10ms = gEeprom.BATTERY_SAVE * 10;
} }
#else #else
@@ -147,9 +150,11 @@ void FUNCTION_PowerSave() {
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
} }
void FUNCTION_Transmit() void FUNCTION_Transmit() {
{
// if DTMF is enabled when TX'ing, it changes the TX audio filtering !! .. 1of11 // if DTMF is enabled when TX'ing, it changes the TX audio filtering !! .. 1of11
MSG_EnableRX(false);
BK4819_DisableDTMF(); BK4819_DisableDTMF();
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
@@ -167,8 +172,7 @@ void FUNCTION_Transmit()
#endif #endif
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_SITE_ALARM) if (gAlarmState == ALARM_STATE_SITE_ALARM) {
{
GUI_DisplayScreen(); GUI_DisplayScreen();
AUDIO_AudioPathOff(); AUDIO_AudioPathOff();
@@ -206,8 +210,10 @@ void FUNCTION_Transmit()
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState != ALARM_STATE_OFF) { if (gAlarmState != ALARM_STATE_OFF) {
#ifdef ENABLE_TX1750 #ifdef ENABLE_TX1750
if (gAlarmState == ALARM_STATE_TX1750) if (gAlarmState == ALARM_STATE_TX1750) {
BK4819_TransmitTone(true, 1750); BK4819_TransmitTone(false, 1750);
gAlarmState = ALARM_STATE_OFF;
}
#endif #endif
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
@@ -220,20 +226,18 @@ void FUNCTION_Transmit()
SYSTEM_DelayMs(2); SYSTEM_DelayMs(2);
AUDIO_AudioPathOn(); AUDIO_AudioPathOn();
gEnableSpeaker = true; gEnableSpeaker = true;
BK4819_ExitTxMute();
gVfoConfigureMode = VFO_CONFIGURE; gVfoConfigureMode = VFO_CONFIGURE;
return; return;
} }
#endif #endif
#ifdef ENABLE_FEAT_F4HWN
BK4819_DisableScramble(); if (gCurrentVfo->SCRAMBLING_TYPE > 0)
#else
if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1); BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
else else
BK4819_DisableScramble(); BK4819_DisableScramble();
#endif
if (gSetting_backlight_on_tx_rx & BACKLIGHT_ON_TR_TX) { if (gSetting_backlight_on_tx_rx & BACKLIGHT_ON_TR_TX) {
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
@@ -241,9 +245,7 @@ void FUNCTION_Transmit()
} }
void FUNCTION_Select(FUNCTION_Type_t Function) {
void FUNCTION_Select(FUNCTION_Type_t Function)
{
const FUNCTION_Type_t PreviousFunction = gCurrentFunction; const FUNCTION_Type_t PreviousFunction = gCurrentFunction;
const bool bWasPowerSave = PreviousFunction == FUNCTION_POWER_SAVE; const bool bWasPowerSave = PreviousFunction == FUNCTION_POWER_SAVE;

View File

@@ -14,13 +14,13 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef FUNCTIONS_H #ifndef FUNCTIONS_H
#define FUNCTIONS_H #define FUNCTIONS_H
#include <stdint.h> #include <stdint.h>
enum FUNCTION_Type_t enum FUNCTION_Type_t {
{
FUNCTION_FOREGROUND = 0, // ??? FUNCTION_FOREGROUND = 0, // ???
FUNCTION_TRANSMIT, // transmitting FUNCTION_TRANSMIT, // transmitting
FUNCTION_MONITOR, // receiving with squelch forced open FUNCTION_MONITOR, // receiving with squelch forced open
@@ -32,11 +32,12 @@ enum FUNCTION_Type_t
}; };
typedef enum FUNCTION_Type_t FUNCTION_Type_t; typedef enum FUNCTION_Type_t FUNCTION_Type_t;
extern FUNCTION_Type_t gCurrentFunction; extern FUNCTION_Type_t gCurrentFunction;
void FUNCTION_Init(void); void FUNCTION_Init(void);
void FUNCTION_Select(FUNCTION_Type_t Function); void FUNCTION_Select(FUNCTION_Type_t Function);
bool FUNCTION_IsRx(); bool FUNCTION_IsRx();
#endif #endif

View File

@@ -137,10 +137,6 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
} }
} }
if ((gScreenToDisplay == DISPLAY_MENU) && UI_MENU_GetCurrentMenuId() == MENU_VOL)
gUpdateDisplay = true;
if (gBatteryCurrent < 501) if (gBatteryCurrent < 501)
{ {
if (gChargingWithTypeC) if (gChargingWithTypeC)

50
main.c
View File

@@ -19,7 +19,9 @@
#include <stdio.h> // NULL #include <stdio.h> // NULL
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
#include "am_fix.h" #include "am_fix.h"
#endif #endif
#include "audio.h" #include "audio.h"
@@ -31,13 +33,19 @@
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
#include "app/action.h" #include "app/action.h"
#include "ui/ui.h" #include "ui/ui.h"
#endif #endif
#ifdef ENABLE_SPECTRUM #ifdef ENABLE_SPECTRUM
#include "app/spectrum.h" #include "app/spectrum.h"
#endif #endif
#include "app/chFrScanner.h" #include "app/chFrScanner.h"
#endif #endif
#include "app/app.h" #include "app/app.h"
@@ -51,8 +59,11 @@
#include "driver/system.h" #include "driver/system.h"
#include "driver/systick.h" #include "driver/systick.h"
#include "driver/eeprom.h" #include "driver/eeprom.h"
#ifdef ENABLE_UART #ifdef ENABLE_UART
#include "driver/uart.h" #include "driver/uart.h"
#endif #endif
#include "helper/battery.h" #include "helper/battery.h"
@@ -61,8 +72,8 @@
#include "ui/lock.h" #include "ui/lock.h"
#include "ui/welcome.h" #include "ui/welcome.h"
#include "ui/menu.h" #include "ui/menu.h"
void _putchar(__attribute__((unused)) char c)
{ void _putchar(__attribute__((unused)) char c) {
#ifdef ENABLE_UART #ifdef ENABLE_UART
UART_Send((uint8_t *) &c, 1); UART_Send((uint8_t *) &c, 1);
@@ -70,8 +81,7 @@ void _putchar(__attribute__((unused)) char c)
} }
void Main(void) void Main(void) {
{
// Enable clock gating of blocks we need // Enable clock gating of blocks we need
SYSCON_DEV_CLK_GATE = 0 SYSCON_DEV_CLK_GATE = 0
| SYSCON_DEV_CLK_GATE_GPIOA_BITS_ENABLE | SYSCON_DEV_CLK_GATE_GPIOA_BITS_ENABLE
@@ -157,8 +167,7 @@ void Main(void)
} }
#endif #endif
if (BootMode == BOOT_MODE_F_LOCK) if (BootMode == BOOT_MODE_F_LOCK) {
{
gF_LOCK = true; // flag to say include the hidden menu items gF_LOCK = true; // flag to say include the hidden menu items
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
@@ -192,14 +201,12 @@ void Main(void)
// wait for user to release all butts before moving on // wait for user to release all butts before moving on
if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) || if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) ||
KEYBOARD_Poll() != KEY_INVALID || KEYBOARD_Poll() != KEY_INVALID ||
BootMode != BOOT_MODE_NORMAL) BootMode != BOOT_MODE_NORMAL) { // keys are pressed
{ // keys are pressed
UI_DisplayReleaseKeys(); UI_DisplayReleaseKeys();
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
// 500ms // 500ms
for (int i = 0; i < 50;) for (int i = 0; i < 50;) {
{
i = (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) && KEYBOARD_Poll() == KEY_INVALID) ? i + 1 : 0; i = (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) && KEYBOARD_Poll() == KEY_INVALID) ? i + 1 : 0;
SYSTEM_DelayMs(10); SYSTEM_DelayMs(10);
} }
@@ -208,8 +215,7 @@ void Main(void)
gDebounceCounter = 0; gDebounceCounter = 0;
} }
if (!gChargingWithTypeC && gBatteryDisplayLevel == 0) if (!gChargingWithTypeC && gBatteryDisplayLevel == 0) {
{
FUNCTION_Select(FUNCTION_POWER_SAVE); FUNCTION_Select(FUNCTION_POWER_SAVE);
if (gEeprom.BACKLIGHT_TIME < 61) // backlight is not set to be always on if (gEeprom.BACKLIGHT_TIME < 61) // backlight is not set to be always on
@@ -218,29 +224,11 @@ void Main(void)
BACKLIGHT_TurnOn(); // turn the backlight ON BACKLIGHT_TurnOn(); // turn the backlight ON
gReducedService = true; gReducedService = true;
} } else {
else
{
UI_DisplayWelcome(); UI_DisplayWelcome();
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
#ifdef ENABLE_FEAT_F4HWN
if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE && gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_SOUND)
#else
if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE)
#endif
{ // 2.55 second boot-up screen
while (boot_counter_10ms > 0)
{
if (KEYBOARD_Poll() != KEY_INVALID)
{ // halt boot beeps
boot_counter_10ms = 0;
break;
}
}
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
}
#ifdef ENABLE_PWRON_PASSWORD #ifdef ENABLE_PWRON_PASSWORD
if (gEeprom.POWER_ON_PASSWORD < 1000000) if (gEeprom.POWER_ON_PASSWORD < 1000000)

7
misc.c
View File

@@ -91,16 +91,11 @@ const uint8_t gMicGain_dB2[5] = {3, 8, 16, 24, 31};
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
bool gSetting_350TX; bool gSetting_350TX;
#endif #endif
#ifdef ENABLE_DTMF_CALLING
bool gSetting_KILLED;
#endif
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
bool gSetting_200TX; bool gSetting_200TX;
bool gSetting_500TX; bool gSetting_500TX;
#endif #endif
bool gSetting_350EN; bool gSetting_350EN = true;
uint8_t gSetting_F_LOCK; uint8_t gSetting_F_LOCK;
bool gSetting_ScrambleEnable; bool gSetting_ScrambleEnable;

5
misc.h
View File

@@ -143,11 +143,6 @@ extern const uint8_t gMicGain_dB2[5];
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
extern bool gSetting_350TX; extern bool gSetting_350TX;
#endif #endif
#ifdef ENABLE_DTMF_CALLING
extern bool gSetting_KILLED;
#endif
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
extern bool gSetting_200TX; extern bool gSetting_200TX;
extern bool gSetting_500TX; extern bool gSetting_500TX;

11
radio.c
View File

@@ -272,13 +272,10 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
pVfo->StepFrequency = gStepFrequencyTable[tmp]; pVfo->StepFrequency = gStepFrequencyTable[tmp];
tmp = data[7]; tmp = data[7];
#ifndef ENABLE_FEAT_F4HWN
if (tmp > (ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1)) if (tmp > (ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1))
tmp = 0; tmp = 0;
pVfo->SCRAMBLING_TYPE = tmp; pVfo->SCRAMBLING_TYPE = tmp;
#else //pVfo->SCRAMBLING_TYPE = 0;
pVfo->SCRAMBLING_TYPE = 0;
#endif
pVfo->freq_config_RX.CodeType = (data[2] >> 0) & 0x0F; pVfo->freq_config_RX.CodeType = (data[2] >> 0) & 0x0F;
pVfo->freq_config_TX.CodeType = (data[2] >> 4) & 0x0F; pVfo->freq_config_TX.CodeType = (data[2] >> 4) & 0x0F;
@@ -817,14 +814,10 @@ void RADIO_SetupRegisters(bool switchToForeground)
break; break;
} }
#ifndef ENABLE_FEAT_F4HWN if (gRxVfo->SCRAMBLING_TYPE > 0)
if (gRxVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)
BK4819_EnableScramble(gRxVfo->SCRAMBLING_TYPE - 1); BK4819_EnableScramble(gRxVfo->SCRAMBLING_TYPE - 1);
else else
BK4819_DisableScramble(); BK4819_DisableScramble();
#else
BK4819_DisableScramble();
#endif
} }
} }
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA

View File

@@ -17,9 +17,11 @@
#include <string.h> #include <string.h>
#include "app/dtmf.h" #include "app/dtmf.h"
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
#include "app/fm.h" #include "app/fm.h"
#endif #endif
#include "driver/bk1080.h" #include "driver/bk1080.h"
#include "driver/bk4819.h" #include "driver/bk4819.h"
#include "driver/eeprom.h" #include "driver/eeprom.h"
@@ -40,8 +42,7 @@ static const uint32_t gDefaultFrequencyTable[] =
EEPROM_Config_t gEeprom = {0}; EEPROM_Config_t gEeprom = {0};
void SETTINGS_InitEEPROM(void) void SETTINGS_InitEEPROM(void) {
{
uint8_t Data[16] = {0}; uint8_t Data[16] = {0};
// 0E70..0E77 // 0E70..0E77
EEPROM_ReadBuffer(0x0E70, Data, 8); EEPROM_ReadBuffer(0x0E70, Data, 8);
@@ -141,12 +142,7 @@ void SETTINGS_InitEEPROM(void)
gEeprom.KEY_2_LONG_PRESS_ACTION = (Data[4] < ACTION_OPT_LEN) ? Data[4] : ACTION_OPT_NONE; gEeprom.KEY_2_LONG_PRESS_ACTION = (Data[4] < ACTION_OPT_LEN) ? Data[4] : ACTION_OPT_NONE;
gEeprom.SCAN_RESUME_MODE = (Data[5] < 105) ? Data[5] : 14; gEeprom.SCAN_RESUME_MODE = (Data[5] < 105) ? Data[5] : 14;
gEeprom.AUTO_KEYPAD_LOCK = (Data[6] < 41) ? Data[6] : 0; gEeprom.AUTO_KEYPAD_LOCK = (Data[6] < 41) ? Data[6] : 0;
#ifdef ENABLE_FEAT_F4HWN gEeprom.FSKMode = Data[7];
gEeprom.POWER_ON_DISPLAY_MODE = (Data[7] < 6) ? Data[7] : POWER_ON_DISPLAY_MODE_VOLTAGE;
#else
gEeprom.POWER_ON_DISPLAY_MODE = (Data[7] < 4) ? Data[7] : POWER_ON_DISPLAY_MODE_VOLTAGE;
#endif
// 0E98..0E9F // 0E98..0E9F
#ifdef ENABLE_PWRON_PASSWORD #ifdef ENABLE_PWRON_PASSWORD
EEPROM_ReadBuffer(0x0E98, Data, 8); EEPROM_ReadBuffer(0x0E98, Data, 8);
@@ -162,8 +158,7 @@ void SETTINGS_InitEEPROM(void)
if ((Data[1] < 200 && Data[1] > 90) && (Data[2] < Data[1] - 9 && Data[1] < 160 && Data[2] > 50)) { if ((Data[1] < 200 && Data[1] > 90) && (Data[2] < Data[1] - 9 && Data[1] < 160 && Data[2] > 50)) {
gEeprom.S0_LEVEL = Data[1]; gEeprom.S0_LEVEL = Data[1];
gEeprom.S9_LEVEL = Data[2]; gEeprom.S9_LEVEL = Data[2];
} } else {
else {
gEeprom.S0_LEVEL = 130; gEeprom.S0_LEVEL = 130;
gEeprom.S9_LEVEL = 76; gEeprom.S9_LEVEL = 76;
} }
@@ -264,38 +259,38 @@ void SETTINGS_InitEEPROM(void)
*/ */
// Fix me probably after Chirp update... // Fix me probably after Chirp update...
for (unsigned int i = 0; i < 3; i++) for (unsigned int i = 0; i < 3; i++) {
{
gEeprom.SCAN_LIST_ENABLED[i] = (Data[1] >> i) & 1; gEeprom.SCAN_LIST_ENABLED[i] = (Data[1] >> i) & 1;
} }
for (unsigned int i = 0; i < 3; i++) for (unsigned int i = 0; i < 3; i++) {
{
const unsigned int j = 1 + (i * 2); const unsigned int j = 1 + (i * 2);
gEeprom.SCANLIST_PRIORITY_CH1[i] = Data[j + 1]; gEeprom.SCANLIST_PRIORITY_CH1[i] = Data[j + 1];
gEeprom.SCANLIST_PRIORITY_CH2[i] = Data[j + 2]; gEeprom.SCANLIST_PRIORITY_CH2[i] = Data[j + 2];
} }
EEPROM_ReadBuffer(0x0F20, Data, 8);
gEeprom.FSKSRCAddress = Data[0];
gEeprom.FSKSRCAddress |= Data[1] << 8;
gEeprom.FSKSRCAddress |= Data[2] << 16;
gEeprom.FSKSRCAddress |= Data[3] << 24;
// 0F40..0F47 // 0F40..0F47
EEPROM_ReadBuffer(0x0F40, Data, 8); EEPROM_ReadBuffer(0x0F40, Data, 8);
gSetting_F_LOCK = (Data[0] < F_LOCK_LEN) ? Data[0] : F_LOCK_DEF; gSetting_F_LOCK = (Data[0] < F_LOCK_LEN) ? Data[0] : F_LOCK_DEF;
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
gSetting_350TX = (Data[1] < 2) ? Data[1] : false; // was true gSetting_350TX = (Data[1] < 2) ? Data[1] : false; // was true
#endif #endif
#ifdef ENABLE_DTMF_CALLING
gSetting_KILLED = (Data[2] < 2) ? Data[2] : false;
#endif
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
gSetting_200TX = (Data[3] < 2) ? Data[3] : false; gSetting_200TX = (Data[3] < 2) ? Data[3] : false;
gSetting_500TX = (Data[4] < 2) ? Data[4] : false; gSetting_500TX = (Data[4] < 2) ? Data[4] : false;
#endif
gSetting_350EN = (Data[5] < 2) ? Data[5] : true; gSetting_350EN = (Data[5] < 2) ? Data[5] : true;
#ifdef ENABLE_FEAT_F4HWN
gSetting_ScrambleEnable = false;
#else #else
gSetting_ScrambleEnable = (Data[6] < 2) ? Data[6] : true; gSetting_350EN = true;
#endif #endif
gSetting_ScrambleEnable = true;
//gSetting_TX_EN = (Data[7] & (1u << 0)) ? true : false; //gSetting_TX_EN = (Data[7] & (1u << 0)) ? true : false;
gSetting_live_DTMF_decoder = !!(Data[7] & (1u << 1)); gSetting_live_DTMF_decoder = !!(Data[7] & (1u << 1));
gSetting_battery_text = (((Data[7] >> 2) & 3u) <= 2) ? (Data[7] >> 2) & 3 : 2; gSetting_battery_text = (((Data[7] >> 2) & 3u) <= 2) ? (Data[7] >> 2) & 3 : 2;
@@ -309,8 +304,7 @@ void SETTINGS_InitEEPROM(void)
#endif #endif
gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u; gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u;
if (!gEeprom.VFO_OPEN) if (!gEeprom.VFO_OPEN) {
{
gEeprom.ScreenChannel[0] = gEeprom.MrChannel[0]; gEeprom.ScreenChannel[0] = gEeprom.MrChannel[0];
gEeprom.ScreenChannel[1] = gEeprom.MrChannel[1]; gEeprom.ScreenChannel[1] = gEeprom.MrChannel[1];
} }
@@ -394,8 +388,7 @@ void SETTINGS_InitEEPROM(void)
#endif #endif
} }
void SETTINGS_LoadCalibration(void) void SETTINGS_LoadCalibration(void) {
{
// uint8_t Mic; // uint8_t Mic;
EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[3], 8); EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[3], 8);
@@ -408,8 +401,7 @@ void SETTINGS_LoadCalibration(void)
memcpy(gEEPROM_RSSI_CALIB[2], gEEPROM_RSSI_CALIB[0], 8); memcpy(gEEPROM_RSSI_CALIB[2], gEEPROM_RSSI_CALIB[0], 8);
EEPROM_ReadBuffer(0x1F40, gBatteryCalibration, 12); EEPROM_ReadBuffer(0x1F40, gBatteryCalibration, 12);
if (gBatteryCalibration[0] >= 5000) if (gBatteryCalibration[0] >= 5000) {
{
gBatteryCalibration[0] = 1900; gBatteryCalibration[0] = 1900;
gBatteryCalibration[1] = 2000; gBatteryCalibration[1] = 2000;
} }
@@ -425,8 +417,7 @@ void SETTINGS_LoadCalibration(void)
gEeprom.MIC_SENSITIVITY_TUNING = gMicGain_dB2[gEeprom.MIC_SENSITIVITY]; gEeprom.MIC_SENSITIVITY_TUNING = gMicGain_dB2[gEeprom.MIC_SENSITIVITY];
{ {
struct struct {
{
int16_t BK4819_XtalFreqLow; int16_t BK4819_XtalFreqLow;
uint16_t EEPROM_1F8A; uint16_t EEPROM_1F8A;
uint16_t EEPROM_1F8C; uint16_t EEPROM_1F8C;
@@ -438,7 +429,8 @@ void SETTINGS_LoadCalibration(void)
// radio 2 .. 05 00 46 00 50 00 2C 0E // radio 2 .. 05 00 46 00 50 00 2C 0E
EEPROM_ReadBuffer(0x1F88, &Misc, 8); EEPROM_ReadBuffer(0x1F88, &Misc, 8);
gEeprom.BK4819_XTAL_FREQ_LOW = (Misc.BK4819_XtalFreqLow >= -1000 && Misc.BK4819_XtalFreqLow <= 1000) ? Misc.BK4819_XtalFreqLow : 0; gEeprom.BK4819_XTAL_FREQ_LOW = (Misc.BK4819_XtalFreqLow >= -1000 && Misc.BK4819_XtalFreqLow <= 1000)
? Misc.BK4819_XtalFreqLow : 0;
gEEPROM_1F8A = Misc.EEPROM_1F8A & 0x01FF; gEEPROM_1F8A = Misc.EEPROM_1F8A & 0x01FF;
gEEPROM_1F8C = Misc.EEPROM_1F8C & 0x01FF; gEEPROM_1F8C = Misc.EEPROM_1F8C & 0x01FF;
gEeprom.VOLUME_GAIN = (Misc.VOLUME_GAIN < 64) ? Misc.VOLUME_GAIN : 58; gEeprom.VOLUME_GAIN = (Misc.VOLUME_GAIN < 64) ? Misc.VOLUME_GAIN : 58;
@@ -453,10 +445,8 @@ void SETTINGS_LoadCalibration(void)
} }
} }
uint32_t SETTINGS_FetchChannelFrequency(const int channel) uint32_t SETTINGS_FetchChannelFrequency(const int channel) {
{ struct {
struct
{
uint32_t frequency; uint32_t frequency;
uint32_t offset; uint32_t offset;
} __attribute__((packed)) info; } __attribute__((packed)) info;
@@ -466,8 +456,7 @@ uint32_t SETTINGS_FetchChannelFrequency(const int channel)
return info.frequency; return info.frequency;
} }
void SETTINGS_FetchChannelName(char *s, const int channel) void SETTINGS_FetchChannelName(char *s, const int channel) {
{
if (s == NULL) if (s == NULL)
return; return;
@@ -492,16 +481,14 @@ void SETTINGS_FetchChannelName(char *s, const int channel)
s[i--] = 0; // null term s[i--] = 0; // null term
} }
void SETTINGS_FactoryReset(bool bIsAll) void SETTINGS_FactoryReset(bool bIsAll) {
{
uint16_t i; uint16_t i;
uint8_t Template[8]; uint8_t Template[8];
memset(Template, 0xFF, sizeof(Template)); memset(Template, 0xFF, sizeof(Template));
//for (i = 0x0C80; i < 0x1E00; i += 8) //for (i = 0x0C80; i < 0x1E00; i += 8)
for (i = 0x0000; i < 0x1E00; i += 8) for (i = 0x0000; i < 0x1E00; i += 8) {
{
if ( if (
!(i >= 0x0EE0 && i < 0x0F18) && // ANI ID + DTMF codes !(i >= 0x0EE0 && i < 0x0F18) && // ANI ID + DTMF codes
!(i >= 0x0F30 && i < 0x0F50) && // AES KEY + F LOCK + Scramble Enable !(i >= 0x0F30 && i < 0x0F50) && // AES KEY + F LOCK + Scramble Enable
@@ -516,14 +503,12 @@ void SETTINGS_FactoryReset(bool bIsAll)
!(i >= 0x0E40 && i < 0x0E70) && // FM Channels !(i >= 0x0E40 && i < 0x0E70) && // FM Channels
!(i >= 0x0E88 && i < 0x0E90) // FM settings !(i >= 0x0E88 && i < 0x0E90) // FM settings
)) ))
) ) {
{
EEPROM_WriteBuffer(i, Template); EEPROM_WriteBuffer(i, Template);
} }
} }
if (bIsAll) if (bIsAll) {
{
RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000); RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000);
#ifdef ENABLE_FEAT_F4HWN_RESET_CHANNEL #ifdef ENABLE_FEAT_F4HWN_RESET_CHANNEL
@@ -571,8 +556,7 @@ void SETTINGS_SaveFM(void)
} }
#endif #endif
void SETTINGS_SaveVfoIndices(void) void SETTINGS_SaveVfoIndices(void) {
{
uint8_t State[8]; uint8_t State[8];
#ifndef ENABLE_NOAA #ifndef ENABLE_NOAA
@@ -593,8 +577,7 @@ void SETTINGS_SaveVfoIndices(void)
EEPROM_WriteBuffer(0x0E80, State); EEPROM_WriteBuffer(0x0E80, State);
} }
void SETTINGS_SaveSettings(void) void SETTINGS_SaveSettings(void) {
{
uint8_t State[8]; uint8_t State[8];
uint8_t tmp = 0; uint8_t tmp = 0;
@@ -634,17 +617,13 @@ void SETTINGS_SaveSettings(void)
State[4] = gEeprom.DUAL_WATCH; State[4] = gEeprom.DUAL_WATCH;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if(!gSaveRxMode) if (!gSaveRxMode) {
{
State[2] = gCB; State[2] = gCB;
State[4] = gDW; State[4] = gDW;
} }
if(gBackLight) if (gBackLight) {
{
State[5] = gBacklightTimeOriginal; State[5] = gBacklightTimeOriginal;
} } else {
else
{
State[5] = gEeprom.BACKLIGHT_TIME; State[5] = gEeprom.BACKLIGHT_TIME;
} }
#else #else
@@ -658,7 +637,8 @@ void SETTINGS_SaveSettings(void)
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE #ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
State[7] = (gEeprom.VFO_OPEN & 0x01) | ((gEeprom.CURRENT_STATE & 0x07) << 1) | ((gEeprom.SCAN_LIST_DEFAULT & 0x07) << 4); State[7] = (gEeprom.VFO_OPEN & 0x01) | ((gEeprom.CURRENT_STATE & 0x07) << 1) |
((gEeprom.SCAN_LIST_DEFAULT & 0x07) << 4);
#else #else
State[7] = gEeprom.VFO_OPEN; State[7] = gEeprom.VFO_OPEN;
#endif #endif
@@ -672,7 +652,7 @@ void SETTINGS_SaveSettings(void)
State[4] = gEeprom.KEY_2_LONG_PRESS_ACTION; State[4] = gEeprom.KEY_2_LONG_PRESS_ACTION;
State[5] = gEeprom.SCAN_RESUME_MODE; State[5] = gEeprom.SCAN_RESUME_MODE;
State[6] = gEeprom.AUTO_KEYPAD_LOCK; State[6] = gEeprom.AUTO_KEYPAD_LOCK;
State[7] = gEeprom.POWER_ON_DISPLAY_MODE; State[7] = gEeprom.FSKMode;
EEPROM_WriteBuffer(0x0E90, State); EEPROM_WriteBuffer(0x0E90, State);
#ifdef ENABLE_PWRON_PASSWORD #ifdef ENABLE_PWRON_PASSWORD
@@ -743,24 +723,24 @@ void SETTINGS_SaveSettings(void)
State[7] = gEeprom.SCANLIST_PRIORITY_CH2[2]; State[7] = gEeprom.SCANLIST_PRIORITY_CH2[2];
EEPROM_WriteBuffer(0x0F18, State); EEPROM_WriteBuffer(0x0F18, State);
State[0] = gEeprom.FSKSRCAddress & 0xFF;
State[1] = (gEeprom.FSKSRCAddress >> 8) & 0xFF;
State[2] = (gEeprom.FSKSRCAddress >> 16) & 0xFF;
State[3] = (gEeprom.FSKSRCAddress >> 24) & 0xFF;
EEPROM_WriteBuffer(0x0F20, State);
memset(State, 0xFF, sizeof(State)); memset(State, 0xFF, sizeof(State));
State[0] = gSetting_F_LOCK; State[0] = gSetting_F_LOCK;
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
State[1] = gSetting_350TX; State[1] = gSetting_350TX;
#endif #endif
#ifdef ENABLE_DTMF_CALLING
State[2] = gSetting_KILLED;
#endif
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
State[3] = gSetting_200TX; State[3] = gSetting_200TX;
State[4] = gSetting_500TX; State[4] = gSetting_500TX;
#endif #endif
State[5] = gSetting_350EN; State[5] = gSetting_350EN;
#ifdef ENABLE_FEAT_F4HWN
State[6] = false;
#else
State[6] = gSetting_ScrambleEnable; State[6] = gSetting_ScrambleEnable;
#endif
//if (!gSetting_TX_EN) State[7] &= ~(1u << 0); //if (!gSetting_TX_EN) State[7] &= ~(1u << 0);
if (!gSetting_live_DTMF_decoder) State[7] &= ~(1u << 1); if (!gSetting_live_DTMF_decoder) State[7] &= ~(1u << 1);
@@ -827,8 +807,7 @@ void SETTINGS_SaveSettings(void)
#endif #endif
} }
void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode) void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode) {
{
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOAA_CHANNEL(Channel)) if (IS_NOAA_CHANNEL(Channel))
return; return;
@@ -867,11 +846,8 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
#endif #endif
; ;
State._8[6] = pVFO->STEP_SETTING; State._8[6] = pVFO->STEP_SETTING;
#ifdef ENABLE_FEAT_F4HWN
State._8[7] = 0;
#else
State._8[7] = pVFO->SCRAMBLING_TYPE; State._8[7] = pVFO->SCRAMBLING_TYPE;
#endif
EEPROM_WriteBuffer(OffsetVFO + 8, State._8); EEPROM_WriteBuffer(OffsetVFO + 8, State._8);
SETTINGS_UpdateChannel(Channel, pVFO, true, true, true); SETTINGS_UpdateChannel(Channel, pVFO, true, true, true);
@@ -890,8 +866,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
} }
void SETTINGS_SaveBatteryCalibration(const uint16_t * batteryCalibration) void SETTINGS_SaveBatteryCalibration(const uint16_t *batteryCalibration) {
{
uint16_t buf[4]; uint16_t buf[4];
EEPROM_WriteBuffer(0x1F40, batteryCalibration); EEPROM_WriteBuffer(0x1F40, batteryCalibration);
EEPROM_ReadBuffer(0x1F48, buf, sizeof(buf)); EEPROM_ReadBuffer(0x1F48, buf, sizeof(buf));
@@ -900,8 +875,7 @@ void SETTINGS_SaveBatteryCalibration(const uint16_t * batteryCalibration)
EEPROM_WriteBuffer(0x1F48, buf); EEPROM_WriteBuffer(0x1F48, buf);
} }
void SETTINGS_SaveChannelName(uint8_t channel, const char * name) void SETTINGS_SaveChannelName(uint8_t channel, const char *name) {
{
uint16_t offset = channel * 16; uint16_t offset = channel * 16;
uint8_t buf[16] = {0}; uint8_t buf[16] = {0};
memcpy(buf, name, MIN(strlen(name), 10u)); memcpy(buf, name, MIN(strlen(name), 10u));
@@ -909,8 +883,7 @@ void SETTINGS_SaveChannelName(uint8_t channel, const char * name)
EEPROM_WriteBuffer(0x0F58 + offset, buf + 8); EEPROM_WriteBuffer(0x0F58 + offset, buf + 8);
} }
void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep, bool check, bool save) void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep, bool check, bool save) {
{
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (!IS_NOAA_CHANNEL(channel)) if (!IS_NOAA_CHANNEL(channel))
#endif #endif
@@ -940,8 +913,7 @@ void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep,
state[channel & 7u] = att.__val; state[channel & 7u] = att.__val;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if(save) if (save) {
{
EEPROM_WriteBuffer(offset, state); EEPROM_WriteBuffer(offset, state);
} }
#else #else
@@ -959,8 +931,7 @@ void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep,
} }
} }
void SETTINGS_WriteBuildOptions(void) void SETTINGS_WriteBuildOptions(void) {
{
uint8_t State[8]; uint8_t State[8];
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
@@ -1021,36 +992,39 @@ State[1] = 0
} }
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE #ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
void SETTINGS_WriteCurrentState(void)
{ void SETTINGS_WriteCurrentState(void) {
uint8_t State[8]; uint8_t State[8];
EEPROM_ReadBuffer(0x0E78, State, sizeof(State)); EEPROM_ReadBuffer(0x0E78, State, sizeof(State));
//State[3] = (gEeprom.CURRENT_STATE << 4) | (gEeprom.BATTERY_SAVE & 0x0F); //State[3] = (gEeprom.CURRENT_STATE << 4) | (gEeprom.BATTERY_SAVE & 0x0F);
State[7] = (gEeprom.VFO_OPEN & 0x01) | ((gEeprom.CURRENT_STATE & 0x07) << 1) | ((gEeprom.SCAN_LIST_DEFAULT & 0x07) << 4); State[7] = (gEeprom.VFO_OPEN & 0x01) | ((gEeprom.CURRENT_STATE & 0x07) << 1) |
((gEeprom.SCAN_LIST_DEFAULT & 0x07) << 4);
EEPROM_WriteBuffer(0x0E78, State); EEPROM_WriteBuffer(0x0E78, State);
} }
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
void SETTINGS_WriteCurrentVol(void)
{ void SETTINGS_WriteCurrentVol(void) {
uint8_t State[8]; uint8_t State[8];
EEPROM_ReadBuffer(0x1F88, State, sizeof(State)); EEPROM_ReadBuffer(0x1F88, State, sizeof(State));
State[6] = gEeprom.VOLUME_GAIN; State[6] = gEeprom.VOLUME_GAIN;
EEPROM_WriteBuffer(0x1F88, State); EEPROM_WriteBuffer(0x1F88, State);
} }
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
void SETTINGS_ResetTxLock(void)
{ void SETTINGS_ResetTxLock(void) {
uint8_t State[8]; uint8_t State[8];
for(uint8_t channel = 0; channel < 200; channel++) for (uint8_t channel = 0; channel < 200; channel++) {
{
uint16_t OffsetVFO = channel * 16; uint16_t OffsetVFO = channel * 16;
EEPROM_ReadBuffer(OffsetVFO + 8, State, sizeof(State)); EEPROM_ReadBuffer(OffsetVFO + 8, State, sizeof(State));
State[4] |= (1 << 6); State[4] |= (1 << 6);
EEPROM_WriteBuffer(OffsetVFO + 8, State); EEPROM_WriteBuffer(OffsetVFO + 8, State);
} }
} }
#endif #endif

View File

@@ -23,8 +23,20 @@
#include "frequencies.h" #include "frequencies.h"
#include <helper/battery.h> #include <helper/battery.h>
#include "radio.h" #include "radio.h"
#include "functions.h"
#include "app/fskmodem.h"
#include <driver/backlight.h> #include <driver/backlight.h>
// Modem Modulation
typedef enum ModemModulation {
MOD_FSK_450, // for bad conditions
MOD_FSK_700, // for medium conditions
MOD_AFSK_1200, // for good conditions
MOD_AFSK_2400,
MOD_FSK_1200_2400,
MOD_NOAA_SAME
} ModemModulation;
enum POWER_OnDisplayMode_t { enum POWER_OnDisplayMode_t {
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
POWER_ON_DISPLAY_MODE_ALL, POWER_ON_DISPLAY_MODE_ALL,
@@ -40,14 +52,14 @@ typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t;
enum TxLockModes_t { enum TxLockModes_t {
F_LOCK_DEF, //all default frequencies + configurable F_LOCK_DEF, //all default frequencies + configurable
F_LOCK_FCC,
#ifdef ENABLE_FEAT_F4HWN_CA #ifdef ENABLE_FEAT_F4HWN_CA
F_LOCK_FCC,
F_LOCK_CA, F_LOCK_CA,
#endif
F_LOCK_CE, F_LOCK_CE,
F_LOCK_GB, F_LOCK_GB,
F_LOCK_430, F_LOCK_430,
F_LOCK_438, F_LOCK_438,
#endif
#ifdef ENABLE_FEAT_F4HWN_PMR #ifdef ENABLE_FEAT_F4HWN_PMR
F_LOCK_PMR, F_LOCK_PMR,
#endif #endif
@@ -302,32 +314,54 @@ typedef struct {
uint8_t S0_LEVEL; uint8_t S0_LEVEL;
uint8_t S9_LEVEL; uint8_t S9_LEVEL;
#endif #endif
ModemModulation FSKMode;
uint32_t FSKSRCAddress;
} EEPROM_Config_t; } EEPROM_Config_t;
extern EEPROM_Config_t gEeprom; extern EEPROM_Config_t gEeprom;
void SETTINGS_InitEEPROM(void); void SETTINGS_InitEEPROM(void);
void SETTINGS_LoadCalibration(void); void SETTINGS_LoadCalibration(void);
uint32_t SETTINGS_FetchChannelFrequency(const int channel); uint32_t SETTINGS_FetchChannelFrequency(const int channel);
void SETTINGS_FetchChannelName(char *s, const int channel); void SETTINGS_FetchChannelName(char *s, const int channel);
void SETTINGS_FactoryReset(bool bIsAll); void SETTINGS_FactoryReset(bool bIsAll);
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
void SETTINGS_SaveFM(void); void SETTINGS_SaveFM(void);
#endif #endif
void SETTINGS_SaveVfoIndices(void); void SETTINGS_SaveVfoIndices(void);
void SETTINGS_SaveSettings(void); void SETTINGS_SaveSettings(void);
void SETTINGS_SaveChannelName(uint8_t channel, const char *name); void SETTINGS_SaveChannelName(uint8_t channel, const char *name);
void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode); void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode);
void SETTINGS_SaveBatteryCalibration(const uint16_t *batteryCalibration); void SETTINGS_SaveBatteryCalibration(const uint16_t *batteryCalibration);
void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep, bool check, bool save); void SETTINGS_UpdateChannel(uint8_t channel, const VFO_Info_t *pVFO, bool keep, bool check, bool save);
void SETTINGS_WriteBuildOptions(void); void SETTINGS_WriteBuildOptions(void);
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE #ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
void SETTINGS_WriteCurrentState(void); void SETTINGS_WriteCurrentState(void);
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
void SETTINGS_WriteCurrentVol(void); void SETTINGS_WriteCurrentVol(void);
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
void SETTINGS_ResetTxLock(void); void SETTINGS_ResetTxLock(void);
#endif #endif
#endif #endif

View File

@@ -61,11 +61,13 @@ void UI_DisplayAircopy(void)
UI_PrintStringSmallNormal(String + 7, 97, 0, 3); UI_PrintStringSmallNormal(String + 7, 97, 0, 3);
String[7] = 0; String[7] = 0;
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 16, 2, false); //UI_DisplayFrequency(String, 16, 2, false);
UI_PrintStringSmallNormal(String, 0, 20, 2);
} else { } else {
const char *ascii = INPUTBOX_GetAscii(); const char *ascii = INPUTBOX_GetAscii();
sprintf(String, "%.3s.%.3s", ascii, ascii + 3); sprintf(String, "%.3s.%.3s", ascii, ascii + 3);
UI_DisplayFrequency(String, 16, 2, false); //UI_DisplayFrequency(String, 16, 2, false);
UI_PrintStringSmallNormal(String, 0, 20, 2);
} }
memset(String, 0, sizeof(String)); memset(String, 0, sizeof(String));

View File

@@ -50,7 +50,7 @@ void UI_DisplayFM(void)
//UI_PrintStringSmallNormal(String, 127 - 4*7, 0, 6); //UI_PrintStringSmallNormal(String, 127 - 4*7, 0, 6);
if (gAskToSave) { if (gAskToSave) {
pPrintStr = "SAVE?"; pPrintStr = "SAV?";
} else if (gAskToDelete) { } else if (gAskToDelete) {
pPrintStr = "DEL?"; pPrintStr = "DEL?";
} else if (gFM_ScanState == FM_SCAN_OFF) { } else if (gFM_ScanState == FM_SCAN_OFF) {
@@ -61,26 +61,26 @@ void UI_DisplayFM(void)
pPrintStr = "VFO"; pPrintStr = "VFO";
for (unsigned int i = 0; i < 20; i++) { for (unsigned int i = 0; i < 20; i++) {
if (gEeprom.FM_FrequencyPlaying == gFM_Channels[i]) { if (gEeprom.FM_FrequencyPlaying == gFM_Channels[i]) {
sprintf(String, "VFO(CH%02u)", i + 1); sprintf(String, "VF(C%02u)", i + 1);
pPrintStr = String; pPrintStr = String;
break; break;
} }
} }
} }
} else if (gFM_AutoScan) { } else if (gFM_AutoScan) {
sprintf(String, "A-SCAN(%u)", gFM_ChannelPosition + 1); sprintf(String, "A-SCN(%u)", gFM_ChannelPosition + 1);
pPrintStr = String; pPrintStr = String;
} else { } else {
pPrintStr = "M-SCAN"; pPrintStr = "M-SCN";
} }
UI_PrintString(pPrintStr, 0, 127, 3, 10); // memory, vfo, scan UI_PrintString(pPrintStr, 0, 127, 3, 12); // memory, vfo, scan
memset(String, 0, sizeof(String)); memset(String, 0, sizeof(String));
if (gAskToSave || (gEeprom.FM_IsMrMode && gInputBoxIndex > 0)) { if (gAskToSave || (gEeprom.FM_IsMrMode && gInputBoxIndex > 0)) {
UI_GenerateChannelString(String, gFM_ChannelPosition); UI_GenerateChannelString(String, gFM_ChannelPosition);
} else if (gAskToDelete) { } else if (gAskToDelete) {
sprintf(String, "CH-%02u", gEeprom.FM_SelectedChannel + 1); sprintf(String, "C-%02u", gEeprom.FM_SelectedChannel + 1);
} else { } else {
if (gInputBoxIndex == 0) { if (gInputBoxIndex == 0) {
sprintf(String, " %3d.%d", gEeprom.FM_FrequencyPlaying / 10, gEeprom.FM_FrequencyPlaying % 10); sprintf(String, " %3d.%d", gEeprom.FM_FrequencyPlaying / 10, gEeprom.FM_FrequencyPlaying % 10);
@@ -89,7 +89,7 @@ void UI_DisplayFM(void)
sprintf(String, "%.3s.%.1s",ascii, ascii + 3); sprintf(String, "%.3s.%.1s",ascii, ascii + 3);
} }
UI_DisplayFrequency(String, 36, 1, gInputBoxIndex == 0); // frequency UI_PrintString(String, 0, 20, 1, 10); // frequency
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
return; return;
} }

View File

@@ -27,12 +27,10 @@
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0])) #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))
#endif #endif
void UI_GenerateChannelString(char *pString, const uint8_t Channel) void UI_GenerateChannelString(char *pString, const uint8_t Channel) {
{
unsigned int i; unsigned int i;
if (gInputBoxIndex == 0) if (gInputBoxIndex == 0) {
{
sprintf(pString, "CH-%02u", Channel + 1); sprintf(pString, "CH-%02u", Channel + 1);
return; return;
} }
@@ -44,8 +42,7 @@ void UI_GenerateChannelString(char *pString, const uint8_t Channel)
pString[i + 3] = (gInputBox[i] == 10) ? '-' : gInputBox[i] + '0'; pString[i + 3] = (gInputBox[i] == 10) ? '-' : gInputBox[i] + '0';
} }
void UI_GenerateChannelStringEx(char *pString, const bool bShowPrefix, const uint8_t ChannelNumber) void UI_GenerateChannelStringEx(char *pString, const bool bShowPrefix, const uint8_t ChannelNumber) {
{
if (gInputBoxIndex > 0) { if (gInputBoxIndex > 0) {
for (unsigned int i = 0; i < 3; i++) { for (unsigned int i = 0; i < 3; i++) {
pString[i] = (gInputBox[i] == 10) ? '-' : gInputBox[i] + '0'; pString[i] = (gInputBox[i] == 10) ? '-' : gInputBox[i] + '0';
@@ -65,41 +62,38 @@ void UI_GenerateChannelStringEx(char *pString, const bool bShowPrefix, const uin
} }
} }
void UI_PrintStringBuffer(const char *pString, uint8_t * buffer, uint32_t char_width, const uint8_t *font) void *memcpy_inv(void *dst, const void *src, size_t n) {
{ if (!dst || !src) return dst;
uint8_t *d = (uint8_t *) dst;
const uint8_t *s = (const uint8_t *) src;
while (n--) {
*d++ = ~(*s++);
}
return dst;
}
void UI_PrintStringBuffer(const char *pString, uint8_t *buffer, uint32_t char_width, const uint8_t *font, bool inv) {
const size_t Length = strlen(pString); const size_t Length = strlen(pString);
const unsigned int char_spacing = char_width + 1; const unsigned int char_spacing = char_width + 1;
for (size_t i = 0; i < Length; i++) { for (size_t i = 0; i < Length; i++) {
const unsigned int index = pString[i] - ' ' - 1; const unsigned int index = pString[i] - ' ' - 1;
if (pString[i] > ' ' && pString[i] < 127) { if (pString[i] > ' ' && pString[i] < 127) {
const uint32_t offset = i * char_spacing + 1; const uint32_t offset = i * char_spacing + 1;
if (inv) {
memcpy_inv(buffer + offset, font + index * char_width, char_width);
} else {
memcpy(buffer + offset, font + index * char_width, char_width); memcpy(buffer + offset, font + index * char_width, char_width);
} }
} }
} }
void UI_PrintString(const char *pString, uint8_t Start, uint8_t End, uint8_t Line, uint8_t Width)
{
size_t i;
size_t Length = strlen(pString);
if (End > Start)
Start += (((End - Start) - (Length * Width)) + 1) / 2;
for (i = 0; i < Length; i++)
{
const unsigned int ofs = (unsigned int)Start + (i * Width);
if (pString[i] > ' ' && pString[i] < 127)
{
const unsigned int index = pString[i] - ' ' - 1;
memcpy(gFrameBuffer[Line + 0] + ofs, &gFontBig[index][0], 7);
memcpy(gFrameBuffer[Line + 1] + ofs, &gFontBig[index][7], 7);
}
}
} }
void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_t Line, uint8_t char_width, const uint8_t *font)
{ void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_t Line, uint8_t char_width,
const uint8_t *font, bool inv) {
const size_t Length = strlen(pString); const size_t Length = strlen(pString);
const unsigned int char_spacing = char_width + 1; const unsigned int char_spacing = char_width + 1;
@@ -107,17 +101,53 @@ void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_
Start += (((End - Start) - Length * char_spacing) + 1) / 2; Start += (((End - Start) - Length * char_spacing) + 1) / 2;
} }
UI_PrintStringBuffer(pString, gFrameBuffer[Line] + Start, char_width, font); UI_PrintStringBuffer(pString, gFrameBuffer[Line] + Start, char_width, font, inv);
} }
void UI_PrintStringSmallNormal(const char *pString, uint8_t Start, uint8_t End, uint8_t Line) void UI_PrintStringSmallNormal(const char *pString, uint8_t Start, uint8_t End, uint8_t Line) {
{ UI_PrintStringSmall(pString, Start, End, Line, ARRAY_SIZE(gFontSmall[0]), (const uint8_t *) gFontSmall, false);
UI_PrintStringSmall(pString, Start, End, Line, ARRAY_SIZE(gFontSmall[0]), (const uint8_t *)gFontSmall);
} }
void UI_PrintStringSmallBold(const char *pString, uint8_t Start, uint8_t End, uint8_t Line) void UI_PrintString(const char *pString, uint8_t Start, uint8_t End, uint8_t Line, uint8_t Width) {
{ Width = Width;
UI_PrintStringSmallNormal(pString, Start, End, Line);
// size_t i;
// size_t Length = strlen(pString);
//
// if (End > Start)
// Start += (((End - Start) - (Length * Width)) + 1) / 2;
//
// for (i = 0; i < Length; i++)
// {
// const unsigned int ofs = (unsigned int)Start + (i * Width);
// if (pString[i] > ' ' && pString[i] < 127)
// {
// const unsigned int index = pString[i] - ' ' - 1;
// memcpy(gFrameBuffer[Line + 0] + ofs, &gFontSmall[index + '0'][0], 7);
// memcpy(gFrameBuffer[Line + 1] + ofs, &gFontSmall[index + '0'][7], 7);
// }
// }
}
void UI_PrintStringSmallBold(const char *pString, uint8_t Start, uint8_t End, uint8_t Line) {
//#ifdef ENABLE_SMALL_BOLD
// const uint8_t *font = (uint8_t *)gFontSmallBold;
// const uint8_t char_width = ARRAY_SIZE(gFontSmallBold[0]);
//#else
// const uint8_t *font = (uint8_t *) gFontSmall;
// const uint8_t char_width = ARRAY_SIZE(gFontSmall[0]);
//#endif
//
// UI_PrintStringSmall(pString, Start, End, Line, char_width, font);
UI_PrintStringSmall(pString, Start, End, Line, ARRAY_SIZE(gFontSmall[0]), (const uint8_t *) gFontSmall, true);
}
void UI_PrintStringSmallBufferNormal(const char *pString, uint8_t *buffer) {
UI_PrintStringBuffer(pString, buffer, ARRAY_SIZE(gFontSmall[0]), (uint8_t *) gFontSmall, false);
}
void UI_PrintStringSmallBufferBold(const char *pString, uint8_t *buffer) {
#ifdef ENABLE_SMALL_BOLD #ifdef ENABLE_SMALL_BOLD
const uint8_t *font = (uint8_t *)gFontSmallBold; const uint8_t *font = (uint8_t *)gFontSmallBold;
const uint8_t char_width = ARRAY_SIZE(gFontSmallBold[0]); const uint8_t char_width = ARRAY_SIZE(gFontSmallBold[0]);
@@ -125,61 +155,45 @@ void UI_PrintStringSmallBold(const char *pString, uint8_t Start, uint8_t End, ui
const uint8_t *font = (uint8_t *) gFontSmall; const uint8_t *font = (uint8_t *) gFontSmall;
const uint8_t char_width = ARRAY_SIZE(gFontSmall[0]); const uint8_t char_width = ARRAY_SIZE(gFontSmall[0]);
#endif #endif
UI_PrintStringBuffer(pString, buffer, char_width, font, false);
UI_PrintStringSmall(pString, Start, End, Line, char_width, font);
} }
void UI_PrintStringSmallBufferNormal(const char *pString, uint8_t * buffer) //void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center) {
{ // const unsigned int char_width = 13;
UI_PrintStringBuffer(pString, buffer, ARRAY_SIZE(gFontSmall[0]), (uint8_t *)gFontSmall); // uint8_t *pFb0 = gFrameBuffer[Y] + X;
} // uint8_t *pFb1 = pFb0 + 128;
// bool bCanDisplay = false;
void UI_PrintStringSmallBufferBold(const char *pString, uint8_t * buffer) //
{ // uint8_t len = strlen(string);
#ifdef ENABLE_SMALL_BOLD // for (int i = 0; i < len; i++) {
const uint8_t *font = (uint8_t *)gFontSmallBold; // char c = string[i];
const uint8_t char_width = ARRAY_SIZE(gFontSmallBold[0]); // if (c == '-') c = '9' + 1;
#else // if (bCanDisplay || c != ' ') {
const uint8_t *font = (uint8_t *)gFontSmall; // bCanDisplay = true;
const uint8_t char_width = ARRAY_SIZE(gFontSmall[0]); // if (c >= '0' && c <= '9' + 1) {
#endif // memcpy(pFb0 + 2, gFontSmall[(unsigned char) c], char_width - 3);
UI_PrintStringBuffer(pString, buffer, char_width, font); // memcpy(pFb1 + 2, gFontSmall[(unsigned char) c] + char_width - 3, char_width - 3);
} // } else if (c == '.') {
// *pFb1 = 0x60;
void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center) // pFb0++;
{ // pFb1++;
const unsigned int char_width = 13; // *pFb1 = 0x60;
uint8_t *pFb0 = gFrameBuffer[Y] + X; // pFb0++;
uint8_t *pFb1 = pFb0 + 128; // pFb1++;
bool bCanDisplay = false; // *pFb1 = 0x60;
// pFb0++;
uint8_t len = strlen(string); // pFb1++;
for(int i = 0; i < len; i++) { // continue;
char c = string[i]; // }
if(c=='-') c = '9' + 1; //
if (bCanDisplay || c != ' ') // } else if (center) {
{ // pFb0 -= 6;
bCanDisplay = true; // pFb1 -= 6;
if(c>='0' && c<='9' + 1) { // }
memcpy(pFb0 + 2, gFontBigDigits[c-'0'], char_width - 3); // pFb0 += char_width;
memcpy(pFb1 + 2, gFontBigDigits[c-'0'] + char_width - 3, char_width - 3); // pFb1 += char_width;
} // }
else if(c=='.') { //}
*pFb1 = 0x60; pFb0++; pFb1++;
*pFb1 = 0x60; pFb0++; pFb1++;
*pFb1 = 0x60; pFb0++; pFb1++;
continue;
}
}
else if (center) {
pFb0 -= 6;
pFb1 -= 6;
}
pFb0 += char_width;
pFb1 += char_width;
}
}
/* /*
void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center) void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center)
@@ -221,8 +235,7 @@ void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center)
} }
*/ */
void UI_DrawPixelBuffer(uint8_t (*buffer)[128], uint8_t x, uint8_t y, bool black) void UI_DrawPixelBuffer(uint8_t (*buffer)[128], uint8_t x, uint8_t y, bool black) {
{
const uint8_t pattern = 1 << (y % 8); const uint8_t pattern = 1 << (y % 8);
if (black) if (black)
buffer[y / 8][x] |= pattern; buffer[y / 8][x] |= pattern;
@@ -230,8 +243,7 @@ void UI_DrawPixelBuffer(uint8_t (*buffer)[128], uint8_t x, uint8_t y, bool black
buffer[y / 8][x] &= ~pattern; buffer[y / 8][x] &= ~pattern;
} }
static void sort(int16_t *a, int16_t *b) static void sort(int16_t *a, int16_t *b) {
{
if (*a > *b) { if (*a > *b) {
int16_t t = *a; int16_t t = *a;
*a = *b; *a = *b;
@@ -240,6 +252,7 @@ static void sort(int16_t *a, int16_t *b)
} }
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
/* /*
void UI_DrawLineDottedBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black) void UI_DrawLineDottedBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black)
{ {
@@ -293,10 +306,10 @@ static void sort(int16_t *a, int16_t *b)
x += 4; x += 4;
} }
} }
#endif #endif
void UI_DrawLineBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black) void UI_DrawLineBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black) {
{
if (x2 == x1) { if (x2 == x1) {
sort(&y1, &y2); sort(&y1, &y2);
for (int16_t i = y1; i <= y2; i++) { for (int16_t i = y1; i <= y2; i++) {
@@ -308,15 +321,13 @@ void UI_DrawLineBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int16_t x
int b = y1 - a * x1 / multipl; int b = y1 - a * x1 / multipl;
sort(&x1, &x2); sort(&x1, &x2);
for(int i = x1; i<= x2; i++) for (int i = x1; i <= x2; i++) {
{
UI_DrawPixelBuffer(buffer, i, i * a / multipl + b, black); UI_DrawPixelBuffer(buffer, i, i * a / multipl + b, black);
} }
} }
} }
void UI_DrawRectangleBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black) void UI_DrawRectangleBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black) {
{
UI_DrawLineBuffer(buffer, x1, y1, x1, y2, black); UI_DrawLineBuffer(buffer, x1, y1, x1, y2, black);
UI_DrawLineBuffer(buffer, x1, y1, x2, y1, black); UI_DrawLineBuffer(buffer, x1, y1, x2, y1, black);
UI_DrawLineBuffer(buffer, x2, y1, x2, y2, black); UI_DrawLineBuffer(buffer, x2, y1, x2, y2, black);
@@ -324,8 +335,7 @@ void UI_DrawRectangleBuffer(uint8_t (*buffer)[128], int16_t x1, int16_t y1, int1
} }
void UI_DisplayPopup(const char *string) void UI_DisplayPopup(const char *string) {
{
UI_DisplayClear(); UI_DisplayClear();
// for(uint8_t i = 1; i < 5; i++) { // for(uint8_t i = 1; i < 5; i++) {
@@ -346,7 +356,6 @@ void UI_DisplayPopup(const char *string)
UI_PrintStringSmallNormal("Press EXIT", 9, 118, 6); UI_PrintStringSmallNormal("Press EXIT", 9, 118, 6);
} }
void UI_DisplayClear() void UI_DisplayClear() {
{
memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
} }

View File

@@ -27,7 +27,7 @@ void UI_PrintStringSmallNormal(const char *pString, uint8_t Start, uint8_t End,
void UI_PrintStringSmallBold(const char *pString, uint8_t Start, uint8_t End, uint8_t Line); void UI_PrintStringSmallBold(const char *pString, uint8_t Start, uint8_t End, uint8_t Line);
void UI_PrintStringSmallBufferNormal(const char *pString, uint8_t *buffer); void UI_PrintStringSmallBufferNormal(const char *pString, uint8_t *buffer);
void UI_PrintStringSmallBufferBold(const char *pString, uint8_t * buffer); void UI_PrintStringSmallBufferBold(const char *pString, uint8_t * buffer);
void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center); //void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center);
void UI_DisplayPopup(const char *string); void UI_DisplayPopup(const char *string);

419
ui/main.c
View File

@@ -19,9 +19,13 @@
#include "app/chFrScanner.h" #include "app/chFrScanner.h"
#include "app/dtmf.h" #include "app/dtmf.h"
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
#include "am_fix.h" #include "am_fix.h"
#endif #endif
#include "bitmaps.h" #include "bitmaps.h"
#include "board.h" #include "board.h"
#include "driver/bk4819.h" #include "driver/bk4819.h"
@@ -39,7 +43,9 @@
#include "audio.h" #include "audio.h"
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
#include "driver/system.h" #include "driver/system.h"
#endif #endif
center_line_t center_line = CENTER_LINE_NONE; center_line_t center_line = CENTER_LINE_NONE;
@@ -53,10 +59,10 @@ center_line_t center_line = CENTER_LINE_NONE;
bool isMainOnlyInputDTMF = false; bool isMainOnlyInputDTMF = false;
static bool isMainOnly() static bool isMainOnly() {
{
return (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) && (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF); return (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) && (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF);
} }
#endif #endif
const int8_t dBmCorrTable[7] = { const int8_t dBmCorrTable[7] = {
@@ -81,8 +87,7 @@ const char *VfoStateStr[] = {
// *************************************************************************** // ***************************************************************************
static void DrawSmallAntennaAndBars(uint8_t *p, unsigned int level) static void DrawSmallAntennaAndBars(uint8_t *p, unsigned int level) {
{
if (level > 6) if (level > 6)
level = 6; level = 6;
@@ -93,10 +98,10 @@ static void DrawSmallAntennaAndBars(uint8_t *p, unsigned int level)
memset(p + 2 + i * 3, bar, 2); memset(p + 2 + i * 3, bar, 2);
} }
} }
#if defined ENABLE_AUDIO_BAR || defined ENABLE_RSSI_BAR #if defined ENABLE_AUDIO_BAR || defined ENABLE_RSSI_BAR
static void DrawLevelBar(uint8_t xpos, uint8_t line, uint8_t level, uint8_t bars) static void DrawLevelBar(uint8_t xpos, uint8_t line, uint8_t level, uint8_t bars) {
{
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
const char hollowBar[] = { const char hollowBar[] = {
0b01111111, 0b01111111,
@@ -111,8 +116,7 @@ static void DrawLevelBar(uint8_t xpos, uint8_t line, uint8_t level, uint8_t bars
for (uint8_t i = 0; i < level; i++) { for (uint8_t i = 0; i < level; i++) {
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if(gSetting_set_met) if (gSetting_set_met) {
{
const char hollowBar[] = { const char hollowBar[] = {
0b01111111, 0b01111111,
0b01000001, 0b01000001,
@@ -123,13 +127,10 @@ static void DrawLevelBar(uint8_t xpos, uint8_t line, uint8_t level, uint8_t bars
if (i < bars - 4) { if (i < bars - 4) {
for (uint8_t j = 0; j < 4; j++) for (uint8_t j = 0; j < 4; j++)
p_line[xpos + i * 5 + j] = (~(0x7F >> (i + 1))) & 0x7F; p_line[xpos + i * 5 + j] = (~(0x7F >> (i + 1))) & 0x7F;
} } else {
else {
memcpy(p_line + (xpos + i * 5), &hollowBar, ARRAY_SIZE(hollowBar)); memcpy(p_line + (xpos + i * 5), &hollowBar, ARRAY_SIZE(hollowBar));
} }
} } else {
else
{
const char hollowBar[] = { const char hollowBar[] = {
0b00111110, 0b00111110,
0b00100010, 0b00100010,
@@ -146,8 +147,7 @@ static void DrawLevelBar(uint8_t xpos, uint8_t line, uint8_t level, uint8_t bars
if (i < bars - 4) { if (i < bars - 4) {
memcpy(p_line + (xpos + i * 5), &simpleBar, ARRAY_SIZE(simpleBar)); memcpy(p_line + (xpos + i * 5), &simpleBar, ARRAY_SIZE(simpleBar));
} } else {
else {
memcpy(p_line + (xpos + i * 5), &hollowBar, ARRAY_SIZE(hollowBar)); memcpy(p_line + (xpos + i * 5), &hollowBar, ARRAY_SIZE(hollowBar));
} }
} }
@@ -162,6 +162,7 @@ static void DrawLevelBar(uint8_t xpos, uint8_t line, uint8_t level, uint8_t bars
#endif #endif
} }
} }
#endif #endif
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
@@ -175,10 +176,8 @@ uint8_t log2_approx(unsigned int value) {
return log; return log;
} }
void UI_DisplayAudioBar(void) void UI_DisplayAudioBar(void) {
{ if (gSetting_mic_bar) {
if (gSetting_mic_bar)
{
if (gLowBattery && !gLowBatteryConfirmed) if (gLowBattery && !gLowBatteryConfirmed)
return; return;
@@ -187,12 +186,9 @@ void UI_DisplayAudioBar(void)
RxBlinkLedCounter = 0; RxBlinkLedCounter = 0;
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false); BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false);
unsigned int line; unsigned int line;
if (isMainOnly()) if (isMainOnly()) {
{
line = 5; line = 5;
} } else {
else
{
line = 3; line = 3;
} }
#else #else
@@ -204,8 +200,7 @@ void UI_DisplayAudioBar(void)
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
|| gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_CallState != DTMF_CALL_STATE_NONE
#endif #endif
) ) {
{
return; // screen is in use return; // screen is in use
} }
@@ -236,10 +231,10 @@ void UI_DisplayAudioBar(void)
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
} }
} }
#endif #endif
void DisplayRSSIBar(const bool now) void DisplayRSSIBar(const bool now) {
{
#if defined(ENABLE_RSSI_BAR) #if defined(ENABLE_RSSI_BAR)
const unsigned int txt_width = 7 * 8; // 8 text chars const unsigned int txt_width = 7 * 8; // 8 text chars
@@ -259,12 +254,9 @@ void DisplayRSSIBar(const bool now)
*/ */
unsigned int line; unsigned int line;
if (isMainOnly()) if (isMainOnly()) {
{
line = 5; line = 5;
} } else {
else
{
line = 3; line = 3;
} }
@@ -272,14 +264,12 @@ void DisplayRSSIBar(const bool now)
//sprintf(String, "%d", RxBlink); //sprintf(String, "%d", RxBlink);
//UI_PrintStringSmallBold(String, 80, 0, RxLine); //UI_PrintStringSmallBold(String, 80, 0, RxLine);
if(RxLine >= 0 && center_line != CENTER_LINE_IN_USE) if (RxLine >= 0 && center_line != CENTER_LINE_IN_USE) {
{
if (RxBlink == 0 || RxBlink == 1) { if (RxBlink == 0 || RxBlink == 1) {
UI_PrintStringSmallBold("RX", 8, 0, RxLine); UI_PrintStringSmallBold("RX", 8, 0, RxLine);
if (RxBlink == 1) RxBlink = 2; if (RxBlink == 1) RxBlink = 2;
} else { } else {
for (uint8_t i = 8; i < 24; i++) for (uint8_t i = 8; i < 24; i++) {
{
gFrameBuffer[RxLine][i] = 0x00; gFrameBuffer[RxLine][i] = 0x00;
} }
RxBlink = 1; RxBlink = 1;
@@ -337,8 +327,7 @@ void DisplayRSSIBar(const bool now)
if (rssi_dBm >= 93) { if (rssi_dBm >= 93) {
s_level = map(rssi_dBm, 141, 93, 1, 9); s_level = map(rssi_dBm, 141, 93, 1, 9);
} } else {
else {
s_level = 9; s_level = 9;
overS9dBm = map(rssi_dBm, 93, 53, 0, 40); overS9dBm = map(rssi_dBm, 93, 53, 0, 40);
overS9Bars = map(overS9dBm, 0, 40, 0, 4); overS9Bars = map(overS9dBm, 0, 40, 0, 4);
@@ -359,13 +348,10 @@ void DisplayRSSIBar(const bool now)
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if (gSetting_set_gui) if (gSetting_set_gui) {
{
sprintf(str, "%3d", -rssi_dBm); sprintf(str, "%3d", -rssi_dBm);
UI_PrintStringSmallNormal(str, LCD_WIDTH + 8, 0, line - 1); UI_PrintStringSmallNormal(str, LCD_WIDTH + 8, 0, line - 1);
} } else {
else
{
sprintf(str, "% 4d %s", -rssi_dBm, "dBm"); sprintf(str, "% 4d %s", -rssi_dBm, "dBm");
if (isMainOnly()) if (isMainOnly())
GUI_DisplaySmallest(str, 2, 41, false, true); GUI_DisplaySmallest(str, 2, 41, false, true);
@@ -375,8 +361,7 @@ void DisplayRSSIBar(const bool now)
if (overS9Bars == 0) { if (overS9Bars == 0) {
sprintf(str, "S%d", s_level); sprintf(str, "S%d", s_level);
} } else {
else {
sprintf(str, "+%02d", overS9dBm); sprintf(str, "+%02d", overS9dBm);
} }
@@ -460,8 +445,7 @@ void UI_MAIN_PrintAGC(bool now)
} }
#endif #endif
void UI_MAIN_TimeSlice500ms(void) void UI_MAIN_TimeSlice500ms(void) {
{
if (gScreenToDisplay == DISPLAY_MAIN) { if (gScreenToDisplay == DISPLAY_MAIN) {
#ifdef ENABLE_AGC_SHOW_DATA #ifdef ENABLE_AGC_SHOW_DATA
UI_MAIN_PrintAGC(true); UI_MAIN_PrintAGC(true);
@@ -472,28 +456,19 @@ void UI_MAIN_TimeSlice500ms(void)
DisplayRSSIBar(true); DisplayRSSIBar(true);
} }
#ifdef ENABLE_FEAT_F4HWN // Blink Green Led for white... #ifdef ENABLE_FEAT_F4HWN // Blink Green Led for white...
else if(gSetting_set_eot > 0 && RxBlinkLed == 2) else if (gSetting_set_eot > 0 && RxBlinkLed == 2) {
{ if (RxBlinkLedCounter <= 8) {
if(RxBlinkLedCounter <= 8) if (RxBlinkLedCounter % 2 == 0) {
{ if (gSetting_set_eot > 1) {
if(RxBlinkLedCounter % 2 == 0)
{
if(gSetting_set_eot > 1 )
{
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false); BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false);
} }
} } else {
else if (gSetting_set_eot > 1) {
{
if(gSetting_set_eot > 1 )
{
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, true); BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, true);
} }
if(gSetting_set_eot == 1 || gSetting_set_eot == 3) if (gSetting_set_eot == 1 || gSetting_set_eot == 3) {
{ switch (RxBlinkLedCounter) {
switch(RxBlinkLedCounter)
{
case 1: case 1:
AUDIO_PlayBeep(BEEP_400HZ_30MS); AUDIO_PlayBeep(BEEP_400HZ_30MS);
break; break;
@@ -513,9 +488,7 @@ void UI_MAIN_TimeSlice500ms(void)
} }
} }
RxBlinkLedCounter += 1; RxBlinkLedCounter += 1;
} } else {
else
{
RxBlinkLed = 0; RxBlinkLed = 0;
} }
} }
@@ -525,8 +498,7 @@ void UI_MAIN_TimeSlice500ms(void)
// *************************************************************************** // ***************************************************************************
void UI_DisplayMain(void) void UI_DisplayMain(void) {
{
char String[22]; char String[22];
center_line = CENTER_LINE_NONE; center_line = CENTER_LINE_NONE;
@@ -549,8 +521,7 @@ void UI_DisplayMain(void)
return; return;
} }
#else #else
if (gEeprom.KEY_LOCK && gKeypadLocked > 0) if (gEeprom.KEY_LOCK && gKeypadLocked > 0) { // tell user how to unlock the keyboard
{ // tell user how to unlock the keyboard
uint8_t shift = 3; uint8_t shift = 3;
/* /*
@@ -560,8 +531,7 @@ void UI_DisplayMain(void)
SYSTEM_DelayMs(50); SYSTEM_DelayMs(50);
*/ */
if(isMainOnly()) if (isMainOnly()) {
{
shift = 5; shift = 5;
} }
//memcpy(gFrameBuffer[shift] + 2, gFontKeyLock, sizeof(gFontKeyLock)); //memcpy(gFrameBuffer[shift] + 2, gFontKeyLock, sizeof(gFontKeyLock));
@@ -579,18 +549,14 @@ void UI_DisplayMain(void)
unsigned int activeTxVFO = gRxVfoIsActive ? gEeprom.RX_VFO : gEeprom.TX_VFO; unsigned int activeTxVFO = gRxVfoIsActive ? gEeprom.RX_VFO : gEeprom.TX_VFO;
for (unsigned int vfo_num = 0; vfo_num < 2; vfo_num++) for (unsigned int vfo_num = 0; vfo_num < 2; vfo_num++) {
{
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
const unsigned int line0 = 0; // text screen line const unsigned int line0 = 0; // text screen line
const unsigned int line1 = 4; const unsigned int line1 = 4;
unsigned int line; unsigned int line;
if (isMainOnly()) if (isMainOnly()) {
{
line = 0; line = 0;
} } else {
else
{
line = (vfo_num == 0) ? line0 : line1; line = (vfo_num == 0) ? line0 : line1;
} }
const bool isMainVFO = (vfo_num == gEeprom.TX_VFO); const bool isMainVFO = (vfo_num == gEeprom.TX_VFO);
@@ -608,10 +574,8 @@ void UI_DisplayMain(void)
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if (isMainOnly()) if (isMainOnly()) {
{ if (activeTxVFO != vfo_num) {
if (activeTxVFO != vfo_num)
{
continue; continue;
} }
} }
@@ -632,8 +596,7 @@ void UI_DisplayMain(void)
uint8_t shift = 0; uint8_t shift = 0;
if (isMainOnly()) if (isMainOnly()) {
{
shift = 3; shift = 3;
} }
@@ -645,9 +608,7 @@ void UI_DisplayMain(void)
if (!isMainOnly()) if (!isMainOnly())
continue; continue;
} } else {
else
{
gScanRangeStart = 0; gScanRangeStart = 0;
} }
#else #else
@@ -662,6 +623,20 @@ void UI_DisplayMain(void)
#endif #endif
if (gEnteringSMS == SMS_ENTERING_DEST) {
UI_PrintString("SMS Dst", 0, 0, line - 1, 8);
sprintf(String, "%d", dataPacket.dest);
UI_PrintStringSmallNormal(String, 0, 0, line);
continue;
}
if (gEnteringSMS == SMS_ENTERING_MESSAGE) {
UI_PrintString("SMS Dat", 0, 0, line - 1, 8);
sprintf(String, "%s", dataPacket.data);
UI_PrintStringSmallNormal(String, 0, 0, line);
continue;
}
if (gDTMF_InputMode if (gDTMF_InputMode
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
|| gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx || gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx
@@ -674,7 +649,8 @@ void UI_DisplayMain(void)
if (!gDTMF_InputMode) { if (!gDTMF_InputMode) {
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) { if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) {
pPrintStr = DTMF_FindContact(gDTMF_String, Contact) ? Contact : gDTMF_String; pPrintStr = DTMF_FindContact(gDTMF_String, Contact) ? Contact : gDTMF_String;
} else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY){ } else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED ||
gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) {
pPrintStr = DTMF_FindContact(gDTMF_Callee, Contact) ? Contact : gDTMF_Callee; pPrintStr = DTMF_FindContact(gDTMF_Callee, Contact) ? Contact : gDTMF_Callee;
} else if (gDTMF_IsTx) { } else if (gDTMF_IsTx) {
pPrintStr = gDTMF_String; pPrintStr = gDTMF_String;
@@ -687,14 +663,15 @@ void UI_DisplayMain(void)
if (!gDTMF_InputMode) { if (!gDTMF_InputMode) {
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) { if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) {
pPrintStr = (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT"; pPrintStr = (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT";
} else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) { } else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED ||
sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller); gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) {
sprintf(String, "CALL FRM:%s",
(DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller);
pPrintStr = String; pPrintStr = String;
} else if (gDTMF_IsTx) { } else if (gDTMF_IsTx) {
pPrintStr = (gDTMF_State == DTMF_STATE_TX_SUCC) ? "DTMF TX(SUCC)" : "DTMF TX"; pPrintStr = (gDTMF_State == DTMF_STATE_TX_SUCC) ? "DTMF TX(SUCC)" : "DTMF TX";
} }
} } else
else
#endif #endif
{ {
sprintf(String, ">%s", gDTMF_InputBox); sprintf(String, ">%s", gDTMF_InputBox);
@@ -702,14 +679,11 @@ void UI_DisplayMain(void)
} }
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if (isMainOnly()) if (isMainOnly()) {
{
UI_PrintString(pPrintStr, 2, 0, 5, 8); UI_PrintString(pPrintStr, 2, 0, 5, 8);
isMainOnlyInputDTMF = true; isMainOnlyInputDTMF = true;
center_line = CENTER_LINE_IN_USE; center_line = CENTER_LINE_IN_USE;
} } else {
else
{
UI_PrintString(pPrintStr, 2, 0, 0 + (vfo_num * 3), 8); UI_PrintString(pPrintStr, 2, 0, 0 + (vfo_num * 3), 8);
isMainOnlyInputDTMF = false; isMainOnlyInputDTMF = false;
center_line = CENTER_LINE_IN_USE; center_line = CENTER_LINE_IN_USE;
@@ -725,8 +699,7 @@ void UI_DisplayMain(void)
// highlight the selected/used VFO with a marker // highlight the selected/used VFO with a marker
if (isMainVFO) if (isMainVFO)
memcpy(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); memcpy(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default));
} } else // active TX VFO
else // active TX VFO
{ // highlight the selected/used VFO with a marker { // highlight the selected/used VFO with a marker
if (isMainVFO) if (isMainVFO)
memcpy(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); memcpy(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default));
@@ -736,16 +709,14 @@ void UI_DisplayMain(void)
uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency; uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency;
if(TX_freq_check(frequency) != 0 && gEeprom.VfoInfo[vfo_num].TX_LOCK == true) if (TX_freq_check(frequency) != 0 && gEeprom.VfoInfo[vfo_num].TX_LOCK == true) {
{
if (isMainOnly()) if (isMainOnly())
memcpy(p_line0 + 14, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock)); memcpy(p_line0 + 14, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock));
else else
memcpy(p_line0 + 24, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock)); memcpy(p_line0 + 24, BITMAP_VFO_Lock, sizeof(BITMAP_VFO_Lock));
} }
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT) { // transmitting
{ // transmitting
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_SITE_ALARM) if (gAlarmState == ALARM_STATE_SITE_ALARM)
@@ -753,15 +724,12 @@ void UI_DisplayMain(void)
else else
#endif #endif
{ {
if (activeTxVFO == vfo_num) if (activeTxVFO == vfo_num) { // show the TX symbol
{ // show the TX symbol
mode = VFO_MODE_TX; mode = VFO_MODE_TX;
UI_PrintStringSmallBold("TX", 8, 0, line); UI_PrintStringSmallBold("TX", 8, 0, line);
} }
} }
} } else { // receiving .. show the RX symbol
else
{ // receiving .. show the RX symbol
mode = VFO_MODE_RX; mode = VFO_MODE_RX;
//if (FUNCTION_IsRx() && gEeprom.RX_VFO == vfo_num) { //if (FUNCTION_IsRx() && gEeprom.RX_VFO == vfo_num) {
if (FUNCTION_IsRx() && gEeprom.RX_VFO == vfo_num && VfoState[vfo_num] == VFO_STATE_NORMAL) { if (FUNCTION_IsRx() && gEeprom.RX_VFO == vfo_num && VfoState[vfo_num] == VFO_STATE_NORMAL) {
@@ -770,12 +738,9 @@ void UI_DisplayMain(void)
RxBlinkLedCounter = 0; RxBlinkLedCounter = 0;
RxLine = line; RxLine = line;
RxOnVfofrequency = frequency; RxOnVfofrequency = frequency;
if(!isMainVFO) if (!isMainVFO) {
{
RxBlink = 1; RxBlink = 1;
} } else {
else
{
RxBlink = 0; RxBlink = 0;
} }
#else #else
@@ -783,10 +748,8 @@ void UI_DisplayMain(void)
#endif #endif
} }
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
else else {
{ if (RxOnVfofrequency == frequency && !isMainOnly()) {
if(RxOnVfofrequency == frequency && !isMainOnly())
{
UI_PrintStringSmallNormal(">>", 8, 0, line); UI_PrintStringSmallNormal(">>", 8, 0, line);
//memcpy(p_line0 + 14, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); //memcpy(p_line0 + 14, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default));
} }
@@ -797,8 +760,7 @@ void UI_DisplayMain(void)
#endif #endif
} }
if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { // channel mode
{ // channel mode
const unsigned int x = 2; const unsigned int x = 2;
const bool inputting = gInputBoxIndex != 0 && gEeprom.TX_VFO == vfo_num; const bool inputting = gInputBoxIndex != 0 && gEeprom.TX_VFO == vfo_num;
if (!inputting) if (!inputting)
@@ -806,9 +768,7 @@ void UI_DisplayMain(void)
else else
sprintf(String, "M%.3s", INPUTBOX_GetAscii()); // show the input text sprintf(String, "M%.3s", INPUTBOX_GetAscii()); // show the input text
UI_PrintStringSmallNormal(String, x, 0, line + 1); UI_PrintStringSmallNormal(String, x, 0, line + 1);
} } else if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { // frequency mode
else if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]))
{ // frequency mode
// show the frequency band number // show the frequency band number
const unsigned int x = 2; const unsigned int x = 2;
char *buf = gEeprom.VfoInfo[vfo_num].pRX->Frequency < _1GHz_in_KHz ? "" : "+"; char *buf = gEeprom.VfoInfo[vfo_num].pRX->Frequency < _1GHz_in_KHz ? "" : "+";
@@ -840,13 +800,11 @@ void UI_DisplayMain(void)
state = VFO_STATE_ALARM; state = VFO_STATE_ALARM;
} }
#endif #endif
if (state != VFO_STATE_NORMAL) if (state != VFO_STATE_NORMAL) {
{
if (state < ARRAY_SIZE(VfoStateStr)) if (state < ARRAY_SIZE(VfoStateStr))
UI_PrintString(VfoStateStr[state], 31, 0, line, 8); UI_PrintString(VfoStateStr[state], 31, 0, line, 8);
} } else if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) &&
else if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_VFO == vfo_num) gEeprom.TX_VFO == vfo_num) { // user entering a frequency
{ // user entering a frequency
const char *ascii = INPUTBOX_GetAscii(); const char *ascii = INPUTBOX_GetAscii();
bool isGigaF = frequency >= _1GHz_in_KHz; bool isGigaF = frequency >= _1GHz_in_KHz;
sprintf(String, "%.*s.%.3s", 3 + isGigaF, ascii, ascii + 3 + isGigaF); sprintf(String, "%.*s.%.3s", 3 + isGigaF, ascii, ascii + 3 + isGigaF);
@@ -857,8 +815,7 @@ void UI_DisplayMain(void)
String[7] = 0; String[7] = 0;
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, line, false); UI_DisplayFrequency(String, 32, line, false);
} } else
else
#endif #endif
{ {
// show the frequency in the main font // show the frequency in the main font
@@ -866,17 +823,13 @@ void UI_DisplayMain(void)
} }
continue; continue;
} } else {
else if (gCurrentFunction == FUNCTION_TRANSMIT) { // transmitting
{
if (gCurrentFunction == FUNCTION_TRANSMIT)
{ // transmitting
if (activeTxVFO == vfo_num) if (activeTxVFO == vfo_num)
frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency; frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency;
} }
if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { // it's a channel
{ // it's a channel
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
if(gEeprom.MENU_LOCK == false) { if(gEeprom.MENU_LOCK == false) {
@@ -884,39 +837,30 @@ void UI_DisplayMain(void)
uint8_t countList = 0; uint8_t countList = 0;
uint8_t shiftList = 0; uint8_t shiftList = 0;
if(gMR_ChannelExclude[gEeprom.ScreenChannel[vfo_num]] == false) if (gMR_ChannelExclude[gEeprom.ScreenChannel[vfo_num]] == false) {
{
// show the scan list assigment symbols // show the scan list assigment symbols
const ChannelAttributes_t att = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; const ChannelAttributes_t att = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]];
countList = att.scanlist1 + att.scanlist2 + att.scanlist3; countList = att.scanlist1 + att.scanlist2 + att.scanlist3;
if(countList == 0) if (countList == 0) {
{
memcpy(p_line0 + 127 - (1 * 6), BITMAP_ScanList0, sizeof(BITMAP_ScanList0)); memcpy(p_line0 + 127 - (1 * 6), BITMAP_ScanList0, sizeof(BITMAP_ScanList0));
} } else {
else
{
shiftList = countList; shiftList = countList;
if (att.scanlist1) if (att.scanlist1) {
{
memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList1, sizeof(BITMAP_ScanList1));
shiftList--; shiftList--;
} }
if (att.scanlist2) if (att.scanlist2) {
{
memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList2, sizeof(BITMAP_ScanList2));
shiftList--; shiftList--;
} }
if (att.scanlist3) if (att.scanlist3) {
{
memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList3, sizeof(BITMAP_ScanList3)); memcpy(p_line0 + 127 - (shiftList * 6), BITMAP_ScanList3, sizeof(BITMAP_ScanList3));
} }
} }
} } else {
else
{
memcpy(p_line0 + 127 - (1 * 6), BITMAP_ScanListE, sizeof(BITMAP_ScanListE)); memcpy(p_line0 + 127 - (1 * 6), BITMAP_ScanListE, sizeof(BITMAP_ScanListE));
} }
@@ -928,14 +872,14 @@ void UI_DisplayMain(void)
// compander symbol // compander symbol
#ifndef ENABLE_BIG_FREQ #ifndef ENABLE_BIG_FREQ
const ChannelAttributes_t att = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]];
if (att.compander) if (att.compander)
memcpy(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); memcpy(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand));
#else #else
// TODO: // find somewhere else to put the symbol // TODO: // find somewhere else to put the symbol
#endif #endif
switch (gEeprom.CHANNEL_DISPLAY_MODE) switch (gEeprom.CHANNEL_DISPLAY_MODE) {
{
case MDF_FREQUENCY: // show the channel frequency case MDF_FREQUENCY: // show the channel frequency
sprintf(String, "%3u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%3u.%05u", frequency / 100000, frequency % 100000);
#ifdef ENABLE_BIG_FREQ #ifdef ENABLE_BIG_FREQ
@@ -945,8 +889,7 @@ void UI_DisplayMain(void)
String[7] = 0; String[7] = 0;
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, line, false); UI_DisplayFrequency(String, 32, line, false);
} } else
else
#endif #endif
{ {
// show the frequency in the main font // show the frequency in the main font
@@ -964,27 +907,20 @@ void UI_DisplayMain(void)
case MDF_NAME_FREQ: // show the channel name and frequency case MDF_NAME_FREQ: // show the channel name and frequency
SETTINGS_FetchChannelName(String, gEeprom.ScreenChannel[vfo_num]); SETTINGS_FetchChannelName(String, gEeprom.ScreenChannel[vfo_num]);
if (String[0] == 0) if (String[0] == 0) { // no channel name, show the channel number instead
{ // no channel name, show the channel number instead
sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1);
} }
if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) { if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) {
UI_PrintString(String, 32, 0, line, 8); UI_PrintString(String, 32, 0, line, 8);
} } else {
else {
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if (isMainOnly()) if (isMainOnly()) {
{
UI_PrintString(String, 32, 0, line, 8); UI_PrintString(String, 32, 0, line, 8);
} } else {
else
{
if (activeTxVFO == vfo_num) { if (activeTxVFO == vfo_num) {
UI_PrintStringSmallBold(String, 32 + 4, 0, line); UI_PrintStringSmallBold(String, 32 + 4, 0, line);
} } else {
else
{
UI_PrintStringSmallNormal(String, 32 + 4, 0, line); UI_PrintStringSmallNormal(String, 32 + 4, 0, line);
} }
} }
@@ -993,24 +929,20 @@ void UI_DisplayMain(void)
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if (isMainOnly()) if (isMainOnly()) {
{
sprintf(String, "%3u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%3u.%05u", frequency / 100000, frequency % 100000);
if (frequency < _1GHz_in_KHz) { if (frequency < _1GHz_in_KHz) {
// show the remaining 2 small frequency digits // show the remaining 2 small frequency digits
UI_PrintStringSmallNormal(String + 7, 113, 0, line + 4); UI_PrintStringSmallNormal(String + 7, 113, 0, line + 4);
String[7] = 0; String[7] = 0;
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, line + 3, false); //UI_DisplayFrequency(String, 32, line + 3, false);
} UI_PrintStringSmallNormal(String, 0, 20, line + 3);
else } else {
{
// show the frequency in the main font // show the frequency in the main font
UI_PrintString(String, 32, 0, line + 3, 8); UI_PrintString(String, 32, 0, line + 3, 8);
} }
} } else {
else
{
sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000);
UI_PrintStringSmallNormal(String, 32 + 4, 0, line + 1); UI_PrintStringSmallNormal(String, 32 + 4, 0, line + 1);
} }
@@ -1022,9 +954,7 @@ void UI_DisplayMain(void)
break; break;
} }
} } else { // frequency mode
else
{ // frequency mode
sprintf(String, "%3u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%3u.%05u", frequency / 100000, frequency % 100000);
#ifdef ENABLE_BIG_FREQ #ifdef ENABLE_BIG_FREQ
@@ -1034,8 +964,7 @@ void UI_DisplayMain(void)
String[7] = 0; String[7] = 0;
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, line, false); UI_DisplayFrequency(String, 32, line, false);
} } else
else
#endif #endif
{ {
// show the frequency in the main font // show the frequency in the main font
@@ -1058,8 +987,7 @@ void UI_DisplayMain(void)
{ // show the TX/RX level { // show the TX/RX level
int8_t Level = -1; int8_t Level = -1;
if (mode == VFO_MODE_TX) if (mode == VFO_MODE_TX) { // TX power level
{ // TX power level
/* /*
switch (gRxVfo->OUTPUT_POWER) switch (gRxVfo->OUTPUT_POWER)
{ {
@@ -1081,10 +1009,7 @@ void UI_DisplayMain(void)
} }
*/ */
Level = gRxVfo->OUTPUT_POWER - 1; Level = gRxVfo->OUTPUT_POWER - 1;
} } else if (mode == VFO_MODE_RX) { // RX signal level
else
if (mode == VFO_MODE_RX)
{ // RX signal level
#ifndef ENABLE_RSSI_BAR #ifndef ENABLE_RSSI_BAR
// bar graph // bar graph
if (gVFO_RSSI_bar_level[vfo_num] > 0) if (gVFO_RSSI_bar_level[vfo_num] > 0)
@@ -1132,8 +1057,7 @@ void UI_DisplayMain(void)
const FREQ_Config_t *pConfig = (mode == VFO_MODE_TX) ? vfoInfo->pTX : vfoInfo->pRX; const FREQ_Config_t *pConfig = (mode == VFO_MODE_TX) ? vfoInfo->pTX : vfoInfo->pRX;
int8_t shift = 0; int8_t shift = 0;
switch((int)pConfig->CodeType) switch ((int) pConfig->CodeType) {
{
case 1: case 1:
sprintf(String, "%u.%u", CTCSS_Options[pConfig->Code] / 10, CTCSS_Options[pConfig->Code] % 10); sprintf(String, "%u.%u", CTCSS_Options[pConfig->Code] / 10, CTCSS_Options[pConfig->Code] % 10);
break; break;
@@ -1151,31 +1075,23 @@ void UI_DisplayMain(void)
shift = -10; shift = -10;
} }
if (gSetting_set_gui) if (gSetting_set_gui) {
{
UI_PrintStringSmallNormal(s, LCD_WIDTH + 22, 0, line + 1); UI_PrintStringSmallNormal(s, LCD_WIDTH + 22, 0, line + 1);
UI_PrintStringSmallNormal(t, LCD_WIDTH + 2, 0, line + 1); UI_PrintStringSmallNormal(t, LCD_WIDTH + 2, 0, line + 1);
if (isMainOnly() && !gDTMF_InputMode) if (isMainOnly() && !gDTMF_InputMode) {
{ if (shift == 0) {
if(shift == 0)
{
UI_PrintStringSmallNormal(String, 2, 0, 6); UI_PrintStringSmallNormal(String, 2, 0, 6);
} }
if((vfoInfo->StepFrequency / 100) < 100) if ((vfoInfo->StepFrequency / 100) < 100) {
{
sprintf(String, "%d.%02uK", vfoInfo->StepFrequency / 100, vfoInfo->StepFrequency % 100); sprintf(String, "%d.%02uK", vfoInfo->StepFrequency / 100, vfoInfo->StepFrequency % 100);
} } else {
else
{
sprintf(String, "%dK", vfoInfo->StepFrequency / 100); sprintf(String, "%dK", vfoInfo->StepFrequency / 100);
} }
UI_PrintStringSmallNormal(String, 46, 0, 6); UI_PrintStringSmallNormal(String, 46, 0, 6);
} }
} } else {
else
{
if ((s != NULL) && (s[0] != '\0')) { if ((s != NULL) && (s[0] != '\0')) {
GUI_DisplaySmallest(s, 58, line == 0 ? 17 : 49, false, true); GUI_DisplaySmallest(s, 58, line == 0 ? 17 : 49, false, true);
} }
@@ -1193,48 +1109,39 @@ void UI_DisplayMain(void)
UI_PrintStringSmallNormal(s, LCD_WIDTH + 24, 0, line + 1); UI_PrintStringSmallNormal(s, LCD_WIDTH + 24, 0, line + 1);
#endif #endif
if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) { // show the TX power
{ // show the TX power
uint8_t currentPower = vfoInfo->OUTPUT_POWER % 8; uint8_t currentPower = vfoInfo->OUTPUT_POWER % 8;
uint8_t arrowPos = 19; uint8_t arrowPos = 19;
bool userPower = false; bool userPower = false;
if(currentPower == OUTPUT_POWER_USER) if (currentPower == OUTPUT_POWER_USER) {
{
currentPower = gSetting_set_pwr; currentPower = gSetting_set_pwr;
userPower = true; userPower = true;
} } else {
else
{
currentPower--; currentPower--;
userPower = false; userPower = false;
} }
if (gSetting_set_gui) if (gSetting_set_gui) {
{
const char pwr_short[][3] = {"L1", "L2", "L3", "L4", "L5", "M", "H"}; const char pwr_short[][3] = {"L1", "L2", "L3", "L4", "L5", "M", "H"};
//sprintf(String, "%s", pwr_short[currentPower]); //sprintf(String, "%s", pwr_short[currentPower]);
//UI_PrintStringSmallNormal(String, LCD_WIDTH + 42, 0, line + 1); //UI_PrintStringSmallNormal(String, LCD_WIDTH + 42, 0, line + 1);
UI_PrintStringSmallNormal(pwr_short[currentPower], LCD_WIDTH + 42, 0, line + 1); UI_PrintStringSmallNormal(pwr_short[currentPower], LCD_WIDTH + 42, 0, line + 1);
arrowPos = 38; arrowPos = 38;
} } else {
else
{
const char pwr_long[][5] = {"LOW1", "LOW2", "LOW3", "LOW4", "LOW5", "MID", "HIGH"}; const char pwr_long[][5] = {"LOW1", "LOW2", "LOW3", "LOW4", "LOW5", "MID", "HIGH"};
//sprintf(String, "%s", pwr_long[currentPower]); //sprintf(String, "%s", pwr_long[currentPower]);
//GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true); //GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true);
GUI_DisplaySmallest(pwr_long[currentPower], 24, line == 0 ? 17 : 49, false, true); GUI_DisplaySmallest(pwr_long[currentPower], 24, line == 0 ? 17 : 49, false, true);
} }
if(userPower == true) if (userPower == true) {
{
memcpy(p_line0 + 256 + arrowPos, BITMAP_PowerUser, sizeof(BITMAP_PowerUser)); memcpy(p_line0 + 256 + arrowPos, BITMAP_PowerUser, sizeof(BITMAP_PowerUser));
} }
} }
if (vfoInfo->freq_config_RX.Frequency != vfoInfo->freq_config_TX.Frequency) if (vfoInfo->freq_config_RX.Frequency != vfoInfo->freq_config_TX.Frequency) { // show the TX offset symbol
{ // show the TX offset symbol
int i = vfoInfo->TX_OFFSET_FREQUENCY_DIRECTION % 3; int i = vfoInfo->TX_OFFSET_FREQUENCY_DIRECTION % 3;
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
@@ -1249,12 +1156,9 @@ void UI_DisplayMain(void)
#endif #endif
#if ENABLE_FEAT_F4HWN #if ENABLE_FEAT_F4HWN
if (gSetting_set_gui) if (gSetting_set_gui) {
{
UI_PrintStringSmallNormal(dir_list[i], LCD_WIDTH + 60, 0, line + 1); UI_PrintStringSmallNormal(dir_list[i], LCD_WIDTH + 60, 0, line + 1);
} } else {
else
{
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
if(i == 3) if(i == 3)
{ {
@@ -1277,12 +1181,9 @@ void UI_DisplayMain(void)
if (vfoInfo->FrequencyReverse) if (vfoInfo->FrequencyReverse)
#if ENABLE_FEAT_F4HWN #if ENABLE_FEAT_F4HWN
{ {
if (gSetting_set_gui) if (gSetting_set_gui) {
{
UI_PrintStringSmallNormal("R", LCD_WIDTH + 68, 0, line + 1); UI_PrintStringSmallNormal("R", LCD_WIDTH + 68, 0, line + 1);
} } else {
else
{
GUI_DisplaySmallest("R", 51, line == 0 ? 17 : 49, false, true); GUI_DisplaySmallest("R", 51, line == 0 ? 17 : 49, false, true);
} }
} }
@@ -1294,20 +1195,18 @@ void UI_DisplayMain(void)
#ifdef ENABLE_FEAT_F4HWN_NARROWER #ifdef ENABLE_FEAT_F4HWN_NARROWER
bool narrower = 0; bool narrower = 0;
if(vfoInfo->CHANNEL_BANDWIDTH == BANDWIDTH_NARROW && gSetting_set_nfm == 1) if (vfoInfo->CHANNEL_BANDWIDTH == BANDWIDTH_NARROW && gSetting_set_nfm == 1) {
{
narrower = 1; narrower = 1;
} }
if (gSetting_set_gui) if (gSetting_set_gui) {
{
const char *bandWidthNames[] = {"W", "N", "N+"}; const char *bandWidthNames[] = {"W", "N", "N+"};
UI_PrintStringSmallNormal(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH + narrower], LCD_WIDTH + 80, 0, line + 1); UI_PrintStringSmallNormal(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH + narrower], LCD_WIDTH + 80, 0,
} line + 1);
else } else {
{
const char *bandWidthNames[] = {"WIDE", "NAR", "NAR+"}; const char *bandWidthNames[] = {"WIDE", "NAR", "NAR+"};
GUI_DisplaySmallest(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH + narrower], 91, line == 0 ? 17 : 49, false, true); GUI_DisplaySmallest(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH + narrower], 91, line == 0 ? 17 : 49, false,
true);
} }
#else #else
if (gSetting_set_gui) if (gSetting_set_gui)
@@ -1328,15 +1227,13 @@ void UI_DisplayMain(void)
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
// show the DTMF decoding symbol // show the DTMF decoding symbol
if (vfoInfo->DTMF_DECODING_ENABLE || gSetting_KILLED) if (vfoInfo->DTMF_DECODING_ENABLE)
UI_PrintStringSmallNormal("DTMF", LCD_WIDTH + 78, 0, line + 1); UI_PrintStringSmallNormal("DTMF", LCD_WIDTH + 78, 0, line + 1);
#endif #endif
#ifndef ENABLE_FEAT_F4HWN
// show the audio scramble symbol // show the audio scramble symbol
if (vfoInfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) if (vfoInfo->SCRAMBLING_TYPE > 0)
UI_PrintStringSmallNormal("SCR", LCD_WIDTH + 106, 0, line + 1); UI_PrintStringSmallNormal("S", LCD_WIDTH + 106, 0, line);
#endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
/* /*
@@ -1386,8 +1283,7 @@ void UI_DisplayMain(void)
UI_MAIN_PrintAGC(false); UI_MAIN_PrintAGC(false);
#endif #endif
if (center_line == CENTER_LINE_NONE) if (center_line == CENTER_LINE_NONE) { // we're free to use the middle line
{ // we're free to use the middle line
const bool rx = FUNCTION_IsRx(); const bool rx = FUNCTION_IsRx();
@@ -1395,8 +1291,7 @@ void UI_DisplayMain(void)
if (gSetting_mic_bar && gCurrentFunction == FUNCTION_TRANSMIT) { if (gSetting_mic_bar && gCurrentFunction == FUNCTION_TRANSMIT) {
center_line = CENTER_LINE_AUDIO_BAR; center_line = CENTER_LINE_AUDIO_BAR;
UI_DisplayAudioBar(); UI_DisplayAudioBar();
} } else
else
#endif #endif
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) #if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA)
@@ -1420,14 +1315,11 @@ void UI_DisplayMain(void)
if (rx) { if (rx) {
center_line = CENTER_LINE_RSSI; center_line = CENTER_LINE_RSSI;
DisplayRSSIBar(false); DisplayRSSIBar(false);
} } else
else
#endif #endif
if (rx || gCurrentFunction == FUNCTION_FOREGROUND || gCurrentFunction == FUNCTION_POWER_SAVE) if (rx || gCurrentFunction == FUNCTION_FOREGROUND || gCurrentFunction == FUNCTION_POWER_SAVE) {
{
#if 1 #if 1
if (gSetting_live_DTMF_decoder && gDTMF_RX_live[0] != 0) if (gSetting_live_DTMF_decoder && gDTMF_RX_live[0] != 0) { // show live DTMF decode
{ // show live DTMF decode
const unsigned int len = strlen(gDTMF_RX_live); const unsigned int len = strlen(gDTMF_RX_live);
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
@@ -1442,12 +1334,9 @@ void UI_DisplayMain(void)
sprintf(String, "DTMF %s", gDTMF_RX_live + idx); sprintf(String, "DTMF %s", gDTMF_RX_live + idx);
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
if (isMainOnly()) if (isMainOnly()) {
{
UI_PrintStringSmallNormal(String, 2, 0, 5); UI_PrintStringSmallNormal(String, 2, 0, 5);
} } else {
else
{
UI_PrintStringSmallNormal(String, 2, 0, 3); UI_PrintStringSmallNormal(String, 2, 0, 3);
} }
#else #else
@@ -1498,12 +1387,10 @@ void UI_DisplayMain(void)
//if(gEeprom.MENU_LOCK == false) //if(gEeprom.MENU_LOCK == false)
//{ //{
//#endif //#endif
if (isMainOnly() && !gDTMF_InputMode) if (isMainOnly() && !gDTMF_InputMode) {
{
sprintf(String, "VFO %s", activeTxVFO ? "B" : "A"); sprintf(String, "VFO %s", activeTxVFO ? "B" : "A");
UI_PrintStringSmallBold(String, 92, 0, 6); UI_PrintStringSmallBold(String, 92, 0, 6);
for (uint8_t i = 92; i < 128; i++) for (uint8_t i = 92; i < 128; i++) {
{
gFrameBuffer[6][i] ^= 0x7F; gFrameBuffer[6][i] ^= 0x7F;
} }
} }

450
ui/menu.c
View File

@@ -40,23 +40,21 @@
const t_menu_item MenuList[] = const t_menu_item MenuList[] =
{ {
// text, menu ID // text, menu ID
{"Step", MENU_STEP }, {"STP", MENU_STEP},
{"Power", MENU_TXP }, // was "TXP" {"PWR", MENU_TXP}, // was "TXP"
{"RxDCS", MENU_R_DCS }, // was "R_DCS" {"RDCS", MENU_R_DCS}, // was "R_DCS"
{"RxCTCS", MENU_R_CTCS }, // was "R_CTCS" {"RCTCS", MENU_R_CTCS}, // was "R_CTCS"
{"TxDCS", MENU_T_DCS }, // was "T_DCS" {"TDCS", MENU_T_DCS}, // was "T_DCS"
{"TxCTCS", MENU_T_CTCS }, // was "T_CTCS" {"TCTCS", MENU_T_CTCS}, // was "T_CTCS"
{"TxODir", MENU_SFT_D}, // was "SFT_D" {"TxODir", MENU_SFT_D}, // was "SFT_D"
{"TxOffs", MENU_OFFSET}, // was "OFFSET" {"TxOffs", MENU_OFFSET}, // was "OFFSET"
{"W/N", MENU_W_N}, {"W/N", MENU_W_N},
#ifndef ENABLE_FEAT_F4HWN {"SCR", MENU_SCR}, // was "SCR"
{"Scramb", MENU_SCR }, // was "SCR" {"BusyL", MENU_BCL}, // was "BCL"
#endif {"COMP", MENU_COMPAND},
{"BusyCL", MENU_BCL }, // was "BCL" {"Mod", MENU_AM}, // was "AM"
{"Compnd", MENU_COMPAND },
{"Mode", MENU_AM }, // was "AM"
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
{"TXLock", MENU_TX_LOCK }, {"TXLck", MENU_TX_LOCK},
#endif #endif
{"ScAdd1", MENU_S_ADD1}, {"ScAdd1", MENU_S_ADD1},
{"ScAdd2", MENU_S_ADD2}, {"ScAdd2", MENU_S_ADD2},
@@ -75,11 +73,11 @@ const t_menu_item MenuList[] =
{"NOAA-S", MENU_NOAA_S }, {"NOAA-S", MENU_NOAA_S },
#endif #endif
#endif #endif
{"F1Shrt", MENU_F1SHRT }, {"F1S", MENU_F1SHRT},
{"F1Long", MENU_F1LONG }, {"F1L", MENU_F1LONG},
{"F2Shrt", MENU_F2SHRT }, {"F2S", MENU_F2SHRT},
{"F2Long", MENU_F2LONG }, {"F2L", MENU_F2LONG},
{"M Long", MENU_MLONG }, {"ML", MENU_MLONG},
{"KeyLck", MENU_AUTOLK}, // was "AUTOLk" {"KeyLck", MENU_AUTOLK}, // was "AUTOLk"
{"TxTOut", MENU_TOT}, // was "TOT" {"TxTOut", MENU_TOT}, // was "TOT"
@@ -88,7 +86,8 @@ const t_menu_item MenuList[] =
{"Mic", MENU_MIC}, {"Mic", MENU_MIC},
{"MicBar", MENU_MIC_BAR}, {"MicBar", MENU_MIC_BAR},
{"ChDisp", MENU_MDF}, // was "MDF" {"ChDisp", MENU_MDF}, // was "MDF"
{"POnMsg", MENU_PONMSG }, {"FSKMod", MENU_FSKMOD},
{"FSKSRC", MENU_FSKSRC}, // was "AUTOLk"
{"BLTime", MENU_ABR}, // was "ABR" {"BLTime", MENU_ABR}, // was "ABR"
{"BLMin", MENU_ABR_MIN}, {"BLMin", MENU_ABR_MIN},
{"BLMax", MENU_ABR_MAX}, {"BLMax", MENU_ABR_MAX},
@@ -108,9 +107,9 @@ const t_menu_item MenuList[] =
{"ANI ID", MENU_ANI_ID }, {"ANI ID", MENU_ANI_ID },
#endif #endif
{"UPCode", MENU_UPCODE}, {"UPCode", MENU_UPCODE},
{"DWCode", MENU_DWCODE }, {"DNCode", MENU_DWCODE},
{"PTT ID", MENU_PTT_ID}, {"PTT ID", MENU_PTT_ID},
{"D ST", MENU_D_ST }, {"L DTMF", MENU_D_ST},
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
{"D Resp", MENU_D_RSP }, {"D Resp", MENU_D_RSP },
{"D Hold", MENU_D_HOLD }, {"D Hold", MENU_D_HOLD },
@@ -126,39 +125,36 @@ const t_menu_item MenuList[] =
{"AM Fix", MENU_AM_FIX }, {"AM Fix", MENU_AM_FIX },
#endif #endif
#endif #endif
#ifdef ENABLE_VOX
{"VOX", MENU_VOX}, {"VOX", MENU_VOX},
#ifdef ENABLE_FEAT_F4HWN
{"SysInf", MENU_VOL }, // was "VOL"
#else
{"BatVol", MENU_VOL }, // was "VOL"
#endif #endif
{"RxMode", MENU_TDR}, {"RxMode", MENU_TDR},
{"Sql", MENU_SQL}, {"Sql", MENU_SQL},
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
{"SetPwr", MENU_SET_PWR }, {"SPwr", MENU_SET_PWR},
{"SetPTT", MENU_SET_PTT }, {"SPTT", MENU_SET_PTT},
{"SetTOT", MENU_SET_TOT }, {"STOT", MENU_SET_TOT},
{"SetEOT", MENU_SET_EOT }, {"SEOT", MENU_SET_EOT},
{"SetCtr", MENU_SET_CTR }, {"SCtr", MENU_SET_CTR},
{"SetInv", MENU_SET_INV }, {"SInv", MENU_SET_INV},
{"SetLck", MENU_SET_LCK }, {"SLck", MENU_SET_LCK},
{"SetMet", MENU_SET_MET }, //{"SMet", MENU_SET_MET},
{"SetGUI", MENU_SET_GUI }, //{"SGUI", MENU_SET_GUI},
{"SetTmr", MENU_SET_TMR }, {"STmr", MENU_SET_TMR},
#ifdef ENABLE_FEAT_F4HWN_SLEEP #ifdef ENABLE_FEAT_F4HWN_SLEEP
{"SetOff", MENU_SET_OFF }, {"SOff", MENU_SET_OFF},
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_NARROWER #ifdef ENABLE_FEAT_F4HWN_NARROWER
{"SetNFM", MENU_SET_NFM }, {"SNFM", MENU_SET_NFM},
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
{"SetVol", MENU_SET_VOL }, {"SVol", MENU_SET_VOL},
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
{"SetKey", MENU_SET_KEY }, {"SKey", MENU_SET_KEY },
#endif #endif
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
{"SetNWR", MENU_NOAA_S }, {"SNWR", MENU_NOAA_S },
#endif #endif
#endif #endif
// hidden menu items from here on // hidden menu items from here on
@@ -168,11 +164,9 @@ const t_menu_item MenuList[] =
{"Tx 200", MENU_200TX }, // was "200TX" {"Tx 200", MENU_200TX }, // was "200TX"
{"Tx 350", MENU_350TX }, // was "350TX" {"Tx 350", MENU_350TX }, // was "350TX"
{"Tx 500", MENU_500TX }, // was "500TX" {"Tx 500", MENU_500TX }, // was "500TX"
#endif
{"350 En", MENU_350EN }, // was "350EN" {"350 En", MENU_350EN }, // was "350EN"
#ifndef ENABLE_FEAT_F4HWN
{"ScraEn", MENU_SCREN }, // was "SCREN"
#endif #endif
//{"ScraEn", MENU_SCREN }, // was "SCREN"
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
{"FrCali", MENU_F_CALI}, // reference xtal calibration {"FrCali", MENU_F_CALI}, // reference xtal calibration
#endif #endif
@@ -187,14 +181,14 @@ const uint8_t FIRST_HIDDEN_MENU_ITEM = MENU_F_LOCK;
const char gSubMenu_TXP[][6] = const char gSubMenu_TXP[][6] =
{ {
"USER", "USR",
"LOW 1", "L1",
"LOW 2", "L2",
"LOW 3", "L3",
"LOW 4", "L4",
"LOW 5", "L5",
"MID", "M",
"HIGH" "H"
}; };
const char gSubMenu_SFT_D[][4] = const char gSubMenu_SFT_D[][4] =
@@ -207,7 +201,7 @@ const char gSubMenu_SFT_D[][4] =
const char gSubMenu_W_N[][7] = const char gSubMenu_W_N[][7] =
{ {
"WIDE", "WIDE",
"NARROW" "NARR"
}; };
const char gSubMenu_OFF_ON[][4] = const char gSubMenu_OFF_ON[][4] =
@@ -223,10 +217,10 @@ const char gSubMenu_NA[4] =
const char *const gSubMenu_RXMode[] = const char *const gSubMenu_RXMode[] =
{ {
"MAIN\nONLY", // TX and RX on main only "MAIN", // TX and RX on main only
"DUAL RX\nRESPOND", // Watch both and respond "RESP", // Watch both and respond
"CROSS\nBAND", // TX on main, RX on secondary "XBAND ONLY", // TX on main, RX on secondary
"MAIN TX\nDUAL RX" // always TX on main, but RX on both "DUALMON" // always TX on main, but RX on both
}; };
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -241,7 +235,7 @@ const char* const gSubMenu_RXMode[] =
const char *const gSubMenu_MDF[] = const char *const gSubMenu_MDF[] =
{ {
"FREQ", "FREQ",
"CHANNEL\nNUMBER", "CHNUMB",
"NAME", "NAME",
"NAME\n+\nFREQ" "NAME\n+\nFREQ"
}; };
@@ -268,28 +262,25 @@ const char* const gSubMenu_PTT_ID[] =
{ {
"OFF", "OFF",
"UP CODE", "UP CODE",
"DOWN CODE", "DN CODE",
"UP+DOWN\nCODE", "UP+DN\nCODE",
"APOLLO\nQUINDAR" "APOLLO"
}; };
const char gSubMenu_PONMSG[][8] = const char gSubMenu_FSKMod[][8] =
{ {
#ifdef ENABLE_FEAT_F4HWN "450",
"ALL", "700",
"SOUND", "A1200",
#else "A2400",
"FULL", "2400",
#endif "NOAA"
"MESSAGE",
"VOLTAGE",
"NONE"
}; };
const char gSubMenu_ROGER[][6] = const char gSubMenu_ROGER[][6] =
{ {
"OFF", "OFF",
"ROGER", "RGR",
"MDC" "MDC"
}; };
@@ -301,23 +292,23 @@ const char gSubMenu_RESET[][4] =
const char *const gSubMenu_F_LOCK[] = const char *const gSubMenu_F_LOCK[] =
{ {
"DEFAULT+\n137-174\n400-470", "137-174\n400-470",
"FCC HAM\n144-148\n420-450",
#ifdef ENABLE_FEAT_F4HWN_CA #ifdef ENABLE_FEAT_F4HWN_CA
"FCC HAM\n144-148\n420-450",
"CA HAM\n144-148\n430-450", "CA HAM\n144-148\n430-450",
#endif
"CE HAM\n144-146\n430-440", "CE HAM\n144-146\n430-440",
"GB HAM\n144-148\n430-440", "GB HAM\n144-148\n430-440",
"137-174\n400-430", "137-174\n400-430",
"137-174\n400-438", "137-174\n400-438",
#endif
#ifdef ENABLE_FEAT_F4HWN_PMR #ifdef ENABLE_FEAT_F4HWN_PMR
"PMR 446", "PMR 446",
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS #ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS
"GMRS\nFRS\nMURS", "GMRS\nFRS\nMURS",
#endif #endif
"DISABLE\nALL", "DIS\nALL",
"UNLOCK\nALL", "UNL\nALL",
}; };
const char gSubMenu_RX_TX[][6] = const char gSubMenu_RX_TX[][6] =
@@ -331,41 +322,39 @@ const char gSubMenu_RX_TX[][6] =
const char gSubMenu_BAT_TXT[][8] = const char gSubMenu_BAT_TXT[][8] =
{ {
"NONE", "NONE",
"VOLTAGE", "VLT",
"PERCENT" "PRC"
}; };
const char gSubMenu_BATTYP[][9] = const char gSubMenu_BATTYP[][9] =
{ {
"1600mAh", "16",
"2200mAh", "22",
"3500mAh" "35"
}; };
#ifndef ENABLE_FEAT_F4HWN
const char gSubMenu_SCRAMBLER[][7] = const char gSubMenu_SCRAMBLER[][7] =
{ {
"OFF", "OFF",
"2600Hz", "26K",
"2700Hz", "27K",
"2800Hz", "28K",
"2900Hz", "29K",
"3000Hz", "30K",
"3100Hz", "31K",
"3200Hz", "32K",
"3300Hz", "33K",
"3400Hz", "34K",
"3500Hz" "35K"
}; };
#endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
const char gSubMenu_SET_PWR[][6] = const char gSubMenu_SET_PWR[][6] =
{ {
"< 20m", "<.02",
"125m", ".125",
"250m", ".25",
"500m", ".5",
"1", "1",
"2", "2",
"5" "5"
@@ -373,35 +362,29 @@ const char gSubMenu_SCRAMBLER[][7] =
const char gSubMenu_SET_PTT[][8] = const char gSubMenu_SET_PTT[][8] =
{ {
"CLASSIC", "HOLD",
"ONEPUSH" "TAP"
}; };
const char gSubMenu_SET_TOT[][7] = // Use by SET_EOT too const char gSubMenu_SET_TOT[][7] = // Use by SET_EOT too
{ {
"OFF", "OFF",
"SOUND", "SND",
"VISUAL", "VIS",
"ALL" "ALL"
}; };
const char gSubMenu_SET_LCK[][9] = const char gSubMenu_SET_LCK[][9] =
{ {
"KEYS", "KEY",
"KEYS+PTT" "KEY+PTT"
};
const char gSubMenu_SET_MET[][8] =
{
"TINY",
"CLASSIC"
}; };
#ifdef ENABLE_FEAT_F4HWN_NARROWER #ifdef ENABLE_FEAT_F4HWN_NARROWER
const char gSubMenu_SET_NFM[][9] = const char gSubMenu_SET_NFM[][9] =
{ {
"NARROW", "NRW",
"NARROWER" "NRWER"
}; };
#endif #endif
@@ -421,10 +404,10 @@ const t_sidefunction gSubMenu_SIDEFUNCTIONS[] =
{ {
{"NONE", ACTION_OPT_NONE}, {"NONE", ACTION_OPT_NONE},
#ifdef ENABLE_FLASHLIGHT #ifdef ENABLE_FLASHLIGHT
{"FLASH\nLIGHT", ACTION_OPT_FLASHLIGHT}, {"FLASH", ACTION_OPT_FLASHLIGHT},
#endif #endif
{"POWER", ACTION_OPT_POWER}, {"PWR", ACTION_OPT_POWER},
{"MONITOR", ACTION_OPT_MONITOR}, {"MON", ACTION_OPT_MONITOR},
{"SCAN", ACTION_OPT_SCAN}, {"SCAN", ACTION_OPT_SCAN},
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
{"VOX", ACTION_OPT_VOX}, {"VOX", ACTION_OPT_VOX},
@@ -433,16 +416,16 @@ const t_sidefunction gSubMenu_SIDEFUNCTIONS[] =
{"ALARM", ACTION_OPT_ALARM}, {"ALARM", ACTION_OPT_ALARM},
#endif #endif
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
{"FM RADIO", ACTION_OPT_FM}, {"WFM", ACTION_OPT_FM},
#endif #endif
#ifdef ENABLE_TX1750 #ifdef ENABLE_TX1750
{"1750Hz", ACTION_OPT_1750}, {"1750", ACTION_OPT_1750},
#endif #endif
#ifdef ENABLE_REGA #ifdef ENABLE_REGA
{"REGA\nALARM", ACTION_OPT_REGA_ALARM}, {"REGA\nALARM", ACTION_OPT_REGA_ALARM},
{"REGA\nTEST", ACTION_OPT_REGA_TEST}, {"REGA\nTEST", ACTION_OPT_REGA_TEST},
#endif #endif
{"LOCK\nKEYPAD", ACTION_OPT_KEYLOCK}, {"LOCK\nKEY", ACTION_OPT_KEYLOCK},
{"VFO A\nVFO B", ACTION_OPT_A_B}, {"VFO A\nVFO B", ACTION_OPT_A_B},
{"VFO\nMEM", ACTION_OPT_VFO_MR}, {"VFO\nMEM", ACTION_OPT_VFO_MR},
{"MODE", ACTION_OPT_SWITCH_DEMODUL}, {"MODE", ACTION_OPT_SWITCH_DEMODUL},
@@ -450,10 +433,10 @@ const t_sidefunction gSubMenu_SIDEFUNCTIONS[] =
{"BLMIN\nTMP OFF", ACTION_OPT_BLMIN_TMP_OFF}, //BackLight Minimum Temporay OFF {"BLMIN\nTMP OFF", ACTION_OPT_BLMIN_TMP_OFF}, //BackLight Minimum Temporay OFF
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
{"RX MODE", ACTION_OPT_RXMODE}, {"RX MOD", ACTION_OPT_RXMODE},
{"MAIN ONLY", ACTION_OPT_MAINONLY}, {"MAIN ONLY", ACTION_OPT_MAINONLY},
{"PTT", ACTION_OPT_PTT}, {"PTT", ACTION_OPT_PTT},
{"WIDE\nNARROW", ACTION_OPT_WN}, {"WIDE\nNAR", ACTION_OPT_WN},
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
{"MUTE", ACTION_OPT_MUTE}, {"MUTE", ACTION_OPT_MUTE},
#endif #endif
@@ -468,6 +451,7 @@ const uint8_t gSubMenu_SIDEFUNCTIONS_size = ARRAY_SIZE(gSubMenu_SIDEFUNCTIONS);
bool gIsInSubMenu; bool gIsInSubMenu;
uint8_t gMenuCursor; uint8_t gMenuCursor;
int UI_MENU_GetCurrentMenuId() { int UI_MENU_GetCurrentMenuId() {
if (gMenuCursor < ARRAY_SIZE(MenuList)) if (gMenuCursor < ARRAY_SIZE(MenuList))
return MenuList[gMenuCursor].menu_id; return MenuList[gMenuCursor].menu_id;
@@ -475,8 +459,7 @@ int UI_MENU_GetCurrentMenuId() {
return MenuList[ARRAY_SIZE(MenuList) - 1].menu_id; return MenuList[ARRAY_SIZE(MenuList) - 1].menu_id;
} }
uint8_t UI_MENU_GetMenuIdx(uint8_t id) uint8_t UI_MENU_GetMenuIdx(uint8_t id) {
{
for (uint8_t i = 0; i < ARRAY_SIZE(MenuList); i++) for (uint8_t i = 0; i < ARRAY_SIZE(MenuList); i++)
if (MenuList[i].menu_id == id) if (MenuList[i].menu_id == id)
return i; return i;
@@ -490,8 +473,7 @@ char edit_original[17]; // a copy of the text before editing so that we can e
char edit[17]; char edit[17];
int edit_index; int edit_index;
void UI_DisplayMenu(void) void UI_DisplayMenu(void) {
{
const unsigned int menu_list_width = 6; // max no. of characters on the menu list (left side) const unsigned int menu_list_width = 6; // max no. of characters on the menu list (left side)
const unsigned int menu_item_x1 = (8 * menu_list_width) + 2; const unsigned int menu_item_x1 = (8 * menu_list_width) + 2;
const unsigned int menu_item_x2 = LCD_WIDTH - 1; const unsigned int menu_item_x2 = LCD_WIDTH - 1;
@@ -508,8 +490,7 @@ void UI_DisplayMenu(void)
UI_DrawLineBuffer(gFrameBuffer, 48, 0, 48, 55, 1); // Be ware, status zone = 8 lines, the rest = 56 ->total 64 UI_DrawLineBuffer(gFrameBuffer, 48, 0, 48, 55, 1); // Be ware, status zone = 8 lines, the rest = 56 ->total 64
//UI_DrawLineDottedBuffer(gFrameBuffer, 0, 46, 50, 46, 1); //UI_DrawLineDottedBuffer(gFrameBuffer, 0, 46, 50, 46, 1);
for (uint8_t i = 0; i < 48; i += 2) for (uint8_t i = 0; i < 48; i += 2) {
{
gFrameBuffer[5][i] = 0x40; gFrameBuffer[5][i] = 0x40;
} }
#endif #endif
@@ -547,8 +528,7 @@ void UI_DisplayMenu(void)
i = 1; i = 1;
if (!gIsInSubMenu) { if (!gIsInSubMenu) {
while (i < 2) while (i < 2) { // leading menu items - small text
{ // leading menu items - small text
const int k = menu_index + i - 2; const int k = menu_index + i - 2;
if (k < 0) if (k < 0)
UI_PrintStringSmallNormal(MenuList[gMenuListCount + k].name, 0, 0, i); // wrap-a-round UI_PrintStringSmallNormal(MenuList[gMenuListCount + k].name, 0, 0, i); // wrap-a-round
@@ -558,17 +538,18 @@ void UI_DisplayMenu(void)
} }
// current menu item - keep big n fat // current menu item - keep big n fat
if (menu_index >= 0 && menu_index < (int)gMenuListCount) if (menu_index >= 0 && menu_index < (int) gMenuListCount) {
UI_PrintString(MenuList[menu_index].name, 0, 0, 2, 8); //UI_DrawRectangleBuffer(gFrameBuffer, 0, 37, 16, 45, true);
UI_PrintStringSmallBold(MenuList[menu_index].name, 0, 0, 2);
}
i++; i++;
while (i < 4) while (i < 5) { // trailing menu item - small text
{ // trailing menu item - small text
const int k = menu_index + i - 2; const int k = menu_index + i - 2;
if (k >= 0 && k < (int) gMenuListCount) if (k >= 0 && k < (int) gMenuListCount)
UI_PrintStringSmallNormal(MenuList[k].name, 0, 0, 1 + i); UI_PrintStringSmallNormal(MenuList[k].name, 0, 0, i);
else if (k >= (int) gMenuListCount) else if (k >= (int) gMenuListCount)
UI_PrintStringSmallNormal(MenuList[gMenuListCount - k].name, 0, 0, 1 + i); // wrap-a-round UI_PrintStringSmallNormal(MenuList[gMenuListCount - k].name, 0, 0, i); // wrap-a-round
i++; i++;
} }
@@ -577,9 +558,7 @@ void UI_DisplayMenu(void)
sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount); sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount);
UI_PrintStringSmallNormal(String, 2, 0, 6); UI_PrintStringSmallNormal(String, 2, 0, 6);
#endif #endif
} } else if (menu_index >= 0 && menu_index < (int) gMenuListCount) { // current menu item
else if (menu_index >= 0 && menu_index < (int)gMenuListCount)
{ // current menu item
// strcat(String, ":"); // strcat(String, ":");
UI_PrintString(MenuList[menu_index].name, 0, 0, 0, 8); UI_PrintString(MenuList[menu_index].name, 0, 0, 0, 8);
// UI_PrintStringSmallNormal(String, 0, 0, 0); // UI_PrintStringSmallNormal(String, 0, 0, 0);
@@ -610,14 +589,12 @@ void UI_DisplayMenu(void)
uint8_t gaugeMax = 0; uint8_t gaugeMax = 0;
#endif #endif
switch (UI_MENU_GetCurrentMenuId()) switch (UI_MENU_GetCurrentMenuId()) {
{
case MENU_SQL: case MENU_SQL:
sprintf(String, "%d", gSubMenuSelection); sprintf(String, "%d", gSubMenuSelection);
break; break;
case MENU_MIC: case MENU_MIC: { // display the mic gain in actual dB rather than just an index number
{ // display the mic gain in actual dB rather than just an index number
const uint8_t mic = gMicGain_dB2[gSubMenuSelection]; const uint8_t mic = gMicGain_dB2[gSubMenuSelection];
sprintf(String, "+%u.%01udB", mic / 2, mic % 2); sprintf(String, "+%u.%01udB", mic / 2, mic % 2);
} }
@@ -638,12 +615,9 @@ void UI_DisplayMenu(void)
} }
case MENU_TXP: case MENU_TXP:
if(gSubMenuSelection == 0) if (gSubMenuSelection == 0) {
{
strcpy(String, gSubMenu_TXP[gSubMenuSelection]); strcpy(String, gSubMenu_TXP[gSubMenuSelection]);
} } else {
else
{
sprintf(String, "%s\n%sW", gSubMenu_TXP[gSubMenuSelection], gSubMenu_SET_PWR[gSubMenuSelection - 1]); sprintf(String, "%s\n%sW", gSubMenu_TXP[gSubMenuSelection], gSubMenu_SET_PWR[gSubMenuSelection - 1]);
} }
break; break;
@@ -659,12 +633,12 @@ void UI_DisplayMenu(void)
break; break;
case MENU_R_CTCS: case MENU_R_CTCS:
case MENU_T_CTCS: case MENU_T_CTCS: {
{
if (gSubMenuSelection == 0) if (gSubMenuSelection == 0)
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
else else
sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10); sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10,
CTCSS_Options[gSubMenuSelection - 1] % 10);
break; break;
} }
@@ -673,13 +647,10 @@ void UI_DisplayMenu(void)
break; break;
case MENU_OFFSET: case MENU_OFFSET:
if (!gIsInSubMenu || gInputBoxIndex == 0) if (!gIsInSubMenu || gInputBoxIndex == 0) {
{
sprintf(String, "%3d.%05u", gSubMenuSelection / 100000, abs(gSubMenuSelection) % 100000); sprintf(String, "%3d.%05u", gSubMenuSelection / 100000, abs(gSubMenuSelection) % 100000);
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
} } else {
else
{
const char *ascii = INPUTBOX_GetAscii(); const char *ascii = INPUTBOX_GetAscii();
sprintf(String, "%.3s.%.3s ", ascii, ascii + 3); sprintf(String, "%.3s.%.3s ", ascii, ascii + 3);
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
@@ -694,17 +665,13 @@ void UI_DisplayMenu(void)
strcpy(String, gSubMenu_W_N[gSubMenuSelection]); strcpy(String, gSubMenu_W_N[gSubMenuSelection]);
break; break;
#ifndef ENABLE_FEAT_F4HWN
case MENU_SCR: case MENU_SCR:
strcpy(String, gSubMenu_SCRAMBLER[gSubMenuSelection]); strcpy(String, gSubMenu_SCRAMBLER[gSubMenuSelection]);
#if 1 if (gSubMenuSelection > 0)
if (gSubMenuSelection > 0 && gSetting_ScrambleEnable)
BK4819_EnableScramble(gSubMenuSelection - 1); BK4819_EnableScramble(gSubMenuSelection - 1);
else else
BK4819_DisableScramble(); BK4819_DisableScramble();
#endif
break; break;
#endif
case MENU_VOX: case MENU_VOX:
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
@@ -715,12 +682,9 @@ void UI_DisplayMenu(void)
break; break;
case MENU_ABR: case MENU_ABR:
if(gSubMenuSelection == 0) if (gSubMenuSelection == 0) {
{
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
} } else if (gSubMenuSelection < 61) {
else if(gSubMenuSelection < 61)
{
sprintf(String, "%02dm:%02ds", (((gSubMenuSelection) * 5) / 60), (((gSubMenuSelection) * 5) % 60)); sprintf(String, "%02dm:%02ds", (((gSubMenuSelection) * 5) / 60), (((gSubMenuSelection) * 5) % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 60, gSubMenuSelection); //ST7565_Gauge(4, 1, 60, gSubMenuSelection);
@@ -728,9 +692,7 @@ void UI_DisplayMenu(void)
gaugeMin = 1; gaugeMin = 1;
gaugeMax = 60; gaugeMax = 60;
#endif #endif
} } else {
else
{
strcpy(String, "ON"); strcpy(String, "ON");
} }
@@ -756,8 +718,7 @@ void UI_DisplayMenu(void)
case MENU_AUTOLK: case MENU_AUTOLK:
if (gSubMenuSelection == 0) if (gSubMenuSelection == 0)
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
else else {
{
sprintf(String, "%02dm:%02ds", ((gSubMenuSelection * 15) / 60), ((gSubMenuSelection * 15) % 60)); sprintf(String, "%02dm:%02ds", ((gSubMenuSelection * 15) / 60), ((gSubMenuSelection * 15) % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 40, gSubMenuSelection); //ST7565_Gauge(4, 1, 40, gSubMenuSelection);
@@ -768,6 +729,10 @@ void UI_DisplayMenu(void)
} }
break; break;
case MENU_FSKSRC:
sprintf(String, "%d", gSubMenuSelection);
break;
case MENU_COMPAND: case MENU_COMPAND:
case MENU_ABR_ON_TX_RX: case MENU_ABR_ON_TX_RX:
strcpy(String, gSubMenu_RX_TX[gSubMenuSelection]); strcpy(String, gSubMenu_RX_TX[gSubMenuSelection]);
@@ -798,9 +763,7 @@ void UI_DisplayMenu(void)
case MENU_500TX: case MENU_500TX:
#endif #endif
case MENU_350EN: case MENU_350EN:
#ifndef ENABLE_FEAT_F4HWN //case MENU_SCREN:
case MENU_SCREN:
#endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_TMR: case MENU_SET_TMR:
#endif #endif
@@ -809,15 +772,13 @@ void UI_DisplayMenu(void)
case MENU_MEM_CH: case MENU_MEM_CH:
case MENU_1_CALL: case MENU_1_CALL:
case MENU_DEL_CH: case MENU_DEL_CH: {
{
const bool valid = RADIO_CheckValidChannel(gSubMenuSelection, false, 0); const bool valid = RADIO_CheckValidChannel(gSubMenuSelection, false, 0);
UI_GenerateChannelStringEx(String, valid, gSubMenuSelection); UI_GenerateChannelStringEx(String, valid, gSubMenuSelection);
UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8);
if (valid && !gAskForConfirmation) if (valid && !gAskForConfirmation) { // show the frequency so that the user knows the channels frequency
{ // show the frequency so that the user knows the channels frequency
const uint32_t frequency = SETTINGS_FetchChannelFrequency(gSubMenuSelection); const uint32_t frequency = SETTINGS_FetchChannelFrequency(gSubMenuSelection);
sprintf(String, "%u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%u.%05u", frequency / 100000, frequency % 100000);
UI_PrintString(String, menu_item_x1, menu_item_x2, 4, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 4, 8);
@@ -829,28 +790,23 @@ void UI_DisplayMenu(void)
break; break;
} }
case MENU_MEM_NAME: case MENU_MEM_NAME: {
{
const bool valid = RADIO_CheckValidChannel(gSubMenuSelection, false, 0); const bool valid = RADIO_CheckValidChannel(gSubMenuSelection, false, 0);
UI_GenerateChannelStringEx(String, valid, gSubMenuSelection); UI_GenerateChannelStringEx(String, valid, gSubMenuSelection);
UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8);
if (valid) if (valid) {
{
const uint32_t frequency = SETTINGS_FetchChannelFrequency(gSubMenuSelection); const uint32_t frequency = SETTINGS_FetchChannelFrequency(gSubMenuSelection);
//if (!gIsInSubMenu || edit_index < 0) //if (!gIsInSubMenu || edit_index < 0)
if (!gIsInSubMenu) if (!gIsInSubMenu)
edit_index = -1; edit_index = -1;
if (edit_index < 0) if (edit_index < 0) { // show the channel name
{ // show the channel name
SETTINGS_FetchChannelName(String, gSubMenuSelection); SETTINGS_FetchChannelName(String, gSubMenuSelection);
char *pPrintStr = String[0] ? String : "--"; char *pPrintStr = String[0] ? String : "--";
UI_PrintString(pPrintStr, menu_item_x1, menu_item_x2, 2, 8); UI_PrintString(pPrintStr, menu_item_x1, menu_item_x2, 2, 8);
} } else { // show the channel name being edited
else
{ // show the channel name being edited
//UI_PrintString(edit, menu_item_x1, 0, 2, 8); //UI_PrintString(edit, menu_item_x1, 0, 2, 8);
UI_PrintString(edit, menu_item_x1, menu_item_x2, 2, 8); UI_PrintString(edit, menu_item_x1, menu_item_x2, 2, 8);
if (edit_index < 10) if (edit_index < 10)
@@ -858,8 +814,7 @@ void UI_DisplayMenu(void)
UI_PrintString("^", menu_item_x1 - 1 + (8 * edit_index), 0, 4, 8); // show the cursor UI_PrintString("^", menu_item_x1 - 1 + (8 * edit_index), 0, 4, 8); // show the cursor
} }
if (!gAskForConfirmation) if (!gAskForConfirmation) { // show the frequency so that the user knows the channels frequency
{ // show the frequency so that the user knows the channels frequency
sprintf(String, "%u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%u.%05u", frequency / 100000, frequency % 100000);
UI_PrintString(String, menu_item_x1, menu_item_x2, 4 + (gIsInSubMenu && edit_index >= 0), 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 4 + (gIsInSubMenu && edit_index >= 0), 8);
} }
@@ -894,23 +849,20 @@ void UI_DisplayMenu(void)
#endif #endif
case MENU_SC_REV: case MENU_SC_REV:
if(gSubMenuSelection == 0) if (gSubMenuSelection == 0) {
{
strcpy(String, "STOP"); strcpy(String, "STOP");
} } else if (gSubMenuSelection < 81) {
else if(gSubMenuSelection < 81) sprintf(String, "CARRIER\n%02ds:%03dms", ((gSubMenuSelection * 250) / 1000),
{ ((gSubMenuSelection * 250) % 1000));
sprintf(String, "CARRIER\n%02ds:%03dms", ((gSubMenuSelection * 250) / 1000), ((gSubMenuSelection * 250) % 1000));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(5, 1, 80, gSubMenuSelection); //ST7565_Gauge(5, 1, 80, gSubMenuSelection);
gaugeLine = 5; gaugeLine = 5;
gaugeMin = 1; gaugeMin = 1;
gaugeMax = 80; gaugeMax = 80;
#endif #endif
} } else {
else sprintf(String, "TIMEOUT\n%02dm:%02ds", (((gSubMenuSelection - 80) * 5) / 60),
{ (((gSubMenuSelection - 80) * 5) % 60));
sprintf(String, "TIMEOUT\n%02dm:%02ds", (((gSubMenuSelection - 80) * 5) / 60), (((gSubMenuSelection - 80) * 5) % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(5, 80, 104, gSubMenuSelection); //ST7565_Gauge(5, 80, 104, gSubMenuSelection);
gaugeLine = 5; gaugeLine = 5;
@@ -989,45 +941,24 @@ void UI_DisplayMenu(void)
break; break;
#endif #endif
case MENU_PONMSG: case MENU_FSKMOD:
strcpy(String, gSubMenu_PONMSG[gSubMenuSelection]); strcpy(String, gSubMenu_FSKMod[gSubMenuSelection]);
break; break;
case MENU_ROGER: case MENU_ROGER:
strcpy(String, gSubMenu_ROGER[gSubMenuSelection]); strcpy(String, gSubMenu_ROGER[gSubMenuSelection]);
break; break;
case MENU_VOL:
#ifdef ENABLE_FEAT_F4HWN
sprintf(String, "%s\n%s",
AUTHOR_STRING_2,
VERSION_STRING_2
);
#else
sprintf(String, "%u.%02uV\n%u%%",
gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
BATTERY_VoltsToPercent(gBatteryVoltageAverage));
#endif
break;
case MENU_RESET: case MENU_RESET:
strcpy(String, gSubMenu_RESET[gSubMenuSelection]); strcpy(String, gSubMenu_RESET[gSubMenuSelection]);
break; break;
case MENU_F_LOCK: case MENU_F_LOCK:
#ifdef ENABLE_FEAT_F4HWN
if(!gIsInSubMenu && gUnlockAllTxConfCnt>0 && gUnlockAllTxConfCnt<3)
#else
if(!gIsInSubMenu && gUnlockAllTxConfCnt>0 && gUnlockAllTxConfCnt<10)
#endif
strcpy(String, "READ\nMANUAL");
else
strcpy(String, gSubMenu_F_LOCK[gSubMenuSelection]); strcpy(String, gSubMenu_F_LOCK[gSubMenuSelection]);
break; break;
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
case MENU_F_CALI: case MENU_F_CALI: {
{
const uint32_t value = 22656 + gSubMenuSelection; const uint32_t value = 22656 + gSubMenuSelection;
const uint32_t xtal_Hz = (0x4f0000u + value) * 5; const uint32_t xtal_Hz = (0x4f0000u + value) * 5;
@@ -1040,8 +971,7 @@ void UI_DisplayMenu(void)
break; break;
#endif #endif
case MENU_BATCAL: case MENU_BATCAL: {
{
const uint16_t vol = (uint32_t) gBatteryVoltageAverage * gBatteryCalibration[3] / gSubMenuSelection; const uint16_t vol = (uint32_t) gBatteryVoltageAverage * gBatteryCalibration[3] / gSubMenuSelection;
sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, gSubMenuSelection); sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, gSubMenuSelection);
break; break;
@@ -1061,12 +991,9 @@ void UI_DisplayMenu(void)
#ifdef ENABLE_FEAT_F4HWN_SLEEP #ifdef ENABLE_FEAT_F4HWN_SLEEP
case MENU_SET_OFF: case MENU_SET_OFF:
if(gSubMenuSelection == 0) if (gSubMenuSelection == 0) {
{
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
} } else if (gSubMenuSelection < 121) {
else if(gSubMenuSelection < 121)
{
sprintf(String, "%dh:%02dm", (gSubMenuSelection / 60), (gSubMenuSelection % 60)); sprintf(String, "%dh:%02dm", (gSubMenuSelection / 60), (gSubMenuSelection % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 120, gSubMenuSelection); //ST7565_Gauge(4, 1, 120, gSubMenuSelection);
@@ -1112,12 +1039,9 @@ void UI_DisplayMenu(void)
break; break;
case MENU_TX_LOCK: case MENU_TX_LOCK:
if(TX_freq_check(gEeprom.VfoInfo[gEeprom.TX_VFO].pRX->Frequency) == 0) if (TX_freq_check(gEeprom.VfoInfo[gEeprom.TX_VFO].pRX->Frequency) == 0) {
{
strcpy(String, "Inside\nF Lock\nPlan"); strcpy(String, "Inside\nF Lock\nPlan");
} } else {
else
{
strcpy(String, gSubMenu_OFF_ON[gSubMenuSelection]); strcpy(String, gSubMenu_OFF_ON[gSubMenuSelection]);
} }
break; break;
@@ -1126,8 +1050,8 @@ void UI_DisplayMenu(void)
strcpy(String, gSubMenu_SET_LCK[gSubMenuSelection]); strcpy(String, gSubMenu_SET_LCK[gSubMenuSelection]);
break; break;
case MENU_SET_MET: //case MENU_SET_MET:
case MENU_SET_GUI: //case MENU_SET_GUI:
strcpy(String, gSubMenu_SET_MET[gSubMenuSelection]); // Same as SET_MET strcpy(String, gSubMenu_SET_MET[gSubMenuSelection]); // Same as SET_MET
break; break;
@@ -1139,12 +1063,9 @@ void UI_DisplayMenu(void)
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
case MENU_SET_VOL: case MENU_SET_VOL:
if(gSubMenuSelection == 0) if (gSubMenuSelection == 0) {
{
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
} } else if (gSubMenuSelection < 64) {
else if(gSubMenuSelection < 64)
{
sprintf(String, "%02u", gSubMenuSelection); sprintf(String, "%02u", gSubMenuSelection);
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 63, gSubMenuSelection); //ST7565_Gauge(4, 1, 63, gSubMenuSelection);
@@ -1172,34 +1093,28 @@ void UI_DisplayMenu(void)
} }
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
if(gaugeLine != 0) if (gaugeLine != 0) {
{
ST7565_Gauge(gaugeLine, gaugeMin, gaugeMax, gSubMenuSelection); ST7565_Gauge(gaugeLine, gaugeMin, gaugeMax, gSubMenuSelection);
} }
#endif #endif
if (!already_printed) if (!already_printed) { // we now do multi-line text in a single string
{ // we now do multi-line text in a single string
unsigned int y; unsigned int y;
unsigned int lines = 1; unsigned int lines = 1;
unsigned int len = strlen(String); unsigned int len = strlen(String);
bool small = false; bool small = false;
if (len > 0) if (len > 0) {
{
// count number of lines // count number of lines
for (i = 0; i < len; i++) for (i = 0; i < len; i++) {
{ if (String[i] == '\n' && i < (len - 1)) { // found new line char
if (String[i] == '\n' && i < (len - 1))
{ // found new line char
lines++; lines++;
String[i] = 0; // null terminate the line String[i] = 0; // null terminate the line
} }
} }
if (lines > 3) if (lines > 3) { // use small text
{ // use small text
small = true; small = true;
if (lines > 7) if (lines > 7)
lines = 7; lines = 7;
@@ -1215,32 +1130,8 @@ void UI_DisplayMenu(void)
y = (small ? 3 : 2) - (lines / 2); y = (small ? 3 : 2) - (lines / 2);
// only for SysInf
if(UI_MENU_GetCurrentMenuId() == MENU_VOL)
{
sprintf(edit, "%u.%02uV %u%%",
gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
BATTERY_VoltsToPercent(gBatteryVoltageAverage)
);
UI_PrintStringSmallNormal(edit, 54, 127, 1);
#if defined(ENABLE_SPECTRUM) && defined(ENABLE_FMRADIO)
UI_PrintStringSmallNormal("Basic", 54, 127, 6);
#elif defined(ENABLE_SPECTRUM)
UI_PrintStringSmallNormal("Bandscope", 54, 127, 6);
#elif defined(ENABLE_FMRADIO)
UI_PrintStringSmallNormal("Broadcast", 54, 127, 6);
#elif defined(ENABLE_FEAT_F4HWN_RESCUE_OPS)
UI_PrintStringSmallNormal("RescueOps", 54, 127, 6);
#endif
y = 2;
}
// draw the text lines // draw the text lines
for (i = 0; i < len && lines > 0; lines--) for (i = 0; i < len && lines > 0; lines--) {
{
if (small) if (small)
UI_PrintStringSmallNormal(String + i, menu_item_x1, menu_item_x2, y); UI_PrintStringSmallNormal(String + i, menu_item_x1, menu_item_x2, y);
else else
@@ -1259,8 +1150,8 @@ void UI_DisplayMenu(void)
} }
} }
if (UI_MENU_GetCurrentMenuId() == MENU_SLIST1 || UI_MENU_GetCurrentMenuId() == MENU_SLIST2 || UI_MENU_GetCurrentMenuId() == MENU_SLIST3) if (UI_MENU_GetCurrentMenuId() == MENU_SLIST1 || UI_MENU_GetCurrentMenuId() == MENU_SLIST2 ||
{ UI_MENU_GetCurrentMenuId() == MENU_SLIST3) {
i = UI_MENU_GetCurrentMenuId() - MENU_SLIST1; i = UI_MENU_GetCurrentMenuId() - MENU_SLIST1;
char *pPrintStr = String; char *pPrintStr = String;
@@ -1337,8 +1228,7 @@ void UI_DisplayMenu(void)
if ((UI_MENU_GetCurrentMenuId() == MENU_RESET || if ((UI_MENU_GetCurrentMenuId() == MENU_RESET ||
UI_MENU_GetCurrentMenuId() == MENU_MEM_CH || UI_MENU_GetCurrentMenuId() == MENU_MEM_CH ||
UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME || UI_MENU_GetCurrentMenuId() == MENU_MEM_NAME ||
UI_MENU_GetCurrentMenuId() == MENU_DEL_CH) && gAskForConfirmation) UI_MENU_GetCurrentMenuId() == MENU_DEL_CH) && gAskForConfirmation) { // display confirmation
{ // display confirmation
char *pPrintStr = (gAskForConfirmation == 1) ? "SURE?" : "WAIT!"; char *pPrintStr = (gAskForConfirmation == 1) ? "SURE?" : "WAIT!";
UI_PrintString(pPrintStr, menu_item_x1, menu_item_x2, 5, 8); UI_PrintString(pPrintStr, menu_item_x1, menu_item_x2, 5, 8);
} }

View File

@@ -28,8 +28,7 @@ typedef struct {
uint8_t menu_id; uint8_t menu_id;
} t_menu_item; } t_menu_item;
enum enum {
{
MENU_SQL = 0, MENU_SQL = 0,
MENU_STEP, MENU_STEP,
MENU_TXP, MENU_TXP,
@@ -41,9 +40,7 @@ enum
MENU_OFFSET, MENU_OFFSET,
MENU_TOT, MENU_TOT,
MENU_W_N, MENU_W_N,
#ifndef ENABLE_FEAT_F4HWN
MENU_SCR, MENU_SCR,
#endif
MENU_BCL, MENU_BCL,
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
MENU_TX_LOCK, MENU_TX_LOCK,
@@ -98,9 +95,9 @@ enum
MENU_D_LIST, MENU_D_LIST,
#endif #endif
MENU_D_LIVE_DEC, MENU_D_LIVE_DEC,
MENU_PONMSG, MENU_FSKSRC,
MENU_FSKMOD,
MENU_ROGER, MENU_ROGER,
MENU_VOL,
MENU_BAT_TXT, MENU_BAT_TXT,
MENU_AM, MENU_AM,
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
@@ -117,11 +114,9 @@ enum
MENU_200TX, MENU_200TX,
MENU_350TX, MENU_350TX,
MENU_500TX, MENU_500TX,
#endif
MENU_350EN,
#ifndef ENABLE_FEAT_F4HWN
MENU_SCREN, MENU_SCREN,
#endif #endif
MENU_350EN,
#ifdef ENABLE_F_CAL_MENU #ifdef ENABLE_F_CAL_MENU
MENU_F_CALI, // reference xtal calibration MENU_F_CALI, // reference xtal calibration
#endif #endif
@@ -198,11 +193,7 @@ extern const char gSubMenu_D_RSP[4][11];
#endif #endif
extern const char *const gSubMenu_PTT_ID[5]; extern const char *const gSubMenu_PTT_ID[5];
#ifdef ENABLE_FEAT_F4HWN extern const char gSubMenu_FSKMod[6][8];
extern const char gSubMenu_PONMSG[5][8];
#else
extern const char gSubMenu_PONMSG[4][8];
#endif
extern const char gSubMenu_ROGER[3][6]; extern const char gSubMenu_ROGER[3][6];
extern const char gSubMenu_RESET[2][4]; extern const char gSubMenu_RESET[2][4];
extern const char *const gSubMenu_F_LOCK[F_LOCK_LEN]; extern const char *const gSubMenu_F_LOCK[F_LOCK_LEN];
@@ -210,11 +201,12 @@ extern const char gSubMenu_RX_TX[4][6];
extern const char gSubMenu_BAT_TXT[3][8]; extern const char gSubMenu_BAT_TXT[3][8];
extern const char gSubMenu_BATTYP[3][9]; extern const char gSubMenu_BATTYP[3][9];
#ifndef ENABLE_FEAT_F4HWN
extern const char gSubMenu_SCRAMBLER[11][7]; extern const char gSubMenu_SCRAMBLER[11][7];
#endif
typedef struct {char* name; uint8_t id;} t_sidefunction; typedef struct {
char *name;
uint8_t id;
} t_sidefunction;
extern const uint8_t gSubMenu_SIDEFUNCTIONS_size; extern const uint8_t gSubMenu_SIDEFUNCTIONS_size;
extern const t_sidefunction gSubMenu_SIDEFUNCTIONS[]; extern const t_sidefunction gSubMenu_SIDEFUNCTIONS[];
@@ -229,7 +221,9 @@ extern char edit[17];
extern int edit_index; extern int edit_index;
void UI_DisplayMenu(void); void UI_DisplayMenu(void);
int UI_MENU_GetCurrentMenuId(); int UI_MENU_GetCurrentMenuId();
uint8_t UI_MENU_GetMenuIdx(uint8_t id); uint8_t UI_MENU_GetMenuIdx(uint8_t id);
#endif #endif

View File

@@ -84,13 +84,6 @@ void UI_DisplayStatus()
unsigned int x1 = x; unsigned int x1 = x;
#ifdef ENABLE_DTMF_CALLING
if (gSetting_KILLED) {
memset(line + x, 0xFF, 10);
x1 = x + 10;
}
else
#endif
{ // SCAN indicator { // SCAN indicator
if (gScanStateDir != SCAN_OFF || SCANNER_IsScanning()) { if (gScanStateDir != SCAN_OFF || SCANNER_IsScanning()) {
if (IS_MR_CHANNEL(gNextMrChannel) && !SCANNER_IsScanning()) { // channel mode if (IS_MR_CHANNEL(gNextMrChannel) && !SCANNER_IsScanning()) { // channel mode

View File

@@ -28,8 +28,7 @@
#include "version.h" #include "version.h"
#include "bitmaps.h" #include "bitmaps.h"
void UI_DisplayReleaseKeys(void) void UI_DisplayReleaseKeys(void) {
{
memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gStatusLine, 0, sizeof(gStatusLine));
#if defined(ENABLE_FEAT_F4HWN_CTR) || defined(ENABLE_FEAT_F4HWN_INV) #if defined(ENABLE_FEAT_F4HWN_CTR) || defined(ENABLE_FEAT_F4HWN_INV)
ST7565_ContrastAndInv(); ST7565_ContrastAndInv();
@@ -43,12 +42,7 @@ void UI_DisplayReleaseKeys(void)
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
} }
void UI_DisplayWelcome(void) void UI_DisplayWelcome(void) {
{
char WelcomeString0[16];
char WelcomeString1[16];
char WelcomeString2[16];
char WelcomeString3[20];
memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gStatusLine, 0, sizeof(gStatusLine));
@@ -56,147 +50,16 @@ void UI_DisplayWelcome(void)
ST7565_ContrastAndInv(); ST7565_ContrastAndInv();
#endif #endif
UI_DisplayClear(); UI_DisplayClear();
#ifdef ENABLE_FEAT_F4HWN
ST7565_BlitStatusLine(); ST7565_BlitStatusLine();
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_NONE || gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_SOUND) {
ST7565_FillScreen(0x00);
#else
if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_NONE || gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_FULL_SCREEN) {
ST7565_FillScreen(0xFF);
#endif
} else {
memset(WelcomeString0, 0, sizeof(WelcomeString0));
memset(WelcomeString1, 0, sizeof(WelcomeString1));
EEPROM_ReadBuffer(0x0EB0, WelcomeString0, 16);
EEPROM_ReadBuffer(0x0EC0, WelcomeString1, 16);
sprintf(WelcomeString2, "%u.%02uV %u%%",
gBatteryVoltageAverage / 100,
gBatteryVoltageAverage % 100,
BATTERY_VoltsToPercent(gBatteryVoltageAverage));
if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_VOLTAGE)
{
strcpy(WelcomeString0, "VOLTAGE");
strcpy(WelcomeString1, WelcomeString2);
}
else if(gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_ALL)
{
if(strlen(WelcomeString0) == 0 && strlen(WelcomeString1) == 0)
{
strcpy(WelcomeString0, "WELCOME");
strcpy(WelcomeString1, WelcomeString2);
}
else if(strlen(WelcomeString0) == 0 || strlen(WelcomeString1) == 0)
{
if(strlen(WelcomeString0) == 0)
{
strcpy(WelcomeString0, WelcomeString1);
}
strcpy(WelcomeString1, WelcomeString2);
}
}
else if(gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_MESSAGE)
{
if(strlen(WelcomeString0) == 0)
{
strcpy(WelcomeString0, "WELCOME");
}
if(strlen(WelcomeString1) == 0)
{
strcpy(WelcomeString1, "BIENVENUE");
}
}
UI_PrintString(WelcomeString0, 0, 127, 0, 10);
UI_PrintString(WelcomeString1, 0, 127, 2, 10);
#ifdef ENABLE_FEAT_F4HWN
UI_PrintStringSmallNormal(Version, 0, 128, 4);
UI_DrawLineBuffer(gFrameBuffer, 0, 31, 127, 31, 1); // Be ware, status zone = 8 lines, the rest = 56 ->total 64 UI_DrawLineBuffer(gFrameBuffer, 0, 31, 127, 31, 1); // Be ware, status zone = 8 lines, the rest = 56 ->total 64
for (uint8_t i = 18; i < 110; i++) for (uint8_t i = 18; i < 110; i++) {
{
gFrameBuffer[4][i] ^= 0xFF; gFrameBuffer[4][i] ^= 0xFF;
} }
sprintf(WelcomeString3, "%s Edition", Edition);
UI_PrintStringSmallNormal(WelcomeString3, 0, 127, 6);
/*
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
#if ENABLE_FEAT_F4HWN_RESCUE_OPS > 1
UI_PrintStringSmallNormal(Edition, 18, 0, 6);
if(gEeprom.MENU_LOCK == true) {
memcpy(gFrameBuffer[6] + 103, BITMAP_Ready, sizeof(BITMAP_Ready));
}
else
{
memcpy(gFrameBuffer[6] + 103, BITMAP_NotReady, sizeof(BITMAP_NotReady));
}
#else
UI_PrintStringSmallNormal(Edition, 18, 0, 5);
memcpy(gFrameBuffer[5] + 103, BITMAP_Ready, sizeof(BITMAP_Ready));
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
UI_PrintStringSmallNormal("RescueOps", 18, 0, 6);
if(gEeprom.MENU_LOCK == true) {
memcpy(gFrameBuffer[6] + 103, BITMAP_Ready, sizeof(BITMAP_Ready));
}
else
{
memcpy(gFrameBuffer[6] + 103, BITMAP_NotReady, sizeof(BITMAP_NotReady));
}
#endif
#endif
#else
UI_PrintStringSmallNormal(Edition, 18, 0, 6);
memcpy(gFrameBuffer[6] + 103, BITMAP_Ready, sizeof(BITMAP_Ready));
#endif
*/
/*
#ifdef ENABLE_SPECTRUM
#ifdef ENABLE_FMRADIO
UI_PrintStringSmallNormal(Based, 0, 127, 5);
UI_PrintStringSmallNormal(Credits, 0, 127, 6);
#else
UI_PrintStringSmallNormal("Bandscope ", 0, 127, 5);
memcpy(gFrameBuffer[5] + 95, BITMAP_Ready, sizeof(BITMAP_Ready));
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
UI_PrintStringSmallNormal("RescueOps ", 0, 127, 6);
if(gEeprom.MENU_LOCK == true) {
memcpy(gFrameBuffer[6] + 95, BITMAP_Ready, sizeof(BITMAP_Ready));
}
#else
UI_PrintStringSmallNormal("Broadcast ", 0, 127, 6);
#endif
#endif
#else
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
UI_PrintStringSmallNormal("RescueOps ", 0, 127, 5);
if(gEeprom.MENU_LOCK == true) {
memcpy(gFrameBuffer[5] + 95, BITMAP_Ready, sizeof(BITMAP_Ready));
}
#else
UI_PrintStringSmallNormal("Bandscope ", 0, 127, 5);
#endif
UI_PrintStringSmallNormal("Broadcast ", 0, 127, 6);
memcpy(gFrameBuffer[6] + 95, BITMAP_Ready, sizeof(BITMAP_Ready));
#endif
*/
#else
UI_PrintStringSmallNormal(Version, 0, 127, 6);
#endif
//ST7565_BlitStatusLine(); // blank status line : I think it's useless //ST7565_BlitStatusLine(); // blank status line : I think it's useless
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
} }
}

View File

@@ -7,7 +7,6 @@
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
const char Version[] = AUTHOR_STRING_2 " " VERSION_STRING_2; const char Version[] = AUTHOR_STRING_2 " " VERSION_STRING_2;
const char Edition[] = EDITION_STRING;
#else #else
const char Version[] = AUTHOR_STRING VER; const char Version[] = AUTHOR_STRING VER;
#endif #endif

View File

@@ -21,7 +21,3 @@ extern const char Version[];
extern const char UART_Version[]; extern const char UART_Version[];
#endif #endif
#ifdef ENABLE_FEAT_F4HWN
extern const char Edition[];
#endif