blob: d6aa4d7f440ceb9e682ccf5bbf68f3cc0309e6bf [file] [log] [blame]
/**
*
* Copyright (c) 2020 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 API declarations for a binding table.
*/
#pragma once
#include <app/util/af-types.h>
#include <lib/core/CHIPPersistentStorageDelegate.h>
#include <lib/core/CHIPTLV.h>
#include <lib/support/DefaultStorageKeyAllocator.h>
namespace chip {
class BindingTable
{
friend class Iterator;
public:
BindingTable();
class Iterator
{
friend class BindingTable;
public:
EmberBindingTableEntry & operator*() { return mTable->mBindingTable[mIndex]; }
const EmberBindingTableEntry & operator*() const { return mTable->mBindingTable[mIndex]; }
EmberBindingTableEntry * operator->() { return &(mTable->mBindingTable[mIndex]); }
const EmberBindingTableEntry * operator->() const { return &(mTable->mBindingTable[mIndex]); }
Iterator operator++();
bool operator==(const Iterator & rhs) const { return mIndex == rhs.mIndex; }
bool operator!=(const Iterator & rhs) const { return mIndex != rhs.mIndex; }
uint8_t GetIndex() const { return mIndex; }
private:
BindingTable * mTable;
uint8_t mPrevIndex;
uint8_t mIndex;
};
CHIP_ERROR Add(const EmberBindingTableEntry & entry);
const EmberBindingTableEntry & GetAt(uint8_t index);
// The iter will be moved to the next item in the table after calling RemoveAt.
CHIP_ERROR RemoveAt(Iterator & iter);
// Returns the number of active entries in the binding table.
// *NOTE* The function does not return the capacity of the binding table.
uint8_t Size() const { return mSize; }
Iterator begin();
Iterator end();
void SetPersistentStorage(PersistentStorageDelegate * storage) { mStorage = storage; }
CHIP_ERROR LoadFromStorage();
static BindingTable & GetInstance() { return sInstance; }
private:
static BindingTable sInstance;
static constexpr uint32_t kStorageVersion = 1;
static constexpr uint8_t kEntryStorageSize = TLV::EstimateStructOverhead(
sizeof(FabricIndex), sizeof(EndpointId), sizeof(ClusterId), sizeof(EndpointId), sizeof(NodeId), sizeof(uint8_t));
static constexpr uint8_t kListInfoStorageSize = TLV::EstimateStructOverhead(sizeof(kStorageVersion), sizeof(uint8_t));
static constexpr uint8_t kTagStorageVersion = 1;
static constexpr uint8_t kTagHead = 2;
static constexpr uint8_t kTagFabricIndex = 1;
static constexpr uint8_t kTagLocalEndpoint = 2;
static constexpr uint8_t kTagCluster = 3;
static constexpr uint8_t kTagRemoteEndpoint = 4;
static constexpr uint8_t kTagNodeId = 5;
static constexpr uint8_t kTagGroupId = 6;
static constexpr uint8_t kTagNextEntry = 7;
static constexpr uint8_t kNextNullIndex = 255;
uint8_t GetNextAvaiableIndex();
CHIP_ERROR SaveEntryToStorage(uint8_t index, uint8_t nextIndex);
CHIP_ERROR SaveListInfo(uint8_t head);
CHIP_ERROR LoadEntryFromStorage(uint8_t index, uint8_t & nextIndex);
EmberBindingTableEntry mBindingTable[EMBER_BINDING_TABLE_SIZE];
uint8_t mNextIndex[EMBER_BINDING_TABLE_SIZE];
uint8_t mHead = kNextNullIndex;
uint8_t mTail = kNextNullIndex;
uint8_t mSize = 0;
PersistentStorageDelegate * mStorage;
};
} // namespace chip