Files
servo_moteurs/MyTCPClient.cpp
2024-04-18 17:59:15 +02:00

241 lines
7.5 KiB
C++

#include "MyTCPClient.h"
MyTCPClient::MyTCPClient(const char *serverIP, int port) : TCPClient(serverIP, port), pca() {
this->pwm_init();
}
void MyTCPClient::handleMessage(const std::string &message) {
std::vector<std::string> token = TCPSocket::split(message, ";");
if (token.size() != 4) {
std::cerr << "Message invalide: " << message << std::endl;
return;
}
if (token[1] == "servo_moteur" || token[1] == "all") {
std::cout << message << std::endl;
if (token[2] == "ping") {
this->sendMessage("servo_moteur;ihm;pong;1");
}
else if (token[2] == "ouvrir pince") {
int pince = std::stoi(token[3]);
std::cout << "ouvrir pince : " << pince << std::endl;
this->ouvrir_pince(pince);
}
else if (token[2] == "fermer pince") {
int pince = std::stoi(token[3]);
this->fermer_pince(pince);
}
else if (token[2] == "baisser bras") {
this->fermer_pince(0);
this->fermer_pince(2);
this->baisser_bras();
}
else if(token[2] == "transport bras"){
this->fermer_pince(0);
this->fermer_pince(2);
this->transport_bras();
}
else if (token[2] == "lever bras") {
this->fermer_pince(0);
this->fermer_pince(2);
this->lever_bras();
}
else if (token[2] == "check panneau") {
int bras = std::stoi(token[3]);
this->check_panneau(bras);
}
else if (token[2] == "uncheck panneau") {
int bras = std::stoi(token[3]);
this->uncheck_panneau(bras);
} else if (token[2] == "angle") {
std::vector<std::string> args = TCPSocket::split(token[3], ",");
if (args.size() != 2) {
std::cerr << "Nombre d'arguments invalide" << std::endl;
return;
}
int servo = std::stoi(args[0]);
int angleDeg = static_cast<int>(std::stof(args[1]));
this->pwm_setServoPosition(servo, angleDeg);
} else if (token[2] == "clear") {
this->pwm_clear();
}
}
}
void MyTCPClient::pwm_setFrequency(float freq) {
pca.set_pwm_freq(freq);
}
void MyTCPClient::pwm_init() {
pwm_setFrequency(50.0);
this->fermer_pince(0, true);
this->fermer_pince(1, true);
this->fermer_pince(2, true);
this->baisser_bras();//this->baisser_bras(true);
}
void MyTCPClient::pwm_setServoPosition(int servo, int position) {
int on_time = SERVO_MIN + (SERVO_MAX - SERVO_MIN) * position / 180 - 1;//temps ou le servo est allumé par rapport à 4096
pca.set_pwm(servo, 0, on_time);
}
void MyTCPClient::baisser_bras() {
switch(this->positionBras){
case BRAS_HAUT:
for(int i = angleBrasHaut.servo4; i <= angleBrasBas.servo4;i++){
this->pwm_setServoPosition(4, i);
usleep(5'000);
this->pwm_setServoPosition(5, angleBrasHaut.servo5-i+angleBrasHaut.servo4);
}
break;
case BRAS_TRANSPORT:
for(int i = angleBrasTransport.servo4; i <= angleBrasBas.servo4;i++){
this->pwm_setServoPosition(4, i);
usleep(5'000);
this->pwm_setServoPosition(5, angleBrasTransport.servo5-i+angleBrasTransport.servo4);
}
break;
case BRAS_BAS:
this->pwm_setServoPosition(4, angleBrasBas.servo4);
this->pwm_setServoPosition(5, angleBrasBas.servo5);
return;
}
this->positionBras = BRAS_BAS;
this->pwm_setServoPosition(4, angleBrasBas.servo4);
this->pwm_setServoPosition(5, angleBrasBas.servo5);
}
void MyTCPClient::transport_bras(){
switch(this->positionBras){
case BRAS_BAS:
for (int i = angleBrasBas.servo5; i <= angleBrasTransport.servo5; i++){
this->pwm_setServoPosition(4, angleBrasBas.servo4-i+angleBrasBas.servo5);
usleep(5'000);
this->pwm_setServoPosition(5, i);
}
break;
case BRAS_HAUT:
for (int i = angleBrasHaut.servo4; i <= angleBrasTransport.servo4; i++){
this->pwm_setServoPosition(4, i);
usleep(5'000);
this->pwm_setServoPosition(5, angleBrasHaut.servo5-i+angleBrasHaut.servo4);
}
break;
case BRAS_TRANSPORT:
this->pwm_setServoPosition(4, angleBrasTransport.servo4);
this->pwm_setServoPosition(5, angleBrasTransport.servo5);
return;
}
this->positionBras = BRAS_TRANSPORT;
this->pwm_setServoPosition(4, angleBrasTransport.servo4);
this->pwm_setServoPosition(5, angleBrasTransport.servo5);
}
void MyTCPClient::lever_bras() {
switch(this->positionBras){
case BRAS_BAS:
for (int i = angleBrasBas.servo5;i <= angleBrasHaut.servo5;i++){
this->pwm_setServoPosition(4, angleBrasBas.servo4-i+angleBrasBas.servo5);
usleep(5'000);
this->pwm_setServoPosition(5, i);
}
break;
case BRAS_TRANSPORT:
for (int i = angleBrasTransport.servo5;i <= angleBrasHaut.servo5;i++){
this->pwm_setServoPosition(4, angleBrasTransport.servo4-i+angleBrasTransport.servo5);
usleep(5'000);
this->pwm_setServoPosition(5, i);
}
break;
case BRAS_HAUT:
this->pwm_setServoPosition(4, angleBrasHaut.servo4);
this->pwm_setServoPosition(5, angleBrasHaut.servo5);
return;
}
this->positionBras = BRAS_HAUT;
this->pwm_setServoPosition(4, angleBrasHaut.servo4);
this->pwm_setServoPosition(5, angleBrasHaut.servo5);
}
void MyTCPClient::fermer_pince(int pince, bool force) {
if (!pinceOuverte[pince] && !force){
return;
}
int angle, old_angle;
if (pince < 0 || pince > 2){
return;
}
switch(pince){
case 0:
angle = 142;
old_angle = 115;
break;
case 1:
angle = 42;
old_angle = 22;
break;
case 2:
angle = 152;
old_angle = 130;
break;
}
std::cout << "Fermer pince : " << pince << std::endl;
for(int i = old_angle; i <= angle;i++){
this->pwm_setServoPosition(pince, i);
usleep(5'000);
}
pinceOuverte[pince] = false;
}
void MyTCPClient::ouvrir_pince(int pince, bool force) {
if (pinceOuverte[pince] && !force){
return;
}
int angle, old_angle;
if (pince < 0 || pince > 2){
return;
}
switch(pince){
case 0:
angle = 115;
old_angle = 142;
break;
case 1:
angle = 22;
old_angle = 42;
break;
case 2:
angle = 130;
old_angle = 152;
break;
}
std::cout << "Ouvrir pince : " << pince << std::endl;
for (int i = old_angle; i >= angle;i--){
this->pwm_setServoPosition(pince, i);
usleep(5'000);
}
pinceOuverte[pince] = true;
}
void MyTCPClient::check_panneau(int quelBras) {
for (int i = PANO_BAS; i <= PANO_HAUT;i++){
this->pwm_setServoPosition(quelBras, i);
usleep(5'000);
}
}
void MyTCPClient::uncheck_panneau(int quelBras) {
for (int i = PANO_HAUT; i >= PANO_BAS;i--){
this->pwm_setServoPosition(quelBras, i);
usleep(5'000);
}
}
void MyTCPClient::pwm_clear() {
pca.set_all_pwm(0,0);
}