Library for virtual onscreen keyboard for STM32F746 Disco board

Dependencies:   BSP_DISCO_F746NG mbed

Committer:
Faberge
Date:
Sat Sep 17 11:36:24 2016 +0000
Revision:
0:3ea368f65bca
First demo example of virtual onscreen keyboard for F746 Disco

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Faberge 0:3ea368f65bca 1 /*
Faberge 0:3ea368f65bca 2 *******************************************************************************
Faberge 0:3ea368f65bca 3 * Библиотека Keyboard виртуальной клавиатуры для дисплея с тач-экраном на демо-
Faberge 0:3ea368f65bca 4 * плате STM32F746NG Discovery
Faberge 0:3ea368f65bca 5 *
Faberge 0:3ea368f65bca 6 * Файл "keyboard.c"
Faberge 0:3ea368f65bca 7 *******************************************************************************
Faberge 0:3ea368f65bca 8 */
Faberge 0:3ea368f65bca 9
Faberge 0:3ea368f65bca 10 /* Добавляем заголовочный файл */
Faberge 0:3ea368f65bca 11 #include "keyboard.h"
Faberge 0:3ea368f65bca 12
Faberge 0:3ea368f65bca 13 /* Структуры клаватуры и тач-экрана */
Faberge 0:3ea368f65bca 14 Keyboard_TypeDef keyboard;
Faberge 0:3ea368f65bca 15 TS_StateTypeDef tScreen;
Faberge 0:3ea368f65bca 16
Faberge 0:3ea368f65bca 17 /* Функции для работы с экранной клавиатурой */
Faberge 0:3ea368f65bca 18
Faberge 0:3ea368f65bca 19 /* Инициализация и вывод клавиатуры на дисплей */
Faberge 0:3ea368f65bca 20 uint8_t Keyboard_init(uint16_t x_value, uint16_t y_value)
Faberge 0:3ea368f65bca 21 {
Faberge 0:3ea368f65bca 22 uint8_t i;
Faberge 0:3ea368f65bca 23
Faberge 0:3ea368f65bca 24 /* Координаты верхнего левого угла клавиатуры на экране, служат точкой
Faberge 0:3ea368f65bca 25 * отсчета для определения расположения всех остальных элементов
Faberge 0:3ea368f65bca 26 */
Faberge 0:3ea368f65bca 27 keyboard.posX = x_value;
Faberge 0:3ea368f65bca 28 keyboard.posY = y_value;
Faberge 0:3ea368f65bca 29
Faberge 0:3ea368f65bca 30 /* По умолчанию на клавиатуре английская раскладка в верхнем регистре */
Faberge 0:3ea368f65bca 31 keyboard.mode = MODE_UPPER_CASE;
Faberge 0:3ea368f65bca 32
Faberge 0:3ea368f65bca 33 /* Блок инициализации для стандартных клавиш */
Faberge 0:3ea368f65bca 34
Faberge 0:3ea368f65bca 35 /* Инициализируем массив координат клавиш на клавиатуре для верхнего ряда */
Faberge 0:3ea368f65bca 36 for (i = 0; i < 10; i++)
Faberge 0:3ea368f65bca 37 {
Faberge 0:3ea368f65bca 38 keyboard.key[i].id = i;
Faberge 0:3ea368f65bca 39 keyboard.key[i].posX = keyboard.posX + 3 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * i;
Faberge 0:3ea368f65bca 40 keyboard.key[i].posY = keyboard.posY + 3;
Faberge 0:3ea368f65bca 41 keyboard.key[i].dimX = KEY_SMALL_LENGTH;
Faberge 0:3ea368f65bca 42 keyboard.key[i].dimY = KEY_SMALL_HEIGHT;
Faberge 0:3ea368f65bca 43 keyboard.key[i].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 44 }
Faberge 0:3ea368f65bca 45
Faberge 0:3ea368f65bca 46 /* Значения ASCII-кодов каждой клавишы из верхнего ряда для различных
Faberge 0:3ea368f65bca 47 * раскладок клавиатуры
Faberge 0:3ea368f65bca 48 */
Faberge 0:3ea368f65bca 49 keyboard.key[0].value[0] = 'Q';
Faberge 0:3ea368f65bca 50 keyboard.key[0].value[1] = 'q';
Faberge 0:3ea368f65bca 51 keyboard.key[0].value[2] = '1';
Faberge 0:3ea368f65bca 52
Faberge 0:3ea368f65bca 53 keyboard.key[1].value[0] = 'W';
Faberge 0:3ea368f65bca 54 keyboard.key[1].value[1] = 'w';
Faberge 0:3ea368f65bca 55 keyboard.key[1].value[2] = '2';
Faberge 0:3ea368f65bca 56
Faberge 0:3ea368f65bca 57 keyboard.key[2].value[0] = 'E';
Faberge 0:3ea368f65bca 58 keyboard.key[2].value[1] = 'e';
Faberge 0:3ea368f65bca 59 keyboard.key[2].value[2] = '3';
Faberge 0:3ea368f65bca 60
Faberge 0:3ea368f65bca 61 keyboard.key[3].value[0] = 'R';
Faberge 0:3ea368f65bca 62 keyboard.key[3].value[1] = 'r';
Faberge 0:3ea368f65bca 63 keyboard.key[3].value[2] = '4';
Faberge 0:3ea368f65bca 64
Faberge 0:3ea368f65bca 65 keyboard.key[4].value[0] = 'T';
Faberge 0:3ea368f65bca 66 keyboard.key[4].value[1] = 't';
Faberge 0:3ea368f65bca 67 keyboard.key[4].value[2] = '5';
Faberge 0:3ea368f65bca 68
Faberge 0:3ea368f65bca 69 keyboard.key[5].value[0] = 'Y';
Faberge 0:3ea368f65bca 70 keyboard.key[5].value[1] = 'y';
Faberge 0:3ea368f65bca 71 keyboard.key[5].value[2] = '6';
Faberge 0:3ea368f65bca 72
Faberge 0:3ea368f65bca 73 keyboard.key[6].value[0] = 'U';
Faberge 0:3ea368f65bca 74 keyboard.key[6].value[1] = 'u';
Faberge 0:3ea368f65bca 75 keyboard.key[6].value[2] = '7';
Faberge 0:3ea368f65bca 76
Faberge 0:3ea368f65bca 77 keyboard.key[7].value[0] = 'I';
Faberge 0:3ea368f65bca 78 keyboard.key[7].value[1] = 'i';
Faberge 0:3ea368f65bca 79 keyboard.key[7].value[2] = '8';
Faberge 0:3ea368f65bca 80
Faberge 0:3ea368f65bca 81 keyboard.key[8].value[0] = 'O';
Faberge 0:3ea368f65bca 82 keyboard.key[8].value[1] = 'o';
Faberge 0:3ea368f65bca 83 keyboard.key[8].value[2] = '9';
Faberge 0:3ea368f65bca 84
Faberge 0:3ea368f65bca 85 keyboard.key[9].value[0] = 'P';
Faberge 0:3ea368f65bca 86 keyboard.key[9].value[1] = 'p';
Faberge 0:3ea368f65bca 87 keyboard.key[9].value[2] = '0';
Faberge 0:3ea368f65bca 88
Faberge 0:3ea368f65bca 89 /* Инициализируем массив координат клавиш на клавиатуре для среднего ряда */
Faberge 0:3ea368f65bca 90 for (i = 10; i < 19; i++)
Faberge 0:3ea368f65bca 91 {
Faberge 0:3ea368f65bca 92 keyboard.key[i].id = i;
Faberge 0:3ea368f65bca 93 keyboard.key[i].posX = keyboard.posX + 27 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * (i - 10);
Faberge 0:3ea368f65bca 94 keyboard.key[i].posY = keyboard.posY + 3 + KEY_SMALL_HEIGHT + KEY_DISTANCE;
Faberge 0:3ea368f65bca 95 keyboard.key[i].dimX = KEY_SMALL_LENGTH;
Faberge 0:3ea368f65bca 96 keyboard.key[i].dimY = KEY_SMALL_HEIGHT;
Faberge 0:3ea368f65bca 97 keyboard.key[i].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 98 }
Faberge 0:3ea368f65bca 99
Faberge 0:3ea368f65bca 100 /* Значения ASCII-кодов каждой клавишы из среднего ряда для различных
Faberge 0:3ea368f65bca 101 * раскладок клавиатуры
Faberge 0:3ea368f65bca 102 */
Faberge 0:3ea368f65bca 103 keyboard.key[10].value[0] = 'A';
Faberge 0:3ea368f65bca 104 keyboard.key[10].value[1] = 'a';
Faberge 0:3ea368f65bca 105 keyboard.key[10].value[2] = '1';
Faberge 0:3ea368f65bca 106
Faberge 0:3ea368f65bca 107 keyboard.key[11].value[0] = 'S';
Faberge 0:3ea368f65bca 108 keyboard.key[11].value[1] = 's';
Faberge 0:3ea368f65bca 109 keyboard.key[11].value[2] = '2';
Faberge 0:3ea368f65bca 110
Faberge 0:3ea368f65bca 111 keyboard.key[12].value[0] = 'D';
Faberge 0:3ea368f65bca 112 keyboard.key[12].value[1] = 'd';
Faberge 0:3ea368f65bca 113 keyboard.key[12].value[2] = '3';
Faberge 0:3ea368f65bca 114
Faberge 0:3ea368f65bca 115 keyboard.key[13].value[0] = 'F';
Faberge 0:3ea368f65bca 116 keyboard.key[13].value[1] = 'f';
Faberge 0:3ea368f65bca 117 keyboard.key[13].value[2] = '4';
Faberge 0:3ea368f65bca 118
Faberge 0:3ea368f65bca 119 keyboard.key[14].value[0] = 'G';
Faberge 0:3ea368f65bca 120 keyboard.key[14].value[1] = 'g';
Faberge 0:3ea368f65bca 121 keyboard.key[14].value[2] = '5';
Faberge 0:3ea368f65bca 122
Faberge 0:3ea368f65bca 123 keyboard.key[15].value[0] = 'H';
Faberge 0:3ea368f65bca 124 keyboard.key[15].value[1] = 'h';
Faberge 0:3ea368f65bca 125 keyboard.key[15].value[2] = '6';
Faberge 0:3ea368f65bca 126
Faberge 0:3ea368f65bca 127 keyboard.key[16].value[0] = 'J';
Faberge 0:3ea368f65bca 128 keyboard.key[16].value[1] = 'j';
Faberge 0:3ea368f65bca 129 keyboard.key[16].value[2] = '7';
Faberge 0:3ea368f65bca 130
Faberge 0:3ea368f65bca 131 keyboard.key[17].value[0] = 'K';
Faberge 0:3ea368f65bca 132 keyboard.key[17].value[1] = 'k';
Faberge 0:3ea368f65bca 133 keyboard.key[17].value[2] = '8';
Faberge 0:3ea368f65bca 134
Faberge 0:3ea368f65bca 135 keyboard.key[18].value[0] = 'L';
Faberge 0:3ea368f65bca 136 keyboard.key[18].value[1] = 'l';
Faberge 0:3ea368f65bca 137 keyboard.key[18].value[2] = '9';
Faberge 0:3ea368f65bca 138
Faberge 0:3ea368f65bca 139 /* Инициализируем массив координат клавиш на клавиатуре для нижнего ряда */
Faberge 0:3ea368f65bca 140 for (i = 19; i < 26; i++)
Faberge 0:3ea368f65bca 141 {
Faberge 0:3ea368f65bca 142 keyboard.key[i].id = i;
Faberge 0:3ea368f65bca 143 keyboard.key[i].posX = keyboard.posX + 51 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * (i - 19);
Faberge 0:3ea368f65bca 144 keyboard.key[i].posY = keyboard.posY + 3 + (KEY_SMALL_HEIGHT + KEY_DISTANCE) * 2;
Faberge 0:3ea368f65bca 145 keyboard.key[i].dimX = KEY_SMALL_LENGTH;
Faberge 0:3ea368f65bca 146 keyboard.key[i].dimY = KEY_SMALL_HEIGHT;
Faberge 0:3ea368f65bca 147 keyboard.key[i].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 148 }
Faberge 0:3ea368f65bca 149
Faberge 0:3ea368f65bca 150 /* Значения ASCII-кодов каждой клавишы из нижнего ряда для различных
Faberge 0:3ea368f65bca 151 * раскладок лавиатуры
Faberge 0:3ea368f65bca 152 */
Faberge 0:3ea368f65bca 153 keyboard.key[19].value[0] = 'Z';
Faberge 0:3ea368f65bca 154 keyboard.key[19].value[1] = 'z';
Faberge 0:3ea368f65bca 155 keyboard.key[19].value[2] = '1';
Faberge 0:3ea368f65bca 156
Faberge 0:3ea368f65bca 157 keyboard.key[20].value[0] = 'X';
Faberge 0:3ea368f65bca 158 keyboard.key[20].value[1] = 'x';
Faberge 0:3ea368f65bca 159 keyboard.key[20].value[2] = '2';
Faberge 0:3ea368f65bca 160
Faberge 0:3ea368f65bca 161 keyboard.key[21].value[0] = 'C';
Faberge 0:3ea368f65bca 162 keyboard.key[21].value[1] = 'c';
Faberge 0:3ea368f65bca 163 keyboard.key[21].value[2] = '3';
Faberge 0:3ea368f65bca 164
Faberge 0:3ea368f65bca 165 keyboard.key[22].value[0] = 'V';
Faberge 0:3ea368f65bca 166 keyboard.key[22].value[1] = 'v';
Faberge 0:3ea368f65bca 167 keyboard.key[22].value[2] = '4';
Faberge 0:3ea368f65bca 168
Faberge 0:3ea368f65bca 169 keyboard.key[23].value[0] = 'B';
Faberge 0:3ea368f65bca 170 keyboard.key[23].value[1] = 'b';
Faberge 0:3ea368f65bca 171 keyboard.key[23].value[2] = '5';
Faberge 0:3ea368f65bca 172
Faberge 0:3ea368f65bca 173 keyboard.key[24].value[0] = 'N';
Faberge 0:3ea368f65bca 174 keyboard.key[24].value[1] = 'n';
Faberge 0:3ea368f65bca 175 keyboard.key[24].value[2] = '6';
Faberge 0:3ea368f65bca 176
Faberge 0:3ea368f65bca 177 keyboard.key[25].value[0] = 'M';
Faberge 0:3ea368f65bca 178 keyboard.key[25].value[1] = 'm';
Faberge 0:3ea368f65bca 179 keyboard.key[25].value[2] = '7';
Faberge 0:3ea368f65bca 180
Faberge 0:3ea368f65bca 181 /* Блок инициализации для специальных клавиш */
Faberge 0:3ea368f65bca 182
Faberge 0:3ea368f65bca 183 /* Клавиша "Enter" */
Faberge 0:3ea368f65bca 184 keyboard.key[26].id = 26;
Faberge 0:3ea368f65bca 185 keyboard.key[26].posX = 51 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * 7;
Faberge 0:3ea368f65bca 186 keyboard.key[26].posY = keyboard.posY + 3 + (KEY_SMALL_HEIGHT + KEY_DISTANCE) * 2;
Faberge 0:3ea368f65bca 187 keyboard.key[26].dimX = KEY_ENTER_LENGTH;
Faberge 0:3ea368f65bca 188 keyboard.key[26].dimY = KEY_SMALL_HEIGHT;
Faberge 0:3ea368f65bca 189 keyboard.key[26].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 190 keyboard.key[26].value[0] = KEY_ENTER_VALUE;
Faberge 0:3ea368f65bca 191 keyboard.key[26].value[1] = KEY_ENTER_VALUE;
Faberge 0:3ea368f65bca 192 keyboard.key[26].value[2] = KEY_ENTER_VALUE;
Faberge 0:3ea368f65bca 193
Faberge 0:3ea368f65bca 194 /* Клавиша "Shift" */
Faberge 0:3ea368f65bca 195 keyboard.key[27].id = 27;
Faberge 0:3ea368f65bca 196 keyboard.key[27].posX = 3;
Faberge 0:3ea368f65bca 197 keyboard.key[27].posY = keyboard.posY + 3 + (KEY_SMALL_HEIGHT + KEY_DISTANCE) * 3;
Faberge 0:3ea368f65bca 198 keyboard.key[27].dimX = KEY_SHIFT_LENGTH;
Faberge 0:3ea368f65bca 199 keyboard.key[27].dimY = KEY_SMALL_HEIGHT;
Faberge 0:3ea368f65bca 200 keyboard.key[27].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 201 keyboard.key[27].value[0] = KEY_SHIFT_VALUE;
Faberge 0:3ea368f65bca 202 keyboard.key[27].value[1] = KEY_SHIFT_VALUE;
Faberge 0:3ea368f65bca 203 keyboard.key[27].value[2] = KEY_SHIFT_VALUE;
Faberge 0:3ea368f65bca 204
Faberge 0:3ea368f65bca 205 /* Клавиша "Space" */
Faberge 0:3ea368f65bca 206 keyboard.key[28].id = 28;
Faberge 0:3ea368f65bca 207 keyboard.key[28].posX = 27 + (KEY_SMALL_LENGTH + KEY_DISTANCE) * 3;
Faberge 0:3ea368f65bca 208 keyboard.key[28].posY = keyboard.posY + 3 + (KEY_SMALL_HEIGHT + KEY_DISTANCE) * 3;
Faberge 0:3ea368f65bca 209 keyboard.key[28].dimX = KEY_SPACE_LENGTH;
Faberge 0:3ea368f65bca 210 keyboard.key[28].dimY = KEY_SMALL_HEIGHT;
Faberge 0:3ea368f65bca 211 keyboard.key[28].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 212 keyboard.key[28].value[0] = KEY_SPACE_VALUE;
Faberge 0:3ea368f65bca 213 keyboard.key[28].value[1] = KEY_SPACE_VALUE;
Faberge 0:3ea368f65bca 214 keyboard.key[28].value[2] = KEY_SPACE_VALUE;
Faberge 0:3ea368f65bca 215
Faberge 0:3ea368f65bca 216 /* Клавиша "Backspace" */
Faberge 0:3ea368f65bca 217 keyboard.key[29].id = 29;
Faberge 0:3ea368f65bca 218 keyboard.key[29].posX = keyboard.posX + 27 + (KEY_DISTANCE + KEY_SMALL_LENGTH) * 8;
Faberge 0:3ea368f65bca 219 keyboard.key[29].posY = keyboard.posY + 3 + (KEY_SMALL_HEIGHT + KEY_DISTANCE) * 3;
Faberge 0:3ea368f65bca 220 keyboard.key[29].dimX = KEY_BACKSPACE_LENGTH;
Faberge 0:3ea368f65bca 221 keyboard.key[29].dimY = KEY_SMALL_HEIGHT;
Faberge 0:3ea368f65bca 222 keyboard.key[29].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 223 keyboard.key[29].value[0] = KEY_BACKSPACE_VALUE;
Faberge 0:3ea368f65bca 224 keyboard.key[29].value[1] = KEY_BACKSPACE_VALUE;
Faberge 0:3ea368f65bca 225 keyboard.key[29].value[2] = KEY_BACKSPACE_VALUE;
Faberge 0:3ea368f65bca 226
Faberge 0:3ea368f65bca 227 /* Отрисовываем клавиатуру на экране*/
Faberge 0:3ea368f65bca 228 Keyboard_display_all();
Faberge 0:3ea368f65bca 229
Faberge 0:3ea368f65bca 230 return 0;
Faberge 0:3ea368f65bca 231 }
Faberge 0:3ea368f65bca 232
Faberge 0:3ea368f65bca 233 /* Отрисовка клавиатуры на экране */
Faberge 0:3ea368f65bca 234 uint8_t Keyboard_display_all(void)
Faberge 0:3ea368f65bca 235 {
Faberge 0:3ea368f65bca 236 uint8_t i;
Faberge 0:3ea368f65bca 237
Faberge 0:3ea368f65bca 238 /* Получаем значение цвета фона экрана*/
Faberge 0:3ea368f65bca 239 uint32_t back_color = BSP_LCD_GetBackColor();
Faberge 0:3ea368f65bca 240
Faberge 0:3ea368f65bca 241 /* Закрашиваем весь экран цветом фона*/
Faberge 0:3ea368f65bca 242 BSP_LCD_Clear(back_color);
Faberge 0:3ea368f65bca 243
Faberge 0:3ea368f65bca 244 /* Отрисовываем каждую клавишу на клавиатуре */
Faberge 0:3ea368f65bca 245 for (i = 0; i < KEY_NUMBER; i++)
Faberge 0:3ea368f65bca 246 {
Faberge 0:3ea368f65bca 247 Key_display_normal(i);
Faberge 0:3ea368f65bca 248 }
Faberge 0:3ea368f65bca 249
Faberge 0:3ea368f65bca 250 return 0;
Faberge 0:3ea368f65bca 251 }
Faberge 0:3ea368f65bca 252
Faberge 0:3ea368f65bca 253 /* Отрисовка отдельной клавишы клавиатуры на экране */
Faberge 0:3ea368f65bca 254 uint8_t Key_display_normal(uint8_t id)
Faberge 0:3ea368f65bca 255 {
Faberge 0:3ea368f65bca 256 /* Получаем значение цвета фона экрана и цвета шрифта */
Faberge 0:3ea368f65bca 257 uint32_t back_color = BSP_LCD_GetBackColor();
Faberge 0:3ea368f65bca 258 uint32_t text_color = BSP_LCD_GetTextColor();
Faberge 0:3ea368f65bca 259
Faberge 0:3ea368f65bca 260 /* Меняем цвета и закрашиваем место для клавишы на экране цветом фона */
Faberge 0:3ea368f65bca 261 BSP_LCD_SetTextColor(back_color);
Faberge 0:3ea368f65bca 262 BSP_LCD_SetBackColor(text_color);
Faberge 0:3ea368f65bca 263 BSP_LCD_FillRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);
Faberge 0:3ea368f65bca 264
Faberge 0:3ea368f65bca 265 /* Возвращаем прежние значения цвета фона экрана и цвета шрифта*/
Faberge 0:3ea368f65bca 266 BSP_LCD_SetTextColor(text_color);
Faberge 0:3ea368f65bca 267 BSP_LCD_SetBackColor(back_color);
Faberge 0:3ea368f65bca 268
Faberge 0:3ea368f65bca 269 /* Рисуем рамку рамку вокруг клавишы и замыкающий пиксель в нижнем правом углу */
Faberge 0:3ea368f65bca 270 BSP_LCD_DrawRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);
Faberge 0:3ea368f65bca 271 BSP_LCD_DrawPixel(keyboard.key[id].posX + keyboard.key[id].dimX, keyboard.key[id].posY + keyboard.key[id].dimY, text_color);
Faberge 0:3ea368f65bca 272
Faberge 0:3ea368f65bca 273 /* Выводим значение клавишы в текущей раскладке клавиатуры */
Faberge 0:3ea368f65bca 274 BSP_LCD_DisplayChar(keyboard.key[id].posX + 8, keyboard.key[id].posY + 8, keyboard.key[id].value[keyboard.mode]);
Faberge 0:3ea368f65bca 275
Faberge 0:3ea368f65bca 276 /* Для специальных клавиш выводим больше одного символа */
Faberge 0:3ea368f65bca 277 Key_display_specials(id);
Faberge 0:3ea368f65bca 278
Faberge 0:3ea368f65bca 279 return 0;
Faberge 0:3ea368f65bca 280 }
Faberge 0:3ea368f65bca 281
Faberge 0:3ea368f65bca 282 /* Отрисовка отдельной клавишы клавиатуры на экране (в инвертированном цвете) */
Faberge 0:3ea368f65bca 283 uint8_t Key_display_inverted(uint8_t id)
Faberge 0:3ea368f65bca 284 {
Faberge 0:3ea368f65bca 285 uint32_t back_color = BSP_LCD_GetBackColor();
Faberge 0:3ea368f65bca 286 uint32_t text_color = BSP_LCD_GetTextColor();
Faberge 0:3ea368f65bca 287
Faberge 0:3ea368f65bca 288 /* Закрашиваем место для клавишы на экране цветом шрифта */
Faberge 0:3ea368f65bca 289 BSP_LCD_FillRect(keyboard.key[id].posX, keyboard.key[id].posY, keyboard.key[id].dimX, keyboard.key[id].dimY);
Faberge 0:3ea368f65bca 290
Faberge 0:3ea368f65bca 291 /* Меняем цвета и выводим значение клавишы в текущей раскладке клавиатуры */
Faberge 0:3ea368f65bca 292 BSP_LCD_SetTextColor(back_color);
Faberge 0:3ea368f65bca 293 BSP_LCD_SetBackColor(text_color);
Faberge 0:3ea368f65bca 294 BSP_LCD_DisplayChar(keyboard.key[id].posX + 8, keyboard.key[id].posY + 8, keyboard.key[id].value[keyboard.mode]);
Faberge 0:3ea368f65bca 295
Faberge 0:3ea368f65bca 296 /* Для спецмальных клавиш выводим больше одного символа */
Faberge 0:3ea368f65bca 297 Key_display_specials(id);
Faberge 0:3ea368f65bca 298
Faberge 0:3ea368f65bca 299 /* Возвращаем прежние значения цвета фона экрана и цвета шрифта */
Faberge 0:3ea368f65bca 300 BSP_LCD_SetTextColor(text_color);
Faberge 0:3ea368f65bca 301 BSP_LCD_SetBackColor(back_color);
Faberge 0:3ea368f65bca 302
Faberge 0:3ea368f65bca 303 return 0;
Faberge 0:3ea368f65bca 304 }
Faberge 0:3ea368f65bca 305
Faberge 0:3ea368f65bca 306 /* Вывод значения специальных клавиш клавиатуры */
Faberge 0:3ea368f65bca 307 uint8_t Key_display_specials(uint8_t id)
Faberge 0:3ea368f65bca 308 {
Faberge 0:3ea368f65bca 309 /* Клавиша "Enter" */
Faberge 0:3ea368f65bca 310 if (keyboard.key[id].value[keyboard.mode] == KEY_ENTER_VALUE)
Faberge 0:3ea368f65bca 311 {
Faberge 0:3ea368f65bca 312 BSP_LCD_DisplayStringAt(keyboard.key[id].posX + 8, keyboard.key[id].posY + 8, (uint8_t *) "Enter", LEFT_MODE);
Faberge 0:3ea368f65bca 313 }
Faberge 0:3ea368f65bca 314 /* Клавиша "Shift" */
Faberge 0:3ea368f65bca 315 if (keyboard.key[id].value[keyboard.mode] == KEY_SHIFT_VALUE)
Faberge 0:3ea368f65bca 316 {
Faberge 0:3ea368f65bca 317 BSP_LCD_DisplayStringAt(keyboard.key[id].posX + 4, keyboard.key[id].posY + 8, (uint8_t *) "Shft", LEFT_MODE);
Faberge 0:3ea368f65bca 318 }
Faberge 0:3ea368f65bca 319
Faberge 0:3ea368f65bca 320 /* Клаиша "Space" */
Faberge 0:3ea368f65bca 321 if (keyboard.key[id].value[keyboard.mode] == KEY_SPACE_VALUE)
Faberge 0:3ea368f65bca 322 {
Faberge 0:3ea368f65bca 323 BSP_LCD_DisplayStringAt(keyboard.key[id].posX + 32, keyboard.key[id].posY + 8, (uint8_t *) "Space", LEFT_MODE);
Faberge 0:3ea368f65bca 324 }
Faberge 0:3ea368f65bca 325
Faberge 0:3ea368f65bca 326 /* Клавиша "Backspace" */
Faberge 0:3ea368f65bca 327 if (keyboard.key[id].value[keyboard.mode] == KEY_BACKSPACE_VALUE)
Faberge 0:3ea368f65bca 328 {
Faberge 0:3ea368f65bca 329 BSP_LCD_DisplayStringAt(keyboard.key[id].posX + 4, keyboard.key[id].posY + 8, (uint8_t *) "Bspc", LEFT_MODE);
Faberge 0:3ea368f65bca 330 }
Faberge 0:3ea368f65bca 331
Faberge 0:3ea368f65bca 332 return 0;
Faberge 0:3ea368f65bca 333 }
Faberge 0:3ea368f65bca 334
Faberge 0:3ea368f65bca 335 /* Проверка ввода на экранной клавиатуре */
Faberge 0:3ea368f65bca 336 uint8_t Keyboard_check(void)
Faberge 0:3ea368f65bca 337 {
Faberge 0:3ea368f65bca 338 uint8_t i;
Faberge 0:3ea368f65bca 339 uint8_t j;
Faberge 0:3ea368f65bca 340
Faberge 0:3ea368f65bca 341 /* Проверяем состояния драйвера тач-экрана */
Faberge 0:3ea368f65bca 342 BSP_TS_GetState(&tScreen);
Faberge 0:3ea368f65bca 343
Faberge 0:3ea368f65bca 344 /* Если произошло касание */
Faberge 0:3ea368f65bca 345 if (tScreen.touchDetected)
Faberge 0:3ea368f65bca 346 {
Faberge 0:3ea368f65bca 347 for (i = 0; i < KEY_NUMBER; i++)
Faberge 0:3ea368f65bca 348 {
Faberge 0:3ea368f65bca 349 /* Если координаты касания лежат в границах какой-либо из ненажатых кнопок +/- 4 пикселя */
Faberge 0:3ea368f65bca 350 if (((tScreen.touchX[0] >= keyboard.key[i].posX - 4) && (tScreen.touchX[0] < keyboard.key[i].posX + keyboard.key[i].dimX + 4)) &&
Faberge 0:3ea368f65bca 351 ((tScreen.touchY[0] >= keyboard.key[i].posY - 4) && (tScreen.touchY[0] < keyboard.key[i].posY + keyboard.key[i].dimY + 4)) &&
Faberge 0:3ea368f65bca 352 (keyboard.key[i].status == KEY_RELEASED))
Faberge 0:3ea368f65bca 353 {
Faberge 0:3ea368f65bca 354 /* Отрисовываем нужную клавишу в инвертированном цвете*/
Faberge 0:3ea368f65bca 355 Key_display_inverted(i);
Faberge 0:3ea368f65bca 356
Faberge 0:3ea368f65bca 357 /* Если до этого нажатие было зафиксировано на другой клавише,
Faberge 0:3ea368f65bca 358 * отжимаем её и перерисовываем
Faberge 0:3ea368f65bca 359 */
Faberge 0:3ea368f65bca 360 for (j = 0; j < KEY_NUMBER; j++)
Faberge 0:3ea368f65bca 361 {
Faberge 0:3ea368f65bca 362 if (keyboard.key[j].status == KEY_PRESSED)
Faberge 0:3ea368f65bca 363 {
Faberge 0:3ea368f65bca 364 Key_display_normal(j);
Faberge 0:3ea368f65bca 365
Faberge 0:3ea368f65bca 366 keyboard.key[j].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 367 }
Faberge 0:3ea368f65bca 368 }
Faberge 0:3ea368f65bca 369
Faberge 0:3ea368f65bca 370 /* Меняем состояние клавишы, для которой было зафиксировано нажатие */
Faberge 0:3ea368f65bca 371 keyboard.key[i].status = KEY_PRESSED;
Faberge 0:3ea368f65bca 372
Faberge 0:3ea368f65bca 373 /* Сбрасываем состояние драйвера тач-экрана */
Faberge 0:3ea368f65bca 374 BSP_TS_ResetTouchData(&tScreen);
Faberge 0:3ea368f65bca 375 }
Faberge 0:3ea368f65bca 376 }
Faberge 0:3ea368f65bca 377 }
Faberge 0:3ea368f65bca 378 /* Если касания нет, проверяем состояние каждой клавишы, возможно, касание
Faberge 0:3ea368f65bca 379 * было до этого момента и следует обработать ввод
Faberge 0:3ea368f65bca 380 */
Faberge 0:3ea368f65bca 381 else
Faberge 0:3ea368f65bca 382 {
Faberge 0:3ea368f65bca 383 for (i = 0; i < KEY_NUMBER; i++)
Faberge 0:3ea368f65bca 384 {
Faberge 0:3ea368f65bca 385 /* Если клавиша в нажатом состоянии, отжимаем её и перерисовываем */
Faberge 0:3ea368f65bca 386 if (keyboard.key[i].status == KEY_PRESSED)
Faberge 0:3ea368f65bca 387 {
Faberge 0:3ea368f65bca 388 Key_display_normal(i);
Faberge 0:3ea368f65bca 389
Faberge 0:3ea368f65bca 390 keyboard.key[i].status = KEY_RELEASED;
Faberge 0:3ea368f65bca 391 BSP_TS_ResetTouchData(&tScreen);
Faberge 0:3ea368f65bca 392
Faberge 0:3ea368f65bca 393 /* Возвращаем пользовательский ввод */
Faberge 0:3ea368f65bca 394 return keyboard.key[i].value[keyboard.mode];
Faberge 0:3ea368f65bca 395 }
Faberge 0:3ea368f65bca 396 }
Faberge 0:3ea368f65bca 397 }
Faberge 0:3ea368f65bca 398
Faberge 0:3ea368f65bca 399 return 0;
Faberge 0:3ea368f65bca 400 }
Faberge 0:3ea368f65bca 401
Faberge 0:3ea368f65bca 402 /* Обработчик ввода на экранной клавиатуре */
Faberge 0:3ea368f65bca 403 uint8_t Keyboard_handler(char buffer[])
Faberge 0:3ea368f65bca 404 {
Faberge 0:3ea368f65bca 405 uint8_t i;
Faberge 0:3ea368f65bca 406 uint8_t len;
Faberge 0:3ea368f65bca 407 uint8_t key;
Faberge 0:3ea368f65bca 408
Faberge 0:3ea368f65bca 409 /* Проверяем, есть ли новое нажатие */
Faberge 0:3ea368f65bca 410 key = Keyboard_check();
Faberge 0:3ea368f65bca 411
Faberge 0:3ea368f65bca 412 /* Если нажата стандартная клавиша или клавиша "Space" */
Faberge 0:3ea368f65bca 413 if ((key >= KEY_SPACE_VALUE) && (key != KEY_DELETE_VALUE))
Faberge 0:3ea368f65bca 414 {
Faberge 0:3ea368f65bca 415 /* Проверяем буффер клавиатуры и, если есть свободное место, добавляем
Faberge 0:3ea368f65bca 416 * символ с нажатой клавишы в буфер клавиатуры
Faberge 0:3ea368f65bca 417 */
Faberge 0:3ea368f65bca 418 i = strlen(keyboard.buffer);
Faberge 0:3ea368f65bca 419 if (i < KEY_BUFFER_LEN)
Faberge 0:3ea368f65bca 420 {
Faberge 0:3ea368f65bca 421 keyboard.buffer[i] = key;
Faberge 0:3ea368f65bca 422 keyboard.buffer[i + 1] = '\0';
Faberge 0:3ea368f65bca 423
Faberge 0:3ea368f65bca 424 /* Отображаем буфер клавиатуры на верхней строчке дисплея */
Faberge 0:3ea368f65bca 425 BSP_LCD_ClearStringLine(0);
Faberge 0:3ea368f65bca 426 BSP_LCD_DisplayStringAtLine(0, (uint8_t *) keyboard.buffer);
Faberge 0:3ea368f65bca 427 }
Faberge 0:3ea368f65bca 428 }
Faberge 0:3ea368f65bca 429 /* Если нажата специальная клавиша */
Faberge 0:3ea368f65bca 430 else
Faberge 0:3ea368f65bca 431 {
Faberge 0:3ea368f65bca 432 /* Если нажата клавиша "Enter", то копируем данные из буфера клавиатуры
Faberge 0:3ea368f65bca 433 * в пользовательский буфер и затираем данные в буфере клавиатуры
Faberge 0:3ea368f65bca 434 */
Faberge 0:3ea368f65bca 435 if (key == KEY_ENTER_VALUE)
Faberge 0:3ea368f65bca 436 {
Faberge 0:3ea368f65bca 437 len = strlen(keyboard.buffer);
Faberge 0:3ea368f65bca 438
Faberge 0:3ea368f65bca 439 for (i = 0; i <= len; i++)
Faberge 0:3ea368f65bca 440 {
Faberge 0:3ea368f65bca 441 buffer[i] = keyboard.buffer[i];
Faberge 0:3ea368f65bca 442 }
Faberge 0:3ea368f65bca 443
Faberge 0:3ea368f65bca 444 keyboard.buffer[0] = '\0';
Faberge 0:3ea368f65bca 445
Faberge 0:3ea368f65bca 446 /* Затираем верхнюю строчку на дисплее */
Faberge 0:3ea368f65bca 447 BSP_LCD_ClearStringLine(0);
Faberge 0:3ea368f65bca 448 BSP_LCD_DisplayStringAtLine(0, (uint8_t *) keyboard.buffer);
Faberge 0:3ea368f65bca 449 }
Faberge 0:3ea368f65bca 450
Faberge 0:3ea368f65bca 451 /* Если нажата клавиша "Shift", меняем раскладку клавиатуры */
Faberge 0:3ea368f65bca 452 if (key == KEY_SHIFT_VALUE)
Faberge 0:3ea368f65bca 453 {
Faberge 0:3ea368f65bca 454 keyboard.mode = !keyboard.mode;
Faberge 0:3ea368f65bca 455
Faberge 0:3ea368f65bca 456 for (i = 0; i < KEY_NUMBER; i++)
Faberge 0:3ea368f65bca 457 {
Faberge 0:3ea368f65bca 458 /* Выводим значение клавишы в новой раскладке */
Faberge 0:3ea368f65bca 459 BSP_LCD_DisplayChar(keyboard.key[i].posX + 8, keyboard.key[i].posY + 8, keyboard.key[i].value[keyboard.mode]);
Faberge 0:3ea368f65bca 460 Key_display_specials(i);
Faberge 0:3ea368f65bca 461 }
Faberge 0:3ea368f65bca 462 }
Faberge 0:3ea368f65bca 463
Faberge 0:3ea368f65bca 464 /* Если нажата клавиша "Backspace", удаляем крайний символ из буфера
Faberge 0:3ea368f65bca 465 * клавиатуры */
Faberge 0:3ea368f65bca 466 if (key == KEY_BACKSPACE_VALUE)
Faberge 0:3ea368f65bca 467 {
Faberge 0:3ea368f65bca 468 len = strlen(keyboard.buffer);
Faberge 0:3ea368f65bca 469 if (len != 0)
Faberge 0:3ea368f65bca 470 {
Faberge 0:3ea368f65bca 471 keyboard.buffer[len - 1] = '\0';
Faberge 0:3ea368f65bca 472 BSP_LCD_ClearStringLine(0);
Faberge 0:3ea368f65bca 473 BSP_LCD_DisplayStringAtLine(0, (uint8_t *) keyboard.buffer);
Faberge 0:3ea368f65bca 474 }
Faberge 0:3ea368f65bca 475 }
Faberge 0:3ea368f65bca 476 }
Faberge 0:3ea368f65bca 477
Faberge 0:3ea368f65bca 478 /* Возвращаем значение последней нажатой клавишы */
Faberge 0:3ea368f65bca 479 return key;
Faberge 0:3ea368f65bca 480 }