Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C12832 mbed-http
Fork of HTTP-Python-Demo by
Revision 4:14c774cf7ac2, committed 2017-11-26
- Comitter:
- BKasza
- Date:
- Sun Nov 26 07:24:36 2017 +0000
- Parent:
- 3:8135a6313648
- Commit message:
- It gets compiled - Let's ship it
Changed in this revision
| config.h | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/config.h Sun Nov 26 00:22:09 2017 +0000 +++ b/config.h Sun Nov 26 07:24:36 2017 +0000 @@ -1,6 +1,17 @@ #ifndef _CONFIG_H #define _CONFIG_H -#define SERVERNAME "Bianca" +#define SERVERNAME "Bianca" +#define GETTIMERINIT 5 +#define REPORTTIMERINIT 10 +#define ALERTLISTSIZE 32 + +/* These macros are to be set to 0 when the sensor is not used. When the sensor is used, the corresponding macro should be 1 (and not any other number; + this is important for calculating array indices, sizes etc... */ +#define USING_TEMPERATURE 1 +#define USING_LIGHT 1 +#define USING_AIR 1 +#define USING_LASER 0 +#define USING_ACCEL 1 #endif //_CONFIG_H \ No newline at end of file
--- a/main.cpp Sun Nov 26 00:22:09 2017 +0000
+++ b/main.cpp Sun Nov 26 07:24:36 2017 +0000
@@ -16,14 +16,53 @@
#include "C12832.h"
#include "OdinWiFiInterface.h"
#include "http_request.h"
+#include <string>
C12832 lcd(PE_14, PE_12, PD_12, PD_11, PE_9);
OdinWiFiInterface wifiIF;
+NetworkInterface* netIF;
InterruptIn post_button(PF_2);
InterruptIn get_put_button(PG_4);
volatile bool post_clicked = false;
volatile bool get_clicked = false;
volatile bool put_clicked = false;
+Timer timeSinceGet;
+float getTimer;
+Timer timeSinceReport;
+float reportTimer;
+
+struct sensorWatcher {
+ char sensor;
+ uint8_t id;
+ uint8_t active;
+ float lowThreshold;
+ float highThreshold;
+};
+sensorWatcher alertList[ALERTLISTSIZE];
+
+struct sensorData {
+#if USING_TEMPERATURE
+ float temperature;
+ float humidity;
+#endif
+#if USING_LIGHT
+ float visible;
+ float infrared;
+#endif
+#if USING_AIR
+ float co;
+ float tvoc;
+#endif
+#if USING_LASER
+ float distance;
+#endif
+#if USING_ACCEL
+ float xAcceleration;
+ float yAcceleration;
+ float zAcceleration;
+#endif
+};
+sensorData measurements;
void lcd_print(const char* message) {
lcd.cls();
@@ -39,10 +78,56 @@
get_clicked = true;
}
+void httpPost(const char* body, int msgLen) {
+ HttpRequest* request = new HttpRequest(netIF, HTTP_POST, "http://10.25.2.152:8080");
+ request->set_header("Content-Type", "application/json");
+ HttpResponse* response = request->send(body, msgLen);
+ delete request;
+}
+
+void addAlert(char* alertData) {
+ int ii;
+ for(ii=0;alertList[ii].id!=0xff && ii<ALERTLISTSIZE;ii++);
+ if(ii<ALERTLISTSIZE){
+ alertList[ii].sensor = alertData[0];
+ alertList[ii].id = (uint8_t)alertData[1];
+ alertList[ii].lowThreshold = *((float*)(&(alertData[2])));
+ alertList[ii].highThreshold = *((float*)(&(alertData[6])));
+ }
+}
+
+void destroyAlert(int alertID) {
+ for(int ii=0;ii<ALERTLISTSIZE;ii++) {
+ if(alertList[ii].id == (uint8_t)alertID) {
+ alertList[ii].id = 0xff;
+ alertList[ii].sensor = 'E';
+ }
+ }
+}
+
+void updateTimers(char* timerData) {
+ float newGetTmr = *((float*)(&(timerData[0])));
+ float newReportTmr = *((float*)(&(timerData[4])));
+
+ if(newGetTmr > 131072) {
+ getTimer = GETTIMERINIT;
+ } else if(newGetTmr != 0) {
+ getTimer = newGetTmr;
+ }
+
+ if(newReportTmr > 131072) {
+ newReportTmr = REPORTTIMERINIT;
+ } else if(newReportTmr != 0) {
+ getTimer = newReportTmr;
+ }
+}
+
int main() {
int ret;
SocketAddress serverAddr;
+ getTimer = GETTIMERINIT;
+ reportTimer = REPORTTIMERINIT;
lcd_print("Connecting...");
ret = wifiIF.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
@@ -52,55 +137,259 @@
}
lcd_print("Successfully connected!");
lcd_print(wifiIF.get_mac_address());
- wifiIF.gethostbyname(SERVERNAME, &serverAddr);
+ //wifiIF.gethostbyname(SERVERNAME, &serverAddr);
/* Enable interrupts */
post_button.rise(&send_post);
get_put_button.rise(&send_get_put);
+ /* Init */
+ for(int ii=0;ii<32;ii++) {
+ alertList[ii].sensor = 'E'; //E for empty
+ alertList[ii].id = 0xff;
+ }
+
/* Main loop */
+ netIF = &wifiIF;
+ timeSinceGet.start();
+ timeSinceReport.start();
while (1) {
- /* Post data */
- if (post_clicked) {
- lcd_print("post");
- post_clicked = false;
- NetworkInterface* netIF = &wifiIF;
- HttpRequest* request = new HttpRequest(netIF, HTTP_POST, "http://10.25.2.152:8080");
- request->set_header("Content-Type", "application/json");
- const char body[] = "HelloWorld";
- HttpResponse* response = request->send(body, strlen(body));
- lcd_print(response->get_body_as_string().c_str());
- delete request;
- }
-
- /* Get data */
- if (get_clicked) {
- get_clicked = false;
- put_clicked = true;
- NetworkInterface* netIF = &wifiIF;
+ /* Ask the server if it has any updates */
+ if(timeSinceGet.read() > getTimer) {
HttpRequest* request = new HttpRequest(netIF, HTTP_GET, "http://10.25.2.152:8080");
request->set_header("Content-Type", "application/json");
const char body[] = "{\"get\":\"request\"}";
HttpResponse* response = request->send(body, strlen(body));
- lcd_print(response->get_body_as_string().c_str());
+ char* arrui8Msg = (char*)response->get_body_as_string().c_str();
+ lcd_print(arrui8Msg);
+ char chr = arrui8Msg[0];
+ if(chr == 'T') {
+ updateTimers(&(arrui8Msg[1]));
+ } else if(chr == 'E') {
+ if(arrui8Msg[1]=='C') {
+ addAlert(&(arrui8Msg[2]));
+ } else if(arrui8Msg[1]=='D') {
+ destroyAlert((uint8_t)arrui8Msg[2]);
+ }
+ }
+
delete request;
+ /* Restart timer */
+ timeSinceGet.reset();
}
-
- wait_ms(2000);
+ /* Send reports periodically */
+ if(timeSinceReport.read() > reportTimer) {
+ //TODO collect sensor data
+ char reportMsg[(USING_TEMPERATURE*2+USING_LIGHT*2+USING_AIR*2+USING_LASER+USING_ACCEL*3+1)*4+2];//+2 because of the 'R' character and the eof
+ reportMsg[0] = 'R';
+ for(int ii=0;ii<4;ii++){
+#if USING_TEMPERATURE
+ reportMsg[1+ii]=*(((uint8_t*)(&(measurements.temperature)))+ii);
+ reportMsg[5+ii]=*(((uint8_t*)(&(measurements.humidity)))+ii);
+#endif
+#if USING_LIGHT
+ reportMsg[1+8*USING_TEMPERATURE+ii]=*(((uint8_t*)(&(measurements.visible)))+ii);
+ reportMsg[5+8*USING_TEMPERATURE+ii]=*(((uint8_t*)(&(measurements.infrared)))+ii);
+#endif
+#if USING_AIR
+ reportMsg[1+8*(USING_TEMPERATURE+USING_LIGHT)+ii]=*(((uint8_t*)(&(measurements.co)))+ii);
+ reportMsg[5+8*(USING_TEMPERATURE+USING_LIGHT)+ii]=*(((uint8_t*)(&(measurements.tvoc)))+ii);
+#endif
+#if USING_LASER
+ reportMsg[1+8*(USING_TEMPERATURE+USING_LIGHT+USING_AIR)+ii]=*(((uint8_t)(&(measurements.distance)))+ii);
+#endif
+#if USING_ACCEL
+ reportMsg[1+8*(USING_TEMPERATURE+USING_LIGHT+USING_AIR)+4*USING_LASER+ii]=*(((uint8_t*)(&(measurements.xAcceleration)))+ii);
+ reportMsg[1+8*(USING_TEMPERATURE+USING_LIGHT+USING_AIR)+4*USING_LASER+ii]=*(((uint8_t*)(&(measurements.yAcceleration)))+ii);
+ reportMsg[1+8*(USING_TEMPERATURE+USING_LIGHT+USING_AIR)+4*USING_LASER+ii]=*(((uint8_t*)(&(measurements.zAcceleration)))+ii);
+#endif
+ }
+ /*char testMsg[13] = "Hello World!";
+ testMsg[5] = (char)0x00;
+ httpPost(testMsg, 13);*/
+ httpPost(reportMsg, (USING_TEMPERATURE*2+USING_LIGHT*2+USING_AIR*2+USING_LASER+USING_ACCEL*3+1)*4+2);
+ /* Restart timer */
+ timeSinceReport.reset();
+ }
- /* Put */
- if (put_clicked) {
- put_clicked = false;
- lcd_print("put");
- NetworkInterface* net = &wifiIF;
- HttpRequest* request = new HttpRequest(net, HTTP_PUT, "http://10.25.2.152:8080");
- request->set_header("Content-Type", "application/json");
- const char body[] = "{\"put\":\"request\"}";
- HttpResponse* response = request->send(body, strlen(body));
- lcd_print(response->get_body_as_string().c_str());
- delete request;
+ /* Check whether or not to send alert */
+ uint8_t breach; //0x0f if below lower boundary, 0xf0 if above higher boundary
+ uint8_t alertReset;
+ for(int ii=0;ii<ALERTLISTSIZE;ii++){
+ breach = 0x00;
+ alertReset = 0;
+ switch(alertList[ii].sensor) {
+#if USING_TEMPERATURE
+ case 'T':
+ if(!alertList[ii].active) {
+ if(measurements.temperature < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.temperature > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.temperature > alertList[ii].lowThreshold
+ && measurements.temperature < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+ case 'H':
+ if(!alertList[ii].active) {
+ if(measurements.humidity < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.humidity > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.humidity > alertList[ii].lowThreshold
+ && measurements.humidity < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+#endif
+#if USING_LIGHT
+ case 'V':
+ if(!alertList[ii].active) {
+ if(measurements.visible < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.visible > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.visible > alertList[ii].lowThreshold
+ && measurements.visible < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+ case 'I':
+ if(!alertList[ii].active) {
+ if(measurements.infrared < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.infrared > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.infrared > alertList[ii].lowThreshold
+ && measurements.infrared < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+#endif
+#if USING_AIR
+ case 'C':
+ if(!alertList[ii].active) {
+ if(measurements.co < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.co > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.co > alertList[ii].lowThreshold
+ && measurements.co < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+ case 'O':
+ if(!alertList[ii].active) {
+ if(measurements.tvoc < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.tvoc > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.tvoc > alertList[ii].lowThreshold
+ && measurements.tvoc < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+#endif
+#if USING_LASER
+ case 'D':
+ if(!alertList[ii].active) {
+ if(measurements.distance < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.distance > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.distance > alertList[ii].lowThreshold
+ && measurements.distance < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+#endif
+#if USING_ACCEL
+ case 'X':
+ if(!alertList[ii].active) {
+ if(measurements.xAcceleration < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.xAcceleration > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.xAcceleration > alertList[ii].lowThreshold
+ && measurements.xAcceleration < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+ case 'Y':
+ if(!alertList[ii].active) {
+ if(measurements.yAcceleration < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.yAcceleration > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.yAcceleration > alertList[ii].lowThreshold
+ && measurements.yAcceleration < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+ case 'Z':
+ if(!alertList[ii].active) {
+ if(measurements.zAcceleration < alertList[ii].lowThreshold) {
+ alertList[ii].active = 1;
+ breach = 0x0f;
+ } else if(measurements.zAcceleration > alertList[ii].highThreshold) {
+ alertList[ii].active = 1;
+ breach = 0xf0;
+ }
+ } else if( measurements.zAcceleration > alertList[ii].lowThreshold
+ && measurements.zAcceleration < alertList[ii].highThreshold ) {
+ alertList[ii].active = 0;
+ alertReset = 1;
+ }
+ break;
+#endif
+ default:
+ break;
+ }
+ if(breach != 0) {
+ char msgBuff[5] = {'A', 'S', (char)alertList[ii].id, (char)breach};
+ httpPost(msgBuff, 5);
+ } else if(alertReset) {
+ char msgBuff[4] = {'A', 'R', (char)alertList[ii].id};
+ httpPost(msgBuff, 4);
+ }
}
-
}
}
