/* * * 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 void LEDWidget::Init(gpio_num_t gpioNum) { mLastChangeTimeMS = 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) { uint64_t nowMS = chip::System::SystemClock().GetMonotonicMilliseconds64().count(); uint64_t stateDurMS = ((mState) ? mBlinkOnTimeMS : mBlinkOffTimeMS); uint64_t nextChangeTimeMS = mLastChangeTimeMS + stateDurMS; if (nextChangeTimeMS < nowMS) { DoSet(!mState); mLastChangeTimeMS = nowMS; } } } void LEDWidget::DoSet(bool state) { mState = state; if (mGPIONum < GPIO_NUM_MAX) { gpio_set_level(mGPIONum, (state) ? 1 : 0); } }