This commit is contained in:
DashyFox 2024-10-08 16:51:36 +03:00
parent 53bf72d071
commit 08b99d8ec2
9 changed files with 287 additions and 102 deletions

View File

@ -12,7 +12,7 @@
#define STAT_BLOCKSIZE 128 #define STAT_BLOCKSIZE 128
#define START_ADR_SHOT (START_ADR_STAT+STAT_BLOCKSIZE) #define START_ADR_SHOT (START_ADR_STAT+STAT_BLOCKSIZE)
#define SHOT_BLOCKSIZE 10 #define SHOT_BLOCKSIZE 8
#define MAX_SHOT_COUNT 256 #define MAX_SHOT_COUNT 256
#define START_ADR_PROGRAM (START_ADR_SHOT + (SHOT_BLOCKSIZE*MAX_SHOT_COUNT)) #define START_ADR_PROGRAM (START_ADR_SHOT + (SHOT_BLOCKSIZE*MAX_SHOT_COUNT))

View File

@ -15,6 +15,7 @@
// 1 - setPos IMMEDIATELY // 1 - setPos IMMEDIATELY
#define PRE_RUN_DELAY_MODE 0 #define PRE_RUN_DELAY_MODE 0
#define NOBALL_TIMEOUT_MULTIPLIER 4.2 #define NOBALL_TIMEOUT_MULTIPLIER 4.2
#define NOBALL_TIMEOUT_HARD 20000
typedef enum ServoMap{ typedef enum ServoMap{
SERVO_AXIAL = 0, SERVO_AXIAL = 0,
@ -94,6 +95,7 @@ void setPos(uint8_t axial, uint8_t horizontal, uint8_t vertical);
void setPosSingle(ServoMap servo, uint8_t value); void setPosSingle(ServoMap servo, uint8_t value);
void setPosFromShot(Shot* shot); void setPosFromShot(Shot* shot);
void setPosDefault(); void setPosDefault();
void setPosOff();
void setPosDefaultSingle(ServoMap servo); void setPosDefaultSingle(ServoMap servo);
// 0 .. 100 // 0 .. 100

View File

@ -4,4 +4,4 @@ extern I2C_HandleTypeDef hi2c1;
void initPCA9685(void); void initPCA9685(void);
void SetServo(uint8_t channel, uint8_t angel); void SetServo(uint8_t channel, uint8_t angel);
void SetServoOFF(uint8_t channel);

View File

@ -365,6 +365,7 @@ MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number,
if ((startAddr == START_ADR_SHOT && number > MAX_SHOT_COUNT) if ((startAddr == START_ADR_SHOT && number > MAX_SHOT_COUNT)
|| (startAddr == START_ADR_PROGRAM && number > MAX_PROGRAM_COUNT) || (startAddr == START_ADR_PROGRAM && number > MAX_PROGRAM_COUNT)
|| (startAddr == START_ADR_MACRO && number > MAX_MACRO_COUNT)) { || (startAddr == START_ADR_MACRO && number > MAX_MACRO_COUNT)) {
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
return EEPROM_OUT_OF_RANGE; return EEPROM_OUT_OF_RANGE;
} }
@ -379,8 +380,14 @@ MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number,
HAL_Delay(1); HAL_Delay(1);
result = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1) | 1, readData, result = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1) | 1, readData,
dataSize, 10); dataSize, 10);
print("FLASH_ReadBlock: ");
printNumber(blockAddr16);
// print("\n");
HAL_Delay(1); HAL_Delay(1);
if (result != HAL_OK) { if (result != HAL_OK) {
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
return EEPROM_FAIL; return EEPROM_FAIL;
} }
return EEPROM_OK; return EEPROM_OK;

View File

@ -120,6 +120,8 @@ void IR_Home_Process() {
default: default:
break; break;
} }
}else if(currentInfo.state != RUN){
startShooting(infoBlock.hwInfo.timings.preRun);
} }
break; break;
@ -209,8 +211,85 @@ void IR_Home_Process() {
// } // }
// led_clear(); // led_clear();
break; break;
{
sound_play_note((Note_t){0, 0, 50},3);
Shot wrShot;
wrShot.isExist = 0xAA;
wrShot.countRepeatShot = 0xBB;
wrShot.rotationAxial = 0xCC;
wrShot.rotationHorizontal = 0xDD;
wrShot.rotationVertical = 0xEE;
wrShot.speedRollerBottom = 0xFF;
wrShot.speedRollerTop = 0x0F;
wrShot.speedScrew = 0xF0;
case IR_FRONT_MID: { for (int i = 0; i < MAX_SHOT_COUNT; ++i) {
print("SAVE ");
printNumber(i);
print(" -> ");
MemoryStatus saveStat = saveShot(i, &wrShot);
if(saveStat == EEPROM_OK){
print("OK");
} else {
print("EEPROM_FAIL");
}
print(" -> ");
HAL_Delay(100);
print(" READ -> ");
Shot rShoot = {0};
MemoryStatus status = getShot(i, &rShoot);
print(" ");
switch (status) {
case EEPROM_FAIL:
print("EEPROM_FAIL");
break;
case EEPROM_MISSING_ELEMENT:
print("EEPROM_MISSING_ELEMENT");
break;
case EEPROM_OUT_OF_RANGE:
print("EEPROM_OUT_OF_RANGE");
break;
case EEPROM_WRONG_STARTADDR:
print("EEPROM_WRONG_STARTADDR");
break;
case EEPROM_OK:
print("EEPROM_OK");
break;
default:
print("???");
break;
}
print(" - > ");
if(memcmp(&rShoot, &wrShot, sizeof(Shot)) == 0){
print("OK\n");
} else {
print("ERROR !!!!!!!!!!!!!!!!!!!!!\n");
}
}
print("\n");
////////////////////////////////////////////
Program wrProg = {0};
wrProg.header.countRepeat = 0x11;
wrProg.header.options = 0x22;
wrProg.header.shotCount = 0x33;
memset(&wrProg.shots, 0x44, sizeof(wrProg.shots));
for (int i = 0; i < MAX_PROGRAM_COUNT; ++i){
}
////////////////////////////////////////////
for (int i = 0; i < MAX_MACRO_COUNT; ++i){
}
}
break;
case IR_FRONT_MID:
break;
sound_play_note((Note_t){0, 0, 50},3);
EEPROM_EARSE();
// {
// uint8_t i2c_address; // uint8_t i2c_address;
// HAL_StatusTypeDef result; // HAL_StatusTypeDef result;
// //
@ -237,55 +316,57 @@ void IR_Home_Process() {
// } // }
break; break;
case IR_FRONT_LEFT: { case IR_FRONT_LEFT:
// uint8_t buf[1024]; // Буфер для чтения данных размером 128 байт break;
// uint16_t blockAddr16 = START_ADR_MACRO; // Начальный адрес EEPROM {
// uint8_t blockAddr[2] = { (uint8_t) (blockAddr16 >> 8), uint8_t buf[1024]; // Буфер для чтения данных размером 128 байт
// (uint8_t) (blockAddr16 & 0xFF) }; // Адрес в формате 2 байта uint16_t blockAddr16 = START_ADR_SHOT; // Начальный адрес EEPROM
// int max_attempts = 15; // Максимальное количество попыток для операции uint8_t blockAddr[2] = { (uint8_t) (blockAddr16 >> 8),
// int attempts = 0; // Счетчик попыток (uint8_t) (blockAddr16 & 0xFF) }; // Адрес в формате 2 байта
// HAL_StatusTypeDef status; int max_attempts = 15; // Максимальное количество попыток для операции
// int attempts = 0; // Счетчик попыток
// do { HAL_StatusTypeDef status;
// // Отправляем адрес в EEPROM
// status = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), do {
// blockAddr, 2, 1000); // Отправляем адрес в EEPROM
// if (status != HAL_OK) { status = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1),
// HAL_Delay(1); // Задержка перед повтором blockAddr, 2, 1000);
// attempts++; if (status != HAL_OK) {
// continue; // Переход к следующей попытке HAL_Delay(1); // Задержка перед повтором
// } attempts++;
// continue; // Переход к следующей попытке
// HAL_Delay(1); // Небольшая задержка }
//
// // Читаем 128 байт данных из EEPROM HAL_Delay(1); // Небольшая задержка
// status = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1) | 1,
// buf, sizeof(buf), 1000); // Читаем 128 байт данных из EEPROM
// if (status == HAL_OK) { status = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1) | 1,
// // Данные успешно считаны, выводим их buf, sizeof(buf), 1000);
// char buffer[16]; if (status == HAL_OK) {
// for (int i = 0; i < sizeof(buf); ++i) { // Данные успешно считаны, выводим их
// if (i % 8 == 0) char buffer[16];
// print(" "); for (int i = 0; i < sizeof(buf); ++i) {
// if (i % 32 == 0) if (i % 8 == 0)
// print("\n"); print(" ");
// if (i % 32 == 0)
// snprintf(buffer, sizeof(buffer), "%02X ", buf[i]); // Преобразуем байт в шестнадцатеричную строку print("\n");
// CDC_Transmit_FS((uint8_t*) buffer, strlen(buffer));
// } snprintf(buffer, sizeof(buffer), "%02X ", buf[i]); // Преобразуем байт в шестнадцатеричную строку
// break; // Выход из попыток, если чтение успешно CDC_Transmit_FS((uint8_t*) buffer, strlen(buffer));
// } else { }
// print("Read Error EEPROM\n"); break; // Выход из попыток, если чтение успешно
// HAL_Delay(1); // Задержка перед повтором } else {
// attempts++; print("Read Error EEPROM\n");
// } HAL_Delay(1); // Задержка перед повтором
// } while (attempts < max_attempts); attempts++;
// }
// if (status != HAL_OK) { } while (attempts < max_attempts);
// print("Failed to read EEPROM after multiple attempts\n");
// } if (status != HAL_OK) {
// print("\n\n\n"); print("Failed to read EEPROM after multiple attempts\n");
// } }
print("\n\n\n");
}
break; break;
default: default:

View File

@ -30,6 +30,10 @@ uint32_t lastIndicationTime = 0;
uint32_t noBallTimer = 0; uint32_t noBallTimer = 0;
uint32_t noBallTimeout = 0xFFFFFFFF; uint32_t noBallTimeout = 0xFFFFFFFF;
uint32_t stop_timer = 0;
uint32_t stop_timer_TIMEOUT = 0;
uint8_t onStopExecuted = 1;
void BallEXT_Handler(); void BallEXT_Handler();
void robotStateStart(uint32_t delayTime); void robotStateStart(uint32_t delayTime);
void pauseShooting(); void pauseShooting();
@ -43,6 +47,12 @@ uint8_t loadShotFromProgram(CurrentProgram *currentProg);
uint8_t loadNextProgramInMacro(CurrentMacro *currentMacro); uint8_t loadNextProgramInMacro(CurrentMacro *currentMacro);
uint8_t loadProgramFromMacro(CurrentMacro *currentMacro); uint8_t loadProgramFromMacro(CurrentMacro *currentMacro);
void setPosOffDelay(uint16_t ms){
stop_timer = millis();
stop_timer_TIMEOUT = ms;
onStopExecuted = 0;
}
void robotStateStart(uint32_t delayTime) { void robotStateStart(uint32_t delayTime) {
currentInfo.state = PRERUN_WAIT; currentInfo.state = PRERUN_WAIT;
currentInfo.startDelay = delayTime; currentInfo.startDelay = delayTime;
@ -58,6 +68,8 @@ void pauseShooting() {
void robotStateStop() { void robotStateStop() {
currentInfo.state = STOP; currentInfo.state = STOP;
stop_timer = millis();
onStopExecuted = 0;
} }
long map(long x, long in_min, long in_max, long out_min, long out_max) { long map(long x, long in_min, long in_max, long out_min, long out_max) {
@ -98,6 +110,12 @@ void Robot_INIT() {
} }
led_clear(); led_clear();
melody(melody_start); melody(melody_start);
setPosOffDelay(1000);
// SetServoOFF(0);
// SetServoOFF(1);
// SetServoOFF(2);
} }
void BallEXT() { void BallEXT() {
@ -105,11 +123,24 @@ void BallEXT() {
ballReact_timer = millis(); ballReact_timer = millis();
} }
void setPosOff(){
SetServoOFF(0);
SetServoOFF(1);
SetServoOFF(2);
}
void RobotTick() { void RobotTick() {
BallEXT_Handler(); BallEXT_Handler();
led_tick(); led_tick();
sound_tick(); sound_tick();
if(onStopExecuted == 0 && millis() - stop_timer > stop_timer_TIMEOUT){
onStopExecuted = 1;
setPosOff();
}
// No Ball Handler // No Ball Handler
if (currentInfo.state == RUN && millis() - noBallTimer > noBallTimeout) { if (currentInfo.state == RUN && millis() - noBallTimer > noBallTimeout) {
if(currentInfo.mode == DebugShot){ if(currentInfo.mode == DebugShot){
@ -128,6 +159,13 @@ void RobotTick() {
infoBlock.hwInfo.servos[SERVO_HORIZONTAL].def, infoBlock.hwInfo.servos[SERVO_HORIZONTAL].def,
infoBlock.hwInfo.servos[SERVO_VERTICAL].min); infoBlock.hwInfo.servos[SERVO_VERTICAL].min);
print("NO BALL!!!"); print("NO BALL!!!");
setPosOffDelay(1000);
// SetServoOFF(0);
// SetServoOFF(1);
// SetServoOFF(2);
} }
// PreRun delay // PreRun delay
@ -174,6 +212,12 @@ uint8_t prepareShot(uint8_t number) {
currentInfo.mode = ShotMode; currentInfo.mode = ShotMode;
currentInfo.shot.shot = shot; currentInfo.shot.shot = shot;
currentInfo.shot.indexGlobal = number; currentInfo.shot.indexGlobal = number;
currentInfo.shot.currentBallCount = 0;
// setPosDefault();
Shot* firstShot = &currentInfo.shot.shot;
setPos(firstShot->rotationAxial, firstShot->rotationHorizontal, firstShot->rotationVertical);
melody(melody_OK); melody(melody_OK);
return 1; return 1;
} else { } else {
@ -192,6 +236,18 @@ uint8_t prepareProgramm(uint8_t number) {
currentInfo.mode = ProgramMode; currentInfo.mode = ProgramMode;
currentInfo.program.program = program; currentInfo.program.program = program;
currentInfo.program.indexGlobal = number; currentInfo.program.indexGlobal = number;
currentInfo.program.currentShotIndexLocal = 0;
currentInfo.program.currentBallCount = 0;
if (!loadShotFromProgram(&currentInfo.program)) {
print("loadShotFromProgram ERR\n");
melody(melody_Error);
return 0;
}
Shot* firstShot = &currentInfo.program.currentShot.shot;
setPos(firstShot->rotationAxial, firstShot->rotationHorizontal, firstShot->rotationVertical);
melody(melody_OK); melody(melody_OK);
return 1; return 1;
} else { } else {
@ -211,6 +267,24 @@ uint8_t prepareMacro(uint8_t number) {
currentInfo.mode = MacroMode; currentInfo.mode = MacroMode;
currentInfo.macro.macro = macro; currentInfo.macro.macro = macro;
currentInfo.macro.indexGlobal = number; currentInfo.macro.indexGlobal = number;
currentInfo.macro.currentProgramIndexLocal = 0;
currentInfo.macro.currentBallCount = 0;
if (!loadProgramFromMacro(&currentInfo.macro)) {
print("loadProgramFromMacro ERR\n");
melody(melody_Error);
return 0;
}
if (!loadShotFromProgram(&currentInfo.macro.currentProgram)) {
print("loadShotFromProgram in macro ERR\n");
melody(melody_Error);
return 0;
}
Shot* firstShot = &currentInfo.macro.currentProgram.currentShot.shot;
setPos(firstShot->rotationAxial, firstShot->rotationHorizontal, firstShot->rotationVertical);
melody(melody_OK); melody(melody_OK);
return 1; return 1;
} else { } else {
@ -534,7 +608,12 @@ void stopShooting() {
setScrewkSpeed(0); setScrewkSpeed(0);
setRollersSpeed(100, 100); setRollersSpeed(100, 100);
setPosDefault(); // setPosDefault();
setPosOffDelay(1000);
// SetServoOFF(0);
// SetServoOFF(1);
// SetServoOFF(2);
} }
void shotApply(CurrentShot *currentShot) { void shotApply(CurrentShot *currentShot) {
@ -543,9 +622,10 @@ void shotApply(CurrentShot *currentShot) {
shot->rotationVertical); shot->rotationVertical);
setRollersSpeed(shot->speedRollerTop, shot->speedRollerBottom); setRollersSpeed(shot->speedRollerTop, shot->speedRollerBottom);
setScrewkSpeed(shot->speedScrew); setScrewkSpeed(shot->speedScrew);
noBallTimeout = MIN( // noBallTimeout = MIN(
calculatePeriod( shot->speedScrew) * NOBALL_TIMEOUT_MULTIPLIER, // calculatePeriod( shot->speedScrew) * NOBALL_TIMEOUT_MULTIPLIER,
30000); // 30000);
noBallTimeout = NOBALL_TIMEOUT_HARD;
noBallTimer = millis(); noBallTimer = millis();
////////////////////////// LED //////////////////////////////////////// ////////////////////////// LED ////////////////////////////////////////

View File

@ -178,36 +178,36 @@ int main(void)
/* Infinite loop */ /* Infinite loop */
/* USER CODE BEGIN WHILE */ /* USER CODE BEGIN WHILE */
const char* getStateString(State state) { // const char* getStateString(State state) {
switch (state) { // switch (state) {
case STOP: // case STOP:
return "STOP"; // return "STOP";
case RUN: // case RUN:
return "RUN"; // return "RUN";
case PAUSE: // case PAUSE:
return "PAUSE"; // return "PAUSE";
case PRERUN_WAIT: // case PRERUN_WAIT:
return "PRERUN_WAIT"; // return "PRERUN_WAIT";
default: // default:
return "UNKNOWN"; // return "UNKNOWN";
} // }
} // }
const char* getModeString(Mode mode) { // const char* getModeString(Mode mode) {
switch (mode) { // switch (mode) {
case NoneMode: // case NoneMode:
return "NoneMode"; // return "NoneMode";
case ShotMode: // case ShotMode:
return "ShotMode"; // return "ShotMode";
case ProgramMode: // case ProgramMode:
return "ProgramMode"; // return "ProgramMode";
case MacroMode: // case MacroMode:
return "MacroMode"; // return "MacroMode";
case DebugShot: // case DebugShot:
return "DebugShot"; // return "DebugShot";
default: // default:
return "UNKNOWN"; // return "UNKNOWN";
} // }
} // }
while (1) { while (1) {
@ -221,16 +221,16 @@ int main(void)
// unsigned char text[] = "Hello\n"; // unsigned char text[] = "Hello\n";
// printNumber(SysTick->LOAD); // printNumber(SysTick->LOAD);
// CDC_Transmit_FS(text, sizeof(text)); // CDC_Transmit_FS(text, sizeof(text));
//
char buffer[100]; // char buffer[100];
extern uint32_t vsk1; // extern uint32_t vsk1;
extern uint32_t vsk2; // extern uint32_t vsk2;
extern uint16_t timing1; // extern uint16_t timing1;
extern uint16_t timing2; // extern uint16_t timing2;
sprintf(buffer, // sprintf(buffer,
"timing1: %u ms, timing2: %u ms, vsk1: %u RPM, vsk2: %u RPM\n", // "timing1: %u ms, timing2: %u ms, vsk1: %u RPM, vsk2: %u RPM\n",
timing1, timing2, vsk1, vsk2); // timing1, timing2, vsk1, vsk2);
CDC_Transmit_FS((uint8_t*) buffer, strlen(buffer)); // CDC_Transmit_FS((uint8_t*) buffer, strlen(buffer));
// char buffer[64]; // char buffer[64];
// sprintf(buffer, "Current mode: %s, Current state: %s\n", // sprintf(buffer, "Current mode: %s, Current state: %s\n",

View File

@ -35,3 +35,16 @@ void SetServo(uint8_t channel, uint8_t angel)
HAL_I2C_Master_Transmit(&hi2c1, (PCA9685_ADRESS << 1), bufer, 5, 10); HAL_I2C_Master_Transmit(&hi2c1, (PCA9685_ADRESS << 1), bufer, 5, 10);
} }
void SetServoOFF(uint8_t channel)
{
uint8_t bufer[5];
bufer[0] = 6 + channel*4; //channel register adress
bufer[1] = 0; //start time for "on" Lowbyte (0..4095)
bufer[2] = 0; //start time for "on" HIbyte
bufer[3] = 0&0xFF; //start time for "off" Lowbyte (0..4095)
bufer[4] = 0>>8;; //start time for "off" HIbyte
HAL_I2C_Master_Transmit(&hi2c1, (PCA9685_ADRESS << 1), bufer, 5, 10);
}

14
TODO.md
View File

@ -1,8 +1,10 @@
Баги: Баги:
При сбоях UART вешает его и иногда не переинициализирует даже после рестарта контроллера При сбоях UART вешает оранж и иногда не переинициализирует даже после рестарта контроллера
debug mode todo...
Логика: Логика:
Ограничение скорости роликов! V Ограничение скорости роликов!
V Ограничение углов сервы V Ограничение углов сервы
V Начальное смещение V Начальное смещение
@ -39,7 +41,7 @@ IR:
V Правильное переключение выстрелов с учётом repeatCount V Правильное переключение выстрелов с учётом repeatCount
V Переключение выстрелов в программе V Переключение выстрелов в программе
V Переключение программ в макро V Переключение программ в макро
Правильная функция паузы V Правильная функция паузы
Индикация: Индикация:
V Текущий буфер индикации V Текущий буфер индикации
@ -49,9 +51,9 @@ IR:
V Процесс удаления V Процесс удаления
Звук: Звук:
Звук приёма IR V Звук приёма IR
Звук ошибки V Звук ошибки
Звук включения V Звук включения