Public Repository for IoT demo, leveraging the FRDM-K64F, WNC Cellular Modem, and AT&T M2X platform. Expects GPIO input from a sensor to send a discrete value to M2X.
Dependencies: ConfigFile M2XStreamClient-JMF PinDetect SDFileSystem WNCInterface jsonlite mbed-rtos mbed
Fork of SVP_IoT_M2X_Cellular by
main.cpp@7:5f9a23deaca1, 2017-02-19 (annotated)
- Committer:
- geekbleek
- Date:
- Sun Feb 19 20:30:23 2017 +0000
- Revision:
- 7:5f9a23deaca1
- Parent:
- 6:67203388294b
- Child:
- 8:b18770740a4d
logic for M2X GPIO sensor input;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JMF | 0:62feed0f1fd9 | 1 | // |
JMF | 0:62feed0f1fd9 | 2 | // This file contains an example implementation of M2X using the HTTP interface as the underlying |
JMF | 0:62feed0f1fd9 | 3 | // transport. |
JMF | 0:62feed0f1fd9 | 4 | // |
JMF | 0:62feed0f1fd9 | 5 | |
JMF | 0:62feed0f1fd9 | 6 | #include "mbed.h" |
geekbleek | 5:f03cda4a4cc9 | 7 | #include "PinDetect.h" |
JMF | 0:62feed0f1fd9 | 8 | #include "WNCInterface.h" |
JMF | 0:62feed0f1fd9 | 9 | |
JMF | 0:62feed0f1fd9 | 10 | #define MBED_PLATFORM |
JMF | 0:62feed0f1fd9 | 11 | #define M2X_ENABLE_READER |
JMF | 0:62feed0f1fd9 | 12 | |
JMF | 0:62feed0f1fd9 | 13 | #include <jsonlite.h> |
JMF | 0:62feed0f1fd9 | 14 | #include "M2XStreamClient.h" |
JMF | 0:62feed0f1fd9 | 15 | |
JMF | 0:62feed0f1fd9 | 16 | #define CRLF "\n\r" |
JMF | 0:62feed0f1fd9 | 17 | |
geekbleek | 4:b9f2193b27cf | 18 | char deviceId[] = "3263056a467bc4eacd787bb0af9c1ad6"; // Device you want to post to |
geekbleek | 4:b9f2193b27cf | 19 | char m2xKey[] = "0aad274b67c7faa8110769ae9d739033"; // Your M2X API Key or Master API Key |
JMF | 0:62feed0f1fd9 | 20 | |
JMF | 0:62feed0f1fd9 | 21 | char fromTime[]= "1969-12-31T19:00:01.000Z"; // yyyy-mm-ddTHH:MM:SS.SSSZ |
JMF | 0:62feed0f1fd9 | 22 | char endTime[25]; |
JMF | 0:62feed0f1fd9 | 23 | |
geekbleek | 6:67203388294b | 24 | DigitalOut led_green(LED_GREEN); |
geekbleek | 6:67203388294b | 25 | DigitalOut led_red(LED_RED); |
geekbleek | 6:67203388294b | 26 | DigitalOut led_blue(LED_BLUE); |
geekbleek | 4:b9f2193b27cf | 27 | |
JMF | 0:62feed0f1fd9 | 28 | WNCInterface eth; |
JMF | 0:62feed0f1fd9 | 29 | Client client; |
JMF | 0:62feed0f1fd9 | 30 | M2XStreamClient m2xClient(&client, m2xKey); |
JMF | 0:62feed0f1fd9 | 31 | TimeService timeService(&m2xClient); |
JMF | 1:1c840717deea | 32 | MODSERIAL pc(USBTX,USBRX,256,256); |
JMF | 0:62feed0f1fd9 | 33 | |
geekbleek | 4:b9f2193b27cf | 34 | //******************************************************************************************************************************************** |
geekbleek | 4:b9f2193b27cf | 35 | //* Set the RGB LED's Color |
geekbleek | 4:b9f2193b27cf | 36 | //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue) |
geekbleek | 4:b9f2193b27cf | 37 | //******************************************************************************************************************************************** |
geekbleek | 6:67203388294b | 38 | void SetLedColor(unsigned char ucColor) |
geekbleek | 6:67203388294b | 39 | { |
geekbleek | 6:67203388294b | 40 | //Note that when an LED is on, you write a 0 to it: |
geekbleek | 6:67203388294b | 41 | led_red = !(ucColor & 0x1); //bit 0 |
geekbleek | 6:67203388294b | 42 | led_green = !(ucColor & 0x2); //bit 1 |
geekbleek | 6:67203388294b | 43 | led_blue = !(ucColor & 0x4); //bit 2 |
geekbleek | 6:67203388294b | 44 | } //SetLedColor() |
geekbleek | 5:f03cda4a4cc9 | 45 | |
geekbleek | 5:f03cda4a4cc9 | 46 | |
geekbleek | 5:f03cda4a4cc9 | 47 | |
geekbleek | 5:f03cda4a4cc9 | 48 | /* |
geekbleek | 5:f03cda4a4cc9 | 49 | * Note, the PinDetect can be defined thus:- |
geekbleek | 5:f03cda4a4cc9 | 50 | * PinDetect pin( p21, PullDown ); |
geekbleek | 5:f03cda4a4cc9 | 51 | * This allows you to specify the DigitalIn pinmode |
geekbleek | 5:f03cda4a4cc9 | 52 | * when you create the PinDetect object. This means |
geekbleek | 5:f03cda4a4cc9 | 53 | * using pin.mode() later is then no longer required. |
geekbleek | 5:f03cda4a4cc9 | 54 | */ |
geekbleek | 6:67203388294b | 55 | |
geekbleek | 6:67203388294b | 56 | PinDetect pin ( A4, PullUp ); |
geekbleek | 6:67203388294b | 57 | PinDetect button ( SW3, PullUp ); |
geekbleek | 6:67203388294b | 58 | int pinState; |
geekbleek | 6:67203388294b | 59 | |
geekbleek | 5:f03cda4a4cc9 | 60 | // C function callbacks follow. |
geekbleek | 5:f03cda4a4cc9 | 61 | |
geekbleek | 5:f03cda4a4cc9 | 62 | void keyPressed( void ) { |
geekbleek | 6:67203388294b | 63 | pinState = pinState++; |
geekbleek | 6:67203388294b | 64 | SetLedColor(1); |
geekbleek | 6:67203388294b | 65 | //pc.printf("Key Pressed\n"); |
geekbleek | 5:f03cda4a4cc9 | 66 | } |
geekbleek | 5:f03cda4a4cc9 | 67 | |
geekbleek | 5:f03cda4a4cc9 | 68 | void keyReleased( void ) { |
geekbleek | 6:67203388294b | 69 | pinState = pinState--; |
geekbleek | 6:67203388294b | 70 | if(pinState == 0){ |
geekbleek | 6:67203388294b | 71 | SetLedColor(4); |
geekbleek | 6:67203388294b | 72 | }; |
geekbleek | 6:67203388294b | 73 | //pc.printf("Key Released\n"); |
geekbleek | 5:f03cda4a4cc9 | 74 | } |
geekbleek | 5:f03cda4a4cc9 | 75 | |
geekbleek | 5:f03cda4a4cc9 | 76 | void keyPressedHeld( void ) { |
geekbleek | 6:67203388294b | 77 | pinState = 2; |
geekbleek | 6:67203388294b | 78 | //led3 = 1; |
geekbleek | 6:67203388294b | 79 | //pc.printf("Key Pressed Held\n"); |
geekbleek | 5:f03cda4a4cc9 | 80 | } |
geekbleek | 5:f03cda4a4cc9 | 81 | |
geekbleek | 5:f03cda4a4cc9 | 82 | void keyReleasedHeld( void ) { |
geekbleek | 6:67203388294b | 83 | //led4 = 1; |
geekbleek | 6:67203388294b | 84 | //pc.printf("Key Released Held\n"); |
geekbleek | 5:f03cda4a4cc9 | 85 | } |
geekbleek | 7:5f9a23deaca1 | 86 | |
geekbleek | 7:5f9a23deaca1 | 87 | void initModem() { |
geekbleek | 7:5f9a23deaca1 | 88 | int response; |
geekbleek | 7:5f9a23deaca1 | 89 | pc.printf("Start m2x-demo-all by initializing the network" CRLF); |
geekbleek | 7:5f9a23deaca1 | 90 | eth.doDebug(2); |
geekbleek | 7:5f9a23deaca1 | 91 | response = eth.init(NULL, &pc); |
geekbleek | 7:5f9a23deaca1 | 92 | pc.printf("Response is: %d" CRLF, response); |
geekbleek | 7:5f9a23deaca1 | 93 | pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response); |
geekbleek | 7:5f9a23deaca1 | 94 | while( !response ) { |
geekbleek | 7:5f9a23deaca1 | 95 | SetLedColor(0); |
geekbleek | 7:5f9a23deaca1 | 96 | pc.printf(" - - - - - - - WAITING FOR CELL MODEM TO COME ONLINE - - - - - - - " CRLF); |
geekbleek | 7:5f9a23deaca1 | 97 | wait(30); |
geekbleek | 7:5f9a23deaca1 | 98 | response = eth.init(NULL, &pc); |
geekbleek | 7:5f9a23deaca1 | 99 | pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response); |
geekbleek | 7:5f9a23deaca1 | 100 | }; |
geekbleek | 7:5f9a23deaca1 | 101 | |
geekbleek | 7:5f9a23deaca1 | 102 | if(response){ |
geekbleek | 7:5f9a23deaca1 | 103 | eth.doDebug(0); |
geekbleek | 7:5f9a23deaca1 | 104 | SetLedColor(2); |
geekbleek | 7:5f9a23deaca1 | 105 | }; |
geekbleek | 7:5f9a23deaca1 | 106 | |
geekbleek | 7:5f9a23deaca1 | 107 | response = eth.connect(); |
geekbleek | 7:5f9a23deaca1 | 108 | pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress()); |
geekbleek | 7:5f9a23deaca1 | 109 | |
geekbleek | 7:5f9a23deaca1 | 110 | } |
geekbleek | 7:5f9a23deaca1 | 111 | |
geekbleek | 7:5f9a23deaca1 | 112 | void initM2X() { |
geekbleek | 7:5f9a23deaca1 | 113 | pc.printf("starting M2X data push..." CRLF); |
geekbleek | 7:5f9a23deaca1 | 114 | |
geekbleek | 7:5f9a23deaca1 | 115 | pc.printf("initialize the M2X time service" CRLF); |
geekbleek | 7:5f9a23deaca1 | 116 | if (!m2x_status_is_success(timeService.init())) |
geekbleek | 7:5f9a23deaca1 | 117 | pc.printf("Cannot initialize time service!" CRLF); |
geekbleek | 7:5f9a23deaca1 | 118 | else { |
geekbleek | 7:5f9a23deaca1 | 119 | timeService.getTimestamp(timestamp, &length); |
geekbleek | 7:5f9a23deaca1 | 120 | pc.printf("Current timestamp: %s" CRLF, timestamp); |
geekbleek | 7:5f9a23deaca1 | 121 | strcpy(endTime,timestamp); |
geekbleek | 7:5f9a23deaca1 | 122 | SetLedColor(4); |
geekbleek | 7:5f9a23deaca1 | 123 | } |
geekbleek | 7:5f9a23deaca1 | 124 | } |
geekbleek | 5:f03cda4a4cc9 | 125 | |
geekbleek | 5:f03cda4a4cc9 | 126 | // The main program. |
geekbleek | 5:f03cda4a4cc9 | 127 | |
JMF | 0:62feed0f1fd9 | 128 | int main() { |
geekbleek | 6:67203388294b | 129 | pinState = 0; |
geekbleek | 4:b9f2193b27cf | 130 | pc.baud(115200); |
geekbleek | 6:67203388294b | 131 | pc.printf("Hello World! I am here!" CRLF); |
geekbleek | 5:f03cda4a4cc9 | 132 | pin.attach_asserted( &keyPressed ); |
geekbleek | 5:f03cda4a4cc9 | 133 | pin.attach_deasserted( &keyReleased ); |
geekbleek | 6:67203388294b | 134 | button.attach_asserted( &keyPressed ); |
geekbleek | 6:67203388294b | 135 | button.attach_deasserted( &keyReleased ); |
geekbleek | 6:67203388294b | 136 | //pin.attach_asserted_held( &keyPressedHeld ); |
geekbleek | 4:b9f2193b27cf | 137 | |
geekbleek | 5:f03cda4a4cc9 | 138 | // This callback will often be of little use as it's |
geekbleek | 5:f03cda4a4cc9 | 139 | // called after every assertion/deassertion. However, |
geekbleek | 5:f03cda4a4cc9 | 140 | // it's provided for completeness. You may find a use |
geekbleek | 5:f03cda4a4cc9 | 141 | // for it. If not, just don't attach a callback and it |
geekbleek | 5:f03cda4a4cc9 | 142 | // will not activate. |
geekbleek | 6:67203388294b | 143 | //pin.attach_deasserted_held( &keyReleasedHeld ); |
JMF | 0:62feed0f1fd9 | 144 | |
geekbleek | 5:f03cda4a4cc9 | 145 | // You can define how many continuous samples must be |
geekbleek | 5:f03cda4a4cc9 | 146 | // asserted before the attach_asserted() function is called. |
geekbleek | 5:f03cda4a4cc9 | 147 | // pin.setSamplesTillAssert( 10 ); |
geekbleek | 5:f03cda4a4cc9 | 148 | // This would mean 10 * 20ms debounce time = 200ms. |
geekbleek | 5:f03cda4a4cc9 | 149 | |
geekbleek | 5:f03cda4a4cc9 | 150 | // You can define how many continuous samples must be |
geekbleek | 5:f03cda4a4cc9 | 151 | // asserted before the attach_asserted_held() function is called. |
geekbleek | 5:f03cda4a4cc9 | 152 | // pin.setSamplesTillHeld( 200 ); |
geekbleek | 5:f03cda4a4cc9 | 153 | // This would mean 200 * 20ms debounce time = 2seconds. |
geekbleek | 5:f03cda4a4cc9 | 154 | |
geekbleek | 5:f03cda4a4cc9 | 155 | // By default, "asserted" assumes the pin going high from 0volts to 5volts |
geekbleek | 5:f03cda4a4cc9 | 156 | // and deasserted assumes going from 5volts to 0volts. You can invert this |
geekbleek | 5:f03cda4a4cc9 | 157 | // logic so that going to 0volts is asserted and going to 5volts is deasserted |
geekbleek | 5:f03cda4a4cc9 | 158 | // using this setup function:- |
geekbleek | 6:67203388294b | 159 | pin.setAssertValue( 0 ); |
geekbleek | 6:67203388294b | 160 | button.setAssertValue( 0 ); |
geekbleek | 5:f03cda4a4cc9 | 161 | |
geekbleek | 7:5f9a23deaca1 | 162 | |
geekbleek | 7:5f9a23deaca1 | 163 | |
geekbleek | 7:5f9a23deaca1 | 164 | |
geekbleek | 7:5f9a23deaca1 | 165 | char timestamp[25]; |
geekbleek | 7:5f9a23deaca1 | 166 | int length = 25; |
geekbleek | 7:5f9a23deaca1 | 167 | int m2xresponse, cnt=1; |
geekbleek | 7:5f9a23deaca1 | 168 | int pinValue; |
geekbleek | 7:5f9a23deaca1 | 169 | |
geekbleek | 7:5f9a23deaca1 | 170 | wait(20); |
geekbleek | 7:5f9a23deaca1 | 171 | initModem(); //call function to init modem, wait till it comes online, and get IP address |
geekbleek | 7:5f9a23deaca1 | 172 | initM2X{}; |
geekbleek | 7:5f9a23deaca1 | 173 | |
geekbleek | 7:5f9a23deaca1 | 174 | // //debug |
geekbleek | 7:5f9a23deaca1 | 175 | // wait(10); // wait for terminal connected |
geekbleek | 7:5f9a23deaca1 | 176 | // pc.printf("STARTING WNCInterface" CRLF); |
geekbleek | 7:5f9a23deaca1 | 177 | // eth.doDebug(0); // if you want a LOT of AT commands logged (1) |
geekbleek | 7:5f9a23deaca1 | 178 | // |
geekbleek | 7:5f9a23deaca1 | 179 | // // init and connect the WNCInterface cell modem |
geekbleek | 7:5f9a23deaca1 | 180 | // pc.printf("init() returned 0x%04X" CRLF, eth.init()); |
geekbleek | 7:5f9a23deaca1 | 181 | // response = eth.connect(); |
geekbleek | 7:5f9a23deaca1 | 182 | // |
geekbleek | 7:5f9a23deaca1 | 183 | // if(response){ |
geekbleek | 7:5f9a23deaca1 | 184 | // SetLedColor(2); |
geekbleek | 7:5f9a23deaca1 | 185 | // }; |
geekbleek | 7:5f9a23deaca1 | 186 | |
geekbleek | 7:5f9a23deaca1 | 187 | // pc.printf("IP Address: %s " CRLF, eth.getIPAddress()); |
geekbleek | 7:5f9a23deaca1 | 188 | // pc.printf("-------------------------------------" CRLF); |
geekbleek | 7:5f9a23deaca1 | 189 | |
geekbleek | 7:5f9a23deaca1 | 190 | |
geekbleek | 7:5f9a23deaca1 | 191 | // Start Pin Samping |
geekbleek | 5:f03cda4a4cc9 | 192 | // Sampling does NOT begin until you set the frequency. So, until |
geekbleek | 5:f03cda4a4cc9 | 193 | // you call this function NO callbacks will be made. With no arguments |
geekbleek | 5:f03cda4a4cc9 | 194 | // passed the default is 20000 microseconds (20ms). Specifiy the sampling |
geekbleek | 5:f03cda4a4cc9 | 195 | // period in microseconds if you want a different value to 20ms. |
geekbleek | 5:f03cda4a4cc9 | 196 | // For example, for a sampling period of 10ms do:- |
geekbleek | 5:f03cda4a4cc9 | 197 | // pin.setSampleFrequency( 10000 ); |
geekbleek | 5:f03cda4a4cc9 | 198 | // Note, if you change the sampling frequency you will probably also |
geekbleek | 5:f03cda4a4cc9 | 199 | // want to change the number of samples till assert and held as show |
geekbleek | 5:f03cda4a4cc9 | 200 | // above. |
geekbleek | 5:f03cda4a4cc9 | 201 | pin.setSampleFrequency(); // Defaults to 20ms. |
geekbleek | 6:67203388294b | 202 | button.setSampleFrequency(); |
geekbleek | 6:67203388294b | 203 | |
geekbleek | 5:f03cda4a4cc9 | 204 | while( 1 ) { |
geekbleek | 6:67203388294b | 205 | //pc.printf("Hello World! I am still here!" CRLF); |
geekbleek | 6:67203388294b | 206 | pc.printf("Pin state is: %d" CRLF, pinState); |
geekbleek | 7:5f9a23deaca1 | 207 | if(pinState >= 1){ |
geekbleek | 7:5f9a23deaca1 | 208 | pinValue = 1; |
geekbleek | 7:5f9a23deaca1 | 209 | } |
geekbleek | 7:5f9a23deaca1 | 210 | else { |
geekbleek | 7:5f9a23deaca1 | 211 | pinValue = 0; |
geekbleek | 7:5f9a23deaca1 | 212 | } |
geekbleek | 7:5f9a23deaca1 | 213 | pc.printf("Pin value is: %d" CRLF, pinValue); |
geekbleek | 6:67203388294b | 214 | pc.printf("cnt=%d\r\n",cnt++); |
geekbleek | 6:67203388294b | 215 | // post the temp value |
geekbleek | 7:5f9a23deaca1 | 216 | pc.printf("Post updateStreamValue (pinValue = %d)..." CRLF, pinState); |
geekbleek | 7:5f9a23deaca1 | 217 | m2xresponse = m2xClient.updateStreamValue(deviceId, "water-sensor", pinValue); |
geekbleek | 7:5f9a23deaca1 | 218 | pc.printf("Post response code: %d" CRLF, m2xresponse); |
geekbleek | 7:5f9a23deaca1 | 219 | if (m2xresponse != 202){ |
geekbleek | 7:5f9a23deaca1 | 220 | SetLedColor(2); |
geekbleek | 7:5f9a23deaca1 | 221 | pc.printf("Error connecting to M2X" CRLF); |
geekbleek | 7:5f9a23deaca1 | 222 | //pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress()); |
geekbleek | 7:5f9a23deaca1 | 223 | if (m2xresponse == -1){ |
geekbleek | 7:5f9a23deaca1 | 224 | pc.printf("Modem Error - attempting to reconnect" CRLF); |
geekbleek | 7:5f9a23deaca1 | 225 | initModem(); |
geekbleek | 7:5f9a23deaca1 | 226 | initM2X(); |
geekbleek | 7:5f9a23deaca1 | 227 | } |
geekbleek | 7:5f9a23deaca1 | 228 | } |
geekbleek | 6:67203388294b | 229 | timeService.getTimestamp(timestamp, &length); |
geekbleek | 6:67203388294b | 230 | pc.printf("Thats all folks, got to wait 5 seconds... (%s)" CRLF CRLF CRLF, timestamp); |
geekbleek | 6:67203388294b | 231 | |
geekbleek | 6:67203388294b | 232 | // wait 5 secs and then loop |
geekbleek | 6:67203388294b | 233 | delay(5000); |
geekbleek | 4:b9f2193b27cf | 234 | } |
geekbleek | 5:f03cda4a4cc9 | 235 | } |