app5

Dependencies:   TFTv2 nihh-utils xpl

Committer:
richnash
Date:
Sat Nov 03 13:33:32 2018 +0000
Revision:
4:ed0665b5d253
Parent:
3:f96822b3edb5
test

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