From a6dc4f9b46999c4a4a212db862b1cf1be90f8cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sat, 13 Jun 2020 22:47:45 +0200 Subject: [PATCH] Add about command to menu and restructure code. Delete preliminary code from mainloop. Better code will follow --- stm-firmware/Makefile | 14 ++-- .../{lcd-menu.h => reflow-menu.h} | 6 +- .../include/reflow-controller/systick.h | 5 ++ .../include/reflow-controller/ui/menu.h | 2 + stm-firmware/main.c | 69 +++++----------- stm-firmware/{lcd-menu.c => reflow-menu.c} | 81 +++++++++++++------ stm-firmware/stm32f407vet6_flash.ld | 13 +-- stm-firmware/systick.c | 6 +- stm-firmware/ui/lcd.c | 2 +- stm-firmware/ui/menu.c | 18 +++++ 10 files changed, 122 insertions(+), 94 deletions(-) rename stm-firmware/include/reflow-controller/{lcd-menu.h => reflow-menu.h} (92%) rename stm-firmware/{lcd-menu.c => reflow-menu.c} (71%) diff --git a/stm-firmware/Makefile b/stm-firmware/Makefile index c66e8c8..259305a 100644 --- a/stm-firmware/Makefile +++ b/stm-firmware/Makefile @@ -41,7 +41,7 @@ CFILES += calibration.c CFILES += temp-converter.c CFILES += rotary-encoder.c button.c CFILES += stack-check.c -CFILES += ui/lcd.c ui/menu.c lcd-menu.c +CFILES += ui/lcd.c ui/menu.c reflow-menu.c #CFILES += onewire-temp-sensors.c CFILES += fatfs/diskio.c fatfs/ff.c fatfs/ffsystem.c fatfs/ffunicode.c fatfs/shimatta_sdio_driver/shimatta_sdio.c CFILES += pid-controller.c oven-driver.c @@ -124,7 +124,7 @@ qtproject-legacy: find -name "*.h" | tr "\\n" " " >> $(target).pro echo -ne "\nDEFINES += " >> $(target).pro echo "$(DEFINES)" | sed "s/-D//g" >> $(target).pro - + qtproject: $(QUIET)rm -f $(target).files $(target).cflags $(target).config $(target).creator $(target).includes $(target).creator.user echo "Generating source file list" @@ -134,13 +134,13 @@ qtproject: $(QUIET)for dir in `echo $(INCLUDEPATH) | sed "s/-I//g"`; do \ find `echo "$${dir}"` -name "*.h" >> $(target).files; \ done - @echo "Generating CFLAGS File" + @echo "Generating $(target).cflags" $(QUIET)echo "" > $(target).cflags - @echo "Generating includes files" + @echo "Generating $(target).includes" $(QUIET)echo $(INCLUDEPATH) | sed "s/-I/,/g" | tr , '\n' | sed "/^$$/d" > $(target).includes; - @echo "Generating config file" + @echo "Generating $(target).config" $(QUIET)echo $(DEFINES) | sed "s/-D/,#define /g" | tr , '\n' | sed "/^$$/d" > $(target).config - @echo "Generating creator file" + @echo "Generating $(target).creator" $(QUIET)echo "[GENERAL]" > $(target).creator - + -include $(CFILES:%.c=$(OBJDIR)/%.c.d) $(ASFILES:%.S=$(OBJDIR)/%.S.d) diff --git a/stm-firmware/include/reflow-controller/lcd-menu.h b/stm-firmware/include/reflow-controller/reflow-menu.h similarity index 92% rename from stm-firmware/include/reflow-controller/lcd-menu.h rename to stm-firmware/include/reflow-controller/reflow-menu.h index 1f271e2..6f19ad2 100644 --- a/stm-firmware/include/reflow-controller/lcd-menu.h +++ b/stm-firmware/include/reflow-controller/reflow-menu.h @@ -18,8 +18,8 @@ * If not, see . */ -#ifndef __LCD_MENU_H__ -#define __LCD_MENU_H__ +#ifndef __REFLOW_MENU_H__ +#define __REFLOW_MENU_H__ /** * @brief Handle the reflow controller's LCD Menu @@ -29,4 +29,4 @@ int reflow_menu_handle(void); void reflow_menu_init(void); -#endif /* __LCD_MENU_H__ */ +#endif /* __REFLOW_MENU_H__ */ diff --git a/stm-firmware/include/reflow-controller/systick.h b/stm-firmware/include/reflow-controller/systick.h index fa1568c..7cfe630 100644 --- a/stm-firmware/include/reflow-controller/systick.h +++ b/stm-firmware/include/reflow-controller/systick.h @@ -49,6 +49,11 @@ extern volatile uint32_t wait_tick_ms; */ extern volatile uint64_t global_tick_ms; +/** + * @brief Wait counter for the display. This must not be used anywhere else + */ +extern volatile uint32_t lcd_tick_ms; + /** * @brief Setup the Systick timer to generate a 1 ms tick */ diff --git a/stm-firmware/include/reflow-controller/ui/menu.h b/stm-firmware/include/reflow-controller/ui/menu.h index 74885e7..46c07b7 100644 --- a/stm-firmware/include/reflow-controller/ui/menu.h +++ b/stm-firmware/include/reflow-controller/ui/menu.h @@ -76,4 +76,6 @@ void menu_list_scroll_down(struct menu_list *list); void menu_list_scroll_up(struct menu_list *list); +void menu_list_enter_selected_entry(struct menu_list *list, struct lcd_menu *menu); + #endif /* __MENU_H__ */ diff --git a/stm-firmware/main.c b/stm-firmware/main.c index e27ab44..14db170 100644 --- a/stm-firmware/main.c +++ b/stm-firmware/main.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include static void setup_nvic_priorities() { @@ -60,9 +60,6 @@ static void setup_nvic_priorities() } /* Process parameters are defined static globally to be watched in debugger from any context */ -static float pt1000_value; -static volatile int pt1000_value_status; -static uint32_t rot; static float target_temperature; static struct pid_controller pid; @@ -96,7 +93,7 @@ static shellmatta_retCode_t write_shell_callback(const char *data, uint32_t len) return SHELLMATTA_OK; } -static inline void setup_sell_uart(struct stm_uart *uart) +static inline void setup_shell_uart(struct stm_uart *uart) { uart->rx = 1; uart->tx = 1; @@ -176,7 +173,7 @@ static inline void setup_system() safety_adc_init(); uart_gpio_config(); - setup_sell_uart(&shell_uart); + setup_shell_uart(&shell_uart); setup_unused_pins(); } @@ -187,28 +184,36 @@ static void handle_shell_uart_input(shellmatta_handle_t shell_handle) const char *uart_input; size_t uart_input_len; - /* Handle uart input for shell */ + /* Handle UART input for shell */ uart_receive_status = uart_receive_data_with_dma(&shell_uart, &uart_input, &uart_input_len); if (uart_receive_status >= 0) shell_handle_input(shell_handle, uart_input, uart_input_len); } +extern char _sccmram; +extern char _eccmram; +static void zero_ccm_ram(void) +{ + uint32_t len; + uint32_t i; + uint32_t *ptr = (uint32_t *)&_sccmram; + len = (uint32_t)&_eccmram - (uint32_t)&_sccmram; + for (i = 0; i < len; i++) + ptr[i] = 0UL; +} int main() { bool sd_card_mounted = false; shellmatta_handle_t shell_handle; - uint64_t pid_timestamp = 0ULL; - bool pid_controller_active = false; - int32_t pid_controller_output; - uint64_t display_timestamp = 0ULL; - int temp_status; - float current_temp; int menu_wait_request; + uint64_t quarter_sec_timestamp = 0ULL; + enum safety_adc_check_result safety_adc_status; target_temperature = 25.0f; + zero_ccm_ram(); setup_system(); shell_handle = shell_init(write_shell_callback); @@ -217,46 +222,14 @@ int main() pid_init(&pid, 0.1, 0.1, 4.0, 0.0, 100.0, 40.0, 0.25); pid_zero(&pid); - while (1) { sd_card_mounted = mount_sd_card_if_avail(sd_card_mounted); - pt1000_value_status = adc_pt1000_get_current_resistance(&pt1000_value); - - if (systick_ticks_have_passed(pid_timestamp, 250)) { - - (void)handle_safety_adc(); - - pid_timestamp = systick_get_global_tick(); - - temp_status = temp_converter_convert_resistance_to_temp(pt1000_value, - ¤t_temp); - - if (pt1000_value_status >= 0 && pid_controller_active) - pid_controller_output = handle_pid_controller(&pid, target_temperature, current_temp); - - /* Blink red led in case of temp error */ - if (pt1000_value_status < 0) - led_set(0, !led_get(0)); - else - led_set(0, 0); + if(systick_ticks_have_passed(quarter_sec_timestamp, 250)) { + safety_adc_status = handle_safety_adc(); + quarter_sec_timestamp = systick_get_global_tick(); } - /* Handle error in case PID controller should be active, but temperature measurement failed */ - if (pid_controller_active && pt1000_value_status < 0) { - /* Disable the oven controller */ - oven_driver_set_power(0U); - - /* Activate loundspeaker permanently */ - loudspeaker_set(100); - } else if (pid_controller_active) { - /* In case temperature measurement is okay and controlelr is working, write output power */ - oven_driver_set_power(pid_controller_output < 0 ? 0U : (uint8_t)pid_controller_output); - } - - - oven_driver_set_power(rot > 100U ? 100U : rot); - handle_shell_uart_input(shell_handle); menu_wait_request = reflow_menu_handle(); diff --git a/stm-firmware/lcd-menu.c b/stm-firmware/reflow-menu.c similarity index 71% rename from stm-firmware/lcd-menu.c rename to stm-firmware/reflow-menu.c index 9e0185b..066e8c2 100644 --- a/stm-firmware/lcd-menu.c +++ b/stm-firmware/reflow-menu.c @@ -18,18 +18,19 @@ * If not, see . */ -#include +#include #include #include #include #include #include #include +#include +#include #include #include #include -#include -#include +#include static char __attribute__((section(".ccmram"))) display_buffer[4][21] = {0}; static struct lcd_menu reflow_menu; @@ -66,6 +67,7 @@ static void reflow_menu_monitor(struct lcd_menu *menu, enum menu_entry_func_entr } if (systick_ticks_have_passed(my_timestamp, 250)) { + my_timestamp = systick_get_global_tick(); adc_pt1000_get_current_resistance(&tmp); snprintf(line, sizeof(line), "Res: %.1f", tmp); menu->update_display(0, line); @@ -100,41 +102,71 @@ static void reflow_menu_monitor(struct lcd_menu *menu, enum menu_entry_func_entr } } +static void reflow_menu_about(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void *parent) +{ + static void *my_parent; + static bool button_ready; + char buff[20]; + + if (entry_type == MENU_ENTRY_FIRST_ENTER) { + my_parent = parent; + button_ready = false; + menu_display_clear(menu); + + menu->update_display(0, LCD_SHIMATTA_STRING " Reflow"); + snprintf(buff, sizeof(buff), "%.*s", LCD_CHAR_WIDTH, xstr(GIT_VER)); + menu->update_display(1, buff); + if (strlen(xstr(GIT_VER)) > LCD_CHAR_WIDTH) { + snprintf(buff, sizeof(buff), "%s", &xstr(GIT_VER)[LCD_CHAR_WIDTH]); + menu->update_display(2, buff); + } + + menu->update_display(3, __DATE__); + } + + if (menu->inputs.push_button == BUTTON_IDLE) + button_ready = true; + + if (button_ready && + (menu->inputs.push_button == BUTTON_SHORT_RELEASED || menu->inputs.push_button == BUTTON_LONG)) { + menu_entry_dropback(menu, my_parent); + } +} + static void reflow_menu_root_entry(struct lcd_menu *menu, enum menu_entry_func_entry entry_type, void *parent) { (void)parent; static struct menu_list list; static bool button_valid; - static const char * const root_entries[] = { - "Device Info", - "Safety Monitor", - "Foo", - "bar", - "foobar", + static const char * const root_entry_names[] = { + "About", + "Monitoring", NULL }; + static const menu_func_t root_entry_funcs[] = { + reflow_menu_about, + reflow_menu_monitor + }; + if (entry_type != MENU_ENTRY_CONTINUE) { menu_display_clear(menu); - button_valid = false; - list.entry_names = root_entries; - list.submenu_list = NULL; - list.update_display = menu->update_display; - list.currently_selected = 0; - menu_list_compute_count(&list); update_display_buffer(0, "Main Menu"); + if (entry_type == MENU_ENTRY_FIRST_ENTER) { + button_valid = false; + list.entry_names = root_entry_names; + list.submenu_list = root_entry_funcs; + list.update_display = menu->update_display; + list.currently_selected = 0; + menu_list_compute_count(&list); + } } if (menu->inputs.push_button == BUTTON_IDLE) { button_valid = true; } else if (button_valid && menu->inputs.push_button == BUTTON_SHORT_RELEASED) { - switch (list.currently_selected) { - case 1: - menu_entry_enter(menu, reflow_menu_monitor, false); - break; - default: - break; - } + /* Enter currently selected menu_entry */ + menu_list_enter_selected_entry(&list, menu); } @@ -156,15 +188,16 @@ int reflow_menu_handle() int32_t rot_delta; enum button_state button; static enum lcd_fsm_ret lcd_ret = LCD_FSM_NOP; - static uint64_t lcd_timestamp = 0ULL; rot_delta = rotary_encoder_get_change_val(); button = button_read_event(); menu_handle(reflow_menu_ptr, (int16_t)rot_delta, button); - if (lcd_ret != LCD_FSM_WAIT_CALL || systick_ticks_have_passed(lcd_timestamp, 2)) + if (lcd_ret != LCD_FSM_WAIT_CALL || lcd_tick_ms >= 2) { lcd_ret = lcd_fsm_write_buffer(display_buffer); + lcd_tick_ms = 0UL; + } if (lcd_ret == LCD_FSM_CALL_AGAIN) return 1; diff --git a/stm-firmware/stm32f407vet6_flash.ld b/stm-firmware/stm32f407vet6_flash.ld index 58ba19a..c90ee90 100644 --- a/stm-firmware/stm32f407vet6_flash.ld +++ b/stm-firmware/stm32f407vet6_flash.ld @@ -112,13 +112,8 @@ SECTIONS _siccmram = LOADADDR(.ccmram); - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : + /* CCM-RAM section */ + .ccmram (NOLOAD): { . = ALIGN(4); _sccmram = .; /* create a global symbol at ccmram start */ @@ -126,12 +121,12 @@ SECTIONS *(.ccmram*) . = ALIGN(4); _eccmram = .; /* create a global symbol at ccmram end */ - } >CCM AT> FLASH + } >CCM _sidata = LOADADDR(.data); /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : + .data : { . = ALIGN(4); _sdata = .; /* create a global symbol at data start */ diff --git a/stm-firmware/systick.c b/stm-firmware/systick.c index c998f6e..e6a84ef 100644 --- a/stm-firmware/systick.c +++ b/stm-firmware/systick.c @@ -26,8 +26,9 @@ #include #include -volatile uint32_t wait_tick_ms; -volatile uint64_t global_tick_ms; +volatile uint32_t wait_tick_ms = 0UL; +volatile uint64_t global_tick_ms = 0ULL; +volatile uint32_t lcd_tick_ms = 0UL; void systick_setup(void) { @@ -84,4 +85,5 @@ void __attribute__((optimize("O3"))) SysTick_Handler() /* Increase tick counters */ wait_tick_ms++; global_tick_ms++; + lcd_tick_ms++; } diff --git a/stm-firmware/ui/lcd.c b/stm-firmware/ui/lcd.c index c2e5379..f44dcb9 100644 --- a/stm-firmware/ui/lcd.c +++ b/stm-firmware/ui/lcd.c @@ -393,7 +393,7 @@ enum lcd_fsm_ret lcd_fsm_write_buffer(const char (*display_buffer)[21]) state_cnt++; break; case 4: - if (!systick_ticks_have_passed(timestamp, 5)) { + if (!systick_ticks_have_passed(timestamp, 4)) { ret = LCD_FSM_WAIT_CALL; } else { ret = LCD_FSM_WAIT_CALL; diff --git a/stm-firmware/ui/menu.c b/stm-firmware/ui/menu.c index becf402..1738467 100644 --- a/stm-firmware/ui/menu.c +++ b/stm-firmware/ui/menu.c @@ -174,6 +174,24 @@ void menu_list_scroll_down(struct menu_list *list) } } +void menu_list_enter_selected_entry(struct menu_list *list, struct lcd_menu *menu) +{ + menu_func_t entry; + + if (!list) + return; + + if (!list->submenu_list) + return; + + entry = list->submenu_list[list->currently_selected]; + + if (!entry) + return; + + menu_entry_enter(menu, entry, false); +} + void menu_list_scroll_up(struct menu_list *list) { if (!list)