/* * deploy.c -- Flash Storage Management module * * SPDX-License-Identifier: GPL-2.0-or-later * * Flash storage manager. Shows storage stats via statvfs("/") and * allows manual sync() via the PLAY button. */ #include #include #include #include #include #include #include #include "h2_ui.h" #include "log_manager.h" #define BUF_SIZE 256 static void read_block_stats(char *buf, size_t len) { struct statvfs vfs; if (statvfs("/", &vfs) != 0) { snprintf(buf, len, "statvfs failed"); return; } unsigned long long total = (unsigned long long)vfs.f_blocks * vfs.f_frsize; unsigned long long used = (unsigned long long)(vfs.f_blocks - vfs.f_bfree) * vfs.f_frsize; unsigned long long avail = (unsigned long long)vfs.f_bavail * vfs.f_frsize; int pct = (total > 0) ? (int)((used * 100) / total) : 0; snprintf(buf, len, "Total: %llu MB\nUsed: %llu MB (%d%%)\nFree: %llu MB", total / (1024 * 1024), used / (1024 * 1024), pct, avail / (1024 * 1024)); } int main(void) { init_h2_graphics_runtime("STORAGE SYNCHRONIZER"); LOG_INF("deploy module started"); lv_obj_t *scr = lv_scr_act(); lv_obj_t *title = lv_label_create(scr); lv_label_set_text(title, "FLASH STORAGE MANAGEMENT"); lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 15); lv_obj_set_style_text_color(title, COLOR_PRIMARY, LV_PART_MAIN); lv_obj_t *card = lv_obj_create(scr); lv_obj_set_size(card, 280, 140); lv_obj_align(card, LV_ALIGN_CENTER, 0, 10); lv_obj_t *stats_lbl = lv_label_create(card); lv_obj_set_width(stats_lbl, 260); lv_obj_align(stats_lbl, LV_ALIGN_TOP_LEFT, 10, 8); char stats_buf[BUF_SIZE]; read_block_stats(stats_buf, sizeof(stats_buf)); lv_label_set_text(stats_lbl, stats_buf); lv_obj_t *status_lbl = lv_label_create(card); lv_obj_align(status_lbl, LV_ALIGN_BOTTOM_LEFT, 10, 8); lv_obj_set_style_text_color(status_lbl, COLOR_MUTED, LV_PART_MAIN); lv_label_set_text(status_lbl, "[PLAY] Sync [BACK] Exit"); int input_fd = open("/dev/input/event0", O_RDONLY | O_NONBLOCK); struct input_event ev; while (1) { lv_timer_handler(); if (input_fd >= 0 && read(input_fd, &ev, sizeof(struct input_event)) > 0) { if (ev.type == EV_KEY && ev.code == H2_KEY_PLAY && ev.value == 1) { lv_label_set_text(status_lbl, "SYNCING..."); lv_obj_set_style_text_color(status_lbl, COLOR_PRIMARY, LV_PART_MAIN); lv_timer_handler(); sync(); read_block_stats(stats_buf, sizeof(stats_buf)); lv_label_set_text(stats_lbl, stats_buf); lv_label_set_text(status_lbl, "SYNC COMPLETE."); lv_obj_set_style_text_color(status_lbl, COLOR_ACCENT, LV_PART_MAIN); LOG_INF("manual sync triggered"); } if (ev.type == EV_KEY && ev.code == H2_KEY_BACK && ev.value == 1) break; } usleep(20000); } if (input_fd >= 0) close(input_fd); LOG_INF("deploy module exited"); return 0; }