Refactor GPIO listened/controlled configuration

And improve mqtt connection checking
This commit is contained in:
Mathieu Maret 2016-12-13 22:31:14 +01:00
parent d20d756677
commit 80252f9307
5 changed files with 48 additions and 29 deletions

View File

@ -3,6 +3,7 @@
#include "utils.h" #include "utils.h"
#include "MQTT.h" #include "MQTT.h"
#define MAX_GPIO_OBSERVED (MAXSUBSCRIPTIONS*2)
Adafruit_MQTT_Client *mqtt; Adafruit_MQTT_Client *mqtt;
Adafruit_MQTT_Publish *mqtt_temp; Adafruit_MQTT_Publish *mqtt_temp;
Adafruit_MQTT_Publish *mqtt_pressure; Adafruit_MQTT_Publish *mqtt_pressure;
@ -12,6 +13,7 @@ Adafruit_MQTT_Publish *mqtt_dry;
Adafruit_MQTT_Publish *mqtt_ip; Adafruit_MQTT_Publish *mqtt_ip;
Adafruit_MQTT_Publish *mqttGpio[MAXSUBSCRIPTIONS] = {}; Adafruit_MQTT_Publish *mqttGpio[MAXSUBSCRIPTIONS] = {};
Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {}; Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {};
Adafruit_MQTT_Publish *mqttGpioObserved[MAX_GPIO_OBSERVED] = {};
#define FEED_MAX_SIZE 96 #define FEED_MAX_SIZE 96
@ -27,11 +29,6 @@ Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {};
#define PWM_SET_FEED_FORMAT "/feeds/%s/%s/gpio/%d/set" #define PWM_SET_FEED_FORMAT "/feeds/%s/%s/gpio/%d/set"
#define IP_FEED_FORMAT "/feeds/%s/%s/configuration/ip/addr" #define IP_FEED_FORMAT "/feeds/%s/%s/configuration/ip/addr"
// Should have less that MAXSUBSCRIPTIONS elements
// MAXSUBSCRIPTIONS is defined is Adafruit_mqtt.h
const int gpioControlled[] = CONFIG_CONTROLLED_GPIO;
const int pwmWatched[] = CONFIG_CONTROLLED_PWM;
char *mqttId; char *mqttId;
bool isMqttConfigured = false; bool isMqttConfigured = false;
@ -60,21 +57,31 @@ int MqttSetup(char *server, char *user, char *passwd, int port, char *hostname)
mqtt_dry = MqttCreatePublisher(DRY_FEED_FORMAT, user, mqttId); mqtt_dry = MqttCreatePublisher(DRY_FEED_FORMAT, user, mqttId);
mqtt_ip = MqttCreatePublisher(IP_FEED_FORMAT, user, mqttId); mqtt_ip = MqttCreatePublisher(IP_FEED_FORMAT, user, mqttId);
if( NB_ELEMENTS(gpioControlled) + NB_ELEMENTS(pwmWatched) > MAXSUBSCRIPTIONS){ if (NB_ELEMENTS(gpioControlled) + NB_ELEMENTS(pwmControlled) > MAXSUBSCRIPTIONS){
SKETCH_DEBUG_PRINTF("Too much gpio/pwm to control\n Nb gpio %d Nb pwm %d Max is %d", SKETCH_DEBUG_PRINTF("Too much gpio/pwm to control\n Nb gpio %d Nb pwm %d Max is %d",
NB_ELEMENTS(gpioControlled), NB_ELEMENTS(pwmWatched), MAXSUBSCRIPTIONS); NB_ELEMENTS(gpioControlled), NB_ELEMENTS(pwmControlled), MAXSUBSCRIPTIONS);
return -1;
}
if (NB_ELEMENTS(gpioObserved) > MAX_GPIO_OBSERVED){
SKETCH_DEBUG_PRINTF("Too much gpio observed\n Nb gpio %d Nb is %d",
NB_ELEMENTS(gpioObserved), MAX_GPIO_OBSERVED);
return -1; return -1;
} }
for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled) && i < MAXSUBSCRIPTIONS; i++) { for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled); i++) {
mqtt->subscribe(MqttCreateSubscribe(GPIO_SET_FEED_FORMAT, user, mqttId, gpioControlled[i])); mqtt->subscribe(MqttCreateSubscribe(GPIO_SET_FEED_FORMAT, user, mqttId, gpioControlled[i]));
mqttGpio[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioControlled[i]); mqttGpio[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioControlled[i]);
} }
for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled) && i < MAXSUBSCRIPTIONS; i++) { for (uint i = 0 ; i < NB_ELEMENTS(gpioObserved) && i < MAX_GPIO_OBSERVED ; i++) {
mqtt->subscribe(MqttCreateSubscribe(PWM_SET_FEED_FORMAT, user, mqttId, pwmWatched[i])); mqttGpioObserved[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioObserved[i]);
mqttPwm[i] = MqttCreatePublisher(PWM_FEED_FORMAT, user, mqttId, pwmWatched[i]);
} }
for (uint i = 0 ; i < NB_ELEMENTS(pwmControlled); i++) {
mqtt->subscribe(MqttCreateSubscribe(PWM_SET_FEED_FORMAT, user, mqttId, pwmControlled[i]));
mqttPwm[i] = MqttCreatePublisher(PWM_FEED_FORMAT, user, mqttId, pwmControlled[i]);
}
return 0; return 0;
} }
@ -97,7 +104,7 @@ Adafruit_MQTT_Subscribe *MqttCreateSubscribe(const char *fmt, ...){
} }
int MqttIsConnected() { int MqttIsConnected() {
return (isMqttConfigured) ? mqtt->connected() : 0; return (isMqttConfigured && (mode == BOOTMODE_NORMAL)) ? mqtt->connected() : 0;
} }
// Function to connect and reconnect as necessary to the MQTT server. // Function to connect and reconnect as necessary to the MQTT server.
@ -105,7 +112,7 @@ int MqttIsConnected() {
int MqttConnect() { int MqttConnect() {
int8_t ret; int8_t ret;
if(!isMqttConfigured) if (!isMqttConfigured || mode != BOOTMODE_NORMAL)
return -1; return -1;
// Stop if already connected. // Stop if already connected.
@ -166,9 +173,15 @@ int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription, const char *p
} }
void MqttNofity(int gpio, int value){ void MqttNofity(int gpio, int value){
int watchIdx = findIndex(gpio, gpioControlled); if (MqttIsConnected()) {
if (watchIdx >= 0 && isMqttConfigured) { int watchIdx = findIndex(gpio, gpioControlled);
mqttGpio[watchIdx]->publish(value); if (watchIdx >= 0 ) {
mqttGpio[watchIdx]->publish(value);
} else {
watchIdx = findIndex(gpio, gpioObserved);
if (watchIdx >= 0 )
mqttGpioObserved[watchIdx]->publish(value);
}
} }
} }
@ -196,7 +209,7 @@ void MqttCheckSubscription() {
} }
gpio = getGpioFromSubscription(subscription, "/pwm/"); gpio = getGpioFromSubscription(subscription, "/pwm/");
if (gpio > 0 && findIndex(gpio, pwmWatched) >= 0) { if (gpio > 0 && findIndex(gpio, pwmControlled) >= 0) {
SKETCH_DEBUG_PRINTF("Got Subscription for PWM %d\n", gpio); SKETCH_DEBUG_PRINTF("Got Subscription for PWM %d\n", gpio);
char *value = (char *) subscription->lastread; char *value = (char *) subscription->lastread;
SKETCH_DEBUG_PRINTF("Receive data: %s\n", value); SKETCH_DEBUG_PRINTF("Receive data: %s\n", value);

View File

@ -1,6 +1,4 @@
#ifndef CONFIG_DISABLE_WEB #ifndef CONFIG_DISABLE_WEB
const int gpioWebConf[] = CONFIG_CONTROLLED_GPIO;
const int pwmWebConf[] = CONFIG_CONTROLLED_PWM;
String gpioControlHTML = ""; String gpioControlHTML = "";
String pwmControlHTML = ""; String pwmControlHTML = "";
@ -234,26 +232,26 @@ void WebHandleWifiStatus() {
} }
void WebBuildGpioControl(){ void WebBuildGpioControl(){
if (NB_ELEMENTS(gpioWebConf) > 0){ if (NB_ELEMENTS(gpioControlled) > 0){
gpioControlHTML += "<fieldset>" gpioControlHTML += "<fieldset>"
"<legend>Relay</legend>"; "<legend>Relay</legend>";
for (uint i = 0 ; i < NB_ELEMENTS(gpioWebConf) ; i++) { for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled) ; i++) {
gpioControlHTML += "Relay " + String(gpioWebConf[i]) + " " + "<a href=\"/gpio?gpio=" + String(gpioWebConf[i]) + "&amp;value=1\">ON</a>/"; gpioControlHTML += "Relay " + String(gpioControlled[i]) + " " + "<a href=\"/gpio?gpio=" + String(gpioControlled[i]) + "&amp;value=1\">ON</a>/";
gpioControlHTML += "<a href=\"/gpio?gpio=" + String(gpioWebConf[i]) + "&amp;value=0\">OFF</a><br/>"; gpioControlHTML += "<a href=\"/gpio?gpio=" + String(gpioControlled[i]) + "&amp;value=0\">OFF</a><br/>";
} }
gpioControlHTML += "</fieldset>"; gpioControlHTML += "</fieldset>";
} }
} }
void WebBuildPwmControl(){ void WebBuildPwmControl(){
if (NB_ELEMENTS(pwmWebConf) > 0){ if (NB_ELEMENTS(pwmControlled) > 0){
pwmControlHTML += "<fieldset>" pwmControlHTML += "<fieldset>"
"<legend>PWM</legend>"; "<legend>PWM</legend>";
for (uint i = 0 ; i < NB_ELEMENTS(pwmWebConf) ; i++) { for (uint i = 0 ; i < NB_ELEMENTS(pwmControlled) ; i++) {
pwmControlHTML += "PWM " + String(pwmWebConf[i]) + "<br/>"; pwmControlHTML += "PWM " + String(pwmControlled[i]) + "<br/>";
pwmControlHTML += "<input type=\"range\" min=\"0\" max=\"1023\"" pwmControlHTML += "<input type=\"range\" min=\"0\" max=\"1023\""
"style=\"background:#eee\"" "style=\"background:#eee\""
"onChange=\"setPWM(this.value," + String(pwmWebConf[i]) + ")\" />"; "onChange=\"setPWM(this.value," + String(pwmControlled[i]) + ")\" />";
} }
pwmControlHTML += "<script type=\"text/javascript\">" pwmControlHTML += "<script type=\"text/javascript\">"
"function setPWM(newValue, gpio){" "function setPWM(newValue, gpio){"

View File

@ -64,6 +64,11 @@ float dhtTemp, dhtHumidity;
int dryness; int dryness;
uint8_t mode; uint8_t mode;
productConfig conf = {BOOTMODE_SETUP, "", "", "", "", "", "", 0, 0, 0, 0, 0, 0, 0}; productConfig conf = {BOOTMODE_SETUP, "", "", "", "", "", "", 0, 0, 0, 0, 0, 0, 0};
// Should have less that MAXSUBSCRIPTIONS elements
// MAXSUBSCRIPTIONS is defined is Adafruit_mqtt.h
const int gpioControlled[] = CONFIG_CONTROLLED_GPIO;
const int gpioObserved[] = CONFIG_OBSERVED_GPIO;
const int pwmControlled[] = CONFIG_CONTROLLED_PWM;
/* Set these to your desired credentials. */ /* Set these to your desired credentials. */
const char *ssid = CONFIG_SSID_NAME; const char *ssid = CONFIG_SSID_NAME;

View File

@ -43,8 +43,8 @@
#define CONFIG_CONTROLLED_PWM {} #define CONFIG_CONTROLLED_PWM {}
#endif #endif
#ifndef CONFIG_WEB_CONTROLLED_GPIO #ifndef CONFIG_OBSERVED_GPIO
#define CONFIG_WEB_CONTROLLED_GPIO {} #define CONFIG_OBSERVED_GPIO {}
#endif #endif
#ifndef CONFIG_CONTROLLED_GPIO #ifndef CONFIG_CONTROLLED_GPIO

View File

@ -52,6 +52,9 @@
// Should have less value than MAXSUBSCRIPTIONS // Should have less value than MAXSUBSCRIPTIONS
#define CONFIG_CONTROLLED_GPIO {2,13} #define CONFIG_CONTROLLED_GPIO {2,13}
// GPIO that can be get by mqtt and http
//#define CONFIG_OBSERVED_GPIO {}
// GPIO used in PWM // GPIO used in PWM
//#define CONFIG_CONTROLLED_PWM {} //#define CONFIG_CONTROLLED_PWM {}