EEPROM and USB CDC

This commit is contained in:
2024-09-11 00:32:41 +03:00
parent beb5ed6be3
commit 419c55d807
8 changed files with 336 additions and 225 deletions

View File

@ -73,109 +73,72 @@ void IR_Home_Process() {
break;
case IR_F_BTN: {
InfoBlock infoBlock;
// Чтение структуры InfoBlock из EEPROM
MemoryStatus status = getInfoBlock(&infoBlock);
if (status != EEPROM_OK) {
char errorMsg[] = "Error reading InfoBlock from EEPROM\n";
CDC_Transmit_FS((uint8_t*)errorMsg, strlen(errorMsg));
break;
}
// Буфер для строки вывода
char buffer[128];
// Вывод информации о HardwareInit_t
snprintf(buffer, sizeof(buffer), "Hardware Initialization:\n");
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Servo 1: Invert=%u, Min=%u, Default=%u, Max=%u\n",
infoBlock.hwInfo.servos[0].invert, infoBlock.hwInfo.servos[0].min,
infoBlock.hwInfo.servos[0].def, infoBlock.hwInfo.servos[0].max);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Servo 2: Invert=%u, Min=%u, Default=%u, Max=%u\n",
infoBlock.hwInfo.servos[1].invert, infoBlock.hwInfo.servos[1].min,
infoBlock.hwInfo.servos[1].def, infoBlock.hwInfo.servos[1].max);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Servo 3: Invert=%u, Min=%u, Default=%u, Max=%u\n",
infoBlock.hwInfo.servos[2].invert, infoBlock.hwInfo.servos[2].min,
infoBlock.hwInfo.servos[2].def, infoBlock.hwInfo.servos[2].max);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Motors: Speed_Rollers_Min=%u, Speed_Screw_Min=%u\n",
infoBlock.hwInfo.motors.speed_Rollers_min, infoBlock.hwInfo.motors.speed_Screw_min);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
// Вывод информации о DelayTimes
snprintf(buffer, sizeof(buffer), "Timings: PreRun=%u\n", infoBlock.hwInfo.timings.preRun);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
// Вывод информации о Statistics
snprintf(buffer, sizeof(buffer), "Statistics:\n");
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Total Shots: %lu\n", infoBlock.statInfo.totalShots);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Total Programs: %lu\n", infoBlock.statInfo.totalPrograms);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Total Macros: %lu\n", infoBlock.statInfo.totalMacros);
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
break;
EEPROM_INIT();
}
break;
case IR_PAUSE: {
uint8_t buf[1024]; // Буфер для чтения данных размером 128 байт
uint16_t blockAddr16 = 0; // Начальный адрес EEPROM
uint8_t blockAddr[2] = { (uint8_t) (blockAddr16 >> 8),
(uint8_t) (blockAddr16 & 0xFF) }; // Адрес в формате 2 байта
int max_attempts = 15; // Максимальное количество попыток для операции
int attempts = 0; // Счетчик попыток
HAL_StatusTypeDef status;
case IR_PAUSE:
{
uint8_t buf[8]; // Буфер для чтения данных размером 128 байт
uint16_t blockAddr16 = 0; // Начальный адрес EEPROM
uint8_t blockAddr[2] = { (uint8_t)(blockAddr16 >> 8), (uint8_t)(blockAddr16 & 0xFF) }; // Адрес в формате 2 байта
int max_attempts = 15; // Максимальное количество попыток для операции
int attempts = 0; // Счетчик попыток
HAL_StatusTypeDef status;
do {
// Отправляем адрес в EEPROM
status = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1),
blockAddr, 2, 1000);
if (status != HAL_OK) {
HAL_Delay(1); // Задержка перед повтором
attempts++;
continue; // Переход к следующей попытке
}
do {
// Отправляем адрес в EEPROM
status = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), blockAddr, 2, 1000);
if (status != HAL_OK) {
HAL_Delay(5); // Задержка перед повтором
attempts++;
continue; // Переход к следующей попытке
}
HAL_Delay(1); // Небольшая задержка
HAL_Delay(5); // Небольшая задержка
// Читаем 128 байт данных из EEPROM
status = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1) | 1,
buf, sizeof(buf), 1000);
if (status == HAL_OK) {
// Данные успешно считаны, выводим их
char buffer[16];
for (int i = 0; i < sizeof(buf); ++i) {
if (i % 8 == 0)
print(" ");
if (i % 32 == 0)
print("\n");
// Читаем 128 байт данных из EEPROM
status = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1) | 1, buf, sizeof(buf), 1000);
if (status == HAL_OK) {
// Данные успешно считаны, выводим их
char buffer[16];
for (int i = 0; i < sizeof(buf); ++i) {
if (i % 8 == 0) print(" ");
if (i % 32 == 0) print("\n");
snprintf(buffer, sizeof(buffer), "%02X ", buf[i]); // Преобразуем байт в шестнадцатеричную строку
CDC_Transmit_FS((uint8_t*) buffer, strlen(buffer));
}
break; // Выход из попыток, если чтение успешно
} else {
print("Read Error EEPROM\n");
HAL_Delay(1); // Задержка перед повтором
attempts++;
}
} while (attempts < max_attempts);
snprintf(buffer, sizeof(buffer), "%02X ", buf[i]); // Преобразуем байт в шестнадцатеричную строку
CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer));
}
break; // Выход из попыток, если чтение успешно
} else {
print("Read Error EEPROM\n");
HAL_Delay(5); // Задержка перед повтором
attempts++;
}
} while (attempts < max_attempts);
if (status != HAL_OK) {
print("Failed to read EEPROM after multiple attempts\n");
}
if (status != HAL_OK) {
print("Failed to read EEPROM after multiple attempts\n");
}
print("\n\n\n");
}
break;
break;
case IR_ESC: {
if (EEPROM_EARSE() != EEPROM_OK) {
char errorMsg[] = "Error EEPROM_EARSE\n\n";
CDC_Transmit_FS((uint8_t*) errorMsg, strlen(errorMsg));
} else {
char doneMsg[] = "EEPROM_EARSE Done\n\n";
CDC_Transmit_FS((uint8_t*) doneMsg, strlen(doneMsg));
}
}
break;
case IR_DEBUG: {
uint8_t i2c_address;