REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
iblock.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 <bitset>
9#include <cstdint>
11#include "block/base.h"
12#include "bus/functions.h"
13#include "chips/SR74HCT595.h"
14#include "utils/is_number.h"
15
17namespace functions {
18
31public:
32 static const SPISettings DEFAULT_SPI_SETTINGS;
33
36
37 static uint8_t chip_cmd_word(uint8_t chip_input_idx, uint8_t chip_output_idx, bool connect = true);
38};
39
40} // namespace functions
41
42namespace blocks {
43
45public:
46 static constexpr uint8_t NUM_INPUTS = 32;
47 static constexpr uint8_t NUM_OUTPUTS = 16;
48
49 static constexpr uint32_t INPUT_BITMASK(uint8_t input_idx) { return static_cast<uint32_t>(1) << input_idx; }
50
51 virtual bool write_outputs(const std::array<uint32_t, 16> &outputs) = 0;
52 virtual bool write_upscaling(std::bitset<32> upscaling) = 0;
53};
54
55class IBlockHALDummy : public IBlockHAL {
56public:
57 bool write_outputs(const std::array<uint32_t, 16> &outputs) override { return true; }
58
59 bool write_upscaling(std::bitset<32> upscaling) override { return true; }
60
62
63 std::array<uint8_t, 8> get_entity_eui() const override { return {}; }
64};
65
67protected:
72
75
76public:
77 explicit IBlockHAL_V_1_2_X(bus::addr_t block_address);
78
79 bool write_outputs(const std::array<uint32_t, 16> &outputs) override;
80
81 bool write_upscaling(std::bitset<32> upscaling) override;
82
83 metadata::eui_t get_entity_eui() const override { return f_meta.read_eui(); }
84};
85
99class IBlock : public FunctionBlock {
100public:
101 // Entity hardware identifier information.
102 static constexpr auto CLASS_ = entities::EntityClass::I_BLOCK;
103
104 static IBlock *from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address);
105
106public:
107 static constexpr uint8_t BLOCK_IDX = bus::I_BLOCK_IDX;
108
109 static constexpr uint32_t INPUT_BITMASK(uint8_t input_idx) { return IBlockHAL::INPUT_BITMASK(input_idx); }
110
111 static constexpr uint8_t NUM_INPUTS = IBlockHAL::NUM_INPUTS;
112 static constexpr uint8_t NUM_OUTPUTS = IBlockHAL::NUM_OUTPUTS;
113
114 static constexpr std::array<uint8_t, NUM_INPUTS> INPUT_IDX_RANGE() {
115 return {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
116 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
117 };
118
119 static constexpr std::array<uint8_t, NUM_OUTPUTS> OUTPUT_IDX_RANGE() {
120 return {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
121 };
122
123protected:
124 utils::status _connect_from_json(const JsonVariantConst &input_spec, uint8_t output);
125
126 utils::status _config_outputs_from_json(const JsonVariantConst &cfg);
127 utils::status _config_upscaling_from_json(const JsonVariantConst &cfg);
128
129 void config_self_to_json(JsonObject &cfg) override;
130
131 bool _is_connected(uint8_t input, uint8_t output) const;
132 bool _is_output_connected(uint8_t output) const;
133
135
136 std::array<uint32_t, NUM_OUTPUTS> outputs;
137 std::bitset<NUM_INPUTS> scaling_factors = 0;
138
139public:
140 explicit IBlock(IBlockHAL *hardware);
141 IBlock();
142
143 metadata::eui_t get_entity_eui() const override;
144
145 [[nodiscard]] utils::status write_to_hardware() override;
146
147 bool init() override;
148
149 void reset_outputs();
150
151 void reset(entities::ResetAction action) override;
152
153 const std::array<uint32_t, NUM_OUTPUTS> &get_outputs() const;
154
155 void set_outputs(const std::array<uint32_t, NUM_OUTPUTS> &outputs_);
156
173 bool connect(uint8_t input, uint8_t output, bool exclusive = false, bool allow_input_splitting = false);
174
176 bool is_connected(uint8_t input, uint8_t output) const;
177
178 bool is_anything_connected() const;
179
181 bool disconnect(uint8_t input, uint8_t output);
182
184 bool disconnect(uint8_t output);
185
188 bool set_upscaling(uint8_t input, bool upscale);
189
192 void set_upscaling(std::bitset<NUM_INPUTS> scales);
193
195 void reset_upscaling();
196
198 bool get_upscaling(uint8_t output) const;
199
201 const std::bitset<NUM_INPUTS> &get_upscales() const { return scaling_factors; }
202
203 utils::status config_self_from_json(JsonObjectConst cfg) override;
204};
205
206} // namespace blocks
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
std::array< uint8_t, 8 > get_entity_eui() const override
Definition iblock.h:63
bool write_outputs(const std::array< uint32_t, 16 > &outputs) override
Definition iblock.h:57
IBlockHALDummy(bus::addr_t)
Definition iblock.h:61
bool write_upscaling(std::bitset< 32 > upscaling) override
Definition iblock.h:59
const functions::TriggerFunction f_imatrix_reset
Definition iblock.h:70
bool write_upscaling(std::bitset< 32 > upscaling) override
Definition iblock.cpp:376
IBlockHAL_V_1_2_X(bus::addr_t block_address)
Definition iblock.cpp:299
const functions::TriggerFunction scaling_register_sync
Definition iblock.h:74
const metadata::MetadataEditor f_meta
Definition iblock.h:68
const functions::SR74HCT595 scaling_register
Definition iblock.h:73
metadata::eui_t get_entity_eui() const override
Definition iblock.h:83
const functions::TriggerFunction f_imatrix_sync
Definition iblock.h:71
const functions::ICommandRegisterFunction f_cmd
Definition iblock.h:69
bool write_outputs(const std::array< uint32_t, 16 > &outputs) override
Definition iblock.cpp:306
virtual bool write_upscaling(std::bitset< 32 > upscaling)=0
virtual bool write_outputs(const std::array< uint32_t, 16 > &outputs)=0
static constexpr uint8_t NUM_INPUTS
Definition iblock.h:46
static constexpr uint8_t NUM_OUTPUTS
Definition iblock.h:47
static constexpr uint32_t INPUT_BITMASK(uint8_t input_idx)
Definition iblock.h:49
The Lucidac I-Block (I for Current; the Implicit Summing Block) is represented by this class.
Definition iblock.h:99
std::bitset< NUM_INPUTS > scaling_factors
Definition iblock.h:137
void config_self_to_json(JsonObject &cfg) override
Serialize the configuration of this entity to a JsonObject.
Definition iblock.cpp:248
static constexpr std::array< uint8_t, NUM_INPUTS > INPUT_IDX_RANGE()
Definition iblock.h:114
static constexpr uint32_t INPUT_BITMASK(uint8_t input_idx)
Definition iblock.h:109
static constexpr std::array< uint8_t, NUM_OUTPUTS > OUTPUT_IDX_RANGE()
Definition iblock.h:119
void reset_upscaling()
Sets all 32 input scales to the default 1.0.
Definition iblock.cpp:239
const std::bitset< NUM_INPUTS > & get_upscales() const
Returns all input scales. A low bit indicates a factor of 1.0, a high bit indicates a factor of 10....
Definition iblock.h:201
utils::status config_self_from_json(JsonObjectConst cfg) override
Deserialize a new configuration for this entity from a JsonObject.
Definition iblock.cpp:105
static IBlock * from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address)
Definition iblock.cpp:272
bool _is_connected(uint8_t input, uint8_t output) const
Definition iblock.cpp:48
static constexpr uint8_t NUM_OUTPUTS
Definition iblock.h:112
static constexpr uint8_t BLOCK_IDX
Definition iblock.h:107
utils::status write_to_hardware() override
returns true in case of success
Definition iblock.cpp:33
void reset(entities::ResetAction action) override
Definition iblock.cpp:96
void set_outputs(const std::array< uint32_t, NUM_OUTPUTS > &outputs_)
Definition iblock.cpp:295
bool _is_output_connected(uint8_t output) const
Definition iblock.cpp:52
metadata::eui_t get_entity_eui() const override
Definition iblock.cpp:27
const std::array< uint32_t, NUM_OUTPUTS > & get_outputs() const
Definition iblock.cpp:291
utils::status _connect_from_json(const JsonVariantConst &input_spec, uint8_t output)
Definition iblock.cpp:196
bool is_anything_connected() const
Definition iblock.cpp:60
bool is_connected(uint8_t input, uint8_t output) const
Whether an input is connected to an output.
Definition iblock.cpp:54
void reset_outputs()
Definition iblock.cpp:90
static constexpr uint8_t NUM_INPUTS
Definition iblock.h:111
bool connect(uint8_t input, uint8_t output, bool exclusive=false, bool allow_input_splitting=false)
Connects an input line [0..31] to an output line [0..15] by setting an appropriate bit/switch in the ...
Definition iblock.cpp:67
utils::status _config_upscaling_from_json(const JsonVariantConst &cfg)
Definition iblock.cpp:168
bool init() override
returns true in case of success
Definition iblock.cpp:37
bool disconnect(uint8_t input, uint8_t output)
Disconnect one input from an output. Fails for invalid arguments or if no input is connected.
Definition iblock.cpp:215
static constexpr auto CLASS_
Definition iblock.h:102
bool set_upscaling(uint8_t input, bool upscale)
Sets the input scale of the corresponding output.
Definition iblock.cpp:230
std::array< uint32_t, NUM_OUTPUTS > outputs
Definition iblock.h:136
utils::status _config_outputs_from_json(const JsonVariantConst &cfg)
Definition iblock.cpp:125
IBlockHAL * hardware
Definition iblock.h:134
bool get_upscaling(uint8_t output) const
Returns the input scale of the corresponding output.
Definition iblock.cpp:241
EntityClassifier classifier
Definition base.h:217
const bus::addr_t address
Definition functions.h:23
DataFunction to transfer 32bit of data to the I-Block matrix command registry.
Definition iblock.h:30
ICommandRegisterFunction(bus::addr_t address)
Definition iblock.cpp:13
static uint8_t chip_cmd_word(uint8_t chip_input_idx, uint8_t chip_output_idx, bool connect=true)
Definition iblock.cpp:16
static const SPISettings DEFAULT_SPI_SETTINGS
Definition iblock.h:10
The SR74HCT595 is an 8-Bit Shift Register with 3-State Output Registers.
Definition SR74HCT595.h:16
SR74HCT595(bus::addr_t address, bool shift_clock=false)
A trigger function exploits the fact that setting an address on the bus triggers an action (TODO: Is ...
Definition functions.h:33
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
Definition flasher.cpp:195
Definition base.h:10
constexpr uint8_t I_BLOCK_IDX
Definition bus.h:58
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