/* * * Copyright (c) 2021 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 #include #include #include "LEDWidget.h" #define MIN_LVL (1) #define MAX_LVL (254) void LEDWidget::TimerHandler(TimerHandle_t xTimer) { LEDWidget * led_widget = (LEDWidget *) pvTimerGetTimerID(xTimer); led_widget->Toggle(); } void LEDWidget::StartTimer(uint32_t aTimeoutInMs) { if (xTimerIsTimerActive(mTimer)) CancelTimer(); assert(xTimerChangePeriod(mTimer, aTimeoutInMs / portTICK_PERIOD_MS, 100) == pdPASS); } void LEDWidget::CancelTimer(void) { assert(xTimerStop(mTimer, 0) == pdPASS); } void LEDWidget::Init(enum led_id led) { filogic_led_init(); mLed = led; mLevel = MAX_LVL; mTimer = xTimerCreate(Name(), 1, // == default timer period (mS) false, // no timer reload (==one-shot) (void *) this, // init timer id = app task obj context TimerHandler); // timer callback handler } const char * LEDWidget::Name(void) { const char * name; switch (mLed) { case LED_LIGHT: name = "LED_LIGHT"; break; case LED_STATUS: name = "LED_STATUS"; break; default: name = "LED UNKNOWN"; break; } return name; } void LEDWidget::Toggle(void) { Set(!mState); StartTimer(mState ? mOn : mOff); } void LEDWidget::DoBlink(void) { StartTimer(mOn); } void LEDWidget::DoSet(bool state) { switch (mLed) { case LED_LIGHT: filogic_led_light_toggle(state); break; case LED_STATUS: filogic_led_status_toggle(state); break; } mState = state; } void LEDWidget::Set(bool state) { CancelTimer(); DoSet(state); // printf("%s %s\n", Name(), state ? "on" : "off"); } bool LEDWidget::Get(void) { return mState; } void LEDWidget::Blink(int on, int off) { if (mOn != on || mOff != off) { mOn = on; mOff = off; // printf("%s blink: on %d off %d\n", Name(), mOn, mOff); DoBlink(); } } void LEDWidget::Blink(int duration) { Blink(duration, duration); } void LEDWidget::Color(RgbColor_t rgb) { filogic_led_color_t _color; _color.r = rgb.r; _color.g = rgb.g; _color.b = rgb.b; switch (mLed) { case LED_LIGHT: filogic_led_light_color(_color); break; case LED_STATUS: filogic_led_status_color(_color); break; } } void LEDWidget::SetLevel(uint8_t level) { uint8_t fdim = 0; if (level >= MIN_LVL && level <= MAX_LVL) { mLevel = level; } else { return; } fdim = (level - MIN_LVL) / ((MAX_LVL - MIN_LVL) / (filogic_led_get_max_dim_level() - filogic_led_get_min_dim_level())); if (fdim > filogic_led_get_max_dim_level()) { fdim = filogic_led_get_max_dim_level(); } if (mLed == LED_LIGHT) { filogic_led_light_dim(fdim); } else if (mLed == LED_STATUS) { filogic_led_status_dim(fdim); } else { assert(0); } } uint8_t LEDWidget::GetLevel(void) { uint8_t dim = 0; if (mLed == LED_LIGHT) { dim = filogic_led_light_get_cur_dim_level(); } else if (mLed == LED_STATUS) { dim = filogic_led_status_get_cur_dim_level(); } else { assert(0); } dim = dim * ((MAX_LVL - MIN_LVL) / (filogic_led_get_max_dim_level() - filogic_led_get_min_dim_level())); return dim; } uint8_t LEDWidget::GetMaxLevel(void) { return MAX_LVL; } uint8_t LEDWidget::GetMinLevel(void) { return MIN_LVL; }