Compare commits

...

2 Commits

2 changed files with 131 additions and 22 deletions

View File

@ -40,7 +40,7 @@
#include <reflow-controller/shell-uart-config.h> #include <reflow-controller/shell-uart-config.h>
#include <reflow-controller/oven-driver.h> #include <reflow-controller/oven-driver.h>
#include <fatfs/ff.h> #include <fatfs/ff.h>
#include <reflow-controller/reflow-menu.h> #include <reflow-controller/ui/gui.h>
#include <reflow-controller/safety/safety-controller.h> #include <reflow-controller/safety/safety-controller.h>
#include <reflow-controller/settings/settings.h> #include <reflow-controller/settings/settings.h>
@ -141,33 +141,17 @@ static bool mount_sd_card_if_avail(bool mounted)
return mounted; return mounted;
} }
static void setup_unused_pins(void)
{
int i;
rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_GPIOEEN));
GPIOE->MODER = 0UL;
for (i = 0; i < 16; i++)
GPIOE->PUPDR |= PULLDOWN(i);
rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(RCC_AHB1ENR_GPIOEEN));
}
static inline void setup_system(void) static inline void setup_system(void)
{ {
setup_nvic_priorities(); setup_nvic_priorities();
systick_setup(); systick_setup();
oven_driver_init(); oven_driver_init();
digio_setup_default_all(); digio_setup_default_all();
led_setup(); led_setup();
loudspeaker_setup(); loudspeaker_setup();
reflow_menu_init(); gui_init();
uart_gpio_config(); uart_gpio_config();
setup_shell_uart(&shell_uart); setup_shell_uart(&shell_uart);
setup_unused_pins();
safety_controller_init(); safety_controller_init();
adc_pt1000_setup_meas(); adc_pt1000_setup_meas();
} }
@ -220,7 +204,7 @@ int main(void)
quarter_sec_timestamp = systick_get_global_tick(); quarter_sec_timestamp = systick_get_global_tick();
} }
menu_wait_request = reflow_menu_handle(); menu_wait_request = gui_handle();
handle_shell_uart_input(shell_handle); handle_shell_uart_input(shell_handle);
safety_controller_handle(); safety_controller_handle();

View File

@ -477,11 +477,136 @@ return_value:
return ret; return ret;
} }
int safety_memory_insert_config_override(struct config_override *config_override);
int safety_memory_get_config_override_count(uint32_t *count); static uint32_t convert_config_override_to_word(const struct config_override *conf_override)
{
uint32_t data = 0;
int safety_memory_get_config_override(uint32_t idx, struct config_override *config_override); if (conf_override->type == SAFETY_MEMORY_CONFIG_OVERRIDE_WEIGHT) {
data |= 0xAA0000A2UL;
data |= ((uint32_t)conf_override->entry.weight_override.flag) << 16;
data |= ((uint32_t)conf_override->entry.weight_override.weight) << 8;
} else if (conf_override->type == SAFETY_MEMORY_CONFIG_OVERRIDE_PERSISTANCE) {
data |= 0xBB00008EUL;
data |= ((uint32_t)conf_override->entry.persistance_override.flag) << 16;
data |= ((uint32_t)conf_override->entry.persistance_override.persistance) << 8;
}
return data;
}
int safety_memory_insert_config_override(struct config_override *config_override)
{
struct safety_memory_header header;
uint32_t idx;
uint32_t data;
int res;
int ret = -3;
if (safety_memory_get_header(&header) != SAFETY_MEMORY_INIT_VALID_MEMORY) {
return -2000;
}
if (header.config_overrides_len == 0)
return -1;
for (idx = 0; idx < header.config_overrides_len; idx++) {
res = backup_ram_get_data(header.config_overrides_offset + idx, &data, 1UL);
if (res)
return -2;
if (data == 0UL) {
data = convert_config_override_to_word(config_override);
res = backup_ram_write_data(header.config_overrides_offset + idx, &data, 1UL);
if (res)
return -4;
res = safety_memory_gen_crc();
if (res)
return -5;
ret = 0;
break;
}
}
return ret;
}
int safety_memory_get_config_override_count(uint32_t *count)
{
struct safety_memory_header header;
uint32_t iter;
uint32_t valid_count;
uint32_t data;
int res;
if (!count)
return -1001;
*count = 0UL;
if (safety_memory_get_header(&header) != SAFETY_MEMORY_INIT_VALID_MEMORY) {
return -2000;
}
if (header.config_overrides_len == 0)
return 0;
valid_count = 0;
for (iter = 0; iter < header.config_overrides_len; iter++) {
res = backup_ram_get_data(header.config_overrides_offset + iter, &data, 1UL);
if (res)
return -2;
if (data != 0)
valid_count++;
else
break;
}
*count = valid_count;
return 0;
}
int safety_memory_get_config_override(uint32_t idx, struct config_override *config_override)
{
struct safety_memory_header header;
uint32_t data;
int res;
if (!config_override)
return -1002;
if (safety_memory_get_header(&header) != SAFETY_MEMORY_INIT_VALID_MEMORY) {
return -2000;
}
if (idx >= header.config_overrides_len) {
return -1001;
}
res = backup_ram_get_data(header.config_overrides_offset + idx, &data, 1UL);
if (res) {
return -1;
}
switch (data & 0xFF) {
case 0xA2:
/* Weight override */
config_override->type = SAFETY_MEMORY_CONFIG_OVERRIDE_WEIGHT;
config_override->entry.weight_override.flag = (data & 0xFF0000UL) >> 16;
config_override->entry.weight_override.weight = (data & 0xFF00UL) >> 8;
break;
case 0x8E:
/* persistance override */
config_override->type = SAFETY_MEMORY_CONFIG_OVERRIDE_PERSISTANCE;
config_override->entry.persistance_override.flag = (data & 0xFF0000UL) >> 16;
config_override->entry.persistance_override.persistance = (data & 0xFF00UL) >> 8;
break;
default:
return -2;
}
return 0;
}
int safety_memory_dump_base64(char *buffer, size_t buffsize, size_t *used_size) int safety_memory_dump_base64(char *buffer, size_t buffsize, size_t *used_size)
{ {