Esempio n. 1
0
void * coordinatesThread(void* arg)
{
	int lg_message = LG_MESS_DEFAUT;
	int n = *((int*)arg);
	
	while (1) {
		sleep(1);
		
		pthread_mutex_lock(&messageMutex);
		emettre(lg_message, msgSend, "11 ");
		pthread_mutex_unlock(&messageMutex);
	}
	
	return NULL;
}
Esempio n. 2
0
	void Image::emettreImage(QString titre, int numeroLiaison)
	{
		bool ok;

		// On compresse l'image dans un tableau
		QByteArray baImage;
		QBuffer bufImage(&baImage);
		ok = labelImage->pixmap()->save(&bufImage, "jpeg", 70);
		if (!ok)
			qWarning("Probleme de compression de l'image (emettreImage - Image.cpp)");
		
		// Taille des donnees
		quint32 tailleCorps =
			// Taille du titre
			sizeof(quint16) + titre.size()*sizeof(QChar) +
			// Taille de l'identifiant de l'image
			sizeof(quint8) + idImage.size()*sizeof(QChar) +
			// Taille de l'identifiant du joueur
			sizeof(quint8) + idJoueur.size()*sizeof(QChar) +
			// Taille de l'image
			sizeof(quint32) + baImage.size();
				
		// Buffer d'emission
		char *donnees = new char[tailleCorps + sizeof(enteteMessage)];

		// Creation de l'entete du message
		enteteMessage *uneEntete;
		uneEntete = (enteteMessage *) donnees;
		uneEntete->categorie = image;
		uneEntete->action = chargerImage;
		uneEntete->tailleDonnees = tailleCorps;
		
		// Creation du corps du message
		int p = sizeof(enteteMessage);
		// Ajout du titre
		quint16 tailleTitre = titre.size();
		memcpy(&(donnees[p]), &tailleTitre, sizeof(quint16));
		p+=sizeof(quint16);
		memcpy(&(donnees[p]), titre.data(), tailleTitre*sizeof(QChar));
		p+=tailleTitre*sizeof(QChar);
		// Ajout de l'identifiant de l'image
		quint8 tailleIdImage = idImage.size();
		memcpy(&(donnees[p]), &tailleIdImage, sizeof(quint8));
		p+=sizeof(quint8);
		memcpy(&(donnees[p]), idImage.data(), tailleIdImage*sizeof(QChar));
		p+=tailleIdImage*sizeof(QChar);
		// Ajout de l'identifiant du joueur
		quint8 tailleIdJoueur = idJoueur.size();
		memcpy(&(donnees[p]), &tailleIdJoueur, sizeof(quint8));
		p+=sizeof(quint8);
		memcpy(&(donnees[p]), idJoueur.data(), tailleIdJoueur*sizeof(QChar));
		p+=tailleIdJoueur*sizeof(QChar);
		// Ajout de l'image
		quint32 tailleImage = baImage.size();
		memcpy(&(donnees[p]), &tailleImage, sizeof(quint32));
		p+=sizeof(quint32);
		memcpy(&(donnees[p]), baImage.data(), tailleImage);
		p+=tailleImage;

		// Emission de l'image vers la liaison indiquee
		emettre(donnees, tailleCorps + sizeof(enteteMessage), numeroLiaison);
		// Liberation du buffer d'emission
		delete[] donnees;
	}
Esempio n. 3
0
	void LecteurAudio::emettreCommande(actionMusique action, QString nomFichier, quint32 position, int numeroLiaison)
	{
		int p;
		quint16 tailleNomFichier;
		
		// Donnees a emettre
		char *donnees;

		// Creation de l'entete du message
		enteteMessage uneEntete;
		uneEntete.categorie = musique;
		uneEntete.action = action;

		// Remplissage de l'entete et du corps en fonction de la commande envoyee
		switch(action)
		{
			case nouveauMorceau :
				uneEntete.tailleDonnees = sizeof(quint16) + nomFichier.size()*sizeof(QChar);
				donnees = new char[uneEntete.tailleDonnees + sizeof(enteteMessage)];
				// Ajout du nom du fichier dans le message
				p = sizeof(enteteMessage);
				tailleNomFichier = nomFichier.size();
				memcpy(&(donnees[p]), &tailleNomFichier, sizeof(quint16));
				p+=sizeof(quint16);
				memcpy(&(donnees[p]), nomFichier.data(), tailleNomFichier*sizeof(QChar));
				break;
			
			case lectureMorceau :
				uneEntete.tailleDonnees = 0;
				donnees = new char[uneEntete.tailleDonnees + sizeof(enteteMessage)];
				break;
			
			case pauseMorceau :
				uneEntete.tailleDonnees = 0;
				donnees = new char[uneEntete.tailleDonnees + sizeof(enteteMessage)];
				break;
			
			case arretMorceau :
				uneEntete.tailleDonnees = 0;
				donnees = new char[uneEntete.tailleDonnees + sizeof(enteteMessage)];
				break;
			
			case nouvellePositionMorceau :
				uneEntete.tailleDonnees = sizeof(quint32);
				donnees = new char[uneEntete.tailleDonnees + sizeof(enteteMessage)];
				// Ajout de la position dans le message
				memcpy(&(donnees[sizeof(enteteMessage)]), &position, sizeof(quint32));
				break;
			
			default :
				qWarning("Commande inconnue envoyee aux lecteurs audio des autres utilisateurs");
				break;
		}

		// Recopie de l'entete en debut de message
		memcpy(donnees, &uneEntete, sizeof(enteteMessage));

		// Emission du message vers le serveur ou les clients...
		if (numeroLiaison == -1)
			emettre(donnees, uneEntete.tailleDonnees + sizeof(enteteMessage));

		// ...ou bien vers un client en particulier
		else
			emettre(donnees, uneEntete.tailleDonnees + sizeof(enteteMessage), numeroLiaison);
		
		// Liberation du buffer d'emission
		delete[] donnees;
	}
Esempio n. 4
0
int main() { 
  struct sigaction action;
  /* autres variables (a completer) */
  int semid,i;
    
  setbuf(stdout, NULL);

  /* Creation du segment de memoire partagee */

  // A completer
  if ( (nb_recepteurs = init_shm(sizeof(t_segpart))) == NULL) 
    {
      perror("init_shm");
      exit(1);
    }
  nb_recepteurs->a = 0;
  
  /* creation des semaphores */ 

  // A completer
  if ((semid = creer_sem(NR+2)) == -1) 
    {
      perror("creer_sem");
      exit(1);
    }
 
  /* initialisation des semaphores */ 

  // A completer
  init_un_sem(EMET,1);
  init_un_sem(RECEPT1,0);
  init_un_sem(RECEPT2,0);
  init_un_sem(RECEPT3,0);
  init_un_sem(RECEPT4,0);
  init_un_sem(RECEPT5,0);
  init_un_sem(NBRECEPT,1);

  /* creation des processus emetteurs */ 
  for (i=0; i < NE ;i++)
    {
      if ((emet_pid[i] = fork()) == -1)
	{
	  perror("fork");
	  exit(0);
	}
      else if (emet_pid[i] == 0)
	{
	  emettre(i);
	}
    }

  // A completer - les pid des processus crees doivent
  // etre stockes dans le tableau emet_pid

  /* creation des processus recepteurs */ 

  // A completer - les pid des processus crees doivent
  // etre stockes dans le tableau recep_pid
  for (i=0; i < NR ;i++)
    {
      if ((recep_pid[i] = fork()) == -1)
	{
	  perror("fork");
	  exit(0);
	}
      else if (recep_pid[i] == 0)
	{
	  reception(i+1);
	}
    }

  /* redefinition du traitement de Ctrl-C pour arreter le programme */ 

  sigemptyset(&action.sa_mask);
  action.sa_flags = 0;
  action.sa_handler = handle_sigint;
  sigaction(SIGINT, &action, 0); 
    
  pause();                    /* attente du Ctrl-C  */
  return EXIT_SUCCESS;
} 
Esempio n. 5
0
int main (int argc, char** argv)
{
	int choix;
	int lg_message = LG_MESS_DEFAUT;
	int *n;
	char * msg = malloc(sizeof(char)*lg_message);
	
	pthread_mutex_t displayMutex = PTHREAD_MUTEX_INITIALIZER;
	initBeaconsLocation(beaconsLocation, (int) NUMBER_BEACONS);
	
	n = malloc(sizeof(int));
	//*n = 500000;
	*n = 1;
	
	char * adr = malloc(12*sizeof(char));
	adr = ADR_DIST;
	
	msgSend = malloc(sizeof(char)*lg_message);
	msgRcv = malloc(sizeof(char)*lg_message);
	
	pthread_t tid[2];
	pthread_create(&tid[0], NULL, receiverThread, NULL);
	
	// initialisation socket sender.
	// initialisation ici car on a besoin d'un receiver à l'écoute pour lancer le sender, donc pour le test en localhost on le fait après le receiver
	//printf("before %s\n", adr);
	usleep(30000);
	initSender(adr);
	//printf("%s\n", adr);
	
	pthread_create(&tid[1], NULL, coordinatesThread, n);
	
	pthread_mutex_lock(&displayMutex);
	printf("\n  Drone position : \n");
	printf("  Send : \n\n");
	pthread_mutex_unlock(&displayMutex);
	
	while(1) {

		pthread_mutex_lock(&displayMutex);
		printf("What do you want to do ?\n");
		printf("0 -> Calibration (drone must lay flat on the floor)\n");
		printf("1 -> Magnetic calibration\n");
		printf("2 -> landing\n");
		printf("3 -> take off\n");
		printf("4 -> move roll \n");
		printf("5 -> move pitch\n");
		printf("6 -> move pitch roll\n");
		printf("7 -> emergency\n");
		printf("8 -> anti emergency\n");
		printf("9 -> start mission\n");
		printf("10 -> stop mission\n");
		printf("-1 to close the programm\n");
		
		pthread_mutex_unlock(&displayMutex);
		
		scanf("%d", &choix);
		getchar();	
	
		pthread_mutex_lock(&displayMutex);
		printf("\033[%dA", 2);
		printf("\033[%dM", 1);	
		printf("\033[%dJ", 2);
		pthread_mutex_unlock(&displayMutex);	
		
		if (choix >= 0 && choix < 10) {
			sprintf(msg, " %d ", choix);
		}
		else {
			sprintf(msg, "%d ", choix);
		}
		
			
		if (choix == 9) {
		
			pthread_mutex_lock(&displayMutex);
			printf("\033[%dA", 12);
			printf("\033[%dM", 12);
		
			printf("Choose your beacon (from 0 to 7)\n");
			printf("0 -> %s\n", beaconsLocation[0]);
			printf("1 -> %s\n", beaconsLocation[1]);
			printf("2 -> %s\n", beaconsLocation[2]);
			printf("3 -> %s\n", beaconsLocation[3]);
			printf("4 -> %s\n", beaconsLocation[4]);
			printf("5 -> %s\n", beaconsLocation[5]);
			printf("6 -> %s\n", beaconsLocation[6]);
			printf("7 -> %s\n", beaconsLocation[7]);
			printf("\n\n");
			pthread_mutex_unlock(&displayMutex);
			
			scanf("%d", &choix);
			strcat(msg, beaconsLocation[choix]);
			//printf("######## msg : %s\n", msg);
			
			if (choix >= 0 && choix <=7) {
				pthread_mutex_lock(&messageMutex);
				emettre(lg_message, msgSend, msg);
				pthread_mutex_unlock(&messageMutex);
			
			}
			else {
				pthread_mutex_lock(&displayMutex);
				printf("incorrect choice\n");	
				pthread_mutex_unlock(&displayMutex);
			}
				pthread_mutex_lock(&displayMutex);
				printf("\033[%dA", 12);
				printf("\033[%dM", 12);
				printf("\033[%dJ", 2);
				pthread_mutex_unlock(&displayMutex);
		
		}
		else if (choix >= 0 && choix <= 10) {
			pthread_mutex_lock(&messageMutex);
			emettre(lg_message, msgSend, msg);
			pthread_mutex_unlock(&messageMutex);
		}
		else if (choix == -1) {
			pthread_cancel(tid[0]);
			pthread_cancel(tid[1]);
			closeSender();
			closeReceiver();
			break;
		}
		else {
			pthread_mutex_lock(&displayMutex);
			printf("incorrect choice\n");	
			pthread_mutex_unlock(&displayMutex);
		}
	}
	
	
	// pthread_exit(NULL);
	
	return 0;
}