diff --git a/project/Core/Src/mug.c b/project/Core/Src/mug.c new file mode 100644 index 0000000..b1eba9a --- /dev/null +++ b/project/Core/Src/mug.c @@ -0,0 +1,144 @@ +/** + * @file mug.c + * @mosquitto application for group assignment + * @author RobinVdB + */ + +#include "mdns.h" +#include "httpd.h" +#include "lwip/apps/fs.h" +#include +#include "lwip/ip_addr.h" +#include "mqtt.h" +#include "mug.h" + +static void mqtt_pub_request_cb(void*, err_t); +void example_publish(mqtt_client_client_t, void*); +static void mqtt_incoming_publish_cb(void*, const char*, u32_t); +static void mqtt_incoming_data_cb(void*, const u8_t*, u16_t, u8_t); +static void mqtt_sub_request_cb(void*, err_t*); +static void mqtt_connection_cb(mqtt_client_t*, void*, mqtt_connection_status_t); +void example_do_connect(mqtt_client_t*); + + +static void mqtt_pub_request_cb(void *arg, err_t result) +{ + if(result != ERR_OK) { + printf("Publish result: %d\n", result); + } +} + +int teller = 0; +void example_publish(mqtt_client_t *client, void *arg) +{ + printf("testing publish\n"); + const char *pub_payload[20]; + err_t err; + u8_t qos = 2; + u8_t retain = 0; + itoa(teller, &pub_payload, 10); + err = mqtt_publish(client, "pushbutton_event", pub_payload, strlen(pub_payload), qos, retain, mqtt_pub_request_cb, arg); + if(err != ERR_OK) { + printf("Publish err: %d\n", err); + } +} + + +static int inpub_id; +static void mqtt_incoming_publish_cb(void *arg, const char *topic, u32_t tot_len) +{ + printf("Incoming publish at topic %s with total length %u\n", topic, (unsigned int)tot_len); + + //check for which topic a publish was received for + if(strcmp(topic, "/input/setText") == 0) { + inpub_id = 0; + } else if(strcmp(topic, "/input/setImage") == 0) { + inpub_id = 1; + } else if(strcmp(topic, "/input/setTextColor") == 0) { + inpub_id = 2; + } else if(strcmp(topic, "/input/setColor") == 0) { + inpub_id = 3; + } else { + //in case of wrong topic + inpub_id = 4; + } +} + +static void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags) +{ + printf("Incoming publish payload with length %d, flags %u\n", len, (unsigned int)flags); + + if(flags & MQTT_DATA_FLAG_LAST) { + if (inpub_id == 0) { + //places text on the lcd + } else if (inpub_id == 1) { + //places an image on the lcd + } else if (inpub_id == 2) { + //changes the text color on the lcd + } else if (inpub_id == 3) { + //changes the background color + } else { + printf("mqtt_incoming_data_cb: Ignoring payload...\n"); + } + } else { + } +} + +static void mqtt_sub_request_cb(void *arg, err_t result) +{ + printf("Subscribe result: %d\n", result); +} + +static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status) +{ + printf("entered connection cb function\n"); + err_t err; + if(status == MQTT_CONNECT_ACCEPTED) { + printf("mqtt_connection_cb: Successfully connected\n"); + + //set up callback function for input + mqtt_set_inpub_callback(client, mqtt_incoming_publish_cb, mqtt_incoming_data_cb, arg); + + //subscribe to the topics setText, setImage, setColor and setTextcolor + err = mqtt_subscribe(client, "/input/#", 1, mqtt_sub_request_cb, arg); + + if(err != ERR_OK) { + printf("mqtt_subscribe return: %d\n", err); + } + //publish list of images here + } else { + printf("mqtt_connection_cb: Disconnected, reason: %d\n", status); + + //try to reconnect + example_do_connect(client); + } +} + +void example_do_connect(mqtt_client_t *client) +{ + printf("testing the connection\n"); + struct mqtt_connect_client_info_t ci; + err_t err; + + memset(&ci, 0, sizeof(ci)); + + ci.client_id = "lwip_test"; + ip_addr_t server_ip; + IP4_ADDR(&server_ip, 192,168,69,11); + uint16_t server_port = 1883; + err = mqtt_client_connect(client, &server_ip, server_port, mqtt_connection_cb, 0, &ci); + if(err != ERR_OK) { + printf("mqtt_connect return %d\n", err); + } + if(err == ERR_OK) { + printf("Went into mqtt_client_connect; mqtt_connect return %d\n", err); + } +} + +void mug_init() { + mqtt_client_t *client = mqtt_client_new(); + if(client != NULL) { + printf("Starting connection test\n"); + example_do_connect(client); + } +}