Demo entry 4085403

code setr

   

Submitted by anonymous on Mar 17, 2016 at 17:15
Language: C. Code size: 8.3 kB.

/* David Delfieu : squelette de programme TP1 SETR (02/20011) */
#include "/opt/elinos/cdk/ppc/60x/glibc-2.3.2/powerpc-linux/include/stdio.h"
#include "/opt/elinos/cdk/ppc/60x/glibc-2.3.2/powerpc-linux/include/time.h"
//#include "/opt/elinos/cdk/ppc/60x/glibc-2.3.2/powerpc-linux/include/stdlib.h"
#include "/opt/elinos/cdk/ppc/60x/glibc-2.3.2/powerpc-linux/include/unistd.h"
#include "/opt/elinos/cdk/ppc/60x/glibc-2.3.2/powerpc-linux/include/pthread.h"
#include "/opt/elinos_30_ppc_basic_rtai/demos/RTAI-JANZ/src/janz/MTTL/h/mttl.h"
#include "/opt/elinos_30_ppc_basic_rtai/demos/RTAI-JANZ/src/janz/MTTL/h/cio8536.h"
#include "/opt/elinos_30_ppc_basic_rtai/demos/RTAI-JANZ/src/janz/M12E16/h/m12e16.h"
#include <sys/time.h>

/* Entetes des fonctions du fichier */

extern open();
int init();
int question1(void);
void *fils();
int ecrit(int val);

/* variables globales */
char dev[20] = "/dev/mttl_00"; /* carte numero 0*/
char bin[20] = "/dev/m12e16_02"; /* carte numero 2 */
int fd,fdCAN;

int pasEntier[4]={1,2,4,8};
int demiPAS[8]={1,3,2,6,4,12,8,9};
int tab[8]={1,3,2,6,4,12,8,9};
int borne;
int nbtour=1; 
int vitesse=10;
int sens=0;
int pas=1;
int fin=0;
// les var globales seront utilis??es par tous les programmes en m??me temps

/*---------------------------------------------------
YE Xiaokai et GUIHAL Jean-Marie
TP1 SETR 24/02/16
 


 /*---------------------------------------------------
  * question1
 * Fonction : clignotement(aucun param??tres)
 * Entr??es : aucune
 * Sorties : A (A0, A1, A2 et A3)
 * Variables : aucune
 * Sous programmes : ecrit, attente*/
 void clignotement(void)
 //fait clignoter la diode 0
 {
   int i;
   for (i=0;i<8;i++)
   {
      ecrit(0x01);
      attente(10);
      ecrit(0x00);
      attente(10);
   }
 }
 
 
 void attente(int tps)
 //attend tps ms
 {
   int i;
   for (i=0;i<tps;i++)
   {
     usleep(1);
   }
 }
 
 
 /*---------------------------------------------------
  * question 2
 * Fonction : 
 * Entr??es :
 * Sorties : 
 * Variables : 
 * Sous programmes : 
*/
 void menu()
 //g??re le choix des param??tres d'initialisation (modification des questions
suivantes, plus de nb_tour car inutile)
 {
  char choix;
  
  do {
        choix = NULL;
        affiche_menu();
        scanf("%c",&choix);

        switch (choix)
        {
          case 's':
            printf("\n 1 pour antihoraire,0 pour horaire \n");
            scanf("%d",&sens);
            break;
            
          case 'n':
            printf("\nEntrez nbr de tour\n");
            scanf("%d",&nbtour);
            break;
            
          case 'v':
            printf("\nEntrez vitesse");
            scanf("%d",&vitesse);
            break;
            
          case 'f':
            printf("fin initialisation");
            fin=1;
            break;
            
          case 't':
            tourne_entier();
            break;
          
          case 'p':
            printf("\n 1 pour 'pasEntier',0 pour 'demiPAS'");
            scanf("%d",&pas);
            break;
        }
    } while(fin==0);
    fin=0;    
 }
 
  void affiche_menu(void)
  //affiche les param??tres
  {
      printf("\n***\tMENU\t***\n");
      printf("\nTapez s pour d??finir le sens");
      printf("\nTapez n pour d??finir le nombre de tour");
      printf("\nTapez v pour d??finir la vitesse");
      printf("\nTapez t pour tester les param??tres moteur");
      printf("\nTapez f pour fin initialisation\n");
  }
 
  void tourne_demi(void)
  //tourne en demi-pas le moteur
  {
    int i;
    int j;
    
    if (sens==0)
    {
        for(j=0;j<8;j++)
        {
          ecrit(demiPAS[j]);
          attente(vitesse);
        
      }
    }
    else
    {
        for(j=7;j>=0;j--)
        {
          ecrit(demiPAS[j]);
          attente(vitesse);
        }
      }
  }
  
    void tourne_entier(void)
    //tourne en pas entier
  {
    int i;
    int j;
    
    if (sens==0)
    {
        for(j=0;j<4;j++)
        {
          ecrit(pasEntier[j]);
          attente(vitesse);
        }
      
    }
    else
    {
        for(j=3;j>=0;j--)
        {
          ecrit(pasEntier[j]);
          attente(vitesse);
        }
    }
  }

  /*
      void tourne_entier(nb_tour)
      //relique, fait des tours complet
  {
    int i;
    int j;
    
    if (sens==0)
    {
      for(i=0;i<nbr_tour*8;i++)
      {
        for(j=0;j<4;j++)
        {
          ecrit(pasEntier[j]);
          attente(vitesse);
        }
      }
    }
    else
    {
      for(i=0;i<nbr_tour*8;i++)
      {
        for(j=3;j>=0;j--)
        {
          ecrit(pasEntier[j]);
          attente(vitesse);
        }
      }
    }
  }
  */
  
/* ---question 3
 * on cr???? du thread qu'on appelle "le fils" dans la fonction "p??re" pour
r??aliser les fonctions ind??pendentes.
 * De plus, en utilisant "pthread_join", "le p??re" n'avance jamais seulement si "le
fils" finit sa t??che, 
 * et on applique "pthread_exit" pour assurer que "le fils" peut bien quitter. 
 * Sans "pthread_join", "le p??re" et "le fils" avancent parall??lement. Par
ailleurs, les s??quences des sorties sont al??atoires. 
 */


  
 /*---------------------------------------------------
  * question 4
 * Fonction : 
 * Entr??es :
 * Sorties : 
 * Variables : 
 * Sous programmes : 
*/
 
 
 void affiche_menu_inf(void)
 //affiche les param??tres pour le menu infinie
  {
      printf("\n***\tMENU INF\t***\n");
      printf("\nTapez s pour d??finir le sens");
      printf("\nTapez + ou - pour varier la vitesse");
      printf("\nTapez p pour choisir 'pasEntier' ou 'demiPAS'");
      printf("\nTapez q pour quitter\n");
  }
 
  void menu_inf(void)
  //g??re le menu pour la boucle infinie
 {
  char choix;
  
  do {
        affiche_menu_inf();
        choix = NULL;
        scanf("%c",&choix);

        switch (choix)
        {
          case 's':
            printf("\n 1 pour antihoraire,0 pour horaire \n");
            scanf("%d",&sens);
            break;
            
          case '-':
            vitesse +=2;
            if (vitesse>50)
              vitesse = 2;
            break;
            
          case '+':
            vitesse -=2;
            if (vitesse<1)
              vitesse = 1;
            break;            
            
          case 'q':
            fin=1;
            break;
            
          case 'p':
            printf("\n 1 pour 'pasEntier',0 pour 'demiPAS'");
            scanf("%d",&pas);
            break;  
        }
    } while(fin==0);
    
 }
 
/********************************************************/
/* Fonction initialisation carte TTL                        */        
/********************************************************/
int init(){
        if((fd = open(dev, 2, 0)) < 0){        /*2=RDWR*/ 
                perror("open failed");
                return -1;
        }
}

int main(void) {
  init();
  //clignotement();
  menu();
  pere();
  return(0);
}

/**********************************************************/
/* Fonction ecriture sur le port A                        */        
/**********************************************************/
int ecrit(int val) { 
  if(mttl_write(fd,0,~val)){
        perror("Erreur d'ecriture sur le port A");
        exit (-1);
  }
  return (0);
}


/**********************************************************/
/* Exemple d'application multithread                      */        
/**********************************************************/
int pere(void)
// prend en charge tous les param??tres (qui sont globaux)
{ 
  int p;
  pthread_t ID_fils;
  p=pthread_create(&ID_fils, NULL, fils,NULL);
  
  menu_inf();

  pthread_join(ID_fils,NULL);//attend que le fils se ferme
  printf("Tout le monde a ??t?? tu??, mission accomplie, fin de programme");
  return 0;
}


void *fils(void)
// tourne uniquement le moteur
{
  do{
    if (pas==1)
    {
      tourne_entier();
    }
    else
    {
      tourne_demi();
    }
  }while(fin==0);
  printf("fils termin??");
  pthread_exit(NULL); 
}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).