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

Committer:
jrsikken
Date:
Tue Jun 14 06:28:04 2011 +0000
Revision:
4:017371090723
Parent:
3:bdea83a48a95

        

Who changed what in which revision?

UserRevisionLine numberNew 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