retour cours
//fichier grafcet.cpp , Patrick TRAU - IPST ULP

#include <iostream.h>
#include <stdlib.h>
#include <pthread.h>

#define nbcapteurs 6
enum capteurs {A,B,C,D,E,F};

pthread_t th1a3, th4a5, th6a7,thes;
void *ret;
int X3=0;
int capteur[nbcapteurs]={0};

void * etape1a3(void *);
void * etape4a5(void *);
void * etape6a7(void *);

void * etape1a3(void * arg)
{
  cout<<"entree etape 1\n";
  do ; while(!capteur[A]);
  cout<<"sortie etape 1\n";
  cout<<"entree etape 2\n";
  do ; while(!capteur[B]);
  cout<<"sortie etape 2\n";
  cout<<"entree etape 3\n";
  do ; while(!capteur[D]); //de toute façccedil;on il faut D
  //je previens 4a5 qu'il peut se terminer. Dans un premier temps via une variable globale
  X3=1;
  pthread_join (th4a5, &ret);
  cout<<"sortie etape 3\n";
  X3=0;
  pthread_create (&th6a7, NULL, etape6a7, (void*)"6a7");
  pthread_exit (0);
}
void * etape4a5(void * arg)
{
  cout<<"entree etape 4\n";
  do ; while(!capteur[C]);
  cout<<"sortie etape 4\n";
  cout<<"entree etape 5\n";
  do ; while(!X3);
  cout<<"sortie etape 5\n";
  pthread_exit (0);
}
void * etape6a7(void * arg)
{
  cout<<"entree etape 6\n";
  do ; while(!capteur[E]);
  cout<<"sortie etape 6\n";
  cout<<"entree etape 7\n";
  do ; while(!capteur[F]);
  cout<<"sortie etape 7\n";
  pthread_create (&th1a3, NULL, etape1a3, (void*)"1a3");
  pthread_create (&th4a5, NULL, etape4a5, (void*)"4a5");
  pthread_exit (0);
}
void * es(void * arg)
{
 char c;
 int i;
 do
  {
   cin>>c;
   if(c>='a'&&c<'a'+nbcapteurs) capteur[c-'a']=0;
   else if(c>='A'&&c<'A'+nbcapteurs) capteur[c-'A']=1;
   else if(c=='?')
    {
     for(i=0;i<nbcapteurs;i++) cout<<(char)('A'+i)<<'='<<capteur[i]<<" ";
     cout<<"\n";
    }
   else if (c!='Q')
    {
     cout<<"A a "<<(char)('A'+nbcapteurs-1)<<" (majuscule) : allumer un capteur\n";
     cout<<"a a "<<(char)('a'+nbcapteurs-1)<<" (minuscule) : eteindre un capteur\n";
     cout<<"? : etat des capteurs\n";
     cout<<"Q : quitter le programme\n";
    }
  }
 while(c!='Q');
}

main (void)
{
  pthread_create (&th1a3, NULL, etape1a3, (void*)"1a3");
  pthread_create (&th4a5, NULL, etape4a5, (void*)"4a5");
  pthread_create (&thes, NULL, es, (void*)"e-s");
  
  pthread_join (thes, &ret);
}



retour cours P. TRAU, ULP IPST, nov 05