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@5:f03cda4a4cc9, 2017-02-18 (annotated)
- Committer:
- geekbleek
- Date:
- Sat Feb 18 22:51:09 2017 +0000
- Revision:
- 5:f03cda4a4cc9
- Parent:
- 4:b9f2193b27cf
- Child:
- 6:67203388294b
asdf
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 | const char *hstreamName = "humidity"; |
JMF | 0:62feed0f1fd9 | 22 | const char *tstreamName = "temperature"; |
JMF | 0:62feed0f1fd9 | 23 | const char *streamNames[] = { tstreamName, hstreamName }; |
JMF | 0:62feed0f1fd9 | 24 | char name[] = "Wake Forest"; // Name of current location of datasource |
JMF | 0:62feed0f1fd9 | 25 | |
JMF | 0:62feed0f1fd9 | 26 | int counts[] = { 2, 1 }; |
JMF | 0:62feed0f1fd9 | 27 | const char *ats[] = { "2016-09-09T02:05:14.692Z", |
JMF | 0:62feed0f1fd9 | 28 | "2016-09-09T02:05:14.700Z", |
JMF | 0:62feed0f1fd9 | 29 | "2016-09-09T02:05:14.692Z" }; |
JMF | 0:62feed0f1fd9 | 30 | double values[] = { 10.9, 11.2, 6.1 }; |
JMF | 0:62feed0f1fd9 | 31 | |
JMF | 0:62feed0f1fd9 | 32 | char fromTime[]= "1969-12-31T19:00:01.000Z"; // yyyy-mm-ddTHH:MM:SS.SSSZ |
JMF | 0:62feed0f1fd9 | 33 | char endTime[25]; |
JMF | 0:62feed0f1fd9 | 34 | |
JMF | 0:62feed0f1fd9 | 35 | double latitude = 33.007872; // You could read these values from a GPS but |
JMF | 0:62feed0f1fd9 | 36 | double longitude = -96.751614; // for now, will just hardcode them |
JMF | 0:62feed0f1fd9 | 37 | double elevation = 697.00; |
JMF | 0:62feed0f1fd9 | 38 | |
geekbleek | 5:f03cda4a4cc9 | 39 | //DigitalIn mypin(A2); |
geekbleek | 5:f03cda4a4cc9 | 40 | //DigitalOut led_green(LED_GREEN); |
geekbleek | 5:f03cda4a4cc9 | 41 | //DigitalOut led_red(LED_RED); |
geekbleek | 5:f03cda4a4cc9 | 42 | //DigitalOut led_blue(LED_BLUE); |
geekbleek | 4:b9f2193b27cf | 43 | |
geekbleek | 4:b9f2193b27cf | 44 | |
JMF | 0:62feed0f1fd9 | 45 | WNCInterface eth; |
JMF | 0:62feed0f1fd9 | 46 | Client client; |
JMF | 0:62feed0f1fd9 | 47 | M2XStreamClient m2xClient(&client, m2xKey); |
JMF | 0:62feed0f1fd9 | 48 | TimeService timeService(&m2xClient); |
JMF | 1:1c840717deea | 49 | MODSERIAL pc(USBTX,USBRX,256,256); |
JMF | 0:62feed0f1fd9 | 50 | |
JMF | 0:62feed0f1fd9 | 51 | void on_data_point_found(const char* at, const char* value, int index, void* context, int type) { |
JMF | 2:eb0768c06c1b | 52 | pc.printf(">>Found a data point, index: %d type: %d" CRLF, index, type); |
JMF | 2:eb0768c06c1b | 53 | pc.printf(">>At: %s" CRLF " Value: %s" CRLF, at, value); |
JMF | 0:62feed0f1fd9 | 54 | } |
JMF | 0:62feed0f1fd9 | 55 | |
JMF | 0:62feed0f1fd9 | 56 | |
JMF | 0:62feed0f1fd9 | 57 | void on_command_found(const char* id, const char* name, int index, void *context) { |
JMF | 2:eb0768c06c1b | 58 | pc.printf(">>Found a command, index: %d" CRLF, index); |
JMF | 2:eb0768c06c1b | 59 | pc.printf(">>ID: %s\n Name: %s" CRLF, id, name); |
JMF | 0:62feed0f1fd9 | 60 | } |
JMF | 0:62feed0f1fd9 | 61 | |
JMF | 0:62feed0f1fd9 | 62 | void on_location_found(const char* name, |
JMF | 0:62feed0f1fd9 | 63 | double latitude, |
JMF | 0:62feed0f1fd9 | 64 | double longitude, |
JMF | 0:62feed0f1fd9 | 65 | double elevation, |
JMF | 0:62feed0f1fd9 | 66 | const char* timestamp, |
JMF | 0:62feed0f1fd9 | 67 | int index, |
JMF | 0:62feed0f1fd9 | 68 | void* context) { |
JMF | 2:eb0768c06c1b | 69 | pc.printf(">>Found a location, index: %d" CRLF, index); |
JMF | 2:eb0768c06c1b | 70 | pc.printf(">>Name: %s" CRLF ">>Latitude: %lf" CRLF ">>Longitude: %lf" CRLF, name, latitude, longitude); |
JMF | 2:eb0768c06c1b | 71 | pc.printf(">>Elevation: %lf" CRLF ">>Timestamp: %s" CRLF, elevation, timestamp); |
JMF | 0:62feed0f1fd9 | 72 | } |
JMF | 0:62feed0f1fd9 | 73 | |
geekbleek | 4:b9f2193b27cf | 74 | //******************************************************************************************************************************************** |
geekbleek | 4:b9f2193b27cf | 75 | //* Set the RGB LED's Color |
geekbleek | 4:b9f2193b27cf | 76 | //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue) |
geekbleek | 4:b9f2193b27cf | 77 | //******************************************************************************************************************************************** |
geekbleek | 5:f03cda4a4cc9 | 78 | //void SetLedColor(unsigned char ucColor) |
geekbleek | 5:f03cda4a4cc9 | 79 | //{ |
geekbleek | 5:f03cda4a4cc9 | 80 | // //Note that when an LED is on, you write a 0 to it: |
geekbleek | 5:f03cda4a4cc9 | 81 | // led_red = !(ucColor & 0x1); //bit 0 |
geekbleek | 5:f03cda4a4cc9 | 82 | // led_green = !(ucColor & 0x2); //bit 1 |
geekbleek | 5:f03cda4a4cc9 | 83 | // led_blue = !(ucColor & 0x4); //bit 2 |
geekbleek | 5:f03cda4a4cc9 | 84 | //} //SetLedColor() |
geekbleek | 4:b9f2193b27cf | 85 | |
geekbleek | 4:b9f2193b27cf | 86 | |
geekbleek | 4:b9f2193b27cf | 87 | |
geekbleek | 4:b9f2193b27cf | 88 | |
geekbleek | 4:b9f2193b27cf | 89 | //int main() { |
geekbleek | 4:b9f2193b27cf | 90 | // char timestamp[25]; |
geekbleek | 4:b9f2193b27cf | 91 | // int length = 25; |
geekbleek | 4:b9f2193b27cf | 92 | // char amb_temp[6]; |
geekbleek | 4:b9f2193b27cf | 93 | // char amb_humd[6]; |
geekbleek | 4:b9f2193b27cf | 94 | // int response, cnt=1; |
geekbleek | 4:b9f2193b27cf | 95 | // double temp=0.00; //we will just increment these 0.01 each time through the loop |
geekbleek | 4:b9f2193b27cf | 96 | // double humid=0.00; //we will just increment these 1 each time through the loop wrapping at 100 |
geekbleek | 4:b9f2193b27cf | 97 | // |
geekbleek | 4:b9f2193b27cf | 98 | // pc.baud(115200); |
geekbleek | 4:b9f2193b27cf | 99 | // pc.printf("Start m2x-demo-all by initializng the network" CRLF); |
geekbleek | 4:b9f2193b27cf | 100 | // response = eth.init(); |
geekbleek | 4:b9f2193b27cf | 101 | // pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response); |
geekbleek | 4:b9f2193b27cf | 102 | // if( !response ) { |
geekbleek | 4:b9f2193b27cf | 103 | // pc.printf(" - - - - - - - ALL DONE - - - - - - - " CRLF); |
geekbleek | 4:b9f2193b27cf | 104 | // while(1); |
geekbleek | 4:b9f2193b27cf | 105 | // } |
geekbleek | 4:b9f2193b27cf | 106 | // |
geekbleek | 4:b9f2193b27cf | 107 | // response = eth.connect(); |
geekbleek | 4:b9f2193b27cf | 108 | // pc.printf("IP Address: %s " CRLF CRLF, eth.getIPAddress()); |
geekbleek | 4:b9f2193b27cf | 109 | // |
geekbleek | 4:b9f2193b27cf | 110 | // pc.printf("initialize the M2X time service" CRLF); |
geekbleek | 4:b9f2193b27cf | 111 | // if (!m2x_status_is_success(timeService.init())) |
geekbleek | 4:b9f2193b27cf | 112 | // pc.printf("Cannot initialize time service!" CRLF); |
geekbleek | 4:b9f2193b27cf | 113 | // else { |
geekbleek | 4:b9f2193b27cf | 114 | // timeService.getTimestamp(timestamp, &length); |
geekbleek | 4:b9f2193b27cf | 115 | // pc.printf("Current timestamp: %s" CRLF, timestamp); |
geekbleek | 4:b9f2193b27cf | 116 | // strcpy(endTime,timestamp); |
geekbleek | 4:b9f2193b27cf | 117 | // } |
geekbleek | 4:b9f2193b27cf | 118 | // |
geekbleek | 4:b9f2193b27cf | 119 | //// pc.printf("Now delete all existing values" CRLF); |
geekbleek | 4:b9f2193b27cf | 120 | //// // Delete values |
geekbleek | 4:b9f2193b27cf | 121 | //// pc.printf("Delete humidity values..." CRLF); |
geekbleek | 4:b9f2193b27cf | 122 | //// response = m2xClient.deleteValues(deviceId,hstreamName, fromTime, endTime); |
geekbleek | 4:b9f2193b27cf | 123 | //// pc.printf("Delete response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 124 | //// |
geekbleek | 4:b9f2193b27cf | 125 | //// pc.printf("Delete temp values..." CRLF); |
geekbleek | 4:b9f2193b27cf | 126 | //// response = m2xClient.deleteValues(deviceId,tstreamName, fromTime, endTime); |
geekbleek | 4:b9f2193b27cf | 127 | //// pc.printf("Delete response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 128 | //// |
geekbleek | 4:b9f2193b27cf | 129 | //// pc.printf("Delete location values..." CRLF); |
geekbleek | 4:b9f2193b27cf | 130 | //// response = m2xClient.deleteLocations(deviceId, fromTime, endTime); |
geekbleek | 4:b9f2193b27cf | 131 | //// pc.printf("Delete response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 132 | // |
geekbleek | 4:b9f2193b27cf | 133 | // pc.printf("Query for possible commands using this device..." CRLF); |
geekbleek | 4:b9f2193b27cf | 134 | // response = m2xClient.listCommands(deviceId, on_command_found, NULL); |
geekbleek | 4:b9f2193b27cf | 135 | // pc.printf("listCommands response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 136 | // |
geekbleek | 4:b9f2193b27cf | 137 | // |
geekbleek | 4:b9f2193b27cf | 138 | // |
geekbleek | 4:b9f2193b27cf | 139 | // |
geekbleek | 4:b9f2193b27cf | 140 | // while (true) { |
geekbleek | 4:b9f2193b27cf | 141 | // // read temp -- for now, just use a fixed temp, but will need to read the HTS221 |
geekbleek | 4:b9f2193b27cf | 142 | // // and put it into a 6 byte string formatted as "%0.2f" |
geekbleek | 4:b9f2193b27cf | 143 | // sprintf(amb_temp,"%0.2f",temp); |
geekbleek | 4:b9f2193b27cf | 144 | // sprintf(amb_humd,"%0.2f",humid); |
geekbleek | 4:b9f2193b27cf | 145 | // temp += .01; |
geekbleek | 4:b9f2193b27cf | 146 | // humid += 1.0; |
geekbleek | 4:b9f2193b27cf | 147 | // humid = fmod(humid,100.0); |
geekbleek | 4:b9f2193b27cf | 148 | // pc.printf("cnt=%d\r\n",cnt++); |
geekbleek | 4:b9f2193b27cf | 149 | // |
geekbleek | 4:b9f2193b27cf | 150 | // // post the temp value |
geekbleek | 4:b9f2193b27cf | 151 | // //pc.printf("Post updateStreamValue (temp)..." CRLF); |
geekbleek | 4:b9f2193b27cf | 152 | //// response = m2xClient.updateStreamValue(deviceId, "water-sensor", temp); |
geekbleek | 4:b9f2193b27cf | 153 | //// pc.printf("Post response code: %d" CRLF, response); |
geekbleek | 4:b9f2193b27cf | 154 | // |
geekbleek | 4:b9f2193b27cf | 155 | // timeService.getTimestamp(timestamp, &length); |
geekbleek | 4:b9f2193b27cf | 156 | // pc.printf("Thats all folks, got to wait 5 seconds... (%s)" CRLF CRLF CRLF, timestamp); |
geekbleek | 4:b9f2193b27cf | 157 | // |
geekbleek | 4:b9f2193b27cf | 158 | // // wait 5 secs and then loop |
geekbleek | 4:b9f2193b27cf | 159 | // delay(5000); |
geekbleek | 4:b9f2193b27cf | 160 | // |
geekbleek | 4:b9f2193b27cf | 161 | // |
geekbleek | 4:b9f2193b27cf | 162 | // } |
geekbleek | 4:b9f2193b27cf | 163 | //} |
geekbleek | 4:b9f2193b27cf | 164 | |
geekbleek | 4:b9f2193b27cf | 165 | |
geekbleek | 4:b9f2193b27cf | 166 | |
geekbleek | 4:b9f2193b27cf | 167 | |
geekbleek | 5:f03cda4a4cc9 | 168 | //int main() { |
geekbleek | 5:f03cda4a4cc9 | 169 | // int response, cnt=1; |
geekbleek | 5:f03cda4a4cc9 | 170 | // pc.baud(115200); |
geekbleek | 5:f03cda4a4cc9 | 171 | // pc.printf("Start m2x-demo-all by initializng the network" CRLF); |
geekbleek | 5:f03cda4a4cc9 | 172 | // response = eth.init(); |
geekbleek | 5:f03cda4a4cc9 | 173 | // pc.printf("WNC Module %s initialized (%02X)." CRLF, response?"IS":"IS NOT", response); |
geekbleek | 5:f03cda4a4cc9 | 174 | // if( !response ) { |
geekbleek | 5:f03cda4a4cc9 | 175 | // pc.printf(" - - - - - - - ALL DONE - - - - - - - " CRLF); |
geekbleek | 5:f03cda4a4cc9 | 176 | // while(1); |
geekbleek | 5:f03cda4a4cc9 | 177 | // } |
geekbleek | 5:f03cda4a4cc9 | 178 | // |
geekbleek | 5:f03cda4a4cc9 | 179 | // // check mypin object is initialized and connected to a pin |
geekbleek | 5:f03cda4a4cc9 | 180 | // if(mypin.is_connected()) { |
geekbleek | 5:f03cda4a4cc9 | 181 | // pc.printf("mypin is connected and initialized! \n\r"); |
geekbleek | 5:f03cda4a4cc9 | 182 | // } |
geekbleek | 5:f03cda4a4cc9 | 183 | // |
geekbleek | 5:f03cda4a4cc9 | 184 | // // Optional: set mode as PullUp/PullDown/PullNone/OpenDrain |
geekbleek | 5:f03cda4a4cc9 | 185 | // mypin.mode(PullUp); |
geekbleek | 5:f03cda4a4cc9 | 186 | // |
geekbleek | 5:f03cda4a4cc9 | 187 | // while(true) { |
geekbleek | 5:f03cda4a4cc9 | 188 | // //pc.printf("mypin has value : %d \n\r", mypin.read()); |
geekbleek | 5:f03cda4a4cc9 | 189 | // if (mypin) { |
geekbleek | 5:f03cda4a4cc9 | 190 | // SetLedColor(1); |
geekbleek | 5:f03cda4a4cc9 | 191 | // }; |
geekbleek | 5:f03cda4a4cc9 | 192 | // if (!mypin) { |
geekbleek | 5:f03cda4a4cc9 | 193 | // SetLedColor(4); |
geekbleek | 5:f03cda4a4cc9 | 194 | // }; |
geekbleek | 5:f03cda4a4cc9 | 195 | // wait(0.25); |
geekbleek | 5:f03cda4a4cc9 | 196 | // } |
geekbleek | 5:f03cda4a4cc9 | 197 | //} |
geekbleek | 5:f03cda4a4cc9 | 198 | |
geekbleek | 5:f03cda4a4cc9 | 199 | |
geekbleek | 5:f03cda4a4cc9 | 200 | |
geekbleek | 5:f03cda4a4cc9 | 201 | //InterruptIn button(A2); |
geekbleek | 5:f03cda4a4cc9 | 202 | //DigitalOut red(LED_RED); |
geekbleek | 5:f03cda4a4cc9 | 203 | //DigitalOut blue(LED_BLUE); |
geekbleek | 5:f03cda4a4cc9 | 204 | // |
geekbleek | 5:f03cda4a4cc9 | 205 | //void flip() { |
geekbleek | 5:f03cda4a4cc9 | 206 | // red = !red; |
geekbleek | 5:f03cda4a4cc9 | 207 | // blue = !blue; |
geekbleek | 5:f03cda4a4cc9 | 208 | //}; |
geekbleek | 5:f03cda4a4cc9 | 209 | // |
geekbleek | 5:f03cda4a4cc9 | 210 | //int main() { |
geekbleek | 5:f03cda4a4cc9 | 211 | // blue = !blue; |
geekbleek | 5:f03cda4a4cc9 | 212 | // button.rise(&flip); |
geekbleek | 5:f03cda4a4cc9 | 213 | // button.fall(&flip); // attach the address of the flip function to the rising edge |
geekbleek | 5:f03cda4a4cc9 | 214 | //} |
geekbleek | 5:f03cda4a4cc9 | 215 | |
geekbleek | 5:f03cda4a4cc9 | 216 | //DigitalOut Red(LED1); |
geekbleek | 5:f03cda4a4cc9 | 217 | //DigitalOut Blue(LED3); |
geekbleek | 5:f03cda4a4cc9 | 218 | //InterruptIn Interrupt(A2); |
geekbleek | 5:f03cda4a4cc9 | 219 | // |
geekbleek | 5:f03cda4a4cc9 | 220 | // |
geekbleek | 5:f03cda4a4cc9 | 221 | //void blink() |
geekbleek | 5:f03cda4a4cc9 | 222 | //{ |
geekbleek | 5:f03cda4a4cc9 | 223 | // wait(.4); |
geekbleek | 5:f03cda4a4cc9 | 224 | // Red=1; |
geekbleek | 5:f03cda4a4cc9 | 225 | // Blue=0; |
geekbleek | 5:f03cda4a4cc9 | 226 | // wait(.4); |
geekbleek | 5:f03cda4a4cc9 | 227 | // Blue=1; |
geekbleek | 5:f03cda4a4cc9 | 228 | // wait(.4); |
geekbleek | 5:f03cda4a4cc9 | 229 | //} |
geekbleek | 5:f03cda4a4cc9 | 230 | // |
geekbleek | 5:f03cda4a4cc9 | 231 | //int main() |
geekbleek | 5:f03cda4a4cc9 | 232 | //{ |
geekbleek | 5:f03cda4a4cc9 | 233 | // Interrupt.mode(PullUp); // Enable internal pullup |
geekbleek | 5:f03cda4a4cc9 | 234 | // Interrupt.fall(&blink); |
geekbleek | 5:f03cda4a4cc9 | 235 | // Blue=1; |
geekbleek | 5:f03cda4a4cc9 | 236 | // while (1) |
geekbleek | 5:f03cda4a4cc9 | 237 | // { |
geekbleek | 5:f03cda4a4cc9 | 238 | // Red=!Red; |
geekbleek | 5:f03cda4a4cc9 | 239 | // wait(.4); |
geekbleek | 5:f03cda4a4cc9 | 240 | // } |
geekbleek | 5:f03cda4a4cc9 | 241 | //} |
geekbleek | 5:f03cda4a4cc9 | 242 | |
geekbleek | 5:f03cda4a4cc9 | 243 | |
geekbleek | 5:f03cda4a4cc9 | 244 | |
geekbleek | 5:f03cda4a4cc9 | 245 | |
geekbleek | 5:f03cda4a4cc9 | 246 | PinDetect pin ( A2 ); |
geekbleek | 5:f03cda4a4cc9 | 247 | DigitalOut led1( LED1 ); |
geekbleek | 5:f03cda4a4cc9 | 248 | DigitalOut led2( LED2 ); |
geekbleek | 5:f03cda4a4cc9 | 249 | DigitalOut led3( LED3 ); |
geekbleek | 5:f03cda4a4cc9 | 250 | DigitalOut led4( LED4 ); |
geekbleek | 5:f03cda4a4cc9 | 251 | |
geekbleek | 5:f03cda4a4cc9 | 252 | |
geekbleek | 5:f03cda4a4cc9 | 253 | |
geekbleek | 5:f03cda4a4cc9 | 254 | |
geekbleek | 5:f03cda4a4cc9 | 255 | /* |
geekbleek | 5:f03cda4a4cc9 | 256 | * Note, the PinDetect can be defined thus:- |
geekbleek | 5:f03cda4a4cc9 | 257 | * PinDetect pin( p21, PullDown ); |
geekbleek | 5:f03cda4a4cc9 | 258 | * This allows you to specify the DigitalIn pinmode |
geekbleek | 5:f03cda4a4cc9 | 259 | * when you create the PinDetect object. This means |
geekbleek | 5:f03cda4a4cc9 | 260 | * using pin.mode() later is then no longer required. |
geekbleek | 5:f03cda4a4cc9 | 261 | */ |
geekbleek | 5:f03cda4a4cc9 | 262 | |
geekbleek | 5:f03cda4a4cc9 | 263 | // C function callbacks follow. |
geekbleek | 5:f03cda4a4cc9 | 264 | |
geekbleek | 5:f03cda4a4cc9 | 265 | void keyPressed( void ) { |
geekbleek | 5:f03cda4a4cc9 | 266 | led2 = 1; |
geekbleek | 5:f03cda4a4cc9 | 267 | led3 = 0; |
geekbleek | 5:f03cda4a4cc9 | 268 | led4 = 0; |
geekbleek | 5:f03cda4a4cc9 | 269 | pc.printf("Key Pressed\n"); |
geekbleek | 5:f03cda4a4cc9 | 270 | } |
geekbleek | 5:f03cda4a4cc9 | 271 | |
geekbleek | 5:f03cda4a4cc9 | 272 | void keyReleased( void ) { |
geekbleek | 5:f03cda4a4cc9 | 273 | led2 = 0; |
geekbleek | 5:f03cda4a4cc9 | 274 | led3 = 0; |
geekbleek | 5:f03cda4a4cc9 | 275 | led4 = 0; |
geekbleek | 5:f03cda4a4cc9 | 276 | pc.printf("Key Released\n"); |
geekbleek | 5:f03cda4a4cc9 | 277 | } |
geekbleek | 5:f03cda4a4cc9 | 278 | |
geekbleek | 5:f03cda4a4cc9 | 279 | void keyPressedHeld( void ) { |
geekbleek | 5:f03cda4a4cc9 | 280 | led3 = 1; |
geekbleek | 5:f03cda4a4cc9 | 281 | pc.printf("Key Pressed Held\n"); |
geekbleek | 5:f03cda4a4cc9 | 282 | } |
geekbleek | 5:f03cda4a4cc9 | 283 | |
geekbleek | 5:f03cda4a4cc9 | 284 | void keyReleasedHeld( void ) { |
geekbleek | 5:f03cda4a4cc9 | 285 | led4 = 1; |
geekbleek | 5:f03cda4a4cc9 | 286 | pc.printf("Key Released Held\n"); |
geekbleek | 5:f03cda4a4cc9 | 287 | } |
geekbleek | 5:f03cda4a4cc9 | 288 | |
geekbleek | 5:f03cda4a4cc9 | 289 | // The main program. |
geekbleek | 5:f03cda4a4cc9 | 290 | |
JMF | 0:62feed0f1fd9 | 291 | int main() { |
geekbleek | 4:b9f2193b27cf | 292 | pc.baud(115200); |
geekbleek | 5:f03cda4a4cc9 | 293 | led1 = 0 |
geekbleek | 5:f03cda4a4cc9 | 294 | led2 = 0 |
geekbleek | 5:f03cda4a4cc9 | 295 | led3 = 0 |
geekbleek | 5:f03cda4a4cc9 | 296 | led4 = 0 |
geekbleek | 5:f03cda4a4cc9 | 297 | pc.printf("Hello World! I am here!\n"); |
geekbleek | 5:f03cda4a4cc9 | 298 | pin.mode( PullUp ); |
geekbleek | 5:f03cda4a4cc9 | 299 | pin.attach_asserted( &keyPressed ); |
geekbleek | 5:f03cda4a4cc9 | 300 | pin.attach_deasserted( &keyReleased ); |
geekbleek | 5:f03cda4a4cc9 | 301 | pin.attach_asserted_held( &keyPressedHeld ); |
geekbleek | 4:b9f2193b27cf | 302 | |
geekbleek | 5:f03cda4a4cc9 | 303 | // This callback will often be of little use as it's |
geekbleek | 5:f03cda4a4cc9 | 304 | // called after every assertion/deassertion. However, |
geekbleek | 5:f03cda4a4cc9 | 305 | // it's provided for completeness. You may find a use |
geekbleek | 5:f03cda4a4cc9 | 306 | // for it. If not, just don't attach a callback and it |
geekbleek | 5:f03cda4a4cc9 | 307 | // will not activate. |
geekbleek | 5:f03cda4a4cc9 | 308 | pin.attach_deasserted_held( &keyReleasedHeld ); |
JMF | 0:62feed0f1fd9 | 309 | |
geekbleek | 5:f03cda4a4cc9 | 310 | // You can define how many continuous samples must be |
geekbleek | 5:f03cda4a4cc9 | 311 | // asserted before the attach_asserted() function is called. |
geekbleek | 5:f03cda4a4cc9 | 312 | // pin.setSamplesTillAssert( 10 ); |
geekbleek | 5:f03cda4a4cc9 | 313 | // This would mean 10 * 20ms debounce time = 200ms. |
geekbleek | 5:f03cda4a4cc9 | 314 | |
geekbleek | 5:f03cda4a4cc9 | 315 | // You can define how many continuous samples must be |
geekbleek | 5:f03cda4a4cc9 | 316 | // asserted before the attach_asserted_held() function is called. |
geekbleek | 5:f03cda4a4cc9 | 317 | // pin.setSamplesTillHeld( 200 ); |
geekbleek | 5:f03cda4a4cc9 | 318 | // This would mean 200 * 20ms debounce time = 2seconds. |
geekbleek | 5:f03cda4a4cc9 | 319 | |
geekbleek | 5:f03cda4a4cc9 | 320 | // By default, "asserted" assumes the pin going high from 0volts to 5volts |
geekbleek | 5:f03cda4a4cc9 | 321 | // and deasserted assumes going from 5volts to 0volts. You can invert this |
geekbleek | 5:f03cda4a4cc9 | 322 | // logic so that going to 0volts is asserted and going to 5volts is deasserted |
geekbleek | 5:f03cda4a4cc9 | 323 | // using this setup function:- |
geekbleek | 5:f03cda4a4cc9 | 324 | // pin.setAssertValue( 0 ); |
geekbleek | 5:f03cda4a4cc9 | 325 | |
geekbleek | 5:f03cda4a4cc9 | 326 | // Sampling does NOT begin until you set the frequency. So, until |
geekbleek | 5:f03cda4a4cc9 | 327 | // you call this function NO callbacks will be made. With no arguments |
geekbleek | 5:f03cda4a4cc9 | 328 | // passed the default is 20000 microseconds (20ms). Specifiy the sampling |
geekbleek | 5:f03cda4a4cc9 | 329 | // period in microseconds if you want a different value to 20ms. |
geekbleek | 5:f03cda4a4cc9 | 330 | // For example, for a sampling period of 10ms do:- |
geekbleek | 5:f03cda4a4cc9 | 331 | // pin.setSampleFrequency( 10000 ); |
geekbleek | 5:f03cda4a4cc9 | 332 | // Note, if you change the sampling frequency you will probably also |
geekbleek | 5:f03cda4a4cc9 | 333 | // want to change the number of samples till assert and held as show |
geekbleek | 5:f03cda4a4cc9 | 334 | // above. |
geekbleek | 5:f03cda4a4cc9 | 335 | pin.setSampleFrequency(); // Defaults to 20ms. |
geekbleek | 5:f03cda4a4cc9 | 336 | |
geekbleek | 5:f03cda4a4cc9 | 337 | while( 1 ) { |
geekbleek | 5:f03cda4a4cc9 | 338 | led1 = !led1; |
geekbleek | 5:f03cda4a4cc9 | 339 | wait( 0.2 ); |
geekbleek | 4:b9f2193b27cf | 340 | } |
geekbleek | 5:f03cda4a4cc9 | 341 | } |