/* * * 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" 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; 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) { // turn off then turn on Set(false); Set(true); 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"); } 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(enum led_color color) { filogic_led_color_t _color = FILOGIC_LED_OFF; switch (color) { case LED_RED: _color = FILOGIC_LED_R; case LED_GREEN: _color = FILOGIC_LED_G; case LED_BLUE: _color = FILOGIC_LED_B; } switch (mLed) { case LED_LIGHT: filogic_led_light_color(_color); break; case LED_STATUS: filogic_led_status_color(_color); break; } printf("%s color %d\n", Name(), color); }