diff options
author | Renze Nicolai <renze@rnplus.nl> | 2022-05-31 22:10:08 +0200 |
---|---|---|
committer | Renze Nicolai <renze@rnplus.nl> | 2022-05-31 22:10:08 +0200 |
commit | a1ae09acdd92f2d1a519bb7b4f6335ebed1bea12 (patch) | |
tree | 088d2e8bbdc6b93001fa1351ced22cf941403f98 /main/main.c | |
parent | 3a63e597512ab1ee9c6fa6996609a6dd5e2cbaec (diff) | |
download | mch2022-a1ae09acdd92f2d1a519bb7b4f6335ebed1bea12.tar.gz mch2022-a1ae09acdd92f2d1a519bb7b4f6335ebed1bea12.tar.bz2 mch2022-a1ae09acdd92f2d1a519bb7b4f6335ebed1bea12.zip |
Move every menu thing from main to a separate file
Diffstat (limited to 'main/main.c')
-rw-r--r-- | main/main.c | 502 |
1 files changed, 3 insertions, 499 deletions
diff --git a/main/main.c b/main/main.c index 02caf18..6bed481 100644 --- a/main/main.c +++ b/main/main.c @@ -57,146 +57,6 @@ extern const uint8_t logo_screen_png_end[] asm("_binary_logo_screen_png_end"); static const char *TAG = "main"; -typedef enum action { - ACTION_NONE, - ACTION_APPFS, - ACTION_INSTALLER, - ACTION_SETTINGS, - ACTION_OTA, - ACTION_FPGA, - ACTION_FPGA_DL, - ACTION_RP2040_BL, - ACTION_WIFI_CONNECT, - ACTION_WIFI_SCAN, - ACTION_WIFI_MANUAL, - ACTION_WIFI_LIST, - ACTION_BACK, - ACTION_FILE_BROWSER, - ACTION_FILE_BROWSER_INT, - ACTION_UNINSTALL -} menu_action_t; - -typedef struct _menu_args { - appfs_handle_t fd; - menu_action_t action; -} menu_args_t; - -void appfs_store_app(pax_buf_t* pax_buffer, ILI9341* ili9341, char* path, char* label) { - graphics_task(pax_buffer, ili9341, NULL, "Installing app..."); - esp_err_t res; - appfs_handle_t handle; - FILE* app_fd = fopen(path, "rb"); - if (app_fd == NULL) { - graphics_task(pax_buffer, ili9341, NULL, "Failed to open file"); - ESP_LOGE(TAG, "Failed to open file"); - vTaskDelay(100 / portTICK_PERIOD_MS); - return; - } - size_t app_size; - uint8_t* app = load_file_to_ram(app_fd, &app_size); - if (app == NULL) { - graphics_task(pax_buffer, ili9341, NULL, "Failed to load app to RAM"); - ESP_LOGE(TAG, "Failed to load application into RAM"); - vTaskDelay(100 / portTICK_PERIOD_MS); - return; - } - - ESP_LOGI(TAG, "Application size %d", app_size); - - res = appfsCreateFile(label, app_size, &handle); - if (res != ESP_OK) { - graphics_task(pax_buffer, ili9341, NULL, "Failed to create on AppFS"); - ESP_LOGE(TAG, "Failed to create file on AppFS (%d)", res); - vTaskDelay(100 / portTICK_PERIOD_MS); - free(app); - return; - } - res = appfsWrite(handle, 0, app, app_size); - if (res != ESP_OK) { - graphics_task(pax_buffer, ili9341, NULL, "Failed to write to AppFS"); - ESP_LOGE(TAG, "Failed to write to file on AppFS (%d)", res); - vTaskDelay(100 / portTICK_PERIOD_MS); - free(app); - return; - } - free(app); - ESP_LOGI(TAG, "Application is now stored in AppFS"); - graphics_task(pax_buffer, ili9341, NULL, "App installed!"); - vTaskDelay(100 / portTICK_PERIOD_MS); - return; -} - -void menu_wifi_settings(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341, menu_action_t* menu_action) { - menu_t* menu = menu_alloc("WiFi settings"); - *menu_action = ACTION_NONE; - - menu_args_t* wifi_scan_args = malloc(sizeof(menu_args_t)); - wifi_scan_args->action = ACTION_WIFI_SCAN; - menu_insert_item(menu, "Add by scan...", NULL, wifi_scan_args, -1); - - menu_args_t* wifi_manual_args = malloc(sizeof(menu_args_t)); - wifi_manual_args->action = ACTION_WIFI_MANUAL; - menu_insert_item(menu, "Add manually...", NULL, wifi_manual_args, -1); - - menu_args_t* wifi_list_args = malloc(sizeof(menu_args_t)); - wifi_list_args->action = ACTION_WIFI_LIST; - menu_insert_item(menu, "List known networks", NULL, wifi_list_args, -1); - - menu_args_t* back_args = malloc(sizeof(menu_args_t)); - back_args->action = ACTION_BACK; - menu_insert_item(menu, "< Back", NULL, back_args, -1); - - bool render = true; - menu_args_t* menuArgs = NULL; - - while (1) { - rp2040_input_message_t buttonMessage = {0}; - if (xQueueReceive(buttonQueue, &buttonMessage, 16 / portTICK_PERIOD_MS) == pdTRUE) { - uint8_t pin = buttonMessage.input; - bool value = buttonMessage.state; - switch(pin) { - case RP2040_INPUT_JOYSTICK_DOWN: - if (value) { - menu_navigate_next(menu); - render = true; - } - break; - case RP2040_INPUT_JOYSTICK_UP: - if (value) { - menu_navigate_previous(menu); - render = true; - } - break; - case RP2040_INPUT_BUTTON_ACCEPT: - case RP2040_INPUT_JOYSTICK_PRESS: - if (value) { - menuArgs = menu_get_callback_args(menu, menu_get_position(menu)); - } - break; - default: - break; - } - } - - if (render) { - menu_render(pax_buffer, menu, 0, 0, 320, 220, 0xFF72008a); - ili9341_write(ili9341, pax_buffer->buf); - render = false; - } - - if (menuArgs != NULL) { - *menu_action = menuArgs->action; - break; - } - } - - for (size_t index = 0; index < menu_get_length(menu); index++) { - free(menu_get_callback_args(menu, index)); - } - - menu_free(menu); -} - void display_fatal_error(pax_buf_t* pax_buffer, ILI9341* ili9341, const char* line0, const char* line1, const char* line2, const char* line3) { pax_noclip(pax_buffer); pax_background(pax_buffer, 0xa85a32); @@ -207,281 +67,6 @@ void display_fatal_error(pax_buf_t* pax_buffer, ILI9341* ili9341, const char* li ili9341_write(ili9341, pax_buffer->buf); } -void list_files_in_folder(const char* path) { - DIR* dir = opendir(path); - if (dir == NULL) { - ESP_LOGE(TAG, "Failed to open directory %s", path); - return; - } - - struct dirent *ent; - char type; - char size[12]; - char tpath[255]; - char tbuffer[80]; - struct stat sb; - struct tm *tm_info; - char *lpath = NULL; - int statok; - - uint64_t total = 0; - int nfiles = 0; - printf("T Size Date/Time Name\n"); - printf("-----------------------------------\n"); - while ((ent = readdir(dir)) != NULL) { - sprintf(tpath, path); - if (path[strlen(path)-1] != '/') { - strcat(tpath,"/"); - } - strcat(tpath,ent->d_name); - tbuffer[0] = '\0'; - - // Get file stat - statok = stat(tpath, &sb); - - if (statok == 0) { - tm_info = localtime(&sb.st_mtime); - strftime(tbuffer, 80, "%d/%m/%Y %R", tm_info); - } else { - sprintf(tbuffer, " "); - } - - if (ent->d_type == DT_REG) { - type = 'f'; - nfiles++; - if (statok) { - strcpy(size, " ?"); - } else { - total += sb.st_size; - if (sb.st_size < (1024*1024)) sprintf(size,"%8d", (int)sb.st_size); - else if ((sb.st_size/1024) < (1024*1024)) sprintf(size,"%6dKB", (int)(sb.st_size / 1024)); - else sprintf(size,"%6dMB", (int)(sb.st_size / (1024 * 1024))); - } - } else { - type = 'd'; - strcpy(size, " -"); - } - - printf("%c %s %s %s\r\n", type, size, tbuffer, ent->d_name); - } - - printf("-----------------------------------\n"); - if (total < (1024*1024)) printf(" %8d", (int)total); - else if ((total/1024) < (1024*1024)) printf(" %6dKB", (int)(total / 1024)); - else printf(" %6dMB", (int)(total / (1024 * 1024))); - printf(" in %d file(s)\n", nfiles); - printf("-----------------------------------\n"); - - closedir(dir); - free(lpath); -} - -typedef struct _uninstall_menu_args { - appfs_handle_t fd; - char name[512]; -} uninstall_menu_args_t; - -void uninstall_browser(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341) { - appfs_handle_t appfs_fd = APPFS_INVALID_FD; - menu_t* menu = menu_alloc("Uninstall application"); - while (1) { - appfs_fd = appfsNextEntry(appfs_fd); - if (appfs_fd == APPFS_INVALID_FD) break; - const char* name = NULL; - appfsEntryInfo(appfs_fd, &name, NULL); - uninstall_menu_args_t* args = malloc(sizeof(uninstall_menu_args_t)); - if (args == NULL) { - ESP_LOGE(TAG, "Failed to malloc() menu args"); - return; - } - args->fd = appfs_fd; - sprintf(args->name, name); - menu_insert_item(menu, name, NULL, (void*) args, -1); - } - uninstall_menu_args_t* menuArgs = NULL; - bool render = true; - bool exit = false; - while (1) { - rp2040_input_message_t buttonMessage = {0}; - if (xQueueReceive(buttonQueue, &buttonMessage, 16 / portTICK_PERIOD_MS) == pdTRUE) { - uint8_t pin = buttonMessage.input; - bool value = buttonMessage.state; - switch(pin) { - case RP2040_INPUT_JOYSTICK_DOWN: - if (value) { - menu_navigate_next(menu); - render = true; - } - break; - case RP2040_INPUT_JOYSTICK_UP: - if (value) { - menu_navigate_previous(menu); - render = true; - } - break; - case RP2040_INPUT_BUTTON_ACCEPT: - case RP2040_INPUT_JOYSTICK_PRESS: - if (value) { - menuArgs = menu_get_callback_args(menu, menu_get_position(menu)); - } - break; - case RP2040_INPUT_BUTTON_HOME: - if (value) exit = true; - break; - default: - break; - } - } - - if (render) { - menu_render(pax_buffer, menu, 0, 0, 320, 220, 0xFF72008a); - ili9341_write(ili9341, pax_buffer->buf); - render = false; - } - - if (menuArgs != NULL) { - char message[1024]; - sprintf(message, "Uninstalling %s...", menuArgs->name); - printf("%s\n", message); - graphics_task(pax_buffer, ili9341, menu, message); - appfsDeleteFile(menuArgs->name); - menuArgs = NULL; - break; - } - - if (exit) { - break; - } - } - - for (size_t index = 0; index < menu_get_length(menu); index++) { - free(menu_get_callback_args(menu, index)); - } - - menu_free(menu); -} - -typedef struct _file_browser_menu_args { - char type; - char path[512]; - char label[512]; -} file_browser_menu_args_t; - -void find_parent_dir(char* path, char* parent) { - size_t last_separator = 0; - for (size_t index = 0; index < strlen(path); index++) { - if (path[index] == '/') last_separator = index; - } - - strcpy(parent, path); - parent[last_separator] = '\0'; -} - -void file_browser(xQueueHandle buttonQueue, pax_buf_t* pax_buffer, ILI9341* ili9341, const char* initial_path) { - char path[512] = {0}; - strncpy(path, initial_path, sizeof(path)); - while (true) { - menu_t* menu = menu_alloc(path); - DIR* dir = opendir(path); - if (dir == NULL) { - ESP_LOGE(TAG, "Failed to open directory %s", path); - return; - } - struct dirent *ent; - file_browser_menu_args_t* pd_args = malloc(sizeof(file_browser_menu_args_t)); - pd_args->type = 'd'; - find_parent_dir(path, pd_args->path); - printf("Parent dir: %s\n", pd_args->path); - menu_insert_item(menu, "../", NULL, pd_args, -1); - - while ((ent = readdir(dir)) != NULL) { - file_browser_menu_args_t* args = malloc(sizeof(file_browser_menu_args_t)); - sprintf(args->path, path); - if (path[strlen(path)-1] != '/') { - strcat(args->path,"/"); - } - strcat(args->path,ent->d_name); - - if (ent->d_type == DT_REG) { - args->type = 'f'; - } else { - args->type = 'd'; - } - - printf("%c %s %s\r\n", args->type, ent->d_name, args->path); - - snprintf(args->label, sizeof(args->label), "%s%s", ent->d_name, (args->type == 'd') ? "/" : ""); - menu_insert_item(menu, args->label, NULL, args, -1); - } - closedir(dir); - - bool render = true; - bool exit = false; - file_browser_menu_args_t* menuArgs = NULL; - - while (1) { - rp2040_input_message_t buttonMessage = {0}; - if (xQueueReceive(buttonQueue, &buttonMessage, 16 / portTICK_PERIOD_MS) == pdTRUE) { - uint8_t pin = buttonMessage.input; - bool value = buttonMessage.state; - switch(pin) { - case RP2040_INPUT_JOYSTICK_DOWN: - if (value) { - menu_navigate_next(menu); - render = true; - } - break; - case RP2040_INPUT_JOYSTICK_UP: - if (value) { - menu_navigate_previous(menu); - render = true; - } - break; - case RP2040_INPUT_BUTTON_ACCEPT: - case RP2040_INPUT_JOYSTICK_PRESS: - if (value) { - menuArgs = menu_get_callback_args(menu, menu_get_position(menu)); - } - break; - case RP2040_INPUT_BUTTON_HOME: - if (value) exit = true; - break; - default: - break; - } - } - - if (render) { - menu_render(pax_buffer, menu, 0, 0, 320, 220, 0xFF72008a); - ili9341_write(ili9341, pax_buffer->buf); - render = false; - } - - if (menuArgs != NULL) { - if (menuArgs->type == 'd') { - strcpy(path, menuArgs->path); - break; - } else { - printf("File selected: %s\n", menuArgs->path); - appfs_store_app(pax_buffer, ili9341, menuArgs->path, menuArgs->label); - } - menuArgs = NULL; - render = true; - } - - if (exit) { - break; - } - } - - for (size_t index = 0; index < menu_get_length(menu); index++) { - free(menu_get_callback_args(menu, index)); - } - - menu_free(menu); - } -} - void app_main(void) { esp_err_t res; @@ -516,7 +101,8 @@ void app_main(void) { ESP_LOGE(TAG, "ili9341 is NULL"); esp_restart(); } - + + audio_init(); display_boot_screen(pax_buffer, ili9341, "Initializing RP2040..."); @@ -633,10 +219,9 @@ void app_main(void) { bool sdcard_ready = (res == ESP_OK); if (sdcard_ready) { ESP_LOGI(TAG, "SD card filesystem mounted"); - //list_files_in_folder("/sd"); } - display_boot_screen(pax_buffer, ili9341, "Initializing LEDs..."); + play_bootsound(); /* Start LEDs */ ws2812_init(GPIO_LED_DATA); @@ -648,89 +233,8 @@ void app_main(void) { /* Launcher menu */ while (true) { - menu_action_t menu_action = ACTION_NONE; - appfs_handle_t appfs_fd = -1; menu_start(rp2040->queue, pax_buffer, ili9341); - if (menu_action == ACTION_FPGA) { - graphics_task(pax_buffer, ili9341, NULL, "Loading..."); - fpga_test(ili9341, ice40, rp2040->queue); - } else if (menu_action == ACTION_FILE_BROWSER) { - file_browser(rp2040->queue, pax_buffer, ili9341, "/sd"); - } else if (menu_action == ACTION_FILE_BROWSER_INT) { - file_browser(rp2040->queue, pax_buffer, ili9341, "/internal"); - } else if (menu_action == ACTION_UNINSTALL) { - uninstall_browser(rp2040->queue, pax_buffer, ili9341); - } else if (menu_action == ACTION_SETTINGS) { - while (true) { - menu_wifi_settings(rp2040->queue, pax_buffer, ili9341, &menu_action); - if (menu_action == ACTION_WIFI_MANUAL) { - nvs_handle_t handle; - nvs_open("system", NVS_READWRITE, &handle); - char ssid[33]; - char password[33]; - size_t requiredSize; - esp_err_t res = nvs_get_str(handle, "wifi.ssid", NULL, &requiredSize); - if (res != ESP_OK) { - strcpy(ssid, ""); - strcpy(password, ""); - } else if (requiredSize < sizeof(ssid)) { - res = nvs_get_str(handle, "wifi.ssid", ssid, &requiredSize); - if (res != ESP_OK) strcpy(ssid, ""); - res = nvs_get_str(handle, "wifi.password", NULL, &requiredSize); - if (res != ESP_OK) { - strcpy(password, ""); - } else if (requiredSize < sizeof(password)) { - res = nvs_get_str(handle, "wifi.password", password, &requiredSize); - if (res != ESP_OK) strcpy(password, ""); - } - } - bool accepted = keyboard(rp2040->queue, pax_buffer, ili9341, 30, 30, pax_buffer->width - 60, pax_buffer->height - 60, "WiFi SSID", "Press HOME to exit", ssid, sizeof(ssid)); - if (accepted) { - accepted = keyboard(rp2040->queue, pax_buffer, ili9341, 30, 30, pax_buffer->width - 60, pax_buffer->height - 60, "WiFi password", "Press HOME to exit", password, sizeof(password)); - } - if (accepted) { - nvs_set_str(handle, "wifi.ssid", ssid); - nvs_set_str(handle, "wifi.password", password); - graphics_task(pax_buffer, ili9341, NULL, "WiFi settings stored"); - } else { - graphics_task(pax_buffer, ili9341, NULL, "Canceled"); - } - nvs_set_u8(handle, "wifi.use_ent", 0); - nvs_close(handle); - } else if (menu_action == ACTION_WIFI_LIST) { - nvs_handle_t handle; - nvs_open("system", NVS_READWRITE, &handle); - char ssid[33]; - char password[33]; - size_t requiredSize; - esp_err_t res = nvs_get_str(handle, "wifi.ssid", NULL, &requiredSize); - if (res != ESP_OK) { - strcpy(ssid, ""); - } else if (requiredSize < sizeof(ssid)) { - res = nvs_get_str(handle, "wifi.ssid", ssid, &requiredSize); - if (res != ESP_OK) strcpy(ssid, ""); - res = nvs_get_str(handle, "wifi.password", NULL, &requiredSize); - if (res != ESP_OK) { - strcpy(password, ""); - } else if (requiredSize < sizeof(password)) { - res = nvs_get_str(handle, "wifi.password", password, &requiredSize); - if (res != ESP_OK) strcpy(password, ""); - } - } - nvs_close(handle); - char buffer[300]; - snprintf(buffer, sizeof(buffer), "SSID is %s\nPassword is %s", ssid, password); - graphics_task(pax_buffer, ili9341, NULL, buffer); - } else if (menu_action == ACTION_WIFI_SCAN) { - // Scan for WiFi networks. - wifi_scan(NULL); - } else { - break; - } - } - } } - free(framebuffer); } |