earthquake finder
Dependencies: C12832 EthernetInterface MQTT mbed-rtos mbed picojson
main.cpp
- Committer:
- co838_ab981
- Date:
- 2016-05-02
- Revision:
- 0:bdc16d97b0cb
File content as of revision 0:bdc16d97b0cb:
/* Include mbed library */ #include "mbed.h" /* Include LCD library */ #include "C12832.h" /* include MQTT library */ #include "MQTTEthernet.h" #include "MQTTClient.h" /* Include Json Library */ #include "picojson.h" /* Communication with the host (serial over USB) */ Serial host (USBTX, USBRX); /* LED on main card */ DigitalOut gpo(D0); DigitalOut ledR(LED_RED); DigitalOut ledG(LED_GREEN); /* LED on shield card */ PwmOut red(D5); PwmOut green(D9); /* LCD on the shield (128x32) */ C12832 shlcd (D11, D13, D12, D7, D10); /* Joystics */ DigitalIn select(D4); /* Speaker */ PwmOut speaker(D6); static volatile int Check = 0; static int err = 0; /* Put all led off */ void ledOff() { ledR = 1; ledG = 1; red.write(1.0f); green.write(1.0f); } /* Show hostname and port on lcd */ void showHostPort(char *host, int port) { shlcd.cls(); shlcd.locate(40,2); shlcd.printf("Welcome"); shlcd.locate(5,10); shlcd.printf("Connecting to : "); shlcd.locate(5,18); shlcd.printf("%s:%d", host, port); wait(0.2f); } /* Show error msg on lcd */ void showErrorMsg(int rc) { shlcd.cls(); shlcd.locate(5,2); shlcd.printf("An error occured,"); shlcd.locate(5,10); shlcd.printf("pls restart the application"); shlcd.locate(5,18); if (rc == 1) shlcd.printf("Connection fail to the host"); else if (rc == 2) shlcd.printf("Client: Invalid information"); else shlcd.printf("Fail to subscribe"); wait(4.0f); } /* Show subscribe msg on lcd */ void showSubscribe(char *topic) { shlcd.cls(); shlcd.locate(40,2); shlcd.printf("Welcome"); shlcd.locate(5,10); shlcd.printf("Subscribe to : "); shlcd.locate(5,18); shlcd.printf("%s", topic); wait(1.0f); } /* Show wait for data on lcd */ void showWaitData() { shlcd.cls(); shlcd.locate(40,2); shlcd.printf("Welcome"); shlcd.locate(15,10); shlcd.printf("Pls wait for data ..."); } /* Put on/off the light and active the speaker. (Danger 1 = Higth danger, Danger 3 = Low danger) */ void danger1() { for (float i=2000.0; i<(float)10000.0; i+=(float)50.0) { speaker.period((float)1.0/i); speaker = 0.06; ledR = ledR ? 0 : 1; if (red.read() == 0) red.write(1.0f); else red.write(0.0f); wait(0.03); } speaker=0.0; ledR = 0; red.write(0.0f); } /* Put on/off the light and active the speaker. (Danger 1 = Higth danger, Danger 3 = Low danger) */ void danger2() { for (float i=2000.0; i<(float)10000.0; i+=(float)75.0) { speaker.period((float)1.0/i); speaker = 0.06; ledR = ledR ? 0 : 1; if (green.read() == 0) green.write(1.0f); else green.write(0.0f); if (red.read() == 0) red.write(1.0f); else red.write(0.0f); wait(0.03); } speaker=0.0; ledG = 0; ledR = 0; red.write(0.0f); green.write(0.0f); } /* Put on/off the light and active the speaker. (Danger 1 = Higth danger, Danger 3 = Low danger) */ void danger3() { for (float i=2000.0; i<(float)10000.0; i+=(float)100.0) { speaker.period((float)1.0/i); speaker = 0.06; ledG = ledG ? 0 : 1; if (green.read() == 0) green.write(1.0f); else green.write(0.0f); wait(0.03); } speaker=0.0; ledG = 0; green.write(0.0f); } /* Get msg from mqtt server, parse the json, show data on lcd and call the function danger. */ void messageArrived(MQTT::MessageData& md) { MQTT::Message &message = md.message; picojson::value res; string json((char*)message.payload); const char *value = json.c_str(); picojson::parse(res, value, value + strlen(value)); if (Check == (10 * (int)res.get("nb").get<double>())) { ledOff(); return ; } shlcd.cls(); shlcd.locate(-4,0); shlcd.printf("%s", res.get("l").get<string>().c_str()); shlcd.locate(0,8); shlcd.printf("%s", res.get("t").get<string>().c_str()); shlcd.locate(0,16); shlcd.printf("Distance: %s, M: %s", res.get("di").get<string>().c_str(), res.get("m").get<string>().c_str()); ledOff(); if ((int)res.get("da").get<double>() == 1) danger1(); else if ((int)res.get("da").get<double>() == 2) danger2(); else danger3(); Check = 10 * (int)res.get("nb").get<double>(); } int main() { char *topic = "ab981_a5_iot"; char *hostname = "test.mosquitto.org"; int port = 1883; host.baud (38400); /* set baud rate */ ledOff(); showHostPort(hostname, port); MQTTEthernet ipstack = MQTTEthernet(); MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack); if (ipstack.connect(hostname, port) != 0) /* Connecting to server */ showErrorMsg(1); MQTTPacket_connectData data = MQTTPacket_connectData_initializer; data.MQTTVersion = 3; data.clientID.cstring = "mbed-a5"; data.keepAliveInterval = 20; data.cleansession = 1; if (client.connect(data) != 0) /* send data client */ showErrorMsg(2); showSubscribe(topic); if (client.subscribe(topic, MQTT::QOS2, messageArrived) != 0) /* subscribe to channel */ showErrorMsg(3); showWaitData(); while (!select || err != 1) { client.yield(100); } shlcd.cls(); shlcd.locate(40,8); shlcd.printf("Goodbye"); client.unsubscribe(topic); client.disconnect(); ipstack.disconnect(); }