REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
entity_manager.h
Go to the documentation of this file.
1#pragma once
2
3#include <cassert>
4#include <unordered_map>
5
6#include <block/cblock.h>
7#include <block/ctrlblock.h>
8#include <block/iblock.h>
9#include <block/mblock.h>
10#include <block/shblock.h>
11#include <block/ublock.h>
12#include <entity/base.h>
13#include <entity/entity.h>
14
15namespace entities {
16
18 static EntityClassifier unknown() { return {EntityClass::UNKNOWN, 0, 0, 0, 0, 0}; }
19
20public:
21 EntityClassifier read_classifier(bus::addr_t address) {
22 // First look for classifiers
23 auto aiter = classifiers.find(address);
24 if(aiter != classifiers.end()) {
25 return aiter->second;
26 }
27
28 // Then look for entities
29 auto iter = entities.find(address);
30 if (iter == entities.end()) {
31 return unknown();
32 }
33 auto entity = iter->second;
34 return entity->get_entity_classifier();
35 }
36
37 void addEntity(bus::addr_t address, EntityClassifier classifier) {
38
39 blocks::FunctionBlock *new_entity_block;
40 switch (classifier.class_enum) {
41 case EntityClass::SH_BLOCK:
42 new_entity_block = blocks::SHBlock::from_entity_classifier(classifier, address);
43 break;
44 case EntityClass::CTRL_BLOCK:
45 new_entity_block = blocks::CTRLBlock::from_entity_classifier(classifier, address);
46 break;
47 case EntityClass::M_BLOCK:
48 new_entity_block = blocks::MBlock::from_entity_classifier(classifier, address);
49 break;
50 case EntityClass::U_BLOCK:
51 new_entity_block = blocks::UBlock::from_entity_classifier(classifier, address);
52 break;
53 case EntityClass::C_BLOCK:
54 new_entity_block = blocks::CBlock::from_entity_classifier(classifier, address);
55 break;
56 case EntityClass::I_BLOCK:
57 new_entity_block = blocks::IBlock::from_entity_classifier(classifier, address);
58 break;
59 default:
60 throw std::runtime_error("runtime error");
61 }
62
63 assert(new_entity_block != nullptr);
64 entities[address] = new_entity_block;
65 }
66
67 void addClassifier(bus::addr_t address, EntityClassifier classifier) {
68 classifiers[address] = classifier;
69 }
70
71private:
72 std::unordered_map<bus::addr_t, Entity *> entities;
73 std::unordered_map<bus::addr_t, EntityClassifier> classifiers;
74};
75
76extern EntityManager_ EntityManager;
77
78} // namespace entities
EntityClassifier read_classifier(bus::addr_t address)
void addClassifier(bus::addr_t address, EntityClassifier classifier)
void addEntity(bus::addr_t address, EntityClassifier classifier)
EntityManager_ EntityManager