Initial commit

Dependencies:   C12832 MQTT_MbedOS mbed

Revision:
0:fb05faf411e7
diff -r 000000000000 -r fb05faf411e7 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Dec 05 15:07:11 2016 +0000
@@ -0,0 +1,223 @@
+/**
+ * Door lock Mechanism which work similar to locking and unlocking
+ * by using an RFID card to scan nfc tag which is publish onto MQTT
+ * server by saying in door is locked or unlucked.
+ * By Kwame Nyantakyi
+
+ * Use of MQTT client code created by Daniel Knox and Fred Barnes
+**/
+
+//
+#include "mbed.h"
+#include "C12832.h"
+#include "MQTTEthernet.h"
+#include "MQTTClient.h"
+
+/* speed we talk up the [USB] serial-port at */
+#define HOST_SPEED (38400)
+
+// Using Arduino pin notation
+C12832 lcd(D11, D13, D12, D7, D10);
+
+static Serial host (USBTX, USBRX);      /* connection to host */
+
+// led display
+DigitalOut red_led(D5);
+DigitalOut green_led(D9);
+
+// joystick left and right
+DigitalIn left(A4);
+AnalogIn right(A5);
+
+// sw2 and sw3
+InterruptIn sw2_int (PTC6);             /* interrupts for the two on-board switches */
+InterruptIn sw3_int (PTA4);
+
+static volatile int sw2_trig;           /* switches triggered? */
+static volatile int sw3_trig;
+
+PwmOut spkr(D6);
+
+const char* def  = "Unknown";
+const char* stat  = "Unknown";
+
+
+/* connection stuff for MQTT */
+typedef struct S_mqtt_params {
+    char *hostname;
+    int port;
+    char *topic;
+    char *clientid;
+} mqtt_params_t;
+
+/* configure MQTT with hostname, port, topic and clientid */
+static mqtt_params_t mqtt_config = {
+hostname: "129.12.44.120"
+    ,
+    port: 1883,
+topic: "unikent/users/kn241/room/status"
+    ,
+clientid: "kn241"
+};
+
+/*
+* prints stuffs on the serial host and lcd
+*/
+static int set_up(void)
+{
+    host.baud (HOST_SPEED);
+    host.printf ("\r\n\r\nEthernet MQTT client from K64F\r\n");
+
+    lcd.cls ();
+    lcd.locate (0, 0);
+    lcd.printf ("Door Lock Mechanism\n");
+
+    return 0;
+}
+
+
+/*
+* Display the status of the connection to MQTT aswell as
+* the activity of the user.
+*
+* Roboust function used to print out format,arg of server
+* server connection and user interaction on the serial host
+* and lcd
+*/
+static int display_info(const char *format, ...)
+{
+    va_list arg;
+    int re;
+
+    va_start(arg, format);
+    re = host.vprintf (format, arg);
+    va_end (arg);
+    host.printf ("\r\n");
+
+    lcd.fill (0, 20, 128, 12, 0);
+    lcd.locate (0, 15);
+    va_start (arg, format);
+    lcd.vprintf (format, arg);
+    va_end (arg);
+
+    return re;
+}
+
+/* plays sounds and sets chars to accepted */
+void accepted()
+{
+    def = "Accepted";
+    stat= "Unlocked";
+    for (float i=2000.0f; i<10000.0f; i+=100) {
+        spkr.period(1.0f/i);
+        spkr=0.5;
+        wait(0.02);
+        spkr = 0.0;
+    }
+}
+
+/* function which checks  when wrong card is scanned */
+void declined()
+{
+    def = "Rejected";
+    stat ="Locked";
+    red_led = !left;
+
+    for (float i=2000.0f; i<10000.0f; i+=100) {
+        spkr.period(1.0/150.0); // 500hz period
+        spkr =0.25;
+        wait(.02);
+        spkr=0.0;
+    }
+}
+
+//main code, where the program runs
+int main()
+{
+    const char *ip;
+    int re = 0;
+    MQTT::Message msg;
+    char buf[200];
+
+    set_up();
+    display_info("Establishing network...");
+
+    /* Brings up the network interface */
+    MQTTEthernet eth = MQTTEthernet ();
+    ip = eth.get_ip_address();
+
+    display_info("IP address is: %s", ip ?: "Not found.");
+
+    /* Create Mbed Client Interface */
+    MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown> (eth);
+
+    /* Create TCP connection */
+    eth.open (eth.getEth());
+    re = eth.connect (mqtt_config.hostname, mqtt_config.port);
+
+
+    if (!re) {
+        display_info ("Connected Status: Good");
+
+        /* Wait for a short length of time to allow user to see output messages. */
+        Thread::wait(1500);
+
+        MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
+        data.keepAliveInterval = 20;
+        data.cleansession = 1;
+        data.MQTTVersion = 3;
+        data.clientID.cstring = mqtt_config.clientid;
+        re = client.connect (data);
+
+        if (!re) {
+            display_info ("MQTT connected!");
+
+            while (!re) {
+                /* clear screen to setup - set up door status*/
+                lcd.cls ();
+                set_up();
+
+                while(1) {
+
+                    //Depending on button pressed display a colour
+                    red_led = !left;
+                    green_led = !right;
+
+                    if(right && !left) {
+                        accepted();
+                    } else if(left && !right) {
+                        declined();
+                    }
+                    display_info("Scan :%s \n", def);
+                    sprintf (buf, "%s\n", stat);
+                    // QoS 0
+
+                    msg.qos = MQTT::QOS0;
+                    msg.retained = false;
+                    msg.dup = false;
+                    msg.payload = (void*)buf;
+                    msg.payloadlen = strlen(buf)+1;
+
+                    re = client.publish (mqtt_config.topic, msg);
+                    wait(1.0);
+
+
+                    if (re) {
+                        //if data can't be publish
+                        display_info ("MQTT publish failed with %d", re);
+                    } else {
+                        Thread::wait(1500);
+                    }
+                }
+            }
+        } else {
+            //
+            display_info ("Failed to connect to MQTT");
+        }
+    } else {
+        display_info ("Failed to connect (TCP)");
+    }
+
+    // closed ethernet socket
+    eth.disconnect();
+}
\ No newline at end of file