diff --git a/software/raspberry/superviseur-robot/nbproject/private/private.xml b/software/raspberry/superviseur-robot/nbproject/private/private.xml index 56849c0..f7493fc 100644 --- a/software/raspberry/superviseur-robot/nbproject/private/private.xml +++ b/software/raspberry/superviseur-robot/nbproject/private/private.xml @@ -14,6 +14,7 @@ file:/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/messages.cpp file:/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/camera.cpp file:/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/main.cpp + file:/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/img.h file:/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/messages.h diff --git a/software/raspberry/superviseur-robot/nbproject/private/timestamps-10.105.1.3-xenomai-22 b/software/raspberry/superviseur-robot/nbproject/private/timestamps-10.105.1.3-xenomai-22 index 536a776..631787a 100644 --- a/software/raspberry/superviseur-robot/nbproject/private/timestamps-10.105.1.3-xenomai-22 +++ b/software/raspberry/superviseur-robot/nbproject/private/timestamps-10.105.1.3-xenomai-22 @@ -1,11 +1,11 @@ -#Fri Apr 07 11:52:43 CEST 2023 +#Tue Apr 11 12:37:03 CEST 2023 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/nbproject/Package-Debug__RPI_.bash=c1679401432930 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/messages.cpp=c1680248859421 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/commonitor.cpp=c1679401432864 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/gdbsudo.sh=c1679401432813 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/base64/LICENSE=c1679401432832 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/comrobot.cpp=c1679401457314 -/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/tasks.cpp=c1680861150700 +/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/tasks.cpp=c1681209407979 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/.dep.inc=c1679401432701 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/nbproject/Makefile-variables.mk=c1679401432922 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/img.cpp=c1679401457320 @@ -15,7 +15,7 @@ /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/Makefile=c1679401432709 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/.gitignore=c1679401432820 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/wrapper.c=c1679401457381 -/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/tasks.h=c1680860665596 +/home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/tasks.h=c1681208571544 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/main.cpp=c1679404095224 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/nbproject/project.properties=c1679401432983 /home/alejeune/Documents/4ir/S2/dumber/software/raspberry/superviseur-robot/lib/camera.cpp=c1679401457304 diff --git a/software/raspberry/superviseur-robot/tasks.cpp b/software/raspberry/superviseur-robot/tasks.cpp index dab0eea..0ff2de1 100644 --- a/software/raspberry/superviseur-robot/tasks.cpp +++ b/software/raspberry/superviseur-robot/tasks.cpp @@ -104,6 +104,14 @@ void Tasks::Init() { cerr << "Error mutex create: " << strerror(-err) << endl << flush; exit(EXIT_FAILURE); } + if (err = rt_mutex_create(&mutex_battery, NULL)) { + cerr << "Error mutex create: " << strerror(-err) << endl << flush; + exit(EXIT_FAILURE); + } + if (err = rt_mutex_create(&mutex_image, NULL)) { + cerr << "Error mutex create: " << strerror(-err) << endl << flush; + exit(EXIT_FAILURE); + } cout << "Mutexes created successfully" << endl << flush; /**************************************************************************************/ @@ -347,9 +355,13 @@ void Tasks::ReceiveFromMonTask(void *arg) { rt_mutex_release(&mutex_answer_arena); rt_sem_v(&sem_answerSync); }else if(msgRcv->CompareID(MESSAGE_CAM_ASK_ARENA)){ + cout << "Enabling search arena" << endl << flush; rt_mutex_acquire(&mutex_search_arena, TM_INFINITE); searchArena = 1; rt_mutex_release(&mutex_search_arena); + rt_mutex_acquire(&mutex_image, TM_INFINITE); + getImage = 0; + rt_mutex_release(&mutex_image); cout << "Search arena true " << endl << flush; }else if(msgRcv->CompareID(MESSAGE_CAM_POSITION_COMPUTE_START)){ rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE); @@ -361,6 +373,11 @@ void Tasks::ReceiveFromMonTask(void *arg) { robotPos = 0; rt_mutex_release(&mutex_robot_pos); cout << "Robot Pos false" << endl << flush; + }else if(msgRcv->CompareID(MESSAGE_CAM_POSITION_COMPUTE_STOP)){ + rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE); + robotPos = 0; + rt_mutex_release(&mutex_robot_pos); + cout << "Robot Pos false" << endl << flush; } delete(msgRcv); // must be deleted manually, no consumer @@ -454,10 +471,16 @@ void Tasks::StartCameraTask(void *arg) { rt_mutex_acquire(&mutex_camera, TM_INFINITE); if(!cameraStarted){ status = camera->Open(); - cout << "Camera Opened" << endl << flush; + cout << "Camera Opened" << endl << flush; // Toggle a modifier ? + rt_mutex_acquire(&mutex_image, TM_INFINITE); + getImage = 1; + rt_mutex_release(&mutex_image); }else{ camera->Close(); status = true; + rt_mutex_acquire(&mutex_image, TM_INFINITE); + getImage = 0; + rt_mutex_release(&mutex_image); cout << "Camera Closed" << endl << flush; } @@ -475,6 +498,7 @@ void Tasks::StartCameraTask(void *arg) { cout << cameraStarted << endl << flush; rt_mutex_release(&mutex_camera); rt_mutex_release(&mutex_cameraStarted); + cout << "Cam success! " << endl <ToString(); + MessageBattery* batteryReply = (MessageBattery*)robot.Write(new Message(MESSAGE_ROBOT_BATTERY_GET)); rt_mutex_release(&mutex_robot); WriteInQueue(&q_messageToMon, batteryReply); - } rt_mutex_release(&mutex_robotStarted); - }*/ + } } /** * @brief task in charge of managing the camera. */ void Tasks::CameraTask(void *arg){ - int cam; + int cam; + int grab; Img* image; - Arena arenaSaved ; + Arena arenaSaved,arena ; std::list robotPosition; MessageImg* imgToSend; @@ -574,63 +597,75 @@ void Tasks::CameraTask(void *arg){ if(!cam){ continue; } + + if(getImage){ + cout << "Traitement de l'image" << endl << flush ; + rt_mutex_acquire(&mutex_camera, TM_INFINITE); + // Lancer le traitement périodique - cout << "Traitement de l'image" << endl << flush ; - rt_mutex_acquire(&mutex_camera, TM_INFINITE); - // Lancer le traitement périodique + Img img = camera->Grab(); + image = img.Copy(); + rt_mutex_release(&mutex_camera); + rt_mutex_acquire(&mutex_search_arena, TM_INFINITE); + arena = image->SearchArena(); // Mise a jour de l'arene tout le temps pour la position du robot mais draw si search arena = true + if(searchArena){ + rt_mutex_acquire(&mutex_image, TM_INFINITE); + getImage = 0; + rt_mutex_release(&mutex_image); + // chopper l'arene + if(arena.IsEmpty()){ + cout << "Arena empty" << endl << flush; + // envoi d'un no ack au moniteur - Img img = camera->Grab(); - image = img.Copy(); - rt_mutex_release(&mutex_camera); - rt_mutex_acquire(&mutex_search_arena, TM_INFINITE); - Arena arena = image->SearchArena(); // Mise a jour de l'arene tout le temps pour la position du robot mais draw si search arena = true - if(searchArena){ - // chopper l'arene - if(arena.IsEmpty()){ - cout << "Arena empty" << endl << flush; - // envoi d'un no ack au moniteur - - }else{ - cout << "Draw Arena" << endl << flush; - image->DrawArena(arena); - // envoi de l'arene pour vérif + }else{ + cout << "Draw Arena" << endl << flush; + image->DrawArena(arena); + // envoi de l'arene pour vérif + } + }else { + image->DrawArena(arenaSaved); } - }else { - image->DrawArena(arenaSaved); - } + + rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE); + if(robotPos){ + // chopper le robot + cout << "Searching robot positions" << endl << flush ; + robotPosition = image->SearchRobot(arena); + + //Traitement du robot + if(!robotPosition.empty()){ // Robot position != null + image->DrawAllRobots(robotPosition); + } + for (auto position : robotPosition) + { + WriteInQueue(&q_messageToMon, new MessagePosition(MESSAGE_CAM_POSITION,position)); // Envoi de toutes les positions + } + } + rt_mutex_release(&mutex_robot_pos); + // Envoi de l'image + cout << "Envoi de l'image" << endl << flush ; + imgToSend = new MessageImg(MESSAGE_CAM_IMAGE,image); + WriteInQueue(&q_messageToMon, imgToSend); - rt_mutex_acquire(&mutex_robot_pos, TM_INFINITE); - if(robotPos){ - // chopper le robot - cout << "Pos du robot pls !" ; - robotPosition = image->SearchRobot(arena); + } - //Traitement du robot - if(!robotPosition.empty()){ // Robot position != null - image->DrawAllRobots(robotPosition); - } - for (auto position : robotPosition) - { - WriteInQueue(&q_messageToMon, new MessagePosition(MESSAGE_CAM_POSITION,position)); // Envoi de toutes les positions - } - - } - rt_mutex_release(&mutex_robot_pos); - // Envoi de l'image - cout << "Envoi de l'image" << endl << flush ; - imgToSend = new MessageImg(MESSAGE_CAM_IMAGE,image); - WriteInQueue(&q_messageToMon, imgToSend); - - rt_sem_p(&sem_answerSync, TM_INFINITE); + rt_mutex_acquire(&mutex_answer_arena, TM_INFINITE); - - if(arenaConfirm){ - // Arena OK - arenaSaved = arena; + if(searchArena){ + rt_sem_p(&sem_answerSync, TM_INFINITE); + if(arenaConfirm){ + // Arena OK + cout << "Arena Saved" << endl << flush; + arenaSaved = arena; + }else{ + // Arena not OK + cout << "Arena Dumped" << endl << flush; + // Rien ? + } + rt_mutex_acquire(&mutex_image, TM_INFINITE); + getImage = 1; // changer en booleen pour synchroniser plutot que ça + rt_mutex_release(&mutex_image); searchArena = 0; - }else{ - // Arena not OK - // Rien ? } rt_mutex_release(&mutex_answer_arena); rt_mutex_release(&mutex_search_arena); diff --git a/software/raspberry/superviseur-robot/tasks.h b/software/raspberry/superviseur-robot/tasks.h index b89b7d8..f163e45 100644 --- a/software/raspberry/superviseur-robot/tasks.h +++ b/software/raspberry/superviseur-robot/tasks.h @@ -70,6 +70,7 @@ private: int cameraStarted = 0; int arenaConfirm = 0; int searchArena = 0; + int getImage = 0; int move = MESSAGE_ROBOT_STOP; /**********************************************************************/ @@ -96,6 +97,9 @@ private: RT_MUTEX mutex_search_arena; RT_MUTEX mutex_answer_arena; RT_MUTEX mutex_robot_pos; + RT_MUTEX mutex_battery; + RT_MUTEX mutex_image; + /**********************************************************************/ /* Semaphores */