Niels Balemans
/
PGO6_VoteController_Niels_Balemans_
vote controller
Fork of PGO6_VoteController_template by
main.cpp@3:062b94b59b1b, 2018-10-11 (annotated)
- Committer:
- niels_balemans
- Date:
- Thu Oct 11 16:06:17 2018 +0000
- Revision:
- 3:062b94b59b1b
- Parent:
- 2:5b7d055dbc91
- Child:
- 4:836cd4df41ba
portfolio vote controller
Who changed what in which revision?
User | Revision | Line number | New 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(ð); |
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 | 3:062b94b59b1b | 76 | data.clientID.cstring = "BIEEEER"; |
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 | } |