#include #include "sys_api.h" #include "sys_hal.h" #include "settings_api.h" #include "common_config.h" #include "common.h" #include #ifdef PRINTF_STDLIB #include #endif #ifdef PRINTF_CUSTOM #include "tinystdio.h" #endif // Backup old style device mac and serial // TODO Remove when all old devices will be updated #define BACKUP_OLD_SYS static char mac_backup[MAC_LEN]; static char serial_backup[MAC_LEN]; static bool backup_done = false; #ifdef BACKUP_OLD_SYS bool SYS_BackupInfo(char *mac, char *serial) { snprintf(mac_backup, MAC_LEN, mac); snprintf(serial_backup, SER_LEN, serial); backup_done = true; return backup_done; } bool SYS_RestoreInfo(SYS_t *settings) { if (backup_done) { snprintf(settings->mac, MAC_LEN, mac_backup); snprintf(settings->serial, SER_LEN, serial_backup); return true; } return false; } #endif bool SYS_SetDefault(SYS_t *settings) { if (!settings) return false; #ifdef BACKUP_OLD_SYS // Try to backup device MAC and serial. if (sSettings.CritSecCRC == SETTINGS_GetCritSecCRC()) { if (SYS_BackupInfo(sSettings.sInfo.mac, sSettings.sInfo.serialNumber)) { SDBG printf("Sys info backupped\r\n"); SDBG printf("MAC: %s\r\n", sSettings.sInfo.mac); SDBG printf("Serial: %s\r\n", sSettings.sInfo.serialNumber); } else { SDBG printf("Sys info back up error!\r\n"); } } // Try to restore device MAC and serial. // If not, store defaults if (!SYS_RestoreInfo(settings)) { snprintf(settings->mac, MAC_LEN, SYS_MAC); snprintf(settings->serial, SER_LEN, SYS_SERIAL); SDBG printf("Sys info restore error! Defaults used.\r\n"); } else { SDBG printf("Sys info restored!\r\n"); } #endif snprintf(settings->customer, CUST_LEN, SYS_CUSTOMER); snprintf(settings->proddate, PROD_LEN, "00.00.00"); memset(settings->testState, 0, 16); settings->controlword = SETTINGS_CONTROL_WORD; return true; } /** * @brief * @retval */ uint32_t SYS_GetCRC(SYS_t *settings) { crc_data_reset(); return crc_block_calculate((uint32_t *)settings, sizeof(*settings)/4 - 1); } /** * @brief Загрузка структуры системных настроек из flash */ bool SYS_Load(SYS_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) { SDBG printf("Bad system sector CRC. Factory defaults restored.\r\n"); need_default = true; } // CRC совпала, проверяем контрольное слово если слово не совпадает // то это значит, что поплыла структура нстроек, прошиваем дефолт */ else if (settings->controlword != SETTINGS_CONTROL_WORD) { SDBG printf("Bad system sector control word. Factory defaults restored.\r\n"); need_default = true; } // Прошиваем дефолтные настройки если нужно if (need_default) { SYS_SetDefault(settings); SYS_Save(settings); } SDBG SYS_Print(settings); return true; } /** * @brief Запись структуры настроек во flash */ bool SYS_Save(SYS_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_t *settings) { printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n"); printf(" Системные настройки"); printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n\n"); printf("\tMAC: "); printf("%s\r\n", settings->mac); printf("\tСерийный номер: "); printf("%s\r\n", settings->serial); printf("\tПроизводитель: "); printf("%s\r\n", settings->customer); printf("\tДата производства: "); printf("%s\r\n", settings->proddate); printf("\tСтатус тестирования: "); printf("%s\r\n", settings->testState); printf("\tКонтрольное слово: "); printf("%u\r\n", settings->testState); printf("\tCRC: "); printf("%X\r\n", settings->testState); }