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