projelec

Dependencies:   mbed LCD_DISCO_F746NG BSP_DISCO_F746NG

Committer:
alexandrelouis
Date:
Thu Mar 19 07:55:50 2020 +0000
Revision:
8:4e6dfbe97bbd
changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alexandrelouis 8:4e6dfbe97bbd 1 /*
alexandrelouis 8:4e6dfbe97bbd 2 *******************************************************************************
alexandrelouis 8:4e6dfbe97bbd 3 * Keyboard Library virtual keyboard for touch screen display on demo
alexandrelouis 8:4e6dfbe97bbd 4 * Découverte STM32F746NG
alexandrelouis 8:4e6dfbe97bbd 5 *
alexandrelouis 8:4e6dfbe97bbd 6 * Fichier "keyboard.ccp"
alexandrelouis 8:4e6dfbe97bbd 7 *******************************************************************************
alexandrelouis 8:4e6dfbe97bbd 8 */
alexandrelouis 8:4e6dfbe97bbd 9
alexandrelouis 8:4e6dfbe97bbd 10 /*Ajouter le fichier header*/
alexandrelouis 8:4e6dfbe97bbd 11 #include "keyboard.h"
alexandrelouis 8:4e6dfbe97bbd 12 #include "USBMIDI.h"
alexandrelouis 8:4e6dfbe97bbd 13 #include "MIDIMessage.h"
alexandrelouis 8:4e6dfbe97bbd 14 /* Les structures de la clavature et de l’écran tactile */
alexandrelouis 8:4e6dfbe97bbd 15 Keyboard_TypeDef keyboard;
alexandrelouis 8:4e6dfbe97bbd 16 TS_StateTypeDef tScreen;
alexandrelouis 8:4e6dfbe97bbd 17 USBMIDI midi(Highspeed_Interface,0x0700,0x0101,0x0001);
alexandrelouis 8:4e6dfbe97bbd 18
alexandrelouis 8:4e6dfbe97bbd 19 /*Fonction pour travailler avec le clavier à l’écran */
alexandrelouis 8:4e6dfbe97bbd 20
alexandrelouis 8:4e6dfbe97bbd 21 /* Initialisation et affichage du clavier */
alexandrelouis 8:4e6dfbe97bbd 22 uint8_t Keyboard_init(uint16_t x_value, uint16_t y_value)
alexandrelouis 8:4e6dfbe97bbd 23 {
alexandrelouis 8:4e6dfbe97bbd 24 uint8_t i;
alexandrelouis 8:4e6dfbe97bbd 25
alexandrelouis 8:4e6dfbe97bbd 26 /* Les coordonnées du coin supérieur gauche du clavier sur l’écran servent de "point
alexandrelouis 8:4e6dfbe97bbd 27 de référence" pour déterminer l’emplacement de tous les autres éléments */
alexandrelouis 8:4e6dfbe97bbd 28
alexandrelouis 8:4e6dfbe97bbd 29 keyboard.posX = x_value;
alexandrelouis 8:4e6dfbe97bbd 30 keyboard.posY = y_value;
alexandrelouis 8:4e6dfbe97bbd 31
alexandrelouis 8:4e6dfbe97bbd 32 /* La valeur par défaut sur le clavier est une disposition anglaise en MAJ. */
alexandrelouis 8:4e6dfbe97bbd 33 keyboard.mode = MODE_UPPER_CASE;
alexandrelouis 8:4e6dfbe97bbd 34
alexandrelouis 8:4e6dfbe97bbd 35 /* Bloc d’initialisation pour les clés standard */
alexandrelouis 8:4e6dfbe97bbd 36
alexandrelouis 8:4e6dfbe97bbd 37 /* Initialisation des coordonnées des touches du clavier pour la première rangée */
alexandrelouis 8:4e6dfbe97bbd 38
alexandrelouis 8:4e6dfbe97bbd 39 for (i = 0; i < 5; i++) {
alexandrelouis 8:4e6dfbe97bbd 40 keyboard.key[i].id = i;
alexandrelouis 8:4e6dfbe97bbd 41 keyboard.key[i].posX = keyboard.posX + 5 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * i;
alexandrelouis 8:4e6dfbe97bbd 42 keyboard.key[i].posY = keyboard.posY + 3;
alexandrelouis 8:4e6dfbe97bbd 43 keyboard.key[i].dimX = KEY_SMALL_LENGTH;
alexandrelouis 8:4e6dfbe97bbd 44 keyboard.key[i].dimY = KEY_SMALL_HEIGHT;
alexandrelouis 8:4e6dfbe97bbd 45 keyboard.key[i].status = KEY_RELEASED;
alexandrelouis 8:4e6dfbe97bbd 46 }
alexandrelouis 8:4e6dfbe97bbd 47
alexandrelouis 8:4e6dfbe97bbd 48 /* Valeurs ASCII de chaque touche de la première rangée pour différentes
alexandrelouis 8:4e6dfbe97bbd 49 dispositions du clavier
alexandrelouis 8:4e6dfbe97bbd 50 */
alexandrelouis 8:4e6dfbe97bbd 51 keyboard.key[0].value[0] = 'D';
alexandrelouis 8:4e6dfbe97bbd 52 keyboard.key[0].value[1] = 'd';
alexandrelouis 8:4e6dfbe97bbd 53 keyboard.key[0].value[2] = '1';
alexandrelouis 8:4e6dfbe97bbd 54
alexandrelouis 8:4e6dfbe97bbd 55 keyboard.key[1].value[0] = 'R';
alexandrelouis 8:4e6dfbe97bbd 56 keyboard.key[1].value[1] = 'r';
alexandrelouis 8:4e6dfbe97bbd 57 keyboard.key[1].value[2] = '2';
alexandrelouis 8:4e6dfbe97bbd 58
alexandrelouis 8:4e6dfbe97bbd 59 keyboard.key[2].value[0] = 'M';
alexandrelouis 8:4e6dfbe97bbd 60 keyboard.key[2].value[1] = 'm';
alexandrelouis 8:4e6dfbe97bbd 61 keyboard.key[2].value[2] = '3';
alexandrelouis 8:4e6dfbe97bbd 62
alexandrelouis 8:4e6dfbe97bbd 63 keyboard.key[3].value[0] = 'F';
alexandrelouis 8:4e6dfbe97bbd 64 keyboard.key[3].value[1] = 'f';
alexandrelouis 8:4e6dfbe97bbd 65 keyboard.key[3].value[2] = '4';
alexandrelouis 8:4e6dfbe97bbd 66
alexandrelouis 8:4e6dfbe97bbd 67 keyboard.key[4].value[0] = 'S';
alexandrelouis 8:4e6dfbe97bbd 68 keyboard.key[4].value[1] = 's';
alexandrelouis 8:4e6dfbe97bbd 69 keyboard.key[4].value[2] = '5';
alexandrelouis 8:4e6dfbe97bbd 70
alexandrelouis 8:4e6dfbe97bbd 71
alexandrelouis 8:4e6dfbe97bbd 72 /* Initialisation des coordonnées des touches du clavier pour la rangée du milieu */
alexandrelouis 8:4e6dfbe97bbd 73
alexandrelouis 8:4e6dfbe97bbd 74 for (i = 5; i < 8; i++) {
alexandrelouis 8:4e6dfbe97bbd 75 keyboard.key[i].id = i;
alexandrelouis 8:4e6dfbe97bbd 76 keyboard.key[i].posX = keyboard.posX + 5 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * (i - 3) - 95;
alexandrelouis 8:4e6dfbe97bbd 77 keyboard.key[i].posY = keyboard.posY + 3 + KEY_SMALL_HEIGHT + KEY_DISTANCE;
alexandrelouis 8:4e6dfbe97bbd 78 keyboard.key[i].dimX = KEY_SMALL_LENGTH;
alexandrelouis 8:4e6dfbe97bbd 79 keyboard.key[i].dimY = KEY_SMALL_HEIGHT;
alexandrelouis 8:4e6dfbe97bbd 80 keyboard.key[i].status = KEY_RELEASED;
alexandrelouis 8:4e6dfbe97bbd 81 }
alexandrelouis 8:4e6dfbe97bbd 82
alexandrelouis 8:4e6dfbe97bbd 83 /* Valeurs ASCII de chaque touche de la rangée du milieu pour différentes
alexandrelouis 8:4e6dfbe97bbd 84 dispositions du clavier
alexandrelouis 8:4e6dfbe97bbd 85 */
alexandrelouis 8:4e6dfbe97bbd 86
alexandrelouis 8:4e6dfbe97bbd 87 keyboard.key[5].value[0] = 'L';
alexandrelouis 8:4e6dfbe97bbd 88 keyboard.key[5].value[1] = 'l';
alexandrelouis 8:4e6dfbe97bbd 89 keyboard.key[5].value[2] = '1';
alexandrelouis 8:4e6dfbe97bbd 90
alexandrelouis 8:4e6dfbe97bbd 91 keyboard.key[6].value[0] = 'S';
alexandrelouis 8:4e6dfbe97bbd 92 keyboard.key[6].value[1] = 's';
alexandrelouis 8:4e6dfbe97bbd 93 keyboard.key[6].value[2] = '2';
alexandrelouis 8:4e6dfbe97bbd 94
alexandrelouis 8:4e6dfbe97bbd 95 keyboard.key[7].value[0] = 'D';
alexandrelouis 8:4e6dfbe97bbd 96 keyboard.key[7].value[1] = 'd';
alexandrelouis 8:4e6dfbe97bbd 97 keyboard.key[7].value[2] = '3';
alexandrelouis 8:4e6dfbe97bbd 98
alexandrelouis 8:4e6dfbe97bbd 99
alexandrelouis 8:4e6dfbe97bbd 100 /* Nous dessinons le clavier à l’écran */
alexandrelouis 8:4e6dfbe97bbd 101
alexandrelouis 8:4e6dfbe97bbd 102 Keyboard_display_all();
alexandrelouis 8:4e6dfbe97bbd 103
alexandrelouis 8:4e6dfbe97bbd 104 return 0;
alexandrelouis 8:4e6dfbe97bbd 105 }
alexandrelouis 8:4e6dfbe97bbd 106
alexandrelouis 8:4e6dfbe97bbd 107 /* Dessiner le clavier à l’écran */
alexandrelouis 8:4e6dfbe97bbd 108
alexandrelouis 8:4e6dfbe97bbd 109 uint8_t Keyboard_display_all(void)
alexandrelouis 8:4e6dfbe97bbd 110 {
alexandrelouis 8:4e6dfbe97bbd 111 uint8_t i;
alexandrelouis 8:4e6dfbe97bbd 112
alexandrelouis 8:4e6dfbe97bbd 113 /* Nous obtenons la valeur associée à la couleur de l’arrière-plan de l’écran */
alexandrelouis 8:4e6dfbe97bbd 114 uint32_t back_color = BSP_LCD_GetBackColor();
alexandrelouis 8:4e6dfbe97bbd 115
alexandrelouis 8:4e6dfbe97bbd 116 /* Peindre l’écran entier avec la couleur de l’arrière-plan */
alexandrelouis 8:4e6dfbe97bbd 117 BSP_LCD_Clear(back_color);
alexandrelouis 8:4e6dfbe97bbd 118
alexandrelouis 8:4e6dfbe97bbd 119 /* Nous dessinons toutes les touches sur le clavier */
alexandrelouis 8:4e6dfbe97bbd 120
alexandrelouis 8:4e6dfbe97bbd 121 for (i = 0; i < KEY_NUMBER; i++) {
alexandrelouis 8:4e6dfbe97bbd 122 Key_display_normal(i);
alexandrelouis 8:4e6dfbe97bbd 123 }
alexandrelouis 8:4e6dfbe97bbd 124
alexandrelouis 8:4e6dfbe97bbd 125 return 0;
alexandrelouis 8:4e6dfbe97bbd 126 }
alexandrelouis 8:4e6dfbe97bbd 127
alexandrelouis 8:4e6dfbe97bbd 128 /* Dessin d’une seule touche de clavier à l’écran */
alexandrelouis 8:4e6dfbe97bbd 129
alexandrelouis 8:4e6dfbe97bbd 130 uint8_t Key_display_normal(uint8_t id)
alexandrelouis 8:4e6dfbe97bbd 131 {
alexandrelouis 8:4e6dfbe97bbd 132 /* Nous obtenons la couleur de l’arrière-plan de l’écran et la couleur de la police */
alexandrelouis 8:4e6dfbe97bbd 133 uint32_t back_color = BSP_LCD_GetBackColor();
alexandrelouis 8:4e6dfbe97bbd 134 uint32_t text_color = BSP_LCD_GetTextColor();
alexandrelouis 8:4e6dfbe97bbd 135
alexandrelouis 8:4e6dfbe97bbd 136 /* Changer les couleurs et peindre l’endroit pour la touche sur l’écran avec la couleur de l’arrière-plan */
alexandrelouis 8:4e6dfbe97bbd 137 BSP_LCD_SetTextColor(back_color);
alexandrelouis 8:4e6dfbe97bbd 138 BSP_LCD_SetBackColor(text_color);
alexandrelouis 8:4e6dfbe97bbd 139 BSP_LCD_FillRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);
alexandrelouis 8:4e6dfbe97bbd 140
alexandrelouis 8:4e6dfbe97bbd 141 /* Retournez les mêmes valeurs de couleur de l’arrière-plan de l’écran et de la couleur de police */
alexandrelouis 8:4e6dfbe97bbd 142 BSP_LCD_SetTextColor(text_color);
alexandrelouis 8:4e6dfbe97bbd 143 BSP_LCD_SetBackColor(back_color);
alexandrelouis 8:4e6dfbe97bbd 144
alexandrelouis 8:4e6dfbe97bbd 145 /* Dessiner un cadre autour de la touche et fermer le pixel dans le coin inférieur droit */
alexandrelouis 8:4e6dfbe97bbd 146 BSP_LCD_DrawRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);
alexandrelouis 8:4e6dfbe97bbd 147 BSP_LCD_DrawPixel(keyboard.key[id].posX + keyboard.key[id].dimX, keyboard.key[id].posY + keyboard.key[id].dimY, text_color);
alexandrelouis 8:4e6dfbe97bbd 148
alexandrelouis 8:4e6dfbe97bbd 149 /* Afficher la valeur de la touche dans la disposition actuelle du clavier. */
alexandrelouis 8:4e6dfbe97bbd 150 BSP_LCD_DisplayChar(keyboard.key[id].posX + 8, keyboard.key[id].posY + 8, keyboard.key[id].value[keyboard.mode]);
alexandrelouis 8:4e6dfbe97bbd 151
alexandrelouis 8:4e6dfbe97bbd 152 return 0;
alexandrelouis 8:4e6dfbe97bbd 153 }
alexandrelouis 8:4e6dfbe97bbd 154
alexandrelouis 8:4e6dfbe97bbd 155 /* Dessin d’une seule touche de clavier à l’écran (couleur inversée) */
alexandrelouis 8:4e6dfbe97bbd 156 uint8_t Key_display_inverted(uint8_t id)
alexandrelouis 8:4e6dfbe97bbd 157 {
alexandrelouis 8:4e6dfbe97bbd 158 uint32_t back_color = BSP_LCD_GetBackColor();
alexandrelouis 8:4e6dfbe97bbd 159 uint32_t text_color = BSP_LCD_GetTextColor();
alexandrelouis 8:4e6dfbe97bbd 160
alexandrelouis 8:4e6dfbe97bbd 161 /* Remplir la place pour la touche à l’écran avec la couleur de la police */
alexandrelouis 8:4e6dfbe97bbd 162 BSP_LCD_FillRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);
alexandrelouis 8:4e6dfbe97bbd 163
alexandrelouis 8:4e6dfbe97bbd 164 /* Changer de couleur et afficher la valeur de la touche dans la disposition actuelle du clavier */
alexandrelouis 8:4e6dfbe97bbd 165 BSP_LCD_SetTextColor(back_color);
alexandrelouis 8:4e6dfbe97bbd 166 BSP_LCD_SetBackColor(text_color);
alexandrelouis 8:4e6dfbe97bbd 167 BSP_LCD_DisplayChar(keyboard.key[id].posX + 8, keyboard.key[id].posY + 8, keyboard.key[id].value[keyboard.mode]);
alexandrelouis 8:4e6dfbe97bbd 168
alexandrelouis 8:4e6dfbe97bbd 169 /* Retour de la couleur de fond d’écran précédente et la couleur de police */
alexandrelouis 8:4e6dfbe97bbd 170 BSP_LCD_SetTextColor(text_color);
alexandrelouis 8:4e6dfbe97bbd 171 BSP_LCD_SetBackColor(back_color);
alexandrelouis 8:4e6dfbe97bbd 172
alexandrelouis 8:4e6dfbe97bbd 173 return 0;
alexandrelouis 8:4e6dfbe97bbd 174 }
alexandrelouis 8:4e6dfbe97bbd 175
alexandrelouis 8:4e6dfbe97bbd 176
alexandrelouis 8:4e6dfbe97bbd 177 /* Vérifier l’entrée sur le clavier à l’écran */
alexandrelouis 8:4e6dfbe97bbd 178 uint8_t Keyboard_check(void)
alexandrelouis 8:4e6dfbe97bbd 179 {
alexandrelouis 8:4e6dfbe97bbd 180 uint8_t i;
alexandrelouis 8:4e6dfbe97bbd 181 uint8_t j;
alexandrelouis 8:4e6dfbe97bbd 182
alexandrelouis 8:4e6dfbe97bbd 183 /* Vérification de l’état du "conducteur" de l’écran tactile */
alexandrelouis 8:4e6dfbe97bbd 184 BSP_TS_GetState(&tScreen);
alexandrelouis 8:4e6dfbe97bbd 185
alexandrelouis 8:4e6dfbe97bbd 186 /* Si on appuie sur l'ecran */
alexandrelouis 8:4e6dfbe97bbd 187 if (tScreen.touchDetected) {
alexandrelouis 8:4e6dfbe97bbd 188 for (i = 0; i < KEY_NUMBER; i++) {
alexandrelouis 8:4e6dfbe97bbd 189 /* Si les coordonnées tactiles se trouvent dans les limites de l’une des touches non pressés, +/- 4 pixels */
alexandrelouis 8:4e6dfbe97bbd 190 if (((tScreen.touchX[0] >= keyboard.key[i].posX - 4) && (tScreen.touchX[0] < keyboard.key[i].posX + keyboard.key[i].dimX + 4)) &&
alexandrelouis 8:4e6dfbe97bbd 191 ((tScreen.touchY[0] >= keyboard.key[i].posY - 4) && (tScreen.touchY[0] < keyboard.key[i].posY + keyboard.key[i].dimY + 4)) &&
alexandrelouis 8:4e6dfbe97bbd 192 (keyboard.key[i].status == KEY_RELEASED)) {
alexandrelouis 8:4e6dfbe97bbd 193 /* Dessinez la bonne clé dans la couleur inversée */
alexandrelouis 8:4e6dfbe97bbd 194 Key_display_inverted(i);
alexandrelouis 8:4e6dfbe97bbd 195
alexandrelouis 8:4e6dfbe97bbd 196 /* Si l'appui a déjà été fixée sur une autre clé, "appuyez-la" et redessiner */
alexandrelouis 8:4e6dfbe97bbd 197 for (j = 0; j < KEY_NUMBER; j++) {
alexandrelouis 8:4e6dfbe97bbd 198 if (keyboard.key[j].status == KEY_PRESSED) {
alexandrelouis 8:4e6dfbe97bbd 199 Key_display_normal(j);
alexandrelouis 8:4e6dfbe97bbd 200
alexandrelouis 8:4e6dfbe97bbd 201 keyboard.key[j].status = KEY_RELEASED;
alexandrelouis 8:4e6dfbe97bbd 202 }
alexandrelouis 8:4e6dfbe97bbd 203 }
alexandrelouis 8:4e6dfbe97bbd 204
alexandrelouis 8:4e6dfbe97bbd 205 /* Changer l’état de la touche pour laquelle l'appui a été enregistré */
alexandrelouis 8:4e6dfbe97bbd 206 keyboard.key[i].status = KEY_PRESSED;
alexandrelouis 8:4e6dfbe97bbd 207
alexandrelouis 8:4e6dfbe97bbd 208 /* Réinitialisez l’état du conducteur de l’écran tactile */
alexandrelouis 8:4e6dfbe97bbd 209 BSP_TS_ResetTouchData(&tScreen);
alexandrelouis 8:4e6dfbe97bbd 210 }
alexandrelouis 8:4e6dfbe97bbd 211 }
alexandrelouis 8:4e6dfbe97bbd 212 }
alexandrelouis 8:4e6dfbe97bbd 213
alexandrelouis 8:4e6dfbe97bbd 214 /* S’il n’y a pas de contact, vérifiez l’état de chaque touche, peut-être qu'un appui
alexandrelouis 8:4e6dfbe97bbd 215 est déja en cours et devrait être traité comme une entrée */
alexandrelouis 8:4e6dfbe97bbd 216
alexandrelouis 8:4e6dfbe97bbd 217 else {
alexandrelouis 8:4e6dfbe97bbd 218 for (i = 0; i < KEY_NUMBER; i++) {
alexandrelouis 8:4e6dfbe97bbd 219 /* Si la clé touche est pressée, "appuyez-la" et redessiner */
alexandrelouis 8:4e6dfbe97bbd 220 if (keyboard.key[i].status == KEY_PRESSED) {
alexandrelouis 8:4e6dfbe97bbd 221 Key_display_normal(i);
alexandrelouis 8:4e6dfbe97bbd 222
alexandrelouis 8:4e6dfbe97bbd 223 keyboard.key[i].status = KEY_RELEASED;
alexandrelouis 8:4e6dfbe97bbd 224 BSP_TS_ResetTouchData(&tScreen);
alexandrelouis 8:4e6dfbe97bbd 225
alexandrelouis 8:4e6dfbe97bbd 226 /* On retourne la valeur de l'entrée */
alexandrelouis 8:4e6dfbe97bbd 227 return keyboard.key[i].value[keyboard.mode];
alexandrelouis 8:4e6dfbe97bbd 228 }
alexandrelouis 8:4e6dfbe97bbd 229 }
alexandrelouis 8:4e6dfbe97bbd 230 }
alexandrelouis 8:4e6dfbe97bbd 231
alexandrelouis 8:4e6dfbe97bbd 232 return 0;
alexandrelouis 8:4e6dfbe97bbd 233 }
alexandrelouis 8:4e6dfbe97bbd 234
alexandrelouis 8:4e6dfbe97bbd 235 /* Gestionnaire d’entrée de clavier à l’écran */
alexandrelouis 8:4e6dfbe97bbd 236 uint8_t Keyboard_handler(char *prompt, char buffer[])
alexandrelouis 8:4e6dfbe97bbd 237 {
alexandrelouis 8:4e6dfbe97bbd 238 uint8_t i;
alexandrelouis 8:4e6dfbe97bbd 239 uint8_t key;
alexandrelouis 8:4e6dfbe97bbd 240
alexandrelouis 8:4e6dfbe97bbd 241 /* Vérifiez s’il y a un nouveau clic */
alexandrelouis 8:4e6dfbe97bbd 242 key = Keyboard_check();
alexandrelouis 8:4e6dfbe97bbd 243
alexandrelouis 8:4e6dfbe97bbd 244 i=24;
alexandrelouis 8:4e6dfbe97bbd 245 midi.write(MIDIMessage::NoteOn(i));
alexandrelouis 8:4e6dfbe97bbd 246 wait(0.3);
alexandrelouis 8:4e6dfbe97bbd 247 midi.write(MIDIMessage::NoteOff(i));
alexandrelouis 8:4e6dfbe97bbd 248
alexandrelouis 8:4e6dfbe97bbd 249
alexandrelouis 8:4e6dfbe97bbd 250 /* Retourner la valeur de la dernière touche pressée */
alexandrelouis 8:4e6dfbe97bbd 251 return key;
alexandrelouis 8:4e6dfbe97bbd 252 }