diff --git a/.idea/markdown-exported-files.xml b/.idea/markdown-exported-files.xml
new file mode 100644
index 0000000..5d1f129
--- /dev/null
+++ b/.idea/markdown-exported-files.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lighthub/inputs.cpp b/lighthub/inputs.cpp
index 88af542..365e7df 100644
--- a/lighthub/inputs.cpp
+++ b/lighthub/inputs.cpp
@@ -23,30 +23,35 @@ e-mail anklimov@gmail.com
#include
#ifndef DHT_DISABLE
+#if defined(ESP8266) || defined(ARDUINO_ARCH_ESP32)
+#include
+#else
#include "DHT.h"
#endif
+#endif
extern PubSubClient mqttClient;
-//DHT dht();
+
+static volatile unsigned long nextPollMillisValue[5];
+static volatile int nextPollMillisPin[5] = {0,0,0,0,0};
#if defined(__AVR__)
-static volatile long encoder_value[6];
+static volatile long counter_value[6];
#endif
#if defined(ESP8266)
-static volatile long encoder_value[6];
+static volatile long counter_value[6];
#endif
#if defined(ARDUINO_ARCH_ESP32)
-static volatile long encoder_value[6];
+static volatile long counter_value[6];
#endif
#if defined(__SAM3X8E__) || defined(ARDUINO_ARCH_STM32F1)
-static short encoder_irq_map[54];
- static long encoder_value[54];
- static int encoders_count;
+static short counter_irq_map[54];
+ static long counter_value[54];
+ static int counters_count;
#endif
-
Input::Input(char * name) //Constructor
{
if (name)
@@ -57,13 +62,13 @@ Input::Input(char * name) //Constructor
}
-Input::Input(int pin) //Constructor
+Input::Input(int pin)
{
// TODO
}
- Input::Input(aJsonObject * obj) //Constructor
+ Input::Input(aJsonObject * obj)
{
inputObj= obj;
Parse();
@@ -86,9 +91,9 @@ void Input::Parse()
aJsonObject *s;
s = aJson.getObjectItem(inputObj, "T");
- if (s) inType = s->valueint;
+ if (s) inType = static_cast(s->valueint);
- pin = atoi(inputObj->name);
+ pin = static_cast(atoi(inputObj->name));
s = aJson.getObjectItem(inputObj, "S");
if (!s) {
@@ -108,18 +113,17 @@ int Input::poll() {
if (!isValid()) return -1;
if (inType & IN_DHT22)
dht22Poll();
-else if(inType & IN_ENCODER)
- encoderPoll();
- /* example
- else if (inType & IN_ANALOG)
- analogPoll(); */
+ else if (inType & IN_COUNTER)
+ counterPoll();
+ else if (inType & IN_UPTIME)
+ uptimePoll();
else
contactPoll();
return 0;
}
-void Input::encoderPoll() {
- if (store->nextPollMillis > millis())
+void Input::counterPoll() {
+ if(nextPollTime()>millis())
return;
if (store->logicState == 0) {
#if defined(__AVR__)
@@ -131,31 +135,31 @@ void Input::encoderPoll() {
} else {
Serial.print(F("IRQ:"));
Serial.print(pin);
- Serial.print(F(" Encoder type. INCORRECT Interrupt number!!!"));
+ Serial.print(F(" Counter type. INCORRECT Interrupt number!!!"));
return;
}
#endif
#if defined(__SAM3X8E__)
- attachInterruptPinIrq(pin,encoders_count);
- encoder_irq_map[encoders_count]=pin;
- encoders_count++;
+ attachInterruptPinIrq(pin,counters_count);
+ counter_irq_map[counters_count]=pin;
+ counters_count++;
#endif
store->logicState = 1;
return;
}
- long encoderValue = encoder_value[pin];
- Serial.print(F("IN:"));Serial.print(pin);Serial.print(F(" Encoder type. val="));Serial.print(encoderValue);
+ long counterValue = counter_value[pin];
+ Serial.print(F("IN:"));Serial.print(pin);Serial.print(F(" Counter type. val="));Serial.print(counterValue);
aJsonObject *emit = aJson.getObjectItem(inputObj, "emit");
if (emit) {
char valstr[10];
char addrstr[100] = "";
strcat(addrstr, emit->valuestring);
- sprintf(valstr, "%d", encoderValue);
+ sprintf(valstr, "%d", counterValue);
mqttClient.publish(addrstr, valstr);
- store->nextPollMillis = millis() + DHT_POLL_DELAY_DEFAULT;
- Serial.print(F(" NextPollMillis="));Serial.println(store->nextPollMillis);
+ setNextPollTime(millis() + DHT_POLL_DELAY_DEFAULT);
+ Serial.print(F(" NextPollMillis="));Serial.println(nextPollTime());
}
else
Serial.print(F(" No emit data!"));
@@ -172,22 +176,22 @@ void Input::attachInterruptPinIrq(int realPin, int irq) {
#endif
switch(irq){
case 0:
- attachInterrupt(real_irq, onEncoderChanged0, RISING);
+ attachInterrupt(real_irq, onCounterChanged0, RISING);
break;
case 1:
- attachInterrupt(real_irq, onEncoderChanged1, RISING);
+ attachInterrupt(real_irq, onCounterChanged1, RISING);
break;
case 2:
- attachInterrupt(real_irq, onEncoderChanged2, RISING);
+ attachInterrupt(real_irq, onCounterChanged2, RISING);
break;
case 3:
- attachInterrupt(real_irq, onEncoderChanged3, RISING);
+ attachInterrupt(real_irq, onCounterChanged3, RISING);
break;
case 4:
- attachInterrupt(real_irq, onEncoderChanged4, RISING);
+ attachInterrupt(real_irq, onCounterChanged4, RISING);
break;
case 5:
- attachInterrupt(real_irq, onEncoderChanged5, RISING);
+ attachInterrupt(real_irq, onCounterChanged5, RISING);
break;
default:
Serial.print(F("Incorrect irq:"));Serial.println(irq);
@@ -197,14 +201,27 @@ void Input::attachInterruptPinIrq(int realPin, int irq) {
void Input::dht22Poll() {
#ifndef DHT_DISABLE
- if (store->nextPollMillis > millis())
+ if(nextPollTime()>millis())
return;
+#if defined(ESP8266) || defined(ARDUINO_ARCH_ESP32)
+ DHTesp dhtSensor;
+ dhtSensor.setup(pin, DHTesp::DHT22);
+ TempAndHumidity dhtSensorData = dhtSensor.getTempAndHumidity();
+ float temp = dhtSensorData.temperature;
+ float humidity = dhtSensorData.humidity;
+#else
DHT dht(pin, DHT22);
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
+#endif
aJsonObject *emit = aJson.getObjectItem(inputObj, "emit");
- Serial.print(F("IN:"));Serial.print(pin);Serial.print(F(" DHT22 type. T="));Serial.print(temp);
- Serial.print(F("°C H="));Serial.print(humidity);Serial.print(F("%"));
+ Serial.print(F("IN:"));
+ Serial.print(pin);
+ Serial.print(F(" DHT22 type. T="));
+ Serial.print(temp);
+ Serial.print(F("°C H="));
+ Serial.print(humidity);
+ Serial.print(F("%"));
if (emit && temp && humidity && temp == temp && humidity == humidity) {
char valstr[10];
char addrstr[100] = "";
@@ -215,28 +232,53 @@ void Input::dht22Poll() {
addrstr[strlen(addrstr) - 1] = 'H';
printFloatValueToStr(humidity, valstr);
mqttClient.publish(addrstr, valstr);
- store->nextPollMillis = millis() + DHT_POLL_DELAY_DEFAULT;
- Serial.print(" NextPollMillis=");Serial.println(store->nextPollMillis);
- }
- else
- store->nextPollMillis = millis() + DHT_POLL_DELAY_DEFAULT/3;
+ setNextPollTime(millis() + DHT_POLL_DELAY_DEFAULT);
+ Serial.print(" NextPollMillis=");
+ Serial.println(nextPollTime());
+ } else
+ setNextPollTime(millis() + DHT_POLL_DELAY_DEFAULT / 3);
#endif
}
-void Input::printFloatValueToStr(float temp, char *valstr) {
- #if defined(ESP8266)
- sprintf(valstr, "%2.1f", temp);
+unsigned long Input::nextPollTime() const {
+ for(int i=0;i<5;i++){
+ if(nextPollMillisPin[i]==pin)
+ return nextPollMillisValue[i];
+ else if(nextPollMillisPin[i]==0) {
+ nextPollMillisPin[i]=pin;
+ return nextPollMillisValue[i] = 0;
+ }
+ }
+ return 0;
+}
+
+void Input::setNextPollTime(unsigned long pollTime) {
+ for (int i = 0; i < 5; i++) {
+ if (nextPollMillisPin[i] == pin) {
+ nextPollMillisValue[i] = pollTime;
+ return;
+ } else if (nextPollMillisPin[i] == 0) {
+ nextPollMillisPin[i] == pin;
+ nextPollMillisValue[i] = pollTime;
+ return;
+ }
+ }
+}
+
+void Input::printFloatValueToStr(float value, char *valstr) {
+ #if defined(ESP8266) || defined(ARDUINO_ARCH_ESP32)
+ sprintf(valstr, "%2.1f", value);
#endif
#if defined(__AVR__)
- sprintf(valstr, "%d", (int)temp);
- int fractional = 10.0*((float)abs(temp)-(float)abs((int)temp));
+ sprintf(valstr, "%d", (int)value);
+ int fractional = 10.0*((float)abs(value)-(float)abs((int)value));
int val_len =strlen(valstr);
valstr[val_len]='.';
valstr[val_len+1]='0'+fractional;
valstr[val_len+2]='\0';
#endif
#if defined(__SAM3X8E__)
- sprintf(valstr, "%2.1f", temp);
+ sprintf(valstr, "%2.1f",value);
#endif
}
@@ -245,7 +287,7 @@ void Input::contactPoll() {
#if defined(ARDUINO_ARCH_STM32F1)
WiringPinMode inputPinMode;
#endif
-#if defined(__SAM3X8E__)||defined(__AVR__)||defined(ESP8266)
+#if defined(__SAM3X8E__)||defined(__AVR__)||defined(ESP8266)||defined(ARDUINO_ARCH_ESP32)
uint32_t inputPinMode;
#endif
@@ -271,6 +313,19 @@ void Input::contactPoll() {
store->bounce = SAME_STATE_ATTEMPTS;
}
+void Input::uptimePoll() {
+ if(nextPollTime()>millis())
+ return;
+ aJsonObject *emit = aJson.getObjectItem(inputObj, "emit");
+ if (emit) {
+ char valstr[11];
+// printUlongValueToStr(valstr,millis());
+ printUlongValueToStr(valstr,millis());
+ mqttClient.publish(emit->valuestring, valstr);
+ }
+ setNextPollTime(millis() +UPTIME_POLL_DELAY_DEFAULT);
+}
+
void Input::onContactChanged(int val)
{
Serial.print(F("IN:")); Serial.print(pin);Serial.print(F("="));Serial.println(val);
@@ -309,32 +364,47 @@ void Input::onContactChanged(int val)
}
}
-void Input::onEncoderChanged(int i) {
+void Input::onCounterChanged(int i) {
#if defined(__SAM3X8E__)
- encoder_value[encoder_irq_map[i]]++;
+ counter_value[counter_irq_map[i]]++;
#endif
#if defined(__AVR__)
- encoder_value[i]++;
+ counter_value[i]++;
#endif
}
-void Input::onEncoderChanged0() {
- onEncoderChanged(0);
+void Input::onCounterChanged0() {
+ onCounterChanged(0);
}
-void Input::onEncoderChanged1() {
- onEncoderChanged(1);
+void Input::onCounterChanged1() {
+ onCounterChanged(1);
}
-void Input::onEncoderChanged2() {
- onEncoderChanged(2);
+void Input::onCounterChanged2() {
+ onCounterChanged(2);
}
-void Input::onEncoderChanged3() {
- onEncoderChanged(3);
+void Input::onCounterChanged3() {
+ onCounterChanged(3);
}
-void Input::onEncoderChanged4() {
- onEncoderChanged(4);
+void Input::onCounterChanged4() {
+ onCounterChanged(4);
}
-void Input::onEncoderChanged5() {
- onEncoderChanged(5);
+void Input::onCounterChanged5() {
+ onCounterChanged(5);
+}
+
+void Input::printUlongValueToStr(char *valstr, unsigned long value) {
+ char buf[11];
+ int i=0;
+ for(;value>0;i++){
+ unsigned long mod = value - ((unsigned long)(value/10))*10;
+ buf[i]=mod+48;
+ value = (unsigned long)(value/10);
+ }
+
+ for(int n=0;n<=i;n++){
+ valstr[n]=buf[i-n-1];
+ }
+ valstr[i]='\0';
}
diff --git a/lighthub/inputs.h b/lighthub/inputs.h
index 281c97c..4895b51 100644
--- a/lighthub/inputs.h
+++ b/lighthub/inputs.h
@@ -27,7 +27,8 @@ e-mail anklimov@gmail.com
#define IN_PUSH_ON 0 // PUSH - ON, Release - OFF (ovverrided by pcmd/rcmd) - DEFAULT
#define IN_PUSH_TOGGLE 1 // Every physicall push toggle logical switch on/off
#define IN_DHT22 4
-#define IN_ENCODER 8
+#define IN_COUNTER 8
+#define IN_UPTIME 16
#define SAME_STATE_ATTEMPTS 3
@@ -72,7 +73,7 @@ typedef union {
int8_t bounce;
int8_t currentValue;
};
- unsigned long nextPollMillis;
+
} inStore;
class Input {
@@ -94,13 +95,13 @@ public:
int poll();
- static void inline onEncoderChanged(int i);
- static void onEncoderChanged0();
- static void onEncoderChanged1();
- static void onEncoderChanged2();
- static void onEncoderChanged3();
- static void onEncoderChanged4();
- static void onEncoderChanged5();
+ static void inline onCounterChanged(int i);
+ static void onCounterChanged0();
+ static void onCounterChanged1();
+ static void onCounterChanged2();
+ static void onCounterChanged3();
+ static void onCounterChanged4();
+ static void onCounterChanged5();
@@ -111,10 +112,17 @@ protected:
void dht22Poll();
- void printFloatValueToStr(float temp, char *valstr);
+ void printFloatValueToStr(float value, char *valstr);
- void encoderPoll();
+ void counterPoll();
void attachInterruptPinIrq(int realPin, int irq);
+ unsigned long nextPollTime() const;
+ void setNextPollTime(unsigned long pollTime);
+
+
+ void uptimePoll();
+
+ void printUlongValueToStr(char *valstr, unsigned long value);
};
diff --git a/lighthub/main.cpp b/lighthub/main.cpp
index e8ea09d..a1c5da3 100644
--- a/lighthub/main.cpp
+++ b/lighthub/main.cpp
@@ -88,6 +88,7 @@ WiFiClient ethClient;
#include
#include
#include
+#include "Ethernet3.h"
WiFiClient ethClient;
#endif
@@ -105,6 +106,14 @@ WiFiClient ethClient;
EthernetClient ethClient;
#endif
+#ifndef SYSLOG_DISABLE
+#include
+#include
+EthernetUDP udpSyslogClient;
+Syslog udpSyslog(udpSyslogClient, SYSLOG_PROTO_IETF);
+unsigned long nextSyslogPingTime;
+#endif
+
lan_status lanStatus = INITIAL_STATE;
const char outprefix[] PROGMEM = OUTTOPIC;
@@ -120,6 +129,7 @@ aJsonObject *mqttArr = NULL;
aJsonObject *modbusArr = NULL;
aJsonObject *owArr = NULL;
aJsonObject *dmxArr = NULL;
+aJsonObject *udpSyslogArr = NULL;
unsigned long nextPollingCheck = 0;
unsigned long nextInputCheck = 0;
@@ -158,7 +168,7 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) {
debugSerial.print(topic);
debugSerial.print(F("] "));
if (!payload) return;
- payload[length] = 0;
+ payload[length] = 0;
int fr = freeRam();
if (fr < 250) {
@@ -172,8 +182,8 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) {
debugSerial.println();
if(!strcmp(topic,CMDTOPIC)) {
- cmd_parse((char *)payload);
- return;
+ cmd_parse((char *)payload);
+ return;
}
boolean retaining = (lanStatus == RETAINING_COLLECTING);
@@ -191,17 +201,17 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) {
return;
}
char subtopic[MQTT_SUBJECT_LENGTH] = "";
- // int cmd = 0;
+ // int cmd = 0;
//cmd = txt2cmd((char *) payload);
char *t;
if (t = strrchr(topic, '/'))
strncpy(subtopic, t + 1, MQTT_SUBJECT_LENGTH - 1);
- Item item(subtopic);
- if (item.isValid()) {
- if (item.itemType == CH_GROUP && retaining)
- return; //Do not restore group channels - they consist not relevant data
+ Item item(subtopic);
+ if (item.isValid()) {
+ if (item.itemType == CH_GROUP && retaining)
+ return; //Do not restore group channels - they consist not relevant data
item.Ctrl((char *)payload, !retaining);
- } //valid item
+ } //valid item
}
void printIPAddress(IPAddress ipAddress) {
@@ -230,7 +240,7 @@ lan_status lanLoop() {
#ifdef NOETHER
lanStatus=DO_NOTHING;//-14;
-#endif
+ #endif
switch (lanStatus) {
case INITIAL_STATE:
@@ -347,60 +357,77 @@ void ip_ready_config_loaded_connecting_to_broker() {
char *user = ∅
char passwordBuf[16] = "";
char *password = passwordBuf;
-
+#ifndef SYSLOG_DISABLE
+ debugSerial.println("debugSerial:");
+ delay(100);
+ char *syslogServer = aJson.getArrayItem(udpSyslogArr, 0)->valuestring;
+ int syslogPort = aJson.getArrayItem(udpSyslogArr, 1)->valueint;
+ char *syslogDeviceHostname = aJson.getArrayItem(udpSyslogArr, 2)->valuestring;
+ char *syslogAppname = aJson.getArrayItem(udpSyslogArr, 3)->valuestring;
+ debugSerial.println("debugSerial:");
+ debugSerial.println(syslogServer);
+ debugSerial.println(syslogPort);
+ debugSerial.println(syslogDeviceHostname);
+ debugSerial.println(syslogAppname);
+ udpSyslog.server(syslogServer, syslogPort);
+ udpSyslog.deviceHostname(syslogDeviceHostname);
+ udpSyslog.appName(syslogAppname);
+ udpSyslog.defaultPriority(LOG_KERN);
+ udpSyslog.log(LOG_INFO, "UDP Syslog initialized!");
+#endif
if (!mqttClient.connected() && mqttArr && ((n = aJson.getArraySize(mqttArr)) > 1)) {
- char *client_id = aJson.getArrayItem(mqttArr, 0)->valuestring;
- char *servername = aJson.getArrayItem(mqttArr, 1)->valuestring;
- if (n >= 3) port = aJson.getArrayItem(mqttArr, 2)->valueint;
- if (n >= 4) user = aJson.getArrayItem(mqttArr, 3)->valuestring;
- if (!loadFlash(OFFSET_MQTT_PWD, passwordBuf, sizeof(passwordBuf)) && (n >= 5)) {
- password = aJson.getArrayItem(mqttArr, 4)->valuestring;
- debugSerial.println(F("Using MQTT password from config"));
- }
+ char *client_id = aJson.getArrayItem(mqttArr, 0)->valuestring;
+ char *servername = aJson.getArrayItem(mqttArr, 1)->valuestring;
+ if (n >= 3) port = aJson.getArrayItem(mqttArr, 2)->valueint;
+ if (n >= 4) user = aJson.getArrayItem(mqttArr, 3)->valuestring;
+ if (!loadFlash(OFFSET_MQTT_PWD, passwordBuf, sizeof(passwordBuf)) && (n >= 5)) {
+ password = aJson.getArrayItem(mqttArr, 4)->valuestring;
+ debugSerial.println(F("Using MQTT password from config"));
+ }
- mqttClient.setServer(servername, port);
- mqttClient.setCallback(mqttCallback);
+ mqttClient.setServer(servername, port);
+ mqttClient.setCallback(mqttCallback);
- debugSerial.print(F("Attempting MQTT connection to "));
- debugSerial.print(servername);
- debugSerial.print(F(":"));
- debugSerial.print(port);
- debugSerial.print(F(" user:"));
- debugSerial.print(user);
- debugSerial.print(F(" ..."));
+ debugSerial.print(F("Attempting MQTT connection to "));
+ debugSerial.print(servername);
+ debugSerial.print(F(":"));
+ debugSerial.print(port);
+ debugSerial.print(F(" user:"));
+ debugSerial.print(user);
+ debugSerial.print(F(" ..."));
- wdt_dis(); //potential unsafe for ethernetIdle(), but needed to avoid cyclic reboot if mosquitto out of order
- if (mqttClient.connect(client_id, user, password)) {
- mqttErrorRate = 0;
- debugSerial.print(F("connected as "));
- debugSerial.println(client_id);
- wdt_en();
- configOk = true;
- // ... Temporary subscribe to status topic
- char buf[MQTT_TOPIC_LENGTH];
+ wdt_dis(); //potential unsafe for ethernetIdle(), but needed to avoid cyclic reboot if mosquitto out of order
+ if (mqttClient.connect(client_id, user, password)) {
+ mqttErrorRate = 0;
+ debugSerial.print(F("connected as "));
+ debugSerial.println(client_id);
+ wdt_en();
+ configOk = true;
+ // ... Temporary subscribe to status topic
+ char buf[MQTT_TOPIC_LENGTH];
- strncpy_P(buf, outprefix, sizeof(buf));
- strncat(buf, "#", sizeof(buf));
- mqttClient.subscribe(buf);
+ strncpy_P(buf, outprefix, sizeof(buf));
+ strncat(buf, "#", sizeof(buf));
+ mqttClient.subscribe(buf);
- //Subscribing for command topics
- strncpy_P(buf, inprefix, sizeof(buf));
- strncat(buf, "#", sizeof(buf));
- mqttClient.subscribe(buf);
+ //Subscribing for command topics
+ strncpy_P(buf, inprefix, sizeof(buf));
+ strncat(buf, "#", sizeof(buf));
+ mqttClient.subscribe(buf);
- //restoreState();
- // if (_once) {DMXput(); _once=0;}
- lanStatus = RETAINING_COLLECTING;//4;
- nextLanCheckTime = millis() + 5000;
- debugSerial.println(F("Awaiting for retained topics"));
- } else {
- debugSerial.print(F("failed, rc="));
- debugSerial.print(mqttClient.state());
- debugSerial.println(F(" try again in 5 seconds"));
- nextLanCheckTime = millis() + 5000;
+ //restoreState();
+ // if (_once) {DMXput(); _once=0;}
+ lanStatus = RETAINING_COLLECTING;//4;
+ nextLanCheckTime = millis() + 5000;
+ debugSerial.println(F("Awaiting for retained topics"));
+ } else {
+ debugSerial.print(F("failed, rc="));
+ debugSerial.print(mqttClient.state());
+ debugSerial.println(F(" try again in 5 seconds"));
+ nextLanCheckTime = millis() + 5000;
#ifdef RESTART_LAN_ON_MQTT_ERRORS
- mqttErrorRate++;
+ mqttErrorRate++;
if(mqttErrorRate>50){
debugSerial.print(F("Too many MQTT connection errors. Restart LAN"));
mqttErrorRate=0;
@@ -412,9 +439,9 @@ void ip_ready_config_loaded_connecting_to_broker() {
}
#endif
- lanStatus = RECONNECT;//12;
- }
- }
+ lanStatus = RECONNECT;//12;
+ }
+ }
}
void onInitialStateInitLAN() {
@@ -484,7 +511,7 @@ void onInitialStateInitLAN() {
} else Ethernet.begin(mac, ip, dns);
} else Ethernet.begin(mac, ip);
}
- else {
+ else {
debugSerial.println("No IP data found in flash");
wdt_dis();
#if defined(__AVR__) || defined(__SAM3X8E__)
@@ -510,7 +537,7 @@ void onInitialStateInitLAN() {
printIPAddress(Ethernet.localIP());
lanStatus = HAVE_IP_ADDRESS;//1;
}
-#endif
+ #endif
}
#ifdef ARDUINO_ARCH_STM32F1
@@ -587,17 +614,20 @@ void cmdFunctionHelp(int arg_cnt, char **args)
//(char* tokens)
{
printFirmwareVersionAndBuildOptions();
+ #ifndef SYSLOG_DISABLE
+// udpSyslog.logf(LOG_INFO, "free RAM: %d",freeRam());
+ #endif
debugSerial.print(F(" free RAM: "));debugSerial.print(freeRam());
debugSerial.println(F(" Use the commands: 'help' - this text\n"
- "'mac de:ad:be:ef:fe:00' set and store MAC-address in EEPROM\n"
- "'ip [ip[,dns[,gw[,subnet]]]]' - set static IP\n"
- "'save' - save config in NVRAM\n"
- "'get' [config addr]' - get config from pre-configured URL and store addr\n"
- "'load' - load config from NVRAM\n"
- "'pwd' - define MQTT password\n"
- "'kill' - test watchdog\n"
- "'clear' - clear EEPROM\n"
- "'reboot' - reboot controller"));
+ "'mac de:ad:be:ef:fe:00' set and store MAC-address in EEPROM\n"
+ "'ip [ip[,dns[,gw[,subnet]]]]' - set static IP\n"
+ "'save' - save config in NVRAM\n"
+ "'get' [config addr]' - get config from pre-configured URL and store addr\n"
+ "'load' - load config from NVRAM\n"
+ "'pwd' - define MQTT password\n"
+ "'kill' - test watchdog\n"
+ "'clear' - clear EEPROM\n"
+ "'reboot' - reboot controller"));
}
void cmdFunctionKill(int arg_cnt, char **args) {
@@ -613,7 +643,7 @@ void cmdFunctionReboot(int arg_cnt, char **args) {
}
void applyConfig() {
- if (!root) return;
+ if (!root) return;
#ifdef _dmxin
int itemsCount;
@@ -659,37 +689,38 @@ void applyConfig() {
items = aJson.getObjectItem(root, "items");
// Digital output related Items initialization
-pollingItem=NULL;
-if (items) {
-aJsonObject * item = items->child;
-while (items && item)
- if (item->type == aJson_Array && aJson.getArraySize(item)>1) {
- Item it(item);
- if (it.isValid()) {
- int pin=it.getArg();
- int cmd = it.getCmd();
- switch (it.itemType) {
- case CH_THERMO:
- if (cmd<1) it.setCmd(CMD_OFF);
- case CH_RELAY:
- {
- int k;
- pinMode(pin, OUTPUT);
- digitalWrite(pin, k = ((cmd == CMD_ON) ? HIGH : LOW));
- debugSerial.print(F("Pin:"));
- debugSerial.print(pin);
- debugSerial.print(F("="));
- debugSerial.println(k);
- }
- break;
- } //switch
- } //isValid
- item = item->next;
- } //if
- pollingItem = items->child;
-}
+ pollingItem=NULL;
+ if (items) {
+ aJsonObject * item = items->child;
+ while (items && item)
+ if (item->type == aJson_Array && aJson.getArraySize(item)>1) {
+ Item it(item);
+ if (it.isValid()) {
+ int pin=it.getArg();
+ int cmd = it.getCmd();
+ switch (it.itemType) {
+ case CH_THERMO:
+ if (cmd<1) it.setCmd(CMD_OFF);
+ case CH_RELAY:
+ {
+ int k;
+ pinMode(pin, OUTPUT);
+ digitalWrite(pin, k = ((cmd == CMD_ON) ? HIGH : LOW));
+ debugSerial.print(F("Pin:"));
+ debugSerial.print(pin);
+ debugSerial.print(F("="));
+ debugSerial.println(k);
+ }
+ break;
+ } //switch
+ } //isValid
+ item = item->next;
+ } //if
+ pollingItem = items->child;
+ }
inputs = aJson.getObjectItem(root, "in");
mqttArr = aJson.getObjectItem(root, "mqtt");
+ udpSyslogArr = aJson.getObjectItem(root, "syslog");
printConfigSummary();
}
@@ -705,6 +736,8 @@ void printConfigSummary() {
printBool(mqttArr);
debugSerial.print(F("1-wire "));
printBool(owArr);
+ debugSerial.print(F("udp syslog "));
+ printBool(udpSyslogArr);
}
void cmdFunctionLoad(int arg_cnt, char **args) {
@@ -843,11 +876,11 @@ void cmdFunctionClearEEPROM(int arg_cnt, char **args){
void cmdFunctionPwd(int arg_cnt, char **args)
//(char* tokens)
{ char empty[]="";
- if (arg_cnt)
- saveFlash(OFFSET_MQTT_PWD,args[1]);
- else saveFlash(OFFSET_MQTT_PWD,empty);
- debugSerial.println(F("Password updated"));
- }
+ if (arg_cnt)
+ saveFlash(OFFSET_MQTT_PWD,args[1]);
+ else saveFlash(OFFSET_MQTT_PWD,empty);
+ debugSerial.println(F("Password updated"));
+}
void cmdFunctionSetMac(int arg_cnt, char **args) {
@@ -879,30 +912,30 @@ void printBool(bool arg) { (arg) ? debugSerial.println(F("on")) : debugSerial.pr
void saveFlash(short n, char *str) {
- short i;
- short len=strlen(str);
- if (len>31) len=31;
- for(int i=0;i31) len=31;
+ for(int i=0;iread();
#endif
- inputLoop();
+ inputLoop();
}
diff --git a/lighthub/main.h b/lighthub/main.h
index 3784c8a..dc16718 100644
--- a/lighthub/main.h
+++ b/lighthub/main.h
@@ -109,7 +109,7 @@
#ifdef ARDUINO_ARCH_ESP32
#include
-#include
+//#include
#endif
diff --git a/lighthub/options.h b/lighthub/options.h
index 7fc1afe..3eef817 100644
--- a/lighthub/options.h
+++ b/lighthub/options.h
@@ -136,13 +136,14 @@
#endif
#define DHT_POLL_DELAY_DEFAULT 15000
+#define UPTIME_POLL_DELAY_DEFAULT 30000
#ifdef ARDUINO_ARCH_STM32F1
#define strncpy_P strncpy
#endif
#ifndef debugSerial
-#define debugSerial Serial1
+#define debugSerial Serial
#endif
#ifndef Wiz5500
diff --git a/platformio.ini b/platformio.ini
index dc5bdcf..6c1b13f 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -18,7 +18,7 @@ env_default =
; megaatmega2560-5500
; due-5500
; controllino
- stm32
+; stm32
build_dir = /tmp/pioenvs
libdeps_dir = /tmp/piolibdeps
@@ -48,7 +48,9 @@ lib_deps =
platform = ststm32
framework = arduino
board = nucleo_f103rb
-upload_protocol = st-link
+upload_protocol = stlink
+debug_tool = stlink
+extra_scripts = pre:!pre_stm32.sh
;lib_ldf_mode = chain+
build_flags = !sh build_flags_stm32.sh
lib_deps =
@@ -62,7 +64,11 @@ lib_deps =
https://github.com/knolleary/pubsubclient.git
Adafruit Unified Sensor
DHT sensor library
-
+; https://github.com/anklimov/DMXSerial
+; Syslog
+; https://github.com/No3x/Syslog.git
+ https://github.com/arcao/Syslog.git
+; UIPEthernet
[env:due]
platform = atmelsam
@@ -88,6 +94,7 @@ lib_deps =
SdFat
Adafruit Unified Sensor
DHT sensor library
+ https://github.com/arcao/Syslog.git
[env:megaatmega2560]
@@ -136,6 +143,7 @@ lib_deps =
DHT sensor library for ESPx
DHT sensor library
WifiManager
+ https://github.com/arcao/Syslog.git
[env:megaatmega2560-net]
platform = atmelavr
@@ -145,21 +153,21 @@ upload_port = net:192.168.88.2:23000
build_flags = !sh build_flags_mega2560-net.sh
;lib_ldf_mode = chain+
lib_deps =
- https://github.com/anklimov/Arduino-Temperature-Control-Library.git
- https://github.com/anklimov/DS2482_OneWire
- https://github.com/anklimov/DmxSimple
- https://github.com/anklimov/httpClient
- https://github.com/anklimov/aJson
- https://github.com/anklimov/CmdArduino
- https://github.com/anklimov/ModbusMaster
- https://github.com/anklimov/DMXSerial
- https://github.com/anklimov/Ethernet
- https://github.com/PaulStoffregen/SPI.git
- https://github.com/knolleary/pubsubclient.git
- https://github.com/anklimov/Artnet.git
- FastLED
- Adafruit Unified Sensor
- DHT sensor library
+ https://github.com/anklimov/Arduino-Temperature-Control-Library.git
+ https://github.com/anklimov/DS2482_OneWire
+ https://github.com/anklimov/DmxSimple
+ https://github.com/anklimov/httpClient
+ https://github.com/anklimov/aJson
+ https://github.com/anklimov/CmdArduino
+ https://github.com/anklimov/ModbusMaster
+ https://github.com/anklimov/DMXSerial
+ https://github.com/anklimov/Ethernet
+ https://github.com/PaulStoffregen/SPI.git
+ https://github.com/knolleary/pubsubclient.git
+ https://github.com/anklimov/Artnet.git
+ FastLED
+ Adafruit Unified Sensor
+ DHT sensor library
[env:due-5500]
platform = atmelsam
diff --git a/pre_stm32.sh b/pre_stm32.sh
new file mode 100644
index 0000000..d544c4f
--- /dev/null
+++ b/pre_stm32.sh
@@ -0,0 +1,4 @@
+#! /bin/bash
+rm /tmp/piolibdeps -Rf
+mkdir /tmp/piolibdeps_stm32
+ln -s /tmp/piolibdeps_stm32 /tmp/piolibdeps