PingPong/Core/Src/IR_CMD_HandlerLogic.c
2024-09-04 04:01:15 +03:00

208 lines
4.9 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:
// {
// 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:
stopShooting();
break;
default:
break;
}
}
void IR_ShotPrepared(){
InputHandler = IR_ShotPrepared;
switch (data.command) {
case IR_START:
startShooting();
break;
default:
InputHandler();
break;
}
}