#include #include "sys_api.h" #include "sys_hal.h" #include "settings_api.h" #include "common_config.h" #include "common.h" #include #include //static bool backup_done = false; // bool sys_set_default(sys_settings_t *settings) { memcpy(settings->sn, SN_DEFAULT, SN_LEN); snprintf(settings->prod_date, PROD_LEN, "00.00.00"); memset(settings->test_state, 0, TS_LEN); settings->control_word = SETTINGS_CONTROL_WORD; settings->crc = SYS_GetCRC(settings); return true; } // uint32_t SYS_GetCRC(sys_settings_t *settings) { crc_data_reset(); return crc_block_calculate((uint32_t *)settings, sizeof(*settings)/4 - 1); } // bool sys_settings_load(sys_settings_t *settings) { uint32_t loadCRC; // CRC из flash uint32_t newCRC; // CRC загруженной структуры настроек bool need_default = false; if (!settings) return false; SYS_ReadFromFlash((uint8_t*)settings, sizeof(*settings), SYS_SECTOR); // Считываем CRC из флеш памяти loadCRC = (*(uint32_t*)SYS_CRC_ADDRESS); // Рассчитываем CRC для структуры настроек newCRC = SYS_GetCRC(settings); // Если CRC не совпадают нужно прошивать дефолтные настройки if (loadCRC != newCRC) { DBG printf("Bad system sector CRC. Factory defaults restored.\r\n"); need_default = true; } // CRC совпала, проверяем контрольное слово если слово не совпадает // то это значит, что поплыла структура нстроек, прошиваем дефолт */ else if (settings->control_word != SETTINGS_CONTROL_WORD) { DBG printf("Bad system sector control word. Factory defaults restored.\r\n"); need_default = true; } // Прошиваем дефолтные настройки если нужно if (need_default) { sys_set_default(settings); sys_save(settings); } DBG sys_print(settings); return true; } // Запись структуры настроек во flash bool sys_save(sys_settings_t *settings) { uint32_t crc_user = 0; if (!settings) return false; crc_user = SYS_GetCRC(settings); SYS_WriteToFlash((uint8_t*)settings, sizeof(*settings), crc_user); return true; } // void sys_print(sys_settings_t *settings) { char str[20]; printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n"); printf(" Системные настройки:\r\n"); memset(str, 0, 20); memcpy(str, settings->sn, SN_LEN); printf("\tСерийный номер: %s\r\n", str); printf("\tДата производства: "); printf("%s\r\n", settings->prod_date); printf("\tСтатус тестирования: "); printf("%s\r\n", settings->test_state); printf("\tКонтрольное слово: "); printf("%u\r\n", settings->control_word); printf("\tCRC: "); printf("0x%X\r\n", settings->crc); printf("\r\n\n"); } // Очистить сектор системных настроек void sys_clear(void) { flash_unlock(); SYS_EraseFlashSector(); flash_lock(); }