REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
entity.h
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
4
5#pragma once
6
7#include <array>
8
9#include "entity/base.h"
10
11#include "bus/bus.h"
12#include "metadata/metadata.h"
13#include "utils/logging.h"
14
15namespace metadata {
16
21enum class LayoutVersion : uint8_t { V1 = 1 };
22
23struct __attribute__((packed)) MetadataMemoryLayoutV1 {
24 constexpr static size_t data_size = 256 - 17;
25 const LayoutVersion version;
26 const uint16_t size;
27 const entities::EntityClassifier classifier;
28 const uint8_t entity_data[data_size];
29 const uint8_t uuid[8];
30};
31
33public:
35
36 entities::EntityClassifier read_entity_classifier() const {
37 std::array<uint8_t, sizeof(entities::EntityClassifier)> data{0};
38 EEPROM25AA02::read(offsetof(MetadataMemoryLayoutV1, classifier), data.size(), data.data());
39 return {data[0], data[1], data[2], data[3], data[4], data[5]};
40 }
41
42 eui_t read_eui() const {
43 eui_t data{0};
44 EEPROM25AA02::read(offsetof(MetadataMemoryLayoutV1, uuid), data.size(), data.data());
45 return data;
46 }
47
48 bool write_entity_classifier(const entities::EntityClassifier &classifier) const {
49 return EEPROM25AA02::write(offsetof(MetadataMemoryLayoutV1, classifier), sizeof(classifier),
50 reinterpret_cast<const uint8_t *>(std::addressof(classifier)));
51 }
52
53 // we don't delete functions -- where is the point?
54};
55
56// Convenience function to read a classifier
57entities::EntityClassifier read_classifier(bus::addr_t address);
58
59// Convenience function to write a classifier
60bool write_classifier(const entities::EntityClassifier &classifier, const bus::addr_t target_address);
61
62// Convenience function to read a EUI
64
65} // namespace metadata
66
67namespace entities {
68
69template <class BlockT> BlockT *detect(const bus::addr_t block_address) {
70 LOG(ANABRID_DEBUG_INIT, __PRETTY_FUNCTION__);
71 auto classifier = metadata::read_classifier(block_address);
72 LOG(ANABRID_DEBUG_INIT, (std::string("Read classifier ") + classifier.to_string() + " at address " +
73 std::to_string(block_address) + ".")
74 .c_str());
75
76 switch (classifier.class_enum) {
80 return nullptr;
90 return BlockT::from_entity_classifier(classifier, block_address);
91 }
92 return nullptr;
93}
94
95} // namespace entities
EEPROM25AA02(bus::addr_t address)
bool write_entity_classifier(const entities::EntityClassifier &classifier) const
Definition entity.h:48
eui_t read_eui() const
Definition entity.h:42
entities::EntityClassifier read_entity_classifier() const
Definition entity.h:36
uint32_t uint32_t size
Definition flasher.cpp:63
#define LOG(LOG_FLAG, message)
Definition logging.h:36
uint16_t addr_t
Definition bus.h:27
BlockT * detect(const bus::addr_t block_address)
Definition entity.h:69
eui_t read_eui(bus::addr_t address)
Definition entity.cpp:14
entities::EntityClassifier read_classifier(bus::addr_t address)
Definition entity.cpp:3
LayoutVersion
This structure describes the 256 byte memory of the 25AA02E64 EEPROMs in Memory Version 1.
Definition entity.h:21
std::array< uint8_t, 8 > eui_t
Definition base.h:20
bool write_classifier(const entities::EntityClassifier &classifier, const bus::addr_t target_address)
Definition entity.cpp:8
struct __attribute__((packed)) MetadataMemoryLayoutV1
Definition entity.h:23