-
Notifications
You must be signed in to change notification settings - Fork 0
/
RobotAlimentation.c
87 lines (73 loc) · 2.39 KB
/
RobotAlimentation.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "RobotAlimentation.h"
#include <sys/sem.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include "Affichage.h"
void p(int semid) //prologue
{
char MessageAfficher[200];
struct sembuf op[1];
op[0].sem_num = 0;
op[0].sem_op = -1;
op[0].sem_flg = 0;
if(semop(semid, op, 1) == -1)
{
sprintf(MessageAfficher,"[Erreur] : Opération prologue sur sémaphore");
affichageConsole(LigneErreur,MessageAfficher);
}
}
void v(int semid) //epilogue
{
char MessageAfficher[200];
struct sembuf op[1];
op[0].sem_num = 0;
op[0].sem_op = 1;
op[0].sem_flg = 0;
if(semop(semid, op, 1) == -1)
{
sprintf(MessageAfficher,"[Erreur] : Opération épilogue sur sémaphore");
affichageConsole(LigneErreur,MessageAfficher);
}
}
//thread communiquant avec le superviseur : attend des nouvelles pièces
void* robotAlimentation(void* arg)
{
char MessageAfficher[200];
int i=0;
int cptPiece=0;
messageOperateur msg;
struct convoyeur* myConvoyeur = arg;
sprintf(MessageAfficher,"[Robot Alimentation] : Prêt");
affichageConsole(LigneRobotAlim,MessageAfficher);
piece nouvellePiece;
while(1)
{
sprintf(MessageAfficher,"[Robot Alimentation] : en attente de pièces...");
affichageConsole(LigneRobotAlim,MessageAfficher);
if((msgrcv(msgid, &msg, (sizeof(msg)-sizeof(long)), 1, 1)) == -1)
{
sprintf(MessageAfficher,"[Erreur] : Reception de message");
affichageConsole(LigneErreur,MessageAfficher);
}
nouvellePiece.typePiece=msg.operation;
nouvellePiece.fini=0;
for (i=0; i<msg.nbrPiece; i++)
{
nouvellePiece.identifiant=cptPiece++;
sprintf(MessageAfficher,"[Robot Alimentation] : pièce [%d] en transit...", nouvellePiece.identifiant);
affichageConsole(LigneRobotAlim,MessageAfficher);
alimente_convoyeur(nouvellePiece, myConvoyeur, tempsLimiteRobotAlim);
sprintf(MessageAfficher,"[Robot Alimentation] : pièce [%d] déposée..." , nouvellePiece.identifiant);
affichageConsole(LigneRobotAlim,MessageAfficher);
v(semid); // signal au superviseur que la piece est posée
}
sprintf(MessageAfficher,"[Robot Alimentation] : %d pièces mises sur le convoyeur, opération : %d\n",msg.nbrPiece, nouvellePiece.typePiece);
affichageConsole(LigneRobotAlim,MessageAfficher);
}
sprintf(MessageAfficher,"[Robot Alimentation] : Terminaison du thread");
affichageConsole(LigneRobotAlim,MessageAfficher);
pthread_exit(NULL);
}