/* * 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: // { // Shot testShot = GetShot(3); // if(!testShot.isExist){ // testShot.countRepeatShot = 1; // testShot.speedRollerTop = 200; // testShot.speedRollerBottom = 200; // testShot.speedScrew = 100; // testShot.rotationAxial = 90; // testShot.rotationHorizontal = 90; // testShot.rotationVertical = 90; // // SaveShot(3, &testShot); // doShot(&testShot); // } // } break; case IR_PAUSE: { uint8_t buf[32]; uint16_t blockAddr16 = 0; // Начальный адрес блока в EEPROM uint8_t blockAddr[2] = {HIBYTE(blockAddr16), LOBYTE(blockAddr16)}; // Адрес в формате 2 байта // Отправляем адрес в EEPROM if (HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), blockAddr, 2, 1000) == HAL_OK) { HAL_Delay(1); // Небольшая задержка // Читаем данные из EEPROM if (HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1), buf, sizeof(buf), 1000) == HAL_OK) { // Выводим считанные данные for (int i = 0; i < sizeof(buf); ++i) { if (!(i % 8)) print(" "); if (!(i % 32)) print("\n"); char buffer[16]; snprintf(buffer, sizeof(buffer), "%02X ", buf[i]); // Преобразуем байт в шестнадцатеричную строку CDC_Transmit_FS((uint8_t*)buffer, strlen(buffer)); } } else { print("Read Error EEPROM\n"); } } else { print("Address TX Error EEPROM\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: setRollersSpeed(speedUP+=1, speedDown); onHoldRepeat = IR_Home_Process; break; case IR_NUM_2: setScrewkSpeed(screwSpeed+=1); onHoldRepeat = IR_Home_Process; break; case IR_NUM_3: setRollersSpeed(speedUP, speedDown+=1); onHoldRepeat = IR_Home_Process; break; case IR_NUM_7: setRollersSpeed(speedUP-=1, speedDown); onHoldRepeat = IR_Home_Process; break; case IR_NUM_8: setScrewkSpeed(screwSpeed-=1); onHoldRepeat = IR_Home_Process; break; case IR_NUM_9: setRollersSpeed(speedUP, speedDown-=1); onHoldRepeat = IR_Home_Process; break; case IR_NUM_5: setRollersSpeed(100,100); break; case IR_STOP: speedUP = 100; speedDown = 100; screwSpeed = 0; stopShooting(); break; default: break; } } void IR_ShotPrepared(){ InputHandler = IR_ShotPrepared; switch (data.command) { case IR_START: startShooting(); break; default: InputHandler(); break; } }