mirror of
https://github.com/anklimov/lighthub
synced 2025-12-06 11:49:51 +03:00
Merge pull request #10 from livello/patch
refactoring. help cmd improved. Removed newline from freeMem periodic…
This commit is contained in:
99
README.md
99
README.md
@@ -1,7 +1,7 @@
|
|||||||
# LightHub
|
# LightHub
|
||||||
is Flexible, Arduino-Mega/Arduino DUE/ESP8266 based SmartHome controller
|
is Flexible, Arduino-Mega/Arduino DUE/ESP8266 based SmartHome controller. [RU](https://geektimes.ru/post/295109/)
|
||||||
|
|
||||||
It allow to connect together:
|
It allows connecting together:
|
||||||
|
|
||||||
* Contact sensors (switches, buttons etc)
|
* Contact sensors (switches, buttons etc)
|
||||||
* 1-Wire temperature sensors (up to 20 on single bus)
|
* 1-Wire temperature sensors (up to 20 on single bus)
|
||||||
@@ -12,24 +12,25 @@ It allow to connect together:
|
|||||||
|
|
||||||
Where is possible both, to configure local control/mapping between inputs and outputs (light, floor heating thermostats) and remote control from Openhab or Openhab2 Smarthome software
|
Where is possible both, to configure local control/mapping between inputs and outputs (light, floor heating thermostats) and remote control from Openhab or Openhab2 Smarthome software
|
||||||
|
|
||||||
Scalability is virtually unlimited: Setup so many controllers you needed in most convenient places of your house - MQTT broker will allow controllers communicate each other and with Openhab and propagate commands across network
|
Scalability is virtually unlimited: Setup so many controllers you needed in most convenient places of your house - MQTT broker will allow controllers communicate each other and with Openhab and propagate commands across network.
|
||||||
|
|
||||||
Prease refer our Wiki for insructions.
|
[Prease refer to our Wiki for insructions.](https://github.com/anklimov/lighthub/wiki/Configuring)
|
||||||
|
|
||||||
Finished portation of proejct to Arduino DUE and ESP8266 (ESP32 not tested)
|
Finished portation of project to Arduino DUE and ESP8266 (ESP32 not tested).
|
||||||
|
|
||||||
Compiled image has been added to compiled/ folder
|
Compiled image has been added to [compiled/](https://github.com/anklimov/lighthub/tree/master/compiled) folder. Flash your Mega 2560
|
||||||
use
|
|
||||||
|
```bash
|
||||||
avrdude -v -V -patmega2560 -cwiring -b115200 -D -Uflash:w:lighthub.ino.hex:i
|
avrdude -v -V -patmega2560 -cwiring -b115200 -D -Uflash:w:lighthub.ino.hex:i
|
||||||
to flash your Mega 2560
|
```
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
|
or flash your DUE (need to correct path and port, of course)
|
||||||
|
```bash
|
||||||
/Users/<user>/Library/Arduino15/packages/arduino/tools/bossac/1.6.1-arduino/bossac -i -d --port=cu.usbmodem1451 -U false -e -w -v -b lighthub.ino.bin -R
|
/Users/<user>/Library/Arduino15/packages/arduino/tools/bossac/1.6.1-arduino/bossac -i -d --port=cu.usbmodem1451 -U false -e -w -v -b lighthub.ino.bin -R
|
||||||
to flash your DUE
|
```
|
||||||
|
|
||||||
(need to correct path and port, of course)
|
|
||||||
# Dependences
|
# Dependencies
|
||||||
(quite big number of libs required. Use git clone to have your local copy in your Arduino libs folder)
|
(quite big number of libs required. Use git clone to have your local copy in your Arduino libs folder)
|
||||||
Please check updates for all dependences.
|
Please check updates for all dependences.
|
||||||
|
|
||||||
@@ -55,14 +56,14 @@ Portation from AVR Mega 2560 to SAM3X8E (Arduino DUE) done since v 0.96
|
|||||||
|
|
||||||
# Platforms specific details:
|
# Platforms specific details:
|
||||||
|
|
||||||
AVR version is basic and have all functions
|
AVR version is basic and has all functions
|
||||||
*DMX-out is software (DMXSimple) on pin3
|
*DMX-out is software (DMXSimple) on pin3
|
||||||
|
|
||||||
SAM3X8E:
|
**SAM3X8E**:
|
||||||
* default PWM frequency
|
* default PWM frequency
|
||||||
* both, DMX-in and DMX-out are hardware USART based. Use USART1 (pins 18 and 19) for DMX-out and DMX-in
|
* both, DMX-in and DMX-out are hardware USART based. Use USART1 (pins 18 and 19) for DMX-out and DMX-in
|
||||||
|
|
||||||
ESP:
|
**ESP8266**:
|
||||||
* DMX-OUT on USART1 TX
|
* DMX-OUT on USART1 TX
|
||||||
* DMX-IN - not possible to deploy in ESP8266
|
* DMX-IN - not possible to deploy in ESP8266
|
||||||
* Modbus - disabled. Might be configured in future on USART0 instead CLI/DEBUG
|
* Modbus - disabled. Might be configured in future on USART0 instead CLI/DEBUG
|
||||||
@@ -72,7 +73,7 @@ since v. 0.97:
|
|||||||
There is first attempt to use Wiznet 5500 (still not stable enough)
|
There is first attempt to use Wiznet 5500 (still not stable enough)
|
||||||
Need to use compiler directive -D Wiz5500 and https://github.com/anklimov/Ethernet2 library
|
Need to use compiler directive -D Wiz5500 and https://github.com/anklimov/Ethernet2 library
|
||||||
|
|
||||||
First attempt to use platformio toolchain for compiling (work not completed yet)
|
Prefered way to compile project is using platformio toolchain, suitable for Arduino Due, and Arduino Mega2560, but work is still in progress.
|
||||||
|
|
||||||
# Due compilation issue "USART0_Handler redefinition"
|
# Due compilation issue "USART0_Handler redefinition"
|
||||||
Please, open /variants/arduino_due_x/variant.cpp file, then edit USART0_Handler method definition like this
|
Please, open /variants/arduino_due_x/variant.cpp file, then edit USART0_Handler method definition like this
|
||||||
@@ -80,31 +81,60 @@ Please, open /variants/arduino_due_x/variant.cpp file, then edit USART0_Handler
|
|||||||
void USART0_Handler(void) __attribute__((weak));
|
void USART0_Handler(void) __attribute__((weak));
|
||||||
|
|
||||||
# Platformio command line build instructions
|
# Platformio command line build instructions
|
||||||
First of all install platformio framework. http://docs.platformio.org/en/latest/installation.html
|
[First of all install platformio framework.]( http://docs.platformio.org/en/latest/installation.html) [Good tutorial for fast start in RUSSIAN.](https://geektimes.ru/post/273852/)
|
||||||
|
|
||||||
https://geektimes.ru/post/273852/ // Good tutorial for fast start in RUSSIAN
|
In linux\macOS you can open terminal, navigate to your programming directory, then
|
||||||
|
|
||||||
In linux you can open terminal, navigate to your programming directory, then
|
```bash
|
||||||
|
git clone https://github.com/anklimov/lighthub.git
|
||||||
* git clone https://github.com/anklimov/lighthub.git
|
cd lighthub
|
||||||
* cd lighthub
|
```
|
||||||
* pio init --ide clion // use your IDE, others here: http://docs.platformio.org/en/latest/ide.html
|
now prepare project files for your IDE
|
||||||
* pio run -e due // this will build firmware for arduino due board
|
```bash
|
||||||
* rm -Rf .piolibdeps // this will clean libraries folder. Try it if you have compilation problem
|
pio init --ide [atom|clion|codeblocks|eclipse|emacs|netbeans|qtcreator|sublimetext|vim|visualstudio|vscode]
|
||||||
* pio run -e megaatmega2560 //build for arduino mega
|
```
|
||||||
* pio run -e due -t upload //build and upload firmware to arduino due
|
Set custom build flags. first make your own copy of template
|
||||||
|
```bash
|
||||||
|
cp build_flags_template.sh my_build_flags.sh
|
||||||
|
```
|
||||||
|
then edit, change or comment unnecessary sections and source it
|
||||||
|
```bash
|
||||||
|
nano my_build_flags.sh
|
||||||
|
source my_build_flags.sh
|
||||||
|
```
|
||||||
|
build and upload firmware for due|megaatmega2560|esp8266 board
|
||||||
|
```bash
|
||||||
|
pio run -e due|megaatmega2560|esp8266 -t upload
|
||||||
|
```
|
||||||
|
Clean pio libraries folder. Try it if you have compilation problem:
|
||||||
|
```bash
|
||||||
|
rm -Rf .piolibdeps
|
||||||
|
```
|
||||||
|
open COM-port monitor with specified baud rate
|
||||||
|
```bash
|
||||||
|
platformio device monitor -b 115200
|
||||||
|
```
|
||||||
|
|
||||||
# Custom build flags
|
# Custom build flags
|
||||||
|
|
||||||
* MY_CONFIG_SERVER=192.168.1.1 // address of external JSON-config http://192.168.1.1/de-ad-be-ef-fe-00.config.json
|
* MY_CONFIG_SERVER=192.168.1.1 // address of external JSON-config http://192.168.1.1/de-ad-be-ef-fe-00.config.json
|
||||||
* WATCH_DOG_TICKER_DISABLE=1 //disable wdt feature
|
* WATCH_DOG_TICKER_DISABLE //disable wdt feature
|
||||||
* USE_1W_PIN=49 // use direct connection to 1W devices, no I2C bridge DS2482-100
|
* USE_1W_PIN=49 // use direct connection to 1W devices on 49 pin, no I2C bridge DS2482-100
|
||||||
* SD_CARD_INSERTED=1 // enable sd-card support and fix lan starting
|
* SD_CARD_INSERTED // enable sd-card support and fix lan starting
|
||||||
* SERIAL_BAUD=115200 // set baud rate for console on Serial0
|
* SERIAL_BAUD=115200 // set baud rate for console on Serial0
|
||||||
* Wiz5500 //Use Wiznet 5500 library instead Wiznet 5100
|
* Wiz5500 //Use Wiznet 5500 library instead Wiznet 5100
|
||||||
|
* DISABLE_FREERAM_PRINT // disable printing free Ram in bytes
|
||||||
|
* CUSTOM_FIRMWARE_MAC=de:ad:be:ef:fe:00 //set firmware macaddress
|
||||||
|
* DMX_DISABLE //disable DMX support
|
||||||
|
* MODBUS_DISABLE // disable Modbus support
|
||||||
|
* OWIRE_DISABLE // disable OneWire support
|
||||||
|
|
||||||
|
Look at build_flags_template.sh for customizing.
|
||||||
|
=======
|
||||||
|
|
||||||
export PLATFORMIO_BUILD_FLAGS="-DMY_CONFIG_SERVER=192.168.1.1 -DWATCH_DOG_TICKER_DISABLE=1 -DUSE_1W_PIN=49 -DSERIAL_BAUD=115200 -DSD_CARD_INSERTED=1"
|
export PLATFORMIO_BUILD_FLAGS="-DMY_CONFIG_SERVER=192.168.1.1 -DWATCH_DOG_TICKER_DISABLE=1 -DUSE_1W_PIN=49 -DSERIAL_BAUD=115200 -DSD_CARD_INSERTED=1"
|
||||||
|
|
||||||
|
|
||||||
# Default compilation behavior:
|
# Default compilation behavior:
|
||||||
* Config server: lazyhome.ru
|
* Config server: lazyhome.ru
|
||||||
* Watchdog enabled
|
* Watchdog enabled
|
||||||
@@ -112,3 +142,10 @@ export PLATFORMIO_BUILD_FLAGS="-DMY_CONFIG_SERVER=192.168.1.1 -DWATCH_DOG_TICKER
|
|||||||
* No SD
|
* No SD
|
||||||
* Serial speed 115200
|
* Serial speed 115200
|
||||||
* Wiznet 5100 (for MEGA & DUE)
|
* Wiznet 5100 (for MEGA & DUE)
|
||||||
|
* Free Ram printing enabled
|
||||||
|
* de:ad:be:ef:fe:00
|
||||||
|
* DMX support enabled
|
||||||
|
* Modbus support enabled
|
||||||
|
* OneWire support enabled
|
||||||
|
=======
|
||||||
|
|
||||||
|
|||||||
21
build_flags_template.sh
Normal file
21
build_flags_template.sh
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
# usage:
|
||||||
|
# first make your own copy of template
|
||||||
|
# cp build_flags_template.sh my_build_flags.sh
|
||||||
|
# then edit, change or comment something
|
||||||
|
# nano my_build_flags.sh
|
||||||
|
# and source it
|
||||||
|
# source my_build_flags.sh
|
||||||
|
export FLAGS="-DMY_CONFIG_SERVER=lazyhome.ru"
|
||||||
|
export FLAGS="$FLAGS -DWATCH_DOG_TICKER_DISABLE"
|
||||||
|
export FLAGS="$FLAGS -DUSE_1W_PIN=12"
|
||||||
|
export FLAGS="$FLAGS -DSD_CARD_INSERTED"
|
||||||
|
export FLAGS="$FLAGS -DSERIAL_BAUD=115200"
|
||||||
|
export FLAGS="$FLAGS -DWiz5500"
|
||||||
|
export FLAGS="$FLAGS -DDISABLE_FREERAM_PRINT"
|
||||||
|
export FLAGS="$FLAGS -DCUSTOM_FIRMWARE_MAC=de:ad:be:ef:fe:00"
|
||||||
|
export FLAGS="$FLAGS -DDMX_DISABLE"
|
||||||
|
export FLAGS="$FLAGS -DMODBUS_DISABLE"
|
||||||
|
export FLAGS="$FLAGS -DOWIRE_DISABLE"
|
||||||
|
export PLATFORMIO_BUILD_FLAGS="$FLAGS"
|
||||||
|
unset FLAGS
|
||||||
@@ -23,7 +23,7 @@ e-mail anklimov@gmail.com
|
|||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include <PubSubClient.h>
|
#include <PubSubClient.h>
|
||||||
|
|
||||||
extern PubSubClient client;
|
extern PubSubClient mqttClient;
|
||||||
|
|
||||||
Input::Input(char * name) //Constructor
|
Input::Input(char * name) //Constructor
|
||||||
{
|
{
|
||||||
@@ -80,7 +80,7 @@ void Input::Parse()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int Input::Pool ()
|
int Input::Poll()
|
||||||
{
|
{
|
||||||
boolean v;
|
boolean v;
|
||||||
if (!isValid()) return -1;
|
if (!isValid()) return -1;
|
||||||
@@ -121,11 +121,11 @@ void Input::Changed (int val)
|
|||||||
|
|
||||||
if (val)
|
if (val)
|
||||||
{ //send set command
|
{ //send set command
|
||||||
if (!scmd) client.publish(emit->valuestring,"ON"); else if (strlen(scmd->valuestring)) client.publish(emit->valuestring,scmd->valuestring);
|
if (!scmd) mqttClient.publish(emit->valuestring,"ON"); else if (strlen(scmd->valuestring)) mqttClient.publish(emit->valuestring,scmd->valuestring);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ //send reset command
|
{ //send reset command
|
||||||
if (!rcmd) client.publish(emit->valuestring,"OFF"); else if (strlen(rcmd->valuestring)) client.publish(emit->valuestring,rcmd->valuestring);
|
if (!rcmd) mqttClient.publish(emit->valuestring,"OFF"); else if (strlen(rcmd->valuestring)) mqttClient.publish(emit->valuestring,rcmd->valuestring);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ class Input
|
|||||||
boolean isValid ();
|
boolean isValid ();
|
||||||
void Changed (int val);
|
void Changed (int val);
|
||||||
|
|
||||||
int Pool ();
|
int Poll();
|
||||||
protected:
|
protected:
|
||||||
void Parse();
|
void Parse();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -22,8 +22,10 @@ e-mail anklimov@gmail.com
|
|||||||
#include "aJSON.h"
|
#include "aJSON.h"
|
||||||
|
|
||||||
#ifdef _dmxout
|
#ifdef _dmxout
|
||||||
|
|
||||||
#include "dmx.h"
|
#include "dmx.h"
|
||||||
#include "FastLED.h"
|
#include "FastLED.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <ModbusMaster.h>
|
#include <ModbusMaster.h>
|
||||||
@@ -37,15 +39,15 @@ extern aJsonObject * modbusitem;
|
|||||||
|
|
||||||
|
|
||||||
int modbusSet(int addr, uint16_t _reg, int _mask, uint16_t value);
|
int modbusSet(int addr, uint16_t _reg, int _mask, uint16_t value);
|
||||||
extern PubSubClient client;
|
|
||||||
|
extern PubSubClient mqttClient;
|
||||||
//extern const char* outprefix;
|
//extern const char* outprefix;
|
||||||
const char outprefix[] PROGMEM = "/myhome/s_out/";
|
const char outprefix[] PROGMEM = "/myhome/s_out/";
|
||||||
|
|
||||||
static unsigned long lastctrl = 0;
|
static unsigned long lastctrl = 0;
|
||||||
static aJsonObject *lastobj = NULL;
|
static aJsonObject *lastobj = NULL;
|
||||||
|
|
||||||
int txt2cmd (char * payload)
|
int txt2cmd(char *payload) {
|
||||||
{
|
|
||||||
int cmd = -1;
|
int cmd = -1;
|
||||||
|
|
||||||
// Check for command
|
// Check for command
|
||||||
@@ -68,12 +70,12 @@ Item::Item(aJsonObject * obj)//Constructor
|
|||||||
Parse();
|
Parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::Parse()
|
void Item::Parse() {
|
||||||
{
|
if (isValid()) {
|
||||||
if (isValid())
|
|
||||||
{
|
|
||||||
// Todo - avoid static enlarge for every types
|
// Todo - avoid static enlarge for every types
|
||||||
for (int i=aJson.getArraySize(itemArr);i<4;i++) aJson.addItemToArray(itemArr,aJson.createItem(int(defval[i]))); //Enlarge item to 4 elements. VAL=int if no other definition in conf
|
for (int i = aJson.getArraySize(itemArr); i < 4; i++)
|
||||||
|
aJson.addItemToArray(itemArr, aJson.createItem(
|
||||||
|
int(defval[i]))); //Enlarge item to 4 elements. VAL=int if no other definition in conf
|
||||||
|
|
||||||
|
|
||||||
itemType = aJson.getArrayItem(itemArr, I_TYPE)->valueint;
|
itemType = aJson.getArrayItem(itemArr, I_TYPE)->valueint;
|
||||||
@@ -82,8 +84,11 @@ void Item::Parse()
|
|||||||
|
|
||||||
|
|
||||||
Serial.print(F(" Item:"));
|
Serial.print(F(" Item:"));
|
||||||
Serial.print(itemArr->name);Serial.print(F(" T:"));
|
Serial.print(itemArr->name);
|
||||||
Serial.print(itemType);Serial.print(F(" ="));Serial.println(getArg());
|
Serial.print(F(" T:"));
|
||||||
|
Serial.print(itemType);
|
||||||
|
Serial.print(F(" ="));
|
||||||
|
Serial.println(getArg());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +101,7 @@ Item::Item(char * name) //Constructor
|
|||||||
Parse();
|
Parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Item::getCmd()
|
uint8_t Item::getCmd() {
|
||||||
{
|
|
||||||
aJsonObject *t = aJson.getArrayItem(itemArr, I_CMD);
|
aJsonObject *t = aJson.getArrayItem(itemArr, I_CMD);
|
||||||
if (t)
|
if (t)
|
||||||
return t->valueint;
|
return t->valueint;
|
||||||
@@ -105,19 +109,20 @@ uint8_t Item::getCmd()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item::setCmd(uint8_t cmd)
|
void Item::setCmd(uint8_t cmd) {
|
||||||
{
|
|
||||||
aJsonObject *t = aJson.getArrayItem(itemArr, I_CMD);
|
aJsonObject *t = aJson.getArrayItem(itemArr, I_CMD);
|
||||||
if (t)
|
if (t)
|
||||||
t->valueint = cmd;
|
t->valueint = cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Item::getArg(short n) //Return arg int or first array element if Arg is array
|
int Item::getArg(short n) //Return arg int or first array element if Arg is array
|
||||||
{ if (!itemArg) return -1;
|
{
|
||||||
|
if (!itemArg) return -1;
|
||||||
if (itemArg->type == aJson_Int) return itemArg->valueint;
|
if (itemArg->type == aJson_Int) return itemArg->valueint;
|
||||||
else if (itemArg->type == aJson_Array) return aJson.getArrayItem(itemArg, n)->valueint;
|
else if (itemArg->type == aJson_Array) return aJson.getArrayItem(itemArg, n)->valueint;
|
||||||
else return -2;
|
else return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int Item::getVal(short n) //Return Val from Value array
|
int Item::getVal(short n) //Return Val from Value array
|
||||||
{ if (!itemVal) return -1;
|
{ if (!itemVal) return -1;
|
||||||
@@ -132,16 +137,16 @@ int Item::getVal(short n) //Return Val from Value array
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
long int Item::getVal() //Return Val if val is int or first elem of Value array
|
long int Item::getVal() //Return Val if val is int or first elem of Value array
|
||||||
{ if (!itemVal) return -1;
|
|
||||||
if (itemVal->type==aJson_Int) return itemVal->valueint;
|
|
||||||
else if (itemVal->type==aJson_Array)
|
|
||||||
{
|
{
|
||||||
|
if (!itemVal) return -1;
|
||||||
|
if (itemVal->type == aJson_Int) return itemVal->valueint;
|
||||||
|
else if (itemVal->type == aJson_Array) {
|
||||||
aJsonObject *t = aJson.getArrayItem(itemVal, 0);
|
aJsonObject *t = aJson.getArrayItem(itemVal, 0);
|
||||||
if (t) return t->valueint;
|
if (t) return t->valueint;
|
||||||
else return -3;
|
else return -3;
|
||||||
|
} else return -2;
|
||||||
}
|
}
|
||||||
else return -2;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
void Item::setVal(short n, int par) // Only store if VAL is array defined in config to avoid waste of RAM
|
void Item::setVal(short n, int par) // Only store if VAL is array defined in config to avoid waste of RAM
|
||||||
{
|
{
|
||||||
@@ -157,13 +162,14 @@ void Item::setVal(short n, int par) // Only store if VAL is array defined in c
|
|||||||
void Item::setVal(long int par) // Only store if VAL is int (autogenerated or config-defined)
|
void Item::setVal(long int par) // Only store if VAL is int (autogenerated or config-defined)
|
||||||
{
|
{
|
||||||
if (!itemVal || itemVal->type != aJson_Int) return;
|
if (!itemVal || itemVal->type != aJson_Int) return;
|
||||||
Serial.print(F(" Store "));Serial.print(F(" Val="));Serial.println(par);
|
Serial.print(F(" Store "));
|
||||||
|
Serial.print(F(" Val="));
|
||||||
|
Serial.println(par);
|
||||||
itemVal->valueint = par;
|
itemVal->valueint = par;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
boolean Item::isValid ()
|
boolean Item::isValid() {
|
||||||
{
|
|
||||||
return (itemArr && (itemArr->type == aJson_Array));
|
return (itemArr && (itemArr->type == aJson_Array));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,15 +191,14 @@ void analogWrite(int pin, int val)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
boolean Item::getEnableCMD(int delta)
|
boolean Item::getEnableCMD(int delta) {
|
||||||
{
|
|
||||||
return ((millis() - lastctrl > (unsigned long) delta));//|| (itemArr!=lastobj));
|
return ((millis() - lastctrl > (unsigned long) delta));//|| (itemArr!=lastobj));
|
||||||
}
|
}
|
||||||
|
|
||||||
int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
int Item::Ctrl(short cmd, short n, int *Par, boolean send) {
|
||||||
{
|
|
||||||
|
|
||||||
Serial.print(F("Cmd="));Serial.println(cmd);
|
Serial.print(F("Cmd="));
|
||||||
|
Serial.println(cmd);
|
||||||
//va_list vl;
|
//va_list vl;
|
||||||
|
|
||||||
int _Par[3] = {0, 0, 0};
|
int _Par[3] = {0, 0, 0};
|
||||||
@@ -205,19 +210,19 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd) {
|
||||||
{
|
|
||||||
int t;
|
int t;
|
||||||
case CMD_TOGGLE:
|
case CMD_TOGGLE:
|
||||||
if (isActive()) cmd=CMD_OFF; else cmd=CMD_ON;
|
if (isActive()) cmd = CMD_OFF;
|
||||||
|
else cmd = CMD_ON;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_RESTORE:
|
case CMD_RESTORE:
|
||||||
if (itemType != CH_GROUP) //individual threating of channels. Ignore restore command for groups
|
if (itemType != CH_GROUP) //individual threating of channels. Ignore restore command for groups
|
||||||
switch (t=getCmd())
|
switch (t = getCmd()) {
|
||||||
{
|
|
||||||
case CMD_HALT: //previous command was HALT ?
|
case CMD_HALT: //previous command was HALT ?
|
||||||
Serial.print(F("Restored from:"));Serial.println(t);
|
Serial.print(F("Restored from:"));
|
||||||
|
Serial.println(t);
|
||||||
cmd = CMD_ON; //turning on
|
cmd = CMD_ON; //turning on
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -225,14 +230,12 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
}//switch old cmd
|
}//switch old cmd
|
||||||
} //switch cmd
|
} //switch cmd
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd) {
|
||||||
{
|
|
||||||
case 0: //no command
|
case 0: //no command
|
||||||
|
|
||||||
setCmd(CMD_SET);
|
setCmd(CMD_SET);
|
||||||
|
|
||||||
switch (itemType)
|
switch (itemType) {
|
||||||
{
|
|
||||||
|
|
||||||
case CH_RGBW: //only if configured VAL array
|
case CH_RGBW: //only if configured VAL array
|
||||||
if (!Par[1]) itemType = CH_WHITE;
|
if (!Par[1]) itemType = CH_WHITE;
|
||||||
@@ -262,16 +265,13 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_ON:
|
case CMD_ON:
|
||||||
if (getCmd()!=CMD_ON)
|
if (getCmd() != CMD_ON) {
|
||||||
|
|
||||||
{
|
|
||||||
short params = 0;
|
short params = 0;
|
||||||
//retrive stored values
|
//retrive stored values
|
||||||
st.aslong = getVal();
|
st.aslong = getVal();
|
||||||
if (st.aslong > 0) //Stored smthng
|
if (st.aslong > 0) //Stored smthng
|
||||||
|
|
||||||
switch (itemType)
|
switch (itemType) {
|
||||||
{
|
|
||||||
//case CH_GROUP:
|
//case CH_GROUP:
|
||||||
case CH_RGBW:
|
case CH_RGBW:
|
||||||
case CH_RGB:
|
case CH_RGB:
|
||||||
@@ -301,13 +301,11 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
default:
|
default:
|
||||||
SendCmd(cmd); // Just send ON
|
SendCmd(cmd); // Just send ON
|
||||||
}//itemtype
|
}//itemtype
|
||||||
else
|
else {// Default settings
|
||||||
{// Default settings
|
|
||||||
Serial.print(st.aslong);
|
Serial.print(st.aslong);
|
||||||
Serial.println(F(": No stored values - default"));
|
Serial.println(F(": No stored values - default"));
|
||||||
|
|
||||||
switch (itemType)
|
switch (itemType) {
|
||||||
{
|
|
||||||
case CH_VCTEMP:
|
case CH_VCTEMP:
|
||||||
Par[0] = 20;
|
Par[0] = 20;
|
||||||
break;
|
break;
|
||||||
@@ -319,18 +317,17 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (short i=0;i<params ;i++)
|
for (short i = 0; i < params; i++) {
|
||||||
{
|
Serial.print(F("Restored: "));
|
||||||
Serial.print(F("Restored: "));Serial.print(i);Serial.print(F("="));Serial.println(Par[i]);
|
Serial.print(i);
|
||||||
|
Serial.print(F("="));
|
||||||
|
Serial.println(Par[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
setCmd(cmd);
|
setCmd(cmd);
|
||||||
}
|
} else { //Double ON - apply special preset - clean white full power
|
||||||
else
|
switch (itemType) {
|
||||||
{ //Double ON - apply special preset - clean white full power
|
|
||||||
switch (itemType)
|
|
||||||
{
|
|
||||||
case CH_RGBW:
|
case CH_RGBW:
|
||||||
Serial.println(F("Force White"));
|
Serial.println(F("Force White"));
|
||||||
itemType = CH_WHITE;
|
itemType = CH_WHITE;
|
||||||
@@ -358,7 +355,9 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
case CMD_OFF:
|
case CMD_OFF:
|
||||||
if (getCmd() != CMD_HALT) //if channels are halted - OFF to be ignored (restore issue)
|
if (getCmd() != CMD_HALT) //if channels are halted - OFF to be ignored (restore issue)
|
||||||
{
|
{
|
||||||
Par[0]=0;Par[1]=0;Par[2]=0;
|
Par[0] = 0;
|
||||||
|
Par[1] = 0;
|
||||||
|
Par[2] = 0;
|
||||||
setCmd(cmd);
|
setCmd(cmd);
|
||||||
SendCmd(cmd);
|
SendCmd(cmd);
|
||||||
}
|
}
|
||||||
@@ -366,9 +365,10 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
|
|
||||||
case CMD_HALT:
|
case CMD_HALT:
|
||||||
|
|
||||||
if (isActive()>0)
|
if (isActive() > 0) {
|
||||||
{
|
Par[0] = 0;
|
||||||
Par[0]=0;Par[1]=0;Par[2]=0;
|
Par[1] = 0;
|
||||||
|
Par[2] = 0;
|
||||||
setCmd(cmd);
|
setCmd(cmd);
|
||||||
SendCmd(CMD_OFF);
|
SendCmd(CMD_OFF);
|
||||||
Serial.println(F(" Halted"));
|
Serial.println(F(" Halted"));
|
||||||
@@ -380,8 +380,7 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch (itemType)
|
switch (itemType) {
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef _dmxout
|
#ifdef _dmxout
|
||||||
case CH_DIMMER: //Dimmed light
|
case CH_DIMMER: //Dimmed light
|
||||||
@@ -395,7 +394,8 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
DmxWrite(iaddr + 3, k = map((100 - Par[1]) * Par[2], 0, 10000, 0, 255));
|
DmxWrite(iaddr + 3, k = map((100 - Par[1]) * Par[2], 0, 10000, 0, 255));
|
||||||
Serial.print(F("W:"));Serial.println(k);
|
Serial.print(F("W:"));
|
||||||
|
Serial.println(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -411,7 +411,8 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
DmxWrite(iaddr + 2, rgb.b);
|
DmxWrite(iaddr + 2, rgb.b);
|
||||||
|
|
||||||
|
|
||||||
break; }
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
case CH_WHITE:
|
case CH_WHITE:
|
||||||
@@ -423,28 +424,25 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _modbus
|
#ifdef _modbus
|
||||||
case CH_MODBUS:
|
case CH_MODBUS: {
|
||||||
{
|
|
||||||
|
|
||||||
if ((itemArg->type == aJson_Array) && (aJson.getArraySize(itemArg)==3))
|
if ((itemArg->type == aJson_Array) && (aJson.getArraySize(itemArg) == 3)) {
|
||||||
{
|
|
||||||
int _addr = aJson.getArrayItem(itemArg, 0)->valueint;
|
int _addr = aJson.getArrayItem(itemArg, 0)->valueint;
|
||||||
int _reg = aJson.getArrayItem(itemArg, 1)->valueint;
|
int _reg = aJson.getArrayItem(itemArg, 1)->valueint;
|
||||||
int _mask = aJson.getArrayItem(itemArg, 2)->valueint;
|
int _mask = aJson.getArrayItem(itemArg, 2)->valueint;
|
||||||
|
|
||||||
modbusSet(_addr, _reg, _mask, map(Par[0], 0, 100, 0, 0x3f));
|
modbusSet(_addr, _reg, _mask, map(Par[0], 0, 100, 0, 0x3f));
|
||||||
}
|
}
|
||||||
break;}
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case CH_GROUP://Group
|
case CH_GROUP://Group
|
||||||
{
|
{
|
||||||
//aJsonObject *groupArr= aJson.getArrayItem(itemArr, 1);
|
//aJsonObject *groupArr= aJson.getArrayItem(itemArr, 1);
|
||||||
if (itemArg->type==aJson_Array)
|
if (itemArg->type == aJson_Array) {
|
||||||
{
|
|
||||||
aJsonObject *i = itemArg->child;
|
aJsonObject *i = itemArg->child;
|
||||||
while (i)
|
while (i) {
|
||||||
{
|
|
||||||
Item it(i->valuestring);
|
Item it(i->valuestring);
|
||||||
// it.copyPar(itemVal);
|
// it.copyPar(itemVal);
|
||||||
it.Ctrl(cmd, n, Par, send); //// was true
|
it.Ctrl(cmd, n, Par, send); //// was true
|
||||||
@@ -453,20 +451,26 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
} //if
|
} //if
|
||||||
} //case
|
} //case
|
||||||
break;
|
break;
|
||||||
case CH_RELAY:
|
case CH_RELAY: {
|
||||||
{int k;
|
int k;
|
||||||
pinMode(iaddr, OUTPUT);
|
pinMode(iaddr, OUTPUT);
|
||||||
digitalWrite(iaddr, k = ((cmd == CMD_ON) ? HIGH : LOW));
|
digitalWrite(iaddr, k = ((cmd == CMD_ON) ? HIGH : LOW));
|
||||||
Serial.print(F("Pin:"));Serial.print(iaddr);Serial.print(F("="));Serial.println(k);
|
Serial.print(F("Pin:"));
|
||||||
|
Serial.print(iaddr);
|
||||||
|
Serial.print(F("="));
|
||||||
|
Serial.println(k);
|
||||||
break;
|
break;
|
||||||
case CH_THERMO:
|
case CH_THERMO:
|
||||||
///thermoSet(name,cmd,Par1); all cativities done - update temp & cmd
|
///thermoSet(name,cmd,Par1); all cativities done - update temp & cmd
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CH_PWM:
|
case CH_PWM: {
|
||||||
{int k;
|
int k;
|
||||||
short inverse = 0;
|
short inverse = 0;
|
||||||
if (iaddr<0) {iaddr=-iaddr;inverse=1;}
|
if (iaddr < 0) {
|
||||||
|
iaddr = -iaddr;
|
||||||
|
inverse = 1;
|
||||||
|
}
|
||||||
pinMode(iaddr, OUTPUT);
|
pinMode(iaddr, OUTPUT);
|
||||||
//timer 0 for pin 13 and 4
|
//timer 0 for pin 13 and 4
|
||||||
//timer 1 for pin 12 and 11
|
//timer 1 for pin 12 and 11
|
||||||
@@ -490,7 +494,10 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
if (inverse) k = map(Par[0], 100, 0, 0, 255);
|
if (inverse) k = map(Par[0], 100, 0, 0, 255);
|
||||||
else k = map(Par[0], 0, 100, 0, 255);
|
else k = map(Par[0], 0, 100, 0, 255);
|
||||||
analogWrite(iaddr, k);
|
analogWrite(iaddr, k);
|
||||||
Serial.print(F("Pin:"));Serial.print(iaddr);Serial.print(F("="));Serial.println(k);
|
Serial.print(F("Pin:"));
|
||||||
|
Serial.print(iaddr);
|
||||||
|
Serial.print(F("="));
|
||||||
|
Serial.println(k);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef _modbus
|
#ifdef _modbus
|
||||||
@@ -500,8 +507,7 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case CH_VCTEMP:
|
case CH_VCTEMP: {
|
||||||
{
|
|
||||||
Item it(itemArg->valuestring);
|
Item it(itemArg->valuestring);
|
||||||
if (it.isValid() && it.itemType == CH_VC)
|
if (it.isValid() && it.itemType == CH_VC)
|
||||||
VacomSetHeat(it.getArg(), Par[0], cmd);
|
VacomSetHeat(it.getArg(), Par[0], cmd);
|
||||||
@@ -516,8 +522,7 @@ int Item::Ctrl(short cmd, short n, int * Par, boolean send)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Item::isActive()
|
int Item::isActive() {
|
||||||
{
|
|
||||||
HSVstore st;
|
HSVstore st;
|
||||||
int val = 0;
|
int val = 0;
|
||||||
|
|
||||||
@@ -529,8 +534,7 @@ int cmd=getCmd();
|
|||||||
|
|
||||||
if (itemType != CH_GROUP)
|
if (itemType != CH_GROUP)
|
||||||
// Simple check last command first
|
// Simple check last command first
|
||||||
switch (cmd)
|
switch (cmd) {
|
||||||
{
|
|
||||||
case CMD_ON:
|
case CMD_ON:
|
||||||
//Serial.println(" active");
|
//Serial.println(" active");
|
||||||
return 1;
|
return 1;
|
||||||
@@ -544,18 +548,18 @@ switch (cmd)
|
|||||||
// Last time was not a command but parameters set. Looking inside
|
// Last time was not a command but parameters set. Looking inside
|
||||||
st.aslong = getVal();
|
st.aslong = getVal();
|
||||||
|
|
||||||
switch (itemType)
|
switch (itemType) {
|
||||||
{
|
|
||||||
case CH_GROUP: //make recursive calculation - is it some active in group
|
case CH_GROUP: //make recursive calculation - is it some active in group
|
||||||
if (itemArg->type==aJson_Array)
|
if (itemArg->type == aJson_Array) {
|
||||||
{
|
|
||||||
Serial.println(F("Grp check: "));
|
Serial.println(F("Grp check: "));
|
||||||
aJsonObject *i = itemArg->child;
|
aJsonObject *i = itemArg->child;
|
||||||
while (i)
|
while (i) {
|
||||||
{
|
|
||||||
Item it(i->valuestring);
|
Item it(i->valuestring);
|
||||||
|
|
||||||
if (it.isValid() && it.isActive()) {Serial.println(F("Active")); return 1;}
|
if (it.isValid() && it.isActive()) {
|
||||||
|
Serial.println(F("Active"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
i = i->next;
|
i = i->next;
|
||||||
} //while
|
} //while
|
||||||
return 0;
|
return 0;
|
||||||
@@ -577,7 +581,8 @@ switch (itemType)
|
|||||||
case CH_VCTEMP:
|
case CH_VCTEMP:
|
||||||
val = st.aslong;
|
val = st.aslong;
|
||||||
} //switch
|
} //switch
|
||||||
Serial.print(F(":="));Serial.println(val);
|
Serial.print(F(":="));
|
||||||
|
Serial.println(val);
|
||||||
if (val) return 1; else return 0;
|
if (val) return 1; else return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,27 +647,31 @@ OFF
|
|||||||
[22:25:34] => Poll: 0A 06 07 D0 00 00 88 3C
|
[22:25:34] => Poll: 0A 06 07 D0 00 00 88 3C
|
||||||
|
|
||||||
|
|
||||||
POOL 2101x10
|
POLL 2101x10
|
||||||
[22:27:29] <= Response: 0A 03 14 00 23 00 00 27 10 13 88 0B 9C 00 32 00 F8 00 F2 06 FA 01 3F AD D0
|
[22:27:29] <= Response: 0A 03 14 00 23 00 00 27 10 13 88 0B 9C 00 32 00 F8 00 F2 06 FA 01 3F AD D0
|
||||||
[22:27:29] => Poll: 0A 03 08 34 00 0A 87 18
|
[22:27:29] => Poll: 0A 03 08 34 00 0A 87 18
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void mb_fail(short addr, short op, int val, int cmd)
|
void mb_fail(short addr, short op, int val, int cmd) {
|
||||||
{
|
|
||||||
Serial.println(F("Modbus op failed"));
|
Serial.println(F("Modbus op failed"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern ModbusMaster node;
|
extern ModbusMaster node;
|
||||||
|
|
||||||
int Item::VacomSetFan (int8_t val, int8_t cmd)
|
int Item::VacomSetFan(int8_t val, int8_t cmd) {
|
||||||
{
|
|
||||||
int addr = getArg();
|
int addr = getArg();
|
||||||
Serial.print(F("VC#"));Serial.print(addr);Serial.print(F("="));Serial.println(val);
|
Serial.print(F("VC#"));
|
||||||
|
Serial.print(addr);
|
||||||
|
Serial.print(F("="));
|
||||||
|
Serial.println(val);
|
||||||
|
|
||||||
|
|
||||||
if (modbusBusy) {mb_fail(1,addr,val,cmd);return -1;}
|
if (modbusBusy) {
|
||||||
|
mb_fail(1, addr, val, cmd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
modbusBusy = 1;
|
modbusBusy = 1;
|
||||||
|
|
||||||
uint8_t j, result;
|
uint8_t j, result;
|
||||||
@@ -674,8 +683,7 @@ node.begin(addr,modbusSerial);
|
|||||||
if (val) {
|
if (val) {
|
||||||
node.writeSingleRegister(2001 - 1, 4 + 1);//delay(500);
|
node.writeSingleRegister(2001 - 1, 4 + 1);//delay(500);
|
||||||
//node.writeSingleRegister(2001-1,1);
|
//node.writeSingleRegister(2001-1,1);
|
||||||
}
|
} else node.writeSingleRegister(2001 - 1, 0);
|
||||||
else node.writeSingleRegister(2001-1,0);
|
|
||||||
delay(50);
|
delay(50);
|
||||||
node.writeSingleRegister(2003 - 1, val * 100);
|
node.writeSingleRegister(2003 - 1, val * 100);
|
||||||
|
|
||||||
@@ -686,11 +694,18 @@ node.begin(addr,modbusSerial);
|
|||||||
#define a 0.1842
|
#define a 0.1842
|
||||||
#define b -36.68
|
#define b -36.68
|
||||||
|
|
||||||
int Item::VacomSetHeat(int addr,int8_t val, int8_t cmd)
|
int Item::VacomSetHeat(int addr, int8_t val, int8_t cmd) {
|
||||||
{
|
|
||||||
|
|
||||||
Serial.print(F("VC_heat#"));Serial.print(addr);Serial.print(F("="));Serial.print(val);Serial.print(F(" cmd="));Serial.println(cmd);
|
Serial.print(F("VC_heat#"));
|
||||||
if (modbusBusy) {mb_fail(2,addr,val,cmd);return -1;}
|
Serial.print(addr);
|
||||||
|
Serial.print(F("="));
|
||||||
|
Serial.print(val);
|
||||||
|
Serial.print(F(" cmd="));
|
||||||
|
Serial.println(cmd);
|
||||||
|
if (modbusBusy) {
|
||||||
|
mb_fail(2, addr, val, cmd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
modbusBusy = 1;
|
modbusBusy = 1;
|
||||||
|
|
||||||
modbusSerial.begin(9600, fmPar);
|
modbusSerial.begin(9600, fmPar);
|
||||||
@@ -698,8 +713,7 @@ node.begin(addr,modbusSerial);
|
|||||||
|
|
||||||
uint16_t regval;
|
uint16_t regval;
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd) {
|
||||||
{
|
|
||||||
case CMD_OFF:
|
case CMD_OFF:
|
||||||
case CMD_HALT:
|
case CMD_HALT:
|
||||||
regval = 0;
|
regval = 0;
|
||||||
@@ -715,8 +729,7 @@ node.begin(addr,modbusSerial);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Item::SendCmd(short cmd,short n, int * Par)
|
int Item::SendCmd(short cmd, short n, int *Par) {
|
||||||
{
|
|
||||||
|
|
||||||
/// ToDo: relative patches, configuration
|
/// ToDo: relative patches, configuration
|
||||||
|
|
||||||
@@ -728,8 +741,7 @@ int Item::SendCmd(short cmd,short n, int * Par)
|
|||||||
strncat(addrstr, itemArr->name, sizeof(addrstr)); ////
|
strncat(addrstr, itemArr->name, sizeof(addrstr)); ////
|
||||||
|
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd) {
|
||||||
{
|
|
||||||
case CMD_ON:
|
case CMD_ON:
|
||||||
strcpy(valstr, "ON");
|
strcpy(valstr, "ON");
|
||||||
break;
|
break;
|
||||||
@@ -741,13 +753,11 @@ int Item::SendCmd(short cmd,short n, int * Par)
|
|||||||
case 0:
|
case 0:
|
||||||
case CMD_SET:
|
case CMD_SET:
|
||||||
if (Par)
|
if (Par)
|
||||||
for (short i=0;i<n;i++)
|
for (short i = 0; i < n; i++) {
|
||||||
{
|
|
||||||
char num[4];
|
char num[4];
|
||||||
snprintf(num, sizeof(num), "%d", Par[i]);
|
snprintf(num, sizeof(num), "%d", Par[i]);
|
||||||
strncat(valstr, num, sizeof(valstr));
|
strncat(valstr, num, sizeof(valstr));
|
||||||
if (i!=n-1)
|
if (i != n - 1) {
|
||||||
{
|
|
||||||
strcpy(num, ",");
|
strcpy(num, ",");
|
||||||
strncat(valstr, num, sizeof(valstr));
|
strncat(valstr, num, sizeof(valstr));
|
||||||
}
|
}
|
||||||
@@ -757,39 +767,46 @@ int Item::SendCmd(short cmd,short n, int * Par)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.print(addrstr);Serial.print(F("->"));Serial.println(valstr);
|
Serial.print(addrstr);
|
||||||
client.publish(addrstr, valstr);
|
Serial.print(F("->"));
|
||||||
|
Serial.println(valstr);
|
||||||
|
mqttClient.publish(addrstr, valstr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int modbusSet(int addr, uint16_t _reg, int _mask, uint16_t value) {
|
||||||
|
|
||||||
|
if (modbusBusy) {
|
||||||
|
mb_fail(3, addr, value, 0);
|
||||||
int modbusSet(int addr, uint16_t _reg, int _mask, uint16_t value)
|
return -1;
|
||||||
{
|
};
|
||||||
|
|
||||||
if (modbusBusy) {mb_fail(3,addr,value,0);return -1;};
|
|
||||||
modbusBusy = 1;
|
modbusBusy = 1;
|
||||||
|
|
||||||
modbusSerial.begin(9600, dimPar);
|
modbusSerial.begin(9600, dimPar);
|
||||||
node.begin(addr, modbusSerial);
|
node.begin(addr, modbusSerial);
|
||||||
|
|
||||||
|
|
||||||
if (_mask)
|
if (_mask) {
|
||||||
{value <<= 8; value |= (0xff);}
|
value <<= 8;
|
||||||
else {value &= 0xff; value |= (0xff00);}
|
value |= (0xff);
|
||||||
|
} else {
|
||||||
|
value &= 0xff;
|
||||||
|
value |= (0xff00);
|
||||||
|
}
|
||||||
|
|
||||||
Serial.print(addr);Serial.print(F("=>"));Serial.print(_reg,HEX);Serial.print(F(":"));Serial.println(value,HEX);
|
Serial.print(addr);
|
||||||
|
Serial.print(F("=>"));
|
||||||
|
Serial.print(_reg, HEX);
|
||||||
|
Serial.print(F(":"));
|
||||||
|
Serial.println(value, HEX);
|
||||||
|
|
||||||
node.writeSingleRegister(_reg, value);
|
node.writeSingleRegister(_reg, value);
|
||||||
modbusBusy = 0;
|
modbusBusy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Item::checkFM() {
|
||||||
int Item::checkFM()
|
|
||||||
{
|
|
||||||
if (modbusBusy) return -1;
|
if (modbusBusy) return -1;
|
||||||
modbusBusy = 1;
|
modbusBusy = 1;
|
||||||
|
|
||||||
@@ -815,12 +832,12 @@ node.begin(getArg(),modbusSerial);
|
|||||||
result = node.readHoldingRegisters(2101 - 1, 10);
|
result = node.readHoldingRegisters(2101 - 1, 10);
|
||||||
|
|
||||||
// do something with data if read is successful
|
// do something with data if read is successful
|
||||||
if (result == node.ku8MBSuccess)
|
if (result == node.ku8MBSuccess) {
|
||||||
{ Serial.print(F(" FM Val :"));
|
Serial.print(F(" FM Val :"));
|
||||||
for (j = 0; j < 10; j++)
|
for (j = 0; j < 10; j++) {
|
||||||
{
|
|
||||||
data = node.getResponseBuffer(j);
|
data = node.getResponseBuffer(j);
|
||||||
Serial.print(data,HEX);Serial.print(F("-"));
|
Serial.print(data, HEX);
|
||||||
|
Serial.print(F("-"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -836,7 +853,10 @@ node.begin(getArg(),modbusSerial);
|
|||||||
aJson.addNumberToObject(out, "sw", (int) node.getResponseBuffer(0));
|
aJson.addNumberToObject(out, "sw", (int) node.getResponseBuffer(0));
|
||||||
|
|
||||||
Serial.println();
|
Serial.println();
|
||||||
} else {Serial.print(F("Modbus pooling error=")); Serial.println(result,HEX); }
|
} else {
|
||||||
|
Serial.print(F("Modbus polling error="));
|
||||||
|
Serial.println(result, HEX);
|
||||||
|
}
|
||||||
|
|
||||||
if (node.getResponseBuffer(0) & 8) //Active fault
|
if (node.getResponseBuffer(0) & 8) //Active fault
|
||||||
{
|
{
|
||||||
@@ -848,12 +868,12 @@ delay(50);
|
|||||||
result = node.readHoldingRegisters(20 - 1, 4);
|
result = node.readHoldingRegisters(20 - 1, 4);
|
||||||
|
|
||||||
// do something with data if read is successful
|
// do something with data if read is successful
|
||||||
if (result == node.ku8MBSuccess)
|
if (result == node.ku8MBSuccess) {
|
||||||
{ Serial.print(F(" PI Val :"));
|
Serial.print(F(" PI Val :"));
|
||||||
for (j = 0; j < 4; j++)
|
for (j = 0; j < 4; j++) {
|
||||||
{
|
|
||||||
data = node.getResponseBuffer(j);
|
data = node.getResponseBuffer(j);
|
||||||
Serial.print(data);Serial.print(F("-"));
|
Serial.print(data);
|
||||||
|
Serial.print(F("-"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -866,11 +886,14 @@ result = node.readHoldingRegisters(20-1, 4);
|
|||||||
|
|
||||||
|
|
||||||
Serial.println();
|
Serial.println();
|
||||||
} else {Serial.print(F("Modbus pooling error=")); Serial.println(result,HEX); }
|
} else {
|
||||||
|
Serial.print(F("Modbus polling error="));
|
||||||
|
Serial.println(result, HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
outch = aJson.print(out);
|
outch = aJson.print(out);
|
||||||
client.publish(addrstr, outch);
|
mqttClient.publish(addrstr, outch);
|
||||||
free(outch);
|
free(outch);
|
||||||
aJson.deleteItem(out);
|
aJson.deleteItem(out);
|
||||||
|
|
||||||
@@ -878,8 +901,7 @@ result = node.readHoldingRegisters(20-1, 4);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Item::checkModbus()
|
int Item::checkModbus() {
|
||||||
{
|
|
||||||
if (modbusBusy) return -1;
|
if (modbusBusy) return -1;
|
||||||
modbusBusy = 1;
|
modbusBusy = 1;
|
||||||
|
|
||||||
@@ -899,20 +921,22 @@ result = node.readHoldingRegisters(20-1, 4);
|
|||||||
|
|
||||||
result = node.readHoldingRegisters(reg, 1);
|
result = node.readHoldingRegisters(reg, 1);
|
||||||
|
|
||||||
if (result == node.ku8MBSuccess)
|
if (result == node.ku8MBSuccess) {
|
||||||
{
|
|
||||||
data = node.getResponseBuffer(0);
|
data = node.getResponseBuffer(0);
|
||||||
Serial.print(F("Modbus Val: ")); Serial.println(data,HEX);
|
Serial.print(F("Modbus Val: "));
|
||||||
|
Serial.println(data, HEX);
|
||||||
checkModbus(data);
|
checkModbus(data);
|
||||||
|
} else {
|
||||||
|
Serial.print(F("Modbus polling error="));
|
||||||
|
Serial.println(result, HEX);
|
||||||
}
|
}
|
||||||
else {Serial.print(F("Modbus pooling error=")); Serial.println(result,HEX); }
|
|
||||||
|
|
||||||
modbusBusy = 0;
|
modbusBusy = 0;
|
||||||
|
|
||||||
// Looking 1 step ahead for modbus item, which uses same register
|
// Looking 1 step ahead for modbus item, which uses same register
|
||||||
Item nextItem(modbusitem->next);
|
Item nextItem(modbusitem->next);
|
||||||
if (modbusitem && nextItem.isValid() && nextItem.itemType==CH_MODBUS && nextItem.getArg(0)==addr && nextItem.getArg(1)==reg)
|
if (modbusitem && nextItem.isValid() && nextItem.itemType == CH_MODBUS && nextItem.getArg(0) == addr &&
|
||||||
{
|
nextItem.getArg(1) == reg) {
|
||||||
nextItem.checkModbus(data);
|
nextItem.checkModbus(data);
|
||||||
modbusitem = modbusitem->next;
|
modbusitem = modbusitem->next;
|
||||||
if (!modbusitem) modbusitem = items->child;
|
if (!modbusitem) modbusitem = items->child;
|
||||||
@@ -921,27 +945,23 @@ result = node.readHoldingRegisters(20-1, 4);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Item::checkModbus(int data)
|
int Item::checkModbus(int data) {
|
||||||
{
|
|
||||||
short mask = getArg(2);
|
short mask = getArg(2);
|
||||||
int d = data;
|
int d = data;
|
||||||
if (mask) d>>=8; d&=0xff;
|
if (mask) d >>= 8;
|
||||||
|
d &= 0xff;
|
||||||
d = map(d, 0, 0x3f, 0, 100);
|
d = map(d, 0, 0x3f, 0, 100);
|
||||||
int cmd = getCmd();
|
int cmd = getCmd();
|
||||||
//Serial.println(d);
|
//Serial.println(d);
|
||||||
if (getVal() != d || d && cmd == CMD_OFF || d && cmd == CMD_HALT) //volume changed or turned on manualy
|
if (getVal() != d || d && cmd == CMD_OFF || d && cmd == CMD_HALT) //volume changed or turned on manualy
|
||||||
{
|
{
|
||||||
if (d)
|
if (d) { // Actually turned on
|
||||||
|
|
||||||
{ // Actually turned on
|
|
||||||
if (cmd == CMD_OFF || cmd == CMD_HALT) SendCmd(CMD_ON); //update OH with ON if it was turned off before
|
if (cmd == CMD_OFF || cmd == CMD_HALT) SendCmd(CMD_ON); //update OH with ON if it was turned off before
|
||||||
SendCmd(0, 1, &d); //update OH with value
|
SendCmd(0, 1, &d); //update OH with value
|
||||||
setCmd(CMD_ON); //store command
|
setCmd(CMD_ON); //store command
|
||||||
setVal(d); //store value
|
setVal(d); //store value
|
||||||
}
|
} else {
|
||||||
else {
|
if (cmd != CMD_HALT && cmd != CMD_OFF) {
|
||||||
if (cmd!=CMD_HALT && cmd!=CMD_OFF)
|
|
||||||
{
|
|
||||||
setCmd(CMD_OFF); // store command (not value)
|
setCmd(CMD_OFF); // store command (not value)
|
||||||
SendCmd(CMD_OFF);// update OH
|
SendCmd(CMD_OFF);// update OH
|
||||||
}
|
}
|
||||||
@@ -949,10 +969,8 @@ int Item::checkModbus(int data)
|
|||||||
} //if data changed
|
} //if data changed
|
||||||
}
|
}
|
||||||
|
|
||||||
int Item::Pool()
|
int Item::Poll() {
|
||||||
{
|
switch (itemType) {
|
||||||
switch (itemType)
|
|
||||||
{
|
|
||||||
case CH_MODBUS:
|
case CH_MODBUS:
|
||||||
checkModbus();
|
checkModbus();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ class Item
|
|||||||
inline int On (){Ctrl(CMD_ON);};
|
inline int On (){Ctrl(CMD_ON);};
|
||||||
inline int Off(){Ctrl(CMD_OFF);};
|
inline int Off(){Ctrl(CMD_OFF);};
|
||||||
inline int Toggle(){Ctrl(CMD_TOGGLE);};
|
inline int Toggle(){Ctrl(CMD_TOGGLE);};
|
||||||
int Pool ();
|
int Poll();
|
||||||
int SendCmd(short cmd,short n=0, int * Par=NULL);
|
int SendCmd(short cmd,short n=0, int * Par=NULL);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -5,11 +5,16 @@
|
|||||||
#ifndef LIGHTHUB_MAIN_H
|
#ifndef LIGHTHUB_MAIN_H
|
||||||
#define LIGHTHUB_MAIN_H
|
#define LIGHTHUB_MAIN_H
|
||||||
|
|
||||||
|
#define TXEnablePin 13
|
||||||
|
|
||||||
#ifndef SERIAL_BAUD
|
#ifndef SERIAL_BAUD
|
||||||
#define SERIAL_BAUD 115200
|
#define SERIAL_BAUD 115200
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CUSTOM_FIRMWARE_MAC
|
||||||
|
#define FIRMWARE_MAC {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0}
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
#include "DallasTemperature.h"
|
#include "DallasTemperature.h"
|
||||||
|
|
||||||
@@ -25,14 +30,14 @@ void Changed (int i, DeviceAddress addr, int val);
|
|||||||
void modbusIdle(void);
|
void modbusIdle(void);
|
||||||
void _handleHelp(int arg_cnt, char **args);
|
void _handleHelp(int arg_cnt, char **args);
|
||||||
void _kill(int arg_cnt, char **args);
|
void _kill(int arg_cnt, char **args);
|
||||||
void parseConfig();
|
void applyConfig();
|
||||||
void _loadConfig (int arg_cnt, char **args);
|
void _loadConfig (int arg_cnt, char **args);
|
||||||
int loadConfig (int arg_cnt, char **args);
|
int loadConfigFromEEPROM(int arg_cnt, char **args);
|
||||||
void _mqttConfigReq (int arg_cnt, char **args);
|
void _mqttConfigRequest(int arg_cnt, char **args);
|
||||||
int mqttConfigReq (int arg_cnt, char **args);
|
int mqttConfigRequest(int arg_cnt, char **args);
|
||||||
int mqttConfigResp (char * as);
|
int mqttConfigResp (char * as);
|
||||||
void _saveConfig(int arg_cnt, char **args);
|
void _saveConfigToEEPROM(int arg_cnt, char **args);
|
||||||
void _setConfig(int arg_cnt, char **args);
|
void _setMacAddress(int arg_cnt, char **args);
|
||||||
void _getConfig(int arg_cnt, char **args);
|
void _getConfig(int arg_cnt, char **args);
|
||||||
void printBool (bool arg);
|
void printBool (bool arg);
|
||||||
void saveFlash(short n, char* str);
|
void saveFlash(short n, char* str);
|
||||||
|
|||||||
@@ -1,8 +1,17 @@
|
|||||||
// Configuration of drivers enabled
|
// Configuration of drivers enabled
|
||||||
|
#ifndef DMX_DISABLE
|
||||||
#define _dmxin
|
#define _dmxin
|
||||||
#define _dmxout
|
#define _dmxout
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OWIRE_DISABLE
|
||||||
#define _owire
|
#define _owire
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MODBUS_DISABLE
|
||||||
#define _modbus
|
#define _modbus
|
||||||
|
#endif
|
||||||
|
|
||||||
#define _artnet
|
#define _artnet
|
||||||
|
|
||||||
#if defined(ESP8266)
|
#if defined(ESP8266)
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ e-mail anklimov@gmail.com
|
|||||||
#include "owTerm.h"
|
#include "owTerm.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
OneWire *net = NULL;
|
OneWire *net = NULL;
|
||||||
@@ -39,8 +40,7 @@ unsigned long owTimer=0;
|
|||||||
|
|
||||||
owChangedType owChanged;
|
owChangedType owChanged;
|
||||||
|
|
||||||
int owUpdate()
|
int owUpdate() {
|
||||||
{
|
|
||||||
unsigned long finish = millis() + 5000;
|
unsigned long finish = millis() + 5000;
|
||||||
short sr;
|
short sr;
|
||||||
|
|
||||||
@@ -49,25 +49,32 @@ int owUpdate()
|
|||||||
if (net) net->reset_search();
|
if (net) net->reset_search();
|
||||||
for (short i = 0; i < t_count; i++) wstat[i] &= ~SW_FIND; //absent
|
for (short i = 0; i < t_count; i++) wstat[i] &= ~SW_FIND; //absent
|
||||||
|
|
||||||
while (net && net->wireSearch(term[t_count])>0 && (t_count<t_max) && finish > millis ())
|
while (net && net->wireSearch(term[t_count]) > 0 && (t_count < t_max) && finish > millis()) {
|
||||||
{ short ifind=-1;
|
short ifind = -1;
|
||||||
if (net->crc8(term[t_count], 7) == term[t_count][7])
|
if (net->crc8(term[t_count], 7) == term[t_count][7]) {
|
||||||
{
|
for (short i = 0; i < t_count; i++)
|
||||||
for (short i=0;i<t_count;i++) if (!memcmp(term[i],term[t_count],8)) {ifind=i;wstat[i]|=SW_FIND;
|
if (!memcmp(term[i], term[t_count], 8)) {
|
||||||
Serial.print(F(" Node:"));PrintBytes(term[t_count],8);Serial.println(F(" alive"));
|
ifind = i;
|
||||||
break;}; //alive
|
wstat[i] |= SW_FIND;
|
||||||
if (ifind<0 && sensors)
|
Serial.print(F(" Node:"));
|
||||||
{
|
PrintBytes(term[t_count], 8);
|
||||||
|
Serial.println(F(" alive"));
|
||||||
|
break;
|
||||||
|
}; //alive
|
||||||
|
if (ifind < 0 && sensors) {
|
||||||
wstat[t_count] = SW_FIND; //Newly detected
|
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.print(F("dev#"));
|
||||||
|
Serial.print(t_count);
|
||||||
|
Serial.print(F(" Addr:"));
|
||||||
|
PrintBytes(term[t_count], 8);
|
||||||
Serial.println();
|
Serial.println();
|
||||||
if (term[t_count][0]==0x28)
|
if (term[t_count][0] == 0x28) {
|
||||||
{
|
|
||||||
sensors->setResolution(term[t_count], TEMPERATURE_PRECISION);
|
sensors->setResolution(term[t_count], TEMPERATURE_PRECISION);
|
||||||
net->setStrongPullup();
|
net->setStrongPullup();
|
||||||
// sensors.requestTemperaturesByAddress(term[t_count]);
|
// sensors.requestTemperaturesByAddress(term[t_count]);
|
||||||
}
|
}
|
||||||
t_count++;}
|
t_count++;
|
||||||
|
}
|
||||||
}//if
|
}//if
|
||||||
} //while
|
} //while
|
||||||
|
|
||||||
@@ -99,11 +106,9 @@ term = new DeviceAddress[t_max];
|
|||||||
wstat = new uint16_t[t_max];
|
wstat = new uint16_t[t_max];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DS2482_100_I2C_TO_1W_BRIDGE
|
#ifdef DS2482_100_I2C_TO_1W_BRIDGE
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
if (net->checkPresence())
|
if (net->checkPresence()) {
|
||||||
{
|
|
||||||
Serial.println(F("DS2482-100 present"));
|
Serial.println(F("DS2482-100 present"));
|
||||||
net->deviceReset();
|
net->deviceReset();
|
||||||
#ifdef APU_OFF
|
#ifdef APU_OFF
|
||||||
@@ -136,11 +141,9 @@ wstat = new uint16_t [t_max];
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int sensors_loop(void)
|
int sensors_loop(void) {
|
||||||
{
|
|
||||||
if (!sensors) return -1;
|
if (!sensors) return -1;
|
||||||
if (si>=t_count)
|
if (si >= t_count) {
|
||||||
{
|
|
||||||
owUpdate(); //every check circle - scan for new devices
|
owUpdate(); //every check circle - scan for new devices
|
||||||
si = 0;
|
si = 0;
|
||||||
return 8000;
|
return 8000;
|
||||||
@@ -168,29 +171,27 @@ int sensors_loop(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void owLoop()
|
void owLoop() {
|
||||||
|
|
||||||
{
|
|
||||||
if (millis() >= owTimer) owTimer = millis() + sensors_loop();
|
if (millis() >= owTimer) owTimer = millis() + sensors_loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int owFind(DeviceAddress addr)
|
int owFind(DeviceAddress addr) {
|
||||||
{
|
|
||||||
for (short i = 0; i < t_count; i++) if (!memcmp(term[i], addr, 8)) return i;//find
|
for (short i = 0; i < t_count; i++) if (!memcmp(term[i], addr, 8)) return i;//find
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void owAdd (DeviceAddress addr)
|
void owAdd(DeviceAddress addr) {
|
||||||
{
|
|
||||||
wstat[t_count] = SW_FIND; //Newly detected
|
wstat[t_count] = SW_FIND; //Newly detected
|
||||||
memcpy(term[t_count], addr, 8);
|
memcpy(term[t_count], addr, 8);
|
||||||
//term[t_count]=addr;
|
//term[t_count]=addr;
|
||||||
|
|
||||||
Serial.print(F("dev#"));Serial.print(t_count);Serial.print(F(" Addr:"));PrintBytes(term[t_count],8);
|
Serial.print(F("dev#"));
|
||||||
|
Serial.print(t_count);
|
||||||
|
Serial.print(F(" Addr:"));
|
||||||
|
PrintBytes(term[t_count], 8);
|
||||||
Serial.println();
|
Serial.println();
|
||||||
if (term[t_count][0]==0x28)
|
if (term[t_count][0] == 0x28) {
|
||||||
{
|
|
||||||
sensors->setResolution(term[t_count], TEMPERATURE_PRECISION);
|
sensors->setResolution(term[t_count], TEMPERATURE_PRECISION);
|
||||||
net->setStrongPullup();
|
net->setStrongPullup();
|
||||||
// sensors.requestTemperaturesByAddress(term[t_count]);
|
// sensors.requestTemperaturesByAddress(term[t_count]);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ e-mail anklimov@gmail.com
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#if defined(__SAM3X8E__)
|
#if defined(__SAM3X8E__)
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -51,8 +52,8 @@ void SetBytes(uint8_t* addr, uint8_t count, char * out) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
byte HEX2DEC(char i)
|
byte HEX2DEC(char i) {
|
||||||
{ byte v;
|
byte v;
|
||||||
if ('a' <= i && i <= 'f') { v = i - 97 + 10; }
|
if ('a' <= i && i <= 'f') { v = i - 97 + 10; }
|
||||||
else if ('A' <= i && i <= 'F') { v = i - 65 + 10; }
|
else if ('A' <= i && i <= 'F') { v = i - 65 + 10; }
|
||||||
else if ('0' <= i && i <= '9') { v = i - 48; }
|
else if ('0' <= i && i <= '9') { v = i - 48; }
|
||||||
@@ -68,8 +69,7 @@ void SetAddr(char * out, uint8_t* addr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int getInt(char ** chan)
|
int getInt(char **chan) {
|
||||||
{
|
|
||||||
int ch = atoi(*chan);
|
int ch = atoi(*chan);
|
||||||
*chan = strchr(*chan, ',');
|
*chan = strchr(*chan, ',');
|
||||||
|
|
||||||
@@ -98,8 +98,7 @@ unsigned long freeRam ()
|
|||||||
extern char _end;
|
extern char _end;
|
||||||
extern "C" char *sbrk(int i);
|
extern "C" char *sbrk(int i);
|
||||||
|
|
||||||
unsigned long freeRam()
|
unsigned long freeRam() {
|
||||||
{
|
|
||||||
char *ramstart = (char *) 0x20070000;
|
char *ramstart = (char *) 0x20070000;
|
||||||
char *ramend = (char *) 0x20088000;
|
char *ramend = (char *) 0x20088000;
|
||||||
char *heapend = sbrk(0);
|
char *heapend = sbrk(0);
|
||||||
@@ -108,4 +107,16 @@ unsigned long freeRam()
|
|||||||
|
|
||||||
return stack_ptr - heapend + mi.fordblks;
|
return stack_ptr - heapend + mi.fordblks;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void parseBytes(const char *str, char separator, byte *bytes, int maxBytes, int base) {
|
||||||
|
for (int i = 0; i < maxBytes; i++) {
|
||||||
|
bytes[i] = strtoul(str, NULL, base); // Convert byte
|
||||||
|
str = strchr(str, separator); // Find next separator
|
||||||
|
if (str == NULL || *str == '\0') {
|
||||||
|
break; // No more separators, exit
|
||||||
|
}
|
||||||
|
str++; // Point to next character after separator
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,3 +25,4 @@ void SetAddr(char * out, uint8_t* addr);
|
|||||||
uint8_t HEX2DEC(char i);
|
uint8_t HEX2DEC(char i);
|
||||||
int getInt(char ** chan);
|
int getInt(char ** chan);
|
||||||
unsigned long freeRam ();
|
unsigned long freeRam ();
|
||||||
|
void parseBytes(const char* str, char separator, byte* bytes, int maxBytes, int base);
|
||||||
@@ -12,6 +12,7 @@ src_dir = lighthub
|
|||||||
env_default =
|
env_default =
|
||||||
; megaatmega2560
|
; megaatmega2560
|
||||||
due
|
due
|
||||||
|
; esp8266
|
||||||
|
|
||||||
[env:due]
|
[env:due]
|
||||||
platform = atmelsam
|
platform = atmelsam
|
||||||
@@ -101,7 +102,7 @@ lib_deps =
|
|||||||
https://github.com/anklimov/Artnet.git
|
https://github.com/anklimov/Artnet.git
|
||||||
FastLED
|
FastLED
|
||||||
|
|
||||||
[env:espressif8266]
|
[env:esp8266]
|
||||||
platform = espressif8266
|
platform = espressif8266
|
||||||
framework = arduino
|
framework = arduino
|
||||||
board = nodemcuv2
|
board = nodemcuv2
|
||||||
|
|||||||
Reference in New Issue
Block a user