diff --git a/openrtx/include/interfaces/keyboard.h b/openrtx/include/interfaces/keyboard.h index a65864b9..ce3fd8cd 100644 --- a/openrtx/include/interfaces/keyboard.h +++ b/openrtx/include/interfaces/keyboard.h @@ -57,8 +57,8 @@ enum key KEY_F6 = (1 << 24), /* Function button (device specific) */ KEY_F7 = (1 << 25), /* Function button (device specific) */ KEY_F8 = (1 << 26), /* Function button (device specific) */ - KEY_F9 = (1 << 27), /* Function button (device specific) */ - KEY_F10 = (1 << 28), /* Function button (device specific) */ + KNOB_LEFT = (1 << 27), /* Knob rotated counter clockwise */ + KNOB_RIGHT = (1 << 28), /* Knob rotated clockwise */ }; /** @@ -87,9 +87,9 @@ typedef union { struct { - uint32_t _padding : 2, - long_press : 1, - keys : 29; + uint32_t long_press : 1, + keys : 29, + _padding : 2; }; uint32_t value; diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index 7316672f..fe354a0f 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -645,11 +645,11 @@ void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx) { } #else // Use left and right buttons or relative position knob // NOTE: Use up and down for UV380 which has not yet a functional knob - if(msg.keys & KEY_LEFT || msg.keys & KEY_DOWN) { + if(msg.keys & KEY_LEFT || msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) { state.sqlLevel = (state.sqlLevel == 0) ? 0 : state.sqlLevel - 1; *sync_rtx = true; } - else if(msg.keys & KEY_RIGHT || msg.keys & KEY_UP) { + else if(msg.keys & KEY_RIGHT || msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) { state.sqlLevel = (state.sqlLevel == 15) ? 15 : state.sqlLevel + 1; *sync_rtx = true; } @@ -738,7 +738,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) { // VFO screen case MAIN_VFO: - if(msg.keys & KEY_UP) + if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) { // Increment TX and RX frequency of 12.5KHz if(_ui_freq_check_limits(state.channel.rx_frequency + 12500) && @@ -749,7 +749,7 @@ void ui_updateFSM(event_t event, bool *sync_rtx) *sync_rtx = true; } } - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) { // Decrement TX and RX frequency of 12.5KHz if(_ui_freq_check_limits(state.channel.rx_frequency - 12500) && @@ -838,20 +838,20 @@ void ui_updateFSM(event_t event, bool *sync_rtx) // Switch to VFO screen state.ui_screen = MAIN_VFO; } - else if(msg.keys & KEY_UP) + else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) { _ui_fsm_loadChannel(state.channel_index + 1, sync_rtx); } - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) { _ui_fsm_loadChannel(state.channel_index - 1, sync_rtx); } break; // Top menu screen case MENU_TOP: - if(msg.keys & KEY_UP) + if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) _ui_menuUp(menu_num); - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) _ui_menuDown(menu_num); else if(msg.keys & KEY_ENTER) { @@ -893,10 +893,10 @@ void ui_updateFSM(event_t event, bool *sync_rtx) case MENU_CHANNEL: // Contacts menu screen case MENU_CONTACTS: - if(msg.keys & KEY_UP) + if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) // Using 1 as parameter disables menu wrap around _ui_menuUp(1); - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) { if(state.ui_screen == MENU_ZONE) { @@ -969,9 +969,9 @@ void ui_updateFSM(event_t event, bool *sync_rtx) #endif // Settings menu screen case MENU_SETTINGS: - if(msg.keys & KEY_UP) + if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) _ui_menuUp(settings_num); - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) _ui_menuDown(settings_num); else if(msg.keys & KEY_ENTER) { @@ -1002,9 +1002,9 @@ void ui_updateFSM(event_t event, bool *sync_rtx) break; // Info menu screen case MENU_INFO: - if(msg.keys & KEY_UP) + if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) _ui_menuUp(info_num); - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) _ui_menuDown(info_num); else if(msg.keys & KEY_ESC) _ui_menuBack(MENU_TOP); @@ -1057,7 +1057,8 @@ void ui_updateFSM(event_t event, bool *sync_rtx) break; #endif case SETTINGS_DISPLAY: - if(msg.keys & KEY_LEFT || (msg.keys & KEY_DOWN && ui_state.edit_mode)) + if(msg.keys & KEY_LEFT || (ui_state.edit_mode && + (msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT))) { switch(ui_state.menu_selected) { @@ -1073,7 +1074,8 @@ void ui_updateFSM(event_t event, bool *sync_rtx) state.ui_screen = SETTINGS_DISPLAY; } } - else if(msg.keys & KEY_RIGHT || (msg.keys & KEY_UP && ui_state.edit_mode)) + else if(msg.keys & KEY_RIGHT || (ui_state.edit_mode && + (msg.keys & KEY_UP || msg.keys & KNOB_RIGHT))) { switch(ui_state.menu_selected) { @@ -1089,9 +1091,9 @@ void ui_updateFSM(event_t event, bool *sync_rtx) state.ui_screen = SETTINGS_DISPLAY; } } - else if(msg.keys & KEY_UP) + else if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) _ui_menuUp(display_num); - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) _ui_menuDown(display_num); else if(msg.keys & KEY_ENTER) ui_state.edit_mode = !ui_state.edit_mode; @@ -1101,7 +1103,9 @@ void ui_updateFSM(event_t event, bool *sync_rtx) #ifdef HAS_GPS case SETTINGS_GPS: if(msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT || - ((msg.keys & KEY_UP || msg.keys & KEY_DOWN) && ui_state.edit_mode)) + (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) { @@ -1122,18 +1126,20 @@ void ui_updateFSM(event_t event, bool *sync_rtx) state.settings.gps_set_time = !state.settings.gps_set_time; break; case G_TIMEZONE: - if(msg.keys & KEY_LEFT || msg.keys & KEY_UP) + if(msg.keys & KEY_LEFT || msg.keys & KEY_UP || + msg.keys & KNOB_LEFT) state.settings.utc_timezone -= 1; - else if(msg.keys & KEY_RIGHT || msg.keys & KEY_DOWN) + else if(msg.keys & KEY_RIGHT || msg.keys & KEY_DOWN || + msg.keys & KNOB_RIGHT) state.settings.utc_timezone += 1; break; default: state.ui_screen = SETTINGS_GPS; } } - else if(msg.keys & KEY_UP) + else if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) _ui_menuUp(settings_gps_num); - else if(msg.keys & KEY_DOWN) + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) _ui_menuDown(settings_gps_num); else if(msg.keys & KEY_ENTER) ui_state.edit_mode = !ui_state.edit_mode; diff --git a/platform/drivers/keyboard/keyboard_MD3x.c b/platform/drivers/keyboard/keyboard_MD3x.c index 3ca52263..c8539c28 100644 --- a/platform/drivers/keyboard/keyboard_MD3x.c +++ b/platform/drivers/keyboard/keyboard_MD3x.c @@ -52,22 +52,22 @@ keyboard_t kbd_getKeys() { keyboard_t keys = 0; - /* Use absolute position knob to emulate left and right buttons */ + /* Read channel knob to send KNOB_LEFT and KNOB_RIGHT events */ static int8_t old_pos = 0; int8_t new_pos = platform_getChSelector(); if (old_pos != new_pos) { - int8_t diff = old_pos - new_pos; + int8_t diff = new_pos - old_pos; if (diff < 0) - keys |= KEY_LEFT; + keys |= KNOB_LEFT; else if (diff > 0) - keys |= KEY_RIGHT; + keys |= KNOB_RIGHT; else { if (old_pos < 0) - keys |= KEY_LEFT; + keys |= KNOB_LEFT; else - keys |= KEY_RIGHT; + keys |= KNOB_RIGHT; } old_pos = new_pos; } diff --git a/platform/drivers/keyboard/keyboard_linux.c b/platform/drivers/keyboard/keyboard_linux.c index e2e9e214..c1789f72 100644 --- a/platform/drivers/keyboard/keyboard_linux.c +++ b/platform/drivers/keyboard/keyboard_linux.c @@ -52,6 +52,8 @@ keyboard_t kbd_getKeys() { if (state[SDL_SCANCODE_NONUSHASH]) keys |= KEY_HASH; if (state[SDL_SCANCODE_MINUS]) keys |= KEY_F1; if (state[SDL_SCANCODE_M]) keys |= KEY_MONI; + if (state[SDL_SCANCODE_PAGEUP]) keys |= KNOB_LEFT; + if (state[SDL_SCANCODE_PAGEDOWN]) keys |= KNOB_RIGHT; return keys; }