void *thread_distance (void * arg)
{
    int* socketClient=(int *)arg; // On precise la nature de la variable arg	
	int ecrits = 0;
	int distance;
	char id = 'd';
	int buffer[2];
	buffer[0] = htonl(0);

	
	printf("creation du thread1\n");
	
	for(;;)
	{
		//printf("Distance: %d \n", ultrason());
		distance = ultrason();
		
		if(*socketClient != -1)
		{
			buffer[1] = htonl(distance);
			pthread_mutex_lock(&lock);
			//ecrits = write(*socketClient, &id, sizeof(id));
			ecrits = write(*socketClient, buffer, sizeof(buffer));
			pthread_mutex_unlock(&lock);
		}
		delay(50);
	}

	return 0;
}
Esempio n. 2
0
void *deplacement(void *arg){
	//deplacementArg *Arg = (deplacementArg *) arg;
	
	int distanceObjet[NB_ULTRASON] = {0};
	int *ptabDistance;
	ptabDistance = distanceObjet;
	
	// attente de la synchro synchronisation initiale entre le robot et la personne (positionnement)
	while (flagInit == false){
		if (finProgramme == true){
			pthread_exit(NULL);
		}
	}

	while(1){
		if (ultrason(&ptabDistance) != 0){
			puts("Ultrason failed");
			finProgramme = true;
			pthread_exit(NULL);
		}

		if (ptabDistance[ULTRASON_3] < DISTANCE_TROP_PROCHE)
		{
			//Arret immédiat du robot
			robot.stop();
			robotAvance = false;
		}
		// Il detecte un objet tout droit
		else if (ptabDistance[ULTRASON_3] < DISTANCE_OBJET_FACE_MIN)
		{
			// Il detecte un objet proche a 45° a gauche du robot, et on a un minimum de place sur la droite
			if (ptabDistance[ULTRASON_2] < DISTANCE_OBJET_TRANSVERSE_MIN && ptabDistance[ULTRASON_4] > DISTANCE_TROP_PROCHE)
			{
				// Check pour savoir si on voit le meme mur que le 1er ultrason a detecter, si oui calcul precis de repositionnement
				if (ptabDistance[ULTRASON_1] < DISTANCE_OBJET_COTE_MIN) 
				{
					//Faire tourner le robot de (atan((ptabDistance[ULTRASON_1]+DISTANCE_CENTRE_ULTRASON)/(ptabDistance[ULTRASON_3]+DISTANCE_CENTRE_ULTRASON))*180/PI
					//Sur la droite
					robotTourne = true;
					flagVirage = int(abs(atan((ptabDistance[ULTRASON_1]+DISTANCE_CENTRE_ULTRASON)/(ptabDistance[ULTRASON_3]+DISTANCE_CENTRE_ULTRASON))*180/PI));
					robot.turnRight(60,flagVirage,1);

					robotTourne = false;
					flagVirage = 0;
					robot.goForward(90);
				}
				// Approximation de l'angle pour un cas ou on ira de maniere transversale, mais sans acces au mur du capteur gauche perpendiculaire
				else
				{
					//Faire tourner le robot de 45° sur la droite 
					robotTourne = true;
					flagVirage = 45;
					robot.turnRight(60,45,1);

					robotTourne = false;
					flagVirage = 0;
					robot.goForward(90);

				}
			}
			// Il detecte un objet proche a 45° a droite du robot, et on a un minimum de place sur la gauche
			else if (ptabDistance[ULTRASON_4] < DISTANCE_OBJET_TRANSVERSE_MIN && ptabDistance[ULTRASON_2] > DISTANCE_TROP_PROCHE)
			{
				// Check pour savoir si on voit le meme mur que le 1er ultrason a detecter, si oui calcul precis de repositionnement
				if (ptabDistance[ULTRASON_5] < DISTANCE_OBJET_COTE_MIN)
				{
					//Faire tourner le robot de (atan((ptabDistance[ULTRASON_5]+DISTANCE_CENTRE_ULTRASON)/(ptabDistance[ULTRASON_3]+DISTANCE_CENTRE_ULTRASON))*180/PI
					//Sur la gauche
					robotTourne = true;
					flagVirage = -1*int(abs(atan((ptabDistance[ULTRASON_5]+DISTANCE_CENTRE_ULTRASON)/(ptabDistance[ULTRASON_3]+DISTANCE_CENTRE_ULTRASON))*180/PI));
					robot.turnLeft(60,flagVirage,1);

					robotTourne = false;
					flagVirage = 0;
					robot.goForward(90);
				}
				// Approximation de l'angle pour un cas ou on ira de maniere transversale, mais sans acces au mur du capteur droite perpendiculaire
				else
				{
					//Faire tourner le robot de 45° sur la gauche 
					robotTourne = true;
					flagVirage = -45;
					robot.turnLeft(60,45,1);

					robotTourne = false;
					flagVirage = 0;
					robot.goForward(90);

				}
			}
			// Si il n'a pas detecter d'objet trop proche OU si il a detecter des objets trop proche d'un coté ou de l'autre
			// Alors on vire de l'autre cote
			else if (ptabDistance[ULTRASON_2] < ptabDistance[ULTRASON_4])
			{
				//tourner à droite de 80°
				robotTourne = true;
				flagVirage = 80;
				robot.turnRight(75,80,1);

				robotTourne = false;
				flagVirage = 0;
				robot.goForward(90);
			}
			else if (ptabDistance[ULTRASON_4] < ptabDistance[ULTRASON_2])
			{
				//tourner à gauche de 80°
				robotTourne = true;
				flagVirage = 80;
				robot.turnLeft(75,80,1);

				robotTourne = false;
				flagVirage = 0;
				robot.goForward(90);
			}
			// Pied de table ?
			else if (ptabDistance[ULTRASON_1] < ptabDistance[ULTRASON_5])
			{
				//tourne à droite de 45°
				//wait 1sec
				//tourne à gauche de 45°
				robotTourne = true;
				robot.turnRight(90,45,1);
				robot.goForward(90);
				sleep(1);
				robot.turnLeft(90,45,1);

				robotTourne = false;
				flagVirage = 0;
				robot.goForward(90);
			}
			else if (ptabDistance[ULTRASON_5] < ptabDistance[ULTRASON_1])
			{
				//tourne à gauche de 45°
				//wait 1sec
				//tourne à droite de 45°
				robotTourne = true;
				robot.turnLeft(90,45,1);
				robot.goForward(90);
				sleep(1);
				robot.turnRight(90,45,1);

				robotTourne = false;
				flagVirage = 0;
				robot.goForward(90);
			}
		}
		//On se dirige doucement sur le mur à gauche
		else if (ptabDistance[ULTRASON_2] < (DISTANCE_OBJET_TRANSVERSE_MIN*2) && ptabDistance[ULTRASON_2] < ptabDistance[ULTRASON_1])
		{
			// tourne a droite de 10°
			robotTourne = true;
			flagVirage = 10;
			robot.turnRight(75,10,1);

			robotTourne = false;
			flagVirage = 0;
			robot.goForward(90);
		}
		//On se dirige doucement sur le mur à droite
		else if (ptabDistance[ULTRASON_4] < (DISTANCE_OBJET_TRANSVERSE_MIN*2) && ptabDistance[ULTRASON_4] < ptabDistance[ULTRASON_5])
		{
			// tourne a gauche de 10°
			robotTourne = true;
			flagVirage = 10;
			robot.turnLeft(75,10,1);

			robotTourne = false;
			flagVirage = 0;
			robot.goForward(90);
		}
		//On est parallèle au mur, mais proche du mur de gauche
		else if (ptabDistance[ULTRASON_1] < DISTANCE_MUR_PROCHE)
		{
			// droite a droite de 45° puis instantanement à gauche de 45°
			robotTourne = true;
			flagVirage = 0;
			robot.turnRight(95,45,1);
			robot.turnLeft(95,45,1);

			robotTourne = false;
			robot.goForward(90);
		}
		//On est parallèle au mur, mais proche du mur de droide
		else if (ptabDistance[ULTRASON_5] < DISTANCE_MUR_PROCHE)
		{
			// droite a gauche de 45° puis instantanement à droite de 45°
			robotTourne = true;
			flagVirage = 0;				//Afin d'éviter d'embeter le programme de positionnement
			robot.turnLeft(95,45,1);
			robot.turnRight(95,45,1);

			robotTourne = false;
			robot.goForward(90);
		}
		//Aucun obstacle génant, on va tout droit
		else
		{
			robotTourne = false;
			flagVirage = 0;
		}

		if (finProgramme == true){
			// Fin du thread
			pthread_exit(NULL);
		}
	}
}