Lab 6 final, sur l'écran tactile mlcd_32pt

Dependents:   testlab6

mlcd_32pt.cpp

Committer:
annicksenecal
Date:
2013-12-15
Revision:
0:20cb03f394d5

File content as of revision 0:20cb03f394d5:

#include "mbed.h"               // Pour accès aux différentes librairies du Mbed
#include "us_ticker_api.h"      // Accès à un compteur 32 bits en "free running"
#include "mlcd_32pt.h"          // Prototypes des fonctions et constantes pour l'afficheur µLCD32

#define LCD_TX      p28         // Broches pour communication avec l'afficheur µLCD32
#define LCD_RX      p27
#define LCD_RAZ     p30         // Broche pour remise à zéro de l'afficheur µLCD32
#define DELAI_RAZ   2000        // Constante pour délai en msec pour la remise à zéro de l'affichewur µLCD32
#define DELAI_CLIGNOTE 25       // Constante pour délai en msec du clignotement de l'ACK


Serial lcd(LCD_TX, LCD_RX);     // Objet pour communication série avec l'afficheur µLCD32
Serial term(USBTX, USBRX);      // Terminal série vers le PC pour mise au point
DigitalOut led_ack(LED1);       // Sortie vers LED1 pour indiquer si il y a réception de l'ACK de l'afficheur µLCD32 (2 clignotements rapides : ACK reçu, LED1 allumé : aucun ACK)
DigitalOut sig_raz(LCD_RAZ);    // Sortie pour contrôle de la remise à zéro de l'afficheur µLCD32
int reponse;

/*
    Remise à zéro de l'afficheur

*/
void raz(void)
{
   sig_raz = 0;         // Impulsion négative pour raz de l'afficheur
   wait_ms(25);
   sig_raz = 1;
   wait_ms(DELAI_RAZ);  // Délai d'attente après une remise à zéro
}

/* 
    Clignotement de la del pour l'ACK
    
    time : durée du clignotement en msec.  
*/
void pulse(int time)
{
    int i;
    for(i=0;i<2;i++)   // Clignote 2 fois
    {
      led_ack = 1;     // Clignotement de la LED de "time" msec.
      wait_ms(time);
      led_ack = 0;
      wait_ms(time);
    }
}

/*
    Lecture de l'ACK de l'afficheur LCD
*/

int ack(void)
{
   int rep = NAK;

    if ((rep = lcd.getc()) != ACK)  // Lecture de l'ACK
    {
        led_ack = 1;       // Allume le LED en cas d'erreur
        rep = NAK;
    }
    else
        pulse(DELAI_CLIGNOTE); // Indique que l'ACK est reçu
   
    wait_ms(25);

    return rep;
}

/*
    Conversion d'une couleur sur 24 bits en une couleur sur 16 bits pour l'afficheur µLCD32
    
    r : Couleur rouge sur 8 bits
    g : Couleur verte sur 8 bits
    b : Couleur bleu sur 8 bits
    
    Valeur de sortie : Couleur résultante sur 16 bits pour l'afficheur µLCD32
*/
int rgb(char r, char g, char b)
{
    return (r>> 3 << 11) | (g>> 2 << 5) | (b>> 3);  // Conversion des la valeur sur 24 bits en 16 bits
}

/*
    Dessin d'un bouton de contrôle pour l'afficheur µLCD32
    
    state : État du bouton ( 0 : pressé, 1 : relaché)
    x, y : Position du bouton
    bgcolor : Couleur de fond du bouton sur 16 bits
    font : Police des caractères (0 : 5x7, 1 : 8x8, 2 : 8x12, 3 : 12x16
    fgcolor : Couleur de la police sur 16 bits
    width, height : Facteur multiplicatif pour l'affichage des caractères
    *str : Pointeur vers chaîne de caractères à afficher dans le bouton
    
    Valeur de sortie : ACK ou NAK

*/
int drawTextButton(char state, int x, int y, int bgcolor,char font, int fgcolor, int width, int height, unsigned char *str)
{
    lcd.putc(BUTTON_TEXT);         // Commande pour bouton texte
    lcd.putc(state);               // Paramètres de la commande
    lcd.putc(x>>8);
    lcd.putc(x&0xff);
    lcd.putc(y>>8);
    lcd.putc(y&0xff);
    lcd.putc(bgcolor>>8);
    lcd.putc(bgcolor&0xff);
    lcd.putc(font);
    lcd.putc(fgcolor>>8);
    lcd.putc(fgcolor&0xff);
    lcd.putc(width);
    lcd.putc(height);
    while(*str)                     // Chaîne de caractères à afficher
        lcd.putc(*str++);

    lcd.putc(0);                    // Fin de la chaîne

    return ack();                   // Retourne la lecture de l'ACK
}

/*
    Dessin d'une chaîne de caractères pour l'afficheur µLCD32
     
    x, y : Position du début de la chaîne de caractères
    font : Police des caractères (0 : 5x7, 1 : 8x8, 2 : 8x12, 3 : 12x16
    fgcolor : Couleur de la police sur 16 bits
    *str : Pointeur vers chaîne de caractères à afficher dans le bouton
    
    Valeur de sortie : ACK ou NAK
    
*/

int drawString(int x, int y, char font, int fgcolor, int width, int height, unsigned char *str)
{
    lcd.putc(STRING);             // Commande pour le dessin d'une chaîne de caractères sur l'écran µLCD32
    lcd.putc(x>>8);               // Paramèrtre de la commande
    lcd.putc(x&0xff);
    lcd.putc(y>>8);
    lcd.putc(y&0xff);
    lcd.putc(font);
    lcd.putc(fgcolor>>8);
    lcd.putc(fgcolor&0xff);
    lcd.putc(width);
    lcd.putc(height);

    while(*str)                  // Chaîne de caractères à afficher
        lcd.putc(*str++);        

    lcd.putc(0);                 // Fin de la chaîne

    return ack();
}

/*
    Change la couleur de fond de l'afficheur µLCD32
    
    fgcolor : Couleur de fond sur 16 bits
    
    Valeur de sortie : ACK ou NAK

*/
int setbgColor(int fgcolor)
{
    lcd.putc(BGCOLOR);
    lcd.putc(fgcolor>>8);
    lcd.putc(fgcolor&0xff);
    return ack();
}

/*
    Initialisation du menu (ne fait rien à part d'effacer l'écran µLCD32)

    Valeur de sortie : ACK ou NAK
*/

int initMenu()
{
    int rep;

    lcd.putc(ERASE);    // Commande pour effacer l'écran
    rep = ack();        // Lecture de l'ACK
 
    return rep;
}

/*
    Initialise la vitesse de communication série avec l'afficheur
    
    baudrate : Vitesse de communication
    
    Valeur de sortie : ACK ou NAK

*/

int init_com(int baudrate)
{
    
    lcd.putc(SET_BAUD); // Commande pour changer de vitesse de communication
    lcd.baud(baudrate); // Nouvelle vitesse     
    
    return 1;//ack();       // Lecture de l'ACK
}

/*
    Initialisation de l'afficheur µLCD32
*/

void init_lcd(void)
{
    raz();  // remise à zéro de l'afficheur µLCD32
   
    
    lcd.putc(AUTO_BAUD); //Baudrate automatique
    ack();
    wait_ms(20);
        
    // Active l'écran tactile du µLCD32
    lcd.putc('Y');
    lcd.putc(0x05);
    lcd.putc(0x00);
    ack();
    
    // Active toute la surface de l'écran tactile
    lcd.putc('Y');
    lcd.putc(0x05);
    lcd.putc(0x02);
    ack();
    
    // Initialise le menu
    initMenu();
    
    //Initialise le GET TOUCH
    lcd.putc('o');
    lcd.putc(0x04);
    return reponse;
    
}

int double_clic(void)
{
    

    if (reponse == 2)
    {
        lcd.putc('w');
        lcd.putc(0x01);
        lcd.putc(0xF4);
        reponse = ack();
        
        if (reponse == 6)
        {
            lcd.putc('E');
            return ack();
        }
     }
}

int copier_coller(void)
{
    lcd.putc('c');
    lcd.putc(0x00);
    lcd.putc(0x00);
    lcd.putc(0x00);
    lcd.putc(0x0F);
    lcd.putc(0x00);
    lcd.putc(0x00);
    lcd.putc(0x00);
    lcd.putc(0x00);
    lcd.putc(0x01);
    lcd.putc(0x3F);
    lcd.putc(0x00);
    lcd.putc(0xE0);
    return ack();
    
}