NBoard / IHM_V2

Dependents:   NBoard_IHM_V2 ex20_fonction ex21_PWM1 ex26 ... more

Fork of IHM_V2 by NBoard

Files at this revision

API Documentation at this revision

Comitter:
gr66
Date:
Sat Oct 01 12:23:41 2016 +0000
Child:
1:663cbe5baac4
Commit message:
v1.0

Changed in this revision

IHM.cpp Show annotated file Show diff for this revision Revisions of this file
IHM.h Show annotated file Show diff for this revision Revisions of this file
all_includes.h Show annotated file Show diff for this revision Revisions of this file
ident.h Show annotated file Show diff for this revision Revisions of this file
ktypes.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IHM.cpp	Sat Oct 01 12:23:41 2016 +0000
@@ -0,0 +1,283 @@
+#include "IHM.h"
+#include "all_includes.h"
+#include <stdarg.h>  // Pour va_list ... dans IHM_printf
+#include <stdio.h>   // Pour vprintf et setprintf 
+#define CAN_REMOTE CANType(2)
+//
+
+
+IHM::IHM(PinName CANRx, PinName CANTx): can(CANRx,CANTx)
+{
+    can.frequency(1000000);                                               /*Baud rate : kbits/s */
+    can.attach(this,&IHM::can_ISR_Reader); /* Fonction d'interruption CAN*/
+}
+void IHM::LCD_printf(const char* format, ...)
+{
+    va_list arg;
+    va_start(arg,format);
+    IHM_vprintf(format,arg);
+    va_end(arg);
+}
+unsigned char JOG_valeur,mise_a_jour_JOG=0,mise_a_jour_COD=0;
+void IHM::can_ISR_Reader(void)
+{
+    if (can.read(can_MsgRx[FIFO_ecriture])) {
+        // FIFO gestion
+        FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
+        // myled[0] = !myled[0];
+        // ledC= !ledC;
+    }
+}
+void IHM::CAN_automate_reception(void)
+{
+    static signed char FIFO_lecture=0,FIFO_occupation=0,FIFO_max_occupation=0;
+    FIFO_occupation=FIFO_ecriture-FIFO_lecture;
+    if(FIFO_occupation<0)
+        FIFO_occupation=FIFO_occupation+SIZE_FIFO;
+    if(FIFO_max_occupation<FIFO_occupation)
+        FIFO_max_occupation=FIFO_occupation;
+    if(FIFO_occupation>SIZE_FIFO)
+        while(!can.write(CANMessage(LCD_OVERFLOW,CANStandard)));
+    if(FIFO_occupation!=0) {
+        switch(can_MsgRx[FIFO_lecture].id) {
+            case JOG_DATA:
+                JOG_valeur=can_MsgRx[FIFO_lecture].data[0];
+                mise_a_jour_JOG=1;
+                break;
+            case COD_DATA:
+                COD_valeur=can_MsgRx[FIFO_lecture].data[0];
+                mise_a_jour_COD=1;
+                break;
+             default:
+                break;
+        }
+        FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
+    }
+}
+/* FILE: IHM.c */
+/****************************************************************************************/
+/* MODULE NAME: IHM 16x2                                                                */
+/*                                                                                      */
+/* AUTHOR     : Jacques-Olivier KLEIN                                                   */
+/*              Bruno LARNAUDIE                                                         */
+/*                                                                                      */
+/* EMAIL      : jacques-olivier.klein@u-psud.fr                                         */
+/*              bruno.larnaudie@u-psud.fr                                               */
+/*                                                                                      */
+/* INSTITUTION: IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN                 */
+/*                                                                                      */
+/* DATE       : 12/07/2012                                                              */
+/* CPU        : FREESCALE MC9S12XS128MAA                                                */
+/* BOARD      : CACHAN Xboard + IHM16x2                                                 */
+/* OS         : None                                                                    */
+/*                                                                                      */
+/* DESCRIPTION: Fonctions d'accès au Lcd émulé passant par le bus CAN                   */
+/****************************************************************************************/
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: IHM_init                                                              */
+/* DESCRIPTION  : Initialise l'afficheur IHM                                            */
+/* RETURN       : VOID                                                                  */
+/****************************************************************************************/
+
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: IHM_gotoxy                                                            */
+/* DESCRIPTION  : Modifie la position du curseur sur l'afficheur LCD de la carte IHM    */
+/* RETURN       : VOID                                                                  */
+/* PARAMETER  1 : UINT8 x : indice de la ligne   (0 à 1)                                */
+/* PARAMETER  2 : UINT8 y : indice de la colonne (0 à 15)                               */
+/****************************************************************************************/
+void IHM::LCD_gotoxy (UINT8 x, UINT8 y)
+{
+    curseur=(x*16+y)%32;
+}
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: IHM_sendchar                                                          */
+/* DESCRIPTION  : Envoie un caractere à afficher au controleur de l'afficheur LCD       */
+/* RETURN       : VOID                                                                  */
+/* PARAMETER  1 : char data : caractère à afficher                                      */
+/****************************************************************************************/
+void IHM::IHM_sendchar (char data)
+{
+    tableau_ecran[curseur]=data;
+    curseur=(curseur+1)%32;
+}
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: IHM_printf                                                            */
+/* DESCRIPTION  : Affichage formaté de type "printf" sur un afficheur LCD              */
+/* RETURN       : VOID                                                                  */
+/* PARAMETER  1 : char* format  : format d'affichage de printf                          */
+/* PARAMETER  2 : ...           : parametres à afficher                                 */
+/* Attention : le nouvel affichage doit recouvrir le précédent.                         */
+/*********************** NOTE concernant la commande IHM_printf *************************/
+/*  Les appels melangés à printf, LCD_printf et IHM_printf peuvent donner des resutlats */
+/*                                  imprevisibles                                       */
+/*                                                                                      */
+/*                 L'IHM doit etre initialise par la fonction IHM_init                  */
+/****************************************************************************************/
+void IHM::IHM_printf(const char* format, ...)
+{
+    //oldcurseur=curseur;
+    unsigned char i,j;
+    va_list args;
+    //sprintf(
+    //set_printf(IHM_sendchar); /* Placement des datas dans le tableau */
+    //vputc(IHM_sendchar);
+    va_start(args, format);
+    vsprintf(tableau_ecran+curseur,format, args);
+    va_end(args);
+    // envoi sur le bus can du tableau complet de l'ecran
+    for(j=0; j<4; j++) {
+        trame_Tx.id=LCD_CHAR0+j;
+        trame_Tx.type=CANData;
+        trame_Tx.len=8;
+        for(i=0; i<8; i++)
+            trame_Tx.data[i]=tableau_ecran[i+j*8];
+        while(!can.write(trame_Tx));
+        wait_us(150);
+    }
+}
+
+//********
+void IHM::IHM_vprintf(const char* format, va_list args)
+{
+    //oldcurseur=curseur;
+    unsigned char i,j;
+    ////va_list args;
+    //sprintf(
+    //set_printf(IHM_sendchar); /* Placement des datas dans le tableau */
+    //vputc(IHM_sendchar);
+    ////va_start(args, format);
+    vsprintf(tableau_ecran+curseur,format, args);
+    ////va_end(args);
+    // envoi sur le bus can du tableau complet de l'ecran
+    for(j=0; j<4; j++) {
+        trame_Tx.id=LCD_CHAR0+j;
+        trame_Tx.type=CANData;
+        trame_Tx.len=8;
+        for(i=0; i<8; i++)
+            trame_Tx.data[i]=tableau_ecran[i+j*8];
+        while(!can.write(trame_Tx));
+        wait_us(150);
+    }
+}
+/****************************************************************************************/
+/* FUNCTION NAME: IHM_sendstring                                                        */
+/* DESCRIPTION  : Affiche une chaine sur l'IHM                                          */
+/* RETURN       : VOID                                                                  */
+/* PARAMETER  1 : char* message : chaine de caractere a afficher                        */
+/****************************************************************************************/
+void IHM::IHM_sendstring (char* message)
+{
+    unsigned char i,j;
+    sprintf(tableau_ecran+curseur,message);
+
+    for(j=0; j<4; j++) {
+        trame_Tx.id=LCD_CHAR0+j;
+        trame_Tx.type=CANData;
+        trame_Tx.len=8;
+        for(i=0; i<8; i++)
+            trame_Tx.data[i]=tableau_ecran[i+j*8];
+        while(!can.write(trame_Tx));
+        wait_us(150);
+    }
+}
+/****************************************************************************************/
+/* FUNCTION NAME: IHM_clear                                                             */
+/* DESCRIPTION  : Efface le LCD                                                         */
+/* RETURN       : VOID                                                                  */
+/****************************************************************************************/
+void IHM::LCD_clear(void)
+{
+    UINT8 i;
+    curseur=0;
+    for(i=0; i<32; i++)
+        tableau_ecran[i]=32;
+    while(!can.write(CANMessage(LCD_CLEAR,CANStandard)));
+    wait_us(150);
+}
+/****************************************************************************************/
+/* FUNCTION NAME: BAR_set                                                             */
+/* DESCRIPTION  : commande les 10 LED du bargraph                                                       */
+/* PARAMETER  1 : UINT16 valeur : ordre d'allumage, exprimé sur les 10 bits de droite.
+                  Le bit k doit valoir 0 pour allumer la LED k, 1 pour l'éteindre.
+                  Exemple :  ~(1<<9) allume la LED 9, ~0x00F allume les 4 LED 0 à 3                                                                 */
+/****************************************************************************************/
+void IHM::BAR_set(UINT16 valeur)
+{
+    trame_Tx.id=BAR_SET;
+    trame_Tx.type=CANData;
+    trame_Tx.len=2;
+    trame_Tx.data[0]=valeur>>8;
+    trame_Tx.data[1]=(UINT8)valeur;
+    while(!can.write(trame_Tx));
+}
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: JOG_read                                                             */
+/* DESCRIPTION  : indique la position (parmi les 8 possibles) et l'enfoncement du Jog. */
+/* RETURN       : un octet UINT8 qui indique la position (RIGHT, LEFT, UP, DOWN + 4 combinaisons)
+                  et l'enfoncement (PUSH) du Jog, exprimés sur 5 bits utiles.*/
+
+/*         - Si le Jog est au repos : la fonction renvoie 0 (0x00).
+         - si le Jog n'est pas au repos : 1 à 3 bits peuvent être mis à 1 dans l'octet renvoyé.
+           Il est intéressant d'utiliser les masques définis en constantes.
+           La signification des 8 bits de la valeur renvoyée est:
+                     0   0   0   RIGHT   UP   PUSH   LEFT   DOWN
+           Plusieurs bits peuvent être à 1 en même temps. Par exemple :  RIGHT + UP + PUSH
+           à 1 indiquent que le Jog est en position "Nord Est " (UP+RIGHT) et qu'il est enfoncé.
+           Si le Jog est simultanément enfoncé et positionné à droite, la fonction renvoie
+           (0001 0100) en binaire, soit 0x14. Exprimée avec les masques, la valeur renvoyée vaut
+           JOG_MSK_RIGHT | JOG_MSK_PUSH  (0x14). */
+/**************************************************************************************************/
+/**************************************************************************************************/
+/* utiliser les Constantes symboliques de IHM.h pour interpréter la valeur renvoyée par le jog... */
+/**************************************************************************************************/
+
+UINT8 IHM::JOG_read(void)
+{
+    trame_Tx.id=JOG_REQ;
+    trame_Tx.type=CAN_REMOTE;
+    while(!can.write(trame_Tx));
+
+    while(mise_a_jour_JOG==0)
+        CAN_automate_reception();
+    mise_a_jour_JOG=0;
+    return JOG_valeur;
+
+}
+
+
+/***************************************************************************************************/
+/* FUNCTION NAME: COD_read                                                                         */
+/* DESCRIPTION  : indique la rotation effectuée par le codeur incrémental.                         */
+/* RETURN       : un octet UINT8 dont la valeur entre 0 et 255 indique la rotation du
+                  codeur incrémental depuis l'initialisation du codeur (cad de la carte IHM),
+                  exprimée en douzièmes de tours. Le codeur dispose en effet de 12 positions
+                  et la valeur retournée s'incrémente/se décrémente à chaque 12e de tour.
+                  Par exemple, si le codeur a été tourné de 2 tours et demi, la valeur
+                  retournée vaut 12+12+6 = 30 = 0x1E (le codeur a effectué 30 douzièmes de tour)   */
+/***************************************************************************************************/
+
+UINT8 IHM::COD_read(void)
+{
+    trame_Tx.id=COD_REQ;
+    trame_Tx.type=CAN_REMOTE;
+    while(!can.write(trame_Tx));
+
+//    while(!can.write(CANMessage(COD_REQ,CANStandard)));
+    while(mise_a_jour_COD==0)
+        CAN_automate_reception();
+    mise_a_jour_COD=0;
+    return COD_valeur;
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IHM.h	Sat Oct 01 12:23:41 2016 +0000
@@ -0,0 +1,124 @@
+/// @file IHM.h Bibliothéque de classe pour la carte Zboard
+/// @mainpage
+///
+///
+///
+/// @author Gilles Raynaud, IUT Cachan
+///
+/// @note
+/// History
+/// v1.00 01/10/2016
+#include "all_includes.h"
+#define SIZE_FIFO 32
+#define MESSAGE_BUFFER_SIZE 20
+#define JOG_MSK_PUSH   (1<<2)   // valeur renvoyée si le Jog est enfoncé (en position de repos)
+#define JOG_MSK_RIGHT  (1<<4)   // valeur renvoyée si le Jog est poussé vers la droite (non enfoncé).
+#define JOG_MSK_UP     (1<<3)   // valeur renvoyée si le Jog est poussé vers le haut (non enfoncé).
+#define JOG_MSK_LEFT   (1<<1)   // valeur renvoyée si le Jog est poussé vers la gauche (non enfoncé).
+#define JOG_MSK_DOWN   1        // valeur renvoyée si le Jog est poussé vers le bas (non enfoncé).
+
+//static char tableau_ecran[32]= {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32};
+
+//
+///
+/// Example:
+/// @code
+///#include "IHM.h"
+///IHM ihm;
+///Serial pc(SERIAL_TX, SERIAL_RX);
+///int main()
+///{
+///    unsigned char i=0,j;
+///    float pi=4*atan(1.0);
+///    pc.printf("debut");
+///    ihm.LCD_printf("Hello World      ");
+///    ihm.LCD_gotoxy(1,0);
+ ///   ihm.LCD_printf("PI= %f",pi);  // test affichage float
+///    ihm.BAR_set(0x3FF);
+///    wait(2);
+///    ihm.BAR_set(0x2AA);
+///    wait(2);
+///    ihm.BAR_set(0x155);
+///    wait(2);
+///    ihm.LCD_clear();
+///    while(1) {
+///        wait(0.1);
+///        printf("cod");
+///        i=ihm.COD_read();      
+///        j=ihm.JOG_read();
+///        ihm.BAR_set((UINT16)(i));
+///        ihm.LCD_gotoxy(0,0);
+///        ihm.LCD_printf("Jog=%02d",j);
+///        ihm.LCD_gotoxy(1,0);
+///        ihm.LCD_printf("Cod=%03d",i);
+///    }
+///}
+/// @endcode
+///
+class IHM
+{
+public:
+    /// Constructeur pour l'interface Zboard, normalement placé à l'extérieur de main
+    /// Les paramètres peuvent être omis (ils ont tous une valeur par défaut)
+    ///
+    IHM(PinName CANRx=PA_11, PinName CANTx=PA_12);
+    /// commande des 10 leds du bargraph
+    ///
+    /// Affiche la valeur passée en argument sur le bargraph
+    /// @param valeur à afficher sur le bargraph
+    /// @returns void
+    ///
+    void BAR_set(UINT16 valeur);  
+    /// lecteur du codeur
+    ///
+    /// Retourne la valeur du codeur (0-255)
+    /// @param void
+    /// @returns valeur du codeur
+    ///
+    UINT8 COD_read(void);
+    /// positionne le curseur de l'afficheur LCD
+    ///
+    /// @param  x colonne
+    /// @param  y ligne
+    /// @returns void
+    ///
+    void LCD_gotoxy(UINT8,UINT8);
+
+    /// écriture formatée sur l'afficheur LCD
+    ///
+    /// @param  format...
+    /// @returns void
+    ///
+    void LCD_printf(const char* format, ...);
+    /// effacement de l'afficheur LCD
+    ///
+    /// @param  void
+    /// @returns void
+    ///
+    void LCD_clear(void);
+    /// lecture du JOG
+    /// retourne la position (8 possibilités) et l'enfoncement du Jog
+    /// @param  void
+    /// @returns void
+    ///
+    UINT8 JOG_read(void);
+private:
+    int COD_valeur;
+    unsigned char JOG_valeur,mise_a_jour_JOG,mise_a_jour_COD;
+    unsigned char FIFO_ecriture;
+//    CANMessage can_MsgRx[SIZE_FIFO];
+    UINT8 curseur;
+    UINT8 IHM_is_running;
+    CANMessage can_MsgRx[SIZE_FIFO], can_MsgTx;
+//extern unsigned char Reception_CAN;
+CANMessage trame_Tx;
+//static char tableau_ecran[32]= {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32};
+char tableau_ecran[32];
+    CAN can;
+    void can_ISR_Reader(void);
+    void CAN_automate_reception(void);
+    void IHM_sendchar (char data);
+    void IHM_printf(const char* format, ...);
+    void IHM_vprintf(const char* format, va_list args);
+    void IHM_sendstring (char* message);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/all_includes.h	Sat Oct 01 12:23:41 2016 +0000
@@ -0,0 +1,5 @@
+#include "mbed.h"
+#include "ktypes.h"
+#include "ident.h"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ident.h	Sat Oct 01 12:23:41 2016 +0000
@@ -0,0 +1,58 @@
+#ifndef _IDENT_H
+#define _IDENT_H
+
+/* FILE: ident.h */
+/****************************************************************************************/
+/* MODULE NAME: MC9S12XS128 - MSCAN => Motorola Scalable Controller Area Network        */
+/*                                     (BUS CAN)                                        */
+/*                                                                                      */
+/* AUTHOR     : BRUNO LARNAUDIE                                                         */
+/*                                                                                      */
+/* EMAIL      : bruno.larnaudie@u-psud.fr                                               */
+/*                                                                                      */
+/* INSTITUTION: IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN                 */
+/*                                                                                      */
+/* DATE       : 03/07/2012                                                              */
+/* CPU        : FREESCALE MC9S12XS128MAA                                                */
+/* BOARD      : CACHAN Xboard+MicroB12                                                  */
+/* OS         : None                                                                    */
+/*                                                                                      */
+/* DESCRIPTION: Identifiants utilises sur le bus CAN                                    */
+/****************************************************************************************/
+
+//         NOM            ID     |Flag |Sens |Data |     Fonction       | Data                                            |
+//                               |Mess |(I/O)|Req  |                    | nb   | Type | contenu (dans l'ordre)            |
+//------------------------------------------------------------------------------------------------------------------------|
+// Carte IHM 0x700-0x7FF         |     |     |     |                    |      |      |                                   |
+//------------------------------------------------------------------------------------------------------------------------|
+//                             //|     |     |     |                    |      |      |                                   |
+//  Module LCD 16x2            //|     |     |     |                    |      |      |                                   |
+#define   LCD_CHAR0      0x700 //|  M  |  O  |  D  |char 0 a 7 sur LCD  |  8   |  U8  | C00|C01|C02|C03|C04|C05|C06|C07   |
+#define   LCD_CHAR1      0x701 //|  M  |  O  |  D  |char 8 a 15 sur LCD |  8   |  U8  | C08|C09|C10|C11|C12|C13|C14|C15   |
+#define   LCD_CHAR2      0x702 //|  M  |  O  |  D  |char 16 a 23 sur LCD|  8   |  U8  | C16|C17|C18|C19|C20|C21|C22|C23   |
+#define   LCD_CHAR3      0x703 //|  M  |  O  |  D  |char 24 a 31 sur LCD|  8   |  U8  | C24|C25|C26|C27|C28|C29|C30|C31   |
+//                             //|     |     |     |                    |      |      |                                   |
+//                       0x704 //|     |     |     |                    |      |      | Reserve pour un éventuel LCD      |
+// Réservé               ...   //|     |     |     |                    |      |      | plus grand ou tactile             |
+//                       0x77D //|     |     |     |                    |      |      |                                   |
+//                             //|     |     |     |                    |      |      |                                   |
+#define   LCD_OVERFLOW   0x77E //|  M  |  O  |  R  |Flag d'Overflow LCD |  0   |      |                                   |
+#define   LCD_CLEAR      0x77F //|  M  |  O  |  D  |                    |  0   |      | Efface l'ecran LCD                |
+                               //|     |     |     |                    |      |      |                                   |
+// JOG                         //|     |     |     |                    |      |      |                                   |
+#define   JOG_REQ        0x790 //|  M  |  I  |  R  | Demande valeur JOG |  0   |      |                                   |
+#define   JOG_DATA       0x791 //|  M  |  O  |  D  |     Valeur JOG     |  1   |  U8  | STATUS_JOG=PTP                    |
+// CODEUR                        |     |     |     |                    |      |      |                                   |
+#define   COD_REQ        0x7A0 //|  M  |  I  |  R  | Demande valeur COD |  0   |      |                                   |
+#define   COD_DATA       0x7A1 //|  M  |  O  |  D  |     Valeur COD     |  1   |  S8  | OFFSET du CODEUR entre -128 et 127|
+// BARGRAPH                      |     |     |     |                    |      |      |                                   |
+#define   BAR_SET        0x7B0 //|  M  |  I  |  D  |   valeur bargraph  |  2   |  U16 | Les bits à allumer                |
+//------------------------------------------------------------------------------------------------------------------------|
+/* Légende : I = Consigne pour la carte
+             O = Etat donné par la carte
+             
+             D = Trame de données
+             R = Trame de requete */
+             
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ktypes.h	Sat Oct 01 12:23:41 2016 +0000
@@ -0,0 +1,56 @@
+#ifndef __KTYPES_H__
+#define __KTYPES_H__
+
+/* FILE: ktypes.h */
+/****************************************************************************************/
+/* MODULE NAME: None                                                                    */
+/*                                                                                      */
+/* AUTHOR     : Jacques-Olivier KLEIN                                                   */
+/*                                                                                      */
+/* EMAIL      : jacques-olivier.klein@u-psud.fr                                         */
+/*                                                                                      */
+/* INSTITUTION: IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN                 */
+/*                                                                                      */
+/* DATE       : 03/07/2012                                                              */  
+/* CPU        : FREESCALE MC9S12XS128MAA                                                */
+/* BOARD      : CACHAN Xboard+MicroB12                                                  */
+/* OS         : None                                                                    */
+/*                                                                                      */
+/* DESCRIPTION: Definition des types de longueurs fixes                                 */
+/****************************************************************************************/
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+typedef  unsigned char BOOL ;
+
+typedef unsigned char  UINT8;
+typedef unsigned short UINT16;
+typedef unsigned long  UINT32;
+typedef   signed char  SINT8;
+typedef   signed short SINT16;
+typedef   signed long  SINT32;
+
+typedef unsigned char  INT8U;
+typedef unsigned short INT16U;
+typedef unsigned long  INT32U;
+typedef   signed char  INT8S;
+typedef   signed short INT16S;
+typedef   signed long  INT32S;
+
+typedef unsigned char  U8;
+typedef unsigned short U16;
+typedef unsigned long  U32;
+typedef   signed char  S8;
+typedef   signed short S16;
+typedef   signed long  S32;
+
+typedef volatile unsigned char  VUINT8;
+
+
+#endif
+