Esercizio 1 (Registratore digitale)
Esercizio 2 (Reg. dig. + signal handler)
Esercizio 3 (Reg. dig. con timer)
Esercizio 1
Create le seguenti funzioni (e testatele una alla volta)
void init(){ // apre le comunicazioni con la seriale // apre il pacchetto grafico ROOT // apre il file di uscita // inizializzazione t0 }
void end(){ // chiude le comunicazioni con la seriale // chiude il pacchetto grafico ROOT // chiude il file di uscita }
#include <sys/time.h> struct timeval t0; // variabile globale double get_time(){ struct timeval t_tmp; // calcola la differenza (t) tra t_tmp e t0 return t; }
double get_val(){ .. return val; }(vedi scorsa esercitazione)
#define MAXDAT 10; double v_buf[MAXDAT]; double t_buf[MAXDAT]; int curpos = 0; // indice del buffer int ndat = 0; // elementi nel buffer // queste variabili sono globali void put_val(double t, double v){ // scrive t e v nei buffer circolari v_buf e t_buf v_buf[curpos]=v; t_buf[curpos]=t; curpos++; if (ndat < MAXDAT) ndat++; if (curpos >= MAXDAT) curpos -= MAXDAT; }Poiché lo scopo del buffer circolare è di disegnare solo gli ultimi n punti (dove n è la dimensione del buffer circolare) si può anche sfruttare le potenzialità di ROOT utilizzando il metodo di TGraph SetPoint:
TGraph gr; ... if (ind>=n) ind=0; gr.SetPoint(ind++,x,y) ...
int main(){ init(); for(int i=0;i<100;i++){ //faccio 100 misure double t = get_time(); double v = get_val(); put_val(t,v); // riempimento del buffer circolare ... // scrittura di t e v su file ... // disegno dei punti sleep(1); // aspetto 1 sec } end(); }
Esercizio 2
Modificate il programma precedente in modo che possa essere interrotto
da tastiera (ad esempio con crtl-C che corrisponde a SIGINT).
#include <signal.h> int main(){ ... signal(SIGINT,end); // attenzione void end() va modificata in void end(int sig) ... while(1){ ... // misura.. } ... }
Esercizio 3
Modificate il programma precedente in modo che la singola misura (+ lettura del tempo,
aggiornamento del buffer,...) sia eseguita
da una funzione a sua volta chiamata da un timer.
void misura(int sig){ ... } int main(){ struct itimerval timer; timer.it_value.tv_sec = 1; timer.it_value.tv_usec = 500000; timer.it_interval.tv_sec = 1; timer.it_interval.tv_usec = 0; setitimer(ITIMER_REAL,&timer,NULL); // regolazione dei parametri signal(SIGALRM,misura); while(1){ ... // puo' contenere comunicazione con l'utente per // modifica dei parametri di acquisizione (ad es. // frequenza di acquisizione) } }