V.062 11/3
Dependencies: FT6206 SDFileSystem ILI9341_t3
Fork of ATT_AWS_IoT_demo_v06 by
main.cpp@29:f71a0be59b99, 2017-11-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |