/* * * Copyright (c) 2022-2023 Project CHIP Authors * 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 "AppTask.h" LOG_MODULE_DECLARE(app, CONFIG_CHIP_APP_LOG_LEVEL); namespace { k_timer sThermostatUpdateTimer; constexpr uint16_t kThermostatUpdateTimerPeriodMs = 30000; // 30s timer period } // namespace AppTask AppTask::sAppTask; CHIP_ERROR AppTask::Init(void) { CHIP_ERROR err; InitCommonParts(); err = SensorMgr().Init(); if (err != CHIP_NO_ERROR) { LOG_ERR("Init of the Sensor Manager failed"); return err; } err = TempMgr().Init(); if (err != CHIP_NO_ERROR) { LOG_ERR("TempMgr Init fail"); return err; } // Initialize temperature measurement timer k_timer_init(&sThermostatUpdateTimer, &AppTask::ThermostatUpdateTimerTimeoutCallback, nullptr); k_timer_user_data_set(&sThermostatUpdateTimer, this); k_timer_start(&sThermostatUpdateTimer, K_MSEC(kThermostatUpdateTimerPeriodMs), K_NO_WAIT); return CHIP_NO_ERROR; } void AppTask::ThermostatUpdateTimerTimeoutCallback(k_timer * timer) { if (!timer) { return; } AppEvent event; event.Type = AppEvent::kEventType_Timer; event.Handler = ThermostatUpdateTimerEventHandler; sAppTask.PostEvent(&event); } void AppTask::ThermostatUpdateTimerEventHandler(AppEvent * aEvent) { CHIP_ERROR ret; int16_t temperature; if (aEvent->Type != AppEvent::kEventType_Timer) { return; } ret = SensorMgr().GetTempAndHumMeasurValue(&temperature, NULL); if (ret != CHIP_NO_ERROR) { LOG_ERR("Update of the Temperature clusters failed"); return; } LOG_INF("Current temperature is (%d*0.01)°C", temperature); PlatformMgr().LockChipStack(); app::Clusters::Thermostat::Attributes::LocalTemperature::Set(kExampleEndpointId, temperature); PlatformMgr().UnlockChipStack(); // Start next timer to handle temp sensor. k_timer_start(&sThermostatUpdateTimer, K_MSEC(kThermostatUpdateTimerPeriodMs), K_NO_WAIT); } void AppTask::UpdateThermoStatUI(void) { LOG_INF("Thermostat Status - M:%d T:%d'C H:%d'C C:%d'C", TempMgr().GetMode(), TempMgr().GetCurrentTemp(), TempMgr().GetHeatingSetPoint(), TempMgr().GetCoolingSetPoint()); }