app5

Dependencies:   TFTv2 nihh-utils xpl

Committer:
richnash
Date:
Tue Oct 09 18:52:47 2018 +0000
Revision:
0:9094a94896f6
Child:
2:1335510cfb92
app5

Who changed what in which revision?

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