app5
Dependencies: TFTv2 nihh-utils xpl
main.cpp@2:1335510cfb92, 2018-10-13 (annotated)
- Committer:
- richnash
- Date:
- Sat Oct 13 14:32:45 2018 +0100
- Revision:
- 2:1335510cfb92
- Parent:
- 0:9094a94896f6
- Child:
- 3:f96822b3edb5
working - clean
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
richnash | 0:9094a94896f6 | 1 | |
richnash | 0:9094a94896f6 | 2 | // ################################################################################## |
richnash | 0:9094a94896f6 | 3 | // XPL with TFT Screen Application |
richnash | 0:9094a94896f6 | 4 | // ################################################################################## |
richnash | 0:9094a94896f6 | 5 | |
richnash | 0:9094a94896f6 | 6 | // generate XPL debug level output on the serial line |
richnash | 0:9094a94896f6 | 7 | //#define DEBUG_OUTPUT_XPL |
richnash | 0:9094a94896f6 | 8 | |
richnash | 0:9094a94896f6 | 9 | // turn OFF dependency on being connected to ethernet |
richnash | 0:9094a94896f6 | 10 | //#define CONNECTED_OFF |
richnash | 0:9094a94896f6 | 11 | |
richnash | 0:9094a94896f6 | 12 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 13 | // MBED Headers |
richnash | 0:9094a94896f6 | 14 | #include "mbed.h" |
richnash | 0:9094a94896f6 | 15 | #include "EthernetInterface.h" |
richnash | 0:9094a94896f6 | 16 | #include <math.h> |
richnash | 0:9094a94896f6 | 17 | |
richnash | 0:9094a94896f6 | 18 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 19 | // Graphics Headers |
richnash | 0:9094a94896f6 | 20 | #include "ILI9341.h" |
richnash | 0:9094a94896f6 | 21 | #include "SPI_STMPE610.h" |
richnash | 0:9094a94896f6 | 22 | #include "Arial12x12.h" |
richnash | 0:9094a94896f6 | 23 | #include "Arial24x23.h" |
richnash | 0:9094a94896f6 | 24 | #include "Arial28x28.h" |
richnash | 0:9094a94896f6 | 25 | #include "Arial43x48_numb.h" |
richnash | 0:9094a94896f6 | 26 | |
richnash | 0:9094a94896f6 | 27 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 28 | // My Headers |
richnash | 0:9094a94896f6 | 29 | #include "Watchdog.h" |
richnash | 0:9094a94896f6 | 30 | #include "xPL.h" |
richnash | 0:9094a94896f6 | 31 | #include "nihh_utils.h" |
richnash | 0:9094a94896f6 | 32 | |
richnash | 0:9094a94896f6 | 33 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 34 | // XPL defines |
richnash | 0:9094a94896f6 | 35 | #define UDP_PORT 3865 |
richnash | 0:9094a94896f6 | 36 | #define UDP_BUFFER_SIZE 500 |
richnash | 0:9094a94896f6 | 37 | |
richnash | 0:9094a94896f6 | 38 | #define XPL_NAME "NUCLEO1" |
richnash | 0:9094a94896f6 | 39 | |
richnash | 0:9094a94896f6 | 40 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 41 | // global variables |
richnash | 0:9094a94896f6 | 42 | Watchdog wd; |
richnash | 0:9094a94896f6 | 43 | xPL xpl; |
richnash | 0:9094a94896f6 | 44 | |
richnash | 2:1335510cfb92 | 45 | DigitalOut led1(LED1); // green = normal startup |
richnash | 2:1335510cfb92 | 46 | DigitalOut led2(LED2); // blue = ethernet data received |
richnash | 2:1335510cfb92 | 47 | DigitalOut led3(LED3); // red = watchdog startup |
richnash | 2:1335510cfb92 | 48 | DigitalOut led4(LED4); // ?? |
richnash | 0:9094a94896f6 | 49 | |
richnash | 0:9094a94896f6 | 50 | Serial logger(SERIAL_TX, SERIAL_RX); |
richnash | 0:9094a94896f6 | 51 | |
richnash | 2:1335510cfb92 | 52 | // ===================================== |
richnash | 2:1335510cfb92 | 53 | |
richnash | 0:9094a94896f6 | 54 | EthernetInterface gEth; |
richnash | 0:9094a94896f6 | 55 | UDPSocket _socket; |
richnash | 0:9094a94896f6 | 56 | UDPSocket _socketSender; |
richnash | 0:9094a94896f6 | 57 | char in_buffer[UDP_BUFFER_SIZE]; |
richnash | 0:9094a94896f6 | 58 | |
richnash | 2:1335510cfb92 | 59 | // ===================================== |
richnash | 0:9094a94896f6 | 60 | |
richnash | 0:9094a94896f6 | 61 | #define PIN_RESET_TFT PC_13 /* place holder */ |
richnash | 0:9094a94896f6 | 62 | |
richnash | 0:9094a94896f6 | 63 | #define PIN_MOSI D11 |
richnash | 0:9094a94896f6 | 64 | #define PIN_MISO D12 |
richnash | 0:9094a94896f6 | 65 | #define PIN_SCLK D13 |
richnash | 0:9094a94896f6 | 66 | #define PIN_CS_TFT D5 |
richnash | 0:9094a94896f6 | 67 | #define PIN_DC_TFT D6 |
richnash | 0:9094a94896f6 | 68 | #define PIN_BL_TFT D7 |
richnash | 0:9094a94896f6 | 69 | #define PIN_CS_SD D4 |
richnash | 0:9094a94896f6 | 70 | |
richnash | 0:9094a94896f6 | 71 | #define PIN_XP A2 |
richnash | 0:9094a94896f6 | 72 | #define PIN_XM A0 |
richnash | 0:9094a94896f6 | 73 | #define PIN_YP A3 |
richnash | 0:9094a94896f6 | 74 | #define PIN_YM A1 |
richnash | 0:9094a94896f6 | 75 | |
richnash | 0:9094a94896f6 | 76 | struct point { |
richnash | 0:9094a94896f6 | 77 | int x; |
richnash | 0:9094a94896f6 | 78 | int y; |
richnash | 0:9094a94896f6 | 79 | }; |
richnash | 0:9094a94896f6 | 80 | |
richnash | 0:9094a94896f6 | 81 | void calibrate(void); |
richnash | 0:9094a94896f6 | 82 | bool getPixel(point& p); |
richnash | 0:9094a94896f6 | 83 | point toPixel(point p); |
richnash | 0:9094a94896f6 | 84 | |
richnash | 0:9094a94896f6 | 85 | typedef enum { YES, MAYBE, NO } TOUCH; |
richnash | 0:9094a94896f6 | 86 | |
richnash | 0:9094a94896f6 | 87 | TOUCH getTouch(point& p); |
richnash | 0:9094a94896f6 | 88 | |
richnash | 0:9094a94896f6 | 89 | int readTouch(PinName p, PinName m, PinName a, PinName i); |
richnash | 0:9094a94896f6 | 90 | |
richnash | 0:9094a94896f6 | 91 | int x_off = 22071; |
richnash | 0:9094a94896f6 | 92 | int y_off = 18707; |
richnash | 0:9094a94896f6 | 93 | int pp_tx = 373; |
richnash | 0:9094a94896f6 | 94 | int pp_ty = 297; |
richnash | 0:9094a94896f6 | 95 | |
richnash | 0:9094a94896f6 | 96 | DigitalOut backlight(PIN_BL_TFT) ; |
richnash | 0:9094a94896f6 | 97 | |
richnash | 0:9094a94896f6 | 98 | ILI9341 TFT(SPI_8, 10000000, PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Seeed2.8") ; |
richnash | 0:9094a94896f6 | 99 | |
richnash | 2:1335510cfb92 | 100 | // screen pages |
richnash | 2:1335510cfb92 | 101 | int page = 2 ; |
richnash | 0:9094a94896f6 | 102 | int numPage = 3 ; |
richnash | 0:9094a94896f6 | 103 | |
richnash | 0:9094a94896f6 | 104 | |
richnash | 0:9094a94896f6 | 105 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 106 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 107 | // ++++++++ TFT SCREEN FUNCTIONS |
richnash | 0:9094a94896f6 | 108 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 109 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 110 | |
richnash | 0:9094a94896f6 | 111 | int readTouch(PinName p, PinName m, PinName a, PinName i) |
richnash | 0:9094a94896f6 | 112 | { |
richnash | 0:9094a94896f6 | 113 | DigitalOut _p(p); |
richnash | 0:9094a94896f6 | 114 | _p = 1; |
richnash | 0:9094a94896f6 | 115 | DigitalOut _m(m); |
richnash | 0:9094a94896f6 | 116 | _m = 0; |
richnash | 0:9094a94896f6 | 117 | AnalogIn _a(a); |
richnash | 0:9094a94896f6 | 118 | AnalogIn _i(i); // this pin has to be high Z (DigitalIn may also work) |
richnash | 0:9094a94896f6 | 119 | wait_us(10); |
richnash | 0:9094a94896f6 | 120 | return _a.read_u16(); |
richnash | 0:9094a94896f6 | 121 | } |
richnash | 0:9094a94896f6 | 122 | |
richnash | 0:9094a94896f6 | 123 | TOUCH getTouch(point& p) |
richnash | 0:9094a94896f6 | 124 | { |
richnash | 0:9094a94896f6 | 125 | int y2 = readTouch(PIN_XP,PIN_XM,PIN_YP,PIN_YM); |
richnash | 0:9094a94896f6 | 126 | int x2 = readTouch(PIN_YP,PIN_YM,PIN_XP,PIN_XM); |
richnash | 0:9094a94896f6 | 127 | int y1 = readTouch(PIN_XP,PIN_XM,PIN_YP,PIN_YM); |
richnash | 0:9094a94896f6 | 128 | int x1 = readTouch(PIN_YP,PIN_YM,PIN_XP,PIN_XM); |
richnash | 0:9094a94896f6 | 129 | int xd = x1 - x2; |
richnash | 0:9094a94896f6 | 130 | int yd = y1 - y2; |
richnash | 0:9094a94896f6 | 131 | xd = (xd > 0) ? xd : -xd; |
richnash | 0:9094a94896f6 | 132 | yd = (yd > 0) ? xd : -xd; |
richnash | 0:9094a94896f6 | 133 | p.x = x1 + x2; |
richnash | 0:9094a94896f6 | 134 | p.y = y1 + y2; |
richnash | 0:9094a94896f6 | 135 | |
richnash | 0:9094a94896f6 | 136 | const int th = 8000; |
richnash | 0:9094a94896f6 | 137 | const int df = 100; |
richnash | 0:9094a94896f6 | 138 | TOUCH touch; |
richnash | 0:9094a94896f6 | 139 | if (x1 < th || x2 < th || |
richnash | 0:9094a94896f6 | 140 | y1 < th || y2 < th) { |
richnash | 0:9094a94896f6 | 141 | p.x = 0; |
richnash | 0:9094a94896f6 | 142 | p.y = 0; |
richnash | 0:9094a94896f6 | 143 | touch = NO; |
richnash | 0:9094a94896f6 | 144 | } else if (xd > df || yd > df) { |
richnash | 0:9094a94896f6 | 145 | touch = MAYBE; |
richnash | 0:9094a94896f6 | 146 | } else { |
richnash | 0:9094a94896f6 | 147 | touch = YES; |
richnash | 0:9094a94896f6 | 148 | } |
richnash | 0:9094a94896f6 | 149 | //TFT.locate(0,50); |
richnash | 0:9094a94896f6 | 150 | //TFT.printf("x: %6i y: %6i",p.x,p.y); |
richnash | 0:9094a94896f6 | 151 | return touch; |
richnash | 0:9094a94896f6 | 152 | } |
richnash | 0:9094a94896f6 | 153 | |
richnash | 0:9094a94896f6 | 154 | void calibrate(void) |
richnash | 0:9094a94896f6 | 155 | { |
richnash | 0:9094a94896f6 | 156 | int i; |
richnash | 0:9094a94896f6 | 157 | int a = 0,b = 0,c = 0, d = 0; |
richnash | 0:9094a94896f6 | 158 | int pos_x = 0, pos_y = 0; |
richnash | 0:9094a94896f6 | 159 | point p; |
richnash | 0:9094a94896f6 | 160 | |
richnash | 0:9094a94896f6 | 161 | backlight = 0 ; |
richnash | 0:9094a94896f6 | 162 | //TFT.BusEnable(true) ; |
richnash | 0:9094a94896f6 | 163 | |
richnash | 0:9094a94896f6 | 164 | TFT.background(Black); |
richnash | 0:9094a94896f6 | 165 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 166 | TFT.foreground(White); |
richnash | 0:9094a94896f6 | 167 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 168 | TFT.cls() ; |
richnash | 0:9094a94896f6 | 169 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 170 | TFT.set_font((unsigned char*) Arial12x12); |
richnash | 0:9094a94896f6 | 171 | TFT.locate(90,0); |
richnash | 0:9094a94896f6 | 172 | TFT.printf("Graphics"); |
richnash | 0:9094a94896f6 | 173 | |
richnash | 0:9094a94896f6 | 174 | TFT.line(0,3,6,3,White); |
richnash | 0:9094a94896f6 | 175 | TFT.line(3,0,3,6,White); |
richnash | 0:9094a94896f6 | 176 | |
richnash | 0:9094a94896f6 | 177 | backlight = 1 ; |
richnash | 0:9094a94896f6 | 178 | |
richnash | 0:9094a94896f6 | 179 | //if (font) |
richnash | 0:9094a94896f6 | 180 | //{ |
richnash | 0:9094a94896f6 | 181 | // get the center of the screen |
richnash | 0:9094a94896f6 | 182 | pos_x = TFT.columns() / 2 - 3; |
richnash | 0:9094a94896f6 | 183 | pos_x = pos_x * Arial12x12[1]; |
richnash | 0:9094a94896f6 | 184 | pos_y = (TFT.rows() / 2) - 1; |
richnash | 0:9094a94896f6 | 185 | pos_y = pos_y * Arial12x12[2]; |
richnash | 0:9094a94896f6 | 186 | TFT.locate(pos_x,pos_y); |
richnash | 0:9094a94896f6 | 187 | TFT.printf("press cross "); |
richnash | 0:9094a94896f6 | 188 | TFT.locate(pos_x,pos_y + Arial12x12[2]); |
richnash | 0:9094a94896f6 | 189 | TFT.printf("to calibrate "); |
richnash | 0:9094a94896f6 | 190 | //} |
richnash | 0:9094a94896f6 | 191 | |
richnash | 0:9094a94896f6 | 192 | for (i=0; i<5; i++) { |
richnash | 0:9094a94896f6 | 193 | while (getTouch(p) != YES) |
richnash | 0:9094a94896f6 | 194 | /*nothing*/; |
richnash | 0:9094a94896f6 | 195 | a += p.x; |
richnash | 0:9094a94896f6 | 196 | b += p.y; |
richnash | 0:9094a94896f6 | 197 | } |
richnash | 0:9094a94896f6 | 198 | a = a / 5; |
richnash | 0:9094a94896f6 | 199 | b = b / 5; |
richnash | 0:9094a94896f6 | 200 | //if (font) |
richnash | 0:9094a94896f6 | 201 | //{ |
richnash | 0:9094a94896f6 | 202 | TFT.locate(pos_x,pos_y); |
richnash | 0:9094a94896f6 | 203 | TFT.printf("ok "); |
richnash | 0:9094a94896f6 | 204 | TFT.locate(pos_x,pos_y + Arial12x12[2]); |
richnash | 0:9094a94896f6 | 205 | TFT.printf("release touch "); |
richnash | 0:9094a94896f6 | 206 | //} |
richnash | 0:9094a94896f6 | 207 | while (getTouch(p) != NO) |
richnash | 0:9094a94896f6 | 208 | /*nothing*/; |
richnash | 0:9094a94896f6 | 209 | |
richnash | 0:9094a94896f6 | 210 | TFT.cls(); |
richnash | 0:9094a94896f6 | 211 | TFT.line(TFT.width() -5, TFT.height() - 8,TFT.width() - 5,TFT.height() -1,White); // paint cross |
richnash | 0:9094a94896f6 | 212 | TFT.line(TFT.width() - 8,TFT.height() - 5,TFT.width() - 1,TFT.height() - 5,White); |
richnash | 0:9094a94896f6 | 213 | //if (font) |
richnash | 0:9094a94896f6 | 214 | //{ |
richnash | 0:9094a94896f6 | 215 | TFT.locate(pos_x,pos_y); |
richnash | 0:9094a94896f6 | 216 | TFT.printf("press cross "); |
richnash | 0:9094a94896f6 | 217 | TFT.locate(pos_x,pos_y + Arial12x12[2]); |
richnash | 0:9094a94896f6 | 218 | TFT.printf("to calibrate "); |
richnash | 0:9094a94896f6 | 219 | //} |
richnash | 0:9094a94896f6 | 220 | for (i=0; i<5; i++) { |
richnash | 0:9094a94896f6 | 221 | while (getTouch(p) != YES) |
richnash | 0:9094a94896f6 | 222 | /*nothing*/; |
richnash | 0:9094a94896f6 | 223 | c+= p.x; |
richnash | 0:9094a94896f6 | 224 | d+= p.y; |
richnash | 0:9094a94896f6 | 225 | } |
richnash | 0:9094a94896f6 | 226 | c = c / 5; |
richnash | 0:9094a94896f6 | 227 | d = d / 5; |
richnash | 0:9094a94896f6 | 228 | x_off = a; |
richnash | 0:9094a94896f6 | 229 | y_off = b; |
richnash | 0:9094a94896f6 | 230 | i = c-a; // delta x |
richnash | 0:9094a94896f6 | 231 | pp_tx = i / (TFT.width() - 6); |
richnash | 0:9094a94896f6 | 232 | i = d-b; // delta y |
richnash | 0:9094a94896f6 | 233 | pp_ty = i / (TFT.height() - 6); |
richnash | 0:9094a94896f6 | 234 | //if (font) |
richnash | 0:9094a94896f6 | 235 | //{ |
richnash | 0:9094a94896f6 | 236 | TFT.locate(pos_x,pos_y); |
richnash | 0:9094a94896f6 | 237 | TFT.printf("Calibrated "); |
richnash | 0:9094a94896f6 | 238 | TFT.locate(pos_x,pos_y + Arial12x12[2]); |
richnash | 0:9094a94896f6 | 239 | TFT.printf("x %6i %4i", x_off, pp_tx); |
richnash | 0:9094a94896f6 | 240 | TFT.locate(pos_x,pos_y + 2*Arial12x12[2]); |
richnash | 0:9094a94896f6 | 241 | TFT.printf("y %6i %4i", y_off, pp_ty); |
richnash | 0:9094a94896f6 | 242 | //} |
richnash | 0:9094a94896f6 | 243 | while (getTouch(p) != NO) |
richnash | 0:9094a94896f6 | 244 | /*nothing*/; |
richnash | 0:9094a94896f6 | 245 | TFT.cls(); |
richnash | 0:9094a94896f6 | 246 | |
richnash | 0:9094a94896f6 | 247 | //TFT.BusEnable(false) ; |
richnash | 0:9094a94896f6 | 248 | |
richnash | 0:9094a94896f6 | 249 | printf("x_off:%6i pp_tx:%4i \n\r", x_off, pp_tx); |
richnash | 0:9094a94896f6 | 250 | printf("y_off:%6i pp_ty:%4i \n\r", y_off, pp_ty); |
richnash | 0:9094a94896f6 | 251 | } |
richnash | 0:9094a94896f6 | 252 | |
richnash | 0:9094a94896f6 | 253 | point toPixel(point p) |
richnash | 0:9094a94896f6 | 254 | { |
richnash | 0:9094a94896f6 | 255 | p.x -= x_off; |
richnash | 0:9094a94896f6 | 256 | p.x /= pp_tx; |
richnash | 0:9094a94896f6 | 257 | int w = TFT.width(); |
richnash | 0:9094a94896f6 | 258 | if (p.x > w) p.x = w; |
richnash | 0:9094a94896f6 | 259 | if (p.x < 0) p.x = 0; |
richnash | 0:9094a94896f6 | 260 | p.y -= y_off; |
richnash | 0:9094a94896f6 | 261 | p.y /= pp_ty; |
richnash | 0:9094a94896f6 | 262 | int h = TFT.height(); |
richnash | 0:9094a94896f6 | 263 | if (p.y > h) p.y = h; |
richnash | 0:9094a94896f6 | 264 | if (p.y < 0) p.y = 0; |
richnash | 0:9094a94896f6 | 265 | return (p); |
richnash | 0:9094a94896f6 | 266 | } |
richnash | 0:9094a94896f6 | 267 | |
richnash | 0:9094a94896f6 | 268 | bool getPixel(point& p) |
richnash | 0:9094a94896f6 | 269 | { |
richnash | 0:9094a94896f6 | 270 | TOUCH touch = getTouch(p); |
richnash | 0:9094a94896f6 | 271 | p = toPixel(p); |
richnash | 0:9094a94896f6 | 272 | return touch == YES; |
richnash | 0:9094a94896f6 | 273 | } |
richnash | 0:9094a94896f6 | 274 | |
richnash | 0:9094a94896f6 | 275 | |
richnash | 0:9094a94896f6 | 276 | // =================================================== |
richnash | 0:9094a94896f6 | 277 | |
richnash | 0:9094a94896f6 | 278 | void initTFT(void) |
richnash | 0:9094a94896f6 | 279 | { |
richnash | 0:9094a94896f6 | 280 | //Configure the display driver |
richnash | 0:9094a94896f6 | 281 | //TFT.BusEnable(true) ; |
richnash | 0:9094a94896f6 | 282 | TFT.FastWindow(true) ; |
richnash | 0:9094a94896f6 | 283 | TFT.background(Black); |
richnash | 0:9094a94896f6 | 284 | TFT.foreground(White); |
richnash | 0:9094a94896f6 | 285 | wait(0.01) ; |
richnash | 0:9094a94896f6 | 286 | TFT.cls(); |
richnash | 0:9094a94896f6 | 287 | //TFT.BusEnable(false) ; |
richnash | 0:9094a94896f6 | 288 | } |
richnash | 0:9094a94896f6 | 289 | |
richnash | 0:9094a94896f6 | 290 | void screen1(void) // Welcome Screen |
richnash | 0:9094a94896f6 | 291 | { |
richnash | 0:9094a94896f6 | 292 | //TFT.BusEnable(true) ; |
richnash | 0:9094a94896f6 | 293 | backlight = 0 ; |
richnash | 0:9094a94896f6 | 294 | TFT.background(White) ; |
richnash | 0:9094a94896f6 | 295 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 296 | TFT.cls() ; |
richnash | 0:9094a94896f6 | 297 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 298 | |
richnash | 0:9094a94896f6 | 299 | TFT.set_font((unsigned char*) Arial24x23); |
richnash | 0:9094a94896f6 | 300 | TFT.foreground(Red) ; |
richnash | 0:9094a94896f6 | 301 | TFT.locate(80, 40) ; |
richnash | 0:9094a94896f6 | 302 | TFT.printf("MBED") ; |
richnash | 0:9094a94896f6 | 303 | TFT.foreground(Blue); |
richnash | 0:9094a94896f6 | 304 | TFT.locate(60, 80) ; |
richnash | 0:9094a94896f6 | 305 | TFT.printf("2.8\"TFT") ; |
richnash | 0:9094a94896f6 | 306 | TFT.locate(40, 120) ; |
richnash | 0:9094a94896f6 | 307 | TFT.printf("with touch") ; |
richnash | 0:9094a94896f6 | 308 | TFT.foreground(Black); |
richnash | 0:9094a94896f6 | 309 | TFT.set_font((unsigned char*) Arial12x12); |
richnash | 0:9094a94896f6 | 310 | TFT.foreground(Blue) ; |
richnash | 0:9094a94896f6 | 311 | TFT.locate(30, 180) ; |
richnash | 0:9094a94896f6 | 312 | TFT.printf("This program is running on") ; |
richnash | 0:9094a94896f6 | 313 | TFT.locate(30, 200) ; |
richnash | 0:9094a94896f6 | 314 | TFT.printf("ST Nucleo F411RE with") ; |
richnash | 0:9094a94896f6 | 315 | TFT.locate(30, 220) ; |
richnash | 0:9094a94896f6 | 316 | TFT.printf("a program developed in mbed") ; |
richnash | 0:9094a94896f6 | 317 | TFT.foreground(Green) ; |
richnash | 0:9094a94896f6 | 318 | TFT.locate(30, 260) ; |
richnash | 0:9094a94896f6 | 319 | TFT.printf("To advance demo page, touch") ; |
richnash | 0:9094a94896f6 | 320 | TFT.locate(30, 280) ; |
richnash | 0:9094a94896f6 | 321 | TFT.printf("and hold right side of screen") ; |
richnash | 0:9094a94896f6 | 322 | TFT.locate(30, 300) ; |
richnash | 0:9094a94896f6 | 323 | TFT.printf("until the next screen starts") ; |
richnash | 0:9094a94896f6 | 324 | //TFT.BusEnable(false) ; |
richnash | 0:9094a94896f6 | 325 | backlight = 1 ; |
richnash | 0:9094a94896f6 | 326 | } |
richnash | 0:9094a94896f6 | 327 | |
richnash | 0:9094a94896f6 | 328 | void screen2(void) // Graphics |
richnash | 0:9094a94896f6 | 329 | { |
richnash | 0:9094a94896f6 | 330 | //Draw some graphics |
richnash | 0:9094a94896f6 | 331 | int i, x[2], y[2] ; |
richnash | 0:9094a94896f6 | 332 | backlight = 0 ; |
richnash | 0:9094a94896f6 | 333 | //TFT.BusEnable(true) ; |
richnash | 0:9094a94896f6 | 334 | TFT.background(Black); |
richnash | 0:9094a94896f6 | 335 | TFT.foreground(White); |
richnash | 0:9094a94896f6 | 336 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 337 | TFT.cls() ; |
richnash | 0:9094a94896f6 | 338 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 339 | TFT.set_font((unsigned char*) Arial12x12); |
richnash | 0:9094a94896f6 | 340 | TFT.locate(90,0); |
richnash | 0:9094a94896f6 | 341 | TFT.printf("Graphics"); |
richnash | 0:9094a94896f6 | 342 | |
richnash | 0:9094a94896f6 | 343 | x[0] = 25 ; x[1] = 224 ; |
richnash | 0:9094a94896f6 | 344 | y[0] = 20 ; y[1] = 219 ; |
richnash | 0:9094a94896f6 | 345 | for (i = 20 ; i < 220 ; i += 10) { |
richnash | 0:9094a94896f6 | 346 | TFT.line(i+5, y[0], i+5, y[1], Blue) ; |
richnash | 0:9094a94896f6 | 347 | TFT.line(x[0], i, x[1], i, Blue) ; |
richnash | 0:9094a94896f6 | 348 | } |
richnash | 0:9094a94896f6 | 349 | TFT.line(125, y[0], 125, y[1], Green) ; |
richnash | 0:9094a94896f6 | 350 | TFT.line(x[0], 120, x[1], 120, Green) ; |
richnash | 0:9094a94896f6 | 351 | TFT.rect(x[0],y[0], x[1], y[1], Green) ; |
richnash | 0:9094a94896f6 | 352 | TFT.locate(10, 20) ; |
richnash | 0:9094a94896f6 | 353 | TFT.printf("V") ; |
richnash | 0:9094a94896f6 | 354 | TFT.locate(0, 115) ; |
richnash | 0:9094a94896f6 | 355 | TFT.printf("0.0") ; |
richnash | 0:9094a94896f6 | 356 | TFT.locate(115, 225) ; |
richnash | 0:9094a94896f6 | 357 | TFT.printf("0.0") ; |
richnash | 0:9094a94896f6 | 358 | TFT.locate(215, 225) ; |
richnash | 0:9094a94896f6 | 359 | TFT.printf("T") ; |
richnash | 0:9094a94896f6 | 360 | |
richnash | 0:9094a94896f6 | 361 | double s; |
richnash | 0:9094a94896f6 | 362 | for (int i = x[0]; i < 225; i++) { |
richnash | 0:9094a94896f6 | 363 | s = 40 * sin((long double)i / 20); |
richnash | 0:9094a94896f6 | 364 | TFT.pixel(i, 120 + (int)s, White); |
richnash | 0:9094a94896f6 | 365 | } |
richnash | 0:9094a94896f6 | 366 | |
richnash | 0:9094a94896f6 | 367 | TFT.fillrect(10, 240, 229, 309, White) ; |
richnash | 0:9094a94896f6 | 368 | TFT.rect(10, 240, 229, 309, Red) ; |
richnash | 0:9094a94896f6 | 369 | TFT.rect(11, 241, 228, 308, Red) ; |
richnash | 0:9094a94896f6 | 370 | |
richnash | 0:9094a94896f6 | 371 | TFT.background(White) ; |
richnash | 0:9094a94896f6 | 372 | TFT.foreground(Black) ; |
richnash | 0:9094a94896f6 | 373 | TFT.locate(20, 250) ; |
richnash | 0:9094a94896f6 | 374 | TFT.printf("With QVGA resolution") ; |
richnash | 0:9094a94896f6 | 375 | TFT.locate(20, 270) ; |
richnash | 0:9094a94896f6 | 376 | TFT.printf("simple graphics drawing") ; |
richnash | 0:9094a94896f6 | 377 | TFT.locate(20, 290) ; |
richnash | 0:9094a94896f6 | 378 | TFT.printf("capability is provided") ; |
richnash | 0:9094a94896f6 | 379 | //TFT.BusEnable(false) ; |
richnash | 0:9094a94896f6 | 380 | backlight = 1 ; |
richnash | 0:9094a94896f6 | 381 | } |
richnash | 0:9094a94896f6 | 382 | |
richnash | 0:9094a94896f6 | 383 | void screen3(void) // Graphics |
richnash | 0:9094a94896f6 | 384 | { |
richnash | 0:9094a94896f6 | 385 | //int rowX; |
richnash | 2:1335510cfb92 | 386 | //int rowY; |
richnash | 0:9094a94896f6 | 387 | //int x = Terminal6x8[1]; |
richnash | 2:1335510cfb92 | 388 | int y = Terminal6x8[2] + 2; |
richnash | 2:1335510cfb92 | 389 | |
richnash | 2:1335510cfb92 | 390 | TFT.set_font((unsigned char*) Terminal6x8); |
richnash | 0:9094a94896f6 | 391 | |
richnash | 0:9094a94896f6 | 392 | //Draw some text |
richnash | 0:9094a94896f6 | 393 | backlight = 0 ; |
richnash | 0:9094a94896f6 | 394 | |
richnash | 0:9094a94896f6 | 395 | TFT.background(Black); |
richnash | 0:9094a94896f6 | 396 | TFT.foreground(White); |
richnash | 0:9094a94896f6 | 397 | wait(0.1) ; |
richnash | 0:9094a94896f6 | 398 | TFT.cls() ; |
richnash | 0:9094a94896f6 | 399 | wait(0.1) ; |
richnash | 2:1335510cfb92 | 400 | TFT.cls() ; |
richnash | 2:1335510cfb92 | 401 | |
richnash | 0:9094a94896f6 | 402 | backlight = 1 ; |
richnash | 0:9094a94896f6 | 403 | |
richnash | 2:1335510cfb92 | 404 | #ifndef CONNECTED_OFF |
richnash | 2:1335510cfb92 | 405 | { |
richnash | 2:1335510cfb92 | 406 | // Output the network information |
richnash | 2:1335510cfb92 | 407 | const char *ip = gEth.get_ip_address(); |
richnash | 2:1335510cfb92 | 408 | const char *netmask = gEth.get_netmask(); |
richnash | 2:1335510cfb92 | 409 | const char *gateway = gEth.get_gateway(); |
richnash | 2:1335510cfb92 | 410 | TFT.locate(0, 1*y); |
richnash | 2:1335510cfb92 | 411 | TFT.printf("IP address: %s\r\n", ip ? ip : "None"); |
richnash | 2:1335510cfb92 | 412 | TFT.locate(0, 2*y); |
richnash | 2:1335510cfb92 | 413 | TFT.printf("Netmask: %s\r\n", netmask ? netmask : "None"); |
richnash | 2:1335510cfb92 | 414 | TFT.locate(0, 3*y); |
richnash | 2:1335510cfb92 | 415 | TFT.printf("Gateway: %s\r\n", gateway ? gateway : "None"); |
richnash | 2:1335510cfb92 | 416 | } |
richnash | 2:1335510cfb92 | 417 | #endif |
richnash | 2:1335510cfb92 | 418 | |
richnash | 2:1335510cfb92 | 419 | //TFT.set_font((unsigned char*) Terminal6x8); |
richnash | 0:9094a94896f6 | 420 | |
richnash | 2:1335510cfb92 | 421 | /* for( rowY=0; rowY<100; ++rowY ) |
richnash | 0:9094a94896f6 | 422 | { |
richnash | 2:1335510cfb92 | 423 | //TFT.locate(0, (rowY%25)*y); |
richnash | 2:1335510cfb92 | 424 | TFT.locate(0, 1*y); |
richnash | 0:9094a94896f6 | 425 | TFT.printf("%3d TFT width = %d, height = %d", rowY, TFT.width(), TFT.height()) ; |
richnash | 2:1335510cfb92 | 426 | TFT.locate(0, 2*y); |
richnash | 2:1335510cfb92 | 427 | TFT.printf("%3d FIRST TEST DATA %3d", rowY, rowY ) ; |
richnash | 2:1335510cfb92 | 428 | TFT.locate(0, 3*y); |
richnash | 2:1335510cfb92 | 429 | TFT.printf("%3d MORE TEST DATA %3d", rowY, rowY ) ; |
richnash | 0:9094a94896f6 | 430 | } |
richnash | 2:1335510cfb92 | 431 | */ |
richnash | 2:1335510cfb92 | 432 | } |
richnash | 2:1335510cfb92 | 433 | |
richnash | 2:1335510cfb92 | 434 | void TFT_Debug(char * pszTxt) // Graphics |
richnash | 2:1335510cfb92 | 435 | { |
richnash | 2:1335510cfb92 | 436 | if (page == 2) { |
richnash | 2:1335510cfb92 | 437 | int x = Terminal6x8[1]; |
richnash | 2:1335510cfb92 | 438 | int y = Terminal6x8[2] + 2; |
richnash | 2:1335510cfb92 | 439 | |
richnash | 2:1335510cfb92 | 440 | // TFT.background(Black); |
richnash | 2:1335510cfb92 | 441 | // TFT.foreground(White); |
richnash | 2:1335510cfb92 | 442 | // TFT.set_font((unsigned char*) Terminal6x8); |
richnash | 2:1335510cfb92 | 443 | |
richnash | 2:1335510cfb92 | 444 | // backlight = 0 ; |
richnash | 2:1335510cfb92 | 445 | TFT.locate(0, 10*y); |
richnash | 2:1335510cfb92 | 446 | TFT.printf("%s", pszTxt ); |
richnash | 2:1335510cfb92 | 447 | // backlight = 1 ; |
richnash | 2:1335510cfb92 | 448 | } |
richnash | 0:9094a94896f6 | 449 | } |
richnash | 0:9094a94896f6 | 450 | |
richnash | 0:9094a94896f6 | 451 | void incPage(void) |
richnash | 0:9094a94896f6 | 452 | { |
richnash | 0:9094a94896f6 | 453 | page++ ; |
richnash | 0:9094a94896f6 | 454 | if (page >= numPage) { |
richnash | 0:9094a94896f6 | 455 | page = 0 ; |
richnash | 0:9094a94896f6 | 456 | } |
richnash | 0:9094a94896f6 | 457 | } |
richnash | 0:9094a94896f6 | 458 | |
richnash | 0:9094a94896f6 | 459 | void decPage(void) |
richnash | 0:9094a94896f6 | 460 | { |
richnash | 0:9094a94896f6 | 461 | page-- ; |
richnash | 0:9094a94896f6 | 462 | if (page < 0) { |
richnash | 0:9094a94896f6 | 463 | page = numPage - 1 ; |
richnash | 0:9094a94896f6 | 464 | } |
richnash | 0:9094a94896f6 | 465 | } |
richnash | 0:9094a94896f6 | 466 | |
richnash | 0:9094a94896f6 | 467 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 468 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 469 | // ++++++++ ETHERNET |
richnash | 0:9094a94896f6 | 470 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 471 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
richnash | 0:9094a94896f6 | 472 | |
richnash | 0:9094a94896f6 | 473 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 474 | // |
richnash | 0:9094a94896f6 | 475 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 476 | void terminal_error_state( void ) |
richnash | 0:9094a94896f6 | 477 | { |
richnash | 0:9094a94896f6 | 478 | led1=0; |
richnash | 0:9094a94896f6 | 479 | led2=0; |
richnash | 0:9094a94896f6 | 480 | led3=0; |
richnash | 0:9094a94896f6 | 481 | logger.printf("\r\n\r\nJUST TO BE CLEAR - THIS IS BAD BAD NEWS !!! \r\n"); |
richnash | 0:9094a94896f6 | 482 | logger.printf("\r\n\r\n---- WAITING FOR THE WATCHDOG TO RESET US ---- \r\n"); |
richnash | 0:9094a94896f6 | 483 | while( 1 ) |
richnash | 0:9094a94896f6 | 484 | { |
richnash | 0:9094a94896f6 | 485 | led1 = !led1; |
richnash | 0:9094a94896f6 | 486 | led2 = !led2; |
richnash | 0:9094a94896f6 | 487 | led3 = !led3; |
richnash | 0:9094a94896f6 | 488 | wait(0.3); |
richnash | 0:9094a94896f6 | 489 | } |
richnash | 0:9094a94896f6 | 490 | } |
richnash | 0:9094a94896f6 | 491 | |
richnash | 0:9094a94896f6 | 492 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 493 | // |
richnash | 0:9094a94896f6 | 494 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 495 | static bool DeviceConnect() |
richnash | 0:9094a94896f6 | 496 | { |
richnash | 0:9094a94896f6 | 497 | int retries = 10; |
richnash | 0:9094a94896f6 | 498 | int rc = 0; |
richnash | 0:9094a94896f6 | 499 | |
richnash | 0:9094a94896f6 | 500 | while (retries--) |
richnash | 0:9094a94896f6 | 501 | { |
richnash | 0:9094a94896f6 | 502 | rc = gEth.connect(); |
richnash | 0:9094a94896f6 | 503 | if (rc == 0) { |
richnash | 0:9094a94896f6 | 504 | // done |
richnash | 0:9094a94896f6 | 505 | return true; |
richnash | 0:9094a94896f6 | 506 | } |
richnash | 0:9094a94896f6 | 507 | else |
richnash | 0:9094a94896f6 | 508 | { |
richnash | 0:9094a94896f6 | 509 | logger.printf("Connecting... ERR %d\r\n", rc); |
richnash | 0:9094a94896f6 | 510 | } |
richnash | 0:9094a94896f6 | 511 | } |
richnash | 0:9094a94896f6 | 512 | |
richnash | 0:9094a94896f6 | 513 | logger.printf("Connecting... FAILED\r\n"); |
richnash | 0:9094a94896f6 | 514 | return false; |
richnash | 0:9094a94896f6 | 515 | } |
richnash | 0:9094a94896f6 | 516 | |
richnash | 0:9094a94896f6 | 517 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 518 | // |
richnash | 0:9094a94896f6 | 519 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 520 | #ifndef CONNECTED_OFF |
richnash | 0:9094a94896f6 | 521 | static bool DeviceEthStartup() |
richnash | 0:9094a94896f6 | 522 | { |
richnash | 0:9094a94896f6 | 523 | int rc = 0; |
richnash | 0:9094a94896f6 | 524 | |
richnash | 0:9094a94896f6 | 525 | // get ethernet up ! |
richnash | 0:9094a94896f6 | 526 | if( !DeviceConnect() ) terminal_error_state(); |
richnash | 0:9094a94896f6 | 527 | |
richnash | 0:9094a94896f6 | 528 | // Output the network address |
richnash | 0:9094a94896f6 | 529 | const char *ip = gEth.get_ip_address(); |
richnash | 0:9094a94896f6 | 530 | const char *netmask = gEth.get_netmask(); |
richnash | 0:9094a94896f6 | 531 | const char *gateway = gEth.get_gateway(); |
richnash | 0:9094a94896f6 | 532 | logger.printf("IP address: %s\r\n", ip ? ip : "None"); |
richnash | 0:9094a94896f6 | 533 | logger.printf("Netmask: %s\r\n", netmask ? netmask : "None"); |
richnash | 0:9094a94896f6 | 534 | logger.printf("Gateway: %s\r\n", gateway ? gateway : "None"); |
richnash | 0:9094a94896f6 | 535 | |
richnash | 2:1335510cfb92 | 536 | // Output the network information to the TFT |
richnash | 2:1335510cfb92 | 537 | if (page == 2) |
richnash | 2:1335510cfb92 | 538 | { |
richnash | 2:1335510cfb92 | 539 | int y = Terminal6x8[2] + 2; |
richnash | 2:1335510cfb92 | 540 | TFT.set_font((unsigned char*) Terminal6x8); |
richnash | 2:1335510cfb92 | 541 | TFT.locate(0, 1*y); |
richnash | 2:1335510cfb92 | 542 | TFT.printf("IP address: %s\r\n", ip ? ip : "None"); |
richnash | 2:1335510cfb92 | 543 | TFT.locate(0, 2*y); |
richnash | 2:1335510cfb92 | 544 | TFT.printf("Netmask: %s\r\n", netmask ? netmask : "None"); |
richnash | 2:1335510cfb92 | 545 | TFT.locate(0, 3*y); |
richnash | 2:1335510cfb92 | 546 | TFT.printf("Gateway: %s\r\n", gateway ? gateway : "None"); |
richnash | 2:1335510cfb92 | 547 | } |
richnash | 2:1335510cfb92 | 548 | |
richnash | 0:9094a94896f6 | 549 | // setup a UDP listener |
richnash | 0:9094a94896f6 | 550 | _socket.set_blocking(true); |
richnash | 0:9094a94896f6 | 551 | _socket.set_timeout(3000); |
richnash | 0:9094a94896f6 | 552 | //_socket.set_broadcasting(true); |
richnash | 0:9094a94896f6 | 553 | |
richnash | 0:9094a94896f6 | 554 | // open the socket |
richnash | 0:9094a94896f6 | 555 | rc = _socket.open((NetworkInterface*)&gEth); |
richnash | 0:9094a94896f6 | 556 | if( rc != 0) |
richnash | 0:9094a94896f6 | 557 | { |
richnash | 0:9094a94896f6 | 558 | logger.printf("UDPSocket RECEIVER OPEN ERROR (rc=%d)\r\n", rc); |
richnash | 0:9094a94896f6 | 559 | terminal_error_state(); |
richnash | 0:9094a94896f6 | 560 | } |
richnash | 0:9094a94896f6 | 561 | |
richnash | 0:9094a94896f6 | 562 | // bind the XPL port |
richnash | 0:9094a94896f6 | 563 | rc = _socket.bind(UDP_PORT); |
richnash | 0:9094a94896f6 | 564 | logger.printf("Binding port %d\r\n", UDP_PORT); |
richnash | 0:9094a94896f6 | 565 | if( rc != 0) |
richnash | 0:9094a94896f6 | 566 | { |
richnash | 0:9094a94896f6 | 567 | logger.printf("UDPSocket BIND ERROR (rc=%d)\r\n", rc); |
richnash | 0:9094a94896f6 | 568 | terminal_error_state(); |
richnash | 0:9094a94896f6 | 569 | } |
richnash | 0:9094a94896f6 | 570 | |
richnash | 0:9094a94896f6 | 571 | // open the sender socket |
richnash | 0:9094a94896f6 | 572 | rc = _socketSender.open((NetworkInterface*)&gEth); |
richnash | 0:9094a94896f6 | 573 | if( rc != 0) |
richnash | 0:9094a94896f6 | 574 | { |
richnash | 0:9094a94896f6 | 575 | logger.printf("UDPSocket SENDER OPEN ERROR (rc=%d)\r\n", rc); |
richnash | 0:9094a94896f6 | 576 | terminal_error_state(); |
richnash | 0:9094a94896f6 | 577 | } |
richnash | 0:9094a94896f6 | 578 | //_socketSender.set_broadcasting(true); |
richnash | 0:9094a94896f6 | 579 | |
richnash | 0:9094a94896f6 | 580 | return true; |
richnash | 0:9094a94896f6 | 581 | } |
richnash | 0:9094a94896f6 | 582 | #endif |
richnash | 0:9094a94896f6 | 583 | |
richnash | 0:9094a94896f6 | 584 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 585 | // |
richnash | 0:9094a94896f6 | 586 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 587 | void SendUdPMessage(char *buffer) |
richnash | 0:9094a94896f6 | 588 | { |
richnash | 0:9094a94896f6 | 589 | #ifndef CONNECTED_OFF |
richnash | 0:9094a94896f6 | 590 | // send the UDP data as broadcast |
richnash | 0:9094a94896f6 | 591 | int rc = _socketSender.sendto( "255.255.255.255", UDP_PORT, (const void *)buffer, strlen( buffer ) ); |
richnash | 0:9094a94896f6 | 592 | |
richnash | 0:9094a94896f6 | 593 | #ifdef DEBUG_OUTPUT_XPL |
richnash | 0:9094a94896f6 | 594 | logger.printf("[SEND rc=%d] buffer[%d]\r\n%s\r\n", rc, strlen(buffer), buffer); |
richnash | 0:9094a94896f6 | 595 | #endif |
richnash | 0:9094a94896f6 | 596 | |
richnash | 0:9094a94896f6 | 597 | #else |
richnash | 0:9094a94896f6 | 598 | logger.printf("[OFFLINE] XPLsend [%d]\r\n%s\r\n", strlen(buffer), buffer); |
richnash | 0:9094a94896f6 | 599 | #endif |
richnash | 0:9094a94896f6 | 600 | } |
richnash | 0:9094a94896f6 | 601 | |
richnash | 0:9094a94896f6 | 602 | |
richnash | 0:9094a94896f6 | 603 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 604 | // |
richnash | 0:9094a94896f6 | 605 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 606 | void SendXPLint(char *Device, int iCurrent ) |
richnash | 0:9094a94896f6 | 607 | { |
richnash | 0:9094a94896f6 | 608 | // xPL_Message _message; |
richnash | 0:9094a94896f6 | 609 | // _message.SetTarget( "*" ); |
richnash | 0:9094a94896f6 | 610 | // _message.AddCommand("device", "xxxxx"); |
richnash | 0:9094a94896f6 | 611 | // _message.AddCommand("current", "0"); |
richnash | 0:9094a94896f6 | 612 | // xpl.SendMessage( &_message, true ); |
richnash | 0:9094a94896f6 | 613 | } |
richnash | 0:9094a94896f6 | 614 | |
richnash | 0:9094a94896f6 | 615 | |
richnash | 0:9094a94896f6 | 616 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 617 | // |
richnash | 0:9094a94896f6 | 618 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 619 | void SendXPLString(char *Device, char *szCurrent ) |
richnash | 0:9094a94896f6 | 620 | { |
richnash | 0:9094a94896f6 | 621 | // xPL_Message _message; |
richnash | 0:9094a94896f6 | 622 | // _message.SetTarget( "*" ); |
richnash | 0:9094a94896f6 | 623 | // _message.AddCommand("device", "xxxxx"); |
richnash | 0:9094a94896f6 | 624 | // _message.AddCommand("current", "0"); |
richnash | 0:9094a94896f6 | 625 | // xpl.SendMessage( &_message, true ); |
richnash | 0:9094a94896f6 | 626 | } |
richnash | 0:9094a94896f6 | 627 | |
richnash | 0:9094a94896f6 | 628 | |
richnash | 0:9094a94896f6 | 629 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 630 | // |
richnash | 0:9094a94896f6 | 631 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 632 | void AfterParseAction(xPL_Message * message) |
richnash | 0:9094a94896f6 | 633 | { |
richnash | 2:1335510cfb92 | 634 | char debugTxt[100]; |
richnash | 2:1335510cfb92 | 635 | |
richnash | 0:9094a94896f6 | 636 | // is this a message for me ? |
richnash | 0:9094a94896f6 | 637 | if (xpl.TargetIsMe(message)) |
richnash | 0:9094a94896f6 | 638 | { |
richnash | 0:9094a94896f6 | 639 | logger.printf("XPL: MSG IS FOR ME !"); |
richnash | 0:9094a94896f6 | 640 | |
richnash | 0:9094a94896f6 | 641 | logger.printf("%s\r\n", message->toString()); |
richnash | 0:9094a94896f6 | 642 | |
richnash | 0:9094a94896f6 | 643 | // is this a control message? |
richnash | 0:9094a94896f6 | 644 | if (message->IsSchema("control", "basic")) |
richnash | 0:9094a94896f6 | 645 | { |
richnash | 0:9094a94896f6 | 646 | logger.printf("XPL: {control.basic}"); |
richnash | 0:9094a94896f6 | 647 | } |
richnash | 0:9094a94896f6 | 648 | } |
richnash | 0:9094a94896f6 | 649 | |
richnash | 0:9094a94896f6 | 650 | //logger.printf("XPL: [%s]\r\n", message->source.device_id ); |
richnash | 0:9094a94896f6 | 651 | logger.printf("XPL: [%s] %d items\r\n", message->source.device_id, message->command_count ); |
richnash | 2:1335510cfb92 | 652 | sprintf( debugTxt, "XPL: [%s] %d items\r\n", message->source.device_id, message->command_count ); |
richnash | 2:1335510cfb92 | 653 | TFT_Debug( debugTxt ); |
richnash | 2:1335510cfb92 | 654 | |
richnash | 0:9094a94896f6 | 655 | // do we have any data ??? maybe the parse failed.... |
richnash | 0:9094a94896f6 | 656 | if( message->command_count == 0 ) |
richnash | 0:9094a94896f6 | 657 | { |
richnash | 0:9094a94896f6 | 658 | // |
richnash | 0:9094a94896f6 | 659 | logger.printf("XPL: no data?\r\n%s\r\n", in_buffer ); |
richnash | 0:9094a94896f6 | 660 | } |
richnash | 0:9094a94896f6 | 661 | else |
richnash | 0:9094a94896f6 | 662 | { |
richnash | 0:9094a94896f6 | 663 | // output the message data |
richnash | 0:9094a94896f6 | 664 | for (short i=0; i<message->command_count; i++) |
richnash | 0:9094a94896f6 | 665 | { |
richnash | 0:9094a94896f6 | 666 | // grab each item and do something with it |
richnash | 0:9094a94896f6 | 667 | //logger.printf("%s=%s\r\n", message->command[i].name, message->command[i].value); |
richnash | 0:9094a94896f6 | 668 | } |
richnash | 0:9094a94896f6 | 669 | logger.printf("XPL: %d items processed\r\n", message->command_count ); |
richnash | 0:9094a94896f6 | 670 | } |
richnash | 0:9094a94896f6 | 671 | |
richnash | 0:9094a94896f6 | 672 | // output the full msg! |
richnash | 0:9094a94896f6 | 673 | //logger.printf("%s\r\n", message->toString()); |
richnash | 0:9094a94896f6 | 674 | } |
richnash | 0:9094a94896f6 | 675 | |
richnash | 0:9094a94896f6 | 676 | |
richnash | 0:9094a94896f6 | 677 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 678 | // |
richnash | 0:9094a94896f6 | 679 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 680 | void Receiver_Thread() |
richnash | 0:9094a94896f6 | 681 | { |
richnash | 0:9094a94896f6 | 682 | SocketAddress _sAddr; |
richnash | 0:9094a94896f6 | 683 | int iNoDataCount = 0; |
richnash | 0:9094a94896f6 | 684 | |
richnash | 0:9094a94896f6 | 685 | // loop forever |
richnash | 0:9094a94896f6 | 686 | while(1) |
richnash | 0:9094a94896f6 | 687 | { |
richnash | 0:9094a94896f6 | 688 | // receive from the udp socket |
richnash | 0:9094a94896f6 | 689 | led2 = 0; |
richnash | 0:9094a94896f6 | 690 | |
richnash | 0:9094a94896f6 | 691 | #ifndef CONNECTED_OFF |
richnash | 0:9094a94896f6 | 692 | int n = _socket.recvfrom(&_sAddr, in_buffer, UDP_BUFFER_SIZE); |
richnash | 0:9094a94896f6 | 693 | //led2 = 1; |
richnash | 0:9094a94896f6 | 694 | |
richnash | 0:9094a94896f6 | 695 | // see what weve got ! |
richnash | 0:9094a94896f6 | 696 | if (n == NSAPI_ERROR_WOULD_BLOCK) |
richnash | 0:9094a94896f6 | 697 | { |
richnash | 0:9094a94896f6 | 698 | // timeout with no data... |
richnash | 0:9094a94896f6 | 699 | ++iNoDataCount; |
richnash | 0:9094a94896f6 | 700 | //logger.printf("-- NoData (TIMEOUT)\r\n"); |
richnash | 0:9094a94896f6 | 701 | led2 = 0; |
richnash | 0:9094a94896f6 | 702 | } |
richnash | 0:9094a94896f6 | 703 | else if (n < 0) |
richnash | 0:9094a94896f6 | 704 | { |
richnash | 0:9094a94896f6 | 705 | // some other error |
richnash | 0:9094a94896f6 | 706 | ++iNoDataCount; |
richnash | 0:9094a94896f6 | 707 | //logger.printf("-- NoData (ERR) %i\r\n", n); |
richnash | 0:9094a94896f6 | 708 | led2 = 0; |
richnash | 0:9094a94896f6 | 709 | } |
richnash | 0:9094a94896f6 | 710 | else if( n > 0) |
richnash | 0:9094a94896f6 | 711 | { |
richnash | 0:9094a94896f6 | 712 | // good data :) |
richnash | 0:9094a94896f6 | 713 | iNoDataCount = 0; |
richnash | 0:9094a94896f6 | 714 | in_buffer[n] = '\0'; |
richnash | 0:9094a94896f6 | 715 | // logger.printf("[%d bytes] %s:%d\r\n", n, _sAddr.get_ip_address(), _sAddr.get_port()); |
richnash | 0:9094a94896f6 | 716 | // logger.printf("%s\r\n", in_buffer); |
richnash | 0:9094a94896f6 | 717 | led2 = 1; |
richnash | 0:9094a94896f6 | 718 | |
richnash | 0:9094a94896f6 | 719 | // try and parse the msg |
richnash | 0:9094a94896f6 | 720 | xpl.ParseInputMessage(in_buffer); |
richnash | 0:9094a94896f6 | 721 | } |
richnash | 0:9094a94896f6 | 722 | |
richnash | 0:9094a94896f6 | 723 | // have we stopped receiving data ?!?!? |
richnash | 2:1335510cfb92 | 724 | // roughly 100*100ms = 10s... |
richnash | 2:1335510cfb92 | 725 | if( iNoDataCount > 100 ) |
richnash | 0:9094a94896f6 | 726 | { |
richnash | 0:9094a94896f6 | 727 | logger.printf("ERROR: No UDP data repeatidly...\r\n"); |
richnash | 0:9094a94896f6 | 728 | terminal_error_state(); |
richnash | 0:9094a94896f6 | 729 | } |
richnash | 0:9094a94896f6 | 730 | #endif |
richnash | 0:9094a94896f6 | 731 | |
richnash | 0:9094a94896f6 | 732 | // stroke the WD |
richnash | 0:9094a94896f6 | 733 | wd.Service(); |
richnash | 0:9094a94896f6 | 734 | |
richnash | 2:1335510cfb92 | 735 | // sleep for 100ms |
richnash | 0:9094a94896f6 | 736 | ThisThread::sleep_for(100); |
richnash | 0:9094a94896f6 | 737 | } |
richnash | 0:9094a94896f6 | 738 | } |
richnash | 0:9094a94896f6 | 739 | |
richnash | 0:9094a94896f6 | 740 | |
richnash | 0:9094a94896f6 | 741 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 742 | // |
richnash | 0:9094a94896f6 | 743 | // ----------------------------------------------------------- |
richnash | 0:9094a94896f6 | 744 | Thread thread1; |
richnash | 0:9094a94896f6 | 745 | int main() |
richnash | 0:9094a94896f6 | 746 | { |
richnash | 0:9094a94896f6 | 747 | const char *ip; |
richnash | 0:9094a94896f6 | 748 | char xpl_ip[16]; |
richnash | 0:9094a94896f6 | 749 | int iAppLoop=0; |
richnash | 0:9094a94896f6 | 750 | point p; |
richnash | 0:9094a94896f6 | 751 | int prevPage = 99 ; |
richnash | 0:9094a94896f6 | 752 | bool waitTouch = false ; |
richnash | 0:9094a94896f6 | 753 | |
richnash | 0:9094a94896f6 | 754 | // FIRST THINGS FIRST!!! set the WD timeout interval... |
richnash | 0:9094a94896f6 | 755 | // enough to get up and running! |
richnash | 2:1335510cfb92 | 756 | // 1000seconds to get connected and receive an IP address |
richnash | 0:9094a94896f6 | 757 | wd.Configure(1000.0); |
richnash | 0:9094a94896f6 | 758 | |
richnash | 0:9094a94896f6 | 759 | // setup the pc serial logger |
richnash | 0:9094a94896f6 | 760 | logger.baud(115200); |
richnash | 0:9094a94896f6 | 761 | logger.printf("\r\n\r\n<<<<<<<<< Basic UDP XPL Listener >>>>>>>>>>\r\n"); |
richnash | 0:9094a94896f6 | 762 | |
richnash | 0:9094a94896f6 | 763 | // Fireup the TFT Screen |
richnash | 0:9094a94896f6 | 764 | initTFT() ; |
richnash | 0:9094a94896f6 | 765 | printf("TFT Started {width = %d, height = %d}\n\r", TFT.width(), TFT.height()) ; |
richnash | 0:9094a94896f6 | 766 | //calibrate(); |
richnash | 2:1335510cfb92 | 767 | screen3(); |
richnash | 2:1335510cfb92 | 768 | prevPage = 2; |
richnash | 0:9094a94896f6 | 769 | |
richnash | 2:1335510cfb92 | 770 | // turn all the LEDs off |
richnash | 2:1335510cfb92 | 771 | led1 = 0; // green = normal startup |
richnash | 2:1335510cfb92 | 772 | led2 = 0; // blue = ethernet data received |
richnash | 2:1335510cfb92 | 773 | led3 = 0; // red = watchdog startup |
richnash | 2:1335510cfb92 | 774 | led4 = 0; // ?? |
richnash | 0:9094a94896f6 | 775 | |
richnash | 0:9094a94896f6 | 776 | // WatchDog Startup Information |
richnash | 0:9094a94896f6 | 777 | logger.printf("\r\n------------------------------------------------------\r\n" ); |
richnash | 0:9094a94896f6 | 778 | logger.printf("[SystemCoreClock] %d Hz\r\n", SystemCoreClock); |
richnash | 0:9094a94896f6 | 779 | logger.printf("[Reset reason] "); |
richnash | 0:9094a94896f6 | 780 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)) logger.printf("Independant-Watchdog "); |
richnash | 0:9094a94896f6 | 781 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)) logger.printf("Window-Watchdog "); |
richnash | 0:9094a94896f6 | 782 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST)) logger.printf("Low-Power-Reset "); |
richnash | 0:9094a94896f6 | 783 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)) logger.printf("Software-Reset "); |
richnash | 0:9094a94896f6 | 784 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST)) logger.printf("Power-On/Down-Reset "); |
richnash | 0:9094a94896f6 | 785 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST)) logger.printf("Reset-pin "); |
richnash | 0:9094a94896f6 | 786 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST)) logger.printf("Brownout "); |
richnash | 0:9094a94896f6 | 787 | if (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY)) logger.printf("Low-speed-internal-clock-ready "); |
richnash | 0:9094a94896f6 | 788 | __HAL_RCC_CLEAR_RESET_FLAGS(); |
richnash | 0:9094a94896f6 | 789 | logger.printf("\r\n------------------------------------------------------\r\n"); |
richnash | 0:9094a94896f6 | 790 | |
richnash | 0:9094a94896f6 | 791 | if (wd.WatchdogCausedReset()) |
richnash | 0:9094a94896f6 | 792 | { |
richnash | 0:9094a94896f6 | 793 | logger.printf("<<Watchdog caused reset>>\r\n"); |
richnash | 0:9094a94896f6 | 794 | led3 = 1; |
richnash | 0:9094a94896f6 | 795 | } |
richnash | 0:9094a94896f6 | 796 | else |
richnash | 0:9094a94896f6 | 797 | { |
richnash | 0:9094a94896f6 | 798 | logger.printf("<<Normal Startup>>\r\n"); |
richnash | 0:9094a94896f6 | 799 | led1 = 1; |
richnash | 0:9094a94896f6 | 800 | led2 = 1; |
richnash | 0:9094a94896f6 | 801 | led3 = 0; |
richnash | 0:9094a94896f6 | 802 | } |
richnash | 0:9094a94896f6 | 803 | logger.printf("------------------------------------------------------\r\n\r\n"); |
richnash | 0:9094a94896f6 | 804 | |
richnash | 0:9094a94896f6 | 805 | #ifndef CONNECTED_OFF |
richnash | 0:9094a94896f6 | 806 | // Fireup the Ethernet |
richnash | 0:9094a94896f6 | 807 | DeviceEthStartup(); |
richnash | 0:9094a94896f6 | 808 | |
richnash | 0:9094a94896f6 | 809 | // process the devices ip adress into the XPL instance ID |
richnash | 0:9094a94896f6 | 810 | ip = gEth.get_ip_address(); |
richnash | 0:9094a94896f6 | 811 | strcpy( xpl_ip, ip ); |
richnash | 0:9094a94896f6 | 812 | UTILS_strip_char_in_string( xpl_ip, '.' ); |
richnash | 0:9094a94896f6 | 813 | #endif |
richnash | 0:9094a94896f6 | 814 | |
richnash | 0:9094a94896f6 | 815 | // now set the WD to something to run with - between receving data |
richnash | 0:9094a94896f6 | 816 | wd.Service(); |
richnash | 2:1335510cfb92 | 817 | wd.Configure(300.0); // 300s |
richnash | 0:9094a94896f6 | 818 | |
richnash | 0:9094a94896f6 | 819 | // setup xpl |
richnash | 0:9094a94896f6 | 820 | xpl.SendExternal = &SendUdPMessage; // pointer to the send callback |
richnash | 0:9094a94896f6 | 821 | xpl.AfterParseAction = &AfterParseAction; // pointer to a post parsing action callback |
richnash | 0:9094a94896f6 | 822 | xpl.SetSource( "NIHH", XPL_NAME, xpl_ip); // parameters for hearbeat message |
richnash | 0:9094a94896f6 | 823 | |
richnash | 0:9094a94896f6 | 824 | // kick off the XPL receiver thread to run in the background |
richnash | 0:9094a94896f6 | 825 | //Thread thread1(Receiver_Thread, NULL, osPriorityNormal); //, DEFAULT_STACK_SIZE); //osPriorityHigh |
richnash | 0:9094a94896f6 | 826 | thread1.set_priority(osPriorityNormal); |
richnash | 0:9094a94896f6 | 827 | thread1.start( Receiver_Thread ); |
richnash | 0:9094a94896f6 | 828 | |
richnash | 0:9094a94896f6 | 829 | #ifndef CONNECTED_OFF |
richnash | 0:9094a94896f6 | 830 | // i like to do this on startup to announce ourself |
richnash | 0:9094a94896f6 | 831 | logger.printf("XPL: STARTED {VendorID:%s, DeviceID:%s, InstanceID:%s}\n\r", "NIHH", XPL_NAME, xpl_ip ); |
richnash | 0:9094a94896f6 | 832 | xpl.SendHBeat(); |
richnash | 0:9094a94896f6 | 833 | #endif |
richnash | 0:9094a94896f6 | 834 | |
richnash | 0:9094a94896f6 | 835 | // start running the main processing stuff here |
richnash | 0:9094a94896f6 | 836 | while (true) |
richnash | 0:9094a94896f6 | 837 | { |
richnash | 2:1335510cfb92 | 838 | // page details... |
richnash | 0:9094a94896f6 | 839 | printf("page %d of %d\r\n", page, numPage ); |
richnash | 0:9094a94896f6 | 840 | switch(page) { |
richnash | 0:9094a94896f6 | 841 | case 0: |
richnash | 0:9094a94896f6 | 842 | if (prevPage != page) { |
richnash | 0:9094a94896f6 | 843 | screen1() ; |
richnash | 0:9094a94896f6 | 844 | } |
richnash | 0:9094a94896f6 | 845 | waitTouch = true ; |
richnash | 0:9094a94896f6 | 846 | break ; |
richnash | 0:9094a94896f6 | 847 | case 1: |
richnash | 0:9094a94896f6 | 848 | if (prevPage != page) { |
richnash | 0:9094a94896f6 | 849 | screen2() ; |
richnash | 0:9094a94896f6 | 850 | } |
richnash | 0:9094a94896f6 | 851 | waitTouch = true ; |
richnash | 0:9094a94896f6 | 852 | break ; |
richnash | 0:9094a94896f6 | 853 | case 2: |
richnash | 0:9094a94896f6 | 854 | if (prevPage != page) { |
richnash | 0:9094a94896f6 | 855 | screen3() ; |
richnash | 0:9094a94896f6 | 856 | } |
richnash | 0:9094a94896f6 | 857 | waitTouch = true ; |
richnash | 0:9094a94896f6 | 858 | break ; |
richnash | 0:9094a94896f6 | 859 | default: |
richnash | 0:9094a94896f6 | 860 | page = 0 ; |
richnash | 0:9094a94896f6 | 861 | break ; |
richnash | 0:9094a94896f6 | 862 | } |
richnash | 0:9094a94896f6 | 863 | prevPage = page ; |
richnash | 0:9094a94896f6 | 864 | |
richnash | 0:9094a94896f6 | 865 | |
richnash | 0:9094a94896f6 | 866 | do { |
richnash | 0:9094a94896f6 | 867 | // allow xpl to do its thing... |
richnash | 0:9094a94896f6 | 868 | #ifndef CONNECTED_OFF |
richnash | 0:9094a94896f6 | 869 | xpl.Process(); |
richnash | 0:9094a94896f6 | 870 | #endif |
richnash | 0:9094a94896f6 | 871 | |
richnash | 0:9094a94896f6 | 872 | if( getPixel(p) ) |
richnash | 0:9094a94896f6 | 873 | { |
richnash | 0:9094a94896f6 | 874 | printf("TFT Touch x = %d, y = %d\n\r", p.x, p.y) ; |
richnash | 0:9094a94896f6 | 875 | |
richnash | 0:9094a94896f6 | 876 | if (p.x < 100) |
richnash | 0:9094a94896f6 | 877 | { // left |
richnash | 0:9094a94896f6 | 878 | decPage() ; |
richnash | 0:9094a94896f6 | 879 | } |
richnash | 0:9094a94896f6 | 880 | else if (p.x > 150) |
richnash | 0:9094a94896f6 | 881 | { // right |
richnash | 0:9094a94896f6 | 882 | incPage() ; |
richnash | 0:9094a94896f6 | 883 | } |
richnash | 0:9094a94896f6 | 884 | waitTouch = false ; |
richnash | 0:9094a94896f6 | 885 | } |
richnash | 0:9094a94896f6 | 886 | |
richnash | 0:9094a94896f6 | 887 | // SIMPLE TEST - every 50 loops send a test XPL msg |
richnash | 0:9094a94896f6 | 888 | ++iAppLoop; |
richnash | 2:1335510cfb92 | 889 | if( iAppLoop >= 10000 ) |
richnash | 0:9094a94896f6 | 890 | { |
richnash | 0:9094a94896f6 | 891 | xPL_Message _message; |
richnash | 0:9094a94896f6 | 892 | |
richnash | 0:9094a94896f6 | 893 | /* |
richnash | 0:9094a94896f6 | 894 | _message.SetSchema( "clock", "update" ); |
richnash | 0:9094a94896f6 | 895 | _message.SetTarget( "*" ); |
richnash | 0:9094a94896f6 | 896 | _message.type = XPL_STAT; |
richnash | 0:9094a94896f6 | 897 | _message.hop = 1; |
richnash | 0:9094a94896f6 | 898 | _message.AddCommand("time", "20180730113315"); |
richnash | 0:9094a94896f6 | 899 | xpl.SendMessage( (xPL_Message *)&_message, true ); |
richnash | 0:9094a94896f6 | 900 | */ |
richnash | 0:9094a94896f6 | 901 | |
richnash | 0:9094a94896f6 | 902 | _message.SetSchema( "sensor", "basic" ); |
richnash | 0:9094a94896f6 | 903 | _message.SetTarget( "*" ); |
richnash | 0:9094a94896f6 | 904 | _message.type = XPL_STAT; |
richnash | 0:9094a94896f6 | 905 | _message.hop = 1; |
richnash | 0:9094a94896f6 | 906 | _message.AddCommand("device", "test1"); |
richnash | 0:9094a94896f6 | 907 | _message.AddCommand("type", "test"); |
richnash | 0:9094a94896f6 | 908 | _message.AddCommand("current", "1"); |
richnash | 0:9094a94896f6 | 909 | xpl.SendMessage( (xPL_Message *)&_message, true ); |
richnash | 0:9094a94896f6 | 910 | |
richnash | 0:9094a94896f6 | 911 | logger.printf("<<<<<< Sample Message Sent >>>>>>\r\n"); |
richnash | 0:9094a94896f6 | 912 | |
richnash | 0:9094a94896f6 | 913 | // reset |
richnash | 0:9094a94896f6 | 914 | iAppLoop = 0; |
richnash | 0:9094a94896f6 | 915 | } |
richnash | 0:9094a94896f6 | 916 | |
richnash | 2:1335510cfb92 | 917 | // pause for a mo ! |
richnash | 2:1335510cfb92 | 918 | ThisThread::sleep_for(100); |
richnash | 2:1335510cfb92 | 919 | |
richnash | 0:9094a94896f6 | 920 | } while(waitTouch != false) ; |
richnash | 0:9094a94896f6 | 921 | |
richnash | 0:9094a94896f6 | 922 | } |
richnash | 0:9094a94896f6 | 923 | } |