app5

Dependencies:   TFTv2 nihh-utils xpl

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?

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 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 }