
projelec
Dependencies: mbed LCD_DISCO_F746NG BSP_DISCO_F746NG
Diff: user/keyboard.cpp
- Revision:
- 8:4e6dfbe97bbd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/keyboard.cpp Thu Mar 19 07:55:50 2020 +0000 @@ -0,0 +1,252 @@ +/* + ******************************************************************************* + * 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; +}