rendered paste body#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include "AccesIpc.h"
#include "../Ecran/Ecran.h"
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define ROBOT
#define IDQ "PLENGA"
#define LIGNE " "
#define CLEF (key_t)5678
int Chemin[20];
int AllerOu[10];
void AffChemin(int aChemin[],int TailleChemin);
int idRq,idWq;
int NumRobot;
int main(int argc,char *argv[])
{
int rc,i = 0,idM,j,k,X=16,Y=0;
int hdPipe;
pid_t idPid;
char *pShm;
char CpAtelier[17][17],tmp[10],NumR;
Trace("\t\t(ROBOT) Entree dans Robot");
if((idM=shmget(CLEF,0,0)) == -1)
perror("Err. de creation de la file3");
if ((pShm = shmat(idM,NULL,0)) == (char *)-1)
perror("Err. d'att de la memoire partagee");
Trace("idM3 = %d\n",idM);
if(argc!=4)
{
Trace("\t\t(ROBOT) Trop ou trop peu d'argument(s)...");
Trace("\t\t(ROBOT) Usage: Numero_du_Robot Id_queue...");
exit(1);
}
NumRobot = atoi(argv[1]);
idRq = atoi(argv[2]);
idWq = idRq;
hdPipe= atoi(argv[3]);
//lecture dans le pipe
if (!(read(hdPipe,tmp,10)))
{
perror("(Robot) Erreur de lecture dans le Pipe...\n");
}
AllerOu[0] = atoi(tmp);
Chemin[2] = AllerOu[0];
Trace("\t\t(ROBOT) AllerOu : %d",Chemin[2]);
Chemin[1] = 1;
Chemin[0] = getpid();
if(SendMessage(Chemin,3*sizeof(int),1L)<0)
{
perror("(Robot) Erreur d'emission...\n");
exit(1);
}
/*Entre du robot ds l'atelier en position 1*/
sprintf(&NumR,"%d",NumRobot);
memcpy(CpAtelier,pShm,sizeof(CpAtelier));
tmp[0]=CpAtelier[X][Y];
CpAtelier[X][Y]=NumR;
memcpy(pShm,CpAtelier,sizeof(CpAtelier));
while (1)
{
idPid = getpid();
if((rc=ReceiveMessage(Chemin,&idPid))<0)
{
perror("(Robot) Erreur de reception...\n");
exit(1);
}
rc=rc/sizeof(int);
AffChemin(Chemin,rc);
/* Effectuer le deplacement dans la memoire partagee*/
for (j=0;j<rc-1;j++)
{
if ((Chemin[j+1]-Chemin[j])==1)
{
for (k=0;k<4;k++)
{
memcpy(CpAtelier,pShm,sizeof(CpAtelier));
CpAtelier[X][Y]=tmp[0];
tmp[0]=CpAtelier[X][Y+1];
Y++;
CpAtelier[X][Y]=NumR;
memcpy(pShm,CpAtelier,sizeof(CpAtelier));
sleep(1);
}
}
if ((Chemin[j+1]-Chemin[j])==-1)
{
for (k=0;k<4;k++)
{
memcpy(CpAtelier,pShm,sizeof(CpAtelier));
CpAtelier[X][Y]=tmp[0];
tmp[0]=CpAtelier[X][Y-1];
Y--;
CpAtelier[X][Y]=NumR;
memcpy(pShm,CpAtelier,sizeof(CpAtelier));
sleep(1);
}
}
if ((Chemin[j+1]-Chemin[j])==5)
{
for (k=0;k<4;k++)
{
memcpy(CpAtelier,pShm,sizeof(CpAtelier));
CpAtelier[X][Y]=tmp[0];
tmp[0]=CpAtelier[X-1][Y];
X--;
CpAtelier[X][Y]=NumR;
memcpy(pShm,CpAtelier,sizeof(CpAtelier));
sleep(1);
}
}
if ((Chemin[j+1]-Chemin[j])==10)
{
for (k=0;k<8;k++)
{
memcpy(CpAtelier,pShm,sizeof(CpAtelier));
CpAtelier[X][Y]=tmp[0];
tmp[0]=CpAtelier[X-1][Y];
X--;
CpAtelier[X][Y]=NumR;
memcpy(pShm,CpAtelier,sizeof(CpAtelier));
sleep(1);
}
}
if ((Chemin[j+1]-Chemin[j])==-5)
{
for (k=0;k<4;k++)
{
memcpy(CpAtelier,pShm,sizeof(CpAtelier));
CpAtelier[X][Y]=tmp[0];
tmp[0]=CpAtelier[X+1][Y];
X++;
CpAtelier[X][Y]=NumR;
memcpy(pShm,CpAtelier,sizeof(CpAtelier));
sleep(1);
}
}
if ((Chemin[j+1]-Chemin[j])==-10)
{
for (k=0;k<8;k++)
{
memcpy(CpAtelier,pShm,sizeof(CpAtelier));
CpAtelier[X][Y]=tmp[0];
tmp[0]=CpAtelier[X+1][Y];
X++;
CpAtelier[X][Y]=NumR;
memcpy(pShm,CpAtelier,sizeof(CpAtelier));
sleep(1);
}
}
}
sleep(3);
i++;
if(i>3)
break;
Chemin[1]=Chemin[rc-1];
Chemin[2]=AllerOu[i];
Chemin[0]=getpid();
if(SendMessage(Chemin,3*sizeof(int),1L)<0)
{
perror("(Robot) Erreur d'emission...\n");
exit(1);
}
}
}
void AffChemin(int aChemin[],int TailleChemin)
{
int i=0;
char szChemin[80],szBuff[80];
sprintf(szChemin,"\t\t(ROBOT %d) Chemin a suivre :",NumRobot);
while (i < TailleChemin)
{
sprintf(szBuff,"%4d ",aChemin[i++]);
strcat(szChemin,szBuff);
}
Trace(szChemin);
}