diff --git a/README.md b/README.md index d7b3606..540a153 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,9 @@ platformio device monitor -b 115200 * WIFI_MANAGER_DISABLE //Disable wifi manager for esp8266 * DHT_DISABLE //disable DHT Input support * RESTART_LAN_ON_MQTT_ERRORS //reinit LAN if many mqtt errors occured +* WITH_STREAMING_LIB use streaming libriary for serial debug output otherwise use PrintEx library +* DEVICE_NAME short handy device name which is used instead of mac for download config http://{MY_CONFIG_SERVER}/{DEVICE_NAME}_config.json +* SYSLOG_ENABLE enable UDP SYSLOG support feature(under DEVELOPMENT) that must be configured through config file @@ -176,5 +179,8 @@ platformio device monitor -b 115200 * DHT support enabled * Wifi manager for esp8266 enabled * RESTART_LAN_ON_MQTT_ERRORS disabled +* WITH_STREAMING_LIB disabled +* DEVICE_NAME disabled +* SYSLOG_ENABLE disabled If you've using Arduino IDE to compile & flash firmware, it will use Default options above and you will not able to configure additional compilers options except edit "options.h" file diff --git a/build_flags_template.sh b/build_flags_template.sh index e66e237..86372f0 100644 --- a/build_flags_template.sh +++ b/build_flags_template.sh @@ -25,5 +25,7 @@ # export FLAGS="$FLAGS -DDHCP_RETRY_INTERVAL=60000" # export FLAGS="$FLAGS -DRESTART_LAN_ON_MQTT_ERRORS" # export FLAGS="$FLAGS -DW5500_CS_PIN=53" +#export FLAGS="$FLAGS -DSYSLOG_ENABLE" +#export FLAGS="$FLAGS -DDEVICE_NAME=MYDEVICE" export FLAGS="$FLAGS -DPIO_SRC_REV="$(git log --pretty=format:%h_%ad -1 --date=short) echo $FLAGS diff --git a/lighthub/main.cpp b/lighthub/main.cpp index 0ebdc85..50800ee 100644 --- a/lighthub/main.cpp +++ b/lighthub/main.cpp @@ -67,6 +67,7 @@ PWM Out #include "Arduino.h" #include "main.h" #include "options.h" +#include "utils.h" #ifdef WITH_STREAMING_LIB #include "Streaming.h" #else @@ -113,7 +114,7 @@ WiFiClient ethClient; EthernetClient ethClient; #endif -#ifndef SYSLOG_DISABLE +#ifdef SYSLOG_ENABLE #include EthernetUDP udpSyslogClient; Syslog udpSyslog(udpSyslogClient, SYSLOG_PROTO_IETF); @@ -208,8 +209,11 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) { void printIPAddress(IPAddress ipAddress) { for (byte i = 0; i < 4; i++) -// (i < 3) ? debugSerial << _DEC(ipAddress[i]) << F(".") : debugSerial << _DEC(ipAddress[i])<valuestring; if (owEmit) { strncpy(addrbuf, owEmit, sizeof(addrbuf)); - debugSerial<valuestring; } else debugSerial<reset_search(); for (short i = 0; i < t_count; i++) wstat[i] &= ~SW_FIND; //absent @@ -58,18 +58,18 @@ int owUpdate() { if (!memcmp(term[i], term[t_count], 8)) { ifind = i; wstat[i] |= SW_FIND; - Serial.print(F(" Node:")); - PrintBytes(term[t_count], 8); - Serial.println(F(" alive")); + debugSerial.print(F(" Node:")); + PrintBytes(term[t_count], 8,0); + debugSerial.println(F(" alive")); break; }; //alive if (ifind < 0 && sensors) { wstat[t_count] = SW_FIND; //Newly detected - Serial.print(F("dev#")); - Serial.print(t_count); - Serial.print(F(" Addr:")); - PrintBytes(term[t_count], 8); - Serial.println(); + debugSerial.print(F("dev#")); + debugSerial.print(t_count); + debugSerial.print(F(" Addr:")); + PrintBytes(term[t_count], 8,0); + debugSerial.println(); if (term[t_count][0] == 0x28) { sensors->setResolution(term[t_count], TEMPERATURE_PRECISION); net->setStrongPullup(); @@ -80,8 +80,8 @@ int owUpdate() { }//if } //while - Serial.print(F("1-wire count: ")); - Serial.println(t_count); + debugSerial.print(F("1-wire count: ")); + debugSerial.println(t_count); #endif } @@ -91,12 +91,12 @@ int owSetup(owChangedType owCh) { //// todo - move memory allocation to here if (net) return true; // Already initialized #ifdef DS2482_100_I2C_TO_1W_BRIDGE - Serial.println(F("DS2482_100_I2C_TO_1W_BRIDGE init")); + debugSerial.println(F("DS2482_100_I2C_TO_1W_BRIDGE init")); net = new OneWire; #else - Serial.print(F("One wire setup on PIN:")); - Serial.println(QUOTE(USE_1W_PIN)); -net = new OneWire (USE_1W_PIN); + debugSerial.print(F("One wire setup on PIN:")); + debugSerial.println(QUOTE(USE_1W_PIN)); + net = new OneWire (USE_1W_PIN); #endif @@ -112,29 +112,29 @@ net = new OneWire (USE_1W_PIN); #ifdef DS2482_100_I2C_TO_1W_BRIDGE Wire.begin(); if (net->checkPresence()) { - Serial.println(F("DS2482-100 present")); + debugSerial.println(F("DS2482-100 present")); net->deviceReset(); #ifdef APU_OFF - Serial.println(F("APU off")); + debugSerial.println(F("APU off")); #else net->setActivePullup(); #endif - Serial.println(F("\tChecking for 1-Wire devices...")); + debugSerial.println(F("\tChecking for 1-Wire devices...")); if (net->wireReset()) - Serial.println(F("\tReset done")); + debugSerial.println(F("\tReset done")); sensors->begin(); owChanged = owCh; //owUpdate(); - //Serial.println(F("\t1-w Updated")); + //debugSerial.println(F("\t1-w Updated")); sensors->setWaitForConversion(false); return true; } #endif - Serial.println(F("\tDS2482 error")); + debugSerial.println(F("\tDS2482 error")); return false; // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement @@ -158,7 +158,7 @@ int sensors_loop(void) { case 0x28: // Thermomerer t = sensors->getTempC(term[si]);//*10.0; - //Serial.println("o"); + //debugSerial.println("o"); if (owChanged) owChanged(si, term[si], t); sensors->requestTemperaturesByAddress(term[si]); si++; @@ -192,11 +192,11 @@ void owAdd(DeviceAddress addr) { memcpy(term[t_count], addr, 8); //term[t_count]=addr; - Serial.print(F("dev#")); - Serial.print(t_count); - Serial.print(F(" Addr:")); - PrintBytes(term[t_count], 8); - Serial.println(); + debugSerial.print(F("dev#")); + debugSerial.print(t_count); + debugSerial.print(F(" Addr:")); + PrintBytes(term[t_count], 8,0); + debugSerial.println(); if (term[t_count][0] == 0x28) { sensors->setResolution(term[t_count], TEMPERATURE_PRECISION); net->setStrongPullup(); diff --git a/lighthub/utils.cpp b/lighthub/utils.cpp index ac5357e..d959d67 100644 --- a/lighthub/utils.cpp +++ b/lighthub/utils.cpp @@ -19,6 +19,7 @@ e-mail anklimov@gmail.com */ #include "utils.h" +#include "options.h" #if defined(__SAM3X8E__) || defined(ARDUINO_ARCH_STM32F1) #include @@ -134,5 +135,61 @@ void parseBytes(const char *str, char separator, byte *bytes, int maxBytes, int str++; // Point to next character after separator } } + +#define ARDBUFFER 16 //Buffer for storing intermediate strings. Performance may vary depending on size. + +int log(const char *str, ...)//TODO: __FlashStringHelper str support +{ + int i, count=0, j=0, flag=0; + char temp[ARDBUFFER+1]; + for(i=0; str[i]!='\0';i++) if(str[i]=='%') count++; //Evaluate number of arguments required to be printed + + va_list argv; + va_start(argv, count); + for(i=0,j=0; str[i]!='\0';i++) //Iterate over formatting string + { + if(str[i]=='%') + { + //Clear buffer + temp[j] = '\0'; + Serial.print(temp); + j=0; + temp[0] = '\0'; + + //Process argument + switch(str[++i]) + { + case 'd': debugSerial.print(va_arg(argv, int)); + break; + case 'l': debugSerial.print(va_arg(argv, long)); + break; + case 'f': debugSerial.print(va_arg(argv, double)); + break; + case 'c': debugSerial.print((char)va_arg(argv, int)); + break; + case 's': debugSerial.print(va_arg(argv, char *)); + break; + default: ; + }; + } + else + { + //Add to buffer + temp[j] = str[i]; + j = (j+1)%ARDBUFFER; + if(j==0) //If buffer is full, empty buffer. + { + temp[ARDBUFFER] = '\0'; + debugSerial.print(temp); + temp[0]='\0'; + } + } + }; + + Serial.println(); //Print trailing newline + return count + 1; //Return number of arguments detected +} + + #pragma message(VAR_NAME_VALUE(debugSerial)) #pragma message(VAR_NAME_VALUE(SERIAL_BAUD)) \ No newline at end of file diff --git a/lighthub/utils.h b/lighthub/utils.h index 1725b59..4a1945a 100644 --- a/lighthub/utils.h +++ b/lighthub/utils.h @@ -25,10 +25,11 @@ e-mail anklimov@gmail.com #include -void PrintBytes(uint8_t* addr, uint8_t count, bool newline=0); +void PrintBytes(uint8_t* addr, uint8_t count, bool newline); void SetBytes(uint8_t* addr, uint8_t count, char * out); void SetAddr(char * out, uint8_t* addr); uint8_t HEX2DEC(char i); int getInt(char ** chan); unsigned long freeRam (); -void parseBytes(const char* str, char separator, byte* bytes, int maxBytes, int base); \ No newline at end of file +void parseBytes(const char* str, char separator, byte* bytes, int maxBytes, int base); +int log(const char *str, ...); \ No newline at end of file