v1.4.0: LVGL UI, async radio TX, live TCP management, input fixes

- Migrate all screens to LVGL v8.4 widget system
- Non-blocking radio TX (async endPacket via LoRaInterface)
- Live TCP server switching with transient node cleanup
- Fix UI freeze during radio transmit
- Trackball long-press delete, deferred click with debounce
- Pin microReticulum to 392363c, fix list_directory API
- Fix CI build: portable include path, remove hardcoded local path
This commit is contained in:
DeFiDude
2026-03-07 13:00:59 -07:00
parent 9b7980665c
commit 07025bfa23
51 changed files with 3895 additions and 309 deletions
+73
View File
@@ -0,0 +1,73 @@
#include "LvInput.h"
#include "hal/Keyboard.h"
#include "hal/Trackball.h"
#include "hal/TouchInput.h"
namespace LvInput {
static Keyboard* s_kb = nullptr;
static Trackball* s_tb = nullptr;
static TouchInput* s_touch = nullptr;
static lv_group_t* s_group = nullptr;
// Keypad indev state
static uint32_t s_lastKey = 0;
static lv_indev_state_t s_keyState = LV_INDEV_STATE_RELEASED;
static bool s_keyReady = false;
// Touch disabled — GT911 coordinate mapping needs calibration
static void keypad_read_cb(lv_indev_drv_t* drv, lv_indev_data_t* data) {
if (s_keyReady) {
data->key = s_lastKey;
data->state = s_keyState;
s_keyReady = false;
} else {
data->state = LV_INDEV_STATE_RELEASED;
}
}
void init(Keyboard* kb, Trackball* tb, TouchInput* touch) {
s_kb = kb;
s_tb = tb;
s_touch = touch;
// Create input group
s_group = lv_group_create();
lv_group_set_default(s_group);
// Register keypad indev
static lv_indev_drv_t keyDrv;
lv_indev_drv_init(&keyDrv);
keyDrv.type = LV_INDEV_TYPE_KEYPAD;
keyDrv.read_cb = keypad_read_cb;
lv_indev_t* keyIndev = lv_indev_drv_register(&keyDrv);
lv_indev_set_group(keyIndev, s_group);
// Touch indev disabled — GT911 coordinate mapping needs calibration
Serial.println("[LVGL] Input drivers registered (touch disabled)");
}
void feedKey(const KeyEvent& evt) {
uint32_t key = 0;
if (evt.enter) key = LV_KEY_ENTER;
else if (evt.up) key = LV_KEY_UP;
else if (evt.down) key = LV_KEY_DOWN;
else if (evt.left) key = LV_KEY_LEFT;
else if (evt.right) key = LV_KEY_RIGHT;
else if (evt.del) key = LV_KEY_BACKSPACE;
else if (evt.tab) key = LV_KEY_NEXT;
else if (evt.character == 0x1B) key = LV_KEY_ESC;
else return; // Don't feed printable chars — screens handle them via handleKey()
s_lastKey = key;
s_keyState = LV_INDEV_STATE_PRESSED;
s_keyReady = true;
}
lv_group_t* group() {
return s_group;
}
} // namespace LvInput