Add destination callsign input for M17, Add -/ to keypad input

This commit is contained in:
Federico Amedeo Izzo 2021-10-09 18:35:42 +02:00 committed by silseva
parent 70b37b7f81
commit 1e19574fd6
5 changed files with 166 additions and 41 deletions

View File

@ -73,9 +73,9 @@ static const uint16_t kbd_long_interval = TICK_FREQ * 0.7;
/**
* Mask for the numeric keys in a key map
* Numeric keys: bit0->bit9 = 0x3FF
* Numeric keys: bit0->bit11 = 0xFFF
*/
static const uint32_t kbd_num_mask = 0x3FF;
static const uint32_t kbd_num_mask = 0xFFF;
/**
* Structure that represents a keyboard event payload

View File

@ -66,6 +66,7 @@ gps_t;
typedef struct
{
char callsign[10];
char dst_addr[10];
}
m17_t;

View File

@ -106,7 +106,7 @@ void *ui_task(void *arg)
// Copy new M17 source and destination addresses
strncpy(rtx_cfg.source_address, state.m17_data.callsign, 10);
strncpy(rtx_cfg.destination_address, "", 10);
strncpy(rtx_cfg.destination_address, state.m17_data.dst_addr, 10);
rtx_configure(&rtx_cfg);
sync_rtx = false;

View File

@ -183,7 +183,7 @@ const char *symbols_ITU_T_E161[] =
"pqrs7PQRS",
"tuv8TUV",
"wxyz9WXYZ",
"*",
"-/*",
"#"
};
@ -199,7 +199,7 @@ const char *symbols_ITU_T_E161_callsign[] =
"PQRS7",
"TUV8",
"WXYZ9",
"",
"-/",
""
};
@ -973,6 +973,11 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
// Switch to VFO screen
state.ui_screen = MAIN_VFO;
}
else if(msg.keys & KEY_F1)
{
// Switch to Digital Mode MEM screen
state.ui_screen = MODE_MEM;
}
else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT)
{
_ui_fsm_loadChannel(state.channel_index + 1, sync_rtx);
@ -984,6 +989,30 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
break;
// Digital Mode VFO screen
case MODE_VFO:
if(state.channel.mode == M17)
{
// Dst ID input
if(ui_state.edit_mode)
{
if(msg.keys & KEY_ENTER)
{
_ui_textInputConfirm(ui_state.new_callsign);
// Save selected dst ID and disable input mode
strncpy(state.m17_data.dst_addr, ui_state.new_callsign, 10);
ui_state.edit_mode = false;
*sync_rtx = true;
}
else if(msg.keys & KEY_ESC)
// Discard selected dst ID and disable input mode
ui_state.edit_mode = false;
else if(msg.keys & KEY_UP || msg.keys & KEY_DOWN ||
msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT)
_ui_textInputDel(ui_state.new_callsign);
else if(input_isNumberPressed(msg))
_ui_textInputKeypad(ui_state.new_callsign, 9, msg, true);
}
else
{
if(msg.keys & KEY_ENTER)
{
// Save current main state
@ -1001,9 +1030,64 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
// Switch to Main VFO screen
state.ui_screen = MAIN_VFO;
}
else if(input_isNumberPressed(msg))
{
// Enable dst ID input
ui_state.edit_mode = true;
// Reset text input variables
_ui_textInputReset(ui_state.new_callsign);
// Type first character
_ui_textInputKeypad(ui_state.new_callsign, 9, msg, true);
}
}
}
else
{
if(msg.keys & KEY_ENTER)
{
// Save current main state
ui_state.last_main_state = state.ui_screen;
// Open Menu
state.ui_screen = MENU_TOP;
}
else if(msg.keys & KEY_ESC)
{
// Switch to VFO screen
state.ui_screen = MAIN_VFO;
}
else if(msg.keys & KEY_F1)
{
// Switch to Main VFO screen
state.ui_screen = MAIN_VFO;
}
}
break;
// Digital Mode MEM screen
case MODE_MEM:
if(state.channel.mode == M17)
{
// Dst ID input
if(ui_state.edit_mode)
{
if(msg.keys & KEY_ENTER)
{
_ui_textInputConfirm(ui_state.new_callsign);
// Save selected dst ID and disable input mode
strncpy(state.m17_data.dst_addr, ui_state.new_callsign, 10);
ui_state.edit_mode = false;
*sync_rtx = true;
}
else if(msg.keys & KEY_ESC)
// Discard selected dst ID and disable input mode
ui_state.edit_mode = false;
else if(msg.keys & KEY_UP || msg.keys & KEY_DOWN ||
msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT)
_ui_textInputDel(ui_state.new_callsign);
else if(input_isNumberPressed(msg))
_ui_textInputKeypad(ui_state.new_callsign, 9, msg, true);
}
else
{
if(msg.keys & KEY_ENTER)
{
// Save current main state
@ -1021,6 +1105,37 @@ void ui_updateFSM(event_t event, bool *sync_rtx)
// Switch to Main MEM screen
state.ui_screen = MAIN_MEM;
}
else if(input_isNumberPressed(msg))
{
// Enable dst ID input
ui_state.edit_mode = true;
// Reset text input variables
_ui_textInputReset(ui_state.new_callsign);
// Type first character
_ui_textInputKeypad(ui_state.new_callsign, 9, msg, true);
}
}
}
else
{
if(msg.keys & KEY_ENTER)
{
// Save current main state
ui_state.last_main_state = state.ui_screen;
// Open Menu
state.ui_screen = MENU_TOP;
}
else if(msg.keys & KEY_ESC)
{
// Switch to MEM screen
state.ui_screen = MAIN_MEM;
}
else if(msg.keys & KEY_F1)
{
// Switch to Main MEM screen
state.ui_screen = MAIN_MEM;
}
}
break;
// Top menu screen
case MENU_TOP:
@ -1387,11 +1502,11 @@ void ui_updateGUI()
break;
// Digital Mode VFO screen
case MODE_VFO:
_ui_drawModeVFO();
_ui_drawModeVFO(&ui_state);
break;
// Digital Mode MEM screen
case MODE_MEM:
_ui_drawModeMEM();
_ui_drawModeMEM(&ui_state);
break;
// Top menu screen
case MENU_TOP:

View File

@ -47,7 +47,7 @@ void _ui_drawMEMChannel()
last_state.channel_index, last_state.channel.name);
}
void _ui_drawModeDetails()
void _ui_drawModeDetails(ui_state_t* ui_state)
{
char bw_str[8] = { 0 };
char encdec_str[9] = { 0 };
@ -103,27 +103,36 @@ void _ui_drawModeDetails()
layout.horizontal_pad, layout.mode_font_small,
TEXT_ALIGN_LEFT, color_white, "Src ID: %s", cfg.source_address);
// Print M17 Destination ID on line 3 of 3
if(ui_state->edit_mode)
{
gfx_printLine(3, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h,
layout.horizontal_pad, layout.mode_font_small,
TEXT_ALIGN_LEFT, color_white, "Dst ID: %s_", ui_state->new_callsign);
}
else
{
gfx_printLine(3, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h,
layout.horizontal_pad, layout.mode_font_small,
TEXT_ALIGN_LEFT, color_white, "Dst ID: %s", cfg.destination_address);
}
break;
}
}
void _ui_drawModeVFO()
void _ui_drawModeVFO(ui_state_t* ui_state)
{
gfx_clearScreen();
_ui_drawMainTop();
_ui_drawModeVFOFreq();
_ui_drawModeDetails();
_ui_drawModeDetails(ui_state);
_ui_drawMainBottom();
}
void _ui_drawModeMEM()
void _ui_drawModeMEM(ui_state_t* ui_state)
{
gfx_clearScreen();
_ui_drawMainTop();
_ui_drawMEMChannel();
_ui_drawModeDetails();
_ui_drawModeDetails(ui_state);
_ui_drawMainBottom();
}