/* * 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 "Indicator.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_ShootingStart(); void onSelectShot() { if (prepareShot(inputParam)) { InputHandler = IR_ShootingStart; } else { paramEnter(onSelectShot); print("Shot not found\n"); // Shot not found } } void onSelectProgram() { if (prepareProgramm(inputParam)) { InputHandler = IR_ShootingStart; } else { paramEnter(onSelectShot); print("Shot not found\n"); // Shot not found } } void onSelectMacro() { if (prepareMacro(inputParam)) { InputHandler = IR_ShootingStart; } 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; // onHoldRepeat = IR_Home_Process; void IR_Home_Process() { InputHandler = IR_Home_Process; switch (data.command) { case IR_SHOT: paramEnter(onSelectShot); break; case IR_PROG: { paramEnter(onSelectProgram); break; } case IR_MACRO: { paramEnter(onSelectMacro); break; } case IR_F_BTN: { break; } case IR_PAUSE: if (currentInfo.state == RUN) { currentInfo.state = PAUSE; } break; case IR_START: if (currentInfo.state == PAUSE) { currentInfo.state = RUN; } 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: { 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 (currentInfo.shot.shot.speedScrew < 100) { currentInfo.shot.shot.speedScrew++; shotApply(¤tInfo.shot); // led_progressbar(10, 19, currentInfo.shot.shot.speedScrew); //todo: led_progressbarTMP } onHoldRepeat = IR_Home_Process; break; case IR_TEMPO_DEC: if (currentInfo.shot.shot.speedScrew > 0) { currentInfo.shot.shot.speedScrew--; shotApply(¤tInfo.shot); } onHoldRepeat = IR_Home_Process; break; case IR_ENGINE_UP_INC: if (currentInfo.shot.shot.speedRollerTop < 200) { currentInfo.shot.shot.speedRollerTop++; shotApply(¤tInfo.shot); } onHoldRepeat = IR_Home_Process; break; case IR_ENGINE_UP_DEC: if (currentInfo.shot.shot.speedRollerTop > 0) { currentInfo.shot.shot.speedRollerTop--; shotApply(¤tInfo.shot); } onHoldRepeat = IR_Home_Process; break; case IR_ENGINE_DOWM_INC: if (currentInfo.shot.shot.speedRollerBottom < 200) { currentInfo.shot.shot.speedRollerBottom++; shotApply(¤tInfo.shot); } onHoldRepeat = IR_Home_Process; break; case IR_ENGINE_DOWM_DEC: if (currentInfo.shot.shot.speedRollerBottom > 0) { currentInfo.shot.shot.speedRollerBottom--; shotApply(¤tInfo.shot); } onHoldRepeat = IR_Home_Process; break; ///////////////////////////////////////////////////////// case IR_FONT_RIGHT: for (int i = 0; i <= 100; ++i) { led_progressbar(0, 19, i); HAL_Delay(10); } led_clear(); break; case IR_FRONT_MID: { 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_FRONT_LEFT: { uint8_t buf[1024]; // Буфер для чтения данных размером 128 байт uint16_t blockAddr16 = START_ADR_MACRO; // Начальный адрес 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; // Переход к следующей попытке } HAL_Delay(1); // Небольшая задержка // Читаем 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); if (status != HAL_OK) { print("Failed to read EEPROM after multiple attempts\n"); } print("\n\n\n"); } break; default: break; } } void IR_ShootingStart() { InputHandler = IR_ShootingStart; switch (data.command) { case IR_START: startShooting(infoBlock.hwInfo.timings.preRun); break; default: InputHandler(); break; } }