Laboratorio di Calcolo B
Dario Barberis , Paolo Morettini, Fabrizio Parodi, Enrico Robutti


Introduzione

Registratore digitale

Esercizio 1 (Registratore digitale)
Esercizio 2 (Reg. dig. + signal handler)
Esercizio 3 (Reg. dig. con timer)

Esercizio 1
Creare un programma per gestisca la registrazione di misure di temperature (tramite termocoppia o pt100) ad intervalli regoli seguendo lo schema:

 int fd_metex; ofstream file_out;
 TCanvas *window; TGraph *graph;

 void init(){
   // apre la porta seriale e ne definisce i parametri di comunicazione
   // apre il file di output e la finestra grafica
 }

 void end(){
   // attiva l'editor grafico e poi chiude la finestra grafica
   // chiude il file di output e la seriale
 }

 double delta_t(struct timeval t0){
   // calcola la differenza tra il tempo "attuale" e t0
   return val;
 }

 void misura(){
   double dt  = delta_t(t0);
   double val = get_metex(...);
   double T   = ....; // eventuale conversione val->T
   // aggiornamento grafico e scrittura t e T su file
 }

 int main(){
   init(); 
   ...
   for (...){  // N misure (1 al secondo); 
     misura(); 
     sleep(1);
   } 
   ...
   end();
   ...
 }

Testate le funzioni una alla volta. Predisponete il programma in modo che possa graficare solo le ultime N misure acquisite.

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)
    }

  }