PingPong/Core/Src/IR_CMD_HandlerLogic.c
2024-09-10 01:40:51 +03:00

292 lines
8.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* IR_CMD_HandlerLogic.c
*
* Created on: Aug 26, 2024
* Author: DashyFox
*/
#include "IR_CMD_Handler.h"
#include "IR.h"
#include "ShiftReg.h"
#include "RobotFunctions.h"
#include "Print.h"
enum IR_MENU {
IR_MENU_Home,
IR_MENU_SHOT, IR_MENU_PROGR, IR_MENU_MACRO, IR_MENU_,
};
// <<
extern void (*InputHandler)(void); // ProcessFunc
extern void (*onHoldRepeat)(void);
extern uint16_t inputParam; // current input parameter
// >>
extern IRData data;
// ()
extern void NullFunc(); // null func for paramEnter(NullFunc);
extern void paramEnter(void (*onEnter_)()); // setParamFunc for enter
void IR_ShotPrepared();
void onSelectShot() {
if (prepareShot(inputParam)) {
InputHandler = IR_ShotPrepared;
} else {
paramEnter(onSelectShot);
print("Shot not found\n");
// Shot not found
}
}
unsigned char b1 = 1;
unsigned char b2 = 1;
unsigned char b3 = 1;
uint8_t screwSpeed;
uint8_t speedUP = 100;
uint8_t speedDown = 100;
void IR_Home_Process() {
InputHandler = IR_Home_Process;
SetShiftReg_inline(0xff, 0, 0);
switch (data.command) {
case IR_FONT_RIGHT:
case IR_SHOT:
paramEnter(onSelectShot);
break;
// case IR_PROG:
//// paramEnter(onSelectShot);
// break;
//
// case IR_FRONT_MID:
// SetShiftReg_inline(0, 0, 0);
// b1 = b2 = b3 = 0;
// break;
case IR_FRONT_LEFT:
SetShiftReg_inline(++b1, ++b2, ++b3);
onHoldRepeat = 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;
}
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(5); // Задержка перед повтором
attempts++;
continue; // Переход к следующей попытке
}
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");
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");
}
}
break;
case IR_DEBUG: {
uint8_t i2c_address;
HAL_StatusTypeDef result;
print("Scan\n");
// Перебираем все возможные адреса на шине I2C (7 бит, от 0x08 до 0x77)
for (i2c_address = 0x08; i2c_address <= 0x77; i2c_address++) {
// Отправляем запрос на указанный адрес (HAL_I2C_Master_Transmit без данных)
result = HAL_I2C_IsDeviceReady(&hi2c1, (i2c_address << 1), 1, 100);
if (result == HAL_OK) {
// Если устройство отвечает, выводим его адрес
print("Found I2C at: ");
printNumber(i2c_address);
print("\n");
} else {
// Если устройство не отвечает, продолжаем сканирование
print(".");
}
HAL_Delay(10); // Задержка для стабильности сканирования
}
print("\nScanning completed.\n");
}
break;
case IR_NUM_1:
break;
case IR_NUM_2:
break;
case IR_NUM_3:
break;
case IR_NUM_7:
break;
case IR_NUM_8:
break;
case IR_NUM_9:
break;
case IR_NUM_5:
break;
case IR_STOP:
speedUP = 100;
speedDown = 100;
screwSpeed = 0;
stopShooting();
break;
case IR_TEMPO_INC:
if (screwSpeed < 100) {
setScrewkSpeed(++screwSpeed);
}
onHoldRepeat = IR_Home_Process;
break;
case IR_TEMPO_DEC:
if (screwSpeed > 0) {
setScrewkSpeed(--screwSpeed);
}
onHoldRepeat = IR_Home_Process;
break;
case IR_ENGINE_UP_INC:
if (speedUP < 200) {
setRollersSpeed(++speedUP, speedDown);
}
onHoldRepeat = IR_Home_Process;
break;
case IR_ENGINE_UP_DEC:
if (speedUP > 0) {
setRollersSpeed(--speedUP, speedDown);
}
onHoldRepeat = IR_Home_Process;
break;
case IR_ENGINE_DOWM_INC:
if (speedDown < 200) {
setRollersSpeed(speedUP, ++speedDown);
}
onHoldRepeat = IR_Home_Process;
break;
case IR_ENGINE_DOWM_DEC:
if (speedDown > 0) {
setRollersSpeed(speedUP, --speedDown);
}
onHoldRepeat = IR_Home_Process;
break;
default:
break;
}
}
void IR_ShotPrepared() {
InputHandler = IR_ShotPrepared;
switch (data.command) {
case IR_START:
startShooting();
break;
default:
InputHandler();
break;
}
}