/* * * Copyright (c) 2021-2023 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "LEDWidget.h" #include "ColorFormat.h" #if CONFIG_HAVE_DISPLAY #include "ScreenManager.h" #endif #include "led_strip.h" static const char TAG[] = "LEDWidget"; void LEDWidget::Init(void) { mState = false; mBrightness = UINT8_MAX; #if CONFIG_LED_TYPE_RMT rmt_config_t config = RMT_DEFAULT_CONFIG_TX((gpio_num_t) CONFIG_LED_GPIO, (rmt_channel_t) CONFIG_LED_RMT_CHANNEL); led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(1, (led_strip_dev_t) config.channel); config.clk_div = 2; rmt_config(&config); rmt_driver_install(config.channel, 0, 0); mStrip = led_strip_new_rmt_ws2812(&strip_config); mHue = 0; mSaturation = 0; #else mGPIONum = (gpio_num_t) CONFIG_LED_GPIO; ledc_timer_config_t ledc_timer = { .speed_mode = LEDC_LOW_SPEED_MODE, // timer mode .duty_resolution = LEDC_TIMER_8_BIT, // resolution of PWM duty .timer_num = LEDC_TIMER_1, // timer index .freq_hz = 5000, // frequency of PWM signal .clk_cfg = LEDC_AUTO_CLK, // Auto select the source clock }; ledc_timer_config(&ledc_timer); ledc_channel_config_t ledc_channel = { .gpio_num = mGPIONum, .speed_mode = LEDC_LOW_SPEED_MODE, .channel = LEDC_CHANNEL_0, .intr_type = LEDC_INTR_DISABLE, .timer_sel = LEDC_TIMER_1, .duty = 0, .hpoint = 0, }; ledc_channel_config(&ledc_channel); #endif // CONFIG_LED_TYPE_RMT } void LEDWidget::Set(bool state) { ESP_LOGI(TAG, "Setting state to %d", state ? 1 : 0); if (state == mState) return; mState = state; DoSet(); } void LEDWidget::Toggle() { ESP_LOGI(TAG, "Toggling state to %d", !mState); mState = !mState; DoSet(); } void LEDWidget::SetBrightness(uint8_t brightness) { ESP_LOGI(TAG, "Setting brightness to %d", brightness); if (brightness == mBrightness) return; mBrightness = brightness; DoSet(); } uint8_t LEDWidget::GetLevel() { return this->mBrightness; } bool LEDWidget::IsTurnedOn() { return this->mState; } #if CONFIG_LED_TYPE_RMT void LEDWidget::SetColor(uint8_t Hue, uint8_t Saturation) { if (Hue == mHue && Saturation == mSaturation) return; mHue = Hue; mSaturation = Saturation; DoSet(); } #endif // CONFIG_LED_TYPE_RMT void LEDWidget::DoSet(void) { uint8_t brightness = mState ? mBrightness : 0; #if CONFIG_LED_TYPE_RMT if (mStrip) { HsvColor_t hsv = { mHue, mSaturation, brightness }; RgbColor_t rgb = HsvToRgb(hsv); mStrip->set_pixel(mStrip, 0, rgb.r, rgb.g, rgb.b); mStrip->refresh(mStrip, 100); } #else if (mGPIONum < GPIO_NUM_MAX) { ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, brightness); ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0); } #endif // CONFIG_LED_TYPE_RMT #if CONFIG_HAVE_DISPLAY if (mVirtualLEDIndex != -1) { ScreenManager::SetVLED(mVirtualLEDIndex, mState); } #endif // CONFIG_HAVE_DISPLAY } #if CONFIG_DEVICE_TYPE_M5STACK void LEDWidget::SetVLED(int id1) { mVirtualLEDIndex = id1; if (mVirtualLEDIndex != -1) { ScreenManager::SetVLED(mVirtualLEDIndex, mState); } } #endif