From 7434ea3878f9a81752694fa87127cec676d58138 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Wed, 10 Feb 2021 18:00:08 +0300 Subject: [PATCH] lights: finish up provider settings get rid of LIGHT_CHANNELS, but keep channel setting for the my92xx also clean up recent changes, channel command did not actually work --- code/espurna/config/defaults.h | 8 +-- code/espurna/config/hardware.h | 54 +++-------------- code/espurna/light.cpp | 102 ++++++++++++++++++++++++--------- code/espurna/light.h | 1 - code/espurna/light_config.h | 38 ++++++++++-- code/test/build/light_dimmer.h | 1 - code/test/build/light_my92xx.h | 2 +- 7 files changed, 121 insertions(+), 85 deletions(-) diff --git a/code/espurna/config/defaults.h b/code/espurna/config/defaults.h index 45e0ea50..55154290 100644 --- a/code/espurna/config/defaults.h +++ b/code/espurna/config/defaults.h @@ -995,10 +995,6 @@ // Lights // ----------------------------------------------------------------------------- -#ifndef LIGHT_CHANNELS -#define LIGHT_CHANNELS 0 -#endif - #ifndef LIGHT_ENABLE_PIN #define LIGHT_ENABLE_PIN GPIO_NONE #endif @@ -1047,6 +1043,10 @@ // my92xx // ----------------------------------------------------------------------------- +#ifndef MY92XX_CHANNELS +#define MY92XX_CHANNELS 0 +#endif + #ifndef MY92XX_CH1 #define MY92XX_CH1 0 #endif diff --git a/code/espurna/config/hardware.h b/code/espurna/config/hardware.h index 6b2bf621..0147e7aa 100644 --- a/code/espurna/config/hardware.h +++ b/code/espurna/config/hardware.h @@ -782,7 +782,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 1 #define LIGHT_CH1_PIN 12 #elif defined(ITEAD_SONOFF_RFBRIDGE) @@ -831,7 +830,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX // Light - #define LIGHT_CHANNELS 5 #define MY92XX_MODEL MY92XX_MODEL_MY9231 #define MY92XX_CHIPS 2 @@ -839,6 +837,7 @@ #define MY92XX_DCKI_PIN 14 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT + #define MY92XX_CHANNELS 5 #define MY92XX_CH1 4 #define MY92XX_CH2 3 #define MY92XX_CH3 5 @@ -859,7 +858,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 2 #define LIGHT_CH1_PIN 12 // Cold white #define LIGHT_CH2_PIN 14 // Warm white @@ -1257,12 +1255,12 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX // Light - #define LIGHT_CHANNELS 4 #define MY92XX_MODEL MY92XX_MODEL_MY9291 #define MY92XX_CHIPS 1 #define MY92XX_DI_PIN 13 #define MY92XX_DCKI_PIN 15 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT + #define MY92XX_CHANNELS 4 // ----------------------------------------------------------------------------- // Lyasi LED @@ -1276,12 +1274,12 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX // Light - #define LIGHT_CHANNELS 4 #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 + #define MY92XX_CHANNELS 4 // ----------------------------------------------------------------------------- // LED Controller @@ -1299,7 +1297,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 5 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -1322,7 +1319,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -1347,7 +1343,6 @@ #define LED2_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 12 // RED #define LIGHT_CH2_PIN 5 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -1372,7 +1367,6 @@ #define LED2_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 5 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -1400,7 +1394,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 1 #define LIGHT_CH1_PIN 12 // WHITE #elif defined(MAGICHOME_ZJ_ESPM_5CH_B_13) @@ -1420,7 +1413,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -1435,7 +1427,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 4 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -1460,7 +1451,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 15 // RED #define LIGHT_CH2_PIN 13 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -1477,7 +1467,6 @@ #define SERIAL_RX_ENABLED 1 // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 12 // RED #define LIGHT_CH2_PIN 14 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -1823,7 +1812,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 2 #define LIGHT_CH1_PIN 0 #define LIGHT_CH2_PIN 2 @@ -1839,7 +1827,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 3 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -1852,7 +1839,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 12 // RED #define LIGHT_CH2_PIN 5 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -1866,7 +1852,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 5 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -1885,7 +1870,6 @@ #define BUTTON1_RELAY 1 // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -1900,7 +1884,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 4 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -1915,12 +1898,12 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX // Light - #define LIGHT_CHANNELS 4 #define MY92XX_MODEL MY92XX_MODEL_MY9291 #define MY92XX_CHIPS 1 #define MY92XX_DI_PIN 13 #define MY92XX_DCKI_PIN 15 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT + #define MY92XX_CHANNELS 4 // ----------------------------------------------------------------------------- // XENON SM-PW701U @@ -1983,7 +1966,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 13 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -2014,7 +1996,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 3 #define LIGHT_CH1_PIN 15 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -3642,7 +3623,6 @@ #define LED2_MODE LED_MODE_RELAY // Light - #define LIGHT_CHANNELS 3 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 13 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -3684,7 +3664,6 @@ #define LED2_MODE LED_MODE_RELAY // Light - #define LIGHT_CHANNELS 3 #define LIGHT_CH1_PIN 4 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -3883,12 +3862,12 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX // Light - #define LIGHT_CHANNELS 5 #define MY92XX_MODEL MY92XX_MODEL_MY9231 #define MY92XX_CHIPS 2 #define MY92XX_DI_PIN 13 #define MY92XX_DCKI_PIN 15 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT + #define MY92XX_CHANNELS 5 #define LIGHT_WHITE_FACTOR (0.1) // White LEDs are way more bright in the B1 @@ -3902,7 +3881,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 4 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -3919,7 +3897,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 4 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -3957,7 +3934,6 @@ // Light #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER #define LIGHT_STEP 8 - #define LIGHT_CHANNELS 2 #define LIGHT_CH1_PIN 5 // warm white #define LIGHT_CH2_PIN 4 // cold white @@ -3987,7 +3963,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 3 #define LIGHT_CH1_PIN 4 // RED #define LIGHT_CH2_PIN 14 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -4005,7 +3980,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 12 // RED #define LIGHT_CH2_PIN 5 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -4024,7 +3998,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -4043,7 +4016,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 4 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -4061,7 +4033,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 2 #define LIGHT_CH1_PIN 12 // WARM WHITE #define LIGHT_CH2_PIN 14 // COLD WHITE @@ -4077,7 +4048,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 4 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -4097,7 +4067,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 12 // RED #define LIGHT_CH2_PIN 15 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -4115,13 +4084,12 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX // Light - #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 + #define MY92XX_CHANNELS 2 // No RGB on this bulb. Warm white on channel 0, cool white on channel 3 #define MY92XX_CH1 3 @@ -4139,12 +4107,12 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX // Light - #define LIGHT_CHANNELS 4 #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 + #define MY92XX_CHANNELS 4 // 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 @@ -4194,7 +4162,6 @@ // Light RGBW #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 14 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -4229,7 +4196,6 @@ // Light #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER - #define LIGHT_CHANNELS 3 #define LIGHT_CH1_PIN 0 // RED #define LIGHT_CH2_PIN 4 // GREEN #define LIGHT_CH3_PIN 2 // BLUE @@ -4441,7 +4407,6 @@ #define LED1_PIN_INVERSE 1 // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 5 // RED #define LIGHT_CH2_PIN 4 // GREEN #define LIGHT_CH3_PIN 12 // BLUE @@ -4637,7 +4602,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 14 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 13 // BLUE @@ -4766,7 +4730,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light RGBW - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 4 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -4980,7 +4943,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 4 #define LIGHT_CH1_PIN 4 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -4999,7 +4961,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 4 // RED #define LIGHT_CH2_PIN 12 // GREEN #define LIGHT_CH3_PIN 14 // BLUE @@ -5018,7 +4979,6 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER // Light - #define LIGHT_CHANNELS 2 #define LIGHT_CH1_PIN 5 // WARM WHITE LED PWM PIN #define LIGHT_CH1_INVERSE 0 #define LIGHT_CH2_PIN 4 // COLD WHITE LED PWM PIN diff --git a/code/espurna/light.cpp b/code/espurna/light.cpp index a246a9e4..e2ec0a06 100644 --- a/code/espurna/light.cpp +++ b/code/espurna/light.cpp @@ -19,8 +19,6 @@ Copyright (C) 2016-2019 by Xose Pérez #include "ws.h" #include "libs/OnceFlag.h" -#include "light_config.h" - #include #include #include @@ -28,6 +26,10 @@ Copyright (C) 2016-2019 by Xose Pérez #include #include +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX +#include +#endif + extern "C" { #include "libs/fs_math.h" } @@ -42,6 +44,8 @@ extern "C" { #endif +#include "light_config.h" + // ----------------------------------------------------------------------------- #if RELAY_SUPPORT @@ -163,7 +167,6 @@ bool _light_state_changed = false; LightStateListener _light_state_listener = nullptr; #if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX -#include my92xx* _my92xx { nullptr }; #endif @@ -175,6 +178,36 @@ std::unique_ptr _light_provider; // UTILS // ----------------------------------------------------------------------------- +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX + +namespace settings { +namespace internal { + +template <> +my92xx_model_t convert(const String& value) { + if (value.length() == 1) { + switch (*value.c_str()) { + case 0x01: + return MY92XX_MODEL_MY9291; + case 0x02: + return MY92XX_MODEL_MY9231; + } + } else { + if (value == "9291") { + return MY92XX_MODEL_MY9291; + } else if (value == "9231") { + return MY92XX_MODEL_MY9231; + } + } + + return Light::build::my92xxModel(); +} + +} // namespace internal +} // namespace settings + +#endif + bool _setValue(unsigned char, unsigned int) __attribute__((warn_unused_result)); bool _setValue(unsigned char id, unsigned int value) { if (_light_channels[id].value != value) { @@ -285,7 +318,8 @@ char _lightTag(size_t channels, unsigned char index) { constexpr size_t Columns { 5ul }; constexpr size_t Rows { 5ul }; - if (channels < Rows) { + auto row = channels - 1ul; + if (row < Rows) { constexpr char tags[Rows][Columns] = { {'W', 0, 0, 0, 0}, {'W', 'C', 0, 0, 0}, @@ -294,7 +328,7 @@ char _lightTag(size_t channels, unsigned char index) { {'R', 'G', 'B', 'W', 'C'}, }; - return tags[channels][index]; + return tags[row][index]; } return 0; @@ -658,7 +692,7 @@ void _lightAdjustMireds(const String& payload) { namespace { // Gamma Correction lookup table (8 bit, ~2.2) -// (note that the table could be constexpr, *but* the whole function needs to be constexpr as well) +// (TODO: could be constexpr, but the gamma table is still loaded into the RAM when marked as if it is a non-constexpr array) uint8_t _lightGammaMap(uint8_t value) { static uint8_t gamma[256] PROGMEM { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -731,7 +765,7 @@ public: } float diff = static_cast(channel.target) - channel.current; - if (isImmediateTransition(target_state, diff)) { + if (isImmediate(target_state, diff)) { Transition transition { channel.current, channel.target, diff, 1}; _transitions.push_back(std::move(transition)); return false; @@ -807,7 +841,7 @@ public: } private: - bool isImmediateTransition(bool state, float diff) { + bool isImmediate(bool state, float diff) { return (!_time || (_step >= _time) || (std::abs(diff) <= std::numeric_limits::epsilon())); } @@ -887,8 +921,15 @@ void _lightProviderSchedule(unsigned long ms); #if (LIGHT_PROVIDER == LIGHT_PROVIDER_DIMMER) || (LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX) -// there is no PWM stop and it seems my92xx version is fine by just setting 0 values for channels -void _lightProviderHandleState(bool) { +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX +unsigned char _light_my92xx_channel_map[Light::ChannelsMax] = {}; +#endif + +// there is no PWM stop, but my92xx has some internal state control that will send 0 as values when OFF +void _lightProviderHandleState(bool state [[gnu::unused]]) { +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX + _my92xx->setState(state); +#endif } // See cores/esp8266/WMath.cpp::map @@ -912,7 +953,7 @@ void _lightProviderHandleValue(unsigned char channel, float value) { #if LIGHT_PROVIDER == LIGHT_PROVIDER_DIMMER pwm_set_duty(pwm, channel); #elif LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX - _my92xx->setChannel(Light::build::my92xxChannel(channel), pwm); + _my92xx->setChannel(_light_my92xx_channel_map[channel], pwm); #endif } @@ -920,7 +961,6 @@ void _lightProviderHandleUpdate() { #if LIGHT_PROVIDER == LIGHT_PROVIDER_DIMMER pwm_start(); #elif LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX - _my92xx->setState(true); _my92xx->update(); #endif } @@ -1605,7 +1645,8 @@ void _lightInitCommands() { terminalRegisterCommand(F("CHANNEL"), [](const terminal::CommandContext& ctx) { auto channels = lightChannels(); - if (channels) { + if (!channels) { + terminalError(ctx, F("No channels configured")); return; } @@ -1622,6 +1663,7 @@ void _lightInitCommands() { for (unsigned char index = 0; index < channels; ++index) { description(index); } + terminalOK(ctx); return; } @@ -1931,16 +1973,11 @@ const unsigned long _light_iofunc[16] PROGMEM = { namespace { inline bool _lightUseGamma(size_t channels, unsigned char index) { - if (_light_has_color && _light_use_gamma) { - switch (_lightTag(channels, index)) { - case 'R': - case 'G': - case 'B': - return true; - case 'W': - case 'C': - return false; - } + switch (_lightTag(channels, index)) { + case 'R': + case 'G': + case 'B': + return true; } return false; @@ -1994,9 +2031,13 @@ void _lightConfigure() { _light_use_gamma = getSetting("useGamma", 1 == LIGHT_USE_GAMMA); for (unsigned char index = 0; index < lightChannels(); ++index) { +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX + _light_my92xx_channel_map[index] = getSetting({"ltMy92xxCh", index}, Light::build::my92xxChannel(index)); +#endif _light_channels[index].inverse = getSetting({"ltInv", index}, Light::build::inverse(index)); - _light_channels[index].gamma = _lightUseGamma(channels, index); + _light_channels[index].gamma = (_light_has_color && _light_use_gamma) && _lightUseGamma(channels, index); } + } #if RELAY_SUPPORT @@ -2135,8 +2176,17 @@ void lightSetup() { #if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX { - _my92xx = new my92xx(MY92XX_MODEL, MY92XX_CHIPS, MY92XX_DI_PIN, MY92XX_DCKI_PIN, MY92XX_COMMAND); - for (unsigned char index = 0; index < Light::Channels; ++index) { + // TODO: library API specifies some hard-coded amount of channels, based off of the model and chips + // we always map channel index 1-to-1, to simplify hw config, but most of the time there are less active channels + // than the value generated by the lib (ref. `my92xx::getChannels()`) + auto channels = getSetting("ltMy92xxChannels", Light::build::my92xxChannels()); + _my92xx = new my92xx( + getSetting("ltMy92xxModel", Light::build::my92xxModel()), + getSetting("ltMy92xxChips", Light::build::my92xxChips()), + getSetting("ltMy92xxDiGPIO", Light::build::my92xxDiPin()), + getSetting("ltMy92xxDckiGPIO", Light::build::my92xxDckiPin()), + Light::build::my92xxCommand()); + for (unsigned char index = 0; index < channels; ++index) { _light_channels.emplace_back(GPIO_NONE); } } diff --git a/code/espurna/light.h b/code/espurna/light.h index e98356b8..889fef1b 100644 --- a/code/espurna/light.h +++ b/code/espurna/light.h @@ -21,7 +21,6 @@ // TODO: lowercase namespace Light { -constexpr size_t Channels = LIGHT_CHANNELS; constexpr size_t ChannelsMax = 5; constexpr long ValueMin = LIGHT_MIN_VALUE; diff --git a/code/espurna/light_config.h b/code/espurna/light_config.h index 629123bd..0d435385 100644 --- a/code/espurna/light_config.h +++ b/code/espurna/light_config.h @@ -35,15 +35,41 @@ constexpr bool inverse(unsigned char index) { ); } +#if LIGHT_PROVIDER == LIGHT_PROVIDER_MY92XX + +constexpr my92xx_cmd_t my92xxCommand() { + return MY92XX_COMMAND; +} + +constexpr unsigned char my92xxChannels() { + return MY92XX_CHANNELS; +} + +constexpr my92xx_model_t my92xxModel() { + return MY92XX_MODEL; +} + +constexpr int my92xxChips() { + return MY92XX_CHIPS; +} + +constexpr int my92xxDiPin() { + return MY92XX_DI_PIN; +} + +constexpr int my92xxDckiPin() { + return MY92XX_DCKI_PIN; +} + #ifdef MY92XX_MAPPING -constexpr unsigned char _my92xx_mapping[LIGHT_CHANNELS] { +constexpr unsigned char _my92xx_mapping[MY92XX_CHANNELS] { MY92XX_MAPPING }; constexpr unsigned char my92xxChannel(unsigned char) __attribute__((deprecated("MY92XX_CH# flags should be used instead of MY92XX_MAPPING"))); -constexpr unsigned char _lightMy92xxChannel(unsigned char channel) { +constexpr unsigned char my92xxChannel(unsigned char channel) { return _my92xx_mapping[channel]; } @@ -54,10 +80,12 @@ constexpr unsigned char my92xxChannel(unsigned char channel) { (channel == 1) ? MY92XX_CH2 : (channel == 2) ? MY92XX_CH3 : (channel == 3) ? MY92XX_CH4 : - (channel == 4) ? MY92XX_CH5 : 255u; + (channel == 4) ? MY92XX_CH5 : Light::ChannelsMax; } -} // namespace build -} // namespace Light +#endif #endif + +} // namespace build +} // namespace Light diff --git a/code/test/build/light_dimmer.h b/code/test/build/light_dimmer.h index 0f56416e..760a935b 100644 --- a/code/test/build/light_dimmer.h +++ b/code/test/build/light_dimmer.h @@ -1,5 +1,4 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_DIMMER -#define LIGHT_CHANNELS 5 #define LIGHT_CH1_PIN 5 #define LIGHT_CH2_PIN 4 #define LIGHT_CH3_PIN 12 diff --git a/code/test/build/light_my92xx.h b/code/test/build/light_my92xx.h index 2888a703..c9e5e3a1 100644 --- a/code/test/build/light_my92xx.h +++ b/code/test/build/light_my92xx.h @@ -1,10 +1,10 @@ #define LIGHT_PROVIDER LIGHT_PROVIDER_MY92XX -#define LIGHT_CHANNELS 5 #define MY92XX_MODEL MY92XX_MODEL_MY9231 #define MY92XX_CHIPS 2 #define MY92XX_DI_PIN 1 #define MY92XX_DCKI_PIN 2 #define MY92XX_COMMAND MY92XX_COMMAND_DEFAULT +#define MY92XX_CHANNELS 5 #define MY92XX_CH1 4 #define MY92XX_CH2 3 #define MY92XX_CH3 5