#ifndef __TDS1002_H__
#define __TDS1002_H__

#include "serial.h"
#include "RS232Parser.h"
#include <string.h>
#include <math.h>
#include <stdlib.h>

/* Dimensione massima dei comandi */
#define MAXTOKENSIZE 20 

/* Messaggi restituiti dallo strumento */
#define ID_NAME  "ID TEK/TDS 1002,CF:91.1CT,FV:v2.06 TDS2MM:MMV:v1.04"
#define IDN_NAME "TEKTRONIX,TDS 1002,0,CF:91.1CT FV:v2.06 TDS2MM:MMV:v1.04"
#define QUERY_ONLY_COMMAND   "Error 100: Command error"
#define COMMAND_NOT_EXIST    "Error 110: Command header error"
#define INVALID_ARGUMENT     "Error 104: Data type error"
#define NO_TRIGGER           "Error 2221: Measurement error, No valid edge: No trigger cross"

/* Numero di campionamenti effettuati dallo strumento */
#define TDS1002_NSAMPLES 2500

/* Enum che servono per esprimere mnemonicamente i possibili valori 
   di alcune variabili */
enum {OFF,ON};
enum {GND,AC,DC};
enum {MAIN,WINDOW,ZONE};
enum {CH1,CH2,MATH,REFA,REFB};
enum {ASCII,RIBINARY,RPBINARY,SRIBINARY,SRPBINARY};
enum {ASC,BIN};
enum {SEC,HZ,VOLT,UNIT};
enum {ENV,Y};
enum {FALL,RISE};


/*
  Per poter leggere delle funzioni d'onda bisogna definire questo puntatore
  ad una funzione che calcoli il valore della tensione nei punti che vengono
  letti dai canali CH1 e CH2.
  Questa funzione deve accettare un valore iniziale del tempo e delle altezze
  del segnale sui canali e fornire nella locazione delle variabili ch1end e
  ch2end i valori su tali canali al tempo iniziale incrementato di timestep.
  In uscita il valore di InitialTime risulta aumentato di timestep. 
 */
extern void (*TDS1002Wave)(double* InitialTime, 
                           double ch1start,double ch2start,
                           double timestep,
                           double* ch1end, double* ch2end);

/* 
   Questa funzione fa partire un oscilloscopio TDS1002 sulla porta 
   seriale portname. 
   L'oscilloscopio sta poi indefinitamente in attesa di comandi su tale porta.
   Questa funzione e' l'unica che dovrebbe essere necessaria ad un programma
   esterno.
 */
int TDS1002Run(const char *portname);


/* 
   Le seguenti funzioni sono solo brevemente documentate perché non 
   dovrebbero servire ad un utilizzatore generico.
 */

/* Esegue un comando */
void TDS1002ExecuteCommand(const char* command, const char* argument);
/* Controlla il range della scala verticale */
double TDS1002VDiv(double VDiv);
/* Controlla il range della posizione verticale */
double TDS1002VPos(double VPos, int channel);
/* Controlla il range della scala orizzontale */
double TDS1002secDiv(double TDiv);
/* Aggiorna il formato dell'output: deve essere chiamata ogni volta che
   le scale o le posizioni vengono modificate. */
int TDS1002SetWFMParameters(int channel);
/* Acquisisce una funzione d'onda */
int TDS1002Acquire(double TimeOut);

#endif
