Skip to content
Snippets Groups Projects
qthing.h 4.76 KiB
Newer Older
Jens Nolte's avatar
Jens Nolte committed
#ifndef QTHING_H
#define QTHING_H

#include <string>

#include <string>
#include <functional>

#include "driver/gpio.h"
fxk8y's avatar
fxk8y committed
#include "lwip/sockets.h"

// undefining IPADDR_NONE from lwip because it is redefined in arduino
#undef INADDR_NONE
Jens Nolte's avatar
Jens Nolte committed

// types
enum pull_resistor_t { none, pullup, pulldown };
enum connection_status_t { uninitialized, disconnected, connecting, connected };
typedef std::function<void(std::string)> message_callback_t;
typedef std::function<void(connection_status_t)> connection_status_callback_t;
typedef std::function<void()> mqtt_connected_callback_t;
typedef struct {
    const std::string& topic;
    const char* payload;
    const uint32_t length;
    const uint32_t offset;
    const uint32_t total_length;
} multipart_message_t;

fxk8y's avatar
fxk8y committed
typedef std::function<void(multipart_message_t)> binary_message_callback_t;

enum ota_state_t { start, progress, success, error };
typedef struct {
    const ota_state_t state;
    const esp_err_t error;
    const uint32_t bytes_written;
    const uint32_t bytes_total;
} ota_event_t;

typedef std::function<void(ota_event_t)> ota_event_callback_t;
// core
void enable_status_led(gpio_num_t gpio = GPIO_NUM_2, bool negated = false);
Jens Nolte's avatar
Jens Nolte committed
void show_activity();
Jens Nolte's avatar
Jens Nolte committed
// network
void enable_wlan();
Jens Nolte's avatar
Jens Nolte committed
connection_status_t get_wlan_connection_status();
void add_wlan_connection_status_callback(connection_status_callback_t callback);
void add_combined_mqtt_connection_status_callback(connection_status_callback_t handler);
Jens Nolte's avatar
Jens Nolte committed

void enable_ethernet_lan8720();
connection_status_t get_eth_connection_status();
void add_eth_connection_status_callback(connection_status_callback_t callback);
connection_status_t get_network_connection_status();
void add_network_connection_status_callback(connection_status_callback_t callback);

// mqtt
void publish_message(const std::string& topic, const std::string& message);
void add_message_callback(const std::string& topic, message_callback_t callback);
fxk8y's avatar
fxk8y committed
void add_binary_message_callback(const std::string& topic, binary_message_callback_t callback);
void add_ota_event_callback(ota_event_callback_t callback);
connection_status_t get_mqtt_connection_status();
bool is_mqtt_connected();
void add_mqtt_connection_status_callback(connection_status_callback_t callback);
void add_mqtt_connected_callback(mqtt_connected_callback_t callback);
Jens Nolte's avatar
Jens Nolte committed
// common IO
void enable_oled();

void add_digital_input(gpio_num_t gpio_num, pull_resistor_t pull_resistor, std::function<void()> on_falling_edge, std::function<void()> on_rising_edge);
void add_digital_input(gpio_num_t gpio_num, pull_resistor_t pull_resistor, std::string topic);

Jens Nolte's avatar
Jens Nolte committed
void add_button(gpio_num_t gpio, std::function<void()> on_press = NULL, std::function<void()> on_release = NULL);
void add_button(gpio_num_t gpio, std::string topic, std::string message);
void add_relay(const std::string& topic, gpio_num_t gpio_off, gpio_num_t gpio_on);
Jens Nolte's avatar
Jens Nolte committed
void add_digital_output(const std::string& topic, gpio_num_t gpio);
Jens Nolte's avatar
Jens Nolte committed

void enable_lcd(const std::string& topic, uint8_t rs, uint8_t en, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);

fxk8y's avatar
fxk8y committed
// LED strips
namespace qthing {
    enum led_strip_types_t {
        LED_WS2812_V1,
        LED_WS2812B_V1,
        LED_WS2812B_V2,
        LED_WS2812B_V3,
        LED_WS2813_V1,
        LED_WS2813_V2,
        LED_WS2813_V3,
        LED_SK6812_V1,
        LED_SK6812W_V1,
    };

    typedef union {
        struct __attribute__ ((packed)) {
            uint8_t r, g, b, w;
        };
        uint32_t num;
    } led_color_t;

    typedef std::function<led_color_t(uint8_t, uint16_t, led_color_t)> led_color_handler_t;

    void enable_leds(uint8_t led_strip_fps = 60);
fxk8y's avatar
fxk8y committed
    void add_ledstrip(gpio_num_t gpio, uint16_t num_leds, qthing::led_strip_types_t led_type);
    void set_color_handler(led_color_handler_t led_color_handler);
    void set_led_strip_fps(uint8_t fps);
fxk8y's avatar
fxk8y committed


    // BME280
    typedef struct {
        float temperature;
        float humidity;
        float pressure;
    } bme280_data_t;

    typedef std::function<void(bme280_data_t)> bme280_measure_callback_t;

fxk8y's avatar
fxk8y committed
    void add_bme280(gpio_num_t sda, gpio_num_t scl, std::string topic, qthing::bme280_measure_callback_t callback = NULL, uint8_t address = 0x76);
fxk8y's avatar
fxk8y committed
    typedef std::function<void()> ntp_callback_t;
    void enable_ntp(std::string address = "pool.ntp.org", std::string timezone = "CET-1CEST,M3.5.0,M10.5.0/3", qthing::ntp_callback_t callback = NULL);
fxk8y's avatar
fxk8y committed


    typedef struct {
        struct sockaddr_in6 sourceAddr;
        const char* payload;
        const uint16_t length;
    } udpPacket;

    typedef std::function<void(udpPacket)> udpPacketCallback;
    void addUDPPacketCallback(std::string magicString, udpPacketCallback callback);
fxk8y's avatar
fxk8y committed
    void start_udp_server();
fxk8y's avatar
fxk8y committed
}

// utility
std::string to_string(float value, int precision = 2);
Jens Nolte's avatar
Jens Nolte committed
std::string to_string(uint32_t value);
fxk8y's avatar
fxk8y committed
std::string to_string(struct sockaddr_in6 sourceAddr);
#endif