text: /*
   *
   *    Copyright (c) 2021 Project CHIP Authors
   *
   *    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.
   */
  
  /**
   *    @file
   *      This file implements the CHIP Device Interface that is used by
   *      applications to interact with the CHIP stack
   *
   */
  
  #include <stdlib.h>
  
  #include "AppConfig.h"
  #include "CHIPDeviceManager.h"
  
  #include <app/ConcreteAttributePath.h>
  #include <app/util/basic-types.h>
  #include <lib/support/CHIPMem.h>
  #include <lib/support/CodeUtils.h>
  #include <lib/support/ErrorStr.h>
  #include <setup_payload/SetupPayload.h>
  
  using namespace ::chip;
  
  namespace chip {
  namespace DeviceManager {
  
  using namespace ::chip::DeviceLayer;
  
  void CHIPDeviceManager::CommonDeviceEventHandler(const ChipDeviceEvent * event, intptr_t arg)
  {
      CHIPDeviceManagerCallbacks * cb = reinterpret_cast<CHIPDeviceManagerCallbacks *>(arg);
      if (cb != nullptr)
      {
          cb->DeviceEventCallback(event, reinterpret_cast<intptr_t>(cb));
      }
  }
  
  CHIP_ERROR CHIPDeviceManager::Init(CHIPDeviceManagerCallbacks * cb)
  {
      mCB = cb;
  
      // Register a function to receive events from the CHIP device layer.  Note that calls to
      // this function will happen on the CHIP event loop thread, not the app_main thread.
      PlatformMgr().AddEventHandler(CHIPDeviceManager::CommonDeviceEventHandler, reinterpret_cast<intptr_t>(cb));
  
      // Start a task to run the CHIP Device event loop.
      return PlatformMgr().StartEventLoopTask();
  }
  } // namespace DeviceManager
  } // namespace chip
  
  void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t mask, uint8_t type,
                                         uint16_t size, uint8_t * value)
  {
      chip::DeviceManager::CHIPDeviceManagerCallbacks * cb =
          chip::DeviceManager::CHIPDeviceManager::GetInstance().GetCHIPDeviceManagerCallbacks();
      if (cb != nullptr)
      {
          cb->PostAttributeChangeCallback(attributePath.mEndpointId, attributePath.mClusterId, attributePath.mAttributeId, mask, type,
                                          size, value);
      }
  }
  
  chip::Protocols::InteractionModel::Status MatterPreAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath,
                                                                             uint8_t mask, uint8_t type, uint16_t size,
                                                                             uint8_t * value)
  {
      chip::DeviceManager::CHIPDeviceManagerCallbacks * cb =
          chip::DeviceManager::CHIPDeviceManager::GetInstance().GetCHIPDeviceManagerCallbacks();
      if (cb != nullptr)
      {
          return cb->PreAttributeChangeCallback(attributePath.mEndpointId, attributePath.mClusterId, attributePath.mAttributeId, mask,
                                                type, size, value);
      }
  
      return chip::Protocols::InteractionModel::Status::Success;
  }
  