/* * * Copyright (c) 2022 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. */ /********************************************************** * Includes *********************************************************/ #include "TemperatureManager.h" #include "AppTask.h" #include "hdc2010.h" #include "platform/CHIPDeviceLayer.h" /********************************************************** * Defines and Constants *********************************************************/ using namespace chip; using namespace ::chip::DeviceLayer; constexpr EndpointId kThermostatEndpoint = 1; using namespace ::chip::app::Clusters::Thermostat; namespace ThermAttr = chip::app::Clusters::Thermostat::Attributes; /********************************************************** * Variable declarations *********************************************************/ TemperatureManager TemperatureManager::sTempMgr; CHIP_ERROR TemperatureManager::Init() { app::DataModel::Nullable temp; int16_t heatingSetpoint, coolingSetpoint; ThermAttr::LocalTemperature::Get(kThermostatEndpoint, temp); ThermAttr::OccupiedCoolingSetpoint::Get(kThermostatEndpoint, &coolingSetpoint); ThermAttr::OccupiedHeatingSetpoint::Get(kThermostatEndpoint, &heatingSetpoint); ThermAttr::SystemMode::Get(kThermostatEndpoint, &mThermMode); mCurrentTempCelsius = 0; mCurrentHumidity = 0; mHeatingCelsiusSetPoint = ConvertToPrintableTemp(coolingSetpoint); mCoolingCelsiusSetPoint = ConvertToPrintableTemp(heatingSetpoint); return CHIP_NO_ERROR; } void TemperatureManager::SensorInterruptHandler() { ThermAttr::LocalTemperature::Set(kThermostatEndpoint, wiced_hdc2010_read_temp() * 100); mCurrentHumidity = wiced_hdc2010_read_humidity(); } int8_t TemperatureManager::ConvertToPrintableTemp(int16_t temperature) { constexpr uint8_t kRoundUpValue = 50; // Round up the temperature as we won't print decimals on LCD // Is it a negative temperature if (temperature < 0) { temperature -= kRoundUpValue; } else { temperature += kRoundUpValue; } return static_cast(temperature / 100); } void TemperatureManager::AttributeChangeHandler(EndpointId endpointId, AttributeId attributeId, uint8_t * value, uint16_t size) { switch (attributeId) { case ThermAttr::LocalTemperature::Id: { int8_t Temp = ConvertToPrintableTemp(*((int16_t *) value)); ChipLogDetail(Zcl, "Local temp %d", Temp); mCurrentTempCelsius = Temp; } break; case ThermAttr::OccupiedCoolingSetpoint::Id: { int8_t coolingTemp = ConvertToPrintableTemp(*((int16_t *) value)); ChipLogDetail(Zcl, "CoolingSetpoint %d", coolingTemp); mCoolingCelsiusSetPoint = coolingTemp; } break; case ThermAttr::OccupiedHeatingSetpoint::Id: { int8_t heatingTemp = ConvertToPrintableTemp(*((int16_t *) value)); ChipLogDetail(Zcl, "HeatingSetpoint %d", heatingTemp); mHeatingCelsiusSetPoint = heatingTemp; } break; case ThermAttr::SystemMode::Id: { ChipLogDetail(Zcl, "SystemMode %d", static_cast(*value)); SystemModeEnum mode = static_cast(*value); if (mThermMode != mode) { mThermMode = mode; } } break; default: { ChipLogDetail(Zcl, "Unhandled thermostat attribute %lx", attributeId); return; } break; } } SystemModeEnum TemperatureManager::GetMode() { return mThermMode; } int16_t TemperatureManager::GetCurrentTemp() { return mCurrentTempCelsius; } uint8_t TemperatureManager::GetCurrentHumidity() { return mCurrentHumidity; } int8_t TemperatureManager::GetHeatingSetPoint() { return mHeatingCelsiusSetPoint; } int8_t TemperatureManager::GetCoolingSetPoint() { return mCoolingCelsiusSetPoint; }