vote controller

Dependencies:   MQTT

Fork of PGO6_VoteController_template by Jens de hoog

Committer:
niels_balemans
Date:
Thu Oct 11 16:08:43 2018 +0000
Revision:
4:836cd4df41ba
Parent:
3:062b94b59b1b
vote controller

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jensdehoog 0:fd29cd85e75e 1 #define APP_VERSION 0.6f
jensdehoog 0:fd29cd85e75e 2 #define MQTT_VERSION 3
jensdehoog 0:fd29cd85e75e 3 #define BROKER_NAME "broker.hivemq.com"
jensdehoog 0:fd29cd85e75e 4 #define BROKER_PORT 1883
jensdehoog 0:fd29cd85e75e 5
jensdehoog 0:fd29cd85e75e 6 #include "debounce_button.h"
jensdehoog 0:fd29cd85e75e 7 #include "EthernetInterface.h"
jensdehoog 0:fd29cd85e75e 8 #include "MQTTNetwork.h"
jensdehoog 0:fd29cd85e75e 9 #include "MQTTmbed.h"
jensdehoog 0:fd29cd85e75e 10 #include "MQTTClient.h"
jensdehoog 0:fd29cd85e75e 11
jensdehoog 0:fd29cd85e75e 12 /**
jensdehoog 0:fd29cd85e75e 13 TODO
jensdehoog 0:fd29cd85e75e 14 ----
jensdehoog 0:fd29cd85e75e 15 - Check if the button has been pressed. If so, print the amount of clicks to a serial terminal.
jensdehoog 0:fd29cd85e75e 16 - Make an MQTT-service which:
jensdehoog 0:fd29cd85e75e 17 - starts up a network using EthernetInterface. Make sure the development board requests its address via DHCP.
jensdehoog 0:fd29cd85e75e 18 - makes a client and connects it to the broker using a client ID and credentials (username & password).
jensdehoog 0:fd29cd85e75e 19 - sends messages at the same topic as the smartphone app from PGO 2. Feel free to choose which Quality of Service
jensdehoog 0:fd29cd85e75e 20 you are going to use. Make a separate function which handles the sending procedure. Therefore, this function
jensdehoog 0:fd29cd85e75e 21 can be called each time we want to send a certain message.
jensdehoog 0:fd29cd85e75e 22 - When the button is pressed once, we send an upvote. When pressed twice, a downvote is sent. By pressing 4 times,
jensdehoog 0:fd29cd85e75e 23 the program disconnects from the broker and terminates.
jensdehoog 0:fd29cd85e75e 24
jensdehoog 0:fd29cd85e75e 25 Extra
jensdehoog 0:fd29cd85e75e 26 -----
jensdehoog 0:fd29cd85e75e 27 - Subscribe to the topic on which the song data is published. Display this received message on the serial terminal.
jensdehoog 0:fd29cd85e75e 28 - Test this controller in the complete system of PGO 2. Use these controllers instead of the smartphones.
jensdehoog 0:fd29cd85e75e 29
jensdehoog 0:fd29cd85e75e 30 Tips & tricks
jensdehoog 0:fd29cd85e75e 31 -------------
jensdehoog 0:fd29cd85e75e 32 - To generate an interrupt on the press of a button, use:
jensdehoog 0:fd29cd85e75e 33 InterruptIn button(USER_BUTTON);
jensdehoog 0:fd29cd85e75e 34 ...
jensdehoog 0:fd29cd85e75e 35 button.fall(callback(someFunction));
jensdehoog 0:fd29cd85e75e 36 - Before implementing MQTT, test the multiclick feature first.
jensdehoog 0:fd29cd85e75e 37 - Have a look at the MQTT-library for Mbed and the HelloMQTT-example.
jensdehoog 0:fd29cd85e75e 38 - To have a uniform message sending procedure, use the following function usage:
jensdehoog 0:fd29cd85e75e 39 sendMessage(&client, topic, buf, qos, retained, duplicate)
jensdehoog 0:fd29cd85e75e 40 */
jensdehoog 0:fd29cd85e75e 41
niels_balemans 3:062b94b59b1b 42 char* topic;
niels_balemans 3:062b94b59b1b 43 //char* buf;
niels_balemans 3:062b94b59b1b 44 InterruptIn button1(USER_BUTTON);
niels_balemans 3:062b94b59b1b 45
niels_balemans 3:062b94b59b1b 46 void sendMessage(MQTT::Client<MQTTNetwork, Countdown> &client, char* topic, char* msg, bool retained, bool dup) {
niels_balemans 3:062b94b59b1b 47 char buf[100];
niels_balemans 3:062b94b59b1b 48 sprintf(buf, msg);
niels_balemans 3:062b94b59b1b 49 MQTT::Message message;
niels_balemans 3:062b94b59b1b 50 message.qos = MQTT::QOS0;
niels_balemans 3:062b94b59b1b 51 message.retained = retained;
niels_balemans 3:062b94b59b1b 52 message.dup = dup;
niels_balemans 3:062b94b59b1b 53 message.payload = (void*)buf;
niels_balemans 3:062b94b59b1b 54 message.payloadlen = strlen(buf)+1;
niels_balemans 3:062b94b59b1b 55 client.publish(topic, message);
niels_balemans 3:062b94b59b1b 56 }
niels_balemans 3:062b94b59b1b 57
jensdehoog 0:fd29cd85e75e 58 int main(int argc, char* argv[])
jensdehoog 0:fd29cd85e75e 59 {
niels_balemans 3:062b94b59b1b 60 printf("Starting vote controller...\n\r");
niels_balemans 3:062b94b59b1b 61 button1.fall(callback(button1_onpressed_cb));
niels_balemans 3:062b94b59b1b 62
niels_balemans 3:062b94b59b1b 63 EthernetInterface eth;
niels_balemans 3:062b94b59b1b 64 eth.connect();
niels_balemans 3:062b94b59b1b 65 printf("Ethernet initialized: IP %s\n\r", eth.get_ip_address());
niels_balemans 3:062b94b59b1b 66
niels_balemans 3:062b94b59b1b 67 MQTTNetwork mqtt(&eth);
niels_balemans 3:062b94b59b1b 68 MQTT::Client<MQTTNetwork, Countdown> client(mqtt);
niels_balemans 3:062b94b59b1b 69 int rc = mqtt.connect(BROKER_NAME, BROKER_PORT);
niels_balemans 3:062b94b59b1b 70 if(rc != 0) {
niels_balemans 3:062b94b59b1b 71 printf("MQTT connection failed!\r\n");
niels_balemans 3:062b94b59b1b 72 }
niels_balemans 3:062b94b59b1b 73
niels_balemans 3:062b94b59b1b 74 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
niels_balemans 3:062b94b59b1b 75 data.MQTTVersion = MQTT_VERSION;
niels_balemans 4:836cd4df41ba 76 data.clientID.cstring = "niels";
niels_balemans 3:062b94b59b1b 77 data.username.cstring = "niels";
niels_balemans 3:062b94b59b1b 78 data.password.cstring = "niels";
niels_balemans 3:062b94b59b1b 79 rc = client.connect(data);
niels_balemans 3:062b94b59b1b 80 if(rc != 0) {
niels_balemans 3:062b94b59b1b 81 printf("Client connection failed!\n\r");
niels_balemans 3:062b94b59b1b 82 }
niels_balemans 3:062b94b59b1b 83
niels_balemans 3:062b94b59b1b 84 topic = "niels";
niels_balemans 3:062b94b59b1b 85
niels_balemans 3:062b94b59b1b 86 bool running = true;
niels_balemans 3:062b94b59b1b 87 while(running) {
niels_balemans 3:062b94b59b1b 88 if(multiclick_state != 0) {
niels_balemans 3:062b94b59b1b 89 //printf("%d\n\r", multiclick_state);
niels_balemans 3:062b94b59b1b 90 switch(multiclick_state) {
niels_balemans 3:062b94b59b1b 91 case 1:
niels_balemans 3:062b94b59b1b 92 printf("Upvoting\n\r");
niels_balemans 3:062b94b59b1b 93 sendMessage(client, topic, "upvote", false, false);
niels_balemans 3:062b94b59b1b 94 break;
niels_balemans 3:062b94b59b1b 95 case 2:
niels_balemans 3:062b94b59b1b 96 printf("Downvoting\n\r");
niels_balemans 3:062b94b59b1b 97 sendMessage(client, topic, "downvote", false, false);
niels_balemans 3:062b94b59b1b 98 break;
niels_balemans 3:062b94b59b1b 99 case 4:
niels_balemans 3:062b94b59b1b 100 printf("Terminating\n\r");
niels_balemans 3:062b94b59b1b 101 running = false;
niels_balemans 3:062b94b59b1b 102 mqtt.disconnect();
niels_balemans 3:062b94b59b1b 103 break;
niels_balemans 3:062b94b59b1b 104 default:
niels_balemans 3:062b94b59b1b 105 break;
niels_balemans 3:062b94b59b1b 106 }
niels_balemans 3:062b94b59b1b 107 multiclick_state = 0;
niels_balemans 3:062b94b59b1b 108 }
niels_balemans 3:062b94b59b1b 109 }
jensdehoog 0:fd29cd85e75e 110
jensdehoog 0:fd29cd85e75e 111 return 0;
jensdehoog 0:fd29cd85e75e 112 }