Add radio settings for frequency offset, direction, and frequency step.
Add customizable frequency_step in radio state. Offset is not yet selectable from Settings->Radio but only with keypad from the VFO screen.
This commit is contained in:
parent
7612044d91
commit
5d3c6c825d
|
|
@ -61,9 +61,13 @@ typedef struct
|
||||||
bool restore_eflash;
|
bool restore_eflash;
|
||||||
char m17_dest[10];
|
char m17_dest[10];
|
||||||
bool txDisable;
|
bool txDisable;
|
||||||
|
uint8_t step_index;
|
||||||
}
|
}
|
||||||
state_t;
|
state_t;
|
||||||
|
|
||||||
|
extern uint32_t freq_steps[];
|
||||||
|
extern size_t n_freq_steps;
|
||||||
|
|
||||||
enum TunerMode
|
enum TunerMode
|
||||||
{
|
{
|
||||||
VFO = 0,
|
VFO = 0,
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,7 @@ const stringsTable_t englishStrings =
|
||||||
.pressAnyButton = "press any button.",
|
.pressAnyButton = "press any button.",
|
||||||
.accessibility = "Accessibility",
|
.accessibility = "Accessibility",
|
||||||
.usedHeap = "Used heap",
|
.usedHeap = "Used heap",
|
||||||
.broadcast = "ALL"
|
.broadcast = "ALL",
|
||||||
|
.radioSettings = "Radio Settings"
|
||||||
};
|
};
|
||||||
#endif // ENGLISHSTRINGS_H
|
#endif // ENGLISHSTRINGS_H
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ enum uiScreen
|
||||||
SETTINGS_TIMEDATE_SET,
|
SETTINGS_TIMEDATE_SET,
|
||||||
SETTINGS_DISPLAY,
|
SETTINGS_DISPLAY,
|
||||||
SETTINGS_GPS,
|
SETTINGS_GPS,
|
||||||
|
SETTINGS_RADIO,
|
||||||
SETTINGS_M17,
|
SETTINGS_M17,
|
||||||
SETTINGS_VOICE,
|
SETTINGS_VOICE,
|
||||||
SETTINGS_RESET2DEFAULTS,
|
SETTINGS_RESET2DEFAULTS,
|
||||||
|
|
@ -96,6 +97,7 @@ enum settingsItems
|
||||||
#ifdef GPS_PRESENT
|
#ifdef GPS_PRESENT
|
||||||
S_GPS,
|
S_GPS,
|
||||||
#endif
|
#endif
|
||||||
|
S_RADIO,
|
||||||
S_M17,
|
S_M17,
|
||||||
S_VOICE,
|
S_VOICE,
|
||||||
S_RESET2DEFAULTS,
|
S_RESET2DEFAULTS,
|
||||||
|
|
@ -133,6 +135,13 @@ enum settingsVoicePromptItems
|
||||||
VP_PHONETIC,
|
VP_PHONETIC,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum settingsRadioItems
|
||||||
|
{
|
||||||
|
R_OFFSET,
|
||||||
|
R_DIRECTION,
|
||||||
|
R_STEP,
|
||||||
|
};
|
||||||
|
|
||||||
enum settingsM17Items
|
enum settingsM17Items
|
||||||
{
|
{
|
||||||
M17_CALLSIGN = 0,
|
M17_CALLSIGN = 0,
|
||||||
|
|
@ -229,6 +238,7 @@ extern const char *menu_items[];
|
||||||
extern const char *settings_items[];
|
extern const char *settings_items[];
|
||||||
extern const char *display_items[];
|
extern const char *display_items[];
|
||||||
extern const char *settings_gps_items[];
|
extern const char *settings_gps_items[];
|
||||||
|
extern const char *settings_radio_items[];
|
||||||
extern const char *settings_m17_items[];
|
extern const char *settings_m17_items[];
|
||||||
extern const char * settings_voice_items[];
|
extern const char * settings_voice_items[];
|
||||||
|
|
||||||
|
|
@ -239,6 +249,7 @@ extern const uint8_t menu_num;
|
||||||
extern const uint8_t settings_num;
|
extern const uint8_t settings_num;
|
||||||
extern const uint8_t display_num;
|
extern const uint8_t display_num;
|
||||||
extern const uint8_t settings_gps_num;
|
extern const uint8_t settings_gps_num;
|
||||||
|
extern const uint8_t settings_radio_num;
|
||||||
extern const uint8_t settings_m17_num;
|
extern const uint8_t settings_m17_num;
|
||||||
extern const uint8_t settings_voice_num;
|
extern const uint8_t settings_voice_num;
|
||||||
extern const uint8_t backup_restore_num;
|
extern const uint8_t backup_restore_num;
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,7 @@ typedef struct
|
||||||
const char* accessibility;
|
const char* accessibility;
|
||||||
const char* usedHeap;
|
const char* usedHeap;
|
||||||
const char* broadcast;
|
const char* broadcast;
|
||||||
|
const char* radioSettings;
|
||||||
}
|
}
|
||||||
stringsTable_t;
|
stringsTable_t;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,10 @@ state_t state;
|
||||||
pthread_mutex_t state_mutex;
|
pthread_mutex_t state_mutex;
|
||||||
long long int lastUpdate = 0;
|
long long int lastUpdate = 0;
|
||||||
|
|
||||||
|
// Commonly used frequency steps, expressed in Hz
|
||||||
|
uint32_t freq_steps[] = { 1000, 5000, 6250, 10000, 12500, 15000, 20000, 25000, 50000, 100000 };
|
||||||
|
size_t n_freq_steps = sizeof(freq_steps) / sizeof(freq_steps[0]);
|
||||||
|
|
||||||
void state_init()
|
void state_init()
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&state_mutex, NULL);
|
pthread_mutex_init(&state_mutex, NULL);
|
||||||
|
|
@ -72,6 +76,7 @@ void state_init()
|
||||||
state.rtxStatus = RTX_OFF;
|
state.rtxStatus = RTX_OFF;
|
||||||
state.emergency = false;
|
state.emergency = false;
|
||||||
state.txDisable = false;
|
state.txDisable = false;
|
||||||
|
state.step_index = 4; // Default frequency step 12.5kHz
|
||||||
|
|
||||||
// Force brightness field to be in range 0 - 100
|
// Force brightness field to be in range 0 - 100
|
||||||
if(state.settings.brightness > 100)
|
if(state.settings.brightness > 100)
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,7 @@ extern void _ui_drawSettingsDisplay(ui_state_t* ui_state);
|
||||||
extern void _ui_drawSettingsM17(ui_state_t* ui_state);
|
extern void _ui_drawSettingsM17(ui_state_t* ui_state);
|
||||||
extern void _ui_drawSettingsVoicePrompts(ui_state_t* ui_state);
|
extern void _ui_drawSettingsVoicePrompts(ui_state_t* ui_state);
|
||||||
extern void _ui_drawSettingsReset2Defaults(ui_state_t* ui_state);
|
extern void _ui_drawSettingsReset2Defaults(ui_state_t* ui_state);
|
||||||
|
extern void _ui_drawSettingsRadio(ui_state_t* ui_state);
|
||||||
extern bool _ui_drawMacroMenu(ui_state_t* ui_state);
|
extern bool _ui_drawMacroMenu(ui_state_t* ui_state);
|
||||||
extern void _ui_reset_menu_anouncement_tracking();
|
extern void _ui_reset_menu_anouncement_tracking();
|
||||||
|
|
||||||
|
|
@ -138,6 +139,7 @@ const char *settings_items[] =
|
||||||
#ifdef GPS_PRESENT
|
#ifdef GPS_PRESENT
|
||||||
"GPS",
|
"GPS",
|
||||||
#endif
|
#endif
|
||||||
|
"Radio",
|
||||||
"M17",
|
"M17",
|
||||||
"Accessibility",
|
"Accessibility",
|
||||||
"Default Settings"
|
"Default Settings"
|
||||||
|
|
@ -163,6 +165,13 @@ const char *settings_gps_items[] =
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char *settings_radio_items[] =
|
||||||
|
{
|
||||||
|
"Offset",
|
||||||
|
"Direction",
|
||||||
|
"Step",
|
||||||
|
};
|
||||||
|
|
||||||
const char * settings_m17_items[] =
|
const char * settings_m17_items[] =
|
||||||
{
|
{
|
||||||
"Callsign",
|
"Callsign",
|
||||||
|
|
@ -246,6 +255,7 @@ const uint8_t display_num = sizeof(display_items)/sizeof(display_items[0]);
|
||||||
#ifdef GPS_PRESENT
|
#ifdef GPS_PRESENT
|
||||||
const uint8_t settings_gps_num = sizeof(settings_gps_items)/sizeof(settings_gps_items[0]);
|
const uint8_t settings_gps_num = sizeof(settings_gps_items)/sizeof(settings_gps_items[0]);
|
||||||
#endif
|
#endif
|
||||||
|
const uint8_t settings_radio_num = sizeof(settings_radio_items)/sizeof(settings_radio_items[0]);
|
||||||
const uint8_t settings_m17_num = sizeof(settings_m17_items)/sizeof(settings_m17_items[0]);
|
const uint8_t settings_m17_num = sizeof(settings_m17_items)/sizeof(settings_m17_items[0]);
|
||||||
const uint8_t settings_voice_num = sizeof(settings_voice_items)/sizeof(settings_voice_items[0]);
|
const uint8_t settings_voice_num = sizeof(settings_voice_items)/sizeof(settings_voice_items[0]);
|
||||||
const uint8_t backup_restore_num = sizeof(backup_restore_items)/sizeof(backup_restore_items[0]);
|
const uint8_t backup_restore_num = sizeof(backup_restore_items)/sizeof(backup_restore_items[0]);
|
||||||
|
|
@ -1429,11 +1439,11 @@ void ui_updateFSM(bool *sync_rtx)
|
||||||
else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT)
|
else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT)
|
||||||
{
|
{
|
||||||
// Increment TX and RX frequency of 12.5KHz
|
// Increment TX and RX frequency of 12.5KHz
|
||||||
if(_ui_freq_check_limits(state.channel.rx_frequency + 12500) &&
|
if(_ui_freq_check_limits(state.channel.rx_frequency + freq_steps[state.step_index]) &&
|
||||||
_ui_freq_check_limits(state.channel.tx_frequency + 12500))
|
_ui_freq_check_limits(state.channel.tx_frequency + freq_steps[state.step_index]))
|
||||||
{
|
{
|
||||||
state.channel.rx_frequency += 12500;
|
state.channel.rx_frequency += freq_steps[state.step_index];
|
||||||
state.channel.tx_frequency += 12500;
|
state.channel.tx_frequency += freq_steps[state.step_index];
|
||||||
*sync_rtx = true;
|
*sync_rtx = true;
|
||||||
vp_announceFrequencies(state.channel.rx_frequency,
|
vp_announceFrequencies(state.channel.rx_frequency,
|
||||||
state.channel.tx_frequency,
|
state.channel.tx_frequency,
|
||||||
|
|
@ -1443,11 +1453,11 @@ void ui_updateFSM(bool *sync_rtx)
|
||||||
else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT)
|
else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT)
|
||||||
{
|
{
|
||||||
// Decrement TX and RX frequency of 12.5KHz
|
// Decrement TX and RX frequency of 12.5KHz
|
||||||
if(_ui_freq_check_limits(state.channel.rx_frequency - 12500) &&
|
if(_ui_freq_check_limits(state.channel.rx_frequency - freq_steps[state.step_index]) &&
|
||||||
_ui_freq_check_limits(state.channel.tx_frequency - 12500))
|
_ui_freq_check_limits(state.channel.tx_frequency - freq_steps[state.step_index]))
|
||||||
{
|
{
|
||||||
state.channel.rx_frequency -= 12500;
|
state.channel.rx_frequency -= freq_steps[state.step_index];
|
||||||
state.channel.tx_frequency -= 12500;
|
state.channel.tx_frequency -= freq_steps[state.step_index];
|
||||||
*sync_rtx = true;
|
*sync_rtx = true;
|
||||||
vp_announceFrequencies(state.channel.rx_frequency,
|
vp_announceFrequencies(state.channel.rx_frequency,
|
||||||
state.channel.tx_frequency,
|
state.channel.tx_frequency,
|
||||||
|
|
@ -1803,6 +1813,9 @@ void ui_updateFSM(bool *sync_rtx)
|
||||||
state.ui_screen = SETTINGS_GPS;
|
state.ui_screen = SETTINGS_GPS;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
case S_RADIO:
|
||||||
|
state.ui_screen = SETTINGS_RADIO;
|
||||||
|
break;
|
||||||
case S_M17:
|
case S_M17:
|
||||||
state.ui_screen = SETTINGS_M17;
|
state.ui_screen = SETTINGS_M17;
|
||||||
break;
|
break;
|
||||||
|
|
@ -2023,6 +2036,42 @@ void ui_updateFSM(bool *sync_rtx)
|
||||||
_ui_menuBack(MENU_SETTINGS);
|
_ui_menuBack(MENU_SETTINGS);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
// Radio Settings
|
||||||
|
case SETTINGS_RADIO:
|
||||||
|
if(msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT ||
|
||||||
|
(ui_state.edit_mode &&
|
||||||
|
(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT ||
|
||||||
|
msg.keys & KEY_UP || msg.keys & KNOB_RIGHT)))
|
||||||
|
{
|
||||||
|
switch(ui_state.menu_selected)
|
||||||
|
{
|
||||||
|
case R_OFFSET:
|
||||||
|
break;
|
||||||
|
case R_DIRECTION:
|
||||||
|
// Invert frequency offset direction
|
||||||
|
if (state.channel.tx_frequency >= state.channel.rx_frequency)
|
||||||
|
state.channel.tx_frequency -= 2 * ((int32_t)state.channel.tx_frequency - (int32_t)state.channel.rx_frequency);
|
||||||
|
else // Switch to positive offset
|
||||||
|
state.channel.tx_frequency -= 2 * ((int32_t)state.channel.tx_frequency - (int32_t)state.channel.rx_frequency);
|
||||||
|
break;
|
||||||
|
case R_STEP:
|
||||||
|
// Cycle over the available frequency steps
|
||||||
|
state.step_index++;
|
||||||
|
state.step_index %= n_freq_steps;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
state.ui_screen = SETTINGS_GPS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT)
|
||||||
|
_ui_menuUp(settings_radio_num);
|
||||||
|
else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT)
|
||||||
|
_ui_menuDown(settings_radio_num);
|
||||||
|
else if(msg.keys & KEY_ENTER)
|
||||||
|
ui_state.edit_mode = !ui_state.edit_mode;
|
||||||
|
else if(msg.keys & KEY_ESC)
|
||||||
|
_ui_menuBack(MENU_SETTINGS);
|
||||||
|
break;
|
||||||
// M17 Settings
|
// M17 Settings
|
||||||
case SETTINGS_M17:
|
case SETTINGS_M17:
|
||||||
if(ui_state.edit_mode)
|
if(ui_state.edit_mode)
|
||||||
|
|
@ -2344,6 +2393,10 @@ bool ui_updateGUI()
|
||||||
case SETTINGS_RESET2DEFAULTS:
|
case SETTINGS_RESET2DEFAULTS:
|
||||||
_ui_drawSettingsReset2Defaults(&ui_state);
|
_ui_drawSettingsReset2Defaults(&ui_state);
|
||||||
break;
|
break;
|
||||||
|
// Screen to set frequency offset and step
|
||||||
|
case SETTINGS_RADIO:
|
||||||
|
_ui_drawSettingsRadio(&ui_state);
|
||||||
|
break;
|
||||||
// Low battery screen
|
// Low battery screen
|
||||||
case LOW_BAT:
|
case LOW_BAT:
|
||||||
_ui_drawLowBatteryScreen();
|
_ui_drawLowBatteryScreen();
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <utils.h>
|
#include <utils.h>
|
||||||
#include <ui/ui_default.h>
|
#include <ui/ui_default.h>
|
||||||
#include <interfaces/nvmem.h>
|
#include <interfaces/nvmem.h>
|
||||||
|
|
@ -336,6 +337,44 @@ int _ui_getSettingsGPSValueName(char *buf, uint8_t max_len, uint8_t index)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int _ui_getRadioEntryName(char *buf, uint8_t max_len, uint8_t index)
|
||||||
|
{
|
||||||
|
if(index >= settings_radio_num) return -1;
|
||||||
|
snprintf(buf, max_len, "%s", settings_radio_items[index]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _ui_getRadioValueName(char *buf, uint8_t max_len, uint8_t index)
|
||||||
|
{
|
||||||
|
if(index >= settings_radio_num)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int32_t offset = 0;
|
||||||
|
switch(index)
|
||||||
|
{
|
||||||
|
case R_OFFSET:
|
||||||
|
offset = abs((int32_t)last_state.channel.tx_frequency -
|
||||||
|
(int32_t)last_state.channel.rx_frequency);
|
||||||
|
snprintf(buf, max_len, "%gMHz", (float) offset / 1000000.0f);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_DIRECTION:
|
||||||
|
buf[0] = (last_state.channel.tx_frequency >= last_state.channel.rx_frequency) ? '+' : '-';
|
||||||
|
buf[1] = '\0';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_STEP:
|
||||||
|
// Print in kHz if it is smaller than 1MHz
|
||||||
|
if (freq_steps[last_state.step_index] < 1000000)
|
||||||
|
snprintf(buf, max_len, "%gkHz", (float) freq_steps[last_state.step_index] / 1000.0f);
|
||||||
|
else
|
||||||
|
snprintf(buf, max_len, "%gMHz", (float) freq_steps[last_state.step_index] / 1000000.0f);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int _ui_getM17EntryName(char *buf, uint8_t max_len, uint8_t index)
|
int _ui_getM17EntryName(char *buf, uint8_t max_len, uint8_t index)
|
||||||
{
|
{
|
||||||
if(index >= settings_m17_num) return -1;
|
if(index >= settings_m17_num) return -1;
|
||||||
|
|
@ -896,6 +935,17 @@ void _ui_drawSettingsReset2Defaults(ui_state_t* ui_state)
|
||||||
drawcnt++;
|
drawcnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _ui_drawSettingsRadio(ui_state_t* ui_state)
|
||||||
|
{
|
||||||
|
gfx_clearScreen();
|
||||||
|
// Print "Radio Settings" on top bar
|
||||||
|
gfx_print(layout.top_pos, layout.top_font, TEXT_ALIGN_CENTER,
|
||||||
|
color_white, currentLanguage->radioSettings);
|
||||||
|
// Print radio settings entries
|
||||||
|
_ui_drawMenuListValue(ui_state, ui_state->menu_selected, _ui_getRadioEntryName,
|
||||||
|
_ui_getRadioValueName);
|
||||||
|
}
|
||||||
|
|
||||||
void _ui_drawMacroTop()
|
void _ui_drawMacroTop()
|
||||||
{
|
{
|
||||||
gfx_print(layout.top_pos, layout.top_font, TEXT_ALIGN_CENTER,
|
gfx_print(layout.top_pos, layout.top_font, TEXT_ALIGN_CENTER,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue