mirror of
https://github.com/DashyFox/StackSport.git
synced 2025-05-04 07:10:17 +00:00
292 lines
8.1 KiB
C
292 lines
8.1 KiB
C
/*
|
||
* 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;
|
||
}
|
||
}
|