Vote Controller IOT

Dependencies:   MQTT

Fork of PGO6_VoteController_template by Jens de hoog

main.cpp

Committer:
kjellkleyn
Date:
2017-11-06
Revision:
3:b2c9de2f45c7
Parent:
2:5b7d055dbc91

File content as of revision 3:b2c9de2f45c7:

#define APP_VERSION     0.6f
#define MQTT_VERSION    3
#define BROKER_NAME     "broker.hivemq.com"
#define BROKER_PORT     1883

#include "debounce_button.h"
#include "EthernetInterface.h"
#include "MQTTNetwork.h"
#include "MQTTmbed.h"
#include "MQTTClient.h"

using namespace MQTT;
char* topic = "dansvloerVincent/votes";
char buf[100];


volatile bool button1_pressed;   // Used in the main loop
volatile bool button1_enabled = true;   // Used for debouncing
volatile int multiclick_state;   // Counts how many clicks occured in the time slot, used in main loop
volatile bool button1_busy;      // Informs the mainloop that the user is clicking the button
volatile bool countSecond = false;
volatile bool readyClick = false;
int arrivedcount = 0;

/**
    TODO
    ----
    -   Check if the button has been pressed. If so, print the amount of clicks to a serial terminal.
    -   Make an MQTT-service which:
        -   starts up a network using EthernetInterface. Make sure the development board requests its address via DHCP.
        -   makes a client and connects it to the broker using a client ID and credentials (username & password).
        -   sends messages at the same topic as the smartphone app from PGO 2. Feel free to choose which Quality of Service
            you are going to use. Make a separate function which handles the sending procedure. Therefore, this function
            can be called each time we want to send a certain message.
    -   When the button is pressed once, we send an upvote. When pressed twice, a downvote is sent. By pressing 4 times,
        the program disconnects from the broker and terminates.
        
    Extra
    -----
    -   Subscribe to the topic on which the song data is published. Display this received message on the serial terminal.
    -   Test this controller in the complete system of PGO 2. Use these controllers instead of the smartphones.
    
    Tips & tricks
    -------------
    -   To generate an interrupt on the press of a button, use:
            InterruptIn button(USER_BUTTON);
            ...
            button.fall(callback(someFunction));
    -   Before implementing MQTT, test the multiclick feature first.
    -   Have a look at the MQTT-library for Mbed and the HelloMQTT-example.
    -   To have a uniform message sending procedure, use the following function usage:
            sendMessage(&client, topic, buf, qos, retained, duplicate)
*/

void messageArrived(MQTT::MessageData& md)
{
    MQTT::Message &message = md.message;
    printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
    printf("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
    ++arrivedcount;
}

int main(int argc, char* argv[])
{
     printf("Starting program \r\nConnecting...\r\n");
     EthernetInterface eInterface;
     //eInterface.set_network("192.168.0.95","255.255.255.0","192.168.0.1");
     eInterface.connect();
     
     
     //const char *ip = eInterface.get_ip_address();
    printf("IP address is: %s\r\n", eInterface.get_ip_address());
     
     //________________________________________________________________
     NetworkInterface *network = &eInterface;
    if (!network) {
        return -1;
    }

    MQTTNetwork mqttNetwork(network);

    MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);

    const char* hostname = "143.129.39.151";
    //const char* hostname = "broker.mqttdashboard.com";
    int port = 1883;
    printf("Connecting to %s:%d\r\n", hostname, port);
    int rc = mqttNetwork.connect(hostname, port);
    if (rc != 0)
        printf("rc from TCP connect is %d\r\n", rc);

    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.MQTTVersion = 3;
    data.clientID.cstring = "kjell";
    data.username.cstring = "smartcity";
    data.password.cstring = "smartcity";
    if ((rc = client.connect(data)) != 0)
        printf("rc from MQTT connect is %d\r\n", rc);
  
    MQTT::Message message;
    message.qos = MQTT::QOS1;
     InterruptIn button(USER_BUTTON);
     button.fall(button1_onpressed_cb);
     while(multiclick_state < 4){
        if(readyClick){
            printf("TimesClicked %d \r\n" , multiclick_state);
                                   
            if(multiclick_state == 1){                
            sprintf(buf,"likeKjell\n");  
            }else if(multiclick_state == 2 || multiclick_state == 3){
            sprintf(buf,"dislikeKjell\n");
            }
            printf("buf : %s\r\n" ,buf);
            message.payload = (void*)buf;
            message.payloadlen = strlen(buf)+1;
            rc = client.publish(topic, message);
                        
            readyClick = false;          
        }
    }

    if ((rc = client.disconnect()) != 0)
        printf("rc from disconnect was %d\r\n", rc);
        
    mqttNetwork.disconnect();
    printf("exiting program...\r\n");   

    return 0;
}