ECE-4180 project: GPS based home automation
Dependencies: EthernetInterface mbed-rtos mbed oJSON
main.cpp
- Committer:
- ajayke
- Date:
- 2014-04-28
- Revision:
- 0:4492c0468687
File content as of revision 0:4492c0468687:
#include "mbed.h" #include "EthernetInterface.h" #include <string> #include <sstream> #include "oJSON.h" #include "rtos.h" float light_thresh = 0.1; DigitalOut myled(LED1); DigitalOut cs(p8); DigitalOut P11(p11); // Device 1 control, obtained from database server DigitalOut P12(p12); // Device 2 control, obtained from database server DigitalOut P13(p13); // Device 3 control, obtained from database server DigitalOut P14(p14); // Device 4 control, obtained from database server DigitalOut P15(p15); // Manual / Automatic mode ( 0 / 1 ) , obtained from database server DigitalOut P16(p16); // Security feature ( off / on - 0 / 1 ) , obtained from database server DigitalOut P17(p17); // Near / Far (The user is near / far from home based on GPS location, obtained from database server, near / far - 0 / 1 ) DigitalIn P18(p18); // Used for data transfer synchronization between 2 mbeds DigitalOut P19(p19); // Used for data transfer synchronization between 2 mbeds DigitalOut led1(LED1); // blinks when transferring data to the other mbed DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); Mutex lock_mutex; extern "C" void mbed_reset(); int x; EthernetInterface eth; int global_var=0; Serial pc(USBTX, USBRX); void replaceAll(std::string& str, const std::string& from, const std::string& to) { size_t start_pos = 0; while((start_pos = str.find(from, start_pos)) != std::string::npos) { size_t end_pos = start_pos + from.length(); str.replace(start_pos, from.length(), to); start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' } } // Thread for connecting to the database server, accessing the data (control signals) and then sending it to the other mbed void thread_server_ping(void const *args) { string lat_1; string lon_1; stringstream st; string ss; pc.printf("Connecting...\n"); pc.printf("IP Address is %s\n", eth.getIPAddress()); lock_mutex.lock(); TCPSocketConnection sock; x = sock.connect("dev.m.gatech.edu", 80); lock_mutex.unlock(); if(x!=0) mbed_reset(); pc.printf("Return Value: %d\n", x); pc.printf("\n\n\n Accessing Database Server \n\n"); char http_cmd[] = "GET /d/rsrs3/w/SilentGardian/c/api/gpsLocation/ HTTP/1.0\n\n"; lock_mutex.lock(); sock.send_all(http_cmd, sizeof(http_cmd)-1); lock_mutex.unlock(); char *buffer; char *buffer2; buffer = (char *)malloc (sizeof(char)*3000); buffer2 = (char *)malloc (sizeof(char)*3000); string str; int ret; pc.printf("Waiting to receive data..\n"); lock_mutex.lock(); sock.set_blocking(false,7500); ret = sock.receive(buffer, (sizeof(char)*3000)-1); lock_mutex.unlock(); st << buffer; st >> ss; if (ret <= 0) { // pc.printf("Ret <=0, break here \n"); pc.printf("... \n"); //break; mbed_reset(); terminate(); } buffer[ret] = '\0'; int cnt=0; char tmp; while (tmp!='[') { cnt++; tmp=buffer[cnt]; } int i=cnt; for(i=cnt;i<ret;i++) { buffer2[i-cnt]=buffer[i]; if(buffer[i]==']') break; } buffer2[i-cnt+1]=buffer[ret]; pc.printf("Received %d chars from server:\n", ret); str=string(buffer2); string str2 = ""; const char *cstr=str.c_str(); for(int i=0;i<str.size();i++) { char a=cstr[i]; if(a!='_') { str2= str2 + a; } } JSONArray *j= new JSONArray(str2); JSONArray j1= j->getArray(0); string s1=j1.getString(1); int ind=s1.find(":\"", 0); ind = ind + 2; string s11=s1.substr(ind,s1.length()); string s2=j1.getString(2); string s0=j1.getString(0); int ind2=s2.find(":\"", 0); ind2 = ind2 + 2; string s22=s2.substr(ind,s2.length()); int control_sig=atoi(s11.c_str()); int d1to4=atoi(s22.c_str()); pc.printf("JSON parsing : d1to d4 values:%d, \n control_sig value:%d\n",d1to4,control_sig); P15=1; P11=(int)((d1to4>>3) & 1); P12=(int)((d1to4>>2) & 1); P13=(int)((d1to4>>1) & 1); P14=(int)((d1to4>>0) & 1); P15=(int)((control_sig>>2) & 1); P16=(int)((control_sig>>1) & 1); P17=(int)((control_sig>>0) & 1); P19=0; int P111=(int)((d1to4>>3) & 1); // Device 1 control, obtained from database server int P112=(int)((d1to4>>2) & 1); // Device 2 control, obtained from database server int P113=(int)((d1to4>>1) & 1); // Device 3 control, obtained from database server int P114=(int)((d1to4>>0) & 1); // Device 4 control, obtained from database server int P115=(int)((control_sig>>2) & 1); // Manual / Automatic mode ( 0 / 1 ) , obtained from database server int P116=(int)((control_sig>>1) & 1); // Security feature ( off / on - 0 / 1 ) , obtained from database server int P117=(int)((control_sig>>0) & 1); // Near / Far (The user is near / far from home based on GPS location, obtained from database server, near / far - 0 / 1 ) pc.printf("P11: %d, P12: %d, P13: %d, P14:%d, P15:%d, P16:%d, P17:%d, P19: %d \n",(int)P11,(int)P12,(int)P13,(int)P14,(int)P15,(int)P16,(int)P17,(int)P19); while(P18==1) { } P19=1; myled = 1; wait(0.2); myled = 0; wait(0.2); sock.close(); delete buffer; delete buffer2; mbed_reset(); terminate(); while(1) { } } int main() { P19=1; P18.mode(PullUp); eth.init(); //Use DHCP eth.connect(); TCPSocketConnection sock; pc.printf("IP Address is %s\n", eth.getIPAddress()); lock_mutex.lock(); x = sock.connect("dev.m.gatech.edu", 80); // Connect to the database server lock_mutex.unlock(); Thread *ping_server=new Thread(thread_server_ping); //Start thread which fetches data from database server global_var=1; while(1){ Thread::wait(30000); ping_server->terminate(); lock_mutex.unlock(); pc.printf("New thread started \n"); ping_server=new Thread(thread_server_ping); } }