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 "MQTT.h"
#define MAX_GPIO_OBSERVED (MAXSUBSCRIPTIONS*2)
Adafruit_MQTT_Client *mqtt;
Adafruit_MQTT_Publish *mqtt_temp;
Adafruit_MQTT_Publish *mqtt_pressure;
@ -12,6 +13,7 @@ Adafruit_MQTT_Publish *mqtt_dry;
Adafruit_MQTT_Publish *mqtt_ip;
Adafruit_MQTT_Publish *mqttGpio[MAXSUBSCRIPTIONS] = {};
Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {};
Adafruit_MQTT_Publish *mqttGpioObserved[MAX_GPIO_OBSERVED] = {};
#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 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;
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_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",
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;
}
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]));
mqttGpio[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioControlled[i]);
}
for (uint i = 0 ; i < NB_ELEMENTS(gpioControlled) && i < MAXSUBSCRIPTIONS; i++) {
mqtt->subscribe(MqttCreateSubscribe(PWM_SET_FEED_FORMAT, user, mqttId, pwmWatched[i]));
mqttPwm[i] = MqttCreatePublisher(PWM_FEED_FORMAT, user, mqttId, pwmWatched[i]);
for (uint i = 0 ; i < NB_ELEMENTS(gpioObserved) && i < MAX_GPIO_OBSERVED ; i++) {
mqttGpioObserved[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, mqttId, gpioObserved[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;
}
@ -97,7 +104,7 @@ Adafruit_MQTT_Subscribe *MqttCreateSubscribe(const char *fmt, ...){
}
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.
@ -105,7 +112,7 @@ int MqttIsConnected() {
int MqttConnect() {
int8_t ret;
if(!isMqttConfigured)
if (!isMqttConfigured || mode != BOOTMODE_NORMAL)
return -1;
// Stop if already connected.
@ -166,9 +173,15 @@ int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription, const char *p
}
void MqttNofity(int gpio, int value){
if (MqttIsConnected()) {
int watchIdx = findIndex(gpio, gpioControlled);
if (watchIdx >= 0 && isMqttConfigured) {
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/");
if (gpio > 0 && findIndex(gpio, pwmWatched) >= 0) {
if (gpio > 0 && findIndex(gpio, pwmControlled) >= 0) {
SKETCH_DEBUG_PRINTF("Got Subscription for PWM %d\n", gpio);
char *value = (char *) subscription->lastread;
SKETCH_DEBUG_PRINTF("Receive data: %s\n", value);

View File

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

View File

@ -64,6 +64,11 @@ float dhtTemp, dhtHumidity;
int dryness;
uint8_t mode;
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. */
const char *ssid = CONFIG_SSID_NAME;

View File

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

View File

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