Use singly linked list dfor temperature profile file list
This commit is contained in:
parent
01b445a0fb
commit
61e3b58992
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user