Initial commit

Dependencies:   C12832 MQTT_MbedOS mbed

main.cpp

Committer:
co657_kn241
Date:
2016-12-05
Revision:
0:fb05faf411e7

File content as of revision 0:fb05faf411e7:

/**
 * 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();
}