Use singly linked list dfor temperature profile file list

This commit is contained in:
Mario Hüttel 2021-05-07 22:09:55 +02:00
parent 01b445a0fb
commit 61e3b58992

View File

@ -38,6 +38,8 @@
#include <reflow-controller/oven-driver.h> #include <reflow-controller/oven-driver.h>
#include <fatfs/ff.h> #include <fatfs/ff.h>
#include <reflow-controller/temp-profile-executer.h> #include <reflow-controller/temp-profile-executer.h>
#include <linklist-lib/singly-linked-list.h>
#include <stdlib.h>
static char IN_SECTION(.ccm.bss) display_buffer[4][21] = {0}; static char IN_SECTION(.ccm.bss) display_buffer[4][21] = {0};
static struct lcd_menu IN_SECTION(.ccm.bss) reflow_menu; static struct lcd_menu IN_SECTION(.ccm.bss) reflow_menu;
@ -404,44 +406,38 @@ static int safe_strncpy(char *dest, const char *src, size_t max_size) {
return 0; return 0;
} }
/** static void delete_file_list_entry(void *obj)
* @brief load_temperature_file_list_from_sdcard {
* @return -1 File error, 0 successful if (obj)
*/ free(obj);
static int load_temperature_file_list_from_sdcard(char (*list)[17], uint32_t len) }
static SlList *load_temp_profile_list_from_sdcard(int *error)
{ {
uint32_t i, j;
DIR directory; DIR directory;
FILINFO finfo; FILINFO finfo;
FRESULT fres; FRESULT fres;
SlList *list = NULL;
if (!list) char *name;
return -1001;
/* Zero out the list */
for (i = 0; i < len; i++) {
for (j = 0; j < sizeof(*list); j++) {
list[i][j] = 0;
}
}
/* find the frist file */ /* find the frist file */
fres = f_findfirst(&directory, &finfo, "/", "*.tpr"); fres = f_findfirst(&directory, &finfo, "/", "*.tpr");
i = 0;
while (fres == FR_OK && finfo.fname[0]) { while (fres == FR_OK && finfo.fname[0]) {
safe_strncpy(&list[i][0], finfo.fname, sizeof(*list)); name = malloc(strlen(finfo.fname) + 1);
strcpy(name, finfo.fname);
list = sl_list_append(list, name);
fres = f_findnext(&directory, &finfo); fres = f_findnext(&directory, &finfo);
i++;
if (i >= len)
break;
} }
if (fres != FR_OK) { if (fres != FR_OK) {
return -1; sl_list_free_full(list, delete_file_list_entry);
list = NULL;
if (error)
*error = -1;
} }
return (int)i; return list;
} }
static void gui_menu_temp_profile_execute(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void* parent) static void gui_menu_temp_profile_execute(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void* parent)
@ -501,29 +497,29 @@ static void gui_menu_temp_profile_execute(struct lcd_menu *menu, enum menu_entry
static void gui_menu_temp_profile_select(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void *parent) static void gui_menu_temp_profile_select(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void *parent)
{ {
static void *my_parent; static void *my_parent;
static char profile_list[10][17]; static SlList *file_list = NULL;
static bool file_error = false; static int file_error = 0;
static enum pl_ret_val profile_ret_val = PL_RET_SUCCESS; static enum pl_ret_val profile_ret_val = PL_RET_SUCCESS;
static uint8_t currently_selected = 0U; static uint8_t currently_selected = 0U;
static uint8_t loaded; static uint8_t loaded;
int16_t delta; int16_t delta;
enum button_state button; enum button_state button;
int res;
if (entry_type == MENU_ENTRY_FIRST_ENTER) { if (entry_type == MENU_ENTRY_FIRST_ENTER) {
menu_display_clear(menu); menu_display_clear(menu);
my_parent = parent; my_parent = parent;
res = load_temperature_file_list_from_sdcard(profile_list, 10); file_error = 0;
file_error = false;
loaded = 0; loaded = 0;
if (res < 0) {
file_error = true; if (file_list) {
sl_list_free_full(file_list, delete_file_list_entry);
} }
file_list = load_temp_profile_list_from_sdcard(&file_error);
currently_selected = 0u; currently_selected = 0u;
profile_ret_val = PL_RET_SUCCESS; profile_ret_val = PL_RET_SUCCESS;
loaded = (uint32_t)res; loaded = sl_list_length(file_list);
menu_lcd_outputf(menu, 0, "Select:"); menu_lcd_outputf(menu, 0, "Select:");
} else if (entry_type == MENU_ENTRY_DROPBACK) { } else if (entry_type == MENU_ENTRY_DROPBACK) {
menu_entry_dropback(menu, my_parent); menu_entry_dropback(menu, my_parent);
@ -541,14 +537,20 @@ static void gui_menu_temp_profile_select(struct lcd_menu *menu, enum menu_entry_
if (file_error) { if (file_error) {
menu_lcd_outputf(menu, 0, "Disk Error"); menu_lcd_outputf(menu, 0, "Disk Error");
menu_lcd_outputf(menu, 1, "SD inserted?"); menu_lcd_outputf(menu, 1, "SD inserted?");
if (button == BUTTON_SHORT_RELEASED) if (button == BUTTON_SHORT_RELEASED) {
sl_list_free_full(file_list, delete_file_list_entry);
file_list = NULL;
menu_entry_dropback(menu, my_parent); menu_entry_dropback(menu, my_parent);
}
return; return;
} else if (loaded == 0) { } else if (loaded == 0) {
menu_lcd_outputf(menu, 0, "No profiles"); menu_lcd_outputf(menu, 0, "No profiles");
menu_lcd_outputf(menu, 1, "found"); menu_lcd_outputf(menu, 1, "found");
if (button == BUTTON_SHORT_RELEASED) if (button == BUTTON_SHORT_RELEASED) {
sl_list_free_full(file_list, delete_file_list_entry);
file_list = NULL;
menu_entry_dropback(menu, my_parent); menu_entry_dropback(menu, my_parent);
}
return; return;
} else if (profile_ret_val != PL_RET_SUCCESS) { } else if (profile_ret_val != PL_RET_SUCCESS) {
menu_lcd_outputf(menu, 0, "ERROR"); menu_lcd_outputf(menu, 0, "ERROR");
@ -568,17 +570,22 @@ static void gui_menu_temp_profile_select(struct lcd_menu *menu, enum menu_entry_
break; break;
} }
if (button == BUTTON_SHORT_RELEASED) if (button == BUTTON_SHORT_RELEASED) {
sl_list_free_full(file_list, delete_file_list_entry);
file_list = NULL;
menu_entry_dropback(menu, my_parent); menu_entry_dropback(menu, my_parent);
}
return; return;
} else if (currently_selected < loaded) { } else if (currently_selected < loaded) {
/* Show currently selected profile */ /* Show currently selected profile */
menu_lcd_outputf(menu, 1, "%s", &profile_list[currently_selected][0]); menu_lcd_outputf(menu, 1, "%s", sl_list_nth(file_list, currently_selected)->data);
if (button == BUTTON_SHORT_RELEASED) { if (button == BUTTON_SHORT_RELEASED) {
/* Execute selected profile */ /* Execute selected profile */
profile_ret_val = temp_profile_executer_start(&profile_list[currently_selected][0]); profile_ret_val = temp_profile_executer_start(sl_list_nth(file_list, currently_selected)->data);
if (profile_ret_val == PL_RET_SUCCESS) { if (profile_ret_val == PL_RET_SUCCESS) {
sl_list_free_full(file_list, delete_file_list_entry);
file_list = NULL;
menu_entry_enter(menu, gui_menu_temp_profile_execute, true); menu_entry_enter(menu, gui_menu_temp_profile_execute, true);
return; return;
} }