projelec

Dependencies:   mbed LCD_DISCO_F746NG BSP_DISCO_F746NG

user/keyboard.cpp

Committer:
aauzmendi
Date:
2020-03-19
Revision:
9:73d51d6171a8
Parent:
8:4e6dfbe97bbd

File content as of revision 9:73d51d6171a8:

/*
 *******************************************************************************
 * Keyboard Library virtual keyboard for touch screen display on demo
 * Découverte STM32F746NG
 *
 * Fichier "keyboard.ccp"
 *******************************************************************************
 */

/*Ajouter le fichier header*/
#include "keyboard.h"
#include "USBMIDI.h"
#include "MIDIMessage.h"
/* Les structures de la clavature et de l’écran tactile */
Keyboard_TypeDef keyboard;
TS_StateTypeDef tScreen;
USBMIDI midi(Highspeed_Interface,0x0700,0x0101,0x0001);

/*Fonction pour travailler avec le clavier à l’écran */

/* Initialisation et affichage du clavier */
uint8_t Keyboard_init(uint16_t  x_value, uint16_t   y_value)
{
    uint8_t i;

    /* Les coordonnées du coin supérieur gauche du clavier sur l’écran servent de "point
       de référence" pour déterminer l’emplacement de tous les autres éléments */

    keyboard.posX = x_value;
    keyboard.posY = y_value;

    /* La valeur par défaut sur le clavier est une disposition anglaise en MAJ. */
    keyboard.mode = MODE_UPPER_CASE;

    /* Bloc d’initialisation pour les clés standard */

    /* Initialisation des coordonnées des touches du clavier pour la première rangée */

    for (i = 0; i < 5; i++) {
        keyboard.key[i].id = i;
        keyboard.key[i].posX = keyboard.posX + 5 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * i;
        keyboard.key[i].posY = keyboard.posY + 3;
        keyboard.key[i].dimX = KEY_SMALL_LENGTH;
        keyboard.key[i].dimY = KEY_SMALL_HEIGHT;
        keyboard.key[i].status = KEY_RELEASED;
    }

    /* Valeurs ASCII de chaque touche de la première rangée pour différentes
       dispositions du clavier
    */
    keyboard.key[0].value[0] = 'D';
    keyboard.key[0].value[1] = 'd';
    keyboard.key[0].value[2] = '1';

    keyboard.key[1].value[0] = 'R';
    keyboard.key[1].value[1] = 'r';
    keyboard.key[1].value[2] = '2';

    keyboard.key[2].value[0] = 'M';
    keyboard.key[2].value[1] = 'm';
    keyboard.key[2].value[2] = '3';

    keyboard.key[3].value[0] = 'F';
    keyboard.key[3].value[1] = 'f';
    keyboard.key[3].value[2] = '4';

    keyboard.key[4].value[0] = 'S';
    keyboard.key[4].value[1] = 's';
    keyboard.key[4].value[2] = '5';


    /* Initialisation des coordonnées des touches du clavier pour la rangée du milieu */

    for (i = 5; i < 8; i++) {
        keyboard.key[i].id = i;
        keyboard.key[i].posX = keyboard.posX + 5 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * (i - 3) - 95;
        keyboard.key[i].posY = keyboard.posY + 3 + KEY_SMALL_HEIGHT + KEY_DISTANCE;
        keyboard.key[i].dimX = KEY_SMALL_LENGTH;
        keyboard.key[i].dimY = KEY_SMALL_HEIGHT;
        keyboard.key[i].status = KEY_RELEASED;
    }

    /* Valeurs ASCII de chaque touche de la rangée du milieu pour différentes
       dispositions du clavier
    */

    keyboard.key[5].value[0] = 'L';
    keyboard.key[5].value[1] = 'l';
    keyboard.key[5].value[2] = '1';

    keyboard.key[6].value[0] = 'S';
    keyboard.key[6].value[1] = 's';
    keyboard.key[6].value[2] = '2';

    keyboard.key[7].value[0] = 'D';
    keyboard.key[7].value[1] = 'd';
    keyboard.key[7].value[2] = '3';


    /* Nous dessinons le clavier à l’écran */

    Keyboard_display_all();

    return 0;
}

/* Dessiner le clavier à l’écran */

uint8_t Keyboard_display_all(void)
{
    uint8_t i;

    /* Nous obtenons la valeur associée à la couleur de l’arrière-plan de l’écran */
    uint32_t back_color = BSP_LCD_GetBackColor();

    /* Peindre l’écran entier avec la couleur de l’arrière-plan */
    BSP_LCD_Clear(back_color);

    /* Nous dessinons toutes les touches sur le clavier */

    for (i = 0; i < KEY_NUMBER; i++) {
        Key_display_normal(i);
    }

    return 0;
}

/* Dessin d’une seule touche de clavier à l’écran */

uint8_t Key_display_normal(uint8_t id)
{
    /* Nous obtenons la couleur de l’arrière-plan de l’écran et la couleur de la police */
    uint32_t back_color = BSP_LCD_GetBackColor();
    uint32_t text_color = BSP_LCD_GetTextColor();

    /* Changer les couleurs et peindre l’endroit pour la touche sur l’écran avec la couleur de l’arrière-plan */
    BSP_LCD_SetTextColor(back_color);
    BSP_LCD_SetBackColor(text_color);
    BSP_LCD_FillRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);

    /* Retournez les mêmes valeurs de couleur de l’arrière-plan de l’écran et de la couleur de police */
    BSP_LCD_SetTextColor(text_color);
    BSP_LCD_SetBackColor(back_color);

    /* Dessiner un cadre autour de la touche et fermer le pixel dans le coin inférieur droit */
    BSP_LCD_DrawRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);
    BSP_LCD_DrawPixel(keyboard.key[id].posX + keyboard.key[id].dimX, keyboard.key[id].posY + keyboard.key[id].dimY, text_color);

    /* Afficher la valeur de la touche dans la disposition actuelle du clavier. */
    BSP_LCD_DisplayChar(keyboard.key[id].posX + 8, keyboard.key[id].posY + 8, keyboard.key[id].value[keyboard.mode]);

    return 0;
}

/* Dessin d’une seule touche de clavier à l’écran (couleur inversée) */
uint8_t Key_display_inverted(uint8_t id)
{
    uint32_t back_color = BSP_LCD_GetBackColor();
    uint32_t text_color = BSP_LCD_GetTextColor();

    /* Remplir la place pour la touche à l’écran avec la couleur de la police */
    BSP_LCD_FillRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);

    /* Changer de couleur et afficher la valeur de la touche dans la disposition actuelle du clavier */
    BSP_LCD_SetTextColor(back_color);
    BSP_LCD_SetBackColor(text_color);
    BSP_LCD_DisplayChar(keyboard.key[id].posX + 8, keyboard.key[id].posY + 8, keyboard.key[id].value[keyboard.mode]);

    /* Retour de la couleur de fond d’écran précédente et la couleur de police */
    BSP_LCD_SetTextColor(text_color);
    BSP_LCD_SetBackColor(back_color);

    return 0;
}


/* Vérifier l’entrée sur le clavier à l’écran */
uint8_t Keyboard_check(void)
{
    uint8_t i;
    uint8_t j;

    /* Vérification de l’état du "conducteur" de l’écran tactile */
    BSP_TS_GetState(&tScreen);

    /* Si on appuie sur l'ecran */
    if (tScreen.touchDetected) {
        for (i = 0; i < KEY_NUMBER; i++) {
            /* Si les coordonnées tactiles se trouvent dans les limites de l’une des touches non pressés, +/- 4 pixels */
            if (((tScreen.touchX[0] >= keyboard.key[i].posX - 4) && (tScreen.touchX[0] < keyboard.key[i].posX + keyboard.key[i].dimX + 4)) &&
                    ((tScreen.touchY[0] >= keyboard.key[i].posY - 4) && (tScreen.touchY[0] < keyboard.key[i].posY + keyboard.key[i].dimY + 4)) &&
                    (keyboard.key[i].status == KEY_RELEASED)) {
                /* Dessinez la bonne clé dans la couleur inversée */
                Key_display_inverted(i);

                /* Si l'appui a déjà été fixée sur une autre clé, "appuyez-la" et redessiner */
                for (j = 0; j < KEY_NUMBER; j++) {
                    if (keyboard.key[j].status == KEY_PRESSED) {
                        Key_display_normal(j);

                        keyboard.key[j].status = KEY_RELEASED;
                    }
                }

                /* Changer l’état de la touche pour laquelle l'appui a été enregistré */
                keyboard.key[i].status = KEY_PRESSED;

                /* Réinitialisez l’état du conducteur de l’écran tactile */
                BSP_TS_ResetTouchData(&tScreen);
            }
        }
    }

    /* S’il n’y a pas de contact, vérifiez l’état de chaque touche, peut-être qu'un appui
       est déja en cours et devrait être traité comme une entrée */

    else {
        for (i = 0; i < KEY_NUMBER; i++) {
            /* Si la clé touche est pressée, "appuyez-la" et redessiner */
            if (keyboard.key[i].status == KEY_PRESSED) {
                Key_display_normal(i);

                keyboard.key[i].status = KEY_RELEASED;
                BSP_TS_ResetTouchData(&tScreen);

                /* On retourne la valeur de l'entrée */
                return keyboard.key[i].value[keyboard.mode];
            }
        }
    }

    return 0;
}

/* Gestionnaire d’entrée de clavier à l’écran */
uint8_t Keyboard_handler(char *prompt, char buffer[])
{
    uint8_t i;
    uint8_t key;

    /* Vérifiez s’il y a un nouveau clic */
    key = Keyboard_check();

    i=24;
    midi.write(MIDIMessage::NoteOn(i));
    wait(0.3);
    midi.write(MIDIMessage::NoteOff(i));


    /* Retourner la valeur de la dernière touche pressée */
    return key;
}