mirror of
https://github.com/DashyFox/StackSport.git
synced 2025-05-04 07:10:17 +00:00
267 lines
6.3 KiB
C
267 lines
6.3 KiB
C
/*
|
|
* RobotFunctions.c
|
|
*
|
|
* Created on: Aug 28, 2024
|
|
* Author: DashyFox
|
|
*/
|
|
|
|
#include "RobotFunctions.h"
|
|
#include "pca9685.h"
|
|
#include "UART3_Handler.h"
|
|
#include "EEPROM.h"
|
|
#include "ShiftReg.h"
|
|
#include "Print.h"
|
|
|
|
uint8_t isPause = 0;
|
|
uint8_t isShooting = 0;
|
|
|
|
CurrentInfo currentInfo;
|
|
|
|
extern int16_t Vz1;
|
|
extern int16_t Vz2;
|
|
unsigned char Shiftreg[3];
|
|
|
|
int16_t map(int16_t x, int16_t in_min, int16_t in_max, int16_t out_min,
|
|
int16_t out_max) {
|
|
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
|
}
|
|
void Robot_INIT() {
|
|
memset(¤tInfo, 0x00, sizeof(currentInfo));
|
|
// NULL
|
|
currentInfo.shot.index = 0xFF;
|
|
currentInfo.program.index = 0xFF;
|
|
currentInfo.macro.index = 0xFF;
|
|
initPCA9685();
|
|
EEPROM_INIT();
|
|
UART3_START();
|
|
|
|
setPosDefault();
|
|
Shiftreg[0] = 0x00;
|
|
Shiftreg[1] = 0x44;
|
|
Shiftreg[2] = 0x00;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x00;
|
|
Shiftreg[1] = 0x66;
|
|
Shiftreg[2] = 0x00;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x00;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x00;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x01;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x01;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x03;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x03;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x07;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x07;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x0F;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x0F;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x1F;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x1F;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x3F;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x3F;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x7F;
|
|
Shiftreg[1] = 0x77;
|
|
Shiftreg[2] = 0x7F;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
Shiftreg[0] = 0x00;
|
|
Shiftreg[1] = 0x00;
|
|
Shiftreg[2] = 0x00;
|
|
SetShiftReg(Shiftreg);
|
|
HAL_Delay(10);
|
|
|
|
//testing
|
|
|
|
}
|
|
|
|
void doShot(Shot *shot) {
|
|
SetServo(0, shot->rotationHorizontal);
|
|
SetServo(1, shot->rotationVertical);
|
|
SetServo(2, shot->rotationAxial);
|
|
Vz1 = shot->speedRollerTop;
|
|
Vz2 = shot->speedRollerBottom;
|
|
setScrewkSpeed(shot->speedScrew);
|
|
}
|
|
|
|
void startShooting() {
|
|
switch (currentInfo.mode) {
|
|
case ShotMode:
|
|
print("StartShooting\n");
|
|
if (currentInfo.shot.shot.isExist) {
|
|
print("Fire!\n");
|
|
|
|
print("isExist ");
|
|
printNumber(currentInfo.shot.shot.isExist);
|
|
print("countRepeatShot; ");
|
|
printNumber(currentInfo.shot.shot.countRepeatShot);
|
|
print("speedRollerTop; ");
|
|
printNumber(currentInfo.shot.shot.speedRollerTop);
|
|
print("speedRollerBottom; ");
|
|
printNumber(currentInfo.shot.shot.speedRollerBottom);
|
|
print("speedScrew; ");
|
|
printNumber(currentInfo.shot.shot.speedScrew);
|
|
print("rotationAxial; ");
|
|
printNumber(currentInfo.shot.shot.rotationAxial);
|
|
print("rotationHorizontal; ");
|
|
printNumber(currentInfo.shot.shot.rotationHorizontal);
|
|
print("rotationVertical; ");
|
|
printNumber(currentInfo.shot.shot.rotationVertical);
|
|
|
|
currentInfo.state.isShooting = 1;
|
|
doShot(¤tInfo.shot.shot);
|
|
} else {
|
|
print("Current Shot is NULL\n");
|
|
// TODO: sound_ERR(); ledFX_ERR();
|
|
}
|
|
break;
|
|
case ProgramMode:
|
|
|
|
break;
|
|
case MacroMode:
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void stopShooting() {
|
|
currentInfo.state.isPause = 0;
|
|
currentInfo.state.isShooting = 0;
|
|
|
|
setScrewkSpeed(0);
|
|
setRollersSpeed(100, 100);
|
|
setPosDefault();
|
|
}
|
|
|
|
void doShotForever(uint8_t number) {
|
|
|
|
}
|
|
|
|
uint8_t prepareShot(uint8_t number) {
|
|
Shot shot;
|
|
getShot(number, &shot);
|
|
if (shot.isExist) {
|
|
currentInfo.mode = ShotMode;
|
|
currentInfo.shot.shot = shot;
|
|
return 1;
|
|
} else {
|
|
// TODO: sound_ERR(); ledFX_ERR();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void setPosSingle(ServoMap servo, uint8_t value) {
|
|
ServoSetting* currentServo = &infoBlock.hwInfo.servos[servo];
|
|
uint8_t inv = currentServo->invert;
|
|
if (servo == SERVO_AXIAL)
|
|
inv = !inv;
|
|
|
|
uint8_t deviationToMax = currentServo->max > currentServo->def
|
|
? currentServo->max - currentServo->def
|
|
: currentServo->def - currentServo->max;
|
|
|
|
uint8_t deviationToMin = currentServo->def > currentServo->min
|
|
? currentServo->def - currentServo->min
|
|
: currentServo->min - currentServo->def;
|
|
|
|
uint8_t maxDeviation = (deviationToMax > deviationToMin) ? deviationToMax : deviationToMin;
|
|
uint8_t minLimit = (currentServo->def >= maxDeviation) ? currentServo->def - maxDeviation : 0;
|
|
uint8_t maxLimit = (currentServo->def + maxDeviation <= 180) ? currentServo->def + maxDeviation : 180;
|
|
if (value > maxLimit) {
|
|
value = maxLimit;
|
|
} else if (value < minLimit) {
|
|
value = minLimit;
|
|
}
|
|
if (inv)
|
|
value = 180 - value;
|
|
SetServo(servo, value);
|
|
}
|
|
|
|
|
|
void setPos(uint8_t axial, uint8_t horizontal, uint8_t vertical) {
|
|
setPosSingle(SERVO_AXIAL, axial);
|
|
setPosSingle(SERVO_HORIZONTAL, horizontal);
|
|
setPosSingle(SERVO_VERTICAL, vertical);
|
|
}
|
|
void setPosDefault() {
|
|
setPos(infoBlock.hwInfo.servos[SERVO_AXIAL].def,
|
|
infoBlock.hwInfo.servos[SERVO_HORIZONTAL].def,
|
|
infoBlock.hwInfo.servos[SERVO_VERTICAL].def);
|
|
}
|
|
void setPosDefaultSingle(ServoMap servo) {
|
|
setPosSingle(servo, infoBlock.hwInfo.servos[servo].def);
|
|
}
|
|
|
|
// 0 .. 100
|
|
void setScrewkSpeed(uint8_t speed) {
|
|
|
|
// if(speed < 0) speed = 0;
|
|
if (speed > 100)
|
|
speed = 100;
|
|
|
|
// speed = map(speed, 0, 100, infoBlock.hwInfo.motors.speed_Screw_min, 100);
|
|
if (speed && speed < infoBlock.hwInfo.motors.speed_Screw_min)
|
|
speed = infoBlock.hwInfo.motors.speed_Screw_min;
|
|
|
|
TIM1->CCR1 = 0;
|
|
TIM1->CCR2 = (uint16_t) (40 * speed);
|
|
}
|
|
|
|
//(-v) 0 .. 100(stop) .. 200(+v)
|
|
void setRollersSpeed(uint8_t up, uint8_t down) {
|
|
|
|
if (up < 100) {
|
|
// up = map(up, 0, 100, 0, 100 - infoBlock.hwInfo.motors.speed_Screw_min);
|
|
// if (100 - up < min_speed) {
|
|
// up = 100 - min_speed;
|
|
// }
|
|
} else {
|
|
// up = map(up, 0, 100, 0, 100 + infoBlock.hwInfo.motors.speed_Screw_min);
|
|
// if (up - 100 < min_speed) { // Ограничиваем положительную скорость минимальной
|
|
// up = 100 + min_speed;
|
|
// }
|
|
}
|
|
|
|
if (down < 100) {
|
|
// map(down, 0, 100, 0, 100 - infoBlock.hwInfo.motors.speed_Screw_min);
|
|
|
|
} else {
|
|
// map(down, 0, 100, 0, 100 + infoBlock.hwInfo.motors.speed_Screw_min);
|
|
|
|
}
|
|
|
|
Vz1 = 200 - up; // invert
|
|
Vz2 = down;
|
|
}
|
|
// shot sequence
|
|
void startProgram() {
|
|
|
|
}
|
|
// shot sequence
|
|
void startMacro() {
|
|
|
|
}
|