/* * * Copyright (c) 2021 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 "SubDevice.h" #ifdef __cplusplus extern "C" { #endif #include #ifdef CONFIG_ENABLE_ASR_APP_MESH #include "app.h" #include "sonata_gap_api.h" #include "sonata_gatt_api.h" #endif #ifdef __cplusplus } #endif #include #include #include using namespace ::chip::Platform; SubDevice::SubDevice(const char * szSubDeviceName, const char * szLocation) { CopyString(mName, sizeof(mName), szSubDeviceName); CopyString(mLocation, sizeof(mLocation), szLocation); mState = kState_Off; mReachable = false; mEndpointId = 0; mChanged_CB = nullptr; } bool SubDevice::IsOn() const { return mState == kState_On; } bool SubDevice::IsReachable() const { return mReachable; } void SubDevice::SetOnOff(bool aOn) { bool changed; if (aOn) { changed = (mState != kState_On); mState = kState_On; ChipLogProgress(DeviceLayer, "SubDevice[%s]: ON", mName); #ifdef CONFIG_ENABLE_ASR_APP_MESH if (strcmp(mName, "Light 1") == 0) { app_mesh_control_fan(1); } else { app_mesh_control_light(1); } #endif } else { changed = (mState != kState_Off); mState = kState_Off; ChipLogProgress(DeviceLayer, "SubDevice[%s]: OFF", mName); #ifdef CONFIG_ENABLE_ASR_APP_MESH if (strcmp(mName, "Light 1") == 0) { app_mesh_control_fan(0); } else { app_mesh_control_light(0); } #endif } if (changed && mChanged_CB) { mChanged_CB(this, kChanged_State); } } void SubDevice::SetReachable(bool aReachable) { bool changed = (mReachable != aReachable); mReachable = aReachable; if (aReachable) { ChipLogProgress(DeviceLayer, "SubDevice[%s]: ONLINE", mName); } else { ChipLogProgress(DeviceLayer, "SubDevice[%s]: OFFLINE", mName); } if (changed && mChanged_CB) { mChanged_CB(this, kChanged_Reachable); } } void SubDevice::SetName(const char * szName) { bool changed = (strncmp(mName, szName, sizeof(mName)) != 0); ChipLogProgress(DeviceLayer, "SubDevice[%s]: New Name=\"%s\"", mName, szName); CopyString(mName, sizeof(mName), szName); if (changed && mChanged_CB) { mChanged_CB(this, kChanged_Name); } } void SubDevice::SetLocation(const char * szLocation) { bool changed = (strncmp(mLocation, szLocation, sizeof(mLocation)) != 0); CopyString(mLocation, sizeof(mLocation), szLocation); ChipLogProgress(DeviceLayer, "SubDevice[%s]: Location=\"%s\"", mName, mLocation); if (changed && mChanged_CB) { mChanged_CB(this, kChanged_Location); } } void SubDevice::SetChangeCallback(SubDeviceCallback_fn aChanged_CB) { mChanged_CB = aChanged_CB; }