blob: 57a3bd300af2e8560c686b9924f03da867200ba5 [file] [log] [blame]
/*
*
* Copyright (c) 2024 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.
*/
#pragma once
#include "PairingManager.h"
#include <app-common/zap-generated/cluster-objects.h>
#include <platform/CHIPDeviceLayer.h>
namespace admin {
class DeviceManager : public PairingDelegate
{
public:
DeviceManager() = default;
void Init();
chip::NodeId GetNextAvailableNodeId();
chip::NodeId GetRemoteBridgeNodeId() const { return mRemoteBridgeNodeId; }
void UpdateLastUsedNodeId(chip::NodeId nodeId);
void SetRemoteBridgeNodeId(chip::NodeId nodeId);
bool IsFabricSyncReady() const { return mRemoteBridgeNodeId != chip::kUndefinedNodeId; }
/**
* @brief Determines whether a given nodeId corresponds to the remote bridge device.
*
* @param nodeId The ID of the node being checked.
*
* @return true if the nodeId matches the remote bridge device; otherwise, false.
*/
bool IsCurrentBridgeDevice(chip::NodeId nodeId) const { return nodeId == mRemoteBridgeNodeId; }
/**
* @brief Pair a remote fabric bridge with a given node ID.
*
* This function initiates the pairing process for a remote fabric bridge using the specified parameters.
* @param nodeId The user-defined ID for the node being commissioned. It doesn’t need to be the same ID,
* as for the first fabric.
* @param setupPINCode The setup PIN code used to authenticate the pairing process.
* @param deviceRemoteIp The IP address of the remote device that is being paired as part of the fabric bridge.
* @param deviceRemotePort The secured device port of the remote device that is being paired as part of the fabric bridge.
*
* @return CHIP_ERROR Returns CHIP_NO_ERROR on success or an appropriate error code on failure.
*/
CHIP_ERROR PairRemoteFabricBridge(chip::NodeId nodeId, uint32_t setupPINCode, const char * deviceRemoteIp,
uint16_t deviceRemotePort);
/**
* @brief Pair a remote Matter device to the current fabric.
*
* This function initiates the pairing process for a remote device using the specified parameters.
* @param nodeId The user-defined ID for the node being commissioned. It doesn’t need to be the same ID,
* as for the first fabric.
* @param payload The the QR code payload or a manual pairing code generated by the first commissioner
* instance when opened commissioning window.
*
* @return CHIP_ERROR Returns CHIP_NO_ERROR on success or an appropriate error code on failure.
*/
CHIP_ERROR PairRemoteDevice(chip::NodeId nodeId, const char * payload);
/**
* @brief Pair a remote Matter device to the current fabric.
*
* This function initiates the pairing process for a remote device using the specified parameters.
* @param nodeId The user-defined ID for the node being commissioned. It doesn’t need to be the same ID,
* as for the first fabric.
* @param setupPINCode The setup PIN code used to authenticate the pairing process.
* @param deviceRemoteIp The IP address of the remote device that is being paired as part of the fabric bridge.
* @param deviceRemotePort The secured device port of the remote device that is being paired as part of the fabric bridge.
*
* @return CHIP_ERROR Returns CHIP_NO_ERROR on success or an appropriate error code on failure.
*/
CHIP_ERROR PairRemoteDevice(chip::NodeId nodeId, uint32_t setupPINCode, const char * deviceRemoteIp, uint16_t deviceRemotePort);
/**
* @brief Unpair the remote Matter fabric bridge.
*
* This function initiates the unpairing process for the remote Matter fabric bridge from the current fabric.
*
* @return CHIP_ERROR Returns CHIP_NO_ERROR on success or an appropriate error code on failure.
*/
CHIP_ERROR UnpairRemoteFabricBridge();
/**
* @brief Unpair a specific remote Matter device from the current fabric.
*
* This function removes a specific remote device, identified by the node ID, from the fabric.
*
* @param nodeId The user-defined ID of the node that is being unpaired.
*
* @return CHIP_ERROR Returns CHIP_NO_ERROR on success or an appropriate error code on failure.
*/
CHIP_ERROR UnpairRemoteDevice(chip::NodeId nodeId);
private:
friend DeviceManager & DeviceMgr();
void OnDeviceRemoved(chip::NodeId deviceId, CHIP_ERROR err) override;
static DeviceManager sInstance;
chip::NodeId mLastUsedNodeId = 0;
// The Node ID of the remote bridge used for Fabric-Sync
// This represents the bridge on the other ecosystem.
chip::NodeId mRemoteBridgeNodeId = chip::kUndefinedNodeId;
bool mInitialized = false;
};
/**
* Returns the public interface of the DeviceManager singleton object.
*
* Applications should use this to access features of the DeviceManager
* object.
*/
inline DeviceManager & DeviceMgr()
{
if (!DeviceManager::sInstance.mInitialized)
{
DeviceManager::sInstance.Init();
}
return DeviceManager::sInstance;
}
} // namespace admin