2018-05-08 00:45:08 +02:00
|
|
|
// Robotech Lille 2017-2018
|
|
|
|
|
2018-05-09 00:59:23 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
2018-05-08 00:45:08 +02:00
|
|
|
#include "CA.h"
|
2018-05-09 00:59:23 +02:00
|
|
|
#include "actionneurs.h"
|
2018-05-08 00:45:08 +02:00
|
|
|
|
|
|
|
pthread_mutex_t receptionActionMutex;
|
|
|
|
pthread_cond_t receptionActionCond;
|
2018-05-09 00:59:23 +02:00
|
|
|
bool actionneursConfigured = false;
|
2018-05-08 00:45:08 +02:00
|
|
|
|
|
|
|
// On fait un truc de malpropre : étant donné que l'Arduino
|
|
|
|
// peut faire qu'une seule tache à la fois on suppose que le
|
|
|
|
// caractère reçu répond à celui qu'on attendait
|
|
|
|
|
|
|
|
void configureActionneurs()
|
|
|
|
{
|
2018-05-09 00:59:23 +02:00
|
|
|
actionneursConfigured = true;
|
|
|
|
configureCA();
|
2018-05-08 00:45:08 +02:00
|
|
|
pthread_mutex_init(&receptionActionMutex, NULL);
|
|
|
|
pthread_cond_init(&receptionActionCond, NULL);
|
2018-05-08 19:20:17 +02:00
|
|
|
resetActionneurs();
|
2018-05-08 00:45:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void setLoquet(bool state)
|
|
|
|
{
|
|
|
|
attendAction(state ? C2AD_OUVRE_LOQUET : C2AD_FERME_LOQUET);
|
|
|
|
}
|
|
|
|
|
|
|
|
void setPositionBalle(enum positionBalle pos)
|
|
|
|
{
|
|
|
|
unsigned char code;
|
|
|
|
switch (pos) {
|
2018-05-09 00:59:23 +02:00
|
|
|
case attente:
|
|
|
|
code = C2AD_POS_BALLE_ATTENTE;
|
|
|
|
break;
|
|
|
|
case ejection:
|
|
|
|
code = C2AD_POS_BALLE_EJECTION;
|
|
|
|
break;
|
|
|
|
case evacuation:
|
|
|
|
code = C2AD_POS_BALLE_EVACUATION;
|
|
|
|
break;
|
2018-05-08 00:45:08 +02:00
|
|
|
}
|
|
|
|
attendAction(code);
|
|
|
|
}
|
|
|
|
|
|
|
|
void pousserBalle()
|
|
|
|
{
|
|
|
|
attendAction(C2AD_POUSSER_BALLE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void barilletSuivant()
|
|
|
|
{
|
|
|
|
attendAction(C2AD_BARILLET_SUIVANT);
|
|
|
|
}
|
|
|
|
|
|
|
|
void barilletSkip()
|
|
|
|
{
|
|
|
|
attendAction(C2AD_BARILLET_SKIP);
|
|
|
|
}
|
|
|
|
|
|
|
|
void barilletReset()
|
|
|
|
{
|
|
|
|
attendAction(C2AD_BARILLET_RESET);
|
|
|
|
}
|
|
|
|
|
|
|
|
void setPropulsion(bool state)
|
|
|
|
{
|
|
|
|
attendAction(state ? C2AD_PROPULSION_ON : C2AD_PROPULSION_OFF);
|
|
|
|
}
|
|
|
|
|
|
|
|
void resetActionneurs()
|
|
|
|
{
|
2018-05-08 19:20:17 +02:00
|
|
|
setLoquet(false);
|
2018-05-08 00:45:08 +02:00
|
|
|
barilletReset();
|
2018-05-08 19:20:17 +02:00
|
|
|
setPositionBalle(attente);
|
|
|
|
setPropulsion(false);
|
2018-05-08 00:45:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void stopActionneurs()
|
|
|
|
{
|
|
|
|
setPropulsion(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void receptionAction()
|
|
|
|
{
|
|
|
|
pthread_mutex_lock(&receptionActionMutex);
|
|
|
|
pthread_cond_signal(&receptionActionCond);
|
|
|
|
pthread_mutex_unlock(&receptionActionMutex);
|
|
|
|
}
|
|
|
|
|
|
|
|
void attendAction(unsigned char code)
|
|
|
|
{
|
2018-05-09 00:59:23 +02:00
|
|
|
if (actionneursConfigured) {
|
|
|
|
pthread_mutex_lock(&receptionActionMutex);
|
|
|
|
registerRxHandlerCA(code, receptionAction);
|
|
|
|
sendCA(code, NULL, 0);
|
|
|
|
pthread_cond_wait(&receptionActionCond, &receptionActionMutex);
|
|
|
|
pthread_mutex_unlock(&receptionActionMutex);
|
|
|
|
} else {
|
|
|
|
fprintf(stderr, "Action demandée sans Arduino configuré\n");
|
|
|
|
}
|
2018-05-08 00:45:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void deconfigureActionneurs()
|
|
|
|
{
|
2018-05-09 00:59:23 +02:00
|
|
|
if (actionneursConfigured) {
|
|
|
|
stopActionneurs();
|
|
|
|
deconfigureCA();
|
|
|
|
actionneursConfigured = false;
|
|
|
|
}
|
2018-05-08 00:45:08 +02:00
|
|
|
}
|