REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
shblock.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3//
4// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
5
6#include "shblock.h"
7
9 : f_meta(block_address), set_track(bus::replace_function_idx(block_address, 2)),
10 set_track_at_ic(bus::replace_function_idx(block_address, 3)),
11 set_gain(bus::replace_function_idx(block_address, 4)),
12 set_gain_channels_zero_to_seven(bus::replace_function_idx(block_address, 5)),
13 set_gain_channels_eight_to_fifteen(bus::replace_function_idx(block_address, 6)),
14 set_inject(bus::replace_function_idx(block_address, 7)) {}
15
17 if (hardware)
18 return hardware->get_entity_eui();
19 return {};
20}
21
23 set_track.trigger();
24 delayMicroseconds(track_time);
25 set_inject.trigger();
26 delayMicroseconds(inject_time);
27}
28
29FLASHMEM void blocks::SHBlockHAL::set_state(SHState state) const {
30 switch (state) {
31 case SHState::TRACK:
32 set_track.trigger();
33 break;
35 set_track_at_ic.trigger();
36 break;
37 case SHState::INJECT:
38 set_inject.trigger();
39 break;
41 set_gain.trigger();
42 set_gain_channels_zero_to_seven.trigger();
43 break;
45 set_gain.trigger();
46 set_gain_channels_eight_to_fifteen.trigger();
47 break;
48 }
49}
50
51FLASHMEM blocks::SHBlock::SHBlock(SHBlockHAL *hardware) : FunctionBlock("SH"), hardware(hardware) {
52 classifier.class_enum = CLASS_;
53}
54
55FLASHMEM void blocks::SHBlock::set_state(SHState state_) { state = state_; }
56
57FLASHMEM blocks::SHState blocks::SHBlock::get_state() const { return state; }
58
63
65 hardware->set_state(state);
67}
68
69FLASHMEM void blocks::SHBlock::compensate_hardware_offsets(uint32_t track_time, uint32_t inject_time) {
70 hardware->compensate_hardware_offsets(track_time, inject_time);
71 state = SHState::INJECT;
72}
73
75 // return utils::status("SHBlock does not accept configuration");
76
77 // FOR TESTING
78 if (cfg.containsKey("state")) {
79 if (cfg["state"] == "TRACK")
80 set_state(blocks::SHState::TRACK);
81 else if (cfg["state"] == "TRACK_AT_IC")
83 else if (cfg["state"] == "INJECT")
84 set_state(blocks::SHState::INJECT);
85 else if (cfg["state"] == "GAIN_ZERO_TO_SEVEN")
87 else if (cfg["state"] == "GAIN_EIGHT_TO_FIFTEEN")
89 else
90 return utils::status("Unknown target state for SH Block");
91 }
92 return utils::status(0);
93}
94
95FLASHMEM
96blocks::SHBlock *blocks::SHBlock::from_entity_classifier(entities::EntityClassifier classifier,
97 bus::addr_t block_address) {
98 if (!classifier or classifier.class_enum != CLASS_)
99 return nullptr;
100
101 // Currently, there are no different variants
102 if (classifier.variant != entities::EntityClassifier::DEFAULT_)
103 return nullptr;
104
105 if (classifier.version < entities::Version(0, 1))
106 return nullptr;
107 if (classifier.version < entities::Version(0, 2)) {
108 auto *new_block = new SHBlock(new SHBlockHAL(block_address));
109 new_block->classifier = classifier;
110 return new_block;
111 }
112 return nullptr;
113}
A function block represents one module in a cluster, such as an M-Block, C-Block, I-Block or U-Block.
Definition base.h:29
void compensate_hardware_offsets(uint32_t track_time, uint32_t inject_time)
Definition shblock.cpp:22
void set_state(SHState state) const
Definition shblock.cpp:29
SHBlockHAL(bus::addr_t block_address)
Definition shblock.cpp:8
static constexpr auto CLASS_
Definition shblock.h:39
SHState get_state() const
Definition shblock.cpp:57
metadata::eui_t get_entity_eui() const override
Definition shblock.cpp:16
void reset(entities::ResetAction action) override
Resets all internal states. Block is left in inject mode afterwards. Requires write_to_hardware()
Definition shblock.cpp:59
static SHBlock * from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address)
Definition shblock.cpp:96
utils::status config_self_from_json(JsonObjectConst cfg) override
Deserialize a new configuration for this entity from a JsonObject.
Definition shblock.cpp:74
utils::status write_to_hardware() override
Applies current class state to actually hardware.
Definition shblock.cpp:64
void set_state(SHState state_)
Sets the state the SHBlock currently is in.
Definition shblock.cpp:55
void compensate_hardware_offsets(uint32_t track_time=10000, uint32_t inject_time=5000)
Definition shblock.cpp:69
EntityClassifier classifier
Definition base.h:217
A recoverable error, inspired from https://abseil.io/docs/cpp/guides/status and https://github....
Definition error.h:35
static status success()
Syntactic sugar for success.
Definition error.h:104
uint32_t
Definition flasher.cpp:195
SHState
Definition shblock.h:14
Definition bus.h:22
uint16_t addr_t
Definition bus.h:27
std::array< uint8_t, 8 > eui_t
Definition base.h:20
bool has(uint8_t other)
Definition base.h:111
static constexpr uint8_t CIRCUIT_RESET
Definition base.h:102