The program uses RPC over http to open a garage door over the internet. On a htm page is a link that calls a RPC function
Dependencies: EthernetNetIf NTPClient_NetServices mbed HTTPServer
myGarageDoorOpenerHTTPServerExample.cpp@4:017371090723, 2011-06-14 (annotated)
- Committer:
- jrsikken
- Date:
- Tue Jun 14 06:28:04 2011 +0000
- Revision:
- 4:017371090723
- Parent:
- 3:bdea83a48a95
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jrsikken | 0:8c69f4c2bb0e | 1 | #include "mbed.h" |
jrsikken | 0:8c69f4c2bb0e | 2 | #include "EthernetNetIf.h" |
jrsikken | 0:8c69f4c2bb0e | 3 | #include "HTTPServer.h" |
jrsikken | 4:017371090723 | 4 | //#include "HTTPClient.h" |
jrsikken | 0:8c69f4c2bb0e | 5 | #include "RPCFunction.h" |
jrsikken | 1:71c0a02e6587 | 6 | #include "NTPClient.h" |
jrsikken | 0:8c69f4c2bb0e | 7 | |
jrsikken | 0:8c69f4c2bb0e | 8 | DigitalOut led1(LED1, "led1"); |
jrsikken | 0:8c69f4c2bb0e | 9 | DigitalOut led2(LED2, "led2"); |
jrsikken | 4:017371090723 | 10 | DigitalOut led3(LED3, "led3"); |
jrsikken | 0:8c69f4c2bb0e | 11 | DigitalOut led4(LED4, "led4"); |
jrsikken | 0:8c69f4c2bb0e | 12 | DigitalOut rfout(p22,"rfout"); |
jrsikken | 2:fb8f5c072e24 | 13 | InterruptIn button(p25); //energymeter flash detector |
jrsikken | 0:8c69f4c2bb0e | 14 | |
jrsikken | 0:8c69f4c2bb0e | 15 | LocalFileSystem fs("webfs");// Create the local filesystem under the name "local" |
jrsikken | 2:fb8f5c072e24 | 16 | LocalFileSystem local("local");// Create the local filesystem under the name "local" |
jrsikken | 0:8c69f4c2bb0e | 17 | |
jrsikken | 0:8c69f4c2bb0e | 18 | EthernetNetIf eth( |
jrsikken | 0:8c69f4c2bb0e | 19 | IpAddr(192,168,1,100), //IP Address |
jrsikken | 0:8c69f4c2bb0e | 20 | IpAddr(255,255,255,0), //Network Mask |
jrsikken | 0:8c69f4c2bb0e | 21 | IpAddr(192,168,1,254), //Gateway |
jrsikken | 0:8c69f4c2bb0e | 22 | IpAddr(192,168,1,254) //DNS |
jrsikken | 0:8c69f4c2bb0e | 23 | ); |
jrsikken | 0:8c69f4c2bb0e | 24 | HTTPServer svr; |
jrsikken | 1:71c0a02e6587 | 25 | NTPClient ntp; |
jrsikken | 2:fb8f5c072e24 | 26 | time_t ctTime; |
jrsikken | 4:017371090723 | 27 | //HTTPClient client;// for authentication, API key is set in client header |
jrsikken | 0:8c69f4c2bb0e | 28 | |
jrsikken | 0:8c69f4c2bb0e | 29 | void sendbit(char a); |
jrsikken | 0:8c69f4c2bb0e | 30 | void open(char * input, char * output);//Open garage door |
jrsikken | 0:8c69f4c2bb0e | 31 | RPCFunction rpc_open(&open, "open"); |
jrsikken | 0:8c69f4c2bb0e | 32 | |
jrsikken | 2:fb8f5c072e24 | 33 | Timer t;//timer to measure time between power meter flashes |
jrsikken | 4:017371090723 | 34 | //Timer t_pachube;//timer to set interval to post values to pachube |
jrsikken | 2:fb8f5c072e24 | 35 | float watt;//is calculated from the time between flashes |
jrsikken | 2:fb8f5c072e24 | 36 | int logPower;//initialize global variables |
jrsikken | 2:fb8f5c072e24 | 37 | float time_s; |
jrsikken | 3:bdea83a48a95 | 38 | int firsttime; |
jrsikken | 2:fb8f5c072e24 | 39 | |
jrsikken | 2:fb8f5c072e24 | 40 | void flip() {// measure time |
jrsikken | 2:fb8f5c072e24 | 41 | time_s = t.read(); // read time and store in global variable |
jrsikken | 2:fb8f5c072e24 | 42 | t.reset(); //reset time |
jrsikken | 2:fb8f5c072e24 | 43 | led2 = !led2;//toggle led2 |
jrsikken | 2:fb8f5c072e24 | 44 | logPower=1;//tell the main loop to calculate the power |
jrsikken | 2:fb8f5c072e24 | 45 | } |
jrsikken | 2:fb8f5c072e24 | 46 | |
jrsikken | 0:8c69f4c2bb0e | 47 | int main() { |
jrsikken | 0:8c69f4c2bb0e | 48 | Base::add_rpc_class<AnalogIn>(); |
jrsikken | 0:8c69f4c2bb0e | 49 | Base::add_rpc_class<AnalogOut>(); |
jrsikken | 0:8c69f4c2bb0e | 50 | Base::add_rpc_class<DigitalIn>(); |
jrsikken | 0:8c69f4c2bb0e | 51 | Base::add_rpc_class<DigitalOut>(); |
jrsikken | 0:8c69f4c2bb0e | 52 | Base::add_rpc_class<DigitalInOut>(); |
jrsikken | 0:8c69f4c2bb0e | 53 | Base::add_rpc_class<PwmOut>(); |
jrsikken | 0:8c69f4c2bb0e | 54 | Base::add_rpc_class<Timer>(); |
jrsikken | 0:8c69f4c2bb0e | 55 | Base::add_rpc_class<BusOut>(); |
jrsikken | 0:8c69f4c2bb0e | 56 | Base::add_rpc_class<BusIn>(); |
jrsikken | 0:8c69f4c2bb0e | 57 | Base::add_rpc_class<BusInOut>(); |
jrsikken | 0:8c69f4c2bb0e | 58 | Base::add_rpc_class<Serial>(); |
jrsikken | 0:8c69f4c2bb0e | 59 | |
jrsikken | 0:8c69f4c2bb0e | 60 | printf("Setting up...\n"); |
jrsikken | 0:8c69f4c2bb0e | 61 | EthernetErr ethErr = eth.setup(); |
jrsikken | 0:8c69f4c2bb0e | 62 | if (ethErr) { |
jrsikken | 0:8c69f4c2bb0e | 63 | printf("Error %d in setup.\n", ethErr); |
jrsikken | 0:8c69f4c2bb0e | 64 | return -1; |
jrsikken | 0:8c69f4c2bb0e | 65 | } |
jrsikken | 0:8c69f4c2bb0e | 66 | printf("Setup OK\n"); |
jrsikken | 0:8c69f4c2bb0e | 67 | |
jrsikken | 0:8c69f4c2bb0e | 68 | FSHandler::mount("/webfs", "/"); //Mount /webfs path on web root path |
jrsikken | 0:8c69f4c2bb0e | 69 | |
jrsikken | 0:8c69f4c2bb0e | 70 | svr.addHandler<RPCHandler>("/rpc"); |
jrsikken | 0:8c69f4c2bb0e | 71 | svr.addHandler<FSHandler>("/files"); |
jrsikken | 0:8c69f4c2bb0e | 72 | svr.addHandler<FSHandler>("/"); //Default handler |
jrsikken | 0:8c69f4c2bb0e | 73 | svr.bind(80); |
jrsikken | 0:8c69f4c2bb0e | 74 | printf("Listening...\n"); |
jrsikken | 0:8c69f4c2bb0e | 75 | |
jrsikken | 1:71c0a02e6587 | 76 | Host server(IpAddr(), 123, "0.uk.pool.ntp.org"); |
jrsikken | 1:71c0a02e6587 | 77 | ntp.setTime(server); |
jrsikken | 1:71c0a02e6587 | 78 | ctTime = time(NULL); |
jrsikken | 2:fb8f5c072e24 | 79 | printf("Time (UTC): %s\r\n", ctime(&ctTime)); |
jrsikken | 1:71c0a02e6587 | 80 | FILE *fp = fopen("/local/test.txt", "a"); |
jrsikken | 2:fb8f5c072e24 | 81 | fprintf(fp,"Restart (UTC): %s \r\n", ctime(&ctTime)); |
jrsikken | 1:71c0a02e6587 | 82 | fclose(fp); |
jrsikken | 1:71c0a02e6587 | 83 | |
jrsikken | 3:bdea83a48a95 | 84 | firsttime=1;//the first time the power must not be calculated |
jrsikken | 3:bdea83a48a95 | 85 | button.rise(&flip);// attach the address of the flip function to the rising edge |
jrsikken | 2:fb8f5c072e24 | 86 | Timer tm;//timer to show that mbed is alive |
jrsikken | 3:bdea83a48a95 | 87 | tm.start();//start timer to flash led1 |
jrsikken | 3:bdea83a48a95 | 88 | t.start();//start timer to measure power |
jrsikken | 4:017371090723 | 89 | // t_pachube.start();//start timer that triggers a post interval |
jrsikken | 4:017371090723 | 90 | |
jrsikken | 0:8c69f4c2bb0e | 91 | while (true) { |
jrsikken | 0:8c69f4c2bb0e | 92 | Net::poll(); |
jrsikken | 0:8c69f4c2bb0e | 93 | if (tm.read()>0.5) { |
jrsikken | 0:8c69f4c2bb0e | 94 | led1=!led1; //Show that we are alive |
jrsikken | 3:bdea83a48a95 | 95 | tm.reset(); |
jrsikken | 0:8c69f4c2bb0e | 96 | } |
jrsikken | 4:017371090723 | 97 | /* |
jrsikken | 4:017371090723 | 98 | if (t_pachube.read()>120) { |
jrsikken | 4:017371090723 | 99 | led3=!led3; //Post to pachube |
jrsikken | 4:017371090723 | 100 | string apiKey = "r5Nh4t4AKEH7-TmWz-jRf-q5DBIglZ2t_I_3D0EXLt4"; // copy API key from settings |
jrsikken | 4:017371090723 | 101 | string environmentID = "26502";// use feed ID |
jrsikken | 4:017371090723 | 102 | string datastreamID = "0"; // use datastream ID |
jrsikken | 4:017371090723 | 103 | string data = FloatToStr(watt);//"500"; // datastream value |
jrsikken | 4:017371090723 | 104 | |
jrsikken | 4:017371090723 | 105 | printf("put data value: %f\r\n",watt); |
jrsikken | 4:017371090723 | 106 | HTTPClient client;// for authentication, API key is set in client header |
jrsikken | 4:017371090723 | 107 | client.setRequestHeader("X-PachubeApiKey", apiKey); |
jrsikken | 4:017371090723 | 108 | HTTPText csvContent("text/csv"); // text object holds data to be posted |
jrsikken | 4:017371090723 | 109 | csvContent.set(data); |
jrsikken | 4:017371090723 | 110 | string uri = "http://api.pachube.com/v1/feeds/" + environmentID + "/datastreams/" + datastreamID + ".csv?_method=put"; // uri for post includes feed ID and datastream ID |
jrsikken | 4:017371090723 | 111 | HTTPResult result = client.post(uri.c_str(), csvContent, NULL);// result should be 0 and response should be 200 for successful post |
jrsikken | 4:017371090723 | 112 | int response = client.getHTTPResponseCode(); |
jrsikken | 4:017371090723 | 113 | printf("Pachube put response: %i\r\n",response); |
jrsikken | 4:017371090723 | 114 | t_pachube.reset(); |
jrsikken | 4:017371090723 | 115 | }*/ |
jrsikken | 3:bdea83a48a95 | 116 | if (logPower==1) {//this code is running when the interrupt sets a flag |
jrsikken | 3:bdea83a48a95 | 117 | logPower=0;//clear the flag |
jrsikken | 3:bdea83a48a95 | 118 | if (firsttime==0) {//the first measurement is incorrect |
jrsikken | 4:017371090723 | 119 | watt=3600/time_s;//calculate power |
jrsikken | 3:bdea83a48a95 | 120 | if (watt>0) { |
jrsikken | 4:017371090723 | 121 | ctTime = time(NULL); |
jrsikken | 4:017371090723 | 122 | printf("T: %f s\r\n", time_s);//debug info |
jrsikken | 4:017371090723 | 123 | printf("P: %f W\r\n", watt);//debug info |
jrsikken | 3:bdea83a48a95 | 124 | FILE *fp = fopen("/local/power.txt", "a"); |
jrsikken | 4:017371090723 | 125 | fprintf(fp,"%f W\r\n", watt); |
jrsikken | 3:bdea83a48a95 | 126 | fclose(fp); |
jrsikken | 4:017371090723 | 127 | }//end of if(watt>0) |
jrsikken | 4:017371090723 | 128 | }//end of firsttimme=00 |
jrsikken | 4:017371090723 | 129 | firsttime=0;//clear the firsttime variable |
jrsikken | 4:017371090723 | 130 | }//end of if(logPower==1) |
jrsikken | 0:8c69f4c2bb0e | 131 | }//end of while loop |
jrsikken | 0:8c69f4c2bb0e | 132 | }//end of main |
jrsikken | 0:8c69f4c2bb0e | 133 | |
jrsikken | 0:8c69f4c2bb0e | 134 | void sendbit(char a) { |
jrsikken | 2:fb8f5c072e24 | 135 | if (a==0) {//pin low |
jrsikken | 0:8c69f4c2bb0e | 136 | rfout=1; |
jrsikken | 0:8c69f4c2bb0e | 137 | wait_us(2010); |
jrsikken | 0:8c69f4c2bb0e | 138 | rfout=0; |
jrsikken | 0:8c69f4c2bb0e | 139 | wait_us(270); |
jrsikken | 0:8c69f4c2bb0e | 140 | rfout=1; |
jrsikken | 0:8c69f4c2bb0e | 141 | wait_us(2010); |
jrsikken | 0:8c69f4c2bb0e | 142 | rfout=0; |
jrsikken | 0:8c69f4c2bb0e | 143 | wait_us(270); |
jrsikken | 0:8c69f4c2bb0e | 144 | } |
jrsikken | 2:fb8f5c072e24 | 145 | if (a==1) {//pin high |
jrsikken | 0:8c69f4c2bb0e | 146 | rfout=1; |
jrsikken | 0:8c69f4c2bb0e | 147 | wait_us(270); |
jrsikken | 0:8c69f4c2bb0e | 148 | rfout=0; |
jrsikken | 0:8c69f4c2bb0e | 149 | wait_us(2010); |
jrsikken | 0:8c69f4c2bb0e | 150 | rfout=1; |
jrsikken | 0:8c69f4c2bb0e | 151 | wait_us(270); |
jrsikken | 0:8c69f4c2bb0e | 152 | rfout=0; |
jrsikken | 0:8c69f4c2bb0e | 153 | wait_us(2010); |
jrsikken | 0:8c69f4c2bb0e | 154 | } |
jrsikken | 4:017371090723 | 155 | }//end of sendbit() |
jrsikken | 0:8c69f4c2bb0e | 156 | |
jrsikken | 1:71c0a02e6587 | 157 | void open(char * input, char * output) { |
jrsikken | 1:71c0a02e6587 | 158 | led4=1; |
jrsikken | 2:fb8f5c072e24 | 159 | for (char i = 0; i<10; i++) { |
jrsikken | 1:71c0a02e6587 | 160 | sendbit(1);//address A1 |
jrsikken | 1:71c0a02e6587 | 161 | sendbit(0);//address A2 |
jrsikken | 1:71c0a02e6587 | 162 | sendbit(0);//address A3 |
jrsikken | 1:71c0a02e6587 | 163 | sendbit(0);//address A4 |
jrsikken | 1:71c0a02e6587 | 164 | sendbit(1);//address A5 |
jrsikken | 1:71c0a02e6587 | 165 | sendbit(0);//address A6 /data D6 |
jrsikken | 1:71c0a02e6587 | 166 | sendbit(1);//address A7 /data D7 |
jrsikken | 1:71c0a02e6587 | 167 | sendbit(0);//address A8 /data D8 |
jrsikken | 1:71c0a02e6587 | 168 | sendbit(1);//address A9 /data D9 |
jrsikken | 1:71c0a02e6587 | 169 | wait_ms(14); |
jrsikken | 0:8c69f4c2bb0e | 170 | } |
jrsikken | 1:71c0a02e6587 | 171 | led4=0; |
jrsikken | 4:017371090723 | 172 | //beginning of open sesame log |
jrsikken | 1:71c0a02e6587 | 173 | FILE *fp = fopen("/local/test.txt", "a"); |
jrsikken | 1:71c0a02e6587 | 174 | ctTime = time(NULL); |
jrsikken | 2:fb8f5c072e24 | 175 | fprintf(fp,"Open (UTC): %s \r\n", ctime(&ctTime)); |
jrsikken | 1:71c0a02e6587 | 176 | fclose(fp); |
jrsikken | 4:017371090723 | 177 | //end of open sesame log |
jrsikken | 4:017371090723 | 178 | sprintf(output, "<html><head><meta http-equiv=refresh content='2; url=../../index.htm'></head><body BGCOLOR=#A1F9FF>Opening,wait...</body></html>"); |
jrsikken | 1:71c0a02e6587 | 179 | } |
jrsikken | 0:8c69f4c2bb0e | 180 | |
jrsikken | 0:8c69f4c2bb0e | 181 | |
jrsikken | 0:8c69f4c2bb0e | 182 | |
jrsikken | 0:8c69f4c2bb0e | 183 | |
jrsikken | 0:8c69f4c2bb0e | 184 | |
jrsikken | 0:8c69f4c2bb0e | 185 | |
jrsikken | 0:8c69f4c2bb0e | 186 | |
jrsikken | 0:8c69f4c2bb0e | 187 | |
jrsikken | 0:8c69f4c2bb0e | 188 | |
jrsikken | 0:8c69f4c2bb0e | 189 | |
jrsikken | 0:8c69f4c2bb0e | 190 | |
jrsikken | 0:8c69f4c2bb0e | 191 | |
jrsikken | 0:8c69f4c2bb0e | 192 |