added 3 loss timeout

This commit is contained in:
Raphaël LACROIX 2023-04-03 13:10:30 +02:00
parent 7258c52428
commit 0a74b96c5b
2 changed files with 119 additions and 38 deletions

View file

@ -27,6 +27,7 @@
#define PRIORITY_TSTARTROBOT 20 #define PRIORITY_TSTARTROBOT 20
#define PRIORITY_TCAMERA 21 #define PRIORITY_TCAMERA 21
#define PRIORITY_TBATTERY 25 #define PRIORITY_TBATTERY 25
#define PRIORITY_TLOSSCOUNTER 25
#define PRIORITY_TSTARTCAMERA 25 #define PRIORITY_TSTARTCAMERA 25
/* /*
@ -52,6 +53,58 @@
* @brief Initialisation des structures de l'application (tâches, mutex, * @brief Initialisation des structures de l'application (tâches, mutex,
* semaphore, etc.) * semaphore, etc.)
*/ */
void Tasks::robotLossCounter(){
// wait for connexion establishement
cout << "Start " << __PRETTY_FUNCTION__ << endl << flush;
// Synchronization barrier (waiting that all tasks are starting)
rt_sem_p(&sem_barrier, TM_INFINITE);
rt_sem_p(&sem_connexionEstablished);
cout << "Starting to monitor packet losses " << endl << flush;
rt_task_set_periodic(NULL, TM_NOW, 100*1000*1000);
while(1){
rt_task_wait_period(NULL);
rt_mutex_acquire(&mutex_compteurRobotLoss, TM_INFINITE);
if(compteurRobotLoss >= 3){
// send info to monitor
WriteInQueue(&q_messageToMon, new Message(MESSAGE_MONITOR_LOST));
// close robot
rt_mutex_acquire(&mutex_robot, TM_INFINITE);
state = robot.Close();
rt_mutex_release(&mutex_robot);
// send info to monitor
if (state < 0) {
WriteInQueue(&q_messageToMon, new Message(MESSAGE_ANSWER_NACK));
} else {
WriteInQueue(&q_messageToMon, new Message(MESSAGE_ANSWER_ACK));
}
}
rt_mutex_release(&mutex_compteurRobotLoss);
}
}
MessageID traitementMessage(MessageID msg){
if (msg == MESSAGE_ANSWER_COM_ERROR){
// increment
rt_mutex_acquire(&mutex_compteurRobotLoss, TM_INFINITE);
compteurRobotLoss ++;
rt_mutex_release(&mutex_compteurRobotLoss);
} else {
// reset
rt_mutex_acquire(&mutex_compteurRobotLoss, TM_INFINITE);
compteurRobotLoss = 0;
rt_mutex_release(&mutex_compteurRobotLoss);
}
return msg
}
void Tasks::Init() { void Tasks::Init() {
int status; int status;
int err; int err;
@ -75,6 +128,11 @@ void Tasks::Init() {
cerr << "Error mutex create: " << strerror(-err) << endl << flush; cerr << "Error mutex create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (err = rt_mutex_create(&mutex_compteurRobotLoss, NULL)) {
cerr << "Error mutex create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE);
}
if (err = rt_mutex_create(&mutex_cameraStarted, NULL)) { if (err = rt_mutex_create(&mutex_cameraStarted, NULL)) {
cerr << "Error mutex create: " << strerror(-err) << endl << flush; cerr << "Error mutex create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -104,6 +162,10 @@ void Tasks::Init() {
cerr << "Error semaphore create: " << strerror(-err) << endl << flush; cerr << "Error semaphore create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (err = rt_sem_create(&sem_connexionEstablished, NULL, 0, S_FIFO)) {
cerr << "Error semaphore create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE);
}
if (err = rt_sem_create(&sem_serverOk, NULL, 0, S_FIFO)) { if (err = rt_sem_create(&sem_serverOk, NULL, 0, S_FIFO)) {
cerr << "Error semaphore create: " << strerror(-err) << endl << flush; cerr << "Error semaphore create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -153,6 +215,10 @@ void Tasks::Init() {
cerr << "Error task create: " << strerror(-err) << endl << flush; cerr << "Error task create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (err = rt_task_create(&th_lossCounter, "th_lossCounter", 0, PRIORITY_TLOSSCOUNTER, 0)) {
cerr << "Error task create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE);
}
if (err = rt_task_create(&th_camera, "th_camera", 0, PRIORITY_TCAMERA, 0)) { if (err = rt_task_create(&th_camera, "th_camera", 0, PRIORITY_TCAMERA, 0)) {
cerr << "Error task create: " << strerror(-err) << endl << flush; cerr << "Error task create: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -213,7 +279,12 @@ void Tasks::Run() {
cerr << "Error task start: " << strerror(-err) << endl << flush; cerr << "Error task start: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (err = rt_task_start(&th_lossCounter, (void(*)(void*)) & Tasks::RobotLossCounter, this)) {
cerr << "Error task start: " << strerror(-err) << endl << flush;
exit(EXIT_FAILURE);
}
cout << "Tasks launched" << endl << flush; cout << "Tasks launched" << endl << flush;
} }
@ -323,17 +394,17 @@ void Tasks::ReceiveFromMonTask(void *arg) {
} else if (msgRcv->CompareID(MESSAGE_CAM_OPEN)){ } else if (msgRcv->CompareID(MESSAGE_CAM_OPEN)){
rt_sem_v(&sem_startCamera); rt_sem_v(&sem_startCamera);
}else if(msgRcv->CompareID(MESSAGE_CAM_ASK_ARENA)){ }else if(msgRcv->CompareID(MESSAGE_CAM_ASK_ARENA)){
rt_mutex_acquire(&mutex_search_arena, TM_INFINITE); rt_mutex_acquire(&mutex_search_arena, TM_INFINITE);
searchArena = 1; searchArena = 1;
rt_mutex_release(&mutex_search_arena); rt_mutex_release(&mutex_search_arena);
}else if(msgRcv->CompareID(MESSAGE_CAM_POSITION_COMPUTE_START)){ }else if(msgRcv->CompareID(MESSAGE_CAM_POSITION_COMPUTE_START)){
rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE); rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE);
robotPos = 1; robotPos = 1;
rt_mutex_release(&mutex_robot_pos); rt_mutex_release(&mutex_robot_pos);
}else if(msgRcv->CompareID(MESSAGE_CAM_POSITION_COMPUTE_STOP)){ }else if(msgRcv->CompareID(MESSAGE_CAM_POSITION_COMPUTE_STOP)){
rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE); rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE);
robotPos = 0; robotPos = 0;
rt_mutex_release(&mutex_robot_pos); rt_mutex_release(&mutex_robot_pos);
} }
delete(msgRcv); // must be deleted manually, no consumer delete(msgRcv); // must be deleted manually, no consumer
} }
@ -366,6 +437,7 @@ void Tasks::OpenComRobot(void *arg) {
if (status < 0) { if (status < 0) {
msgSend = new Message(MESSAGE_ANSWER_NACK); msgSend = new Message(MESSAGE_ANSWER_NACK);
} else { } else {
rt_sem_v(&sem_connexionEstablished);
msgSend = new Message(MESSAGE_ANSWER_ACK); msgSend = new Message(MESSAGE_ANSWER_ACK);
} }
WriteInQueue(&q_messageToMon, msgSend); // msgSend will be deleted by sendToMon WriteInQueue(&q_messageToMon, msgSend); // msgSend will be deleted by sendToMon
@ -389,7 +461,7 @@ void Tasks::StartRobotTask(void *arg) {
rt_sem_p(&sem_startRobot, TM_INFINITE); rt_sem_p(&sem_startRobot, TM_INFINITE);
cout << "Start robot without watchdog ("; cout << "Start robot without watchdog (";
rt_mutex_acquire(&mutex_robot, TM_INFINITE); rt_mutex_acquire(&mutex_robot, TM_INFINITE);
msgSend = robot.Write(robot.StartWithoutWD()); msgSend = call(robot.Write(robot.StartWithoutWD()));
rt_mutex_release(&mutex_robot); rt_mutex_release(&mutex_robot);
cout << msgSend->GetID(); cout << msgSend->GetID();
cout << ")" << endl; cout << ")" << endl;
@ -412,7 +484,7 @@ void Tasks::StartCameraTask(void *arg) {
cout << "Start " << __PRETTY_FUNCTION__ << endl << flush; cout << "Start " << __PRETTY_FUNCTION__ << endl << flush;
// Synchronization barrier (waiting that all tasks are starting) // Synchronization barrier (waiting that all tasks are starting)
rt_sem_p(&sem_barrier, TM_INFINITE); rt_sem_p(&sem_barrier, TM_INFINITE);
/**************************************************************************************/ /**************************************************************************************/
/* The task startRobot starts here */ /* The task startRobot starts here */
/**************************************************************************************/ /**************************************************************************************/
@ -423,12 +495,12 @@ void Tasks::StartCameraTask(void *arg) {
rt_sem_p(&sem_startCamera, TM_INFINITE); rt_sem_p(&sem_startCamera, TM_INFINITE);
cout << "Start Camera "; cout << "Start Camera ";
rt_mutex_acquire(&mutex_camera, TM_INFINITE); rt_mutex_acquire(&mutex_camera, TM_INFINITE);
bool status = camera.Open(); bool status = camera.Open();
if(!status){ if(!status){
msgSend = new Message(MESSAGE_ANSWER_NACK); msgSend = new Message(MESSAGE_ANSWER_NACK);
WriteInQueue(&q_messageToMon, msgSend); // msgSend will be deleted by sendToMon WriteInQueue(&q_messageToMon, msgSend); // msgSend will be deleted by sendToMon
cout << "NACK !" << endl << flush ; cout << "NACK !" << endl << flush ;
cout << msgSend->ToString() << endl << flush; cout << msgSend->ToString() << endl << flush;
cout << "NACK1 ! " << endl << flush ; cout << "NACK1 ! " << endl << flush ;
rt_mutex_release(&mutex_camera); rt_mutex_release(&mutex_camera);
cout << "NACK2 ! " << endl << flush ; cout << "NACK2 ! " << endl << flush ;
@ -443,9 +515,9 @@ void Tasks::StartCameraTask(void *arg) {
rt_mutex_acquire(&mutex_cameraStarted, TM_INFINITE); rt_mutex_acquire(&mutex_cameraStarted, TM_INFINITE);
cout << "ff" << endl << flush ; cout << "ff" << endl << flush ;
cameraStarted = 1; cameraStarted = 1;
cout << "Cam success! " << endl <<flush; cout << "Cam success! " << endl <<flush;
rt_mutex_release(&mutex_cameraStarted); rt_mutex_release(&mutex_cameraStarted);
cout << "Fin de start cam" << endl << flush; cout << "Fin de start cam" << endl << flush;
} }
} }
@ -518,8 +590,8 @@ void Tasks::BatteryTask(void *arg) {
* @brief task in charge of managing the camera. * @brief task in charge of managing the camera.
*/ */
void Tasks::CameraTask(void *arg){ void Tasks::CameraTask(void *arg){
int cam; int cam;
cout << "Start " << __PRETTY_FUNCTION__ << endl << flush; cout << "Start " << __PRETTY_FUNCTION__ << endl << flush;
// Synchronization barrier (waiting that all tasks are starting) // Synchronization barrier (waiting that all tasks are starting)
rt_sem_p(&sem_barrier, TM_INFINITE); rt_sem_p(&sem_barrier, TM_INFINITE);
@ -527,37 +599,37 @@ void Tasks::CameraTask(void *arg){
while(1){ while(1){
rt_task_wait_period(NULL); rt_task_wait_period(NULL);
rt_mutex_acquire(&mutex_cameraStarted, TM_INFINITE); rt_mutex_acquire(&mutex_cameraStarted, TM_INFINITE);
cam = cameraStarted; cam = cameraStarted;
rt_mutex_release(&mutex_cameraStarted); rt_mutex_release(&mutex_cameraStarted);
if(!cam){ if(!cam){
continue; continue;
} }
rt_mutex_acquire(&mutex_camera, TM_INFINITE); rt_mutex_acquire(&mutex_camera, TM_INFINITE);
// Lancer le traitement périodique // Lancer le traitement périodique
Img img = camera.Grab(); Img img = camera.Grab();
Arena arena; Arena arena;
rt_mutex_release(&mutex_camera); rt_mutex_release(&mutex_camera);
rt_mutex_acquire(&mutex_search_arena, TM_INFINITE); rt_mutex_acquire(&mutex_search_arena, TM_INFINITE);
if(searchArena){ if(searchArena){
// chopper l'arene // chopper l'arene
cout << "Search arena pls ! " << endl << flush; cout << "Search arena pls ! " << endl << flush;
arena = img.SearchArena(); arena = img.SearchArena();
// searchArena = 0; // toggle? // searchArena = 0; // toggle?
} }
rt_mutex_release(&mutex_search_arena); rt_mutex_release(&mutex_search_arena);
rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE); rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE);
if(robotPos){ if(robotPos){
// chopper le robot // chopper le robot
cout << "Pos du robot pls !" ; cout << "Pos du robot pls !" ;
} }
rt_mutex_release(&mutex_robot_pos); rt_mutex_release(&mutex_robot_pos);
if(arena.IsEmpty()){ if(arena.IsEmpty()){
cout << "Arena empty" << endl << flush; cout << "Arena empty" << endl << flush;
// envoi d'un no ack au moniteur // envoi d'un no ack au moniteur
}else{ }else{
cout << "Draw Arena" << endl << flush; cout << "Draw Arena" << endl << flush;
img.DrawArena(arena); img.DrawArena(arena);
@ -565,8 +637,8 @@ void Tasks::CameraTask(void *arg){
// envoi de l'arene pour vérif // envoi de l'arene pour vérif
} }
cout << "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARENE" << endl << flush; cout << "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARENE" << endl << flush;
WriteInQueue(&q_messageToMon, new MessageImg(MESSAGE_CAM_IMAGE,&img)); WriteInQueue(&q_messageToMon, new MessageImg(MESSAGE_CAM_IMAGE,&img));
} }
} }

View file

@ -66,9 +66,10 @@ private:
ComRobot robot; ComRobot robot;
Camera camera; Camera camera;
int robotStarted = 0; int robotStarted = 0;
int compteurRobotLoss = 0;
int cameraStarted = 0; int cameraStarted = 0;
int searchArena = 0; int searchArena = 0;
int robotPos = 0; int robotPos = 0;
int move = MESSAGE_ROBOT_STOP; int move = MESSAGE_ROBOT_STOP;
/**********************************************************************/ /**********************************************************************/
@ -82,6 +83,7 @@ private:
RT_TASK th_startCamera; RT_TASK th_startCamera;
RT_TASK th_move; RT_TASK th_move;
RT_TASK th_battery; RT_TASK th_battery;
RT_TASK th_lossCounter;
RT_TASK th_camera; RT_TASK th_camera;
/**********************************************************************/ /**********************************************************************/
/* Mutex */ /* Mutex */
@ -91,9 +93,10 @@ private:
RT_MUTEX mutex_robotStarted; RT_MUTEX mutex_robotStarted;
RT_MUTEX mutex_cameraStarted; RT_MUTEX mutex_cameraStarted;
RT_MUTEX mutex_move; RT_MUTEX mutex_move;
RT_MUTEX mutex_compteurRobotLoss;
RT_MUTEX mutex_camera; RT_MUTEX mutex_camera;
RT_MUTEX mutex_search_arena; RT_MUTEX mutex_search_arena;
RT_MUTEX mutex_robot_pos; RT_MUTEX mutex_robot_pos;
/**********************************************************************/ /**********************************************************************/
/* Semaphores */ /* Semaphores */
@ -103,6 +106,7 @@ private:
RT_SEM sem_serverOk; RT_SEM sem_serverOk;
RT_SEM sem_startRobot; RT_SEM sem_startRobot;
RT_SEM sem_startCamera; RT_SEM sem_startCamera;
RT_SEM sem_connexionEstablished;
/**********************************************************************/ /**********************************************************************/
/* Message queues */ /* Message queues */
@ -153,13 +157,18 @@ private:
* @brief task in charge of the battery status. * @brief task in charge of the battery status.
*/ */
void BatteryTask(void *arg); void BatteryTask(void *arg);
/**
* @brief task in charge of counting packet losses.
*/
void RobotLossCounter(void *arg);
/** /**
* @brief task in charge of managing the camera. * @brief task in charge of managing the camera.
*/ */
void CameraTask(void *arg); void CameraTask(void *arg);
/**********************************************************************/ /**********************************************************************/
/* Queue services */ /* Queue services */
/**********************************************************************/ /**********************************************************************/