Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @file test_i2c.c
- * @version v1.0 (2025-09-14)
- * @brief Реализация smoke-теста для M24C02: init → load/save → verify с выводом на LCD.
- */
- #include <stdio.h> // для snprintf (иначе возможен крэш)
- #include "test_i2c.h"
- #include "lcd_shared.h"
- #include <string.h>
- #include "../../Memory/config_store.h"
- #include "eeprom_24xx.h" // добавь рядом с остальными инклюдами
- #include "config_version.h"
- /* ---------------- Пользовательские настройки теста ---------------- */
- /** Версия структуры ConfigPayload, которую ожидаем в EEPROM. */
- #include "config_version.h" /* CONFIG_VERSION */
- /** Какой I2C использовать для EEPROM: hi2c2 (PB10/PB11). */
- extern I2C_HandleTypeDef hi2c2;
- /** 7-битный адрес EEPROM при A0=A1=A2=GND. */
- #define EE_ADDR_7BIT 0x50
- /* ---------------- Локальные утилиты ---------------- */
- /**
- * @brief Печать строго 20 символов в заданную строку LCD (через RuChar()).
- * @param row Номер строки 0..3.
- * @param s Нуль-терминированная строка (длиннее 20 будет обрезана).
- * @return void
- * @note Буфер локально заполняется пробелами; позиционирование курсора: (0, row).
- */
- static void LCD_Line(uint8_t row, const char *s)
- {
- char buf[21];
- memset(buf, ' ', 20);
- buf[20] = '\0';
- if (s) {
- size_t L = strlen(s);
- if (L > 20) L = 20;
- memcpy(buf, s, L);
- }
- I2C_LCD_SetCursor(MyI2C_LCD, 0, row);
- I2C_LCD_WriteString(MyI2C_LCD, RuChar(buf));
- }
- /* ---------------- Публичный тест ---------------- */
- /**
- * @brief Демонстрационный прогон EEPROM-хранилища:
- * 1) init; 2) попытка load;
- * 3) при отсутствии валидной записи — запись дефолтов;
- * 4) модификация параметра, повторная запись;
- * 5) перечитывание и сравнение с ожидаемым.
- * @param void Нет параметров.
- * @return void Ничего не возвращает.
- * @note Весь прогресс выводится на LCD строками 0..3, с паузами HAL_Delay().
- */
- void Eeprom_SmokeTest(void)
- {
- extern I2C_HandleTypeDef hi2c2;
- ConfigPayload cfg = {0}, back = {0};
- uint8_t used = 0xFF, ver = 0;
- char line[21];
- LCD_Line(0, "EE: init...");
- if (!config_store_init(&hi2c2, 0x50)) {
- LCD_Line(1, "init: ERR (NACK)");
- HAL_Delay(3000);
- return;
- }
- LCD_Line(1, "init: OK");
- /* L1: пробуем загрузить */
- if (!config_store_load(CONFIG_VERSION, &cfg, &used, &ver)) {
- LCD_Line(2, "load: empty -> def");
- config_store_fill_defaults(&cfg);
- LCD_Line(3, "S1...");
- HAL_Delay(3000);
- if (!config_store_save(CONFIG_VERSION, &cfg)) {
- LCD_Line(3, "S1:ERR");
- HAL_Delay(3000);
- return;
- }
- LCD_Line(3, "S1:OK");
- HAL_Delay(3000);
- } else {
- snprintf(line, sizeof(line), "load: OK slot:%c v%u",
- (used==0)?'A':(used==1)?'B':'?', ver);
- LCD_Line(2, line);
- HAL_Delay(3000);
- }
- /* S2/L2: изменить + сохранить + перечитать */
- cfg.fan_t1 += 1;
- /* Стандартизируем значения под правила меню (диапазоны/порядок) */
- config_sanitize(&cfg);
- LCD_Line(3, "S2...");
- HAL_Delay(3000);
- if (!config_store_save(CONFIG_VERSION, &cfg)) {
- LCD_Line(3, "S2:ERR");
- HAL_Delay(3000);
- return;
- }
- LCD_Line(3, "L2...");
- HAL_Delay(3000);
- if (!config_store_load(CONFIG_VERSION, &back, &used, &ver)) {
- LCD_Line(3, "L2:ERR");
- HAL_Delay(3000);
- return;
- }
- if (memcmp(&cfg, &back, sizeof(ConfigPayload)) == 0) {
- snprintf(line, sizeof(line), "OK slot:%c v%u",
- (used==0)?'A':(used==1)?'B':'?', ver);
- LCD_Line(3, line);
- HAL_Delay(3000);
- } else {
- LCD_Line(3, "mismatch!");
- HAL_Delay(3000);
- }
- HAL_Delay(3000);
- }
Advertisement
Add Comment
Please, Sign In to add comment