Issue #26: Add configuration for overtemperature flag to safety controller and include the config in the memory checking
This commit is contained in:
		@@ -193,6 +193,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
 | 
				
			|||||||
	case CAL_START:
 | 
						case CAL_START:
 | 
				
			||||||
		/* Clear errors of PT1000 reading */
 | 
							/* Clear errors of PT1000 reading */
 | 
				
			||||||
		safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
 | 
							safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
 | 
				
			||||||
 | 
							safety_controller_ack_flag(ERR_FLAG_OVERTEMP);
 | 
				
			||||||
		adc_pt1000_get_resistance_calibration(&offset, &sens_dev, &cal_active);
 | 
							adc_pt1000_get_resistance_calibration(&offset, &sens_dev, &cal_active);
 | 
				
			||||||
		if (cal_active) {
 | 
							if (cal_active) {
 | 
				
			||||||
			shellmatta_printf(shell, "Already calibrated.\r\n\tOffset: %f\r\n\tSens: %f\r\n", offset, sens_dev);
 | 
								shellmatta_printf(shell, "Already calibrated.\r\n\tOffset: %f\r\n\tSens: %f\r\n", offset, sens_dev);
 | 
				
			||||||
@@ -213,6 +214,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
 | 
				
			|||||||
					ret_val = SHELLMATTA_BUSY;
 | 
										ret_val = SHELLMATTA_BUSY;
 | 
				
			||||||
					shellmatta_printf(shell, "Measurement...\r\n");
 | 
										shellmatta_printf(shell, "Measurement...\r\n");
 | 
				
			||||||
					safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
 | 
										safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
 | 
				
			||||||
 | 
										safety_controller_ack_flag(ERR_FLAG_OVERTEMP);
 | 
				
			||||||
					data_buffer = calibration_acquire_data_start(512UL, &flag);
 | 
										data_buffer = calibration_acquire_data_start(512UL, &flag);
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				} else if (stdin_data[i] == '\x03') {
 | 
									} else if (stdin_data[i] == '\x03') {
 | 
				
			||||||
@@ -264,6 +266,7 @@ shellmatta_retCode_t calibration_sequence_shell_cmd(shellmatta_handle_t shell, c
 | 
				
			|||||||
					ret_val = SHELLMATTA_BUSY;
 | 
										ret_val = SHELLMATTA_BUSY;
 | 
				
			||||||
					shellmatta_printf(shell, "Measurement...\r\n");
 | 
										shellmatta_printf(shell, "Measurement...\r\n");
 | 
				
			||||||
					safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
 | 
										safety_controller_ack_flag(ERR_FLAG_MEAS_ADC_WATCHDOG);
 | 
				
			||||||
 | 
										safety_controller_ack_flag(ERR_FLAG_OVERTEMP);
 | 
				
			||||||
					data_buffer = calibration_acquire_data_start(512UL, &flag);
 | 
										data_buffer = calibration_acquire_data_start(512UL, &flag);
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				} else if (stdin_data[i] == '\x03') {
 | 
									} else if (stdin_data[i] == '\x03') {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -129,6 +129,11 @@ enum analog_value_monitor {
 | 
				
			|||||||
#define SAFETY_EXT_WATCHDOG_RCC_MASK RCC_AHB1ENR_GPIODEN
 | 
					#define SAFETY_EXT_WATCHDOG_RCC_MASK RCC_AHB1ENR_GPIODEN
 | 
				
			||||||
#define SAFETY_EXT_WATCHDOG_PIN (12)
 | 
					#define SAFETY_EXT_WATCHDOG_PIN (12)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Default Limit of the overtemperature detection
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define SAFETY_DEFAULT_OVERTEMP_LIMIT_DEGC (260.0f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief Key used to lock the safety flags coming from the measurment ADC from external ack'ing
 | 
					 * @brief Key used to lock the safety flags coming from the measurment ADC from external ack'ing
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -250,7 +250,22 @@ int safety_controller_get_timing_mon_name_by_index(uint32_t index, char *buffer,
 | 
				
			|||||||
 * @brief Get the count of timing monitors
 | 
					 * @brief Get the count of timing monitors
 | 
				
			||||||
 * @return Timing monitor count
 | 
					 * @return Timing monitor count
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
uint32_t safety_controller_get_timing_monitor_count();
 | 
					uint32_t safety_controller_get_timing_monitor_count(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Set the overtemperature limit and store it permanently in the EEPROM
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If no EEPROM is present, this will fail. The default value @ref SAFETY_DEFAULT_OVERTEMP_LIMIT_DEGC will be used.
 | 
				
			||||||
 | 
					 * @param over_temperature Over temperature to set
 | 
				
			||||||
 | 
					 * @return 0 if successfully saved and applied, negative if error
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int safety_controller_configure_overtemp_limit(float over_temperature);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Read the current overtemperature limit.
 | 
				
			||||||
 | 
					 * @return Over temperature limit
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					float safety_controller_get_overtemp_limit(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __SAFETY_CONTROLLER_H__ */
 | 
					#endif /* __SAFETY_CONTROLLER_H__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,7 @@
 | 
				
			|||||||
#include <reflow-controller/oven-driver.h>
 | 
					#include <reflow-controller/oven-driver.h>
 | 
				
			||||||
#include <helper-macros/helper-macros.h>
 | 
					#include <helper-macros/helper-macros.h>
 | 
				
			||||||
#include <stm-periph/rcc-manager.h>
 | 
					#include <stm-periph/rcc-manager.h>
 | 
				
			||||||
 | 
					#include <reflow-controller/temp-converter.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief Macro that checks if a given @ref error_flag is persistent
 | 
					 * @brief Macro that checks if a given @ref error_flag is persistent
 | 
				
			||||||
@@ -144,6 +145,13 @@ struct analog_mon {
 | 
				
			|||||||
	uint64_t timestamp;
 | 
						uint64_t timestamp;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct overtemp_config {
 | 
				
			||||||
 | 
						uint32_t crc_dummy_seed;
 | 
				
			||||||
 | 
						float overtemp_deg_celsius;
 | 
				
			||||||
 | 
						float overtemp_equiv_resistance;
 | 
				
			||||||
 | 
						uint32_t crc;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief All safety error flags.
 | 
					 * @brief All safety error flags.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -234,6 +242,45 @@ static volatile struct safety_weight IN_SECTION(.ccm.bss) flag_weights[COUNT_OF(
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
static uint32_t IN_SECTION(.ccm.bss) flag_weight_crc;
 | 
					static uint32_t IN_SECTION(.ccm.bss) flag_weight_crc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Configuration struct containing the overtemperature flag configuration
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static struct overtemp_config IN_SECTION(.ccm.bss) safety_controller_overtemp_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief Configure the overtemperature flag's settings
 | 
				
			||||||
 | 
					 * @param over_temperature Temperature to set the limit to.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void set_overtemp_config(float over_temperature)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int result;
 | 
				
			||||||
 | 
						float resistance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result = temp_convertet_convert_temp_to_resistance(over_temperature, &resistance);
 | 
				
			||||||
 | 
						/* An error in this function is really bad... */
 | 
				
			||||||
 | 
						if (result < -1)
 | 
				
			||||||
 | 
							panic_mode();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						crc_unit_reset();
 | 
				
			||||||
 | 
						safety_controller_overtemp_config.crc_dummy_seed = 0xA4F5C7E6UL;
 | 
				
			||||||
 | 
						safety_controller_overtemp_config.overtemp_deg_celsius = over_temperature;
 | 
				
			||||||
 | 
						safety_controller_overtemp_config.overtemp_equiv_resistance = resistance;
 | 
				
			||||||
 | 
						crc_unit_input_array((const uint32_t *)&safety_controller_overtemp_config, wordsize_of(struct overtemp_config) - 1);
 | 
				
			||||||
 | 
						safety_controller_overtemp_config.crc = crc_unit_get_crc();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool over_temperature_config_check(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (safety_controller_overtemp_config.crc_dummy_seed != 0xA4F5C7E6UL)
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						crc_unit_reset();
 | 
				
			||||||
 | 
						crc_unit_input_array((const uint32_t *)&safety_controller_overtemp_config, wordsize_of(struct overtemp_config) - 1);
 | 
				
			||||||
 | 
						if (crc_unit_get_crc() != safety_controller_overtemp_config.crc)
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief Convert a flag enum to the flag number.
 | 
					 * @brief Convert a flag enum to the flag number.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -721,6 +768,9 @@ void safety_controller_init()
 | 
				
			|||||||
	init_safety_flag_persistencies_from_default();
 | 
						init_safety_flag_persistencies_from_default();
 | 
				
			||||||
	apply_config_overrides();
 | 
						apply_config_overrides();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Set the default limit of the overtemperature check */
 | 
				
			||||||
 | 
						set_overtemp_config(SAFETY_DEFAULT_OVERTEMP_LIMIT_DEGC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (found_memory_state == SAFETY_MEMORY_INIT_CORRUPTED)
 | 
						if (found_memory_state == SAFETY_MEMORY_INIT_CORRUPTED)
 | 
				
			||||||
		safety_controller_report_error(ERR_FLAG_SAFETY_MEM_CORRUPT);
 | 
							safety_controller_report_error(ERR_FLAG_SAFETY_MEM_CORRUPT);
 | 
				
			||||||
	else if (found_memory_state == SAFETY_MEMORY_INIT_VALID_MEMORY) {
 | 
						else if (found_memory_state == SAFETY_MEMORY_INIT_VALID_MEMORY) {
 | 
				
			||||||
@@ -842,6 +892,7 @@ static void safety_controller_handle_safety_adc()
 | 
				
			|||||||
 *    Aditionally, the default flag weights are restored from Flash.
 | 
					 *    Aditionally, the default flag weights are restored from Flash.
 | 
				
			||||||
 * 3) The flag persistency table is CRC checked. In case of an error, the @ref ERR_FLAG_SAFETY_TAB_CORRUPT flag is set.
 | 
					 * 3) The flag persistency table is CRC checked. In case of an error, the @ref ERR_FLAG_SAFETY_TAB_CORRUPT flag is set.
 | 
				
			||||||
 *    Aditionally, the default values of the flag persistence is restored from Flash.
 | 
					 *    Aditionally, the default values of the flag persistence is restored from Flash.
 | 
				
			||||||
 | 
					 * 4) Check the Overtemperature flag configuration structure
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void safety_controller_handle_memory_checks(void)
 | 
					static void safety_controller_handle_memory_checks(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -870,6 +921,12 @@ static void safety_controller_handle_memory_checks(void)
 | 
				
			|||||||
			safety_controller_report_error(ERR_FLAG_SAFETY_TAB_CORRUPT);
 | 
								safety_controller_report_error(ERR_FLAG_SAFETY_TAB_CORRUPT);
 | 
				
			||||||
			init_safety_flag_persistencies_from_default();
 | 
								init_safety_flag_persistencies_from_default();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* check overtemp struct */
 | 
				
			||||||
 | 
							if (over_temperature_config_check()) {
 | 
				
			||||||
 | 
								safety_controller_report_error(ERR_FLAG_SAFETY_TAB_CORRUPT);
 | 
				
			||||||
 | 
								set_overtemp_config(SAFETY_DEFAULT_OVERTEMP_LIMIT_DEGC);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1220,4 +1277,15 @@ int safety_controller_get_timing_mon_by_index(uint32_t index, struct timing_moni
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int safety_controller_set_overtemp_limit(float over_temperature)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						set_overtemp_config(over_temperature);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float safety_controller_get_overtemp_limit(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return safety_controller_overtemp_config.overtemp_deg_celsius;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** @} */
 | 
					/** @} */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user