From cefd0601b91fa642163c82021d454b3c17d8adf4 Mon Sep 17 00:00:00 2001 From: Jan Sucan Date: Sun, 22 Sep 2019 21:17:50 +0200 Subject: Initial commit --- FanController/fan_controller/config.c | 198 ++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 FanController/fan_controller/config.c (limited to 'FanController/fan_controller/config.c') diff --git a/FanController/fan_controller/config.c b/FanController/fan_controller/config.c new file mode 100644 index 0000000..763ad88 --- /dev/null +++ b/FanController/fan_controller/config.c @@ -0,0 +1,198 @@ +/* Autor: Ján Sučan + * + * Zdrojove kody, ich casti a subory z nich vzniknute priamo alebo nepriamo + * (objektove subory, Intel Hex, ...) prosim nepouzivajte komercne, ani ako + * sucast komercnych diel. Vsetky ostatne pripady pouzitia su dovolene. + * + * Please don't use the source codes, their parts and files created from them + * directly or indirectly, (object files, Intel Hex files, ...) for commercial + * purposes, not even as a part of commercial products. All other use cases + * are allowed. + */ + +#include +#include + +/** Hodnota EEPROM ktora oznacuje neinizializovany bajt. */ +#define CONFIG_UNINITIALIZED_VALUE 0xff + +/** Hodnota EEPROM ktora oznacuje inizializovany bajt. */ +#define CONFIG_INITIALIZED_VALUE 0x00 + +/** Adresa v EEPROM, kam sa ulozi priznak inicializacie hodnoty pre mod zobrazenia otacok. */ +#define CONFIG_ADDR_DISP_TYPE_INIT 0x00 + +/** Adresa v EEPROM, kam sa ulozi nastaveny mod zobrazenia otacok. */ +#define CONFIG_ADDR_DISP_TYPE_VALUE 0x01 + +/** Adresa v EEPROM, kam sa ulozi priznak inicializacie sirky pulzu ventilatora na max. otackach. */ +#define CONFIG_ADDR_FAN_MAX_INIT 0x10 + +/** Adresa v EEPROM, kam sa ulozi sirka pulzu ventilatora na max. otackach. */ +#define CONFIG_ADDR_FAN_MAX_VALUE 0x11 + +/** Adresa v EEPROM, kam sa ulozi priznak inicializacie sirky pulzu ventilatora na min. otackach. */ +#define CONFIG_ADDR_FAN_MIN_INIT 0x20 + +/** Adresa v EEPROM, kam sa ulozi sirka pulzu ventilatora na min. otackach. */ +#define CONFIG_ADDR_FAN_MIN_VALUE 0x21 + +/** Predvoleny mod zobrazenia otacok, ak este nebol ziadny zvoleny. */ +#define DISPLAY_TYPE_DEFAULT DISPLAY_TYPE_SET + +static bool config_is_initialized(uint16_t address); +static void config_save(uint16_t address_init, uint16_t address_data, const uint8_t * const data, uint16_t data_size); + +/** + * @brief Zistenie, ci je hodnota v EEPROM inicializovana. + * + * @param address Adresa bajtu v EEPROM. + * @retval true Hodnota je inicializovana. + * @retval false Hodnota nie je inicializovana. + */ +bool +config_is_initialized(uint16_t address) +{ + uint8_t b; + + eeprom_read(address, &b, sizeof(b)); + + return (b != CONFIG_UNINITIALIZED_VALUE); +} + +/** + * @brief Ulozenie dat do EEPROM a nastavenie priznakoveho bajtu inicializacie dat. + * + * @param address_init Adresa priznakoveho bajtu inicializacie dat. + * @param address_data Adresa kam budu zapisane data. + * @param data Ukazovatel na buffer dat pre zapis. + * @param data_size Pocet bajtov pre zapis. + */ +void +config_save(uint16_t address_init, uint16_t address_data, const uint8_t * const data, uint16_t data_size) +{ + // Zapise sa hodnota + eeprom_write(address_data, data, data_size); + // Zapise sa priznak inicializacie hodnoty + uint8_t i = CONFIG_INITIALIZED_VALUE; + eeprom_write(address_init, &i, sizeof(i)); +} + +/** + * @brief Zistenie, ci je type zobrazenia ulozeny v EEPROM inicializovany. + * + * @retval true Typ je inicializovany. + * @retval false Typ nie je inicializovany. + */ +bool +config_disp_type_is_initialized(void) +{ + return config_is_initialized(CONFIG_ADDR_DISP_TYPE_INIT); +} + +/** + * @brief Ulozenie typu zobrazenie do EEPROM. + * + * @param disp_type Typ zobrazenia. + */ +void +config_disp_type_save(uint8_t disp_type) +{ + config_save(CONFIG_ADDR_DISP_TYPE_INIT, CONFIG_ADDR_DISP_TYPE_VALUE, &disp_type, sizeof(disp_type)); +} + +/** + * @brief Nacitanie typu zobrazenia z EEPROM. + * + * Ak este nebolo ziadne zobrazenie ulozene, ulozi sa predvolena hodnota a ta sa aj vrati volajucemu. + * + * @return Typ zobrazenia. + */ +uint8_t +config_disp_type_load(void) +{ + uint8_t display_type = DISPLAY_TYPE_NONE; + + if (config_disp_type_is_initialized()) { + eeprom_read(CONFIG_ADDR_DISP_TYPE_VALUE, &display_type, sizeof(display_type)); + } + + if (display_type >= DISPLAY_TYPE_COUNT) { + display_type = DISPLAY_TYPE_DEFAULT; + config_disp_type_save(display_type); + } + + return display_type; +} + +/** + * @brief Zisti, ci je hodnota sirky pulzu na max. otackach inicializovana v EEPROM. + * + * @retval true Hodnota je inicializovana. + * @retval false Hodnota nie je inicializovana. + */ +bool +config_is_fan_max_rpm_pulse_time_init(void) +{ + return config_is_initialized(CONFIG_ADDR_FAN_MAX_INIT); +} + +/** + * @brief Ulozenie sirky pulzu na max. otackach do EEPROM. + * + * @param pulse_time Sirka pulzu. + */ +void +config_fan_max_rpm_pulse_time_save(uint16_t pulse_time) +{ + config_save(CONFIG_ADDR_FAN_MAX_INIT, CONFIG_ADDR_FAN_MAX_VALUE, (uint8_t *) &pulse_time, sizeof(pulse_time)); +} + +/** + * @brief Nacitanie sirky pulzu na max. otackach z EEPROM. + * + * @return Sirka pulzu. + */ +uint16_t +config_fan_max_rpm_pulse_time_load(void) +{ + uint16_t w; + eeprom_read(CONFIG_ADDR_FAN_MAX_VALUE, (uint8_t *) &w, sizeof(w)); + return w; +} + +/** + * @brief Zisti, ci je hodnota sirky pulzu na min. otackach inicializovana v EEPROM. + * + * @retval true Hodnota je inicializovana. + * @retval false Hodnota nie je inicializovana. + */ +bool +config_is_fan_min_rpm_pulse_time_init(void) +{ + return config_is_initialized(CONFIG_ADDR_FAN_MIN_INIT); +} + +/** + * @brief Ulozenie sirky pulzu na min. otackach do EEPROM. + * + * @param pulse_time Sirka pulzu. + */ +void +config_fan_min_rpm_pulse_time_save(uint16_t pulse_time) +{ + config_save(CONFIG_ADDR_FAN_MIN_INIT, CONFIG_ADDR_FAN_MIN_VALUE, (uint8_t *) &pulse_time, sizeof(pulse_time)); +} + +/** + * @brief Nacitanie sirky pulzu na min. otackach z EEPROM. + * + * @return Sirka pulzu. + */ +uint16_t +config_fan_min_rpm_pulse_time_load(void) +{ + uint16_t w; + eeprom_read(CONFIG_ADDR_FAN_MIN_VALUE, (uint8_t *) &w, sizeof(w)); + return w; +} -- cgit v1.2.3