Library for virtual onscreen keyboard for STM32F746 Disco board
Dependencies: BSP_DISCO_F746NG mbed
user/keyboard.c@0:3ea368f65bca, 2016-09-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |