/*                      SISAJMOD200.C                       */

 

#include <fcntl.h>     

#include <stdio.h>     

#include <unistd.h>    

#include <sys/time.h>  

#include <sys/shm.h>   

#include <signal.h>    

#include "/home/projekt/drv/a2dc.h"

 

typedef struct{  

      WORD ch[9];

      struct timeval vrijeme;

} OKVIR;   

typedef struct{  

      WORD ch;

      struct timeval vrijeme;

} PODATAK; 

 

OKVIR *pokaz;    

PODATAK uzorak;  

struct timeval sat;    

unsigned long t1,t2,brojac;  

int VELSEGM=1000*sizeof(OKVIR);    

int KLJUC[4]={0x56789,0x6789a,0x789ab,0x89abc};

int nacin,des,rezol,ch;

int i,shareid,pozid,*pokpoz,skok,san,uvjet,kontrolja,poslano;    

 

void zakvaci(void);    

void prekid(int);

void salji(int); 

 

void zakvaci(void){    

      shareid=shmget(KLJUC[rezol-1],VELSEGM,IPC_CREAT|0666);

      pokaz=shmat(shareid,0,0);

      pozid=shmget(KLJUC[3],3*sizeof(int),IPC_CREAT | 0666);

      pokpoz=shmat(pozid,0,0);

}    

 

/*   

void prekid(int sign){ 

      PODATAK kraj;

      gettimeofday(&sat,NULL);

      kraj.vrijeme=sat;

      kraj.ch=0xc000;

      write(des,&kraj,sizeof(PODATAK));

      shmdt(pokaz);

      exit(-1);

}    

*/   

 

void salji(int sajn){                    

      brojac=0;              

      read(kontrolja,&ch,4);        /*procitaj kanal iz kontr. cjevovoda*/

      read(kontrolja,&rezol,4);/*procitaj rezoluciju iz kontr. cjevovoda*/

 

 

      skok=(*(pokpoz+rezol-1));                

      while (brojac<nacin){              

            if(skok==1000) skok=0;       

 

                  if (skok==999){  

                        t1=(pokaz+skok)->vrijeme.tv_sec;

                        t2=(pokaz)->vrijeme.tv_sec;

                  }    

                  else{

                        t1=(pokaz+skok)->vrijeme.tv_sec;               

                        t2=(pokaz+skok+1)->vrijeme.tv_sec;             

                  }                      

                  if(t2<t1){                   

                        if(rezol==1) usleep(50);                 

                        if(rezol==2) sleep(2);             

                        if(rezol==3) sleep(200);                 

                  }                      

                  else{                  

                        uzorak.vrijeme=(*(pokaz+skok)).vrijeme;              

                        uzorak.ch=(*(pokaz+skok)).ch[ch];              

                        poslano=(int)uzorak.ch;            

write(des,&poslano,4);  /*upisi jedan podatak u cjevovod*/

                        usleep(1);             

                        skok++;                

 

                        brojac++;  

                  }          

 

      }                      

}                            

 

void main(){                             

 

      des=open("FiFo",2);                 /*otvori cjevovod za podatke*/

      kontrolja=open("FiFoKaNaL",1);      /*otvori cjevovod za kontrolu*/

 

      nacin=80;                     /* salje se po 80 podataka*/

 

      zakvaci();                   

 

      signal(SIGUSR1,salji);        /*cekaj SIGUSR1 pa salji podatke*/

 

 

 

      while(1);

}

 

 

 

 

natrag