mirror of
https://github.com/thelsing/knx.git
synced 2025-09-18 17:52:44 +02:00
* initial comic * save work * Handle SystemBroadcast and Broadcast for TP and IP * Rework * Fix comment * save work * save work * save work * save work * save work * Restore old broadcast structure * Readd systembroadcast methods * Make sure that services from SystemBroadcast are also available from Broadcast on closed media * save work * Save work * save work * Save work * save work * save work * save work * save work * save work * Change maximum number of elements for the key tables, etc. * save work * First working seqno sync with ETS * save work * save work * save work * save work * save work * save work * Remove magic value and add comment * save work * Extend restart and masterreset for factory reset * save work * First working secure broadcast mode with IA programming * Add FunctionPropertyExt* AL services * Fix FunctionPropertyExt*. Working T_DATA_CONNECTED with FunctionPropertyExt*. * Add PropertyValueExt* AL services. Handle master reset in AL service RESTART. * Fix FunctionPropertyExtStateRead, fix restart. MILESTONE: Working physical programming of IA and toolkey with confirmed restart. Reading deviceinfos working. * Handle PDT_CONTROL in FunctionPropertyExt* * Fix FunctionPropertyExt* and FunctionProperty for PDT_CONTROL * Change comment. * save work * save work * Add group object security handling * Move map to own file * use simple_map * Include simple_map.h in CmakeFile * Move code from header to source file * Remove obsolete code * MILESTONE: working programming of secure device with IA and tables * cleanup * bugfix * flashSize must be big enough. Security IF object contains a lot more data. * Merge master into feat_datasecure * Revert "Merge master into feat_datasecure" This reverts commit0c8358692a
. * Revert "Revert "Merge master into feat_datasecure"" This reverts commitaa59253785
. * Bugfixes * cleanup * cleanup * Add printing of uint64_t * Don't compile secapplayer if data secure not enabled * pin platform for ESP8266 to specific version * SecIfObject: save/restore required for persisting STATE. Bugfix: use correct PID for group key table * Cleanup comment and debug output * Further cleanup. * Refactor master reset * Remove unused IP data link layer test code * Only reset TOOL kkey to FDSK on factory reset * Modify .gitignore and remove vscode config file * Correct comment * Handle SBC flag (systembroadcast) in SCF field. Couplers between open and closed media need this. * Remove code that slipped in.
132 lines
3.0 KiB
C++
132 lines
3.0 KiB
C++
#pragma once
|
|
|
|
// Provides a simple unordered map which is based on two arrays of different data types, namely K and V.
|
|
// One array is used for the keys, the other array is used for the values.
|
|
// Tracking of free/occupied slots in the arrays is realized by a bitmask of size uint64_t.
|
|
// As a result the maximum size of the map is 64 entries.
|
|
// If a non-primitive data type is required for the key by using a "class" or "struct",
|
|
// then the operator== has to be provided by that class/struct:
|
|
// bool operator ==(const K&) const { return true/false; }
|
|
|
|
template <typename K, typename V, int SIZE>
|
|
class Map
|
|
{
|
|
public:
|
|
Map()
|
|
{
|
|
static_assert (SIZE <= 64, "Map is too big! Max. 64 elements.");
|
|
}
|
|
|
|
void clear()
|
|
{
|
|
_validEntries = 0;
|
|
}
|
|
|
|
bool empty()
|
|
{
|
|
return (_validEntries == 0);
|
|
}
|
|
|
|
uint8_t size()
|
|
{
|
|
uint8_t size = 0;
|
|
|
|
for (uint8_t i = 0; i < SIZE; i++)
|
|
{
|
|
size += (((_validEntries >> i) & 0x01) == 0x01) ? 1 : 0;
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
bool insert(K key, V value)
|
|
{
|
|
uint8_t index = getNextFreeIndex();
|
|
if (index != noFreeEntryFoundIndex)
|
|
{
|
|
keys[index] = key;
|
|
values[index] = value;
|
|
|
|
_validEntries |= 1 << index;
|
|
return true;
|
|
}
|
|
|
|
// No free space
|
|
return false;
|
|
}
|
|
|
|
bool insertOrAssign(K key, V value)
|
|
{
|
|
// Try to find the key
|
|
for (uint8_t i = 0; i < SIZE; i++)
|
|
{
|
|
// Check if this array slot is occupied
|
|
if ((_validEntries >> i) & 0x01)
|
|
{
|
|
// Key found?
|
|
if (keys[i] == key)
|
|
{
|
|
values[i] = value;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Key does not exist, add it if enough space
|
|
return insert(key, value);
|
|
}
|
|
|
|
bool erase(K key)
|
|
{
|
|
for (uint8_t i = 0; i < SIZE; i++)
|
|
{
|
|
if ((_validEntries >> i) & 0x01)
|
|
{
|
|
if (keys[i] == key)
|
|
{
|
|
_validEntries &= ~(1 << i);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
V* get(K key)
|
|
{
|
|
// Try to find the key
|
|
for (uint8_t i = 0; i < SIZE; i++)
|
|
{
|
|
// Check if this array slot is occupied
|
|
if ((_validEntries >> i) & 0x01)
|
|
{
|
|
// Key found?
|
|
if (keys[i] == key)
|
|
{
|
|
return &values[i];
|
|
}
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
private:
|
|
uint8_t getNextFreeIndex()
|
|
{
|
|
for (uint8_t i = 0; i < SIZE; i++)
|
|
{
|
|
if (((_validEntries >> i) & 0x01) == 0)
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return noFreeEntryFoundIndex;
|
|
}
|
|
|
|
uint64_t _validEntries{0};
|
|
K keys[SIZE];
|
|
V values[SIZE];
|
|
static constexpr uint8_t noFreeEntryFoundIndex = 255;
|
|
};
|