diff --git a/stm-firmware/include/reflow-controller/settings/settings-sd-card.h b/stm-firmware/include/reflow-controller/settings/settings-sd-card.h index c657069..e59d50a 100644 --- a/stm-firmware/include/reflow-controller/settings/settings-sd-card.h +++ b/stm-firmware/include/reflow-controller/settings/settings-sd-card.h @@ -21,4 +21,8 @@ #ifndef __SETTINGS_SETTINGS_SD_CARD_H__ #define __SETTINGS_SETTINGS_SD_CARD_H__ +#define CALIBRATION_FILE_NAME "cal.toml" + +int sd_card_settings_save_calibration(float sens_deviation, float offset); + #endif /* __SETTINGS_SETTINGS_SD_CARD_H__ */ diff --git a/stm-firmware/include/reflow-controller/settings/settings.h b/stm-firmware/include/reflow-controller/settings/settings.h index de4ba2b..4197e69 100644 --- a/stm-firmware/include/reflow-controller/settings/settings.h +++ b/stm-firmware/include/reflow-controller/settings/settings.h @@ -22,6 +22,12 @@ #ifndef __SETTINGS_SETTINGS_H__ #define __SETTINGS_SETTINGS_H__ -int settings_save_calibration(); +/** + * @brief Save the calibration + * @param sens_deviation + * @param offset + * @return 0 if successful, -1 if generic error, -2 if medium unavailable + */ +int settings_save_calibration(float sens_deviation, float offset); #endif /* __SETTINGS_SETTINGS_H__ */ diff --git a/stm-firmware/settings/settings-sd-card.c b/stm-firmware/settings/settings-sd-card.c index 5239091..cb8fc8b 100644 --- a/stm-firmware/settings/settings-sd-card.c +++ b/stm-firmware/settings/settings-sd-card.c @@ -19,3 +19,90 @@ */ #include +#include +#include +#include + +static void get_controller_folder_path(char *path, size_t size) +{ + uint32_t high; + uint32_t mid; + uint32_t low; + + if (!path) + return; + + unique_id_get(&high, &mid, &low); + + snprintf(path, size, "/%08X-%08X-%08X", + (unsigned int)high, (unsigned int)mid, (unsigned int)low); +} + +/** + * @brief Open or create the controller folder on the SD Card. + * @param[in,out] controller_folder + * @return 0 if opened, 1 if created and opened, -1 if error. + */ +static int open_or_create_controller_folder(DIR *controller_folder) +{ + char foldername[48]; + int ret = -1; + FRESULT filesystem_result; + + if (!controller_folder) + return -1001; + + get_controller_folder_path(foldername, sizeof(foldername)); + + /* Check if folder is present */ + filesystem_result = f_opendir(controller_folder, foldername); + if (filesystem_result == FR_OK) { + ret = 0; + } else { + filesystem_result = f_mkdir(foldername); + if (filesystem_result == FR_OK) { + filesystem_result = f_opendir(controller_folder, foldername); + if (filesystem_result == FR_OK) + ret = 1; + else + ret = -1; + } else { + ret = -1; + } + } + + if (ret >= 0) + f_chdir(foldername); + + return ret; +} + +int sd_card_settings_save_calibration(float sens_deviation, float offset) +{ + DIR folder; + FIL cal_file; + int status; + FRESULT res; + UINT bw; + int ret = 0; + + status = open_or_create_controller_folder(&folder); + f_closedir(&folder); + + if (status < 0) + return -2; + + /* Create new calibration file */ + res = f_open(&cal_file, CALIBRATION_FILE_NAME, FA_CREATE_ALWAYS | FA_WRITE); + if (res == FR_OK) { + f_write(&cal_file, "Test", 4U, &bw); + f_close(&cal_file); + ret = 0; + } else { + ret = -1; + } + + f_chdir("/"); + + return ret; +} diff --git a/stm-firmware/settings/settings.c b/stm-firmware/settings/settings.c index a93b356..806babc 100644 --- a/stm-firmware/settings/settings.c +++ b/stm-firmware/settings/settings.c @@ -19,8 +19,10 @@ */ #include +#include -int settings_save_calibration() +settings_save_calibration(float sens_deviation, float offset) { - return 0; + /* There is no other configuration location besides the SD card (yet) */ + return sd_card_settings_save_calibration(sens_deviation, offset); }