Touchscreen digit recognition.
Dependencies: mbed TFT_fonts SPI_TFT_ILI9341 Adafruit_GFX FT6206 MMA8451Q
main.cpp@1:c44001c6bbf8, 2020-01-16 (annotated)
- Committer:
- rankedss
- Date:
- Thu Jan 16 23:07:38 2020 +0000
- Revision:
- 1:c44001c6bbf8
- Parent:
- 0:5264c6cecce9
- Child:
- 2:1ab6ba7c2c90
finalize
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JackB | 0:5264c6cecce9 | 1 | #include "mbed.h" |
JackB | 0:5264c6cecce9 | 2 | #include "SPI_TFT_ILI9341.h" |
JackB | 0:5264c6cecce9 | 3 | #include "FT6206.h" |
rankedss | 1:c44001c6bbf8 | 4 | #include <algorithm> |
rankedss | 1:c44001c6bbf8 | 5 | #include <string> |
rankedss | 1:c44001c6bbf8 | 6 | #include "weigths.hpp" |
rankedss | 1:c44001c6bbf8 | 7 | |
rankedss | 1:c44001c6bbf8 | 8 | // Accelorameter |
rankedss | 1:c44001c6bbf8 | 9 | #include "MMA8451Q.h" |
rankedss | 1:c44001c6bbf8 | 10 | #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) |
rankedss | 1:c44001c6bbf8 | 11 | PinName const SDA = PTE25; |
rankedss | 1:c44001c6bbf8 | 12 | PinName const SCL = PTE24; |
rankedss | 1:c44001c6bbf8 | 13 | #elif defined (TARGET_KL05Z) |
rankedss | 1:c44001c6bbf8 | 14 | PinName const SDA = PTB4; |
rankedss | 1:c44001c6bbf8 | 15 | PinName const SCL = PTB3; |
rankedss | 1:c44001c6bbf8 | 16 | #elif defined (TARGET_K20D50M) |
rankedss | 1:c44001c6bbf8 | 17 | PinName const SDA = PTB1; |
rankedss | 1:c44001c6bbf8 | 18 | PinName const SCL = PTB0; |
rankedss | 1:c44001c6bbf8 | 19 | #else |
rankedss | 1:c44001c6bbf8 | 20 | #error TARGET NOT DEFINED |
rankedss | 1:c44001c6bbf8 | 21 | #endif |
rankedss | 1:c44001c6bbf8 | 22 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
JackB | 0:5264c6cecce9 | 23 | |
JackB | 0:5264c6cecce9 | 24 | #include "Arial12x12.h" |
rankedss | 1:c44001c6bbf8 | 25 | #include "Arial24x23.h" |
rankedss | 1:c44001c6bbf8 | 26 | #include "Arial28x28.h" |
JackB | 0:5264c6cecce9 | 27 | |
JackB | 0:5264c6cecce9 | 28 | #define PIN_XP A3 |
JackB | 0:5264c6cecce9 | 29 | #define PIN_XM A1 |
JackB | 0:5264c6cecce9 | 30 | #define PIN_YP A2 |
JackB | 0:5264c6cecce9 | 31 | #define PIN_YM A0 |
JackB | 0:5264c6cecce9 | 32 | #define PIN_SCLK D13 |
JackB | 0:5264c6cecce9 | 33 | #define PIN_MISO D12 |
JackB | 0:5264c6cecce9 | 34 | #define PIN_MOSI D11 |
JackB | 0:5264c6cecce9 | 35 | #define PIN_CS_TFT D10 // chip select pin |
JackB | 0:5264c6cecce9 | 36 | #define PIN_DC_TFT D9 // data/command select pin. |
JackB | 0:5264c6cecce9 | 37 | #define PIN_RESET_TFT D8 |
JackB | 0:5264c6cecce9 | 38 | //#define PIN_BL_TFT D7 |
JackB | 0:5264c6cecce9 | 39 | #define PIN_CS_SD D4 |
JackB | 0:5264c6cecce9 | 40 | |
JackB | 0:5264c6cecce9 | 41 | #define PORTRAIT 0 |
JackB | 0:5264c6cecce9 | 42 | #define LANDSCAPE 1 |
JackB | 0:5264c6cecce9 | 43 | |
rankedss | 1:c44001c6bbf8 | 44 | #define PIN_SCL_FT6206 A5 |
rankedss | 1:c44001c6bbf8 | 45 | #define PIN_SDA_FT6206 A4 |
JackB | 0:5264c6cecce9 | 46 | #define PIN_INT_FT6206 D7 |
JackB | 0:5264c6cecce9 | 47 | |
JackB | 0:5264c6cecce9 | 48 | #define ILI9341_TFTWIDTH 320 |
JackB | 0:5264c6cecce9 | 49 | #define ILI9341_TFTHEIGHT 240 |
JackB | 0:5264c6cecce9 | 50 | |
JackB | 0:5264c6cecce9 | 51 | DigitalOut led1(LED1); |
JackB | 0:5264c6cecce9 | 52 | DigitalOut led2(LED2); |
JackB | 0:5264c6cecce9 | 53 | DigitalOut led3(LED3); |
JackB | 0:5264c6cecce9 | 54 | DigitalOut led4(LED4); |
JackB | 0:5264c6cecce9 | 55 | |
JackB | 0:5264c6cecce9 | 56 | //SPI_TFT_ILI9341 TFT(p5, p6, p7, p8, p9, p10,"TFT"); // mosi, miso, sclk, cs, reset, dc |
rankedss | 1:c44001c6bbf8 | 57 | SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "TFT"); // mosi, miso, sclk, cs, reset, dc |
JackB | 0:5264c6cecce9 | 58 | FT6206 FT6206(PIN_SDA_FT6206, PIN_SCL_FT6206, PIN_INT_FT6206); // sda, scl, int |
rankedss | 1:c44001c6bbf8 | 59 | MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); |
JackB | 0:5264c6cecce9 | 60 | |
rankedss | 1:c44001c6bbf8 | 61 | int maxIndex(float vector_name[]) |
rankedss | 1:c44001c6bbf8 | 62 | { |
rankedss | 1:c44001c6bbf8 | 63 | double max = vector_name[0]; |
rankedss | 1:c44001c6bbf8 | 64 | int index = 0; |
rankedss | 1:c44001c6bbf8 | 65 | for (int i = 0; i != 10; i++) { |
rankedss | 1:c44001c6bbf8 | 66 | if (max < vector_name[i]) { |
rankedss | 1:c44001c6bbf8 | 67 | max = vector_name[i]; |
rankedss | 1:c44001c6bbf8 | 68 | index = i; |
rankedss | 1:c44001c6bbf8 | 69 | } |
rankedss | 1:c44001c6bbf8 | 70 | } |
rankedss | 1:c44001c6bbf8 | 71 | return index; |
rankedss | 1:c44001c6bbf8 | 72 | } |
rankedss | 1:c44001c6bbf8 | 73 | |
rankedss | 1:c44001c6bbf8 | 74 | float RELU(float x) |
rankedss | 1:c44001c6bbf8 | 75 | { |
rankedss | 1:c44001c6bbf8 | 76 | return std::max(0.0f, x); |
rankedss | 1:c44001c6bbf8 | 77 | } |
rankedss | 1:c44001c6bbf8 | 78 | |
rankedss | 1:c44001c6bbf8 | 79 | int FeedForward() |
rankedss | 1:c44001c6bbf8 | 80 | { |
rankedss | 1:c44001c6bbf8 | 81 | float convImages[kernel_count][convImageSize][convImageSize] = {0.0f}; |
rankedss | 1:c44001c6bbf8 | 82 | |
rankedss | 1:c44001c6bbf8 | 83 | for (unsigned f = 0; f != kernel_count; f++) { |
rankedss | 1:c44001c6bbf8 | 84 | for (unsigned i = 0; i <= image_size - kernel_size; i += stride) { |
rankedss | 1:c44001c6bbf8 | 85 | for (unsigned j = 0; j <= image_size - kernel_size; j += stride) { |
rankedss | 1:c44001c6bbf8 | 86 | for (unsigned k = i; k < i + kernel_size; k++) { |
rankedss | 1:c44001c6bbf8 | 87 | for (unsigned l = j; l < j + kernel_size; l++) { |
rankedss | 1:c44001c6bbf8 | 88 | convImages[f][i / stride][j / stride] += image[k][l] * kernels[f][k - i][l - j]; |
rankedss | 1:c44001c6bbf8 | 89 | } |
rankedss | 1:c44001c6bbf8 | 90 | } |
rankedss | 1:c44001c6bbf8 | 91 | convImages[f][i / stride][j / stride] += bias_kernels[f]; |
rankedss | 1:c44001c6bbf8 | 92 | } |
rankedss | 1:c44001c6bbf8 | 93 | } |
rankedss | 1:c44001c6bbf8 | 94 | } |
rankedss | 1:c44001c6bbf8 | 95 | |
rankedss | 1:c44001c6bbf8 | 96 | unsigned elem = 0; |
rankedss | 1:c44001c6bbf8 | 97 | for (unsigned f = 0; f != kernel_count; f++) { |
rankedss | 1:c44001c6bbf8 | 98 | for (unsigned j = 0; j != convImageSize; j++) { |
rankedss | 1:c44001c6bbf8 | 99 | for (unsigned k = 0; k != convImageSize; k++) { |
rankedss | 1:c44001c6bbf8 | 100 | activated[elem++] = RELU(convImages[f][j][k]); |
rankedss | 1:c44001c6bbf8 | 101 | } |
rankedss | 1:c44001c6bbf8 | 102 | } |
rankedss | 1:c44001c6bbf8 | 103 | } |
rankedss | 1:c44001c6bbf8 | 104 | |
rankedss | 1:c44001c6bbf8 | 105 | float z[10] = {0.0f}; |
rankedss | 1:c44001c6bbf8 | 106 | for (unsigned i = 0; i != 10; i++) { |
rankedss | 1:c44001c6bbf8 | 107 | z[i] = 0.0f; |
rankedss | 1:c44001c6bbf8 | 108 | for (unsigned j = 0; j != kernel_count * convImageSize * convImageSize; j++) { |
rankedss | 1:c44001c6bbf8 | 109 | z[i] += weights[i][j] * activated[j]; |
rankedss | 1:c44001c6bbf8 | 110 | } |
rankedss | 1:c44001c6bbf8 | 111 | z[i] += bias_weights[i]; |
rankedss | 1:c44001c6bbf8 | 112 | } |
rankedss | 1:c44001c6bbf8 | 113 | int ymax = maxIndex(z); |
rankedss | 1:c44001c6bbf8 | 114 | return ymax; |
rankedss | 1:c44001c6bbf8 | 115 | } |
rankedss | 1:c44001c6bbf8 | 116 | |
rankedss | 1:c44001c6bbf8 | 117 | void landscapeInit() |
JackB | 0:5264c6cecce9 | 118 | { |
JackB | 0:5264c6cecce9 | 119 | //Configure the display driver |
JackB | 0:5264c6cecce9 | 120 | TFT.claim(stdout); |
rankedss | 1:c44001c6bbf8 | 121 | TFT.background(LightGrey); |
rankedss | 1:c44001c6bbf8 | 122 | TFT.foreground(Green); |
JackB | 0:5264c6cecce9 | 123 | TFT.set_orientation(LANDSCAPE); |
JackB | 0:5264c6cecce9 | 124 | TFT.cls(); |
JackB | 0:5264c6cecce9 | 125 | |
JackB | 0:5264c6cecce9 | 126 | //Print a welcome message |
rankedss | 1:c44001c6bbf8 | 127 | TFT.fillrect(240, 25, 292, 45, Red); |
JackB | 0:5264c6cecce9 | 128 | TFT.set_font((unsigned char*) Arial12x12); |
rankedss | 1:c44001c6bbf8 | 129 | TFT.locate(245, 30); |
rankedss | 1:c44001c6bbf8 | 130 | TFT.background(Red); |
rankedss | 1:c44001c6bbf8 | 131 | TFT.printf("Guess"); |
rankedss | 1:c44001c6bbf8 | 132 | |
rankedss | 1:c44001c6bbf8 | 133 | //Print a welcome message |
rankedss | 1:c44001c6bbf8 | 134 | TFT.fillrect(240, 205, 292, 225, Red); |
rankedss | 1:c44001c6bbf8 | 135 | TFT.set_font((unsigned char*) Arial12x12); |
rankedss | 1:c44001c6bbf8 | 136 | TFT.locate(245, 210); |
rankedss | 1:c44001c6bbf8 | 137 | TFT.background(Red); |
rankedss | 1:c44001c6bbf8 | 138 | TFT.printf("Clear"); |
rankedss | 1:c44001c6bbf8 | 139 | |
rankedss | 1:c44001c6bbf8 | 140 | TFT.fillrect(20, 50, 160, 190, DarkGrey); |
rankedss | 1:c44001c6bbf8 | 141 | } |
rankedss | 1:c44001c6bbf8 | 142 | |
rankedss | 1:c44001c6bbf8 | 143 | void portraitInit() |
rankedss | 1:c44001c6bbf8 | 144 | { |
rankedss | 1:c44001c6bbf8 | 145 | //Configure the display driver |
rankedss | 1:c44001c6bbf8 | 146 | TFT.claim(stdout); |
rankedss | 1:c44001c6bbf8 | 147 | TFT.background(LightGrey); |
rankedss | 1:c44001c6bbf8 | 148 | TFT.foreground(Green); |
rankedss | 1:c44001c6bbf8 | 149 | TFT.set_orientation(PORTRAIT); |
rankedss | 1:c44001c6bbf8 | 150 | TFT.cls(); |
rankedss | 1:c44001c6bbf8 | 151 | |
rankedss | 1:c44001c6bbf8 | 152 | //Print a welcome message |
rankedss | 1:c44001c6bbf8 | 153 | TFT.fillrect(15, 25, 67, 45, Red); |
rankedss | 1:c44001c6bbf8 | 154 | TFT.set_font((unsigned char*) Arial12x12); |
rankedss | 1:c44001c6bbf8 | 155 | TFT.locate(20, 30); |
rankedss | 1:c44001c6bbf8 | 156 | TFT.background(Red); |
rankedss | 1:c44001c6bbf8 | 157 | TFT.printf("Guess"); |
JackB | 0:5264c6cecce9 | 158 | |
rankedss | 1:c44001c6bbf8 | 159 | //Print a welcome message |
rankedss | 1:c44001c6bbf8 | 160 | TFT.fillrect(160, 25, 212, 45, Red); |
rankedss | 1:c44001c6bbf8 | 161 | TFT.set_font((unsigned char*) Arial12x12); |
rankedss | 1:c44001c6bbf8 | 162 | TFT.locate(175, 30); |
rankedss | 1:c44001c6bbf8 | 163 | TFT.background(Red); |
rankedss | 1:c44001c6bbf8 | 164 | TFT.printf("Clear"); |
rankedss | 1:c44001c6bbf8 | 165 | |
rankedss | 1:c44001c6bbf8 | 166 | TFT.fillrect(50, 160, 190, 300, DarkGrey); |
rankedss | 1:c44001c6bbf8 | 167 | } |
rankedss | 1:c44001c6bbf8 | 168 | |
rankedss | 1:c44001c6bbf8 | 169 | int main(void) |
rankedss | 1:c44001c6bbf8 | 170 | { |
rankedss | 1:c44001c6bbf8 | 171 | // Get accelerometer data |
rankedss | 1:c44001c6bbf8 | 172 | float x, y, z; |
rankedss | 1:c44001c6bbf8 | 173 | x = abs(acc.getAccX()); |
rankedss | 1:c44001c6bbf8 | 174 | y = abs(acc.getAccY()); |
rankedss | 1:c44001c6bbf8 | 175 | z = abs(acc.getAccZ()); |
rankedss | 1:c44001c6bbf8 | 176 | bool horizontal = z < 0.5 ? y > x : true; |
rankedss | 1:c44001c6bbf8 | 177 | bool currentHorizontal = horizontal; |
rankedss | 1:c44001c6bbf8 | 178 | |
rankedss | 1:c44001c6bbf8 | 179 | if (currentHorizontal) |
rankedss | 1:c44001c6bbf8 | 180 | landscapeInit(); |
rankedss | 1:c44001c6bbf8 | 181 | else |
rankedss | 1:c44001c6bbf8 | 182 | portraitInit(); |
rankedss | 1:c44001c6bbf8 | 183 | |
rankedss | 1:c44001c6bbf8 | 184 | |
rankedss | 1:c44001c6bbf8 | 185 | // Initialize weights |
rankedss | 1:c44001c6bbf8 | 186 | for (unsigned i = 0; i != 28; i++) |
rankedss | 1:c44001c6bbf8 | 187 | { |
rankedss | 1:c44001c6bbf8 | 188 | for (unsigned j = 0; j != 28; j++) |
rankedss | 1:c44001c6bbf8 | 189 | { |
rankedss | 1:c44001c6bbf8 | 190 | image[i][j] = -0.5f; |
JackB | 0:5264c6cecce9 | 191 | } |
rankedss | 1:c44001c6bbf8 | 192 | } |
rankedss | 1:c44001c6bbf8 | 193 | |
JackB | 0:5264c6cecce9 | 194 | |
JackB | 0:5264c6cecce9 | 195 | |
rankedss | 1:c44001c6bbf8 | 196 | FT6206.begin(); |
rankedss | 1:c44001c6bbf8 | 197 | while(1) |
rankedss | 1:c44001c6bbf8 | 198 | { |
rankedss | 1:c44001c6bbf8 | 199 | for (unsigned int i = 0; i != 1000000; i++) { |
rankedss | 1:c44001c6bbf8 | 200 | if (i == 0) { |
rankedss | 1:c44001c6bbf8 | 201 | // Get accelerometer data |
rankedss | 1:c44001c6bbf8 | 202 | float x, y, z; |
rankedss | 1:c44001c6bbf8 | 203 | |
rankedss | 1:c44001c6bbf8 | 204 | x = abs(acc.getAccX()); |
rankedss | 1:c44001c6bbf8 | 205 | y = abs(acc.getAccY()); |
rankedss | 1:c44001c6bbf8 | 206 | z = abs(acc.getAccZ()); |
rankedss | 1:c44001c6bbf8 | 207 | |
rankedss | 1:c44001c6bbf8 | 208 | horizontal = z < 0.5 ? y > x : horizontal; |
rankedss | 1:c44001c6bbf8 | 209 | } |
rankedss | 1:c44001c6bbf8 | 210 | |
rankedss | 1:c44001c6bbf8 | 211 | if (currentHorizontal != horizontal) |
rankedss | 1:c44001c6bbf8 | 212 | { |
rankedss | 1:c44001c6bbf8 | 213 | currentHorizontal = horizontal; |
rankedss | 1:c44001c6bbf8 | 214 | if (currentHorizontal) |
rankedss | 1:c44001c6bbf8 | 215 | landscapeInit(); |
rankedss | 1:c44001c6bbf8 | 216 | else |
rankedss | 1:c44001c6bbf8 | 217 | portraitInit(); |
rankedss | 1:c44001c6bbf8 | 218 | } |
rankedss | 1:c44001c6bbf8 | 219 | |
rankedss | 1:c44001c6bbf8 | 220 | |
rankedss | 1:c44001c6bbf8 | 221 | if (FT6206.dataReceived()) |
rankedss | 1:c44001c6bbf8 | 222 | { |
rankedss | 1:c44001c6bbf8 | 223 | TS_Point p = FT6206.getPoint(); |
rankedss | 1:c44001c6bbf8 | 224 | |
rankedss | 1:c44001c6bbf8 | 225 | |
rankedss | 1:c44001c6bbf8 | 226 | if (horizontal) { |
rankedss | 1:c44001c6bbf8 | 227 | |
rankedss | 1:c44001c6bbf8 | 228 | if (p.x >= 25 and p.x <= 155 and p.y >= 55 and p.y <= 185) |
rankedss | 1:c44001c6bbf8 | 229 | { |
rankedss | 1:c44001c6bbf8 | 230 | // Handwriting panel has been pressed |
rankedss | 1:c44001c6bbf8 | 231 | TFT.fillcircle(p.x, p.y, 4, Yellow); |
rankedss | 1:c44001c6bbf8 | 232 | int image_y = (p.x-20)/5; |
rankedss | 1:c44001c6bbf8 | 233 | int image_x = (p.y-50)/5; |
rankedss | 1:c44001c6bbf8 | 234 | if (image_x > 0 and image_y > 0) |
rankedss | 1:c44001c6bbf8 | 235 | { |
rankedss | 1:c44001c6bbf8 | 236 | image[image_x-1][image_y-1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 237 | image[image_x-1][image_y] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 238 | image[image_x-1][image_y+1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 239 | image[image_x][image_y-1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 240 | image[image_x][image_y] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 241 | image[image_x][image_y+1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 242 | image[image_x+1][image_y-1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 243 | image[image_x+1][image_y] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 244 | image[image_x+1][image_y+1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 245 | } |
rankedss | 1:c44001c6bbf8 | 246 | } |
rankedss | 1:c44001c6bbf8 | 247 | else if (p.y >= 0 and p.y <= 60 and p.x >= 200 and p.x <= 320) |
rankedss | 1:c44001c6bbf8 | 248 | { |
rankedss | 1:c44001c6bbf8 | 249 | // Guess button has been pressed |
rankedss | 1:c44001c6bbf8 | 250 | TFT.fillrect(180, 50, 320, 190, LightGrey); |
rankedss | 1:c44001c6bbf8 | 251 | char prediction = FeedForward(); |
rankedss | 1:c44001c6bbf8 | 252 | TFT.locate(270, 110); |
rankedss | 1:c44001c6bbf8 | 253 | TFT.background(LightGrey); |
rankedss | 1:c44001c6bbf8 | 254 | TFT.foreground(Green); |
rankedss | 1:c44001c6bbf8 | 255 | |
rankedss | 1:c44001c6bbf8 | 256 | TFT.set_font((unsigned char*) Arial28x28); |
rankedss | 1:c44001c6bbf8 | 257 | switch (prediction) |
rankedss | 1:c44001c6bbf8 | 258 | { |
rankedss | 1:c44001c6bbf8 | 259 | case 0: TFT.printf("0"); break; |
rankedss | 1:c44001c6bbf8 | 260 | case 1: TFT.printf("1"); break; |
rankedss | 1:c44001c6bbf8 | 261 | case 2: TFT.printf("2"); break; |
rankedss | 1:c44001c6bbf8 | 262 | case 3: TFT.printf("3"); break; |
rankedss | 1:c44001c6bbf8 | 263 | case 4: TFT.printf("4"); break; |
rankedss | 1:c44001c6bbf8 | 264 | case 5: TFT.printf("5"); break; |
rankedss | 1:c44001c6bbf8 | 265 | case 6: TFT.printf("6"); break; |
rankedss | 1:c44001c6bbf8 | 266 | case 7: TFT.printf("7"); break; |
rankedss | 1:c44001c6bbf8 | 267 | case 8: TFT.printf("8"); break; |
rankedss | 1:c44001c6bbf8 | 268 | case 9: TFT.printf("9"); break; |
rankedss | 1:c44001c6bbf8 | 269 | default: TFT.printf("noidea\n"); |
rankedss | 1:c44001c6bbf8 | 270 | } |
rankedss | 1:c44001c6bbf8 | 271 | } |
rankedss | 1:c44001c6bbf8 | 272 | else if (p.y >= 185 and p.y <= 240 and p.x >= 220 and p.x <= 320) |
rankedss | 1:c44001c6bbf8 | 273 | { |
rankedss | 1:c44001c6bbf8 | 274 | // Clear button has been pressed |
rankedss | 1:c44001c6bbf8 | 275 | TFT.fillrect(15, 45, 165, 195, LightGrey); |
rankedss | 1:c44001c6bbf8 | 276 | TFT.fillrect(20, 50, 160, 190, DarkGrey); |
rankedss | 1:c44001c6bbf8 | 277 | for (unsigned i = 0; i != 28; i++) |
rankedss | 1:c44001c6bbf8 | 278 | { |
rankedss | 1:c44001c6bbf8 | 279 | for (unsigned j = 0; j != 28; j++) |
rankedss | 1:c44001c6bbf8 | 280 | { |
rankedss | 1:c44001c6bbf8 | 281 | image[i][j] = -0.5f; |
rankedss | 1:c44001c6bbf8 | 282 | } |
rankedss | 1:c44001c6bbf8 | 283 | } |
rankedss | 1:c44001c6bbf8 | 284 | } |
rankedss | 1:c44001c6bbf8 | 285 | //horizantal end |
rankedss | 1:c44001c6bbf8 | 286 | } |
rankedss | 1:c44001c6bbf8 | 287 | else |
rankedss | 1:c44001c6bbf8 | 288 | { |
rankedss | 1:c44001c6bbf8 | 289 | if (p.x >= 160 and p.x <= 300 and p.y >= 50 and p.y <= 190) |
rankedss | 1:c44001c6bbf8 | 290 | { |
rankedss | 1:c44001c6bbf8 | 291 | // Handwriting panel has been pressed |
rankedss | 1:c44001c6bbf8 | 292 | TFT.fillcircle(240-p.y, p.x, 4, Yellow); |
rankedss | 1:c44001c6bbf8 | 293 | int image_x = (p.x-160)/5; |
rankedss | 1:c44001c6bbf8 | 294 | int image_y = (240- p.y-50)/5; |
rankedss | 1:c44001c6bbf8 | 295 | if (image_x > 0 and image_y > 0) |
rankedss | 1:c44001c6bbf8 | 296 | { |
rankedss | 1:c44001c6bbf8 | 297 | image[image_x-1][image_y-1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 298 | image[image_x-1][image_y] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 299 | image[image_x-1][image_y+1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 300 | image[image_x][image_y-1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 301 | image[image_x][image_y] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 302 | image[image_x][image_y+1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 303 | image[image_x+1][image_y-1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 304 | image[image_x+1][image_y] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 305 | image[image_x+1][image_y+1] = 0.5f; |
rankedss | 1:c44001c6bbf8 | 306 | } |
rankedss | 1:c44001c6bbf8 | 307 | } |
rankedss | 1:c44001c6bbf8 | 308 | else if (p.y >= 140 and p.y <= 240 and p.x >= 1 and p.x <= 70) |
rankedss | 1:c44001c6bbf8 | 309 | { |
rankedss | 1:c44001c6bbf8 | 310 | // Guess button has been pressed |
rankedss | 1:c44001c6bbf8 | 311 | TFT.fillrect(90, 0, 140, 60, LightGrey); |
rankedss | 1:c44001c6bbf8 | 312 | char prediction = FeedForward(); |
rankedss | 1:c44001c6bbf8 | 313 | TFT.locate(110, 30); |
rankedss | 1:c44001c6bbf8 | 314 | TFT.background(LightGrey); |
rankedss | 1:c44001c6bbf8 | 315 | TFT.foreground(Green); |
rankedss | 1:c44001c6bbf8 | 316 | |
rankedss | 1:c44001c6bbf8 | 317 | TFT.set_font((unsigned char*) Arial28x28); |
rankedss | 1:c44001c6bbf8 | 318 | switch (prediction) |
rankedss | 1:c44001c6bbf8 | 319 | { |
rankedss | 1:c44001c6bbf8 | 320 | case 0: TFT.printf("0"); break; |
rankedss | 1:c44001c6bbf8 | 321 | case 1: TFT.printf("1"); break; |
rankedss | 1:c44001c6bbf8 | 322 | case 2: TFT.printf("2"); break; |
rankedss | 1:c44001c6bbf8 | 323 | case 3: TFT.printf("3"); break; |
rankedss | 1:c44001c6bbf8 | 324 | case 4: TFT.printf("4"); break; |
rankedss | 1:c44001c6bbf8 | 325 | case 5: TFT.printf("5"); break; |
rankedss | 1:c44001c6bbf8 | 326 | case 6: TFT.printf("6"); break; |
rankedss | 1:c44001c6bbf8 | 327 | case 7: TFT.printf("7"); break; |
rankedss | 1:c44001c6bbf8 | 328 | case 8: TFT.printf("8"); break; |
rankedss | 1:c44001c6bbf8 | 329 | case 9: TFT.printf("9"); break; |
rankedss | 1:c44001c6bbf8 | 330 | default: TFT.printf("noidea\n"); |
rankedss | 1:c44001c6bbf8 | 331 | } |
rankedss | 1:c44001c6bbf8 | 332 | } |
rankedss | 1:c44001c6bbf8 | 333 | else if (p.y >= 1 and p.y <= 80 and p.x >= 0 and p.x <= 70) |
rankedss | 1:c44001c6bbf8 | 334 | { |
rankedss | 1:c44001c6bbf8 | 335 | // Clear button has been pressed |
rankedss | 1:c44001c6bbf8 | 336 | TFT.fillrect(45, 155, 195, 305, LightGrey); |
rankedss | 1:c44001c6bbf8 | 337 | TFT.fillrect(50, 160, 190, 300, DarkGrey); |
rankedss | 1:c44001c6bbf8 | 338 | for (unsigned i = 0; i != 28; i++) |
rankedss | 1:c44001c6bbf8 | 339 | { |
rankedss | 1:c44001c6bbf8 | 340 | for (unsigned j = 0; j != 28; j++) |
rankedss | 1:c44001c6bbf8 | 341 | { |
rankedss | 1:c44001c6bbf8 | 342 | image[i][j] = -0.5f; |
rankedss | 1:c44001c6bbf8 | 343 | } |
rankedss | 1:c44001c6bbf8 | 344 | } |
rankedss | 1:c44001c6bbf8 | 345 | } |
rankedss | 1:c44001c6bbf8 | 346 | |
rankedss | 1:c44001c6bbf8 | 347 | // portrait end |
rankedss | 1:c44001c6bbf8 | 348 | } |
rankedss | 1:c44001c6bbf8 | 349 | |
rankedss | 1:c44001c6bbf8 | 350 | |
rankedss | 1:c44001c6bbf8 | 351 | |
rankedss | 1:c44001c6bbf8 | 352 | } |
rankedss | 1:c44001c6bbf8 | 353 | } |
JackB | 0:5264c6cecce9 | 354 | } |
JackB | 0:5264c6cecce9 | 355 | } |