/* 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);
}