REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
ublock.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#include <cstdint>
9#include <utility>
10
11#include "block/base.h"
12#include "bus/functions.h"
13#include "chips/SR74HCT595.h"
14
15namespace platform {
16class Cluster;
17}
18
19namespace utils {
20
21void shift_5_left(uint8_t *buffer, size_t size);
22
23}
24
25namespace functions {
26
28public:
29 static const SPISettings DEFAULT_SPI_SETTINGS;
30
33
36 template <size_t num_of_outputs>
37 [[nodiscard]] bool transfer(const std::array<int8_t, num_of_outputs> &outputs) const;
38};
39
40} // namespace functions
41
42namespace blocks {
43
44class MBlock;
45class MMulBlock;
46class MIntBlock;
47class MIntBlock_V_1_1_X;
48
50public:
51 enum class Reference_Magnitude : uint8_t { ONE = 0, ONE_TENTH = 1 };
52 enum class Transmission_Mode : uint8_t {
53 ANALOG_INPUT = 0b00,
54 POS_REF = 0b01,
55 NEG_REF = 0b10,
56 GROUND = 0b11
57 };
58
59 virtual bool write_outputs(std::array<int8_t, 32> outputs) = 0;
60 virtual bool write_transmission_modes_and_ref(std::pair<Transmission_Mode, Transmission_Mode> modes,
61 Reference_Magnitude ref) = 0;
63};
64
65class UBlockHAL_Dummy : public UBlockHAL {
66public:
67 bool write_outputs(std::array<int8_t, 32> outputs) override;
68 bool write_transmission_modes_and_ref(std::pair<Transmission_Mode, Transmission_Mode> modes,
69 Reference_Magnitude ref) override;
71
72 metadata::eui_t get_entity_eui() const override { return {}; }
73};
74
76protected:
80 // Reset disables all output, but rest of logic is unchanged according to datasheet.
81 // But I don't really know what that means. Data is still shifted out after a reset
82 // and the enable-bits in the data are still set.
83 // The datasheet calls the RESET pin OUTPUT ENABLE, so it probably is simply that.
84 // Meaning it is completely useless.
85 // const functions::TriggerFunction f_umatrix_reset;
86
90
91public:
92 explicit UBlockHAL_Common(bus::addr_t block_address, uint8_t f_umatrix_cs, uint8_t f_umatrix_sync_cs,
93 uint8_t f_transmission_mode_register_cs, uint8_t f_transmission_mode_sync_cs,
94 uint8_t f_transmission_mode_reset_cs);
95
96 bool write_outputs(std::array<int8_t, 32> outputs) override;
97 bool write_transmission_modes_and_ref(std::pair<Transmission_Mode, Transmission_Mode> modes,
98 Reference_Magnitude ref) override;
100
101 metadata::eui_t get_entity_eui() const override { return f_meta.read_eui(); }
102};
103
105public:
106 explicit UBlockHAL_V_1_2_X(const bus::addr_t block_address)
107 : UBlockHAL_Common(block_address, 5, 6, 2, 3, 4){};
108};
109
123class UBlock : public FunctionBlock {
124public:
125 // Entity hardware identifier information.
126 static constexpr auto CLASS_ = entities::EntityClass::U_BLOCK;
127 static constexpr uint8_t TYPE = 1;
128
129 static UBlock *from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address);
130
131public:
132 static constexpr uint8_t BLOCK_IDX = bus::U_BLOCK_IDX;
133
134 static constexpr uint8_t NUM_OF_INPUTS = 16;
135 static constexpr uint8_t NUM_OF_OUTPUTS = 32;
136
137 static constexpr std::array<uint8_t, NUM_OF_INPUTS> INPUT_IDX_RANGE() {
138 return {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
139 };
140
141 static constexpr std::array<uint8_t, NUM_OF_OUTPUTS> OUTPUT_IDX_RANGE() {
142 return {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
143 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
144 };
145
148
149protected:
151
152 std::array<int8_t, NUM_OF_OUTPUTS> output_input_map;
153 Reference_Magnitude ref_magnitude = Reference_Magnitude::ONE;
154 Transmission_Mode a_side_mode = Transmission_Mode::ANALOG_INPUT;
155 Transmission_Mode b_side_mode = Transmission_Mode::ANALOG_INPUT;
156
157 // Default sanity checks for input and output indizes
158 static bool _i_sanity_check(const uint8_t input);
159 static bool _o_sanity_check(const uint8_t output);
160 static bool _io_sanity_check(const uint8_t input, const uint8_t output);
161
169 void change_all_transmission_modes(const std::pair<Transmission_Mode, Transmission_Mode> modes);
170
172
174
176
177 std::pair<Transmission_Mode, Transmission_Mode> get_all_transmission_modes() const;
179 bool _is_connected(const uint8_t input, const uint8_t output) const;
180
182 void _connect(const uint8_t input, const uint8_t output);
183
185 void _disconnect(const uint8_t output);
186
188 bool _is_output_connected(const uint8_t output) const;
189
190 bool _is_input_connected(const uint8_t input) const;
191
192public:
194
196
197 metadata::eui_t get_entity_eui() const override;
198
199 void reset(entities::ResetAction action) override;
200
201 void reset_connections();
202
207 bool connect(const uint8_t input, const uint8_t output, const bool force = false);
208
215 bool connect_alternative(Transmission_Mode signal_type, const uint8_t output, const bool force = false,
216 bool use_a_side = false);
217
219 bool disconnect(const uint8_t input, const uint8_t output);
220
222 bool disconnect(const uint8_t output);
223
225 bool is_connected(const uint8_t input, const uint8_t output) const;
226
228 bool is_output_connected(const uint8_t output) const;
229
231 bool is_input_connected(const uint8_t input) const;
232
233 bool is_anything_connected() const;
234
235 [[nodiscard]] utils::status write_to_hardware() override;
236
237 utils::status config_self_from_json(JsonObjectConst cfg) override;
238
239protected:
240 void config_self_to_json(JsonObject &cfg) override;
241
242 utils::status _config_outputs_from_json(const JsonVariantConst &cfg);
243 utils::status _config_constants_from_json(const JsonVariantConst &cfg);
244
245 friend class ::platform::Cluster;
246
247 friend class ::blocks::MBlock;
248 friend class ::blocks::MMulBlock;
249 friend class ::blocks::MIntBlock;
250 friend class ::blocks::MIntBlock_V_1_1_X;
251};
252} // namespace blocks
253
254// Include template definitions
255#include "ublock.tpl.h"
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
bool write_outputs(std::array< int8_t, 32 > outputs) override
Definition ublock.cpp:430
const functions::SR74HCT595 f_transmission_mode_register
Definition ublock.h:87
const functions::TriggerFunction f_transmission_mode_sync
Definition ublock.h:88
void reset_transmission_modes_and_ref() override
Definition ublock.cpp:454
bool write_transmission_modes_and_ref(std::pair< Transmission_Mode, Transmission_Mode > modes, Reference_Magnitude ref) override
Definition ublock.cpp:437
metadata::eui_t get_entity_eui() const override
Definition ublock.h:101
const metadata::MetadataEditor f_meta
Definition ublock.h:77
const functions::TriggerFunction f_umatrix_sync
Definition ublock.h:79
const functions::UMatrixFunction f_umatrix
Definition ublock.h:78
const functions::TriggerFunction f_transmission_mode_reset
Definition ublock.h:89
UBlockHAL_Common(bus::addr_t block_address, uint8_t f_umatrix_cs, uint8_t f_umatrix_sync_cs, uint8_t f_transmission_mode_register_cs, uint8_t f_transmission_mode_sync_cs, uint8_t f_transmission_mode_reset_cs)
Definition ublock.cpp:418
void reset_transmission_modes_and_ref() override
Definition ublock.cpp:416
metadata::eui_t get_entity_eui() const override
Definition ublock.h:72
bool write_transmission_modes_and_ref(std::pair< Transmission_Mode, Transmission_Mode > modes, Reference_Magnitude ref) override
Definition ublock.cpp:411
bool write_outputs(std::array< int8_t, 32 > outputs) override
Definition ublock.cpp:409
UBlockHAL_V_1_2_X(const bus::addr_t block_address)
Definition ublock.h:106
virtual bool write_transmission_modes_and_ref(std::pair< Transmission_Mode, Transmission_Mode > modes, Reference_Magnitude ref)=0
virtual bool write_outputs(std::array< int8_t, 32 > outputs)=0
virtual void reset_transmission_modes_and_ref()=0
The Lucidac U-Block (U for Voltage) is represented by this class.
Definition ublock.h:123
UBlockHAL::Transmission_Mode Transmission_Mode
Definition ublock.h:146
bool connect(const uint8_t input, const uint8_t output, const bool force=false)
Connects a block input to a block output.
Definition ublock.cpp:50
metadata::eui_t get_entity_eui() const override
Definition ublock.cpp:32
bool disconnect(const uint8_t input, const uint8_t output)
Disconnect an input from an output, if they are connected. Both input and output are zero-based indiz...
Definition ublock.cpp:140
utils::status write_to_hardware() override
returns true in case of success
Definition ublock.cpp:233
static constexpr uint8_t BLOCK_IDX
Definition ublock.h:132
bool is_connected(const uint8_t input, const uint8_t output) const
Check whether an chip input is connected to an chip / block output.
Definition ublock.cpp:163
static constexpr uint8_t NUM_OF_INPUTS
Definition ublock.h:134
utils::status config_self_from_json(JsonObjectConst cfg) override
Deserialize a new configuration for this entity from a JsonObject.
Definition ublock.cpp:257
static constexpr uint8_t NUM_OF_OUTPUTS
Definition ublock.h:135
utils::status _config_outputs_from_json(const JsonVariantConst &cfg)
Definition ublock.cpp:278
bool _is_connected(const uint8_t input, const uint8_t output) const
Check whether an input is connected to an output, without sanity checks.
Definition ublock.cpp:159
static bool _i_sanity_check(const uint8_t input)
Definition ublock.cpp:38
void reset(entities::ResetAction action) override
Definition ublock.cpp:246
bool is_anything_connected() const
Definition ublock.cpp:194
void _connect(const uint8_t input, const uint8_t output)
Connects output with given input, without sanity checks or disconnection prevention.
Definition ublock.cpp:46
void change_b_side_transmission_mode(const Transmission_Mode mode)
Changes the transmission mode of the alternative ublock switches.
Definition ublock.cpp:205
static constexpr std::array< uint8_t, NUM_OF_INPUTS > INPUT_IDX_RANGE()
Definition ublock.h:137
static UBlock * from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address)
Definition ublock.cpp:392
void change_a_side_transmission_mode(const Transmission_Mode mode)
Changes the transmission mode of the regular ublock switches.
Definition ublock.cpp:201
bool is_input_connected(const uint8_t input) const
Check whether an chip input is connected to any output.
Definition ublock.cpp:188
Transmission_Mode a_side_mode
Definition ublock.h:154
bool is_output_connected(const uint8_t output) const
Check whether an chip / block output is connected to any chip input.
Definition ublock.cpp:174
Transmission_Mode b_side_mode
Definition ublock.h:155
static constexpr auto CLASS_
Definition ublock.h:126
void config_self_to_json(JsonObject &cfg) override
Serialize the configuration of this entity to a JsonObject.
Definition ublock.cpp:354
static bool _o_sanity_check(const uint8_t output)
Definition ublock.cpp:40
static constexpr std::array< uint8_t, NUM_OF_OUTPUTS > OUTPUT_IDX_RANGE()
Definition ublock.h:141
void change_all_transmission_modes(const Transmission_Mode mode)
Changes the transmission mode for all ublock switches.
Definition ublock.cpp:209
Reference_Magnitude get_reference_magnitude()
Definition ublock.cpp:225
UBlockHAL * hardware
Definition ublock.h:150
void reset_connections()
Definition ublock.cpp:242
static bool _io_sanity_check(const uint8_t input, const uint8_t output)
Definition ublock.cpp:42
void reset_reference_magnitude()
Definition ublock.cpp:407
static constexpr uint8_t TYPE
Definition ublock.h:127
bool _is_input_connected(const uint8_t input) const
Definition ublock.cpp:181
void change_reference_magnitude(Reference_Magnitude ref)
Definition ublock.cpp:229
bool connect_alternative(Transmission_Mode signal_type, const uint8_t output, const bool force=false, bool use_a_side=false)
Connects an alternative input / non block input specified by signal_mode from the a- or b-side to a b...
Definition ublock.cpp:80
std::pair< Transmission_Mode, Transmission_Mode > get_all_transmission_modes() const
Definition ublock.cpp:221
utils::status _config_constants_from_json(const JsonVariantConst &cfg)
Definition ublock.cpp:328
std::array< int8_t, NUM_OF_OUTPUTS > output_input_map
Definition ublock.h:152
Reference_Magnitude ref_magnitude
Definition ublock.h:153
void _disconnect(const uint8_t output)
Disconnects output, without sanity checks.
Definition ublock.cpp:138
bool _is_output_connected(const uint8_t output) const
Check whether an output is connected to any input, without sanity checks.
Definition ublock.cpp:170
EntityClassifier classifier
Definition base.h:217
A DataFunction class wraps SPI communication over the digital bus.
Definition functions.h:47
DataFunction(bus::addr_t address, const SPISettings &spiSettings)
Definition functions.cpp:16
const bus::addr_t address
Definition functions.h:23
The SR74HCT595 is an 8-Bit Shift Register with 3-State Output Registers.
Definition SR74HCT595.h:16
A trigger function exploits the fact that setting an address on the bus triggers an action (TODO: Is ...
Definition functions.h:33
bool transfer(const std::array< int8_t, num_of_outputs > &outputs) const
Convert an output array to data packets and transfer to chip.
Definition ublock.tpl.h:15
UMatrixFunction(bus::addr_t address)
Definition ublock.cpp:23
static const SPISettings DEFAULT_SPI_SETTINGS
Definition ublock.h:21
eui_t read_eui() const
Definition entity.h:42
A recoverable error, inspired from https://abseil.io/docs/cpp/guides/status and https://github....
Definition error.h:35
uint32_t uint32_t size
Definition flasher.cpp:63
Definition base.h:10
constexpr uint8_t U_BLOCK_IDX
Definition bus.h:56
uint16_t addr_t
Definition bus.h:27
The AD8402 is a two channel, 8 bit digital potentiometer.
Definition functions.h:12
std::array< uint8_t, 8 > eui_t
Definition base.h:20
This concept of Backpanel / Backplane refers to the address decoder and periphery reachable by every ...
Definition cblock.h:15
void shift_5_left(uint8_t *buffer, size_t size)
Definition ublock.cpp:11