diff --git a/code/espurna/button.ino b/code/espurna/button.ino index dcef559da6..124f6bbc4f 100644 --- a/code/espurna/button.ino +++ b/code/espurna/button.ino @@ -18,7 +18,7 @@ Copyright (C) 2016-2019 by Xose Pérez typedef struct { DebounceEvent * button; unsigned long actions; - unsigned int relayID; + unsigned char relayID; } button_t; std::vector _buttons; @@ -42,7 +42,8 @@ bool _buttonWebSocketOnReceive(const char * key, JsonVariant& value) { #endif -int buttonFromRelay(unsigned int relayID) { +int buttonFromRelay(unsigned char relayID) { + if (relayID == RELAY_NONE) return -1; for (unsigned int i=0; i < _buttons.size(); i++) { if (_buttons[i].relayID == relayID) return i; } @@ -66,17 +67,6 @@ unsigned char buttonAction(unsigned char id, unsigned char event) { return BUTTON_MODE_NONE; } -unsigned long buttonStore(unsigned long pressed, unsigned long click, unsigned long dblclick, unsigned long lngclick, unsigned long lnglngclick, unsigned long tripleclick) { - unsigned int value; - value = pressed; - value += click << 4; - value += dblclick << 8; - value += lngclick << 12; - value += lnglngclick << 16; - value += tripleclick << 20; - return value; -} - uint8_t mapEvent(uint8_t event, uint8_t count, uint16_t length) { if (event == EVENT_PRESSED) return BUTTON_EVENT_PRESSED; if (event == EVENT_CHANGED) return BUTTON_EVENT_CLICK; @@ -106,20 +96,20 @@ void buttonEvent(unsigned int id, unsigned char event) { #endif if (BUTTON_MODE_TOGGLE == action) { - if (_buttons[id].relayID > 0) { - relayToggle(_buttons[id].relayID - 1); + if (_buttons[id].relayID != RELAY_NONE) { + relayToggle(_buttons[id].relayID); } } if (BUTTON_MODE_ON == action) { - if (_buttons[id].relayID > 0) { - relayStatus(_buttons[id].relayID - 1, true); + if (_buttons[id].relayID != RELAY_NONE) { + relayStatus(_buttons[id].relayID, true); } } if (BUTTON_MODE_OFF == action) { - if (_buttons[id].relayID > 0) { - relayStatus(_buttons[id].relayID - 1, false); + if (_buttons[id].relayID != RELAY_NONE) { + relayStatus(_buttons[id].relayID, false); } } @@ -162,95 +152,6 @@ void buttonEvent(unsigned int id, unsigned char event) { } -void buttonSetup() { - - #if defined(ITEAD_SONOFF_DUAL) - - unsigned int actions = buttonStore(BUTTON_MODE_NONE, BUTTON_MODE_TOGGLE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE); - _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, 1}); - _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, 2}); - _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, BUTTON3_RELAY}); - - #elif defined(FOXEL_LIGHTFOX_DUAL) - - unsigned int actions = buttonStore(BUTTON_MODE_NONE, BUTTON_MODE_TOGGLE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE); - unsigned int btn1Relay = getSetting("btnRelay", 0, BUTTON1_RELAY - 1).toInt() + 1; - _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, btn1Relay}); - unsigned int btn2Relay = getSetting("btnRelay", 1, BUTTON2_RELAY - 1).toInt() + 1; - _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, btn2Relay}); - unsigned int btn3Relay = getSetting("btnRelay", 2, BUTTON3_RELAY - 1).toInt() + 1; - _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, btn3Relay}); - unsigned int btn4Relay = getSetting("btnRelay", 3, BUTTON4_RELAY - 1).toInt() + 1; - _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, btn4Relay}); - - #else - - unsigned long btnDelay = getSetting("btnDelay", BUTTON_DBLCLICK_DELAY).toInt(); - UNUSED(btnDelay); - - #if BUTTON1_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON1_PRESS, BUTTON1_CLICK, BUTTON1_DBLCLICK, BUTTON1_LNGCLICK, BUTTON1_LNGLNGCLICK, BUTTON1_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON1_PIN, BUTTON1_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON1_RELAY}); - } - #endif - #if BUTTON2_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON2_PRESS, BUTTON2_CLICK, BUTTON2_DBLCLICK, BUTTON2_LNGCLICK, BUTTON2_LNGLNGCLICK, BUTTON2_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON2_PIN, BUTTON2_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON2_RELAY}); - } - #endif - #if BUTTON3_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON3_PRESS, BUTTON3_CLICK, BUTTON3_DBLCLICK, BUTTON3_LNGCLICK, BUTTON3_LNGLNGCLICK, BUTTON3_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON3_PIN, BUTTON3_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON3_RELAY}); - } - #endif - #if BUTTON4_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON4_PRESS, BUTTON4_CLICK, BUTTON4_DBLCLICK, BUTTON4_LNGCLICK, BUTTON4_LNGLNGCLICK, BUTTON4_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON4_PIN, BUTTON4_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON4_RELAY}); - } - #endif - #if BUTTON5_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON5_PRESS, BUTTON5_CLICK, BUTTON5_DBLCLICK, BUTTON5_LNGCLICK, BUTTON5_LNGLNGCLICK, BUTTON5_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON5_PIN, BUTTON5_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON5_RELAY}); - } - #endif - #if BUTTON6_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON6_PRESS, BUTTON6_CLICK, BUTTON6_DBLCLICK, BUTTON6_LNGCLICK, BUTTON6_LNGLNGCLICK, BUTTON6_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON6_PIN, BUTTON6_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON6_RELAY}); - } - #endif - #if BUTTON7_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON7_PRESS, BUTTON7_CLICK, BUTTON7_DBLCLICK, BUTTON7_LNGCLICK, BUTTON7_LNGLNGCLICK, BUTTON7_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON7_PIN, BUTTON7_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON7_RELAY}); - } - #endif - #if BUTTON8_PIN != GPIO_NONE - { - unsigned int actions = buttonStore(BUTTON8_PRESS, BUTTON8_CLICK, BUTTON8_DBLCLICK, BUTTON8_LNGCLICK, BUTTON8_LNGLNGCLICK, BUTTON8_TRIPLECLICK); - _buttons.push_back({new DebounceEvent(BUTTON8_PIN, BUTTON8_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON8_RELAY}); - } - #endif - - #endif - - DEBUG_MSG_P(PSTR("[BUTTON] Number of buttons: %u\n"), _buttons.size()); - - // Websocket Callbacks - #if WEB_SUPPORT - wsOnReceiveRegister(_buttonWebSocketOnReceive); - #endif - - // Register loop - espurnaRegisterLoop(buttonLoop); - -} - void buttonLoop() { #if defined(ITEAD_SONOFF_DUAL) @@ -331,4 +232,49 @@ void buttonLoop() { } +// ----------------------------------------------------------------------------- + +void buttonSetup() { + + // TODO v2: maybe this setting should be changed, btnDelay => btnClickDelay? + unsigned long btnDelay = getSetting("btnDelay", BUTTON_DBLCLICK_DELAY).toInt(); + UNUSED(btnDelay); + + unsigned long btnDefaultActions = buttonStore( + BUTTON_MODE_NONE, BUTTON_MODE_TOGGLE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE); + UNUSED(btnDefaultActions); + + // TODO: max buttons / max_components from v2 ? + unsigned char index = 0; + while (index < 8) { + + unsigned char pin = getSetting("btnGPIO", index, GPIO_NONE).toInt(); + if (GPIO_NONE == pin) break; + unsigned char relayId = getSetting("btnRelay", index, RELAY_NONE).toInt(); + unsigned char mode = getSetting("btnMode", index, BUTTON_PUSHBUTTON | BUTTON_DEFAULT_HIGH).toInt(); + + unsigned long actions = getSetting("btnActions", index, btnDefaultActions).toInt(); + + // DebounceEvent takes 4 parameters + // * GPIO + // * Button mode + // * Debounce delay + // * Wait delay for more clicks + _buttons.push_back({new DebounceEvent(pin, mode, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, relayId}); + ++index; + + } + + DEBUG_MSG_P(PSTR("[BUTTON] Number of buttons: %u\n"), _buttons.size()); + + // Websocket Callbacks + #if WEB_SUPPORT + wsOnReceiveRegister(_buttonWebSocketOnReceive); + #endif + + // Register loop + espurnaRegisterLoop(buttonLoop); + +} + #endif // BUTTON_SUPPORT diff --git a/code/espurna/config/defaults.h b/code/espurna/config/defaults.h index ec06f9406c..68e0ec600b 100644 --- a/code/espurna/config/defaults.h +++ b/code/espurna/config/defaults.h @@ -574,3 +574,43 @@ #ifndef LIGHT_PROVIDER #define LIGHT_PROVIDER LIGHT_PROVIDER_NONE #endif + +#ifndef LIGHT_CHANNELS +#define LIGHT_CHANNELS 0 +#endif + +#ifndef LIGHT_ENABLE_PIN +#define LIGHT_ENABLE_PIN GPIO_NONE +#endif + +#ifndef LIGHT_CH1_PIN +#define LIGHT_CH1_PIN GPIO_NONE +#endif +#ifndef LIGHT_CH2_PIN +#define LIGHT_CH2_PIN GPIO_NONE +#endif +#ifndef LIGHT_CH3_PIN +#define LIGHT_CH3_PIN GPIO_NONE +#endif +#ifndef LIGHT_CH4_PIN +#define LIGHT_CH4_PIN GPIO_NONE +#endif +#ifndef LIGHT_CH5_PIN +#define LIGHT_CH5_PIN GPIO_NONE +#endif + +#ifndef LIGHT_CH1_INVERSE +#define LIGHT_CH1_INVERSE 0 +#endif +#ifndef LIGHT_CH2_INVERSE +#define LIGHT_CH2_INVERSE 0 +#endif +#ifndef LIGHT_CH3_INVERSE +#define LIGHT_CH3_INVERSE 0 +#endif +#ifndef LIGHT_CH4_INVERSE +#define LIGHT_CH4_INVERSE 0 +#endif +#ifndef LIGHT_CH5_INVERSE +#define LIGHT_CH5_INVERSE 0 +#endif diff --git a/code/espurna/config/hardware.h b/code/espurna/config/hardware.h index 557f472c69..b89082e57c 100644 --- a/code/espurna/config/hardware.h +++ b/code/espurna/config/hardware.h @@ -477,8 +477,19 @@ #define DUMMY_RELAY_COUNT 2 #define DEBUG_SERIAL_SUPPORT 0 - // Buttons + // These are purely virtual, only to set up CLICK event + #define BUTTON1_GPIO 0 + #define BUTTON1_RELAY 1 + #define BUTTON1_MODE BUTTON_PUSHBUTTON + #define BUTTON1_CLICK BUTTON_MODE_TOGGLE + #define BUTTON2_GPIO 0 + #define BUTTON2_RELAY 2 + #define BUTTON2_MODE BUTTON_PUSHBUTTON + #define BUTTON2_CLICK BUTTON_MODE_TOGGLE + #define BUTTON3_GPIO 0 #define BUTTON3_RELAY 1 + #define BUTTON3_MODE BUTTON_PUSHBUTTON + #define BUTTON3_CLICK BUTTON_MODE_TOGGLE // LEDs #define LED1_PIN 13 @@ -732,7 +743,7 @@ #define MY92XX_DI_PIN 12 #define MY92XX_DCKI_PIN 14 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT - #define MY92XX_MAPPING 4, 3, 5, 0, 1 + #define MY92XX_MAPPING "43501" #define LIGHT_WHITE_FACTOR (0.1) // White LEDs are way more bright in the B1 #elif defined(ITEAD_SONOFF_LED) @@ -1141,7 +1152,7 @@ #define MY92XX_DI_PIN 13 #define MY92XX_DCKI_PIN 15 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT - #define MY92XX_MAPPING 0, 1, 2, 3 + #define MY92XX_MAPPING "0123" // ----------------------------------------------------------------------------- // Lyasi LED @@ -1163,7 +1174,7 @@ #define MY92XX_DI_PIN 4 #define MY92XX_DCKI_PIN 5 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT - #define MY92XX_MAPPING 0, 1, 2, 3 + #define MY92XX_MAPPING "0123" // ----------------------------------------------------------------------------- // LED Controller @@ -1732,7 +1743,7 @@ #define MY92XX_DI_PIN 13 #define MY92XX_DCKI_PIN 15 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT - #define MY92XX_MAPPING 0, 1, 2, 3 + #define MY92XX_MAPPING "0123" // ----------------------------------------------------------------------------- // XENON SM-PW701U @@ -2071,6 +2082,9 @@ #define HLW8012_CURRENT_R 0.002 // Current resistor #define HLW8012_VOLTAGE_R_UP ( 2 * 1000000 ) // Upstream voltage resistor + // LED1 on RX pin + #define DEBUG_SERIAL_SUPPORT 0 + // ----------------------------------------------------------------------------- // Maxcio W-DE004 // ----------------------------------------------------------------------------- @@ -2799,6 +2813,9 @@ #define HLW8012_POWER_RATIO 3414290 #define HLW8012_INTERRUPT_ON FALLING + // BUTTON1 and LED1 are using Serial pins + #define DEBUG_SERIAL_SUPPORT 0 + // ----------------------------------------------------------------------------- // Teckin SP22 v1.4 - v1.6 // ----------------------------------------------------------------------------- @@ -2840,6 +2857,9 @@ #define HLW8012_POWER_RATIO 2533110 #define HLW8012_INTERRUPT_ON FALLING + // BUTTON1 and LED1 are using Serial pins + #define DEBUG_SERIAL_SUPPORt 0 + // ----------------------------------------------------------------------------- // Several boards under different names uing a power chip labelled BL0937 or HJL-01 // Also model number KS-602S @@ -3065,7 +3085,7 @@ #define MY92XX_DI_PIN 13 #define MY92XX_DCKI_PIN 15 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT - #define MY92XX_MAPPING 0, 1, 2, 3, 4 + #define MY92XX_MAPPING "01234" #define LIGHT_WHITE_FACTOR (0.1) // White LEDs are way more bright in the B1 // ----------------------------------------------------------------------------- @@ -3203,14 +3223,14 @@ #define DUMMY_RELAY_COUNT 1 // Light - #define LIGHT_CHANNELS 5 + #define LIGHT_CHANNELS 2 #define MY92XX_MODEL MY92XX_MODEL_MY9291 #define MY92XX_CHIPS 1 #define MY92XX_DI_PIN 4 #define MY92XX_DCKI_PIN 5 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT // No RGB on this bulb. Warm white on channel 0, cool white on channel 3 - #define MY92XX_MAPPING 255, 255, 255, 3, 0 + #define MY92XX_MAPPING "30" // ----------------------------------------------------------------------------- // Lombex Lux Nova 2 White and Color @@ -3234,7 +3254,7 @@ #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT // RGB on channels 0/1/2, either cool or warm white on channel 3 // The bulb *should* have cool leds, but could also have warm leds as a common defect - #define MY92XX_MAPPING 0, 1, 2, 3 + #define MY92XX_MAPPING "0123" // ----------------------------------------------------------------------------- // Bestek Smart Plug with 2 USB ports @@ -3431,11 +3451,23 @@ #define DUMMY_RELAY_COUNT 2 #define DEBUG_SERIAL_SUPPORT 0 - // Buttons - #define BUTTON1_RELAY 1 - #define BUTTON2_RELAY 2 - #define BUTTON3_RELAY 2 - #define BUTTON4_RELAY 1 + // Like SONOFF_DUAL, these are only for CLICK event definition + #define BUTTON1_GPIO 0 + #define BUTTON1_RELAY 1 + #define BUTTON1_MODE BUTTON_PUSHBUTTON + #define BUTTON1_CLICK BUTTON_MODE_TOGGLE + #define BUTTON2_GPIO 0 + #define BUTTON2_RELAY 2 + #define BUTTON2_MODE BUTTON_PUSHBUTTON + #define BUTTON2_CLICK BUTTON_MODE_TOGGLE + #define BUTTON3_GPIO 0 + #define BUTTON3_RELAY 2 + #define BUTTON3_MODE BUTTON_PUSHBUTTON + #define BUTTON3_CLICK BUTTON_MODE_TOGGLE + #define BUTTON4_GPIO 0 + #define BUTTON4_RELAY 1 + #define BUTTON4_MODE BUTTON_PUSHBUTTON + #define BUTTON4_CLICK BUTTON_MODE_TOGGLE // ----------------------------------------------------------------------------- // Teckin SP20 @@ -3693,7 +3725,7 @@ #define MY92XX_DI_PIN 1 #define MY92XX_DCKI_PIN 2 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT - #define MY92XX_MAPPING 4, 3, 5, 0, 1 + #define MY92XX_MAPPING "43501" // A bit of Analog EMON (analog) #ifndef EMON_ANALOG_SUPPORT diff --git a/code/espurna/config/prototypes.h b/code/espurna/config/prototypes.h index 74bfcc8b92..cff5f0e6e5 100644 --- a/code/espurna/config/prototypes.h +++ b/code/espurna/config/prototypes.h @@ -38,6 +38,18 @@ void systemStabilityCounter(uint8_t); void brokerRegister(void (*)(const unsigned char, const char *, unsigned char, const char *)); #endif +// ----------------------------------------------------------------------------- +// Buttons +// ----------------------------------------------------------------------------- + +#define buttonStore(pressed, click, dblclick, lngclick, lnglngclick, tripleclick) \ + ((tripleclick << 20) | \ + (lnglngclick << 16) | \ + (lngclick << 12) | \ + (dblclick << 8) | \ + (click << 4) | \ + (pressed)) + // ----------------------------------------------------------------------------- // Debug // ----------------------------------------------------------------------------- @@ -158,6 +170,12 @@ template String getSetting(const String& key, T defaultValue); template String getSetting(const String& key, unsigned int index, T defaultValue); void settingsGetJson(JsonObject& data); bool settingsRestoreJson(JsonObject& data); +bool hasSetting(const String&); +bool hasSetting(const String&, unsigned int); +bool delSetting(const String&); +bool delSetting(const String&, unsigned int); +void saveSettings(); +void migrate(); // ----------------------------------------------------------------------------- // Terminal diff --git a/code/espurna/config/types.h b/code/espurna/config/types.h index 8e89277b2f..13a8e4bccd 100644 --- a/code/espurna/config/types.h +++ b/code/espurna/config/types.h @@ -101,6 +101,8 @@ #define RELAY_GROUP_SYNC_INVERSE 1 #define RELAY_GROUP_SYNC_RECEIVEONLY 2 +#define RELAY_NONE 0xFF + //------------------------------------------------------------------------------ // UDP SYSLOG //------------------------------------------------------------------------------ @@ -342,3 +344,10 @@ #define MAGNITUDE_PH 31 #define MAGNITUDE_MAX 32 + +//-------------------------------------------------------------------------------- +// GPIO +//-------------------------------------------------------------------------------- + +#define GPIO_LOGIC_DIRECT 0 +#define GPIO_LOGIC_INVERSE 1 diff --git a/code/espurna/config/version.h b/code/espurna/config/version.h index db371bc4de..f7d3cac82e 100644 --- a/code/espurna/config/version.h +++ b/code/espurna/config/version.h @@ -2,4 +2,4 @@ #define APP_VERSION "1.13.6-dev" #define APP_AUTHOR "xose.perez@gmail.com" #define APP_WEBSITE "http://tinkerman.cat" -#define CFG_VERSION 3 +#define CFG_VERSION 4 diff --git a/code/espurna/encoder.ino b/code/espurna/encoder.ino index 1836e91cde..a89a004d17 100644 --- a/code/espurna/encoder.ino +++ b/code/espurna/encoder.ino @@ -25,65 +25,6 @@ std::vector _encoders; void _encoderConfigure() { - // Clean previous encoders - for (unsigned char i=0; i<_encoders.size(); i++) { - free(_encoders[i].encoder); - } - _encoders.clear(); - - // Load encoders - #if (ENCODER1_PIN1 != GPIO_NONE) && (ENCODER1_PIN2 != GPIO_NONE) - { - _encoders.push_back({ - new Encoder(ENCODER1_PIN1, ENCODER1_PIN2), - ENCODER1_BUTTON_PIN, ENCODER1_BUTTON_LOGIC, ENCODER1_BUTTON_MODE, ENCODER1_MODE, - ENCODER1_CHANNEL1, ENCODER1_CHANNEL2 - }); - } - #endif - #if (ENCODER2_PIN1 != GPIO_NONE) && (ENCODER2_PIN2 != GPIO_NONE) - { - _encoders.push_back({ - new Encoder(ENCODER2_PIN1, ENCODER2_PIN2), - ENCODER2_BUTTON_PIN, ENCODER2_BUTTON_LOGIC, ENCODER2_BUTTON_MODE, ENCODER2_MODE, - ENCODER2_CHANNEL1, ENCODER2_CHANNEL2 - }); - } - #endif - #if (ENCODER3_PIN1 != GPIO_NONE) && (ENCODER3_PIN2 != GPIO_NONE) - { - _encoders.push_back({ - new Encoder(ENCODER3_PIN1, ENCODER3_PIN2), - ENCODER3_BUTTON_PIN, ENCODER3_BUTTON_LOGIC, ENCODER3_BUTTON_MODE, ENCODER3_MODE, - ENCODER3_CHANNEL1, ENCODER3_CHANNEL2 - }); - } - #endif - #if (ENCODER4_PIN1 != GPIO_NONE) && (ENCODER4_PIN2 != GPIO_NONE) - { - _encoders.push_back({ - new Encoder(ENCODER4_PIN1, ENCODER4_PIN2), - ENCODER4_BUTTON_PIN, ENCODER4_BUTTON_LOGIC, ENCODER4_BUTTON_MODE, ENCODER4_MODE, - ENCODER4_CHANNEL1, ENCODER4_CHANNEL2 - }); - } - #endif - #if (ENCODER5_PIN1 != GPIO_NONE) && (ENCODER5_PIN2 != GPIO_NONE) - { - _encoders.push_back({ - new Encoder(ENCODER5_PIN1, ENCODER5_PIN2), - ENCODER5_BUTTON_PIN, ENCODER5_BUTTON_LOGIC, ENCODER5_BUTTON_MODE, ENCODER5_MODE, - ENCODER5_CHANNEL1, ENCODER5_CHANNEL2 - }); - } - #endif - - // Setup encoders - for (unsigned char i=0; i<_encoders.size(); i++) { - if (GPIO_NONE != _encoders[i].button_pin) { - pinMode(_encoders[i].button_pin, _encoders[i].button_mode); - } - } } @@ -138,19 +79,64 @@ void _encoderLoop() { } +void _encoderConfigure() { + + for (unsigned char index=0; _encoders.size(); ++id) { + _encoders[index].mode = getSetting("encMode", index, ENCODER_MODE_RATIO).toInt(); + _encoders[index].channel1 = getSetting("encCh", index, 0).toInt(); + _encoders[index].channel2 = getSetting("encBtnCh", index, 1).toInt(); + } + +} + +void _encoderSetup() { + + // TODO: separate encoder max / max_components from v2? + + unsigned char index = 0; + while (index < 8) { + + unsigned char pin1 = getSetting("encA", index, GPIO_NONE).toInt(); + unsigned char pin2 = getSetting("encB", index, GPIO_NONE).toInt(); + if ((GPIO_NONE == pin1) || (GPIO_NONE == pin2)) break; + + unsigned char button_pin = getSetting("encBtn", index, GPIO_NONE).toInt(); + unsigned char button_logic = getSetting("encBtnLogic", index, GPIO_LOGIC_INVERSE).toInt(); + unsigned char button_mode = getSetting("encBtnMode", index, INPUT_PULLUP).toInt(); + unsigned char mode = getSetting("encMode", index, ENCODER_MODE_RATIO).toInt(); + unsigned char channel1 = getSetting("encCh", index, 0).toInt(); + unsigned char channel2 = getSetting("encBtnCh", index, 1).toInt(); + + _encoders.push_back({ + new Encoder(pin1, pin2), + button_pin, button_logic, button_mode, + mode, + channel1, channel2 + }); + + if (GPIO_NONE != button_pin) { + pinMode(button_pin, button_mode); + } + + ++index; + + } + + DEBUG_MSG_P(PSTR("[ENCODER] Number of encoders: %u\n"), _encoders.size()); +} + // ----------------------------------------------------------------------------- void encoderSetup() { // Configure encoders + _encoderSetup(); _encoderConfigure(); // Main callbacks espurnaRegisterLoop(_encoderLoop); espurnaRegisterReload(_encoderConfigure); - DEBUG_MSG_P(PSTR("[ENCODER] Number of encoders: %u\n"), _encoders.size()); - } #endif // ENCODER_SUPPORT && (LIGHT_PROVIDER != LIGHT_PROVIDER_NONE) diff --git a/code/espurna/espurna.ino b/code/espurna/espurna.ino index 7f368110c0..45e696c72a 100644 --- a/code/espurna/espurna.ino +++ b/code/espurna/espurna.ino @@ -76,6 +76,15 @@ void setup() { // Init persistance settingsSetup(); + // Hostname & board name initialization + if (getSetting("hostname").length() == 0) { + setDefaultHostname(); + } + setBoardName(); + + // Prepare configuration for version 2.0 + migrateSetup(); + // Init Serial, SPIFFS and system check systemSetup(); @@ -84,12 +93,6 @@ void setup() { terminalSetup(); #endif - // Hostname & board name initialization - if (getSetting("hostname").length() == 0) { - setDefaultHostname(); - } - setBoardName(); - // Show welcome message and system configuration info(); @@ -214,9 +217,6 @@ void setup() { extraSetup(); #endif - // Prepare configuration for version 2.0 - migrate(); - // Set up delay() after loop callbacks are finished // Note: should be after settingsSetup() _loop_delay = atol(getSetting("loopDelay", LOOP_DELAY_TIME).c_str()); diff --git a/code/espurna/hardware/.generated b/code/espurna/hardware/.generated new file mode 100644 index 0000000000..e69de29bb2 diff --git a/code/espurna/hardware/BLITZWOLF_BWSHPX_V23.h b/code/espurna/hardware/BLITZWOLF_BWSHPX_V23.h new file mode 100644 index 0000000000..b4c49b38c9 --- /dev/null +++ b/code/espurna/hardware/BLITZWOLF_BWSHPX_V23.h @@ -0,0 +1,18 @@ +setSetting("btnGPIO", 0, 3); +setSetting("btnMode", 0, 0 | 2); +setSetting("btnRelay", 0, 1 - 1); +setSetting("btnActions", 0, buttonStore( +0, 1, 4, +5, 7, 9)); +setSetting("ledGPIO", 0, 1); +setSetting("ledLogic", 0, 1); +setSetting("ledMode", 0, 1); +setSetting("ledRelay", 0, 1 - 1); +setSetting("ledGPIO", 1, 13); +setSetting("ledLogic", 1, 1); +setSetting("ledMode", 1, 4); +setSetting("ledRelay", 1, 1 - 1); +setSetting("relayProvider", 0); +setSetting("relayDummy", 0); +setSetting("relayGPIO", 0, 14); +setSetting("relayType", 0, 0); diff --git a/code/espurna/hardware/ITEAD_SONOFF_BASIC.h b/code/espurna/hardware/ITEAD_SONOFF_BASIC.h new file mode 100644 index 0000000000..b8143731cb --- /dev/null +++ b/code/espurna/hardware/ITEAD_SONOFF_BASIC.h @@ -0,0 +1,13 @@ +setSetting("btnGPIO", 0, 0); +setSetting("btnMode", 0, 0 | 2); +setSetting("btnRelay", 0, 1 - 1); +setSetting("btnActions", 0, ((9 << 20) | (7 << 16) | (5 << 12) | (4 << 8) | (1 << 4) | (0)) +); +setSetting("ledGPIO", 0, 2); +setSetting("ledLogic", 0, 1); +setSetting("ledMode", 0, 1); +setSetting("ledRelay", 0, 1 - 1); +setSetting("relayProvider", 0); +setSetting("relayDummy", 0); +setSetting("relayGPIO", 0, 12); +setSetting("relayType", 0, 0); diff --git a/code/espurna/hardware/ITEAD_SONOFF_POW.h b/code/espurna/hardware/ITEAD_SONOFF_POW.h new file mode 100644 index 0000000000..b8143731cb --- /dev/null +++ b/code/espurna/hardware/ITEAD_SONOFF_POW.h @@ -0,0 +1,13 @@ +setSetting("btnGPIO", 0, 0); +setSetting("btnMode", 0, 0 | 2); +setSetting("btnRelay", 0, 1 - 1); +setSetting("btnActions", 0, ((9 << 20) | (7 << 16) | (5 << 12) | (4 << 8) | (1 << 4) | (0)) +); +setSetting("ledGPIO", 0, 2); +setSetting("ledLogic", 0, 1); +setSetting("ledMode", 0, 1); +setSetting("ledRelay", 0, 1 - 1); +setSetting("relayProvider", 0); +setSetting("relayDummy", 0); +setSetting("relayGPIO", 0, 12); +setSetting("relayType", 0, 0); diff --git a/code/espurna/led.ino b/code/espurna/led.ino index 4b5bc32cc7..d5f4e19c6c 100644 --- a/code/espurna/led.ino +++ b/code/espurna/led.ino @@ -14,7 +14,7 @@ Copyright (C) 2016-2019 by Xose Pérez typedef struct { unsigned char pin; - bool reverse; + bool inverse; unsigned char mode; unsigned char relay; } led_t; @@ -27,12 +27,12 @@ bool _led_update = false; // For relay-based modes bool _ledStatus(unsigned char id) { if (id >= _ledCount()) return false; bool status = digitalRead(_leds[id].pin); - return _leds[id].reverse ? !status : status; + return _leds[id].inverse ? !status : status; } bool _ledStatus(unsigned char id, bool status) { if (id >=_ledCount()) return false; - digitalWrite(_leds[id].pin, _leds[id].reverse ? !status : status); + digitalWrite(_leds[id].pin, _leds[id].inverse ? !status : status); return status; } @@ -42,7 +42,7 @@ bool _ledToggle(unsigned char id) { } unsigned char _ledMode(unsigned char id) { - if (id >= _ledCount()) return false; + if (id >= _ledCount()) return 0; return _leds[id].mode; } @@ -52,7 +52,7 @@ void _ledMode(unsigned char id, unsigned char mode) { } unsigned char _ledRelay(unsigned char id) { - if (id >= _ledCount()) return false; + if (id >= _ledCount()) return 0; return _leds[id].relay; } @@ -146,11 +146,20 @@ unsigned char _ledCount() { } void _ledConfigure() { - for (unsigned int i=0; i < _leds.size(); i++) { - _ledMode(i, getSetting("ledMode", i, _ledMode(i)).toInt()); - _ledRelay(i, getSetting("ledRelay", i, _ledRelay(i)).toInt()); + + for (unsigned int index=0; index < _leds.size(); ++index) { + _leds[index].mode = getSetting("ledMode", index, index==0 ? LED_MODE_WIFI : LED_MODE_MQTT).toInt(); + _leds[index].relay = getSetting("ledRelay", index, RELAY_NONE).toInt(); + _leds[index].inverse = (getSetting("ledLogic", index, GPIO_LOGIC_DIRECT).toInt() == GPIO_LOGIC_INVERSE); + + if (_leds[index].pin != GPIO_NONE) { + pinMode(_leds[index].pin, OUTPUT); + _ledStatus(index, false); + } } + _led_update = true; + } // ----------------------------------------------------------------------------- @@ -161,36 +170,17 @@ void ledUpdate(bool value) { void ledSetup() { - #if LED1_PIN != GPIO_NONE - _leds.push_back((led_t) { LED1_PIN, LED1_PIN_INVERSE, LED1_MODE, LED1_RELAY - 1 }); - #endif - #if LED2_PIN != GPIO_NONE - _leds.push_back((led_t) { LED2_PIN, LED2_PIN_INVERSE, LED2_MODE, LED2_RELAY - 1 }); - #endif - #if LED3_PIN != GPIO_NONE - _leds.push_back((led_t) { LED3_PIN, LED3_PIN_INVERSE, LED3_MODE, LED3_RELAY - 1 }); - #endif - #if LED4_PIN != GPIO_NONE - _leds.push_back((led_t) { LED4_PIN, LED4_PIN_INVERSE, LED4_MODE, LED4_RELAY - 1 }); - #endif - #if LED5_PIN != GPIO_NONE - _leds.push_back((led_t) { LED5_PIN, LED5_PIN_INVERSE, LED5_MODE, LED5_RELAY - 1 }); - #endif - #if LED6_PIN != GPIO_NONE - _leds.push_back((led_t) { LED6_PIN, LED6_PIN_INVERSE, LED6_MODE, LED6_RELAY - 1 }); - #endif - #if LED7_PIN != GPIO_NONE - _leds.push_back((led_t) { LED7_PIN, LED7_PIN_INVERSE, LED7_MODE, LED7_RELAY - 1 }); - #endif - #if LED8_PIN != GPIO_NONE - _leds.push_back((led_t) { LED8_PIN, LED8_PIN_INVERSE, LED8_MODE, LED8_RELAY - 1 }); - #endif + // TODO: led specific maximum / max_components from v2? + + unsigned char index = 0; + while (index < 8) { + + unsigned char pin = getSetting("ledGPIO", index, GPIO_NONE).toInt(); + if (pin == GPIO_NONE) break; + + _leds.push_back((led_t) { pin, false, 0, RELAY_NONE }); + ++index; - for (unsigned int i=0; i < _leds.size(); i++) { - pinMode(_leds[i].pin, OUTPUT); - setSetting("ledMode", i, _leds[i].mode); - setSetting("ledRelay", i, _leds[i].relay); - _ledStatus(i, false); } _ledConfigure(); @@ -209,7 +199,7 @@ void ledSetup() { #endif - DEBUG_MSG_P(PSTR("[LED] Number of leds: %d\n"), _leds.size()); + DEBUG_MSG_P(PSTR("[LED] Number of LEDs: %u\n"), _leds.size()); // Main callbacks espurnaRegisterLoop(ledLoop); @@ -218,6 +208,8 @@ void ledSetup() { } +// TODO: switch statement to avoid 'continue' use ? + void ledLoop() { uint8_t wifi_state = wifiState(); @@ -236,6 +228,8 @@ void ledLoop() { _ledBlink(i, 500, 500); } + continue; + } if (_ledMode(i) == LED_MODE_FINDME_WIFI) { @@ -258,6 +252,8 @@ void ledLoop() { _ledBlink(i, 500, 500); } + continue; + } if (_ledMode(i) == LED_MODE_RELAY_WIFI) { @@ -280,17 +276,23 @@ void ledLoop() { _ledBlink(i, 500, 500); } + continue; + } // Relay-based modes, update only if relays have been updated if (!_led_update) continue; + const bool hasRelay = (RELAY_NONE != _leds[i].relay); + if (_ledMode(i) == LED_MODE_FOLLOW) { - _ledStatus(i, relayStatus(_leds[i].relay)); + if (hasRelay) _ledStatus(i, relayStatus(_leds[i].relay)); + continue; } if (_ledMode(i) == LED_MODE_FOLLOW_INVERSE) { - _ledStatus(i, !relayStatus(_leds[i].relay)); + if (hasRelay) _ledStatus(i, !relayStatus(_leds[i].relay)); + continue; } if (_ledMode(i) == LED_MODE_FINDME) { @@ -302,6 +304,7 @@ void ledLoop() { } } _ledStatus(i, status); + continue; } if (_ledMode(i) == LED_MODE_RELAY) { @@ -313,14 +316,17 @@ void ledLoop() { } } _ledStatus(i, status); + continue; } if (_ledMode(i) == LED_MODE_ON) { _ledStatus(i, true); + continue; } if (_ledMode(i) == LED_MODE_OFF) { _ledStatus(i, false); + continue; } } diff --git a/code/espurna/libs/migrate_template.h b/code/espurna/libs/migrate_template.h new file mode 100644 index 0000000000..27ea0d8f2f --- /dev/null +++ b/code/espurna/libs/migrate_template.h @@ -0,0 +1,351 @@ +// Buttons (controlled by DebounceEvent) + +#if BUTTON1_PIN != GPIO_NONE + setSetting("btnGPIO", 0, BUTTON1_PIN); + setSetting("btnMode", 0, BUTTON1_MODE); + setSetting("btnRelay", 0, BUTTON1_RELAY - 1); + setSetting("btnActions", 0, buttonStore( + BUTTON1_PRESS, BUTTON1_CLICK, BUTTON1_DBLCLICK, + BUTTON1_LNGCLICK, BUTTON1_LNGLNGCLICK, BUTTON1_TRIPLECLICK)); +#endif +#if BUTTON2_PIN != GPIO_NONE + setSetting("btnGPIO", 1, BUTTON2_PIN); + setSetting("btnMode", 1, BUTTON2_MODE); + setSetting("btnRelay", 1, BUTTON2_RELAY - 1); + setSetting("btnActions", 1, buttonStore( + BUTTON2_PRESS, BUTTON2_CLICK, BUTTON2_DBLCLICK, + BUTTON2_LNGCLICK, BUTTON2_LNGLNGCLICK, BUTTON2_TRIPLECLICK)); +#endif +#if BUTTON3_PIN != GPIO_NONE + setSetting("btnGPIO", 2, BUTTON3_PIN); + setSetting("btnMode", 2, BUTTON3_MODE); + setSetting("btnRelay", 2, BUTTON3_RELAY - 1); + setSetting("btnActions", 2, buttonStore( + BUTTON3_PRESS, BUTTON3_CLICK, BUTTON3_DBLCLICK, + BUTTON3_LNGCLICK, BUTTON3_LNGLNGCLICK, BUTTON3_TRIPLECLICK)); +#endif +#if BUTTON4_PIN != GPIO_NONE + setSetting("btnGPIO", 3, BUTTON4_PIN); + setSetting("btnMode", 3, BUTTON4_MODE); + setSetting("btnRelay", 3, BUTTON4_RELAY - 1); + setSetting("btnActions", 3, buttonStore( + BUTTON4_PRESS, BUTTON4_CLICK, BUTTON4_DBLCLICK, + BUTTON4_LNGCLICK, BUTTON4_LNGLNGCLICK, BUTTON4_TRIPLECLICK)); +#endif +#if BUTTON5_PIN != GPIO_NONE + setSetting("btnGPIO", 4, BUTTON5_PIN); + setSetting("btnMode", 4, BUTTON5_MODE); + setSetting("btnRelay", 4, BUTTON5_RELAY - 1); + setSetting("btnActions", 4, buttonStore( + BUTTON5_PRESS, BUTTON5_CLICK, BUTTON5_DBLCLICK, + BUTTON5_LNGCLICK, BUTTON5_LNGLNGCLICK, BUTTON5_TRIPLECLICK)); +#endif +#if BUTTON6_PIN != GPIO_NONE + setSetting("btnGPIO", 5, BUTTON6_PIN); + setSetting("btnMode", 5, BUTTON6_MODE); + setSetting("btnRelay", 5, BUTTON6_RELAY - 1); + setSetting("btnActions", 5, buttonStore( + BUTTON6_PRESS, BUTTON6_CLICK, BUTTON6_DBLCLICK, + BUTTON6_LNGCLICK, BUTTON6_LNGLNGCLICK, BUTTON6_TRIPLECLICK)); +#endif +#if BUTTON7_PIN != GPIO_NONE + setSetting("btnGPIO", 6, BUTTON7_PIN); + setSetting("btnMode", 6, BUTTON7_MODE); + setSetting("btnRelay", 6, BUTTON7_RELAY - 1); + setSetting("btnActions", 6, buttonStore( + BUTTON7_PRESS, BUTTON7_CLICK, BUTTON7_DBLCLICK, + BUTTON7_LNGCLICK, BUTTON7_LNGLNGCLICK, BUTTON7_TRIPLECLICK)); +#endif +#if BUTTON8_PIN != GPIO_NONE + setSetting("btnGPIO", 7, BUTTON8_PIN); + setSetting("btnMode", 7, BUTTON8_MODE); + setSetting("btnRelay", 7, BUTTON8_RELAY - 1); + setSetting("btnActions", 7, buttonStore( + BUTTON8_PRESS, BUTTON8_CLICK, BUTTON8_DBLCLICK, + BUTTON8_LNGCLICK, BUTTON8_LNGLNGCLICK, BUTTON8_TRIPLECLICK)); +#endif + +// Simple LED + +#if LED1_PIN != GPIO_NONE + setSetting("ledGPIO", 0, LED1_PIN); + setSetting("ledLogic", 0, LED1_PIN_INVERSE); + setSetting("ledMode", 0, LED1_MODE); + setSetting("ledRelay", 0, LED1_RELAY - 1); +#endif +#if LED2_PIN != GPIO_NONE + setSetting("ledGPIO", 1, LED2_PIN); + setSetting("ledLogic", 1, LED2_PIN_INVERSE); + setSetting("ledMode", 1, LED2_MODE); + setSetting("ledRelay", 1, LED2_RELAY - 1); +#endif +#if LED3_PIN != GPIO_NONE + setSetting("ledGPIO", 2, LED3_PIN); + setSetting("ledLogic", 2, LED3_PIN_INVERSE); + setSetting("ledMode", 2, LED3_MODE); + setSetting("ledRelay", 2, LED3_RELAY - 1); +#endif +#if LED4_PIN != GPIO_NONE + setSetting("ledGPIO", 3, LED4_PIN); + setSetting("ledLogic", 3, LED4_PIN_INVERSE); + setSetting("ledMode", 3, LED4_MODE); + setSetting("ledRelay", 3, LED4_RELAY - 1); +#endif +#if LED5_PIN != GPIO_NONE + setSetting("ledGPIO", 4, LED5_PIN); + setSetting("ledLogic", 4, LED5_PIN_INVERSE); + setSetting("ledMode", 4, LED5_MODE); + setSetting("ledRelay", 4, LED5_RELAY - 1); +#endif +#if LED6_PIN != GPIO_NONE + setSetting("ledGPIO", 5, LED6_PIN); + setSetting("ledLogic", 5, LED6_PIN_INVERSE); + setSetting("ledMode", 5, LED6_MODE); + setSetting("ledRelay", 5, LED6_RELAY - 1); +#endif +#if LED7_PIN != GPIO_NONE + setSetting("ledGPIO", 6, LED7_PIN); + setSetting("ledLogic", 6, LED7_PIN_INVERSE); + setSetting("ledMode", 6, LED7_MODE); + setSetting("ledRelay", 6, LED7_RELAY - 1); +#endif +#if LED8_PIN != GPIO_NONE + setSetting("ledGPIO", 7, LED8_PIN); + setSetting("ledLogic", 7, LED8_PIN_INVERSE); + setSetting("ledMode", 7, LED8_MODE); + setSetting("ledRelay", 7, LED8_RELAY - 1); +#endif + +// Relays + +setSetting("relayProvider", RELAY_PROVIDER); + +// Allow to set-up N dummy relays automatically +#ifdef DUMMY_RELAY_COUNT + setSetting("relayDummy", DUMMY_RELAY_COUNT); +#endif + +#if RELAY1_PIN != GPIO_NONE + setSetting("relayGPIO", 0, RELAY1_PIN); + setSetting("relayType", 0, RELAY1_TYPE); + #if RELAY1_DELAY_ON + setSetting("relayDelayON", 0, RELAY1_DELAY_ON); + #endif + #if RELAY1_DELAY_OFF + setSetting("relayDelayOFF", 0, RELAY1_DELAY_OFF); + #endif + #if RELAY1_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 0, RELAY1_RESET_PIN); + #endif +#endif +#if RELAY2_PIN != GPIO_NONE + setSetting("relayGPIO", 1, RELAY2_PIN); + setSetting("relayType", 1, RELAY2_TYPE); + #if RELAY2_DELAY_ON + setSetting("relayDelayON", 1, RELAY2_DELAY_ON); + #endif + #if RELAY2_DELAY_OFF + setSetting("relayDelayOFF", 1, RELAY2_DELAY_OFF); + #endif + #if RELAY2_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 1, RELAY2_RESET_PIN); + #endif +#endif +#if RELAY3_PIN != GPIO_NONE + setSetting("relayGPIO", 2, RELAY3_PIN); + setSetting("relayType", 2, RELAY3_TYPE); + #if RELAY3_DELAY_ON + setSetting("relayDelayON", 2, RELAY3_DELAY_ON); + #endif + #if RELAY3_DELAY_OFF + setSetting("relayDelayOFF", 2, RELAY3_DELAY_OFF); + #endif + #if RELAY3_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 2, RELAY3_RESET_PIN); + #endif +#endif +#if RELAY4_PIN != GPIO_NONE + setSetting("relayGPIO", 3, RELAY4_PIN); + setSetting("relayType", 3, RELAY4_TYPE); + #if RELAY4_DELAY_ON + setSetting("relayDelayON", 3, RELAY4_DELAY_ON); + #endif + #if RELAY4_DELAY_OFF + setSetting("relayDelayOFF", 3, RELAY4_DELAY_OFF); + #endif + #if RELAY4_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 3, RELAY4_RESET_PIN); + #endif +#endif +#if RELAY5_PIN != GPIO_NONE + setSetting("relayGPIO", 4, RELAY5_PIN); + setSetting("relayType", 4, RELAY5_TYPE); + #if RELAY5_DELAY_ON + setSetting("relayDelayON", 4, RELAY5_DELAY_ON); + #endif + #if RELAY5_DELAY_OFF + setSetting("relayDelayOFF", 4, RELAY5_DELAY_OFF); + #endif + #if RELAY5_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 4, RELAY5_RESET_PIN); + #endif +#endif +#if RELAY6_PIN != GPIO_NONE + setSetting("relayGPIO", 5, RELAY6_PIN); + setSetting("relayType", 5, RELAY6_TYPE); + #if RELAY6_DELAY_ON + setSetting("relayDelayON", 5, RELAY6_DELAY_ON); + #endif + #if RELAY6_DELAY_OFF + setSetting("relayDelayOFF", 5, RELAY6_DELAY_OFF); + #endif + #if RELAY6_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 5, RELAY6_RESET_PIN); + #endif +#endif +#if RELAY7_PIN != GPIO_NONE + setSetting("relayGPIO", 6, RELAY7_PIN); + setSetting("relayType", 6, RELAY7_TYPE); + #if RELAY7_DELAY_ON + setSetting("relayDelayON", 6, RELAY7_DELAY_ON); + #endif + #if RELAY7_DELAY_OFF + setSetting("relayDelayOFF", 6, RELAY7_DELAY_OFF); + #endif + #if RELAY7_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 6, RELAY7_RESET_PIN); + #endif +#endif +#if RELAY8_PIN != GPIO_NONE + setSetting("relayGPIO", 7, RELAY8_PIN); + setSetting("relayType", 7, RELAY8_TYPE); + #if RELAY8_DELAY_ON + setSetting("relayDelayON", 7, RELAY8_DELAY_ON); + #endif + #if RELAY8_DELAY_OFF + setSetting("relayDelayOFF", 7, RELAY8_DELAY_OFF); + #endif + #if RELAY8_RESET_PIN != GPIO_NONE + setSetting("relayResetGPIO", 7, RELAY8_RESET_PIN); + #endif +#endif + +// NOTE: Writing internal ID +#if LIGHT_PROVIDER != LIGHT_PROVIDER_NONE + setSetting("lightProvider", LIGHT_PROVIDER); +#endif + +// Lights + +#if LIGHT_ENABLE_PIN != GPIO_NONE + setSetting("lightEnGPIO", LIGHT_ENABLE_PIN); +#endif + +#if LIGHT_CHANNELS + setSetting("chMax", LIGHT_CHANNELS); +#endif + +// Basic PWM light control +#if LIGHT_PROVIDER == LIGHT_PROVIDER_DIMMER + + #if LIGHT_CH1_PIN != GPIO_NONE + setSetting("chGPIO", 0, LIGHT_CH1_PIN); + setSetting("chLogic", 0, LIGHT_CH1_INVERSE); + #endif + #if LIGHT_CH2_PIN != GPIO_NONE + setSetting("chGPIO", 1, LIGHT_CH2_PIN); + setSetting("chLogic", 1, LIGHT_CH2_INVERSE); + #endif + #if LIGHT_CH3_PIN != GPIO_NONE + setSetting("chGPIO", 2, LIGHT_CH3_PIN); + setSetting("chLogic", 2, LIGHT_CH3_INVERSE); + #endif + #if LIGHT_CH4_PIN != GPIO_NONE + setSetting("chGPIO", 3, LIGHT_CH4_PIN); + setSetting("chLogic", 3, LIGHT_CH4_INVERSE); + #endif + #if LIGHT_CH5_PIN != GPIO_NONE + setSetting("chGPIO", 4, LIGHT_CH5_PIN); + setSetting("chLogic", 4, LIGHT_CH5_INVERSE); + #endif + +#endif + +// External LED driver MY9291 / MY9231 +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX + setSetting("myModel", MY92XX_MODEL); + setSetting("myChips", MY92XX_CHIPS); + setSetting("myDI", MY92XX_DI_PIN); + setSetting("myDCKI", MY92XX_DCKI_PIN); + setSetting("myMap", MY92XX_MAPPING); +#endif + +// Encoder controlled lights +#if ENCODER_SUPPORT + + #if (ENCODER1_PIN1 != GPIO_NONE) && (ENCODER1_PIN2 != GPIO_NONE) + setSetting("encA", 0, ENCODER1_PIN1); + setSetting("encB", 0, ENCODER1_PIN2); + setSetting("encBtn", 0, ENCODER1_BUTTON_PIN); + setSetting("encMode", 0, ENCODER1_MODE); + setSetting("encCh", 0, ENCODER1_CHANNEL1); + setSetting("encBtnCh", 0, ENCODER1_CHANNEL2); + #endif + #if (ENCODER2_PIN1 != GPIO_NONE) && (ENCODER2_PIN2 != GPIO_NONE) + setSetting("encA", 1, ENCODER2_PIN1); + setSetting("encB", 1, ENCODER2_PIN2); + setSetting("encBtn", 1, ENCODER2_BUTTON_PIN); + setSetting("encMode", 1, ENCODER2_MODE); + setSetting("encCh", 1, ENCODER2_CHANNEL1); + setSetting("encBtnCh", 1, ENCODER2_CHANNEL2); + #endif + #if (ENCODER3_PIN1 != GPIO_NONE) && (ENCODER3_PIN2 != GPIO_NONE) + setSetting("encA", 2, ENCODER3_PIN1); + setSetting("encB", 2, ENCODER3_PIN2); + setSetting("encBtn", 2, ENCODER3_BUTTON_PIN); + setSetting("encMode", 2, ENCODER3_MODE); + setSetting("encCh", 2, ENCODER3_CHANNEL1); + setSetting("encBtnCh", 2, ENCODER3_CHANNEL2); + #endif + #if (ENCODER4_PIN1 != GPIO_NONE) && (ENCODER4_PIN2 != GPIO_NONE) + setSetting("encA", 3, ENCODER4_PIN1); + setSetting("encB", 3, ENCODER4_PIN2); + setSetting("encBtn", 3, ENCODER4_BUTTON_PIN); + setSetting("encMode", 3, ENCODER4_MODE); + setSetting("encCh", 3, ENCODER4_CHANNEL1); + setSetting("encBtnCh", 3, ENCODER4_CHANNEL2); + #endif + #if (ENCODER5_PIN1 != GPIO_NONE) && (ENCODER5_PIN2 != GPIO_NONE) + setSetting("encA", 4, ENCODER5_PIN1); + setSetting("encB", 4, ENCODER5_PIN2); + setSetting("encBtn", 4, ENCODER5_BUTTON_PIN); + setSetting("encMode", 4, ENCODER5_MODE); + setSetting("encCh", 4, ENCODER5_CHANNEL1); + setSetting("encBtnCh", 4, ENCODER5_CHANNEL2); + #endif + +#endif + +// Dynamic module settings +/* +#if HLW8012_SUPPORT + + setSetting("hlwSEL", HLW8012_SEL_PIN); + setSetting("hlwCF1", HLW8012_CF1_PIN); + setSetting("hlwCF", HLW8012_CF_PIN); + setSetting("hlwInt", HLW8012_INTERRUPT_ON); + #ifdef HLW8012_SEL_CURRENT + setSetting("hlwSelC", HLW8012_SEL_CURRENT); + #endif + #ifdef HLW8012_CURRENT_RATIO + setSetting("pwrRatioC", HLW8012_CURRENT_RATIO); + #endif + #ifdef HLW8012_VOLTAGE_RATIO + setSetting("pwrRatioV", HLW8012_VOLTAGE_RATIO); + #endif + #ifdef HLW8012_POWER_RATIO + setSetting("pwrRatioP", HLW8012_POWER_RATIO); + #endif + +#endif +*/ diff --git a/code/espurna/light.ino b/code/espurna/light.ino index 5e58b5b311..0464432f29 100644 --- a/code/espurna/light.ino +++ b/code/espurna/light.ino @@ -54,7 +54,7 @@ unsigned int _light_mireds = round((LIGHT_COLDWHITE_MIRED+LIGHT_WARMWHITE_MIRED) #if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX #include my92xx * _my92xx; -ARRAYINIT(unsigned char, _light_channel_map, MY92XX_MAPPING); +unsigned char _light_channel_map[5] = {0}; #endif // Gamma Correction lookup table (8 bit) @@ -1125,6 +1125,29 @@ unsigned long getIOFunc(unsigned long gpio) { #endif +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX + +void _lightSaveChannelMap(String& result, unsigned char array[], size_t length) { + + result.reserve(5); + + for (unsigned char i=0; i(array[i]) + '0'; + } + +} + +void _lightLoadChannelMap(String& source, unsigned char array[], size_t length) { + + if (!source.length() || (source.length() != LIGHT_CHANNELS)) return; + + for (unsigned char i=0; i(source[i] - '0'); + } + +} +#endif + void _lightConfigure() { _light_has_color = getSetting("useColor", LIGHT_USE_COLOR).toInt() == 1; @@ -1153,59 +1176,54 @@ void _lightConfigure() { void lightSetup() { - #ifdef LIGHT_ENABLE_PIN - pinMode(LIGHT_ENABLE_PIN, OUTPUT); - digitalWrite(LIGHT_ENABLE_PIN, HIGH); - #endif + { + unsigned char gpio = getSetting("lightEnGPIO", GPIO_NONE).toInt(); + if (GPIO_NONE != gpio) { + pinMode(gpio, OUTPUT); + digitalWrite(gpio, HIGH); + } + } #if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX - + { _my92xx = new my92xx(MY92XX_MODEL, MY92XX_CHIPS, MY92XX_DI_PIN, MY92XX_DCKI_PIN, MY92XX_COMMAND); for (unsigned char i=0; i 0) { + uint32 pwm_duty_init[PWM_CHANNEL_NUM_MAX]; + uint32 io_info[PWM_CHANNEL_NUM_MAX][3]; + for (unsigned int i=0; i < _light_channel.size(); i++) { + pwm_duty_init[i] = 0; + io_info[i][0] = getIOMux(_light_channel[i].pin); + io_info[i][1] = getIOFunc(_light_channel[i].pin); + io_info[i][2] = _light_channel[i].pin; + pinMode(_light_channel[i].pin, OUTPUT); + } + pwm_init(LIGHT_MAX_PWM, pwm_duty_init, PWM_CHANNEL_NUM_MAX, io_info); + pwm_start(); + } + } #endif DEBUG_MSG_P(PSTR("[LIGHT] LIGHT_PROVIDER = %d\n"), LIGHT_PROVIDER); - DEBUG_MSG_P(PSTR("[LIGHT] Number of channels: %d\n"), _light_channel.size()); + DEBUG_MSG_P(PSTR("[LIGHT] Number of channels: %u\n"), _light_channel.size()); _lightConfigure(); if (rtcmemStatus()) { diff --git a/code/espurna/migrate.h b/code/espurna/migrate.h new file mode 100644 index 0000000000..2362ed1259 --- /dev/null +++ b/code/espurna/migrate.h @@ -0,0 +1,36 @@ +namespace Espurna { + + namespace Hardware { + + using setup_f = void(); + + PROGMEM const char NAME_ESPURNA_CORE[] = "ESPURNA_CORE"; + PROGMEM const char NAME_ITEAD_SONOFF_POW[] = "ITEAD_SONOFF_POW"; + PROGMEM const char NAME_BLITZWOLF_BWSHPX_V23[] = "BLITZWOLF_BWSHPX_V23"; + + const size_t size = 3; + const char* const names[] = { + NAME_ESPURNA_CORE, + NAME_ITEAD_SONOFF_POW, + NAME_BLITZWOLF_BWSHPX_V23 + }; + + void setup_ESPURNA_CORE() { + #include "hardware/ESPURNA_CORE.h" + } + void setup_ITEAD_SONOFF_POW() { + #include "hardware/ITEAD_SONOFF_POW.h" + } + void setup_BLITZWOLF_BWSHPX_v23() { + #include "hardware/BLITZWOLF_BWSHPX_V23.h" + } + + const setup_f* const setups[] = { + setup_ESPURNA_CORE, + setup_ITEAD_SONOFF_POW, + setup_BLITZWOLF_BWSHPX_v23 + }; + + } + +} diff --git a/code/espurna/migrate.ino b/code/espurna/migrate.ino index 0f084b5557..956bd740c2 100644 --- a/code/espurna/migrate.ino +++ b/code/espurna/migrate.ino @@ -6,6 +6,9 @@ Copyright (C) 2016-2019 by Xose Pérez */ +// TODO: instead of headers put all parsed hw there, use templating? +#include "migrate.h" + void _cmpMoveIndexDown(const char * key, int offset = 0) { if (hasSetting(key, 0)) return; for (unsigned char index = 1; index < SETTINGS_MAX_LIST_COUNT; index++) { @@ -17,23 +20,30 @@ void _cmpMoveIndexDown(const char * key, int offset = 0) { } } +void _migrateSetFromDefaults() { + // TODO: export as schema for WebUI (key:type) + // TODO: external config generator? + + #include "libs/migrate_template.h" + +} + // Configuration versions // // 1: based on Embedis, no board definitions // 2: based on Embedis, with board definitions 1-based // 3: based on Embedis, with board definitions 0-based +// 4: based on Embedis, (?) updated module prefixes, dynamic settings -void migrate() { +void _migrateConfig() { - // Get config version - unsigned int board = getSetting("board", 0).toInt(); - unsigned int config_version = getSetting("cfg", board > 0 ? 2 : 1).toInt(); + // Update schema version to the current one + unsigned int config_version = getSetting("cfg", 0).toInt(); - // Update if not on latest version - if (config_version == CFG_VERSION) return; + if (CFG_VERSION == config_version) return; setSetting("cfg", CFG_VERSION); - if (config_version == 2) { + if (2 == config_version) { _cmpMoveIndexDown("ledGPIO"); _cmpMoveIndexDown("ledLogic"); _cmpMoveIndexDown("btnGPIO"); @@ -42,1288 +52,62 @@ void migrate() { _cmpMoveIndexDown("relayType"); } - if (config_version == 1) { - - #if defined(NODEMCU_LOLIN) - - setSetting("board", 2); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(WEMOS_D1_MINI_RELAYSHIELD) - - setSetting("board", 3); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_BASIC) - - setSetting("board", 4); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_TH) - - setSetting("board", 5); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_SV) - - setSetting("board", 6); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_TOUCH) - - setSetting("board", 7); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_POW) - - setSetting("board", 8); - setSetting("ledGPIO", 0, 15); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("selGPIO", 5); - setSetting("cf1GPIO", 13); - setSetting("cfGPIO", 14); - - #elif defined(ITEAD_SONOFF_DUAL) - - setSetting("board", 9); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnRelay", 0, 0xFF); - setSetting("btnRelay", 1, 0xFF); - setSetting("btnRelay", 2, 0); - setSetting("relayProvider", RELAY_PROVIDER_DUAL); - setSetting("relays", 2); - - #elif defined(ITEAD_1CH_INCHING) - - setSetting("board", 10); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_4CH) - - setSetting("board", 11); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 9); - setSetting("btnGPIO", 2, 10); - setSetting("btnGPIO", 3, 14); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("btnRelay", 2, 2); - setSetting("btnRelay", 3, 3); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 5); - setSetting("relayGPIO", 2, 4); - setSetting("relayGPIO", 3, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - setSetting("relayType", 3, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SLAMPHER) - - setSetting("board", 12); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_S20) - - setSetting("board", 13); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ELECTRODRAGON_WIFI_IOT) - - setSetting("board", 14); - setSetting("ledGPIO", 0, 16); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 2); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 13); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(WORKCHOICE_ECOPLUG) - - setSetting("board", 15); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(JANGOE_WIFI_RELAY_NC) - - setSetting("board", 16); - setSetting("btnGPIO", 0, 12); - setSetting("btnGPIO", 1, 13); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("relayGPIO", 0, 2); - setSetting("relayGPIO", 1, 14); - setSetting("relayType", 0, RELAY_TYPE_INVERSE); - setSetting("relayType", 1, RELAY_TYPE_INVERSE); - - #elif defined(JANGOE_WIFI_RELAY_NO) - - setSetting("board", 17); - setSetting("btnGPIO", 0, 12); - setSetting("btnGPIO", 1, 13); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("relayGPIO", 0, 2); - setSetting("relayGPIO", 1, 14); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(OPENENERGYMONITOR_MQTT_RELAY) - - setSetting("board", 18); - setSetting("ledGPIO", 0, 16); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(JORGEGARCIA_WIFI_RELAYS) - - setSetting("board", 19); - setSetting("relayGPIO", 0, 0); - setSetting("relayGPIO", 1, 2); - setSetting("relayType", 0, RELAY_TYPE_INVERSE); - setSetting("relayType", 1, RELAY_TYPE_INVERSE); - - #elif defined(AITHINKER_AI_LIGHT) - - setSetting("board", 20); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_MY92XX); - setSetting("myModel", MY92XX_MODEL_MY9291); - setSetting("myChips", 1); - setSetting("myDIGPIO", 13); - setSetting("myDCKIGPIO", 15); - setSetting("relays", 1); - - #elif defined(LYASI_LIGHT) - - setSetting("board", 20); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_MY92XX); - setSetting("myModel", MY92XX_MODEL_MY9291); - setSetting("myChips", 1); - setSetting("myDIGPIO", 4); - setSetting("myDCKIGPIO", 5); - setSetting("relays", 1); - - #elif defined(MAGICHOME_LED_CONTROLLER) - - setSetting("board", 21); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("chGPIO", 0, 14); - setSetting("chGPIO", 1, 5); - setSetting("chGPIO", 2, 12); - setSetting("chGPIO", 3, 13); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - - #elif defined(MAGICHOME_LED_CONTROLLER_IR) - - setSetting("board", 21); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("chGPIO", 0, 5); - setSetting("chGPIO", 1, 12); - setSetting("chGPIO", 2, 13); - setSetting("chGPIO", 3, 14); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - - #elif defined(ITEAD_MOTOR) - - setSetting("board", 22); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(TINKERMAN_ESPURNA_H06) - - setSetting("board", 23); - setSetting("ledGPIO", 0, 5); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 4); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_INVERSE); - setSetting("selGPIO", 2); - setSetting("cf1GPIO", 13); - setSetting("cfGPIO", 14); - - #elif defined(HUACANXING_H801) - - setSetting("board", 24); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("ledGPIO", 0, 5); - setSetting("ledLogic", 0, 1); - setSetting("chGPIO", 0, 15); - setSetting("chGPIO", 1, 13); - setSetting("chGPIO", 2, 12); - setSetting("chGPIO", 3, 14); - setSetting("chGPIO", 4, 4); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("chLogic", 4, 0); - setSetting("relays", 1); - - #elif defined(ITEAD_BNSZ01) - - setSetting("board", 25); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("chGPIO", 0, 12); - setSetting("chLogic", 0, 0); - setSetting("relays", 1); - - #elif defined(ITEAD_SONOFF_RFBRIDGE) - - setSetting("board", 26); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("relayProvider", RELAY_PROVIDER_RFBRIDGE); - setSetting("relays", 6); - - #elif defined(ITEAD_SONOFF_4CH_PRO) - - setSetting("board", 27); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 9); - setSetting("btnGPIO", 2, 10); - setSetting("btnGPIO", 3, 14); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("btnRelay", 2, 2); - setSetting("btnRelay", 3, 3); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 5); - setSetting("relayGPIO", 2, 4); - setSetting("relayGPIO", 3, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - setSetting("relayType", 3, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_B1) - - setSetting("board", 28); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_MY92XX); - setSetting("myModel", MY92XX_MODEL_MY9231); - setSetting("myChips", 2); - setSetting("myDIGPIO", 12); - setSetting("myDCKIGPIO", 14); - setSetting("relays", 1); - - #elif defined(ITEAD_SONOFF_LED) - - setSetting("board", 29); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("chGPIO", 0, 12); - setSetting("chLogic", 0, 0); - setSetting("chGPIO", 1, 14); - setSetting("chLogic", 1, 0); - setSetting("relays", 1); - - #elif defined(ITEAD_SONOFF_T1_1CH) - - setSetting("board", 30); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 9); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_T1_2CH) - - setSetting("board", 31); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 10); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_T1_3CH) - - setSetting("board", 32); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 9); - setSetting("btnGPIO", 2, 10); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("btnRelay", 2, 2); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 5); - setSetting("relayGPIO", 2, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_RF) - - setSetting("board", 33); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(WION_50055) - - setSetting("board", 34); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(EXS_WIFI_RELAY_V31) - - setSetting("board", 35); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 13); - setSetting("relayResetGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(HUACANXING_H802) - - setSetting("board", 36); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 12); - setSetting("chGPIO", 1, 14); - setSetting("chGPIO", 2, 13); - setSetting("chGPIO", 3, 15); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - - #elif defined(GENERIC_V9261F) - - setSetting("board", 37); - - #elif defined(GENERIC_ECH1560) - - setSetting("board", 38); - - #elif defined(TINKERMAN_ESPURNA_H08) - - setSetting("board", 39); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 4); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("selGPIO", 5); - setSetting("cf1GPIO", 13); - setSetting("cfGPIO", 14); - - #elif defined(MANCAVEMADE_ESPLIVE) - - setSetting("board", 40); - setSetting("btnGPIO", 0, 4); - setSetting("btnGPIO", 1, 5); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 13); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(INTERMITTECH_QUINLED) - - setSetting("board", 41); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("ledGPIO", 0, 1); - setSetting("ledLogic", 0, 1); - setSetting("chGPIO", 0, 0); - setSetting("chGPIO", 1, 2); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("relays", 1); - - #elif defined(MAGICHOME_LED_CONTROLLER_20) - - setSetting("board", 42); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 5); - setSetting("chGPIO", 1, 12); - setSetting("chGPIO", 2, 13); - setSetting("chGPIO", 3, 15); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - - #elif defined(ARILUX_AL_LC06) - - setSetting("board", 43); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 12); - setSetting("chGPIO", 1, 14); - setSetting("chGPIO", 2, 13); - setSetting("chGPIO", 3, 15); - setSetting("chGPIO", 4, 5); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("chLogic", 4, 0); - setSetting("relays", 1); - - #elif defined(XENON_SM_PW702U) - - setSetting("board", 44); - setSetting("ledGPIO", 0, 4); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(AUTHOMETION_LYT8266) - - setSetting("board", 45); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 13); - setSetting("chGPIO", 1, 12); - setSetting("chGPIO", 2, 14); - setSetting("chGPIO", 3, 2); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - setSetting("enGPIO", 15); - - #elif defined(ARILUX_E27) - - setSetting("board", 46); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_MY92XX); - setSetting("myModel", MY92XX_MODEL_MY9291); - setSetting("myChips", 1); - setSetting("myDIGPIO", 13); - setSetting("myDCKIGPIO", 15); - setSetting("relays", 1); - - #elif defined(YJZK_SWITCH_2CH) - - setSetting("board", 47); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 0); - setSetting("ledWifi", 0); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 9); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_DUAL_R2) - - setSetting("board", 48); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 9); - setSetting("btnGPIO", 2, 10); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("btnRelay", 2, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(GENERIC_8CH) - - setSetting("board", 49); - setSetting("relayGPIO", 0, 0); - setSetting("relayGPIO", 1, 2); - setSetting("relayGPIO", 2, 4); - setSetting("relayGPIO", 3, 5); - setSetting("relayGPIO", 4, 12); - setSetting("relayGPIO", 5, 13); - setSetting("relayGPIO", 6, 14); - setSetting("relayGPIO", 7, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - setSetting("relayType", 3, RELAY_TYPE_NORMAL); - setSetting("relayType", 4, RELAY_TYPE_NORMAL); - setSetting("relayType", 5, RELAY_TYPE_NORMAL); - setSetting("relayType", 6, RELAY_TYPE_NORMAL); - setSetting("relayType", 7, RELAY_TYPE_NORMAL); - - #elif defined(ARILUX_AL_LC01) - - setSetting("board", 50); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 5); - setSetting("chGPIO", 1, 12); - setSetting("chGPIO", 2, 13); - setSetting("chGPIO", 3, 14); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - - #elif defined(ARILUX_AL_LC11) - - setSetting("board", 51); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 5); - setSetting("chGPIO", 1, 4); - setSetting("chGPIO", 2, 14); - setSetting("chGPIO", 3, 13); - setSetting("chGPIO", 4, 12); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("chLogic", 4, 0); - setSetting("relays", 1); - - #elif defined(ARILUX_AL_LC02) - - setSetting("board", 52); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 12); - setSetting("chGPIO", 1, 5); - setSetting("chGPIO", 2, 13); - setSetting("chGPIO", 3, 15); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - - #elif defined(KMC_70011) - - setSetting("board", 53); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 14); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("selGPIO", 12); - setSetting("cf1GPIO", 5); - setSetting("cfGPIO", 4); - - #elif defined(GIZWITS_WITTY_CLOUD) - - setSetting("board", 54); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 4); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 15); - setSetting("chGPIO", 1, 12); - setSetting("chGPIO", 2, 13); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("relays", 1); - - #elif defined(EUROMATE_WIFI_STECKER_SCHUKO) - - setSetting("board", 55); - setSetting("ledGPIO", 0, 4); - setSetting("ledLogic", 0, 0); - setSetting("ledGPIO", 1, 12); - setSetting("ledLogic", 1, 0); - setSetting("btnGPIO", 0, 14); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(TONBUX_POWERSTRIP02) - - setSetting("board", 56); - setSetting("relayGPIO", 0, 4); - setSetting("relayGPIO", 1, 13); - setSetting("relayGPIO", 2, 12); - setSetting("relayGPIO", 3, 14); - setSetting("relayGPIO", 4, 16); - setSetting("relayType", 0, RELAY_TYPE_INVERSE); - setSetting("relayType", 1, RELAY_TYPE_INVERSE); - setSetting("relayType", 2, RELAY_TYPE_INVERSE); - setSetting("relayType", 3, RELAY_TYPE_INVERSE); - setSetting("relayType", 4, RELAY_TYPE_NORMAL); // Not a relay. USB ports on/off - setSetting("ledGPIO", 0, 0); // 1 blue led - setSetting("ledLogic", 0, 1); - setSetting("ledGPIO", 1, 3); // 3 red leds - setSetting("ledLogic", 1, 1); - setSetting("btnGPIO", 0, 5); - setSetting("btnRelay", 0, 1); - - #elif defined(LINGAN_SWA1) - - setSetting("board", 57); - setSetting("ledGPIO", 0, 4); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(HEYGO_HY02) - - setSetting("board", 58); - setSetting("ledGPIO", 0, 0); - setSetting("ledLogic", 0, 1); - setSetting("ledGPIO", 1, 15); - setSetting("ledLogic", 1, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("selGPIO", 3); - setSetting("cf1GPIO", 14); - setSetting("cfGPIO", 5); - - #elif defined(MAXCIO_WUS002S) - - setSetting("board", 59); - setSetting("ledGPIO", 0, 3); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 2); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 13); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("selGPIO", 12); - setSetting("cf1GPIO", 5); - setSetting("cfGPIO", 4); - - #elif defined(YIDIAN_XSSSA05) - - setSetting("board", 60); - setSetting("ledGPIO", 0, 0); - setSetting("ledLogic", 0, 0); - setSetting("ledGPIO", 1, 5); - setSetting("ledLogic", 1, 0); - setSetting("ledGPIO", 2, 2); - setSetting("ledLogic", 2, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(TONBUX_XSSSA06) - - setSetting("board", 61); - setSetting("ledGPIO", 0, 4); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(GREEN_ESP8266RELAY) - - setSetting("board", 62); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 5); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(IKE_ESPIKE) - - setSetting("board", 63); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("btnGPIO", 1, 12); - setSetting("btnRelay", 1, 1); - setSetting("btnGPIO", 2, 13); - setSetting("btnRelay", 2, 2); - setSetting("relayGPIO", 0, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayGPIO", 1, 5); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayGPIO", 2, 16); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - - #elif defined(ARNIEX_SWIFITCH) - - setSetting("board", 64); - setSetting("ledGPIO", 0, 12); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 4); - setSetting("btnRelay", 0, 1); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_INVERSE); - - #elif defined(GENERIC_ESP01S_RELAY_V40) - - setSetting("board", 65); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 0); - setSetting("relayGPIO", 0, 0); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(GENERIC_ESP01S_RGBLED_V10) - - setSetting("board", 66); - setSetting("ledGPIO", 0, 2); - - #elif defined(HELTEC_TOUCHRELAY) - - setSetting("board", 67); - setSetting("btnGPIO", 0, 14); - setSetting("btnRelay", 0, 1); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(GENERIC_ESP01S_DHT11_V10) - - setSetting("board", 68); - - #elif defined(GENERIC_ESP01S_DS18B20_V10) - - setSetting("board", 69); - - #elif defined(ZHILDE_EU44_W) - - setSetting("board", 70); - setSetting("btnGPIO", 0, 3); - setSetting("ledGPIO", 0, 1); - setSetting("ledLogic", 0, 1); - setSetting("relayGPIO", 0, 5); - setSetting("relayGPIO", 1, 4); - setSetting("relayGPIO", 2, 12); - setSetting("relayGPIO", 3, 13); - setSetting("relayGPIO", 4, 14); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - setSetting("relayType", 3, RELAY_TYPE_NORMAL); - setSetting("relayType", 4, RELAY_TYPE_NORMAL); - - #elif defined(ITEAD_SONOFF_POW_R2) - - setSetting("board", 71); - setSetting("ledGPIO", 0, 15); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("selGPIO", 5); - setSetting("cf1GPIO", 13); - setSetting("cfGPIO", 14); - - #elif defined(LUANI_HVIO) - - setSetting("board", 72); - setSetting("ledGPIO", 0, 15); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 12); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayGPIO", 1, 5); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(ALLNET_4DUINO_IOT_WLAN_RELAIS) - - setSetting("board", 73); - setSetting("relayGPIO", 0, 14); - setSetting("relayResetGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_LATCHED); - - #elif defined(TONBUX_MOSQUITO_KILLER) - - setSetting("board", 74); - setSetting("ledGPIO", 0, 15); - setSetting("ledLogic", 0, 1); - setSetting("ledGPIO", 1, 14); - setSetting("ledLogic", 1, 1); - setSetting("ledGPIO", 2, 12); - setSetting("ledLogic", 2, 0); - setSetting("ledGPIO", 3, 16); - setSetting("ledLogic", 3, 0); - setSetting("btnGPIO", 0, 2); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(NEO_COOLCAM_NAS_WR01W) - - setSetting("board", 75); - setSetting("ledGPIO", 0, 4); - setSetting("ledLogic", 0, 1); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(PILOTAK_ESP_DIN_V1) - - setSetting("board", 76); - setSetting("ledGPIO", 0, 16); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 4); - setSetting("relayGPIO", 1, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(FORNORM_ZLD_34EU) - - setSetting("board", 77); - setSetting("btnGPIO", 0, 16); - setSetting("btnRelay", 0, 3); - setSetting("ledGPIO", 0, 0); - setSetting("ledGPIO", 1, 12); - setSetting("ledGPIO", 2, 3); - setSetting("ledGPIO", 3, 5); - setSetting("ledLogic", 0, 1); - setSetting("ledLogic", 1, 1); - setSetting("ledLogic", 2, 1); - setSetting("ledLogic", 3, 1); - setSetting("ledMode", 0, LED_MODE_FINDME); - setSetting("ledMode", 1, LED_MODE_FOLLOW); - setSetting("ledMode", 2, LED_MODE_FOLLOW); - setSetting("ledMode", 3, LED_MODE_FOLLOW); - setSetting("ledRelay", 1, 1); - setSetting("ledRelay", 2, 2); - setSetting("ledRelay", 3, 3); - setSetting("relayGPIO", 0, 14); - setSetting("relayGPIO", 1, 13); - setSetting("relayGPIO", 2, 4); - setSetting("relayGPIO", 3, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - setSetting("relayType", 3, RELAY_TYPE_NORMAL); - - #elif defined(BH_ONOFRE) - - setSetting("board", 78); - setSetting("btnGPIO", 0, 12); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 0, 1); - setSetting("relayGPIO", 0, 4); - setSetting("relayGPIO", 1, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(BLITZWOLF_BWSHPX) - - setSetting("board", 79); - setSetting("ledGPIO", 0, 2); - setSetting("ledLogic", 0, 1); - setSetting("ledGPIO", 1, 0); - setSetting("ledLogic", 1, 1); - setSetting("ledMode", 1, LED_MODE_FINDME); - setSetting("ledRelay", 1, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("selGPIO", 12); - setSetting("cf1GPIO", 14); - setSetting("cfGPIO", 5); - setSetting("pwrRatioC", 25740); - setSetting("pwrRatioV", 313400); - setSetting("pwrRatioP", 3414290); - setSetting("hlwSelC", LOW); - setSetting("hlwIntM", FALLING); - - #elif defined(TINKERMAN_RFM69GW) - - setSetting("board", 80); - setSetting("btnGPIO", 0, 0); - - #elif defined(ITEAD_SONOFF_IFAN02) - - setSetting("board", 81); - - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 9); - setSetting("btnGPIO", 2, 10); - setSetting("btnGPIO", 3, 14); - - setSetting("ledGPIO", 1, 13); - setSetting("ledLogic", 1, 1); - - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 5); - setSetting("relayGPIO", 2, 4); - setSetting("relayGPIO", 3, 15); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - setSetting("relayType", 3, RELAY_TYPE_NORMAL); - - #elif defined(GENERIC_AG_L4) - - setSetting("board", 82); - - setSetting("btnGPIO", 0, 4); - setSetting("btnGPIO", 1, 2); - setSetting("btnRelay", 0, 0); - - setSetting("ledGPIO", 0, 5); - setSetting("ledGPIO", 1, 16); - setSetting("ledLogic", 0, 0); - setSetting("ledLogic", 1, 1); - - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 14); - setSetting("chGPIO", 1, 13); - setSetting("chGPIO", 2, 12); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("relays", 1); - - #elif defined(ALLTERCO_SHELLY1) - - setSetting("board", 83); - setSetting("btnGPIO", 0, 5); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(LOHAS_9W) - - setSetting("board", 84); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_MY92XX); - setSetting("myModel", MY92XX_MODEL_MY9231); - setSetting("myChips", 2); - setSetting("myDIGPIO", 13); - setSetting("myDCKIGPIO", 15); - setSetting("relays", 1); - - #elif defined(YJZK_SWITCH_1CH) - - setSetting("board", 85); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 0); - setSetting("ledWifi", 0); - setSetting("btnGPIO", 0, 0); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - - #elif defined(YJZK_SWITCH_3CH) - - setSetting("board", 86); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 0); - setSetting("ledWifi", 0); - setSetting("btnGPIO", 0, 0); - setSetting("btnGPIO", 1, 9); - setSetting("btnGPIO", 2, 10); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("btnRelay", 2, 2); - setSetting("relayGPIO", 0, 12); - setSetting("relayGPIO", 1, 5); - setSetting("relayGPIO", 2, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - setSetting("relayType", 2, RELAY_TYPE_NORMAL); - - #elif defined(XIAOMI_SMART_DESK_LAMP) - - setSetting("board", 87); - - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("relays", 1); - setSetting("chGPIO", 0, 5); - setSetting("chGPIO", 1, 4); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - - setSetting("btnGPIO", 0, 2); - setSetting("btnGPIO", 1, 14); - setSetting("btnRelay", 0, 0); - setSetting("btnLngDelay", 500); - setSetting("btnDblClick", 0, BUTTON_MODE_NONE); - setSetting("btnLngClick", 0, BUTTON_MODE_NONE); - setSetting("btnLngLngClick", 0, BUTTON_MODE_NONE); - setSetting("btnDblClick", 1, BUTTON_MODE_AP); - setSetting("btnLngLngClick", 1, BUTTON_MODE_RESET); - - setSetting("enc1stGPIO", 0, 12); - setSetting("enc2ndGPIO", 0, 13); - setSetting("encBtnGPIO", 0, 2); - setSetting("encMode", ENCODER_MODE_RATIO); - - #elif defined(ALLTERCO_SHELLY2) - - setSetting("board", 88); - setSetting("btnGPIO", 0, 12); - setSetting("btnGPIO", 1, 14); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - setSetting("relayGPIO", 0, 4); - setSetting("relayGPIO", 1, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayType", 1, RELAY_TYPE_NORMAL); - - #elif defined(PHYX_ESP12_RGB) - - setSetting("board", 89); - - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("relays", 1); - setSetting("chGPIO", 0, 4); - setSetting("chGPIO", 1, 14); - setSetting("chGPIO", 2, 12); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 3, 0); - - #elif defined(IWOOLE_LED_TABLE_LAMP) - - setSetting("board", 90); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 12); - setSetting("chGPIO", 1, 5); - setSetting("chGPIO", 2, 14); - setSetting("chGPIO", 3, 4); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); - - #elif defined(EXS_WIFI_RELAY_V50) - - setSetting("board", 91); - - setSetting("btnGPIO", 0, 5); - setSetting("btnGPIO", 1, 4); - setSetting("btnRelay", 0, 0); - setSetting("btnRelay", 1, 1); - - setSetting("relayGPIO", 0, 14); - setSetting("relayGPIO", 1, 13); - setSetting("relayResetGPIO", 0, 16); - setSetting("relayResetGPIO", 1, 12); - setSetting("relayType", 0, RELAY_TYPE_LATCHED); - setSetting("relayType", 0, RELAY_TYPE_LATCHED); - - setSetting("ledGPIO", 1, 15); - setSetting("ledLogic", 1, 0); - - #elif defined(TONBUX_XSSSA01) - - setSetting("board", 92); - setSetting("ledGPIO", 0, 13); - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 5); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); + // Apply default settings based on HW definitions from hardware.h / user's custom.h + // NOTE: indexes of preprocessor tokens are 1-based, while settings are 0-based + // TODO: moveSetting for relay/encoder/light keys + if ((0 == config_version) || (3 == config_version)) { + _migrateSetFromDefaults(); + } - #elif defined(EUROMATE_WIFI_STECKER_SCHUKO_V2) + saveSettings(); - setSetting("board", 93); - setSetting("ledGPIO", 0, 13); // Red LED - setSetting("ledLogic", 0, 1); - setSetting("ledGPIO", 1, 12); // Green LED - setSetting("ledLogic", 1, 1); - setSetting("btnGPIO", 0, 5); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 4); - setSetting("relayType", 0, RELAY_TYPE_NORMAL); +} - #elif defined(OUKITEL_P1) +#if TERMINAL_SUPPORT +void _migrateListBoards(Embedis* e) { - setSetting("board", 94); - setSetting("ledGPIO", 0, 0); // Blue LED - setSetting("ledLogic", 0, 0); - setSetting("btnGPIO", 0, 13); - setSetting("btnRelay", 0, 0); - setSetting("relayGPIO", 0, 12); // Right outlet - setSetting("relayType", 0, RELAY_TYPE_NORMAL); - setSetting("relayGPIO", 1, 15); // Left outlet - setSetting("relayType", 1, RELAY_TYPE_NORMAL); + for (uint32_t n=0; nargc != 2) { + terminalError("Invalid args"); + return; + } - #elif defined(GENERIC_GU10) + String arg = String(e->argv[1]); + char* err = NULL; + uint32_t index = strtol(arg.c_str(), &err, 10); - setSetting("board", 97); - setSetting("relayProvider", RELAY_PROVIDER_LIGHT); - setSetting("lightProvider", LIGHT_PROVIDER_DIMMER); - setSetting("chGPIO", 0, 14); - setSetting("chGPIO", 1, 12); - setSetting("chGPIO", 2, 13); - setSetting("chGPIO", 3, 4); - setSetting("chLogic", 0, 0); - setSetting("chLogic", 1, 0); - setSetting("chLogic", 2, 0); - setSetting("chLogic", 3, 0); - setSetting("relays", 1); + if ((err == NULL) || (index > Espurna::Hardware::size)) { + terminalError("Invalid arg"); + return; + } - #else + (Espurna::Hardware::setups[index])(); - // Allow users to define new settings without migration config - //#error "UNSUPPORTED HARDWARE!" +} - #endif +void _migrateInitCommands() { - } + terminalRegisterCommand(F("HW.BOARDS"), _migrateListBoards); + terminalRegisterCommand(F("HW.SET"), _migrateSetBoard); - saveSettings(); +} +#endif +void migrateSetup() { + _migrateConfig(); + #if TERMINAL_SUPPORT + _migrateInitCommands(); + #endif } diff --git a/code/espurna/relay.ino b/code/espurna/relay.ino index 8f3eb5e680..c363951e26 100644 --- a/code/espurna/relay.ino +++ b/code/espurna/relay.ino @@ -586,21 +586,48 @@ void _relayBoot() { } void _relayConfigure() { - for (unsigned int i=0; i<_relays.size(); i++) { - _relays[i].pulse = getSetting("relayPulse", i, RELAY_PULSE_MODE).toInt(); - _relays[i].pulse_ms = 1000 * getSetting("relayTime", i, RELAY_PULSE_MODE).toFloat(); - if (GPIO_NONE == _relays[i].pin) continue; + for (unsigned char id=0; id < _relays.size(); ++id) { + _relays[id].delay_on = getSetting("relayDelayOn", id, 0).toInt(); + _relays[id].delay_off = getSetting("relayDelayOff", id, 0).toInt(); + + _relays[id].pulse = getSetting("relayPulse", id, RELAY_PULSE_MODE).toInt(); + _relays[id].pulse_ms = 1000 * getSetting("relayTime", id, RELAY_PULSE_TIME).toFloat(); + } + +} + +// TODO: relay_max / max_components from v2 to limit relays array size +// TODO: short key? relay -> rly/rel/rl/sw/s/... + +void _relaySetupDummy(unsigned char dummy) { + for (unsigned char index=0; index < dummy; index++) { + unsigned long delay_on = getSetting("relayDelayOn", index, 0).toInt(); + unsigned long delay_off = getSetting("relayDelayOff", index, 0).toInt(); + _relays.push_back((relay_t) {0, RELAY_TYPE_NORMAL, 0, delay_on, delay_off}); + } +} + +void _relaySetup() { + + unsigned char index = 0; + while (index < 8) { + + unsigned char pin = getSetting("relayGPIO", index, GPIO_NONE).toInt(); + if (GPIO_NONE == pin) break; + pinMode(pin, OUTPUT); + + unsigned char type = getSetting("relayType", index, RELAY_TYPE_NORMAL).toInt(); + if (RELAY_TYPE_INVERSE == type) digitalWrite(pin, HIGH); + + unsigned char reset = getSetting("relayResetGPIO", index, GPIO_NONE).toInt(); + if (GPIO_NONE != reset) pinMode(reset, OUTPUT); + + _relays.push_back((relay_t) { pin, type, reset, 0, 0, 0, 0 }); + ++index; - pinMode(_relays[i].pin, OUTPUT); - if (GPIO_NONE != _relays[i].reset_pin) { - pinMode(_relays[i].reset_pin, OUTPUT); - } - if (_relays[i].type == RELAY_TYPE_INVERSE) { - //set to high to block short opening of relay - digitalWrite(_relays[i].pin, HIGH); - } } + } //------------------------------------------------------------------------------ @@ -1082,40 +1109,15 @@ void _relayLoop() { void relaySetup() { - // Ad-hoc relays - #if RELAY1_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY1_PIN, RELAY1_TYPE, RELAY1_RESET_PIN, RELAY1_DELAY_ON, RELAY1_DELAY_OFF }); - #endif - #if RELAY2_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY2_PIN, RELAY2_TYPE, RELAY2_RESET_PIN, RELAY2_DELAY_ON, RELAY2_DELAY_OFF }); - #endif - #if RELAY3_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY3_PIN, RELAY3_TYPE, RELAY3_RESET_PIN, RELAY3_DELAY_ON, RELAY3_DELAY_OFF }); - #endif - #if RELAY4_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY4_PIN, RELAY4_TYPE, RELAY4_RESET_PIN, RELAY4_DELAY_ON, RELAY4_DELAY_OFF }); - #endif - #if RELAY5_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY5_PIN, RELAY5_TYPE, RELAY5_RESET_PIN, RELAY5_DELAY_ON, RELAY5_DELAY_OFF }); - #endif - #if RELAY6_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY6_PIN, RELAY6_TYPE, RELAY6_RESET_PIN, RELAY6_DELAY_ON, RELAY6_DELAY_OFF }); - #endif - #if RELAY7_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY7_PIN, RELAY7_TYPE, RELAY7_RESET_PIN, RELAY7_DELAY_ON, RELAY7_DELAY_OFF }); - #endif - #if RELAY8_PIN != GPIO_NONE - _relays.push_back((relay_t) { RELAY8_PIN, RELAY8_TYPE, RELAY8_RESET_PIN, RELAY8_DELAY_ON, RELAY8_DELAY_OFF }); - #endif + _relayBackwards(); - // Dummy relays for AI Light, Magic Home LED Controller, H801, Sonoff Dual and Sonoff RF Bridge - // No delay_on or off for these devices to easily allow having more than - // 8 channels. This behaviour will be recovered with v2. - for (unsigned char i=0; i < DUMMY_RELAY_COUNT; i++) { - _relays.push_back((relay_t) {GPIO_NONE, RELAY_TYPE_NORMAL, 0, 0, 0}); + unsigned char dummy = getSetting("relayDummy", 0).toInt(); + if (dummy > 0) { + _relaySetupDummy(dummy); + } else { + _relaySetup(); } - _relayBackwards(); _relayConfigure(); _relayBoot(); _relayLoop(); diff --git a/code/extra_scripts.py b/code/extra_scripts.py index 1d8c4f6c92..6f0df91c8c 100644 --- a/code/extra_scripts.py +++ b/code/extra_scripts.py @@ -2,11 +2,16 @@ from __future__ import print_function import os +import re import sys from subprocess import call +from fileinput import FileInput + import click Import("env", "projenv") +from SCons.Subst import quote_spaces +from SCons.Script import Mkdir # ------------------------------------------------------------------------------ # Utils @@ -44,6 +49,18 @@ def print_filler(fill, color=Color.WHITE, err=False): out = sys.stderr if err else sys.stdout print(clr(color, fill * width), file=out) +# https://github.com/python/cpython/commit/6cb7b659#diff-78790b53ff259619377058acd4f74672 +if sys.version_info[0] < 3: + class FileInputCtx(FileInput): + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + + + FileInput = FileInputCtx + # ------------------------------------------------------------------------------ # Callbacks # ------------------------------------------------------------------------------ @@ -92,6 +109,98 @@ def dummy_ets_printf(target, source, env): env.Execute(env.VerboseAction(" ".join(cmd), "Removing ets_printf / ets_printf_P")) env.Depends(postmortem_obj_file,"$BUILD_DIR/src/dummy_ets_printf.c.o") +# Intermediate solution to the hardware migration. +# Generate hardware headers with dynamic settings +def get_legacy_hardware(env, hardware_h=os.path.join("$PROJECT_DIR", "espurna", "config", "hardware.h"), ignore=("TRAVIS", "MANUFACTURER", "DEVICE")): + + def extract(line): + plain_re = re.compile("defined\s+(?P\w+)") + paren_re = re.compile("defined\s*\((?P\w+)\)") + + res = paren_re.search(line) + if res: + return res.group(1) + res = plain_re.search(line) + if res: + return res.group(1) + + return None + + def check_ignore(hardware): + for token in ignore: + if token in hardware: + return False + + return True + + with open(env.subst(hardware_h), "r") as header: + for line in header: + if not any([line.startswith("#if"), line.startswith("#elif")]): + continue + + out = extract(line) + if not check_ignore(out): + continue + + yield out + +def generate_hardware_header(env, out_dir, hardware): + template = env.subst(os.path.join("$PROJECT_DIR", "espurna", "libs", "migrate_template.h")) + cmd_template = "$CC -x c++ -dI -E $CCFLAGS $_CCCOMCOM -D{hardware} $_ESPURNA_ALL_H {source} -o {target}" + + out = env.subst(os.path.join(out_dir, "{}.h".format(hardware))) + cmd = cmd_template.format(hardware=hardware, source=template, target=out) + + # first, we a generating raw header file + env.Execute(env.Action(cmd, "Generating {}".format(out))) + + # then, we modify it to skip raw included files and keep only migrate_template contents + with FileInput(out, inplace=True) as header: + write = False + first = True + for line in header: + if first: + first = False + continue + + if not line.strip(): + continue + if not write and "migrate_template.h" in line: + write = True + if line.startswith("#"): + continue + + if write: + sys.stdout.write(line.strip()) + sys.stdout.write("\n") + +env.AddMethod(get_legacy_hardware) +env.AddMethod(generate_hardware_header) + +def generate_hardware(target, source, env): + all_hardware = list(env.get_legacy_hardware()) + + # ignore current hardware setting from platformio.ini + defines = list(env["CPPDEFINES"]) + for hardware in all_hardware: + entry = (hardware, ) + if entry in defines: + defines.remove(entry) + env.Replace(CPPDEFINES=defines) + break + + # add include paths from libraries + for builder in env.GetLibBuilders(): + env.PrependUnique(CPPPATH=[quote_spaces(x) for x in builder.env.get("CPPPATH")]) + + # our local header chain (NOTE: will include custom.h if build flags allow it) + env.Append(_ESPURNA_ALL_H=["-include", os.path.join("$PROJECT_DIR", "espurna", "config", "all.h")]) + env.Append(CPPPATH=[os.path.join("$PROJECT_DIR", "espurna")]) + + out_dir = os.path.join("$PROJECT_DIR", "espurna", "hardware") + for hardware in all_hardware: + env.generate_hardware_header(out_dir, hardware) + # ------------------------------------------------------------------------------ # Hooks # ------------------------------------------------------------------------------ @@ -100,7 +209,7 @@ def dummy_ets_printf(target, source, env): projenv.ProcessUnFlags("-w") # 2.4.0 and up -remove_float_support() +#remove_float_support() # two-step update hint when using 1MB boards env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", check_size) @@ -109,3 +218,5 @@ def dummy_ets_printf(target, source, env): if "DISABLE_POSTMORTEM_STACKDUMP" in env["CPPFLAGS"]: env.AddPostAction("$BUILD_DIR/FrameworkArduino/core_esp8266_postmortem.c.o", dummy_ets_printf) env.AddPostAction("$BUILD_DIR/FrameworkArduino/core_esp8266_postmortem.cpp.o", dummy_ets_printf) + +env.AlwaysBuild(env.Alias("generate-hardware", None, generate_hardware))