Robrecht Daems
/
PGO6_VoteController_template
Robrecht Daems
Fork of PGO6_VoteController_template by
main.cpp@2:b47f54fdea91, 2017-10-30 (annotated)
- Committer:
- Robrecht
- Date:
- Mon Oct 30 16:44:56 2017 +0000
- Revision:
- 2:b47f54fdea91
- Parent:
- 1:34e76c0cbe5a
initial commit
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 |
Robrecht | 2:b47f54fdea91 | 3 | #define BROKER_NAME "143.129.39.151" |
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 | 1:34e76c0cbe5a | 36 | The function someFunction(void) is called when this interrupt occurs. |
jensdehoog | 0:fd29cd85e75e | 37 | - Before implementing MQTT, test the multiclick feature first. |
jensdehoog | 1:34e76c0cbe5a | 38 | You can simply use 'printf()' to print to a serial terminal. The baud rate is 9600. |
jensdehoog | 0:fd29cd85e75e | 39 | - Have a look at the MQTT-library for Mbed and the HelloMQTT-example. |
jensdehoog | 0:fd29cd85e75e | 40 | - To have a uniform message sending procedure, use the following function usage: |
jensdehoog | 0:fd29cd85e75e | 41 | sendMessage(&client, topic, buf, qos, retained, duplicate) |
jensdehoog | 0:fd29cd85e75e | 42 | */ |
jensdehoog | 0:fd29cd85e75e | 43 | |
Robrecht | 2:b47f54fdea91 | 44 | InterruptIn button(USER_BUTTON); |
Robrecht | 2:b47f54fdea91 | 45 | DigitalOut myled(LED1); |
Robrecht | 2:b47f54fdea91 | 46 | EthernetInterface eth_interface; |
Robrecht | 2:b47f54fdea91 | 47 | MQTTNetwork network(ð_interface); |
Robrecht | 2:b47f54fdea91 | 48 | MQTT::Client<MQTTNetwork, Countdown> client(network); |
Robrecht | 2:b47f54fdea91 | 49 | char* topic = "clubIOT/feedback"; |
Robrecht | 2:b47f54fdea91 | 50 | char* subTopic = "clubIOT/songmeta |
Robrecht | 2:b47f54fdea91 | 51 | |
Robrecht | 2:b47f54fdea91 | 52 | /** |
Robrecht | 2:b47f54fdea91 | 53 | called when the button generates an interrupt |
Robrecht | 2:b47f54fdea91 | 54 | */ |
Robrecht | 2:b47f54fdea91 | 55 | void buttonPress() |
Robrecht | 2:b47f54fdea91 | 56 | { |
Robrecht | 2:b47f54fdea91 | 57 | button1_pressed=true; |
Robrecht | 2:b47f54fdea91 | 58 | } |
Robrecht | 2:b47f54fdea91 | 59 | |
Robrecht | 2:b47f54fdea91 | 60 | /** |
Robrecht | 2:b47f54fdea91 | 61 | called to initialize MQTT |
Robrecht | 2:b47f54fdea91 | 62 | */ |
Robrecht | 2:b47f54fdea91 | 63 | void initMQTT() |
Robrecht | 2:b47f54fdea91 | 64 | { |
Robrecht | 2:b47f54fdea91 | 65 | eth_interface.connect(); |
Robrecht | 2:b47f54fdea91 | 66 | if(eth_interface.get_ip_address() == NULL) |
Robrecht | 2:b47f54fdea91 | 67 | printf("ip adres kaput \r\n"); |
Robrecht | 2:b47f54fdea91 | 68 | else |
Robrecht | 2:b47f54fdea91 | 69 | printf("IP: %s\r\n", eth_interface.get_ip_address()); |
Robrecht | 2:b47f54fdea91 | 70 | const char* hostname = BROKER_NAME; |
Robrecht | 2:b47f54fdea91 | 71 | int port = BROKER_PORT; |
Robrecht | 2:b47f54fdea91 | 72 | int rc = network.connect(hostname, port); |
Robrecht | 2:b47f54fdea91 | 73 | if (rc != 0) |
Robrecht | 2:b47f54fdea91 | 74 | printf("rc from TCP connect is %d\r\n", rc); |
Robrecht | 2:b47f54fdea91 | 75 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
Robrecht | 2:b47f54fdea91 | 76 | data.MQTTVersion = 3; |
Robrecht | 2:b47f54fdea91 | 77 | data.clientID.cstring = "robrecht"; |
Robrecht | 2:b47f54fdea91 | 78 | data.username.cstring = "smartcity"; |
Robrecht | 2:b47f54fdea91 | 79 | data.password.cstring = "smartcity"; |
Robrecht | 2:b47f54fdea91 | 80 | if ((rc = client.connect(data)) != 0) |
Robrecht | 2:b47f54fdea91 | 81 | printf("rc from MQTT connect is %d\r\n", rc); |
Robrecht | 2:b47f54fdea91 | 82 | else |
Robrecht | 2:b47f54fdea91 | 83 | printf("connected\r\n"); |
Robrecht | 2:b47f54fdea91 | 84 | } |
Robrecht | 2:b47f54fdea91 | 85 | |
Robrecht | 2:b47f54fdea91 | 86 | /** |
Robrecht | 2:b47f54fdea91 | 87 | send a message over MQTT |
Robrecht | 2:b47f54fdea91 | 88 | */ |
Robrecht | 2:b47f54fdea91 | 89 | void sendMessage(MQTT::Client<MQTTNetwork, Countdown> *client, char* tempTopic, char* buf ,int qos, bool retained, bool duplicate) |
jensdehoog | 0:fd29cd85e75e | 90 | { |
Robrecht | 2:b47f54fdea91 | 91 | MQTT::Message message; |
Robrecht | 2:b47f54fdea91 | 92 | if(qos==0) |
Robrecht | 2:b47f54fdea91 | 93 | message.qos= MQTT::QOS0; |
Robrecht | 2:b47f54fdea91 | 94 | else if(qos==1) |
Robrecht | 2:b47f54fdea91 | 95 | message.qos= MQTT::QOS1; |
Robrecht | 2:b47f54fdea91 | 96 | else |
Robrecht | 2:b47f54fdea91 | 97 | message.qos= MQTT::QOS2; |
Robrecht | 2:b47f54fdea91 | 98 | message.retained=retained; |
Robrecht | 2:b47f54fdea91 | 99 | message.dup=duplicate; |
Robrecht | 2:b47f54fdea91 | 100 | message.payload= (void*) buf; |
Robrecht | 2:b47f54fdea91 | 101 | message.payloadlen = strlen(buf)+1; |
Robrecht | 2:b47f54fdea91 | 102 | client->publish(tempTopic, message); |
Robrecht | 2:b47f54fdea91 | 103 | } |
jensdehoog | 0:fd29cd85e75e | 104 | |
Robrecht | 2:b47f54fdea91 | 105 | /** |
Robrecht | 2:b47f54fdea91 | 106 | disconnect from MQTT |
Robrecht | 2:b47f54fdea91 | 107 | */ |
Robrecht | 2:b47f54fdea91 | 108 | void disconnect() |
Robrecht | 2:b47f54fdea91 | 109 | { |
Robrecht | 2:b47f54fdea91 | 110 | char buf[100]; |
Robrecht | 2:b47f54fdea91 | 111 | sprintf(buf, "disconnect"); |
Robrecht | 2:b47f54fdea91 | 112 | sendMessage(&client, topic, buf, 0, false, false); |
Robrecht | 2:b47f54fdea91 | 113 | client.disconnect(); |
Robrecht | 2:b47f54fdea91 | 114 | eth_interface.disconnect(); |
Robrecht | 2:b47f54fdea91 | 115 | } |
Robrecht | 2:b47f54fdea91 | 116 | |
Robrecht | 2:b47f54fdea91 | 117 | /** |
Robrecht | 2:b47f54fdea91 | 118 | Called when the controller receives a song |
Robrecht | 2:b47f54fdea91 | 119 | */ |
Robrecht | 2:b47f54fdea91 | 120 | void printMessage(MQTT::MessageData& data) |
Robrecht | 2:b47f54fdea91 | 121 | { |
Robrecht | 2:b47f54fdea91 | 122 | printf("MQTT message: %s\r\n", data.message.payload); |
Robrecht | 2:b47f54fdea91 | 123 | } |
Robrecht | 2:b47f54fdea91 | 124 | |
Robrecht | 2:b47f54fdea91 | 125 | int main(int argc, char* argv[]) |
Robrecht | 2:b47f54fdea91 | 126 | { |
Robrecht | 2:b47f54fdea91 | 127 | initMQTT(); |
Robrecht | 2:b47f54fdea91 | 128 | button.fall(callback(&buttonPress)); |
Robrecht | 2:b47f54fdea91 | 129 | client.subscribe(subTopic, MQTT::QOS1, printMessage); |
Robrecht | 2:b47f54fdea91 | 130 | |
Robrecht | 2:b47f54fdea91 | 131 | while(1) |
Robrecht | 2:b47f54fdea91 | 132 | { |
Robrecht | 2:b47f54fdea91 | 133 | if(button1_pressed){ |
Robrecht | 2:b47f54fdea91 | 134 | button1_pressed = false; |
Robrecht | 2:b47f54fdea91 | 135 | button1_onpressed_cb(); |
Robrecht | 2:b47f54fdea91 | 136 | } |
Robrecht | 2:b47f54fdea91 | 137 | if(!button1_busy && result_ready){ |
Robrecht | 2:b47f54fdea91 | 138 | result_ready=false; |
Robrecht | 2:b47f54fdea91 | 139 | printf("The button was pressed %d times in the last second \r\n", last_multiclick_state); |
Robrecht | 2:b47f54fdea91 | 140 | char buf[100]; |
Robrecht | 2:b47f54fdea91 | 141 | if(last_multiclick_state==1){ |
Robrecht | 2:b47f54fdea91 | 142 | sprintf(buf, "like"); |
Robrecht | 2:b47f54fdea91 | 143 | sendMessage(&client, topic, buf, 0, false, false); |
Robrecht | 2:b47f54fdea91 | 144 | } |
Robrecht | 2:b47f54fdea91 | 145 | else if(last_multiclick_state==2){ |
Robrecht | 2:b47f54fdea91 | 146 | sprintf(buf, "dislike"); |
Robrecht | 2:b47f54fdea91 | 147 | sendMessage(&client, topic, buf, 0, false, false); |
Robrecht | 2:b47f54fdea91 | 148 | } |
Robrecht | 2:b47f54fdea91 | 149 | else if(last_multiclick_state==4){ |
Robrecht | 2:b47f54fdea91 | 150 | disconnect(); |
Robrecht | 2:b47f54fdea91 | 151 | return 0; |
Robrecht | 2:b47f54fdea91 | 152 | } |
Robrecht | 2:b47f54fdea91 | 153 | } |
Robrecht | 2:b47f54fdea91 | 154 | } |
jensdehoog | 0:fd29cd85e75e | 155 | return 0; |
jensdehoog | 0:fd29cd85e75e | 156 | } |