fix: FTP passive mode, battery UI position, SD path traversal

- Add ftpSrv.setLocalIp() for correct PASV response IP (fixes transfers)
- Move battery indicator to WiFi SSID line, right-aligned
- Fix battery label tilt: fixed width + LV_TEXT_ALIGN_RIGHT
- Fix calcDirSize: use f.path() for full path in recursive walk
This commit is contained in:
Lago
2026-04-03 21:30:05 +02:00
parent a328f5ae97
commit 5290f8b4f0
2 changed files with 38 additions and 29 deletions
+7 -3
View File
@@ -108,9 +108,10 @@ static uint64_t calcDirSize(fs::FS &fs, const char *dirname) {
File f;
while ((f = root.openNextFile())) {
if (f.isDirectory()) {
String path = f.name();
/* On ESP32 Arduino 3.x, f.path() returns the full path */
String fullPath = String(f.path());
f.close();
total += calcDirSize(fs, path.c_str());
total += calcDirSize(fs, fullPath.c_str());
} else {
total += f.size();
f.close();
@@ -442,8 +443,11 @@ static void initFtp() {
Serial.println("[FTP] Starting FTP server (user: kode, port: 21)...");
ftpSrv.setCallback(ftpCallback);
ftpSrv.setTransferCallback(ftpTransferCallback);
/* Set local IP so PASV mode sends the correct address to clients */
ftpSrv.setLocalIp(WiFi.localIP());
ftpSrv.begin("kode", "kode");
Serial.println("[FTP] FTP server ready");
Serial.printf("[FTP] FTP server ready (PASV IP: %s, data port: 50009)\n",
WiFi.localIP().toString().c_str());
ui_set_ftp("Idle");
}
+31 -26
View File
@@ -80,32 +80,6 @@ void ui_init()
LV_ALIGN_TOP_MID, 0, 16, "FTP Explorer");
lv_obj_set_style_text_letter_space(lbl_title, 2, 0);
/* ── battery indicator (top-right) ─────────────────────────── */
/* battery outline (22x12 rounded rect) */
obj_batt_icon = lv_obj_create(scr);
lv_obj_set_size(obj_batt_icon, 30, 14);
lv_obj_set_style_radius(obj_batt_icon, 3, 0);
lv_obj_set_style_bg_opa(obj_batt_icon, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_color(obj_batt_icon, lv_color_hex(CLR_GRAY), 0);
lv_obj_set_style_border_width(obj_batt_icon, 1, 0);
lv_obj_set_style_pad_all(obj_batt_icon, 2, 0);
lv_obj_clear_flag(obj_batt_icon, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_align(obj_batt_icon, LV_ALIGN_TOP_RIGHT, -28, 22);
/* battery fill bar (inside the outline) */
obj_batt_fill = lv_obj_create(obj_batt_icon);
lv_obj_set_size(obj_batt_fill, 0, 8);
lv_obj_set_style_radius(obj_batt_fill, 1, 0);
lv_obj_set_style_bg_color(obj_batt_fill, lv_color_hex(CLR_GREEN), 0);
lv_obj_set_style_bg_opa(obj_batt_fill, LV_OPA_COVER, 0);
lv_obj_set_style_border_width(obj_batt_fill, 0, 0);
lv_obj_clear_flag(obj_batt_fill, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_align(obj_batt_fill, LV_ALIGN_LEFT_MID, 0, 0);
/* battery percentage text */
lbl_battery = make_label(scr, &lv_font_montserrat_12, CLR_GRAY,
LV_ALIGN_TOP_RIGHT, -62, 23, "--");
/* subtle separator line */
static lv_point_precise_t line_pts[] = {{40, 0}, {370, 0}};
line_sep = lv_line_create(scr);
@@ -122,6 +96,37 @@ void ui_init()
LV_ALIGN_TOP_LEFT, 28, 68,
LV_SYMBOL_WIFI " Disconnected");
/* ── battery indicator (same line as WiFi, right-aligned) ──── */
/* battery percentage text — fixed width to prevent 45° tilt */
lbl_battery = lv_label_create(scr);
lv_label_set_text(lbl_battery, "--");
lv_obj_set_style_text_font(lbl_battery, &lv_font_montserrat_16, 0);
lv_obj_set_style_text_color(lbl_battery, lv_color_hex(CLR_GRAY), 0);
lv_obj_set_width(lbl_battery, 90);
lv_obj_set_style_text_align(lbl_battery, LV_TEXT_ALIGN_RIGHT, 0);
lv_obj_align(lbl_battery, LV_ALIGN_TOP_RIGHT, -48, 68);
/* battery outline (30x14 rounded rect) */
obj_batt_icon = lv_obj_create(scr);
lv_obj_set_size(obj_batt_icon, 30, 14);
lv_obj_set_style_radius(obj_batt_icon, 3, 0);
lv_obj_set_style_bg_opa(obj_batt_icon, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_color(obj_batt_icon, lv_color_hex(CLR_GRAY), 0);
lv_obj_set_style_border_width(obj_batt_icon, 1, 0);
lv_obj_set_style_pad_all(obj_batt_icon, 2, 0);
lv_obj_clear_flag(obj_batt_icon, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_align(obj_batt_icon, LV_ALIGN_TOP_RIGHT, -16, 69);
/* battery fill bar (inside the outline) */
obj_batt_fill = lv_obj_create(obj_batt_icon);
lv_obj_set_size(obj_batt_fill, 0, 8);
lv_obj_set_style_radius(obj_batt_fill, 1, 0);
lv_obj_set_style_bg_color(obj_batt_fill, lv_color_hex(CLR_GREEN), 0);
lv_obj_set_style_bg_opa(obj_batt_fill, LV_OPA_COVER, 0);
lv_obj_set_style_border_width(obj_batt_fill, 0, 0);
lv_obj_clear_flag(obj_batt_fill, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_align(obj_batt_fill, LV_ALIGN_LEFT_MID, 0, 0);
lbl_ip = make_label(scr, &lv_font_montserrat_30, CLR_CYAN,
LV_ALIGN_TOP_LEFT, 28, 96, "0.0.0.0");