From 3957d9645f01a6512d94b2a8119bb4a53bac56d1 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Wed, 14 Dec 2016 00:08:47 +0100 Subject: [PATCH] mqtt deal with IRQ for GPIO --- WifiControlSensor/MQTT.h | 8 +++++++- WifiControlSensor/MQTT.ino | 18 ++++++++++++++++++ WifiControlSensor/WifiControlSensor.ino | 4 +++- WifiControlSensor/config_device.h | 3 ++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/WifiControlSensor/MQTT.h b/WifiControlSensor/MQTT.h index 8a22652..33c1ef1 100644 --- a/WifiControlSensor/MQTT.h +++ b/WifiControlSensor/MQTT.h @@ -1,7 +1,7 @@ #pragma once #ifndef CONFIG_DISABLE_MQTT #include "Adafruit_MQTT.h" - +typedef struct {uint8_t updated; int value;} gpioInfo; Adafruit_MQTT_Publish *MqttCreatePublisher(const char *fmt, ...); int MqttConnect(); int MqttIsConnected(); @@ -12,9 +12,12 @@ int MqttPublishDHT(float temp, float humidity); int MqttPublishDry(int dry); int MqttPublishIp(const String &ip); void MqttCheckSubscription(); +void MqttCheckIRQ(); void MqttChangeGpioValue(int gpio, int value); void MqttChangePWMValue(int gpio, int value); bool MqttIsConfigured(); +void MqttNofityIRQ(uint8_t gpio, int value); +void MqttNofity(int gpio, int value); #else int MqttConnect(){return 0;} int MqttIsConnected(){return 0;} @@ -25,7 +28,10 @@ int MqttPublishDHT(float temp, float humidity){return 0;} int MqttPublishDry(int dry){return 0;} int MqttPublishIP(const String &ip){return 0;} void MqttCheckSubscription(){} +void MqttCheckIRQ(){} void MqttChangeGpioValue(int gpio, int value){} void MqttChangePWMValue(int gpio, int value){} bool MqttIsConfigured(){} +void MqttNofityIRQ(uint8_t gpio, int value){} +void MqttNofity(int gpio, int value){} #endif diff --git a/WifiControlSensor/MQTT.ino b/WifiControlSensor/MQTT.ino index 2a5a07b..8f95de7 100644 --- a/WifiControlSensor/MQTT.ino +++ b/WifiControlSensor/MQTT.ino @@ -3,6 +3,7 @@ #include "utils.h" #include "MQTT.h" +#define MAX_PIN 15 #define MAX_GPIO_OBSERVED (MAXSUBSCRIPTIONS*2) Adafruit_MQTT_Client *mqtt; Adafruit_MQTT_Publish *mqtt_temp; @@ -14,6 +15,7 @@ Adafruit_MQTT_Publish *mqtt_ip; Adafruit_MQTT_Publish *mqttGpio[MAXSUBSCRIPTIONS] = {}; Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {}; Adafruit_MQTT_Publish *mqttGpioObserved[MAX_GPIO_OBSERVED] = {}; +gpioInfo mqttIRQ[MAX_PIN + 1] = {}; #define FEED_MAX_SIZE 96 @@ -75,6 +77,7 @@ int MqttSetup(char *server, char *user, char *passwd, int port, char *hostname) for (uint i = 0 ; i < NB_ELEMENTS(gpioObserved) && i < MAX_GPIO_OBSERVED ; i++) { mqttGpioObserved[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioObserved[i]); + new HIB(gpioObserved[i], HIGH, MqttNofityIRQ , MqttNofityIRQ, NULL ); } for (uint i = 0 ; i < NB_ELEMENTS(pwmControlled); i++) { @@ -172,6 +175,11 @@ int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription, const char *p return -1; } +void MqttNofityIRQ(uint8_t gpio, int value){ + mqttIRQ[gpio].updated = 1; + mqttIRQ[gpio].value = value; +} + void MqttNofity(int gpio, int value){ if (MqttIsConnected()) { int watchIdx = findIndex(gpio, gpioControlled); @@ -196,6 +204,16 @@ void MqttChangePWMValue(int gpio, int value) { MqttNofity(gpio, value); } +void MqttCheckIRQ() { + for (uint i = 0 ; i < NB_ELEMENTS(mqttIRQ); i++) { + if(mqttIRQ[i].updated == 1){ + mqttIRQ[i].updated = 0; + MqttNofity(i, mqttIRQ[i].value); + } + } + +} + void MqttCheckSubscription() { if (MqttConnect() == 0) { Adafruit_MQTT_Subscribe *subscription; diff --git a/WifiControlSensor/WifiControlSensor.ino b/WifiControlSensor/WifiControlSensor.ino index 2813ecb..c94c156 100644 --- a/WifiControlSensor/WifiControlSensor.ino +++ b/WifiControlSensor/WifiControlSensor.ino @@ -255,8 +255,10 @@ void loop() { ArduinoOTA.handle(); } else { server.handleClient(); - if (mode == BOOTMODE_NORMAL) + if (mode == BOOTMODE_NORMAL){ MqttCheckSubscription(); + MqttCheckIRQ(); + } delay(CONFIG_WEB_DELAY_MS); nbCycle++; diff --git a/WifiControlSensor/config_device.h b/WifiControlSensor/config_device.h index 910ee12..7ac6750 100644 --- a/WifiControlSensor/config_device.h +++ b/WifiControlSensor/config_device.h @@ -53,7 +53,8 @@ #define CONFIG_CONTROLLED_GPIO {2,13} // GPIO that can be get by mqtt and http -//#define CONFIG_OBSERVED_GPIO {} +// Pin 6 to 11 and 16 can not be used for mqtt +#define CONFIG_OBSERVED_GPIO {} // GPIO used in PWM //#define CONFIG_CONTROLLED_PWM {}