#ifndef __RD77_MESSAGES_H__
#define __RD77_MESSAGES_H__

/******************************
*  Autore: ing. Davide Rizzo  *
*       @ 2001 ELPA sas       *
* Ultima modifica: 31/01/2001 *
*        Versione: 1.00       *
******************************/

/*************************************************************************************
*           Descrizione del protocollo di comunicazione con la scheda RD77.          *
**************************************************************************************
* La comunicazione avviene tramite linea seriale RS232.                              *
* Il formato dei dati e' fisso: 19200 bit al secondo, parita' pari (even), 7 bit di  *
*  dato, 1 bit di stop.                                                              *
* La comunicazione avviene tramite pacchetti e caratteri di risposta (ACK e NAK).    *
* Un pacchetto e' formato dai seguenti elementi, indivisibili tra di loro:           *
*  - un identificatore di inizio SOH.                                                *
*  - uno o piu' byte di dati, che possono valere da 0x20 a 0x7F.                     *
*  - un byte di checksum, corrispondente allo XOR logico di tutti i byte di dati.    *
*  - un identificatore di fine EOH.                                                  *
* Se la scheda riceve un pacchetto valido risponde con il singolo byte ACK, o con un *
* pacchetto di risposta.                                                             *
* Se la scheda rileva un qualunque errore di comunicazione, risponde con il          *
*  singolo byte NAK.                                                                 *
* Non e' detto che la scheda risponda con NAK in caso di cattiva o mancata ricezione *
*  del pacchetto, ma e' assicurato che risponda con ACK (o con il pacchetto di       *
* risposta) se la ricezione e' corretta.                                             *
* Il byte di checksum non puo' assumere i valori < 0x20. In tal caso, bisogna        *
*  accodare ai dati del pacchetto un byte 0x20 (carattere di spazio), che trasforma  *
*  il checksum in un valore ammesso.                                                 *
* La scheda puo' segnalare un evento asincrono, inviando in qualunque momento il     *
*  carattere di ENQ. La causa che ha generato l'evento puo' venire successivamente   *
*  interpretata richiedendo la lettura delle informazioni di stato.                  *
*************************************************************************************/

/* Caratteri speciali */
#define SOH 0x01
#define	EOH 0x04
#define ENQ 0x05
#define ACK 0x06
#define	NAK 0x15

/* Elenco identificatori di pacchetto (primo byte di dati):
    Gli identificatori che iniziano per MESS_CMD sono comando dal PC alla scheda,
     che non richiedono una risposta (ma solo la conferma con ACK).
    Gli identificatori che iniziano per MESS_REQ sono richieste dal PC alla scheda,
     che richiedono una risposta.
    Gli identificatori che iniziano per MESS_REP sono risposte dalla scheda al PC.*/
#define MESS_CMD_PROG 'G'
#define MESS_CMD_SAVE 'S'
#define MESS_CMD_RESTORE 'Y'
#define MESS_CMD_DEFAULT 'D'
#define MESS_CMD_SOUND 'B'
#define MESS_CMD_PROBE_ENABLE 'E'
#define MESS_CMD_HOME 'H'
#define MESS_CMD_CLEAR_ERROR 'R'
#define MESS_REQ_CURRENT 'C'
#define MESS_REP_CURRENT 'c'
#define MESS_REQ_LATCHED 'L'
#define MESS_REP_LATCHED 'l'
#define MESS_REQ_PARAMETER 'P'
#define MESS_REP_PARAMETER 'p'
#define MESS_REQ_VERSION 'V'
#define MESS_REP_VERSION 'v'
#define MESS_REP_UNIMPLEMENTED '?'

/* Maschere di bit per il byte di richiesta dati e per
    i comandi di ricerca zeri e di cancellazione errori */
#define BIT_STATUS      0x01
#define BIT_AXES0_POS   0x02
#define BIT_AXES1_POS   0x04
#define BIT_AXES2_POS   0x08
#define BIT_AXES0_DIR   0x10
#define BIT_AXES1_DIR   0x20
#define BIT_AXES2_DIR   0x40
#define BIT_SPEED       0x80

/* Modalita' di ricerca zero */
#define	HOMECMD_CANCEL  0
#define	HOMECMD_ACTUAL  1
#define	HOMECMD_INDEX   2
#define	HOMECMD_SWITCHP 3
#define	HOMECMD_SWITCHN 4
#define	HOMECMD_BOTHP   5
#define	HOMECMD_BOTHN   6

/* Maschere di bit per la word di stato */
#define BIT_PROBE_ENABLED   0x0001  /* Palpatore abilitato */
#define BIT_PROBED_POINT    0x0002  /* Punto palpato */
#define BIT_PROBE_DEFLECTED 0x0004  /* Palpatore deflesso */
#define BIT_CARD_LOCKED     0x0008  /* Scheda non abilitata */
#define BIT_HOMING_0        0x0010  /* Primo asse in fase di ricerca zero */
#define BIT_HOMED_0         0x0020  /* Primo asse azzerato correttamente */
#define BIT_ERROR_0         0x0040  /* Avvenuto errore di lettura sul primo asse */
#define BIT_LIMIT_0         0x0080  /* Finecorsa primo asse */
#define BIT_HOMING_1        0x0100  /* Secondo asse in fase di ricerca zero */
#define BIT_HOMED_1         0x0200  /* Secondo asse azzerato correttamente */
#define BIT_ERROR_1         0x0400  /* Avvenuto errore di lettura sul secondo asse */
#define BIT_LIMIT_1         0x0800  /* Finecorsa secondo asse */
#define BIT_HOMING_2        0x1000  /* Terzo asse in fase di ricerca zero */
#define BIT_HOMED_2         0x2000  /* Terzo asse azzerato correttamente */
#define BIT_ERROR_2         0x4000  /* Avvenuto errore di lettura sul terzo asse */
#define BIT_LIMIT_2         0x8000  /* Finecorsa terzo asse */

/* Maschere di bit per il parametro di configurazione */
#define BIT_SOUND_DIRECT    0x01    /* Abilita il suono continuo a palpatore deflesso */

/*Elenco parametri*/
#define PAR_CONF         0   /* Configurazione del sistema, comprende le maschere di bit precedenti */
#define PAR_DIR_TIME     1   /* Ogni quanti millisecondi viene calcolata la direzione (5-255) */
#define PAR_DEBOUNCE     2   /* Tempo di antirimbalzo del palpatore in millisecondi (1-255) */
#define PAR_VOLUME       3   /* Volume dell'altoparlante (0-100) */
#define PAR_PROBE_FREQ   4   /* Frequenza del suono a tastatore deflesso, se abilitato in PAR_CONF */
#define PAR_FREQ_1       5   /* Frequenza del primo suono */
#define PAR_FREQ_2       6   /* Frequenza del secondo suono */
#define PAR_FREQ_3       7   /* Frequenza del terzo suono */
#define PAR_FREQ_4       8   /* Frequenza del quarto suono */
#define PAR_TIME_1       9   /* Durata del primo suono in decimi di secondo */
#define PAR_TIME_2       10  /* Durata del primo suono in decimi di secondo */
#define PAR_TIME_3       11  /* Durata del primo suono in decimi di secondo */
#define PAR_TIME_4       12  /* Durata del primo suono in decimi di secondo */

/* Tipi di stringhe informative */
#define STR_VERSION      0   /* Versione del firmware */
#define STR_DATE         1   /* Data di compilazione del firmware */
#define STR_DESCRIPTION  2   /* Nome e descrizione della scheda */
#define STR_AUTHOR       3   /* Nome del costruttore */

/*Elenco dei messaggi gestiti
  Tutti i valori numerici sono codificati in esadecimale, per brevita' indicheremo
   <L> un valore a 32 bit (8 cifre esadecimali),
   <W> un valore a 16 bit (4 cifre esadecimali),
   <B> un valore ad 8 bit (2 cifre esadecimali),
   <N> un valore a 4 bit (1 cifra esadecimale).
  I campi fissi (SOH, checksum ed EOH) non sono indicati.

 Messaggio di programmazione parametri
  MESS_CMD_PROG <B> <W>
 Programma il parametro <B> al valore <W>. Tale programmazione viene persa allo spegnimento
  della scheda, a meno che si invii il comando MESS_CMD_SAVE.

 Messaggio di salvataggio parametri
  MESS_CMD_SAVE
 Memorizza i parametri correnti nella memoria non volatile Eeprom, per poterli conservare
  allo spegnimento del sistema.

 Messaggio di ripristino parametri
  MESS_CMD_RESTORE
 Ripristina i parametri leggendoli dalla memoria non volatile Eeprom; questa operazione viene
  anche effettuata automaticamente all'accensione della scheda.

 Messaggio di inizializzazione parametri
  MESS_CMD_DEFAULT
 Imposta un set di parametri standard; per renderli permanenti, è necessario inviare anche
  un comando MESS_CMD_SAVE.

 Messaggio di generazione suono
  MESS_CMD_SOUND <N>
 Il parametro indica quale suono generare, da 0 a 3 sono i suoni a frequenza e durata fissa,
  da 4 a 7 sono i suoni campionati. Per questi ultimi, il volume non è controllabile.

 Messaggio di abilitazione palpatura
  MESS_CMD_PROBE_ENABLE
 Riabilita l'acquisizione di un punto. Per evitare la perdita di dati, l'acquisizione di un
  punto disabilita automaticamente l'acquisizione del punto successivo, finchè non
  viene inviato questo messaggio. 

 Messaggio di comando per esecuzione ricerca zero, annulla e sostituisce il precedente
  MESS_CMD_HOME <N> <N>
 Il primo parametro indica su quali assi agisce il comando, e' una maschera di bit
  che puo' essere formata dai seguenti bit:
  - BIT_AXES0_POS Abilita il comando sul primo asse
  - BIT_AXES1_POS Abilita il comando sul secondo asse
  - BIT_AXES2_POS Abilita il comando sul terzo asse
 Il secondo parametro indica il modo di ricerca zeri, puo' valere:
  - HOMECMD_CANCEL  Annulla tutte le operazioni di ricerca zero in corso
  - HOMECMD_ACTUAL  Effettua immediatamente lo zero sulla posizione corrente
  - HOMECMD_INDEX   Abilita la ricerca zero sul segnale di index
  - HOMECMD_SWITCHP Abilita la ricerca zero sul segnale di finecorsa attivo alto
  - HOMECMD_SWITCHN Abilita la ricerca zero sul segnale di finecorsa attivo basso
  - HOMECMD_BOTHP   Abilita la ricerca zero sulla presenza contemporanea del segnale di index 
                     e del segnale di finecorsa attivo alto
  - HOMECMD_BOTHN   Abilita la ricerca zero sulla presenza contemporanea del segnale di index
                     e del segnale di finecorsa attivo basso

 Messaggio di cancellazione errori
  MESS_CMD_CLEAR_ERROR <N>
 Cancella gli errori memorizzati nel byte di stato, il parametro e' una maschera
  di bit che puo' essere formata da:
  - BIT_AXES0_POS Cancella l'errore del primo asse
  - BIT_AXES1_POS Cancella l'errore del secondo asse
  - BIT_AXES2_POS Cancella l'errore del terzo asse

 Messaggio di richiesta valori immediati (da PC a scheda)
  MESS_REQ_CURRENT <B>
 Il byte di parametri e' codificato a bit; ogni bit abilita l'invio nel messaggio
  di risposta di un particolare dato
  - BIT_STATUS    Abilita l'invio della word di stato
  - BIT_AXES0_POS	Abilita l'invio della quota corrente dell'encoder 0
  - BIT_AXES1_POS	Abilita l'invio della quota corrente dell'encoder 1
  - BIT_AXES2_POS	Abilita l'invio della quota corrente dell'encoder 2
  - BIT_AXES0_DIR Abilita l'invio della direzione corrente dell'encoder 0
  - BIT_AXES1_DIR Abilita l'invio della direzione corrente dell'encoder 1
  - BIT_AXES2_DIR Abilita l'invio della direzione corrente dell'encoder 2

 Messaggio di risposta con valori immediati (da scheda a PC)
  MESS_REP_CURRENT <W> <L> <L> <L> <L> <L> <L> <L>
 I valori ritornati sono, nell'ordine:
  - Word di stato
  - Posizione corrente dell'encoder 0
  - Posizione corrente dell'encoder 1
  - Posizione corrente dell'encoder 2
  - Direzione corrente dell'encoder 0
  - Direzione corrente dell'encoder 1
  - Direzione corrente dell'encoder 2
  - Velocita' istantanea
 Vengono inviati solamente i valori abilitati nel messaggio di richiesta

 Messaggio di richiesta valori congelati (da PC a scheda)
  MESS_REQ_LATCHED <B>
 Il byte di parametri e' codificato a bit; ogni bit abilita l'invio nel messaggio
  di risposta di un particolare dato
  - BIT_STATUS    Abilita l'invio della word di stato
  - BIT_AXES0_POS Abilita l'invio della quota congelata dell'encoder 0
  - BIT_AXES1_POS Abilita l'invio della quota congelata dell'encoder 1
  - BIT_AXES2_POS Abilita l'invio della quota congelata dell'encoder 2
  - BIT_AXES0_DIR Abilita l'invio della direzione congelata dell'encoder 0
  - BIT_AXES1_DIR Abilita l'invio della direzione congelata dell'encoder 1
  - BIT_AXES2_DIR Abilita l'invio della direzione congelata dell'encoder 2
  - BIT_SPEED     Abilita l'invio della velocita' congelata

 Messaggio di risposta con valori congelata (da scheda a PC)
  MESS_REP_LATCHED <W> <L> <L> <L> <L> <L> <L> <L>
 I valori ritornati sono, nell'ordine:
  - Word di stato
  - Posizione congelata dell'encoder 0
  - Posizione congelata dell'encoder 1
  - Posizione congelata dell'encoder 2
  - Direzione congelata dell'encoder 0
  - Direzione congelata dell'encoder 1
  - Direzione congelata dell'encoder 2
  - Velocita' al momento del congelamento
 Vengono inviati solamente i valori abilitati nel messaggio di richiesta

 Messaggio di richiesta parametro (da PC a scheda)
  MESS_REQ_PARAMETER <B>
 Richiede la lettura del valore di un determinato parametro.

 Messaggio di risposta parametro (da scheda a PC)
  MESS_REP_PARAMETER <W>
 Restituisce il valore del parametro richiesto dal messaggio MESS_REQ_PARAMETER.

 Messaggio di richiesta stringa informativa (da PC a scheda)
  MESS_REQ_VERSION <N>
 Richiede la lettura di una stringa informativa.

 Messaggio di risposta stringa informativa (da scheda a PC)
  MESS_REP_VERSION <S>
 Restituisce la stringa informativa richiesta dal messaggio MESS_REQ_VERSION.
 In questo unico caso, l'identificatore di messaggio è seguito da una stringa
  alfanumerica di lunghezza variabile.

 Messaggio di risposta a comando sconosciuto (da scheda a PC)
  MESS_REP_UNIMPLEMENTED
 Viene inviato dalla scheda come conseguenza alla ricezione di un messaggio
  corretto, ma sconosciuto o non implementato.

*/

#endif	//__RD77_MESSAGES_H__
