Full Program

Dependencies:   TCPEthernetEverything

Committer:
lachu
Date:
Tue Jan 24 22:17:16 2017 +0000
Revision:
0:ca66419d3b8b
working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lachu 0:ca66419d3b8b 1 /*
lachu 0:ca66419d3b8b 2 * (c) Copyright 2012 EVRYTHNG Ltd London / Zurich
lachu 0:ca66419d3b8b 3 * www.evrythng.com
lachu 0:ca66419d3b8b 4 *
lachu 0:ca66419d3b8b 5 * --- DISCLAIMER ---
lachu 0:ca66419d3b8b 6 *
lachu 0:ca66419d3b8b 7 * EVRYTHNG provides this source code "as is" and without warranty of any kind,
lachu 0:ca66419d3b8b 8 * and hereby disclaims all express or implied warranties, including without
lachu 0:ca66419d3b8b 9 * limitation warranties of merchantability, fitness for a particular purpose,
lachu 0:ca66419d3b8b 10 * performance, accuracy, reliability, and non-infringement.
lachu 0:ca66419d3b8b 11 *
lachu 0:ca66419d3b8b 12 *
lachu 0:ca66419d3b8b 13 * --- READ ME ---
lachu 0:ca66419d3b8b 14 *
lachu 0:ca66419d3b8b 15 * This is a demo application that uses EVRYTHNG's mbed wrapper to read and
lachu 0:ca66419d3b8b 16 * write value to EVRYTHNG's engine. Please refer to the online documentation
lachu 0:ca66419d3b8b 17 * available at http://dev.evrythng.com/mbed.
lachu 0:ca66419d3b8b 18 *
lachu 0:ca66419d3b8b 19 *
lachu 0:ca66419d3b8b 20 * Author: Michel Yerly
lachu 0:ca66419d3b8b 21 *
lachu 0:ca66419d3b8b 22 */
lachu 0:ca66419d3b8b 23
lachu 0:ca66419d3b8b 24 #include "mbed.h"
lachu 0:ca66419d3b8b 25 #include "EthernetInterface.h"
lachu 0:ca66419d3b8b 26 #include <time.h>
lachu 0:ca66419d3b8b 27 #include "EvrythngApi.h"
lachu 0:ca66419d3b8b 28 #include "util.h"
lachu 0:ca66419d3b8b 29 #include "eventqueue.h"
lachu 0:ca66419d3b8b 30
lachu 0:ca66419d3b8b 31 /*
lachu 0:ca66419d3b8b 32 * Configuration
lachu 0:ca66419d3b8b 33 */
lachu 0:ca66419d3b8b 34
lachu 0:ca66419d3b8b 35 // Your EVRYTHNG api key.
lachu 0:ca66419d3b8b 36 const char* API_KEY = "JLjvaoRRJZ7BiQ3s1ekVrn6LmGITkmFYUO2P4bWILi3dT6fA0Vvaz2SqEjTB046frkiiuSe4LT09ISkc";
lachu 0:ca66419d3b8b 37
lachu 0:ca66419d3b8b 38 // Your thng id, the one that represents your mbed device.
lachu 0:ca66419d3b8b 39 const char* THNG_ID = "UkkEKgEPMmsEh6awagMd4qEq";
lachu 0:ca66419d3b8b 40
lachu 0:ca66419d3b8b 41 // The property you want values to be pushed to.
lachu 0:ca66419d3b8b 42 const char* THNG_PROP_SET = "binary";
lachu 0:ca66419d3b8b 43
lachu 0:ca66419d3b8b 44 // The property you want values to be read from.
lachu 0:ca66419d3b8b 45 const char* THNG_PROP_GET = "binary";
lachu 0:ca66419d3b8b 46
lachu 0:ca66419d3b8b 47
lachu 0:ca66419d3b8b 48
lachu 0:ca66419d3b8b 49 DigitalOut led1(LED1);
lachu 0:ca66419d3b8b 50 DigitalOut led2(LED2);
lachu 0:ca66419d3b8b 51 DigitalOut led3(LED3);
lachu 0:ca66419d3b8b 52 //DigitalOut led4(LED4);
lachu 0:ca66419d3b8b 53
lachu 0:ca66419d3b8b 54 static char displayVal = 0;
lachu 0:ca66419d3b8b 55
lachu 0:ca66419d3b8b 56 /*
lachu 0:ca66419d3b8b 57 * Displays a value between 0 and 15 as binary on the 4 LEDs.
lachu 0:ca66419d3b8b 58 */
lachu 0:ca66419d3b8b 59 void display(char x)
lachu 0:ca66419d3b8b 60 {
lachu 0:ca66419d3b8b 61 led1 = x & (char)8 ? 1 : 0;
lachu 0:ca66419d3b8b 62 led2 = x & (char)4 ? 1 : 0;
lachu 0:ca66419d3b8b 63 led3 = x & (char)2 ? 1 : 0;
lachu 0:ca66419d3b8b 64 //led4 = x & (char)1 ? 1 : 0;
lachu 0:ca66419d3b8b 65 displayVal = x;
lachu 0:ca66419d3b8b 66 }
lachu 0:ca66419d3b8b 67
lachu 0:ca66419d3b8b 68 /*
lachu 0:ca66419d3b8b 69 * Flashes the 4 LEDs, and restores the state of the last display().
lachu 0:ca66419d3b8b 70 */
lachu 0:ca66419d3b8b 71 void flash()
lachu 0:ca66419d3b8b 72 {
lachu 0:ca66419d3b8b 73 char s = displayVal;
lachu 0:ca66419d3b8b 74 for (int i = 0; i < 2; ++i) {
lachu 0:ca66419d3b8b 75 display(0x0F);
lachu 0:ca66419d3b8b 76 wait(0.1);
lachu 0:ca66419d3b8b 77 display(0x00);
lachu 0:ca66419d3b8b 78 wait(0.1);
lachu 0:ca66419d3b8b 79 }
lachu 0:ca66419d3b8b 80 display(s);
lachu 0:ca66419d3b8b 81 }
lachu 0:ca66419d3b8b 82
lachu 0:ca66419d3b8b 83 /*
lachu 0:ca66419d3b8b 84 * Function to get the number of milliseconds elapsed since the system startup.
lachu 0:ca66419d3b8b 85 * It is imprecise and if called repetitively and quickly, it may always return
lachu 0:ca66419d3b8b 86 * the same result. It MUST be called at least every 30 minutes.
lachu 0:ca66419d3b8b 87 * NOTE: I'm not proud of it.
lachu 0:ca66419d3b8b 88 */
lachu 0:ca66419d3b8b 89 int64_t getMillis()
lachu 0:ca66419d3b8b 90 {
lachu 0:ca66419d3b8b 91 static Timer tmr;
lachu 0:ca66419d3b8b 92 static int64_t clk = 0;
lachu 0:ca66419d3b8b 93
lachu 0:ca66419d3b8b 94 tmr.stop();
lachu 0:ca66419d3b8b 95 clk += tmr.read_ms();
lachu 0:ca66419d3b8b 96 tmr.reset();
lachu 0:ca66419d3b8b 97 tmr.start();
lachu 0:ca66419d3b8b 98
lachu 0:ca66419d3b8b 99 char str[21];
lachu 0:ca66419d3b8b 100 char* end;
lachu 0:ca66419d3b8b 101 sprinti64(str, clk, &end);
lachu 0:ca66419d3b8b 102 *end = '\0';
lachu 0:ca66419d3b8b 103 dbg.printf("%s ", str);
lachu 0:ca66419d3b8b 104
lachu 0:ca66419d3b8b 105 return clk;
lachu 0:ca66419d3b8b 106 }
lachu 0:ca66419d3b8b 107
lachu 0:ca66419d3b8b 108 /*
lachu 0:ca66419d3b8b 109 * Entry point.
lachu 0:ca66419d3b8b 110 *
lachu 0:ca66419d3b8b 111 * This demo application uses an event loop to set and get property values
lachu 0:ca66419d3b8b 112 * on EVRYTHNG engine at given intervals.
lachu 0:ca66419d3b8b 113 */
lachu 0:ca66419d3b8b 114 int main()
lachu 0:ca66419d3b8b 115 {
lachu 0:ca66419d3b8b 116 dbg.printf("Initializing ethernet interface\r\n");
lachu 0:ca66419d3b8b 117 EthernetInterface eth;
lachu 0:ca66419d3b8b 118 eth.init(); //Use DHCP
lachu 0:ca66419d3b8b 119 eth.connect();
lachu 0:ca66419d3b8b 120 dbg.printf("IP address: %s\r\n", eth.getIPAddress());
lachu 0:ca66419d3b8b 121
lachu 0:ca66419d3b8b 122 EvrythngApi api(API_KEY);
lachu 0:ca66419d3b8b 123
lachu 0:ca66419d3b8b 124 // intervals in ms
lachu 0:ca66419d3b8b 125 const int SET_INTERVAL = 5000;
lachu 0:ca66419d3b8b 126 const int GET_INTERVAL = 2000;
lachu 0:ca66419d3b8b 127
lachu 0:ca66419d3b8b 128 int curVal = 0;
lachu 0:ca66419d3b8b 129 display(curVal);
lachu 0:ca66419d3b8b 130
lachu 0:ca66419d3b8b 131 int putVal = 0;
lachu 0:ca66419d3b8b 132 char strPutVal[3];
lachu 0:ca66419d3b8b 133 int64_t timestamp = 1345736694000LL; // 2012-08-23 10:44:54am EST
lachu 0:ca66419d3b8b 134
lachu 0:ca66419d3b8b 135 EventQueue eventQueue;
lachu 0:ca66419d3b8b 136 eventQueue.put(getMillis()+GET_INTERVAL, EVT_GET_PROP);
lachu 0:ca66419d3b8b 137 eventQueue.put(getMillis()+SET_INTERVAL, EVT_SET_PROP);
lachu 0:ca66419d3b8b 138
lachu 0:ca66419d3b8b 139 while (!eventQueue.empty()) {
lachu 0:ca66419d3b8b 140 EventType event = eventQueue.waitNext(getMillis());
lachu 0:ca66419d3b8b 141
lachu 0:ca66419d3b8b 142 switch (event) {
lachu 0:ca66419d3b8b 143
lachu 0:ca66419d3b8b 144 case EVT_SET_PROP:
lachu 0:ca66419d3b8b 145
lachu 0:ca66419d3b8b 146 eventQueue.put(SET_INTERVAL + getMillis(), EVT_SET_PROP);
lachu 0:ca66419d3b8b 147
lachu 0:ca66419d3b8b 148 putVal = (putVal + 1) & 0xF;
lachu 0:ca66419d3b8b 149 sprintf(strPutVal, "%d", putVal);
lachu 0:ca66419d3b8b 150 timestamp++;
lachu 0:ca66419d3b8b 151 api.setThngPropertyValue(THNG_ID, THNG_PROP_SET, string(strPutVal), timestamp);
lachu 0:ca66419d3b8b 152
lachu 0:ca66419d3b8b 153 break;
lachu 0:ca66419d3b8b 154
lachu 0:ca66419d3b8b 155 case EVT_GET_PROP:
lachu 0:ca66419d3b8b 156
lachu 0:ca66419d3b8b 157 eventQueue.put(GET_INTERVAL + getMillis(), EVT_GET_PROP);
lachu 0:ca66419d3b8b 158
lachu 0:ca66419d3b8b 159 string v;
lachu 0:ca66419d3b8b 160 int r = api.getThngPropertyValue(THNG_ID, THNG_PROP_GET, v);
lachu 0:ca66419d3b8b 161 if (r == 0) {
lachu 0:ca66419d3b8b 162 flash();
lachu 0:ca66419d3b8b 163 int newVal = atoi(v.c_str());
lachu 0:ca66419d3b8b 164 if (newVal != curVal) {
lachu 0:ca66419d3b8b 165 curVal = newVal;
lachu 0:ca66419d3b8b 166 display(curVal);
lachu 0:ca66419d3b8b 167 }
lachu 0:ca66419d3b8b 168 }
lachu 0:ca66419d3b8b 169 break;
lachu 0:ca66419d3b8b 170 }
lachu 0:ca66419d3b8b 171 }
lachu 0:ca66419d3b8b 172
lachu 0:ca66419d3b8b 173 dbg.printf("Disconnecting ethernet interface\r\n");
lachu 0:ca66419d3b8b 174 eth.disconnect();
lachu 0:ca66419d3b8b 175
lachu 0:ca66419d3b8b 176 dbg.printf("Done.\r\n");
lachu 0:ca66419d3b8b 177 while(1) {}
lachu 0:ca66419d3b8b 178 }