mirror of
https://github.com/RobotechLille/cdf2018-principal
synced 2024-11-14 12:26:06 +01:00
Rattrapage de session abandonnée Arduino
This commit is contained in:
parent
45151e7b1a
commit
89d3bf21cd
|
@ -25,6 +25,7 @@ void configureArduino()
|
||||||
{
|
{
|
||||||
// Connection au port série
|
// Connection au port série
|
||||||
printf("Connexion à %s... ", ARDUINO_PORTNAME);
|
printf("Connexion à %s... ", ARDUINO_PORTNAME);
|
||||||
|
fflush(stdout);
|
||||||
arduino = open(ARDUINO_PORTNAME, O_RDWR | O_NOCTTY | O_NDELAY);
|
arduino = open(ARDUINO_PORTNAME, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||||
if (arduino < 0) {
|
if (arduino < 0) {
|
||||||
printf("Échec !\n");
|
printf("Échec !\n");
|
||||||
|
@ -93,6 +94,16 @@ void onA2CD_ERR()
|
||||||
printf("Erreur reçue : %c (%2x)\n", s.code, s.code);
|
printf("Erreur reçue : %c (%2x)\n", s.code, s.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setPret()
|
||||||
|
{
|
||||||
|
pret = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void doNothing()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void configureCA()
|
void configureCA()
|
||||||
{
|
{
|
||||||
configureArduino();
|
configureArduino();
|
||||||
|
@ -102,6 +113,36 @@ void configureCA()
|
||||||
|
|
||||||
pthread_mutex_init(&sSendCA, NULL);
|
pthread_mutex_init(&sSendCA, NULL);
|
||||||
pthread_create(&tReaderAC, NULL, TaskReaderAC, NULL);
|
pthread_create(&tReaderAC, NULL, TaskReaderAC, NULL);
|
||||||
|
|
||||||
|
printf("Attente de réponse de l'Arduino... ");
|
||||||
|
fflush(stdout);
|
||||||
|
struct timespec tim;
|
||||||
|
tim.tv_sec = 0;
|
||||||
|
tim.tv_nsec = 100000000L;
|
||||||
|
// Dans le cas où on aurait laissé l'Arduino en attente de donnée,
|
||||||
|
// on envoie des pings en boucle jusqu'à ce qu'il nous réponde.
|
||||||
|
pret = false;
|
||||||
|
registerRxHandler(C2AD_PING, setPret);
|
||||||
|
while (!pret) {
|
||||||
|
sendCA(C2AD_PING, NULL, 0);
|
||||||
|
nanosleep(&tim, NULL);
|
||||||
|
}
|
||||||
|
registerRxHandler(C2AD_PING, doNothing);
|
||||||
|
|
||||||
|
// Dans le cas où les données de ping complèteraient une commande de déplacement,
|
||||||
|
// on envoie un STOP en préventif. Ça permet aussi d'attendre que les PING
|
||||||
|
// en trop aient été absorbés
|
||||||
|
pret = false;
|
||||||
|
registerRxHandler(C2AD_STOP, setPret);
|
||||||
|
sendCA(C2AD_STOP, NULL, 0);
|
||||||
|
while (!pret) {
|
||||||
|
nanosleep(&tim, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
registerRxHandler(C2AD_STOP, NULL);
|
||||||
|
registerRxHandler(C2AD_PING, NULL);
|
||||||
|
printf("OK !\n");
|
||||||
|
|
||||||
registerRxHandler(A2CD_ERR, onA2CD_ERR);
|
registerRxHandler(A2CD_ERR, onA2CD_ERR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <termios.h> // baudrates
|
#include <termios.h> // baudrates
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "ACsignals.h"
|
#include "ACsignals.h"
|
||||||
|
|
||||||
|
@ -17,6 +18,7 @@ pthread_t tReaderAC;
|
||||||
|
|
||||||
typedef void (*rxHandler)(void);
|
typedef void (*rxHandler)(void);
|
||||||
rxHandler rxHandlersAC[256];
|
rxHandler rxHandlersAC[256];
|
||||||
|
bool pret;
|
||||||
|
|
||||||
void registerRxHandler(unsigned char code, rxHandler handler); // À utiliser après configureCA();
|
void registerRxHandler(unsigned char code, rxHandler handler); // À utiliser après configureCA();
|
||||||
void sendByteCA(unsigned char data); // Privé
|
void sendByteCA(unsigned char data); // Privé
|
||||||
|
|
|
@ -8,13 +8,14 @@ void onC2AD_STOP()
|
||||||
{
|
{
|
||||||
// On considère que l'arrêt se fait très rapidement pour ne pas
|
// On considère que l'arrêt se fait très rapidement pour ne pas
|
||||||
// avoir à attendre le signal de retour de C2AD_STOP
|
// avoir à attendre le signal de retour de C2AD_STOP
|
||||||
|
registerRxHandler(C2AD_STOP, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop()
|
void stop()
|
||||||
{
|
{
|
||||||
printf("→ Arrêt\n");
|
printf("→ Arrêt\n");
|
||||||
sendCA(C2AD_STOP, NULL, 0);
|
|
||||||
registerRxHandler(C2AD_STOP, onC2AD_STOP);
|
registerRxHandler(C2AD_STOP, onC2AD_STOP);
|
||||||
|
sendCA(C2AD_STOP, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inspiré de https://stackoverflow.com/a/1760819
|
// Inspiré de https://stackoverflow.com/a/1760819
|
||||||
|
|
Loading…
Reference in a new issue