V.062 11/3

Dependencies:   FT6206 SDFileSystem ILI9341_t3

Fork of ATT_AWS_IoT_demo_v06 by attiot

Committer:
jilee
Date:
Fri Nov 03 20:28:02 2017 +0000
Revision:
29:f71a0be59b99
Parent:
28:54d9a550adf1
Child:
30:8c979815f533
v.06 11/03/2016

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Janos Follath 0:fc70c47eecb4 1 /*
ampembeng 15:6f2798e45099 2 * AT&T IoT Starter Kit example using Amazon Web Service
mbed_official 12:1ae41c231014 3 */
ampembeng 15:6f2798e45099 4 #include "mbed.h"
ampembeng 15:6f2798e45099 5
jilee 28:54d9a550adf1 6 //TFT
jilee 28:54d9a550adf1 7 #include "SPI_TFT_ILI9341.h"
jilee 28:54d9a550adf1 8 #include "FT6206.h"
jilee 28:54d9a550adf1 9 #include "Arial12x12.h"
jilee 29:f71a0be59b99 10 #include "Arial28x28.h"
jilee 29:f71a0be59b99 11 #include "BookAntiqua19x19-14.h"
jilee 29:f71a0be59b99 12
jilee 29:f71a0be59b99 13 #include "logo.h"
jilee 28:54d9a550adf1 14
ampembeng 18:6370da1de572 15 // SD File System
ampembeng 18:6370da1de572 16 #include "SDFileSystem.h"
ampembeng 18:6370da1de572 17
ampembeng 15:6f2798e45099 18 // Serial extension
ampembeng 15:6f2798e45099 19 #include "MODSERIAL.h"
Janos Follath 0:fc70c47eecb4 20
ampembeng 15:6f2798e45099 21 // Network includes
ampembeng 15:6f2798e45099 22 #include "WNCInterface.h"
ampembeng 15:6f2798e45099 23 #include "network_interface.h"
Janos Follath 0:fc70c47eecb4 24
ampembeng 15:6f2798e45099 25 // AWS includes
ampembeng 15:6f2798e45099 26 #include "aws_iot_log.h"
ampembeng 15:6f2798e45099 27 #include "aws_iot_version.h"
ampembeng 15:6f2798e45099 28 #include "aws_iot_shadow_interface.h"
ampembeng 15:6f2798e45099 29 #include "aws_iot_shadow_json_data.h"
ampembeng 15:6f2798e45099 30 #include "aws_iot_config.h"
ampembeng 15:6f2798e45099 31 #include "aws_iot_mqtt_interface.h"
mbed_official 12:1ae41c231014 32
jilee 29:f71a0be59b99 33 #include "mbedtls/net.h"
jilee 29:f71a0be59b99 34 #include "mbedtls/ssl.h"
jilee 29:f71a0be59b99 35 #include "mbedtls/entropy.h"
jilee 29:f71a0be59b99 36 #include "mbedtls/ctr_drbg.h"
jilee 29:f71a0be59b99 37 #include "mbedtls/certs.h"
jilee 29:f71a0be59b99 38 #include "mbedtls/x509.h"
jilee 29:f71a0be59b99 39 #include "mbedtls/error.h"
jilee 29:f71a0be59b99 40 #include "mbedtls/debug.h"
jilee 29:f71a0be59b99 41 #include "mbedtls/timing.h"
jilee 29:f71a0be59b99 42 #include "mbedtls/net_sockets.h"
jilee 29:f71a0be59b99 43 #include "pem.h"
jilee 29:f71a0be59b99 44
jilee 29:f71a0be59b99 45
ampembeng 20:ee34856ae510 46 // Sensors
ampembeng 20:ee34856ae510 47 #include "HTS221.h"
ampembeng 20:ee34856ae510 48
Janos Follath 0:fc70c47eecb4 49 #if DEBUG_LEVEL > 0
Janos Follath 0:fc70c47eecb4 50 #include "mbedtls/debug.h"
Janos Follath 0:fc70c47eecb4 51 #endif
Janos Follath 0:fc70c47eecb4 52
jilee 28:54d9a550adf1 53
jilee 28:54d9a550adf1 54
ampembeng 15:6f2798e45099 55 //=====================================================================================================================
ampembeng 15:6f2798e45099 56 //
ampembeng 15:6f2798e45099 57 // Defines
ampembeng 15:6f2798e45099 58 //
ampembeng 15:6f2798e45099 59 //=====================================================================================================================
ampembeng 15:6f2798e45099 60 // LED Colors
ampembeng 15:6f2798e45099 61 #define COLOR_OFF 0x00
ampembeng 15:6f2798e45099 62 #define COLOR_RED 0x01
ampembeng 15:6f2798e45099 63 #define COLOR_GREEN 0x02
ampembeng 15:6f2798e45099 64 #define COLOR_BLUE 0x04
ampembeng 15:6f2798e45099 65 #define COLOR_WHITE 0x07
ampembeng 15:6f2798e45099 66 #define NUM_COLORS 5
Janos Follath 0:fc70c47eecb4 67
ampembeng 15:6f2798e45099 68 // AWS defines
ampembeng 18:6370da1de572 69 #define PATH_MAX 1024
ampembeng 15:6f2798e45099 70 #define MAX_LENGTH_OF_UPDATE_JSON_BUFFER 200 // NOTE: Be wary of this if your JSON doc grows
jilee 29:f71a0be59b99 71 #define SHADOW_SYNC_INTERVAL 6.0 // How often we sync with AWS Shadow (in seconds)
Janos Follath 0:fc70c47eecb4 72
ampembeng 15:6f2798e45099 73 // Comment out the following line if color is not supported on the terminal
ampembeng 15:6f2798e45099 74 //#define USE_COLOR
ampembeng 15:6f2798e45099 75 #ifdef USE_COLOR
ampembeng 15:6f2798e45099 76 #define BLK "\033[30m"
ampembeng 15:6f2798e45099 77 #define RED "\033[31m"
ampembeng 15:6f2798e45099 78 #define GRN "\033[32m"
ampembeng 15:6f2798e45099 79 #define YEL "\033[33m"
ampembeng 15:6f2798e45099 80 #define BLU "\033[34m"
ampembeng 15:6f2798e45099 81 #define MAG "\033[35m"
ampembeng 15:6f2798e45099 82 #define CYN "\033[36m"
ampembeng 15:6f2798e45099 83 #define WHT "\033[37m"
ampembeng 15:6f2798e45099 84 #define DEF "\033[39m"
ampembeng 15:6f2798e45099 85 #else
ampembeng 15:6f2798e45099 86 #define BLK
ampembeng 15:6f2798e45099 87 #define RED
ampembeng 15:6f2798e45099 88 #define GRN
ampembeng 15:6f2798e45099 89 #define YEL
ampembeng 15:6f2798e45099 90 #define BLU
ampembeng 15:6f2798e45099 91 #define MAG
ampembeng 15:6f2798e45099 92 #define CYN
ampembeng 15:6f2798e45099 93 #define WHT
ampembeng 15:6f2798e45099 94 #define DEF
Janos Follath 0:fc70c47eecb4 95 #endif
Janos Follath 0:fc70c47eecb4 96
ampembeng 20:ee34856ae510 97 // Sensor defines
ampembeng 20:ee34856ae510 98 #define CTOF(x) ((x)*1.8+32) // Temperature
ampembeng 20:ee34856ae510 99
jilee 28:54d9a550adf1 100 //TFT
jilee 29:f71a0be59b99 101 #define PIN_SCLK PTD5
jilee 29:f71a0be59b99 102 #define PIN_MISO PTD7
jilee 29:f71a0be59b99 103 #define PIN_MOSI PTD6
jilee 29:f71a0be59b99 104 #define PIN_CS_TFT PTD4 // chip select pin
jilee 29:f71a0be59b99 105 #define PIN_DC_TFT PTB20 // data/command select pin.
jilee 29:f71a0be59b99 106 #define PIN_RESET_TFT PTB20 //we don't need reset so just use DC instead. Could modify library
jilee 28:54d9a550adf1 107
jilee 28:54d9a550adf1 108 #define PORTRAIT 0
jilee 28:54d9a550adf1 109 #define LANDSCAPE 1
jilee 28:54d9a550adf1 110 #define LANDSCAPE_R 3
jilee 28:54d9a550adf1 111
jilee 28:54d9a550adf1 112 //#if 0
jilee 28:54d9a550adf1 113 /*
jilee 28:54d9a550adf1 114 #define PIN_SCL_FT6206 PTE24
jilee 28:54d9a550adf1 115 #define PIN_SDA_FT6206 PTE25
jilee 29:f71a0be59b99 116 //#define PIN_INT_FT6206 PTC6
jilee 29:f71a0be59b99 117 #define PIN_INT_FT6206 PTC3
jilee 28:54d9a550adf1 118 */
jilee 28:54d9a550adf1 119 //#else
jilee 29:f71a0be59b99 120
jilee 28:54d9a550adf1 121 #define PIN_SCL_FT6206 D15
jilee 28:54d9a550adf1 122 #define PIN_SDA_FT6206 D14
jilee 28:54d9a550adf1 123 #define PIN_INT_FT6206 PTC3
jilee 29:f71a0be59b99 124
jilee 28:54d9a550adf1 125 //#endif
jilee 28:54d9a550adf1 126
jilee 29:f71a0be59b99 127
jilee 29:f71a0be59b99 128
jilee 28:54d9a550adf1 129 SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "TFT"); // mosi, miso, sclk, cs, reset, dc
jilee 29:f71a0be59b99 130 FT6206 ft6206(PIN_SDA_FT6206, PIN_SCL_FT6206, PIN_INT_FT6206); // sda, scl, int
jilee 28:54d9a550adf1 131
ampembeng 15:6f2798e45099 132 //=====================================================================================================================
ampembeng 15:6f2798e45099 133 //
ampembeng 15:6f2798e45099 134 // Globals
ampembeng 15:6f2798e45099 135 //
ampembeng 15:6f2798e45099 136 //=====================================================================================================================
ampembeng 15:6f2798e45099 137 // Controls LED color
ampembeng 15:6f2798e45099 138 unsigned char ledColor = COLOR_OFF;
ampembeng 15:6f2798e45099 139
ampembeng 15:6f2798e45099 140 // Color cycle array (used with SW3 button presses)
ampembeng 15:6f2798e45099 141 unsigned char colorCycle[NUM_COLORS] = {COLOR_OFF, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE};
Janos Follath 0:fc70c47eecb4 142
ampembeng 15:6f2798e45099 143 // Button interrupts
ampembeng 15:6f2798e45099 144 bool buttonOverride = false;
ampembeng 15:6f2798e45099 145 InterruptIn Interrupt(SW3);
ampembeng 15:6f2798e45099 146
ampembeng 18:6370da1de572 147 // These defines are pulled from aws_iot_config.h
jilee 29:f71a0be59b99 148 char HostAddress[255] = AWS_IOT_MQTT_HOST1;
ampembeng 18:6370da1de572 149 char MqttClientID[32] = AWS_IOT_MQTT_CLIENT_ID;
ampembeng 18:6370da1de572 150 char ThingName[32] = AWS_IOT_MY_THING_NAME;
ampembeng 18:6370da1de572 151 char PortString[5] = "8883";
ampembeng 15:6f2798e45099 152 uint32_t port = AWS_IOT_MQTT_PORT;
ampembeng 23:b9ff83dc965f 153 char iccidName[21] = "12345678901234567890";
Janos Follath 0:fc70c47eecb4 154
ampembeng 20:ee34856ae510 155 // Sensor data
ampembeng 20:ee34856ae510 156 float temperature = 0.0;
ampembeng 20:ee34856ae510 157 int humidity = 0;
jilee 29:f71a0be59b99 158 unsigned int count = 1;
ampembeng 20:ee34856ae510 159
jilee 28:54d9a550adf1 160 char iccid[] = "89011702278124165220";
jilee 28:54d9a550adf1 161
jilee 29:f71a0be59b99 162 //mqqt host name
jilee 29:f71a0be59b99 163 char *aws_iot_mqtt_host;
jilee 29:f71a0be59b99 164
jilee 29:f71a0be59b99 165 //certificate
jilee 29:f71a0be59b99 166 static mbedtls_x509_crt clicert;
jilee 29:f71a0be59b99 167
ampembeng 23:b9ff83dc965f 168 // Temp/humidity object
ampembeng 23:b9ff83dc965f 169 HTS221 hts221;
ampembeng 23:b9ff83dc965f 170
jilee 29:f71a0be59b99 171
jilee 29:f71a0be59b99 172
ampembeng 15:6f2798e45099 173 //=====================================================================================================================
ampembeng 15:6f2798e45099 174 //
ampembeng 15:6f2798e45099 175 // Devices
ampembeng 15:6f2798e45099 176 //
ampembeng 15:6f2798e45099 177 //=====================================================================================================================
ampembeng 15:6f2798e45099 178 // GPIOs for RGB LED
ampembeng 15:6f2798e45099 179 DigitalOut led_green(LED_GREEN);
ampembeng 15:6f2798e45099 180 DigitalOut led_red(LED_RED);
ampembeng 15:6f2798e45099 181 DigitalOut led_blue(LED_BLUE);
Janos Follath 0:fc70c47eecb4 182
ampembeng 15:6f2798e45099 183 // USB Serial port (to PC)
ampembeng 15:6f2798e45099 184 MODSERIAL pc(USBTX,USBRX,256,256);
Janos Follath 0:fc70c47eecb4 185
ampembeng 18:6370da1de572 186 // SD card access (MOSI, MISO, SCK, CS)
ampembeng 18:6370da1de572 187 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
ampembeng 18:6370da1de572 188
ampembeng 20:ee34856ae510 189 // I2C bus (SDA, SCL)
ampembeng 20:ee34856ae510 190 I2C i2c(PTC11, PTC10);
ampembeng 20:ee34856ae510 191
jilee 29:f71a0be59b99 192 extern unsigned char cSubject[100];
jilee 29:f71a0be59b99 193
jilee 29:f71a0be59b99 194 int16_t dbm;
jilee 29:f71a0be59b99 195 unsigned char cUpdateStatus = 0x00;
jilee 29:f71a0be59b99 196
ampembeng 15:6f2798e45099 197 //=====================================================================================================================
ampembeng 15:6f2798e45099 198 //
ampembeng 15:6f2798e45099 199 // Functions
ampembeng 15:6f2798e45099 200 //
ampembeng 15:6f2798e45099 201 //=====================================================================================================================
ampembeng 15:6f2798e45099 202 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 203 //* Prints the given format to the PC serial port. Exposed to all files via aws_iot_log.h
ampembeng 15:6f2798e45099 204 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 205 void pc_print(const char * format, ...)
ampembeng 15:6f2798e45099 206 {
ampembeng 15:6f2798e45099 207 va_list vl;
ampembeng 15:6f2798e45099 208 va_start(vl, format);
ampembeng 15:6f2798e45099 209 pc.vprintf(format, vl);
ampembeng 15:6f2798e45099 210 va_end(vl);
ampembeng 15:6f2798e45099 211 }
Janos Follath 0:fc70c47eecb4 212
ampembeng 15:6f2798e45099 213 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 214 //* Set the RGB LED's Color
ampembeng 15:6f2798e45099 215 //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue)
ampembeng 15:6f2798e45099 216 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 217 void SetLedColor(unsigned char ucColor)
ampembeng 18:6370da1de572 218 {
ampembeng 15:6f2798e45099 219 //Note that when an LED is on, you write a 0 to it:
ampembeng 15:6f2798e45099 220 led_red = !(ucColor & 0x1); //bit 0
ampembeng 15:6f2798e45099 221 led_green = !(ucColor & 0x2); //bit 1
ampembeng 15:6f2798e45099 222 led_blue = !(ucColor & 0x4); //bit 2
ampembeng 15:6f2798e45099 223 }
Janos Follath 0:fc70c47eecb4 224
ampembeng 15:6f2798e45099 225 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 226 //* SW3 Button handler. Finds the current LED color and sets the button to the next color in colorCycle[]
ampembeng 15:6f2798e45099 227 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 228 void sw3ButtonHandler()
ampembeng 15:6f2798e45099 229 {
ampembeng 15:6f2798e45099 230 int i;
ampembeng 15:6f2798e45099 231 for(i=0; i < NUM_COLORS; i++) {
ampembeng 15:6f2798e45099 232 if (ledColor == colorCycle[i])
ampembeng 15:6f2798e45099 233 break;
ampembeng 15:6f2798e45099 234 }
ampembeng 15:6f2798e45099 235
ampembeng 15:6f2798e45099 236 // (circular-queue)
ampembeng 15:6f2798e45099 237 if (++i == NUM_COLORS)
ampembeng 15:6f2798e45099 238 i = 0;
ampembeng 15:6f2798e45099 239
ampembeng 15:6f2798e45099 240 ledColor = colorCycle[i];
ampembeng 15:6f2798e45099 241 SetLedColor(ledColor);
ampembeng 15:6f2798e45099 242 buttonOverride = true;
ampembeng 15:6f2798e45099 243 }
Janos Follath 0:fc70c47eecb4 244
ampembeng 23:b9ff83dc965f 245 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 246 //* Print LED and sensor data
ampembeng 23:b9ff83dc965f 247 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 248 void printData()
ampembeng 23:b9ff83dc965f 249 {
ampembeng 23:b9ff83dc965f 250 INFO("Temperature is: %0.2f F", temperature);
jilee 29:f71a0be59b99 251 INFO("Humidity is: %02d", humidity);
jilee 29:f71a0be59b99 252
ampembeng 23:b9ff83dc965f 253 switch (ledColor) {
ampembeng 23:b9ff83dc965f 254 case COLOR_OFF:
ampembeng 23:b9ff83dc965f 255 INFO("LED: Off");
jilee 29:f71a0be59b99 256
ampembeng 23:b9ff83dc965f 257 break;
ampembeng 23:b9ff83dc965f 258 case COLOR_RED:
ampembeng 23:b9ff83dc965f 259 INFO("LED: Red");
jilee 29:f71a0be59b99 260
ampembeng 23:b9ff83dc965f 261 break;
ampembeng 23:b9ff83dc965f 262 case COLOR_GREEN:
ampembeng 23:b9ff83dc965f 263 INFO("LED: Green");
ampembeng 23:b9ff83dc965f 264 break;
ampembeng 23:b9ff83dc965f 265 case COLOR_BLUE:
ampembeng 23:b9ff83dc965f 266 INFO("LED: Blue");
ampembeng 23:b9ff83dc965f 267 break;
ampembeng 23:b9ff83dc965f 268 case COLOR_WHITE:
ampembeng 23:b9ff83dc965f 269 INFO("LED: White");
ampembeng 23:b9ff83dc965f 270 break;
ampembeng 23:b9ff83dc965f 271 }
jilee 29:f71a0be59b99 272
ampembeng 23:b9ff83dc965f 273 }
ampembeng 23:b9ff83dc965f 274
jilee 29:f71a0be59b99 275 /*
jilee 29:f71a0be59b99 276 void printDatatoTFT()
jilee 29:f71a0be59b99 277 {
jilee 29:f71a0be59b99 278 //TFT.cls();
jilee 29:f71a0be59b99 279 TFT.locate(0,10);
jilee 29:f71a0be59b99 280 TFT.printf("ATT LTE: %d dBm AWS: Connected\n\n", dbm);
jilee 29:f71a0be59b99 281 //TFT.line (0,21, 320,21, White);
jilee 29:f71a0be59b99 282 TFT.printf("Certificate Name: %s\n\n", cSubject);
jilee 29:f71a0be59b99 283 //TFT.printf("Sending Device Data...\n\n");
jilee 29:f71a0be59b99 284 TFT.printf("ICCID: %s\n", iccidName);
jilee 29:f71a0be59b99 285 TFT.printf("Temperature: %0.2f F \n", temperature);
jilee 29:f71a0be59b99 286 TFT.printf("Humidity: %02d %%\n", humidity);
jilee 29:f71a0be59b99 287 TFT.printf("LED: ");
jilee 29:f71a0be59b99 288
jilee 29:f71a0be59b99 289 switch (ledColor) {
jilee 29:f71a0be59b99 290 case COLOR_OFF:
jilee 29:f71a0be59b99 291 TFT.foreground(White);
jilee 29:f71a0be59b99 292 TFT.printf("OFF \n");
jilee 29:f71a0be59b99 293 TFT.fillcircle (240,160, 25, Black);
jilee 29:f71a0be59b99 294 TFT.circle (240,160, 25, White);
jilee 29:f71a0be59b99 295 break;
jilee 29:f71a0be59b99 296 case COLOR_RED:
jilee 29:f71a0be59b99 297 TFT.foreground(Red);
jilee 29:f71a0be59b99 298 TFT.printf("RED \n");
jilee 29:f71a0be59b99 299 TFT.foreground(White);
jilee 29:f71a0be59b99 300 TFT.fillcircle (240,160, 25, Red);
jilee 29:f71a0be59b99 301 break;
jilee 29:f71a0be59b99 302 case COLOR_GREEN:
jilee 29:f71a0be59b99 303 TFT.foreground(Green);
jilee 29:f71a0be59b99 304 TFT.printf("GREEN \n");
jilee 29:f71a0be59b99 305 TFT.foreground(White);
jilee 29:f71a0be59b99 306 TFT.fillcircle (240,160, 25, Green);
jilee 29:f71a0be59b99 307 break;
jilee 29:f71a0be59b99 308 case COLOR_BLUE:
jilee 29:f71a0be59b99 309 TFT.foreground(Blue);
jilee 29:f71a0be59b99 310 TFT.printf("BLUE \n");
jilee 29:f71a0be59b99 311 TFT.foreground(White);
jilee 29:f71a0be59b99 312 TFT.fillcircle (240,160, 25, Blue);
jilee 29:f71a0be59b99 313 break;
jilee 29:f71a0be59b99 314 case COLOR_WHITE:
jilee 29:f71a0be59b99 315 TFT.foreground(White);
jilee 29:f71a0be59b99 316 TFT.printf("WHITE \n");
jilee 29:f71a0be59b99 317 TFT.fillcircle (240,160, 25, White);
jilee 29:f71a0be59b99 318 break;
jilee 29:f71a0be59b99 319 }
jilee 29:f71a0be59b99 320 TFT.printf("\nUpdate Count: %d\n", count++);
jilee 29:f71a0be59b99 321 }
jilee 29:f71a0be59b99 322 */
jilee 29:f71a0be59b99 323
jilee 29:f71a0be59b99 324 void printDatatoTFT()
jilee 29:f71a0be59b99 325 {
jilee 29:f71a0be59b99 326 //TFT.cls();
jilee 29:f71a0be59b99 327 TFT.locate(0,10);
jilee 29:f71a0be59b99 328 TFT.printf("ATT LTE: %d dBm AWS: %d\n\n", dbm, count++);
jilee 29:f71a0be59b99 329 //TFT.line (0,21, 320,21, White);
jilee 29:f71a0be59b99 330 TFT.printf("CN: %s\n", cSubject);
jilee 29:f71a0be59b99 331 //TFT.printf("Sending Device Data...\n\n");
jilee 29:f71a0be59b99 332 TFT.printf("ICCID: %s\n", iccidName);
jilee 29:f71a0be59b99 333 TFT.printf("TEMPERATURE: %0.2f F \n", temperature);
jilee 29:f71a0be59b99 334 TFT.printf("HUMIDITY: %02d %%\n", humidity);
jilee 29:f71a0be59b99 335 TFT.printf("LED: ");
jilee 29:f71a0be59b99 336
jilee 29:f71a0be59b99 337 switch (ledColor) {
jilee 29:f71a0be59b99 338 case COLOR_OFF:
jilee 29:f71a0be59b99 339 TFT.foreground(White);
jilee 29:f71a0be59b99 340 TFT.printf("OFF \n");
jilee 29:f71a0be59b99 341 TFT.fillcircle (240,160, 25, Black);
jilee 29:f71a0be59b99 342 TFT.circle (240,160, 25, White);
jilee 29:f71a0be59b99 343 break;
jilee 29:f71a0be59b99 344 case COLOR_RED:
jilee 29:f71a0be59b99 345 TFT.foreground(Red);
jilee 29:f71a0be59b99 346 TFT.printf("RED \n");
jilee 29:f71a0be59b99 347 TFT.foreground(White);
jilee 29:f71a0be59b99 348 TFT.fillcircle (240,160, 25, Red);
jilee 29:f71a0be59b99 349 break;
jilee 29:f71a0be59b99 350 case COLOR_GREEN:
jilee 29:f71a0be59b99 351 TFT.foreground(Green);
jilee 29:f71a0be59b99 352 TFT.printf("GREEN \n");
jilee 29:f71a0be59b99 353 TFT.foreground(White);
jilee 29:f71a0be59b99 354 TFT.fillcircle (240,160, 25, Green);
jilee 29:f71a0be59b99 355 break;
jilee 29:f71a0be59b99 356 case COLOR_BLUE:
jilee 29:f71a0be59b99 357 TFT.foreground(Blue);
jilee 29:f71a0be59b99 358 TFT.printf("BLUE \n");
jilee 29:f71a0be59b99 359 TFT.foreground(White);
jilee 29:f71a0be59b99 360 TFT.fillcircle (240,160, 25, Blue);
jilee 29:f71a0be59b99 361 break;
jilee 29:f71a0be59b99 362 case COLOR_WHITE:
jilee 29:f71a0be59b99 363 TFT.foreground(White);
jilee 29:f71a0be59b99 364 TFT.printf("WHITE \n");
jilee 29:f71a0be59b99 365 TFT.fillcircle (240,160, 25, White);
jilee 29:f71a0be59b99 366 break;
jilee 29:f71a0be59b99 367 }
jilee 29:f71a0be59b99 368 //TFT.printf("\nUpdate Count: %d\n", count++);
jilee 29:f71a0be59b99 369 }
jilee 29:f71a0be59b99 370
jilee 29:f71a0be59b99 371 void ShowINFO(const char *sInfo)
jilee 29:f71a0be59b99 372 {
jilee 29:f71a0be59b99 373 INFO(sInfo);
jilee 29:f71a0be59b99 374 TFT.printf(sInfo);
jilee 29:f71a0be59b99 375 TFT.printf("\n");
jilee 29:f71a0be59b99 376 }
jilee 29:f71a0be59b99 377
jilee 29:f71a0be59b99 378
ampembeng 15:6f2798e45099 379 //=====================================================================================================================
ampembeng 15:6f2798e45099 380 //
ampembeng 15:6f2798e45099 381 // AWS Shadow Callbacks
ampembeng 15:6f2798e45099 382 //
ampembeng 15:6f2798e45099 383 //=====================================================================================================================
ampembeng 15:6f2798e45099 384 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 385 //* This is the callback function that fires when an update is sent. It will print the update response status.
ampembeng 15:6f2798e45099 386 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 387 void ShadowUpdateStatusCallback(const char *pThingName, ShadowActions_t action, Shadow_Ack_Status_t status,
ampembeng 15:6f2798e45099 388 const char *pReceivedJsonDocument, void *pContextData) {
Janos Follath 0:fc70c47eecb4 389
ampembeng 15:6f2798e45099 390 INFO("Shadow Update Status Callback");
jilee 29:f71a0be59b99 391 TFT.printf("\n");
ampembeng 15:6f2798e45099 392 if (status == SHADOW_ACK_TIMEOUT) {
jilee 29:f71a0be59b99 393 INFO("Update Timeout");
ampembeng 15:6f2798e45099 394 } else if (status == SHADOW_ACK_REJECTED) {
jilee 29:f71a0be59b99 395 INFO("Update Rejected");
ampembeng 15:6f2798e45099 396 } else if (status == SHADOW_ACK_ACCEPTED) {
jilee 29:f71a0be59b99 397 INFO("Update Accepted"); // Good
ampembeng 15:6f2798e45099 398 }
jilee 29:f71a0be59b99 399
ampembeng 15:6f2798e45099 400 }
Janos Follath 0:fc70c47eecb4 401
ampembeng 15:6f2798e45099 402 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 403 //* This is the callback function that fires when AWS has sends out a shadow update.
ampembeng 15:6f2798e45099 404 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 405 void ledControl_Callback(const char *pJsonString, uint32_t JsonStringDataLen, jsonStruct_t *pContext) {
ampembeng 15:6f2798e45099 406
ampembeng 15:6f2798e45099 407 INFO("LED Callback Detected.");
ampembeng 15:6f2798e45099 408
ampembeng 15:6f2798e45099 409 if (pContext != NULL) {
ampembeng 15:6f2798e45099 410 switch (*(unsigned char *)(pContext->pData)){
ampembeng 15:6f2798e45099 411 case COLOR_OFF:
ampembeng 15:6f2798e45099 412 INFO("LED -> OFF (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 413 break;
ampembeng 15:6f2798e45099 414 case COLOR_RED:
ampembeng 15:6f2798e45099 415 INFO("LED -> RED (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 416 break;
ampembeng 15:6f2798e45099 417 case COLOR_GREEN:
ampembeng 15:6f2798e45099 418 INFO("LED -> GREEN (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 419 break;
ampembeng 15:6f2798e45099 420 case COLOR_BLUE:
ampembeng 15:6f2798e45099 421 INFO("LED -> BLUE (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 422 break;
ampembeng 15:6f2798e45099 423 case COLOR_WHITE:
ampembeng 15:6f2798e45099 424 INFO("LED -> WHITE (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 425 break;
Janos Follath 0:fc70c47eecb4 426 }
ampembeng 15:6f2798e45099 427 }
ampembeng 15:6f2798e45099 428 else {
ampembeng 15:6f2798e45099 429 INFO("pContext was detected as NULL");
Janos Follath 0:fc70c47eecb4 430 }
ampembeng 15:6f2798e45099 431 }
ampembeng 23:b9ff83dc965f 432
ampembeng 23:b9ff83dc965f 433 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 434 //* Subscribe callback (used with alternate demo)
ampembeng 23:b9ff83dc965f 435 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 436 int MQTTcallbackHandler(MQTTCallbackParams params) {
ampembeng 23:b9ff83dc965f 437
ampembeng 23:b9ff83dc965f 438 INFO("Subscribe callback");
ampembeng 23:b9ff83dc965f 439 INFO("%.*s\t%.*s",
ampembeng 23:b9ff83dc965f 440 (int)params.TopicNameLen, params.pTopicName,
ampembeng 23:b9ff83dc965f 441 (int)params.MessageParams.PayloadLen, (char*)params.MessageParams.pPayload);
ampembeng 23:b9ff83dc965f 442
ampembeng 23:b9ff83dc965f 443 return 0;
ampembeng 23:b9ff83dc965f 444 }
ampembeng 23:b9ff83dc965f 445
ampembeng 23:b9ff83dc965f 446 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 447 //* Disconnect handling (used with alternate demo)
ampembeng 23:b9ff83dc965f 448 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 449 void disconnectCallbackHandler(void) {
ampembeng 23:b9ff83dc965f 450 WARN("MQTT Disconnect");
ampembeng 23:b9ff83dc965f 451 IoT_Error_t rc = NONE_ERROR;
ampembeng 23:b9ff83dc965f 452 if(aws_iot_is_autoreconnect_enabled()){
ampembeng 23:b9ff83dc965f 453 INFO("Auto Reconnect is enabled, Reconnecting attempt will start now");
ampembeng 23:b9ff83dc965f 454 }else{
ampembeng 23:b9ff83dc965f 455 WARN("Auto Reconnect not enabled. Starting manual reconnect...");
ampembeng 23:b9ff83dc965f 456 rc = aws_iot_mqtt_attempt_reconnect();
ampembeng 23:b9ff83dc965f 457 if(RECONNECT_SUCCESSFUL == rc){
ampembeng 23:b9ff83dc965f 458 WARN("Manual Reconnect Successful");
ampembeng 23:b9ff83dc965f 459 }else{
ampembeng 23:b9ff83dc965f 460 WARN("Manual Reconnect Failed - %d", rc);
ampembeng 23:b9ff83dc965f 461 }
ampembeng 23:b9ff83dc965f 462 }
ampembeng 23:b9ff83dc965f 463 }
ampembeng 23:b9ff83dc965f 464
ampembeng 23:b9ff83dc965f 465 //=====================================================================================================================
ampembeng 23:b9ff83dc965f 466 //
ampembeng 23:b9ff83dc965f 467 // Out-of-Box Demo: This function is used as part of the binary that comes with the Starter Kit. Instead of using an
ampembeng 23:b9ff83dc965f 468 // AWS device shadow, it publishes to an AWS Rule. The Rule is setup to store data to a DynamoDB, and
ampembeng 23:b9ff83dc965f 469 // the demo S3 website pulls that data from the DynamoDB and displays it.
ampembeng 23:b9ff83dc965f 470 //
ampembeng 23:b9ff83dc965f 471 //=====================================================================================================================
ampembeng 23:b9ff83dc965f 472 int outOfBoxDemo() {
ampembeng 23:b9ff83dc965f 473 INFO("Running Out-of-Box Function (alternate demo).");
ampembeng 23:b9ff83dc965f 474
ampembeng 23:b9ff83dc965f 475 IoT_Error_t rc = NONE_ERROR;
ampembeng 23:b9ff83dc965f 476 int32_t i = 0;
ampembeng 23:b9ff83dc965f 477 int publishCount = 0;
ampembeng 23:b9ff83dc965f 478 bool infinitePublishFlag = true;
ampembeng 23:b9ff83dc965f 479 char cPayload[100];
ampembeng 23:b9ff83dc965f 480 char cTopic[100];
ampembeng 23:b9ff83dc965f 481 const string colorStrings[] = {"Off", "Red", "Green", "", "Blue", "", "", "White"};
ampembeng 24:224c07ec3bd0 482 float updateInterval = 1.0; // seconds
ampembeng 23:b9ff83dc965f 483
ampembeng 23:b9ff83dc965f 484 MQTTConnectParams connectParams = MQTTConnectParamsDefault;
ampembeng 23:b9ff83dc965f 485 connectParams.KeepAliveInterval_sec = 10;
ampembeng 23:b9ff83dc965f 486 connectParams.isCleansession = true;
ampembeng 23:b9ff83dc965f 487 connectParams.MQTTVersion = MQTT_3_1_1;
ampembeng 23:b9ff83dc965f 488 connectParams.pClientID = iccidName; // Using ICCID for unique Client ID
ampembeng 23:b9ff83dc965f 489 connectParams.pHostURL = HostAddress;
ampembeng 23:b9ff83dc965f 490 connectParams.port = port;
ampembeng 23:b9ff83dc965f 491 connectParams.isWillMsgPresent = false;
ampembeng 23:b9ff83dc965f 492 connectParams.pRootCALocation = AWS_IOT_ROOT_CA_FILENAME;
ampembeng 23:b9ff83dc965f 493 connectParams.pDeviceCertLocation = AWS_IOT_CERTIFICATE_FILENAME;
ampembeng 23:b9ff83dc965f 494 connectParams.pDevicePrivateKeyLocation = AWS_IOT_PRIVATE_KEY_FILENAME;
ampembeng 23:b9ff83dc965f 495 connectParams.mqttCommandTimeout_ms = 10000;
ampembeng 23:b9ff83dc965f 496 connectParams.tlsHandshakeTimeout_ms = 10000;
ampembeng 23:b9ff83dc965f 497 connectParams.isSSLHostnameVerify = true; // ensure this is set to true for production
ampembeng 23:b9ff83dc965f 498 connectParams.disconnectHandler = disconnectCallbackHandler;
ampembeng 23:b9ff83dc965f 499
ampembeng 23:b9ff83dc965f 500 INFO("Connecting...");
ampembeng 23:b9ff83dc965f 501 rc = aws_iot_mqtt_connect(&connectParams);
ampembeng 23:b9ff83dc965f 502 if (NONE_ERROR != rc) {
ampembeng 23:b9ff83dc965f 503 ERROR("Error(%d) connecting to %s:%d", rc, connectParams.pHostURL, connectParams.port);
ampembeng 23:b9ff83dc965f 504 }
ampembeng 23:b9ff83dc965f 505
ampembeng 23:b9ff83dc965f 506 /*
ampembeng 23:b9ff83dc965f 507 * Enable Auto Reconnect functionality. Minimum and Maximum time of Exponential backoff are set in aws_iot_config.h
ampembeng 23:b9ff83dc965f 508 * #AWS_IOT_MQTT_MIN_RECONNECT_WAIT_INTERVAL
ampembeng 23:b9ff83dc965f 509 * #AWS_IOT_MQTT_MAX_RECONNECT_WAIT_INTERVAL
ampembeng 23:b9ff83dc965f 510 */
ampembeng 23:b9ff83dc965f 511 INFO("Set Auto Reconnect...");
ampembeng 23:b9ff83dc965f 512 rc = aws_iot_mqtt_autoreconnect_set_status(true);
ampembeng 23:b9ff83dc965f 513 if (NONE_ERROR != rc) {
ampembeng 23:b9ff83dc965f 514 ERROR("Unable to set Auto Reconnect to true - %d", rc);
ampembeng 23:b9ff83dc965f 515 return rc;
ampembeng 23:b9ff83dc965f 516 }
ampembeng 23:b9ff83dc965f 517
ampembeng 23:b9ff83dc965f 518 // Comment this in if you want to subscribe
ampembeng 23:b9ff83dc965f 519 /*MQTTSubscribeParams subParams = MQTTSubscribeParamsDefault;
ampembeng 23:b9ff83dc965f 520 subParams.mHandler = MQTTcallbackHandler;
ampembeng 23:b9ff83dc965f 521 subParams.pTopic = "sdkTest/sub";
ampembeng 23:b9ff83dc965f 522 subParams.qos = QOS_0;
ampembeng 23:b9ff83dc965f 523
ampembeng 23:b9ff83dc965f 524 if (NONE_ERROR == rc) {
ampembeng 23:b9ff83dc965f 525 INFO("Subscribing...");
ampembeng 23:b9ff83dc965f 526 rc = aws_iot_mqtt_subscribe(&subParams);
ampembeng 23:b9ff83dc965f 527 if (NONE_ERROR != rc) {
ampembeng 23:b9ff83dc965f 528 ERROR("Error subscribing");
ampembeng 23:b9ff83dc965f 529 }
ampembeng 23:b9ff83dc965f 530 }*/
ampembeng 23:b9ff83dc965f 531
ampembeng 23:b9ff83dc965f 532 // Initializ the payload
ampembeng 23:b9ff83dc965f 533 MQTTMessageParams Msg = MQTTMessageParamsDefault;
ampembeng 23:b9ff83dc965f 534 Msg.qos = QOS_0;
ampembeng 23:b9ff83dc965f 535 Msg.pPayload = (void *) cPayload;
ampembeng 23:b9ff83dc965f 536
ampembeng 23:b9ff83dc965f 537 MQTTPublishParams Params = MQTTPublishParamsDefault;
ampembeng 23:b9ff83dc965f 538
ampembeng 23:b9ff83dc965f 539 // Sets up the topic to publish to
ampembeng 23:b9ff83dc965f 540 sprintf(cTopic, AWS_IOT_MY_TOPIC, iccidName);
ampembeng 23:b9ff83dc965f 541 Params.pTopic = cTopic;
ampembeng 23:b9ff83dc965f 542
ampembeng 23:b9ff83dc965f 543 if (publishCount != 0) {
ampembeng 23:b9ff83dc965f 544 infinitePublishFlag = false;
ampembeng 23:b9ff83dc965f 545 }
ampembeng 23:b9ff83dc965f 546
ampembeng 23:b9ff83dc965f 547 INFO("READY TO PUBLISH! Press SW3 button to publish current data.");
ampembeng 23:b9ff83dc965f 548 while ((NETWORK_ATTEMPTING_RECONNECT == rc || RECONNECT_SUCCESSFUL == rc || NONE_ERROR == rc)
ampembeng 23:b9ff83dc965f 549 && (publishCount > 0 || infinitePublishFlag)) {
ampembeng 23:b9ff83dc965f 550
ampembeng 23:b9ff83dc965f 551 // Max time the yield function will wait for read messages
ampembeng 23:b9ff83dc965f 552 rc = aws_iot_mqtt_yield(100);
ampembeng 23:b9ff83dc965f 553 if(NETWORK_ATTEMPTING_RECONNECT == rc){
ampembeng 23:b9ff83dc965f 554 INFO("--> sleep (attempting to reconnect)");
ampembeng 23:b9ff83dc965f 555 wait(1);
ampembeng 23:b9ff83dc965f 556 // If the client is attempting to reconnect we will skip the rest of the loop.
ampembeng 23:b9ff83dc965f 557 continue;
ampembeng 23:b9ff83dc965f 558 }
ampembeng 23:b9ff83dc965f 559
ampembeng 23:b9ff83dc965f 560 // Whenever the software button (SW3) is pressed the LED will changes color and this will
ampembeng 23:b9ff83dc965f 561 // trigger a publish to the AWS topic specified.
ampembeng 23:b9ff83dc965f 562 if (buttonOverride) {
ampembeng 23:b9ff83dc965f 563 buttonOverride = false;
ampembeng 23:b9ff83dc965f 564
ampembeng 23:b9ff83dc965f 565 // Get temp/humidity values
ampembeng 23:b9ff83dc965f 566 temperature = CTOF(hts221.readTemperature());
ampembeng 23:b9ff83dc965f 567 humidity = hts221.readHumidity();
ampembeng 23:b9ff83dc965f 568
ampembeng 23:b9ff83dc965f 569 // Loading data into JSON format
ampembeng 23:b9ff83dc965f 570 sprintf(cPayload, "{\"color\":\"%s\",\"temperature\":%f,\"humidity\":%d}", colorStrings[ledColor], temperature, humidity);
ampembeng 23:b9ff83dc965f 571 Msg.PayloadLen = strlen(cPayload) + 1;
ampembeng 23:b9ff83dc965f 572 Params.MessageParams = Msg;
ampembeng 23:b9ff83dc965f 573
ampembeng 23:b9ff83dc965f 574 // Publish
ampembeng 23:b9ff83dc965f 575 rc = aws_iot_mqtt_publish(&Params);
ampembeng 23:b9ff83dc965f 576 if (publishCount > 0) {
ampembeng 23:b9ff83dc965f 577 publishCount--;
ampembeng 23:b9ff83dc965f 578 }
ampembeng 23:b9ff83dc965f 579
ampembeng 23:b9ff83dc965f 580 printData();
ampembeng 23:b9ff83dc965f 581 INFO("--> Update sent. Sleep for %f seconds", updateInterval);
ampembeng 23:b9ff83dc965f 582 wait(updateInterval-.02);
ampembeng 23:b9ff83dc965f 583 }
ampembeng 23:b9ff83dc965f 584 else {
ampembeng 23:b9ff83dc965f 585 wait(.3); // 300 ms
ampembeng 23:b9ff83dc965f 586 }
ampembeng 23:b9ff83dc965f 587 }
ampembeng 23:b9ff83dc965f 588
ampembeng 23:b9ff83dc965f 589 if (NONE_ERROR != rc) {
ampembeng 23:b9ff83dc965f 590 ERROR("An error occurred in the loop.\n");
ampembeng 23:b9ff83dc965f 591 } else {
ampembeng 23:b9ff83dc965f 592 INFO("Publish done\n");
ampembeng 23:b9ff83dc965f 593 }
ampembeng 23:b9ff83dc965f 594
ampembeng 23:b9ff83dc965f 595 return rc;
ampembeng 23:b9ff83dc965f 596 }
ampembeng 15:6f2798e45099 597
jilee 29:f71a0be59b99 598 void InitTFT()
jilee 29:f71a0be59b99 599 {
jilee 29:f71a0be59b99 600 //Configure the display driver
jilee 29:f71a0be59b99 601 TFT.claim(stdout);
jilee 29:f71a0be59b99 602 TFT.background(Black);
jilee 29:f71a0be59b99 603 TFT.foreground(White);
jilee 29:f71a0be59b99 604 TFT.set_orientation(LANDSCAPE_R);
jilee 29:f71a0be59b99 605 TFT.cls();
jilee 29:f71a0be59b99 606 TFT.set_font((unsigned char*) Arial12x12);
jilee 29:f71a0be59b99 607 //TFT.set_font((unsigned char*) Courier10x13-12B);
jilee 29:f71a0be59b99 608 TFT.locate(0,0);
jilee 29:f71a0be59b99 609 }
jilee 29:f71a0be59b99 610
jilee 28:54d9a550adf1 611 void TFTStuff()
jilee 28:54d9a550adf1 612 {
jilee 28:54d9a550adf1 613 INFO("DBG> main\r\n");
jilee 28:54d9a550adf1 614
jilee 29:f71a0be59b99 615 //FT6206 ft6206(PIN_SDA_FT6206, PIN_SCL_FT6206, PIN_INT_FT6206); // sda, scl, int
jilee 28:54d9a550adf1 616
jilee 28:54d9a550adf1 617 //Configure the display driver
jilee 28:54d9a550adf1 618 TFT.claim(stdout);
jilee 29:f71a0be59b99 619 TFT.background(Black);
jilee 29:f71a0be59b99 620 TFT.foreground(White);
jilee 28:54d9a550adf1 621
jilee 29:f71a0be59b99 622 //TFT.background(White);
jilee 29:f71a0be59b99 623 //TFT.foreground(Black);
jilee 28:54d9a550adf1 624
jilee 28:54d9a550adf1 625
jilee 28:54d9a550adf1 626 TFT.set_orientation(LANDSCAPE_R);
jilee 28:54d9a550adf1 627 TFT.cls();
jilee 28:54d9a550adf1 628
jilee 28:54d9a550adf1 629 //Print a welcome message
jilee 28:54d9a550adf1 630 TFT.set_font((unsigned char*) Arial12x12);
jilee 28:54d9a550adf1 631 TFT.locate(0,0);
jilee 28:54d9a550adf1 632 TFT.printf("Hello mbed!\n");
jilee 28:54d9a550adf1 633 TFT.printf("Touch Screen to Continue!\n");
jilee 28:54d9a550adf1 634 INFO("Hello mbed!\r\n");
jilee 28:54d9a550adf1 635 INFO("Touch Screen to Continue!!\r\n");
jilee 28:54d9a550adf1 636
jilee 29:f71a0be59b99 637 int X1, Y1, X2, Y2;
jilee 29:f71a0be59b99 638 TS_Point p;
jilee 29:f71a0be59b99 639
jilee 28:54d9a550adf1 640 while(1) {
jilee 29:f71a0be59b99 641
jilee 29:f71a0be59b99 642 if(ft6206.touched())
jilee 29:f71a0be59b99 643 {
jilee 28:54d9a550adf1 644 INFO("Touched\r\n");
jilee 28:54d9a550adf1 645 p = ft6206.getPoint();
jilee 29:f71a0be59b99 646
jilee 29:f71a0be59b99 647
jilee 29:f71a0be59b99 648 X1 = TFT.width()-p.x;
jilee 29:f71a0be59b99 649 Y1 = TFT.height()-p.y;
jilee 29:f71a0be59b99 650 pc.printf("Touched at x=%3d y=%3d\n", p.x, p.y);
jilee 29:f71a0be59b99 651 pc.printf("Touched actual at x=%3d y=%3d\n", X1, Y1);
jilee 29:f71a0be59b99 652
jilee 29:f71a0be59b99 653 //ft6206.clearPoint();
jilee 29:f71a0be59b99 654 //return;
jilee 28:54d9a550adf1 655 }
jilee 29:f71a0be59b99 656 /*
jilee 28:54d9a550adf1 657 if (ft6206.getTouchPoint(p)) {
jilee 28:54d9a550adf1 658 X1 = X2;
jilee 28:54d9a550adf1 659 Y1 = Y2;
jilee 28:54d9a550adf1 660 X2 = TFT.width()-p.x;
jilee 28:54d9a550adf1 661 Y2 = TFT.height()-p.y;
jilee 28:54d9a550adf1 662 TFT.locate(0,12);
jilee 28:54d9a550adf1 663 INFO("Touch %3d %3d\n", p.x, p.y);
jilee 28:54d9a550adf1 664 return;
jilee 28:54d9a550adf1 665 if ((X1 > 0) && (Y1 > 0) && (X2 > 0) && (Y2 > 0)) {
jilee 28:54d9a550adf1 666 TFT.line(X1, Y1, X2, Y2, RGB(255,128,255));
jilee 28:54d9a550adf1 667 }
jilee 28:54d9a550adf1 668 }
jilee 29:f71a0be59b99 669 */
jilee 28:54d9a550adf1 670 }
jilee 28:54d9a550adf1 671
jilee 28:54d9a550adf1 672 }
jilee 29:f71a0be59b99 673 /*
jilee 29:f71a0be59b99 674 //=====================================================================================================================
jilee 29:f71a0be59b99 675 // setupShield
jilee 29:f71a0be59b99 676 // setup the Adrafruit 1947
jilee 29:f71a0be59b99 677 //=====================================================================================================================
jilee 29:f71a0be59b99 678 void setupShield(bool touch) {
jilee 29:f71a0be59b99 679 //Configure the display driver
jilee 29:f71a0be59b99 680 TFT.claim(stdout);
jilee 29:f71a0be59b99 681 TFT.background(Black);
jilee 29:f71a0be59b99 682 TFT.foreground(White);
jilee 29:f71a0be59b99 683 TFT.set_orientation(LANDSCAPE);
jilee 29:f71a0be59b99 684
jilee 29:f71a0be59b99 685 TFT.cls();
jilee 29:f71a0be59b99 686 INFO("TFT.cls()");
jilee 29:f71a0be59b99 687
jilee 29:f71a0be59b99 688 TFT.circle(120, 120, 50, Red);
jilee 29:f71a0be59b99 689
jilee 29:f71a0be59b99 690 //Print a welcome message
jilee 29:f71a0be59b99 691 TFT.set_font((unsigned char*) Arial12x12);
jilee 29:f71a0be59b99 692 TFT.locate(120,160);
jilee 29:f71a0be59b99 693 TFT.printf("Hello G+D!\n");
jilee 29:f71a0be59b99 694
jilee 29:f71a0be59b99 695 if (touch) {
jilee 29:f71a0be59b99 696 while (0)
jilee 29:f71a0be59b99 697 if(pc.readable())
jilee 29:f71a0be59b99 698 pc.putc(pc.getc());
jilee 29:f71a0be59b99 699
jilee 29:f71a0be59b99 700 int X1, Y1, X2, Y2 = 0;
jilee 29:f71a0be59b99 701 X2 = -100;
jilee 29:f71a0be59b99 702 while(1) {
jilee 29:f71a0be59b99 703 if (FT6206.touched()) {
jilee 29:f71a0be59b99 704 // if (FT6206.dataReceived()) {
jilee 29:f71a0be59b99 705 // led1 = !led1;
jilee 29:f71a0be59b99 706 // Retrieve a point
jilee 29:f71a0be59b99 707 TS_Point p = FT6206.getPoint();
jilee 29:f71a0be59b99 708 X1 = X2;
jilee 29:f71a0be59b99 709 Y1 = Y2;
jilee 29:f71a0be59b99 710 X2 = p.x;
jilee 29:f71a0be59b99 711 Y2 = p.y;
jilee 29:f71a0be59b99 712 // printf("Touch %3d %3d\n", p.x, p.y);
jilee 29:f71a0be59b99 713 if ((X1 > 0) && (Y1 > 0) && (X2 > 0) && (Y2 > 0)) {
jilee 29:f71a0be59b99 714 TFT.line(X1, Y1, X2, Y2, Green);
jilee 29:f71a0be59b99 715 }
jilee 29:f71a0be59b99 716 }
jilee 29:f71a0be59b99 717 // TFT.printf("Count: %d\n", count++);
jilee 29:f71a0be59b99 718 wait(0.05);
jilee 29:f71a0be59b99 719 }
jilee 29:f71a0be59b99 720 }
jilee 29:f71a0be59b99 721 }
jilee 29:f71a0be59b99 722 */
jilee 29:f71a0be59b99 723
jilee 29:f71a0be59b99 724 int DoAWSThingMenu()
jilee 29:f71a0be59b99 725 {
jilee 29:f71a0be59b99 726
jilee 29:f71a0be59b99 727 //FT6206 ft6206(PIN_SDA_FT6206, PIN_SCL_FT6206, PIN_INT_FT6206); // sda, scl, int
jilee 29:f71a0be59b99 728
jilee 29:f71a0be59b99 729 TFT.cls();
jilee 29:f71a0be59b99 730 TFT.locate(0,3);
jilee 29:f71a0be59b99 731 INFO ("AWS Host Selection\n");
jilee 29:f71a0be59b99 732 TFT.set_font((unsigned char*) Book_Antiqua19x19);
jilee 29:f71a0be59b99 733 TFT.printf (" SELECT AWS HOST\n");
jilee 29:f71a0be59b99 734
jilee 29:f71a0be59b99 735 TFT.set_font((unsigned char*) Arial28x28);
jilee 29:f71a0be59b99 736 //TFT.circle (160,65, 40, Blue);
jilee 29:f71a0be59b99 737 TFT.fillcircle (160,75, 40, Blue);
jilee 29:f71a0be59b99 738 TFT.locate(130,63);
jilee 29:f71a0be59b99 739 //TFT.foreground(Blue);
jilee 29:f71a0be59b99 740 TFT.background(Blue);
jilee 29:f71a0be59b99 741 TFT.foreground(Red);
jilee 29:f71a0be59b99 742 TFT.printf("ATT");
jilee 29:f71a0be59b99 743 //TFT.line (0,39, 319, 39, White);
jilee 29:f71a0be59b99 744 //TFT.circle (160,150, 40, Green);
jilee 29:f71a0be59b99 745 TFT.fillcircle (160,160, 40, Green);
jilee 29:f71a0be59b99 746 TFT.locate(137, 148);
jilee 29:f71a0be59b99 747 //TFT.foreground(Green);
jilee 29:f71a0be59b99 748 TFT.background(Green);
jilee 29:f71a0be59b99 749 TFT.foreground(Black);
jilee 29:f71a0be59b99 750 TFT.printf("GD");
jilee 29:f71a0be59b99 751 //TFT.line (0,79, 319, 79, White);
jilee 29:f71a0be59b99 752
jilee 29:f71a0be59b99 753 int X1, Y1, X2, Y2;
jilee 29:f71a0be59b99 754 TS_Point p;
jilee 29:f71a0be59b99 755
jilee 29:f71a0be59b99 756
jilee 29:f71a0be59b99 757 while(1)
jilee 29:f71a0be59b99 758 {
jilee 29:f71a0be59b99 759 if(ft6206.touched())
jilee 29:f71a0be59b99 760 {
jilee 29:f71a0be59b99 761 p = ft6206.getPoint();
jilee 29:f71a0be59b99 762 X1 = TFT.width()-p.x;
jilee 29:f71a0be59b99 763 Y1 = TFT.height()-p.y;
jilee 29:f71a0be59b99 764
jilee 29:f71a0be59b99 765 //pc.printf("Touched at x=%3d y=%3d\n", p.x, p.y);
jilee 29:f71a0be59b99 766 //pc.printf("Touched actual at x=%3d y=%3d\n", X1, Y1);
jilee 29:f71a0be59b99 767
jilee 29:f71a0be59b99 768 if ((X1 > 120) && (X1 < 200) && (Y1 > 35) && (Y1 <115))
jilee 29:f71a0be59b99 769 {
jilee 29:f71a0be59b99 770 INFO("ATT selected\r\n");
jilee 29:f71a0be59b99 771 return 1;
jilee 29:f71a0be59b99 772 }
jilee 29:f71a0be59b99 773
jilee 29:f71a0be59b99 774 if ((X1 > 120) && (X1 < 200) && (Y1 > 120) && (Y1 < 200))
jilee 29:f71a0be59b99 775 {
jilee 29:f71a0be59b99 776 INFO ("GD selected\n");
jilee 29:f71a0be59b99 777 return 2;
jilee 29:f71a0be59b99 778 }
jilee 29:f71a0be59b99 779
jilee 29:f71a0be59b99 780 //ft6206.clearPoint();
jilee 29:f71a0be59b99 781 }
jilee 29:f71a0be59b99 782
jilee 29:f71a0be59b99 783 }
jilee 29:f71a0be59b99 784 pc.printf ("leaving menu\n");
jilee 29:f71a0be59b99 785 wait (10.0);
jilee 29:f71a0be59b99 786 //TFT.set_font((unsigned char*) Arial12x12);
jilee 29:f71a0be59b99 787 TFT.set_font((unsigned char*) Book_Antiqua19x19);
jilee 29:f71a0be59b99 788 TFT.foreground(White);
jilee 29:f71a0be59b99 789 return 0;
jilee 29:f71a0be59b99 790 }
jilee 28:54d9a550adf1 791
ampembeng 15:6f2798e45099 792 //=====================================================================================================================
ampembeng 15:6f2798e45099 793 //
ampembeng 15:6f2798e45099 794 // Main
ampembeng 15:6f2798e45099 795 //
ampembeng 15:6f2798e45099 796 //=====================================================================================================================
jilee 29:f71a0be59b99 797 int main()
jilee 29:f71a0be59b99 798 {
jilee 29:f71a0be59b99 799 bool bFirstTime = true;
jilee 29:f71a0be59b99 800
jilee 29:f71a0be59b99 801 //Init Screen
jilee 29:f71a0be59b99 802 InitTFT();
ampembeng 15:6f2798e45099 803
ampembeng 15:6f2798e45099 804 // Set baud rate for PC Serial
ampembeng 15:6f2798e45099 805 pc.baud(115200);
jilee 29:f71a0be59b99 806 ShowINFO("AT&T AWS IoT Demo V.06");
jilee 29:f71a0be59b99 807
jilee 29:f71a0be59b99 808 TFT.drawBitmap(43, 10, att, 234, 96);
jilee 29:f71a0be59b99 809 TFT.drawBitmap(0, 150, gd, 320, 56);
jilee 29:f71a0be59b99 810
jilee 29:f71a0be59b99 811
ampembeng 20:ee34856ae510 812 int i;
ampembeng 23:b9ff83dc965f 813 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 814 char JsonDocumentBuffer[MAX_LENGTH_OF_UPDATE_JSON_BUFFER];
ampembeng 15:6f2798e45099 815 size_t sizeOfJsonDocumentBuffer = sizeof(JsonDocumentBuffer) / sizeof(JsonDocumentBuffer[0]);
ampembeng 15:6f2798e45099 816
ampembeng 15:6f2798e45099 817 // JSON struct for LED control
ampembeng 15:6f2798e45099 818 jsonStruct_t ledController;
ampembeng 15:6f2798e45099 819 ledController.cb = ledControl_Callback;
ampembeng 15:6f2798e45099 820 ledController.pData = &ledColor;
ampembeng 15:6f2798e45099 821 ledController.pKey = "ledColor";
ampembeng 15:6f2798e45099 822 ledController.type = SHADOW_JSON_UINT8;
ampembeng 15:6f2798e45099 823
ampembeng 20:ee34856ae510 824 // JSON struct for temperature\humidity readings
ampembeng 15:6f2798e45099 825 jsonStruct_t temperatureHandler;
ampembeng 15:6f2798e45099 826 temperatureHandler.cb = NULL;
ampembeng 15:6f2798e45099 827 temperatureHandler.pKey = "temperature";
ampembeng 15:6f2798e45099 828 temperatureHandler.pData = &temperature;
ampembeng 15:6f2798e45099 829 temperatureHandler.type = SHADOW_JSON_FLOAT;
ampembeng 20:ee34856ae510 830
ampembeng 20:ee34856ae510 831 jsonStruct_t humidityHandler;
ampembeng 20:ee34856ae510 832 humidityHandler.cb = NULL;
ampembeng 20:ee34856ae510 833 humidityHandler.pKey = "humidity";
ampembeng 20:ee34856ae510 834 humidityHandler.pData = &humidity;
ampembeng 20:ee34856ae510 835 humidityHandler.type = SHADOW_JSON_INT16;
ampembeng 15:6f2798e45099 836
jilee 28:54d9a550adf1 837 jsonStruct_t iccidHandler;
jilee 28:54d9a550adf1 838 iccidHandler.cb = NULL;
jilee 28:54d9a550adf1 839 iccidHandler.pKey = "iccid";
jilee 28:54d9a550adf1 840 iccidHandler.pData = iccidName;
jilee 28:54d9a550adf1 841 iccidHandler.type = SHADOW_JSON_STRING;
jilee 28:54d9a550adf1 842
jilee 28:54d9a550adf1 843
ampembeng 15:6f2798e45099 844 INFO("AWS IoT SDK Version(dev) %d.%d.%d-%s", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_TAG);
jilee 29:f71a0be59b99 845
ampembeng 15:6f2798e45099 846
ampembeng 18:6370da1de572 847 #ifdef USING_SD_CARD
ampembeng 18:6370da1de572 848 // Paths for certs from SD card
ampembeng 18:6370da1de572 849 INFO("Using SD card files for AWS config.");
ampembeng 18:6370da1de572 850 DEBUG("- mqtt config path: %s", AWS_MQTT_CONFIG_FILENAME);
ampembeng 18:6370da1de572 851 DEBUG("- rootCA path: %s", AWS_IOT_ROOT_CA_FILENAME);
ampembeng 18:6370da1de572 852 DEBUG("- clientCRT path: %s", AWS_IOT_CERTIFICATE_FILENAME);
ampembeng 18:6370da1de572 853 DEBUG("- clientKey path: %s", AWS_IOT_PRIVATE_KEY_FILENAME);
ampembeng 18:6370da1de572 854 #else
jilee 28:54d9a550adf1 855 //INFO("Using #defines in aws_iot_config.h and certs from certs.cpp for AWS config.");
ampembeng 18:6370da1de572 856 #endif
ampembeng 15:6f2798e45099 857
ampembeng 16:02008a2a2569 858 // Startup signal - blinks through RGBW then turns off
ampembeng 15:6f2798e45099 859 SetLedColor(COLOR_RED);
ampembeng 15:6f2798e45099 860 wait(.5);
ampembeng 15:6f2798e45099 861 SetLedColor(COLOR_GREEN);
ampembeng 15:6f2798e45099 862 wait(.5);
ampembeng 15:6f2798e45099 863 SetLedColor(COLOR_BLUE);
ampembeng 15:6f2798e45099 864 wait(.5);
ampembeng 16:02008a2a2569 865 SetLedColor(COLOR_WHITE);
ampembeng 16:02008a2a2569 866 wait(.5);
ampembeng 16:02008a2a2569 867 SetLedColor(COLOR_OFF);
ampembeng 20:ee34856ae510 868
jilee 29:f71a0be59b99 869 //TFTStuff();
jilee 28:54d9a550adf1 870
ampembeng 20:ee34856ae510 871 // Initialize sensors
ampembeng 23:b9ff83dc965f 872 INFO("Init sensors...");
ampembeng 20:ee34856ae510 873 void hts221_init(void);
ampembeng 20:ee34856ae510 874 i = hts221.begin();
ampembeng 20:ee34856ae510 875 if(!i) {
ampembeng 20:ee34856ae510 876 WARN(RED "HTS221 NOT DETECTED!!\n\r");
ampembeng 20:ee34856ae510 877 }
jilee 29:f71a0be59b99 878
jilee 29:f71a0be59b99 879 //TFTStuff();
jilee 29:f71a0be59b99 880 wait (2.0);
jilee 29:f71a0be59b99 881 int iSelection = 0;
jilee 29:f71a0be59b99 882 string sMQTTHostName;
jilee 29:f71a0be59b99 883
jilee 29:f71a0be59b99 884 iSelection = DoAWSThingMenu();
jilee 29:f71a0be59b99 885
jilee 29:f71a0be59b99 886 TFT.locate(0,0);
jilee 29:f71a0be59b99 887 //TFT.set_font((unsigned char*) Arial12x12);
jilee 29:f71a0be59b99 888 TFT.set_font((unsigned char*) Book_Antiqua19x19);
jilee 29:f71a0be59b99 889 TFT.background(Black);
jilee 29:f71a0be59b99 890 TFT.foreground(White);
jilee 29:f71a0be59b99 891 TFT.cls();
jilee 29:f71a0be59b99 892 switch (iSelection)
jilee 29:f71a0be59b99 893 {
jilee 29:f71a0be59b99 894 case 1:
jilee 29:f71a0be59b99 895 aws_iot_mqtt_host = AWS_IOT_MQTT_HOST1;
jilee 29:f71a0be59b99 896 sMQTTHostName = "ATT";
jilee 29:f71a0be59b99 897 TFT.printf ("ATT AWS Host Selected\n");
jilee 29:f71a0be59b99 898 break;
jilee 29:f71a0be59b99 899 case 2:
jilee 29:f71a0be59b99 900 aws_iot_mqtt_host = AWS_IOT_MQTT_HOST2;
jilee 29:f71a0be59b99 901 sMQTTHostName = "GD";
jilee 29:f71a0be59b99 902 TFT.printf ("GD AWS Host Selected\n");
jilee 29:f71a0be59b99 903 break;
jilee 29:f71a0be59b99 904 default:
jilee 29:f71a0be59b99 905 ShowINFO ("Unknown MQTT HOST\n");
jilee 29:f71a0be59b99 906 break;
jilee 29:f71a0be59b99 907
jilee 29:f71a0be59b99 908 }
ampembeng 18:6370da1de572 909
ampembeng 15:6f2798e45099 910 // Setup SW3 button to falling edge interrupt
jilee 29:f71a0be59b99 911
ampembeng 23:b9ff83dc965f 912 INFO("Init interrupts...");
ampembeng 15:6f2798e45099 913 Interrupt.fall(&sw3ButtonHandler);
jilee 28:54d9a550adf1 914
jilee 29:f71a0be59b99 915 //TFTStuff();
jilee 29:f71a0be59b99 916
ampembeng 15:6f2798e45099 917 // Boot the Avnet Shield before any other operations
ampembeng 23:b9ff83dc965f 918 INFO("Net Boot...");
jilee 29:f71a0be59b99 919 TFT.printf ("Connecting to ATT LTE Network....\n");
jilee 29:f71a0be59b99 920 if (net_modem_boot() != 0)
jilee 29:f71a0be59b99 921 {
jilee 29:f71a0be59b99 922 TFT.printf ("Unable to Connect to ATT LTE Network. Please try again by rebooting the device.\n");
jilee 29:f71a0be59b99 923 return 0;
jilee 29:f71a0be59b99 924 }
jilee 29:f71a0be59b99 925 TFT.printf ("Connected to ATT LTE Network.\n");
jilee 29:f71a0be59b99 926 wait (3.0);
ampembeng 23:b9ff83dc965f 927
jilee 29:f71a0be59b99 928
jilee 29:f71a0be59b99 929 if (GetSignalStrength(&dbm) != 0)
jilee 29:f71a0be59b99 930 {
jilee 29:f71a0be59b99 931 TFT.printf ("Unable to Signal Strength. Please try again by rebooting the device.\n");
jilee 29:f71a0be59b99 932 return 0;
jilee 29:f71a0be59b99 933 }
jilee 29:f71a0be59b99 934
jilee 29:f71a0be59b99 935
ampembeng 23:b9ff83dc965f 936 //==========================================================================
ampembeng 23:b9ff83dc965f 937 // NOTE: You can comment in the following line for an alternate demo that
ampembeng 23:b9ff83dc965f 938 // is used as the out-of-box demo binary that comes with the AT&T IoT
ampembeng 23:b9ff83dc965f 939 // Starter Kit. It loops instead of the rest of Main()
ampembeng 23:b9ff83dc965f 940 //return outOfBoxDemo();
ampembeng 23:b9ff83dc965f 941 //==========================================================================
jilee 29:f71a0be59b99 942
jilee 29:f71a0be59b99 943 restart1:
jilee 29:f71a0be59b99 944
ampembeng 23:b9ff83dc965f 945
ampembeng 18:6370da1de572 946 // Intialize MQTT/Cert parameters
ampembeng 15:6f2798e45099 947 ShadowParameters_t sp = ShadowParametersDefault;
ampembeng 18:6370da1de572 948 #ifdef USING_SD_CARD
ampembeng 18:6370da1de572 949 rc = (IoT_Error_t)mbedtls_mqtt_config_parse_file(&sp, AWS_MQTT_CONFIG_FILENAME);
ampembeng 18:6370da1de572 950 if (NONE_ERROR != rc) {
ampembeng 18:6370da1de572 951 ERROR("Failed to initialize mqtt parameters %d", rc);
ampembeng 18:6370da1de572 952 return rc;
ampembeng 18:6370da1de572 953 }
ampembeng 18:6370da1de572 954 sp.pClientCRT = AWS_IOT_CERTIFICATE_FILENAME;
ampembeng 18:6370da1de572 955 sp.pClientKey = AWS_IOT_PRIVATE_KEY_FILENAME;
ampembeng 18:6370da1de572 956 sp.pRootCA = AWS_IOT_ROOT_CA_FILENAME;
ampembeng 18:6370da1de572 957 #else
ampembeng 15:6f2798e45099 958 sp.pMyThingName = AWS_IOT_MY_THING_NAME;
ampembeng 15:6f2798e45099 959 sp.pMqttClientId = AWS_IOT_MQTT_CLIENT_ID;
jilee 29:f71a0be59b99 960 //sp.pHost = HostAddress;
jilee 29:f71a0be59b99 961 INFO ("Host Name:");
jilee 29:f71a0be59b99 962 INFO (aws_iot_mqtt_host);
jilee 29:f71a0be59b99 963 sp.pHost = aws_iot_mqtt_host;
jilee 29:f71a0be59b99 964 INFO (sp.pHost);
ampembeng 15:6f2798e45099 965 sp.port = port;
ampembeng 23:b9ff83dc965f 966
ampembeng 23:b9ff83dc965f 967 sp.pClientCRT = AWS_IOT_CERTIFICATE_FILENAME;
ampembeng 23:b9ff83dc965f 968 sp.pClientKey = AWS_IOT_PRIVATE_KEY_FILENAME;
ampembeng 23:b9ff83dc965f 969 sp.pRootCA = AWS_IOT_ROOT_CA_FILENAME;
ampembeng 18:6370da1de572 970 #endif
jilee 29:f71a0be59b99 971 /*
jilee 29:f71a0be59b99 972 char cBlockOffset[7];
jilee 29:f71a0be59b99 973 string sObject;
jilee 29:f71a0be59b99 974 pc.printf ("Length = %d\n", AWS_IOT_CERTIFICATE_LENGTH );
jilee 29:f71a0be59b99 975 for (int i = 0; i < AWS_IOT_CERTIFICATE_LENGTH; i++)
jilee 29:f71a0be59b99 976 {
jilee 29:f71a0be59b99 977 sprintf (cBlockOffset, "%02X", AWS_IOT_CERTIFICATE[i]);
jilee 29:f71a0be59b99 978 sObject += string (cBlockOffset);
jilee 29:f71a0be59b99 979
jilee 29:f71a0be59b99 980 }
jilee 29:f71a0be59b99 981 pc.printf(sObject.c_str());
jilee 29:f71a0be59b99 982 pc.printf("\n");
jilee 29:f71a0be59b99 983 */
jilee 29:f71a0be59b99 984 int ret = 0;
jilee 29:f71a0be59b99 985 mbedtls_x509_crt_init(&clicert);
jilee 29:f71a0be59b99 986 ret = mbedtls_x509_crt_parse(&clicert, (const unsigned char *)AWS_IOT_CERTIFICATE, AWS_IOT_CERTIFICATE_LENGTH);
jilee 29:f71a0be59b99 987 if (ret != 0) {
jilee 29:f71a0be59b99 988 ERROR(" failed\n ! mbedtls_x509_crt_parse IOT returned 1 -0x%x, %d\n\n", -ret, AWS_IOT_CERTIFICATE_LENGTH);
jilee 29:f71a0be59b99 989 TFT.printf ("Invalid Certificate. Please check the certificate and reboot the device.");
jilee 29:f71a0be59b99 990 return ret;
jilee 29:f71a0be59b99 991 }
jilee 29:f71a0be59b99 992 else
jilee 29:f71a0be59b99 993 {
jilee 29:f71a0be59b99 994 for (int i = 0; i < clicert.subject_raw.len; i++)
jilee 29:f71a0be59b99 995 {
jilee 29:f71a0be59b99 996 if (clicert.subject_raw.p[i] == 0x0C)
jilee 29:f71a0be59b99 997 {
jilee 29:f71a0be59b99 998 i++;
jilee 29:f71a0be59b99 999 unsigned char cLength = clicert.subject_raw.p[i];
jilee 29:f71a0be59b99 1000 DEBUG ("subject length = %d", cLength);
jilee 29:f71a0be59b99 1001 i++;
jilee 29:f71a0be59b99 1002 for (int j = 0; j < (int) cLength; j++)
jilee 29:f71a0be59b99 1003 {
jilee 29:f71a0be59b99 1004 cSubject[j] = clicert.subject_raw.p[i];
jilee 29:f71a0be59b99 1005 i++;
jilee 29:f71a0be59b99 1006 }
jilee 29:f71a0be59b99 1007 cSubject[cLength] = 0x00;
jilee 29:f71a0be59b99 1008 break;
jilee 29:f71a0be59b99 1009 }
jilee 29:f71a0be59b99 1010 }
jilee 29:f71a0be59b99 1011 }
jilee 29:f71a0be59b99 1012
jilee 29:f71a0be59b99 1013 TFT.printf("Logging into %s AWS\n", sMQTTHostName);
jilee 29:f71a0be59b99 1014 TFT.printf("CN: %s\n", cSubject);
ampembeng 18:6370da1de572 1015 INFO("Initialize the MQTT client...");
ampembeng 18:6370da1de572 1016 MQTTClient_t mqttClient;
ampembeng 18:6370da1de572 1017 aws_iot_mqtt_init(&mqttClient);
ampembeng 15:6f2798e45099 1018
jilee 29:f71a0be59b99 1019 string sAWSError = "\nUnable to Log into AWS. Invalid certificate. Please make sure the certificates in the SIM card are valid and reboot the device.\n";
jilee 29:f71a0be59b99 1020 TFT.printf(".");
ampembeng 15:6f2798e45099 1021 INFO("Shadow Init...");
ampembeng 15:6f2798e45099 1022 rc = aws_iot_shadow_init(&mqttClient);
ampembeng 15:6f2798e45099 1023 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 1024 ERROR("Shadow Init Error %d", rc);
jilee 29:f71a0be59b99 1025 TFT.printf(sAWSError.c_str());
ampembeng 15:6f2798e45099 1026 return rc;
Janos Follath 0:fc70c47eecb4 1027 }
ampembeng 15:6f2798e45099 1028
ampembeng 15:6f2798e45099 1029 INFO("Shadow Connect...");
jilee 29:f71a0be59b99 1030 TFT.printf(".");
ampembeng 15:6f2798e45099 1031 rc = aws_iot_shadow_connect(&mqttClient, &sp);
ampembeng 15:6f2798e45099 1032 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 1033 ERROR("Shadow Connection Error %d", rc);
jilee 29:f71a0be59b99 1034 TFT.printf(sAWSError.c_str());
ampembeng 15:6f2798e45099 1035 return rc;
Janos Follath 0:fc70c47eecb4 1036 }
Janos Follath 0:fc70c47eecb4 1037
ampembeng 15:6f2798e45099 1038 // Enable Auto Reconnect functionality. Minimum and Maximum time of Exponential backoff are set in aws_iot_config.h
ampembeng 15:6f2798e45099 1039 // #AWS_IOT_MQTT_MIN_RECONNECT_WAIT_INTERVAL
ampembeng 15:6f2798e45099 1040 // #AWS_IOT_MQTT_MAX_RECONNECT_WAIT_INTERVAL
ampembeng 15:6f2798e45099 1041 rc = mqttClient.setAutoReconnectStatus(true);
ampembeng 15:6f2798e45099 1042 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 1043 ERROR("Unable to set Auto Reconnect to true - %d", rc);
jilee 29:f71a0be59b99 1044 TFT.printf(sAWSError.c_str());
ampembeng 15:6f2798e45099 1045 return rc;
ampembeng 15:6f2798e45099 1046 }
ampembeng 15:6f2798e45099 1047
ampembeng 15:6f2798e45099 1048 // Example line of how to delete a shadow (not used in this demo)
ampembeng 15:6f2798e45099 1049 //aws_iot_shadow_delete(&mqttClient, AWS_IOT_MY_THING_NAME, ShadowUpdateStatusCallback, NULL, 8, true);
Janos Follath 0:fc70c47eecb4 1050
ampembeng 15:6f2798e45099 1051 INFO("Shadow Register Delta...");
jilee 29:f71a0be59b99 1052 TFT.printf(".");
ampembeng 15:6f2798e45099 1053 rc = aws_iot_shadow_register_delta(&mqttClient, &ledController);
ampembeng 15:6f2798e45099 1054 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 1055 ERROR("Shadow Register Delta Error");
jilee 29:f71a0be59b99 1056 TFT.printf(sAWSError.c_str());
ampembeng 15:6f2798e45099 1057 return rc;
ampembeng 15:6f2798e45099 1058 }
ampembeng 15:6f2798e45099 1059
ampembeng 15:6f2798e45099 1060 INFO("Will attempt to sync with device shadow every %f seconds.", SHADOW_SYNC_INTERVAL);
ampembeng 15:6f2798e45099 1061 // Loop and publish changes from the FRDM board
jilee 29:f71a0be59b99 1062
jilee 29:f71a0be59b99 1063 while (NETWORK_ATTEMPTING_RECONNECT == rc || RECONNECT_SUCCESSFUL == rc || NONE_ERROR == rc)
jilee 29:f71a0be59b99 1064 {
ampembeng 15:6f2798e45099 1065
ampembeng 15:6f2798e45099 1066 // Looks for incoming socket messages
ampembeng 15:6f2798e45099 1067 rc = aws_iot_shadow_yield(&mqttClient, 200);
jilee 29:f71a0be59b99 1068 if (NETWORK_ATTEMPTING_RECONNECT == rc)
jilee 29:f71a0be59b99 1069 {
ampembeng 15:6f2798e45099 1070 // If the client is attempting to reconnect we will skip the rest of the loop.
jilee 29:f71a0be59b99 1071 ShowINFO("Attempting to reconnect...");
ampembeng 15:6f2798e45099 1072 wait(1);
jilee 29:f71a0be59b99 1073 bFirstTime = true;
jilee 29:f71a0be59b99 1074 //TFT.cls();
ampembeng 15:6f2798e45099 1075 continue;
ampembeng 15:6f2798e45099 1076 }
ampembeng 20:ee34856ae510 1077
ampembeng 20:ee34856ae510 1078 // Read sensor data
ampembeng 20:ee34856ae510 1079 temperature = CTOF(hts221.readTemperature());
ampembeng 20:ee34856ae510 1080 humidity = hts221.readHumidity();
ampembeng 20:ee34856ae510 1081
ampembeng 15:6f2798e45099 1082 INFO("\n=======================================================================================\n");
ampembeng 15:6f2798e45099 1083 // Initialize JSON shadow document
ampembeng 15:6f2798e45099 1084 rc = aws_iot_shadow_init_json_document(JsonDocumentBuffer, sizeOfJsonDocumentBuffer);
jilee 29:f71a0be59b99 1085 if (rc == NONE_ERROR)
jilee 29:f71a0be59b99 1086 {
ampembeng 15:6f2798e45099 1087
ampembeng 15:6f2798e45099 1088 // If there has been a SW3 button press update the 'desired' color
jilee 29:f71a0be59b99 1089 if (buttonOverride)
jilee 29:f71a0be59b99 1090 {
ampembeng 23:b9ff83dc965f 1091 rc = aws_iot_shadow_add_desired(JsonDocumentBuffer, sizeOfJsonDocumentBuffer, 1, &ledController);
ampembeng 15:6f2798e45099 1092 buttonOverride = false;
Janos Follath 0:fc70c47eecb4 1093 }
ampembeng 15:6f2798e45099 1094
ampembeng 23:b9ff83dc965f 1095 // Updates the 'reported' color/temp/humidity
jilee 28:54d9a550adf1 1096 rc = aws_iot_shadow_add_reported(JsonDocumentBuffer, sizeOfJsonDocumentBuffer, 4, &ledController,
ampembeng 20:ee34856ae510 1097 &temperatureHandler,
jilee 28:54d9a550adf1 1098 &humidityHandler, &iccidHandler);
ampembeng 15:6f2798e45099 1099
jilee 29:f71a0be59b99 1100 if (rc == NONE_ERROR)
jilee 29:f71a0be59b99 1101 {
ampembeng 15:6f2798e45099 1102 rc = aws_iot_finalize_json_document(JsonDocumentBuffer, sizeOfJsonDocumentBuffer);
ampembeng 15:6f2798e45099 1103
jilee 29:f71a0be59b99 1104 if (rc == NONE_ERROR)
jilee 29:f71a0be59b99 1105 {
ampembeng 15:6f2798e45099 1106 INFO("Update Shadow: %s", JsonDocumentBuffer);
ampembeng 18:6370da1de572 1107 rc = aws_iot_shadow_update(&mqttClient, sp.pMyThingName, JsonDocumentBuffer,
ampembeng 15:6f2798e45099 1108 ShadowUpdateStatusCallback, NULL, 8, true);
ampembeng 15:6f2798e45099 1109 }
ampembeng 15:6f2798e45099 1110 }
ampembeng 20:ee34856ae510 1111 }
ampembeng 20:ee34856ae510 1112
jilee 29:f71a0be59b99 1113 //get signal strength
jilee 29:f71a0be59b99 1114 GetSignalStrength(&dbm);
jilee 29:f71a0be59b99 1115
jilee 29:f71a0be59b99 1116 //check if certificate is updated
jilee 29:f71a0be59b99 1117
jilee 29:f71a0be59b99 1118 if (GetUpdateStatus(&cUpdateStatus) != 0)
jilee 29:f71a0be59b99 1119 {
jilee 29:f71a0be59b99 1120 ERROR("Get Update Status Error");
jilee 29:f71a0be59b99 1121 }
jilee 29:f71a0be59b99 1122 else
jilee 29:f71a0be59b99 1123 {
jilee 29:f71a0be59b99 1124 if (cUpdateStatus == 0xFF)
jilee 29:f71a0be59b99 1125 {
jilee 29:f71a0be59b99 1126 TFT.cls();
jilee 29:f71a0be59b99 1127 TFT.locate(0,10);
jilee 29:f71a0be59b99 1128 ShowINFO ("Certifcate Update Detected.");
jilee 29:f71a0be59b99 1129 ShowINFO("Disconnecting AWS");
jilee 29:f71a0be59b99 1130 rc = aws_iot_shadow_disconnect(&mqttClient);
jilee 29:f71a0be59b99 1131 if (NONE_ERROR != rc)
jilee 29:f71a0be59b99 1132 {
jilee 29:f71a0be59b99 1133 ERROR("Disconnect error %d. Please reboot the device", rc);
jilee 29:f71a0be59b99 1134 return rc;
jilee 29:f71a0be59b99 1135 }
jilee 29:f71a0be59b99 1136
jilee 29:f71a0be59b99 1137 if (GetAllObjects() != 0)
jilee 29:f71a0be59b99 1138 {
jilee 29:f71a0be59b99 1139 ShowINFO ("Read Certficate Error. Check hardware and Reboot the device..");
jilee 29:f71a0be59b99 1140 return 0;
jilee 29:f71a0be59b99 1141 }
jilee 29:f71a0be59b99 1142
jilee 29:f71a0be59b99 1143 wait(3.0);
jilee 29:f71a0be59b99 1144 bFirstTime = true;
jilee 29:f71a0be59b99 1145 goto restart1;
jilee 29:f71a0be59b99 1146 }
jilee 29:f71a0be59b99 1147 }
jilee 29:f71a0be59b99 1148
jilee 29:f71a0be59b99 1149
jilee 29:f71a0be59b99 1150 // Print data
jilee 29:f71a0be59b99 1151 if (bFirstTime == true)
jilee 29:f71a0be59b99 1152 {
jilee 29:f71a0be59b99 1153 TFT.cls();
jilee 29:f71a0be59b99 1154 bFirstTime = false;
jilee 29:f71a0be59b99 1155 }
jilee 29:f71a0be59b99 1156 printDatatoTFT();
ampembeng 23:b9ff83dc965f 1157 printData();
ampembeng 18:6370da1de572 1158 INFO("*****************************************************************************************");
ampembeng 20:ee34856ae510 1159
ampembeng 20:ee34856ae510 1160 // Set the LED color
ampembeng 15:6f2798e45099 1161 SetLedColor(ledColor);
ampembeng 15:6f2798e45099 1162 wait(SHADOW_SYNC_INTERVAL);
jilee 29:f71a0be59b99 1163
jilee 29:f71a0be59b99 1164 if (count > 50)
jilee 29:f71a0be59b99 1165 {
jilee 29:f71a0be59b99 1166 INFO ("Max Upload reached. Please reset the device to start again");
jilee 29:f71a0be59b99 1167 TFT.printf ("Max upload reached. Please reset the device to continue.");
jilee 29:f71a0be59b99 1168 return rc;
jilee 29:f71a0be59b99 1169 }
jilee 29:f71a0be59b99 1170
Janos Follath 0:fc70c47eecb4 1171 }
Janos Follath 0:fc70c47eecb4 1172
jilee 29:f71a0be59b99 1173 if (NONE_ERROR != rc)
jilee 29:f71a0be59b99 1174 {
ampembeng 15:6f2798e45099 1175 ERROR("An error occurred in the loop %d", rc);
jilee 29:f71a0be59b99 1176 TFT.printf("Fatal Error. Please reboot the device.\n");
Janos Follath 0:fc70c47eecb4 1177 }
Janos Follath 0:fc70c47eecb4 1178
ampembeng 15:6f2798e45099 1179 INFO("Disconnecting");
ampembeng 15:6f2798e45099 1180 rc = aws_iot_shadow_disconnect(&mqttClient);
ampembeng 15:6f2798e45099 1181
ampembeng 15:6f2798e45099 1182 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 1183 ERROR("Disconnect error %d", rc);
Janos Follath 0:fc70c47eecb4 1184 }
Janos Follath 0:fc70c47eecb4 1185
ampembeng 15:6f2798e45099 1186 return rc;
ampembeng 15:6f2798e45099 1187 }