nRF Connect SDK API 3.3.99
Loading...
Searching...
No Matches
bridge_manager.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5 */
6
7#pragma once
8
9#include "binding/binding_handler.h"
10#include "bridge_util.h"
11#include "util/finite_map.h"
14
15namespace Nrf
16{
17
19public:
21 static constexpr uint8_t kMaxBridgedDevicesPerProvider = CONFIG_BRIDGE_MAX_BRIDGED_DEVICES_NUMBER_PER_PROVIDER;
22 static constexpr chip::EndpointId kAggregatorEndpointId = CONFIG_BRIDGE_AGGREGATOR_ENDPOINT_ID;
23
24 using LoadStoredBridgedDevicesCallback = CHIP_ERROR (*)();
25
34 CHIP_ERROR Init(LoadStoredBridgedDevicesCallback loadStoredBridgedDevicesCb);
35
49 uint8_t deviceListSize, uint8_t devicesPairIndexes[]);
50
66 uint8_t deviceListSize, uint8_t devicesPairIndexes[], uint16_t endpointIds[]);
67
77 CHIP_ERROR RemoveBridgedDevice(uint16_t endpoint, uint8_t &devicesPairIndex);
78
88 CHIP_ERROR GetDevicesIndexes(uint8_t *indexes, uint8_t maxSize, uint8_t &count)
89 {
90 if (!indexes) {
91 return CHIP_ERROR_INVALID_ARGUMENT;
92 }
93
94 if (maxSize < mDevicesIndexesCounter) {
95 return CHIP_ERROR_BUFFER_TOO_SMALL;
96 }
97
98 memcpy(indexes, mDevicesIndexes, mDevicesIndexesCounter);
99 count = mDevicesIndexesCounter;
100 return CHIP_NO_ERROR;
101 }
102
110 BridgedDeviceDataProvider *GetProvider(chip::EndpointId endpoint, uint16_t &deviceType);
111
118 const char *GetNodeLabel(chip::EndpointId endpoint);
119
120 static CHIP_ERROR HandleRead(uint16_t index, chip::ClusterId clusterId,
121 const EmberAfAttributeMetadata *attributeMetadata, uint8_t *buffer,
122 uint16_t maxReadLength);
123 static CHIP_ERROR HandleWrite(uint16_t index, chip::ClusterId clusterId,
124 const EmberAfAttributeMetadata *attributeMetadata, uint8_t *buffer);
125 static void HandleUpdate(BridgedDeviceDataProvider &dataProvider, chip::ClusterId clusterId,
126 chip::AttributeId attributeId, void *data, size_t dataSize);
127 static void HandleCommand(BridgedDeviceDataProvider &dataProvider, chip::ClusterId clusterId,
128 chip::CommandId commandId, Nrf::Matter::BindingHandler::InvokeCommand invokeCommand);
129
131 {
132 static BridgeManager sInstance;
133 return sInstance;
134 }
135
136private:
137 struct BridgedDevicePair {
138 BridgedDevicePair() : mDevice(nullptr), mProvider(nullptr) {}
139 BridgedDevicePair(MatterBridgedDevice *device, BridgedDeviceDataProvider *dataProvider)
140 : mDevice(device), mProvider(dataProvider)
141 {
142 }
143
144 ~BridgedDevicePair()
145 {
146 chip::Platform::Delete(mDevice);
147 chip::Platform::Delete(mProvider);
148 mDevice = nullptr;
149 mProvider = nullptr;
150 }
151
152 /* Disable copy semantics and implement move semantics. */
153 BridgedDevicePair(const BridgedDevicePair &other) = delete;
154 BridgedDevicePair &operator=(const BridgedDevicePair &other) = delete;
155
156 BridgedDevicePair(BridgedDevicePair &&other)
157 {
158 mDevice = other.mDevice;
159 mProvider = other.mProvider;
160
161 other.mDevice = nullptr;
162 other.mProvider = nullptr;
163 }
164
165 BridgedDevicePair &operator=(BridgedDevicePair &&other)
166 {
167 if (this != &other) {
168 this->~BridgedDevicePair();
169 mDevice = other.mDevice;
170 mProvider = other.mProvider;
171 other.mDevice = nullptr;
172 other.mProvider = nullptr;
173 }
174 return *this;
175 }
176
177 operator bool() const { return mDevice || mProvider; }
178 bool operator==(const BridgedDevicePair &other)
179 {
180 return (mDevice == other.mDevice) || (mProvider == other.mProvider);
181 }
182
183 MatterBridgedDevice *mDevice;
184 BridgedDeviceDataProvider *mProvider;
185 };
186
187 static constexpr uint8_t kMaxDataProviders = CONFIG_BRIDGE_MAX_BRIDGED_DEVICES_NUMBER;
188
189 using DeviceMap = FiniteMap<uint16_t, BridgedDevicePair, kMaxBridgedDevices>;
190
204 CHIP_ERROR AddSingleDevice(MatterBridgedDevice *device, BridgedDeviceDataProvider *dataProvider,
205 chip::Optional<uint8_t> &devicesPairIndex, uint16_t endpointId);
206 CHIP_ERROR SafelyRemoveDevice(uint8_t index);
207
226 CHIP_ERROR DoAddBridgedDevices(MatterBridgedDevice *devices[], BridgedDeviceDataProvider *dataProvider,
227 uint8_t deviceListSize, uint8_t devicesPairIndexes[], uint16_t endpointIds[],
228 chip::Optional<uint8_t> indexes[]);
229
245 CHIP_ERROR AddDevices(MatterBridgedDevice *devices[], BridgedDeviceDataProvider *dataProvider,
246 uint8_t deviceListSize, chip::Optional<uint8_t> devicesPairIndexes[],
247 uint16_t endpointIds[]);
248
257 CHIP_ERROR CreateEndpoint(uint8_t index, uint16_t endpointId);
258
259 DeviceMap mDevicesMap;
260 uint16_t mNumberOfProviders{ 0 };
261 uint8_t mDevicesIndexes[BridgeManager::kMaxBridgedDevices] = { 0 };
262 uint8_t mDevicesIndexesCounter;
263
264 chip::EndpointId mFirstDynamicEndpointId;
265 chip::EndpointId mCurrentDynamicEndpointId;
266 bool mIsInitialized = false;
267};
268
269} /* namespace Nrf */
#define CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT
Definition chip_project_config.h:26
static void HandleCommand(BridgedDeviceDataProvider &dataProvider, chip::ClusterId clusterId, chip::CommandId commandId, Nrf::Matter::BindingHandler::InvokeCommand invokeCommand)
static CHIP_ERROR HandleRead(uint16_t index, chip::ClusterId clusterId, const EmberAfAttributeMetadata *attributeMetadata, uint8_t *buffer, uint16_t maxReadLength)
static constexpr uint8_t kMaxBridgedDevices
Definition bridge_manager.h:20
static void HandleUpdate(BridgedDeviceDataProvider &dataProvider, chip::ClusterId clusterId, chip::AttributeId attributeId, void *data, size_t dataSize)
CHIP_ERROR AddBridgedDevices(MatterBridgedDevice *devices[], BridgedDeviceDataProvider *dataProvider, uint8_t deviceListSize, uint8_t devicesPairIndexes[])
Add devices which are supposed to be bridged to the Bridge Manager.
const char * GetNodeLabel(chip::EndpointId endpoint)
Get the node label of the bridged device on the specified endpoint.
CHIP_ERROR Init(LoadStoredBridgedDevicesCallback loadStoredBridgedDevicesCb)
Initialize BridgeManager instance.
CHIP_ERROR GetDevicesIndexes(uint8_t *indexes, uint8_t maxSize, uint8_t &count)
Get bridged devices indexes.
Definition bridge_manager.h:88
CHIP_ERROR AddBridgedDevices(MatterBridgedDevice *devices[], BridgedDeviceDataProvider *dataProvider, uint8_t deviceListSize, uint8_t devicesPairIndexes[], uint16_t endpointIds[])
Add devices which are supposed to be bridged to the Bridge Manager using specific index and endpoint ...
static CHIP_ERROR HandleWrite(uint16_t index, chip::ClusterId clusterId, const EmberAfAttributeMetadata *attributeMetadata, uint8_t *buffer)
static constexpr chip::EndpointId kAggregatorEndpointId
Definition bridge_manager.h:22
CHIP_ERROR(*)() LoadStoredBridgedDevicesCallback
Definition bridge_manager.h:24
BridgedDeviceDataProvider * GetProvider(chip::EndpointId endpoint, uint16_t &deviceType)
Get the data provider stored on the specified endpoint.
static constexpr uint8_t kMaxBridgedDevicesPerProvider
Definition bridge_manager.h:21
static BridgeManager & Instance()
Definition bridge_manager.h:130
CHIP_ERROR RemoveBridgedDevice(uint16_t endpoint, uint8_t &devicesPairIndex)
Remove bridged device.
Definition bridge_manager.h:18
Definition bridged_device_data_provider.h:17
Definition matter_bridged_device.h:85
Definition ble_connectivity_manager.h:21