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