/* * * Copyright (c) 2018 Nest Labs, Inc. * All rights reserved. * * 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 "AppTask.h" #include using namespace chip::System::Platform::Layer; void LEDWidget::Init(gpio_num_t gpioNum) { mLastChangeTimeUS = 0; mBlinkOnTimeMS = 0; mBlinkOffTimeMS = 0; mGPIONum = gpioNum; if (gpioNum < GPIO_NUM_MAX) { gpio_set_direction(gpioNum, GPIO_MODE_OUTPUT); } } void LEDWidget::Invert(void) { Set(!mState); } void LEDWidget::Set(bool state) { mBlinkOnTimeMS = 0; mBlinkOffTimeMS = 0; DoSet(state); } void LEDWidget::Blink(uint32_t changeRateMS) { Blink(changeRateMS, changeRateMS); } void LEDWidget::Blink(uint32_t onTimeMS, uint32_t offTimeMS) { mBlinkOnTimeMS = onTimeMS; mBlinkOffTimeMS = offTimeMS; Animate(); } void LEDWidget::Animate() { if (mBlinkOnTimeMS != 0 && mBlinkOffTimeMS != 0) { int64_t nowUS = GetClock_MonotonicHiRes(); int64_t stateDurUS = ((mState) ? mBlinkOnTimeMS : mBlinkOffTimeMS) * 1000LL; int64_t nextChangeTimeUS = mLastChangeTimeUS + stateDurUS; if (nowUS > nextChangeTimeUS) { DoSet(!mState); mLastChangeTimeUS = nowUS; } } } void LEDWidget::DoSet(bool state) { mState = state; if (mGPIONum < GPIO_NUM_MAX) { gpio_set_level(mGPIONum, (state) ? 1 : 0); } }