REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
mblock_int.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 "block/mblock.h"
8
9namespace blocks {
10
14struct __attribute__((packed)) IntegratorCalibration {
15 uint8_t time_factor_gain_slow = 127; // Raw gain value, for step through. Equals mid setting
16 uint8_t time_factor_gain_fast = 127; // Raw gain value, for step through. Equals mid setting
17};
18
19class MIntBlockHAL : public MBlockHAL {
20public:
21 virtual bool write_ic(uint8_t idx, float ic) = 0;
22 virtual bool write_time_factor_switches(std::bitset<8> switches) = 0;
23};
24
26public:
27 bool write_ic(uint8_t idx, float ic) override { return true; }
28
29 bool write_time_factor_switches(std::bitset<8> switches) override { return true; }
30
31 std::bitset<8> read_overload_flags() override { return {0}; }
32
33 void reset_overload_flags() override {}
34
36
37 metadata::eui_t get_entity_eui() const override { return {}; }
38};
39
41protected:
49
50public:
51 explicit MIntBlockHAL_V_1_0_X(bus::addr_t block_address);
52
53 bool init() override;
54
55 bool write_ic(uint8_t idx, float ic) override;
56 bool write_time_factor_switches(std::bitset<8> switches) override;
57
58 std::bitset<8> read_overload_flags() override;
59 void reset_overload_flags() override;
60
61 metadata::eui_t get_entity_eui() const override { return f_meta.read_eui(); }
62};
63
65protected:
68
69public:
70 explicit MIntBlockHAL_V_1_1_X(bus::addr_t block_address);
71
72 bool write_ic(uint8_t idx, float ic) override;
73 bool write_time_factor_switches(std::bitset<8> switches) override;
74
75 virtual bool write_limiters_enable(std::bitset<8> limiters);
76 virtual bool write_time_factor_switches_and_limiters_enable(std::bitset<8> switches,
77 std::bitset<8> limiters);
78
79 virtual bool write_time_factor_gain(uint8_t idx, uint8_t gain);
80
81 metadata::eui_t get_entity_eui() const override { return f_meta.read_eui(); }
82};
83
84class MIntBlock : public MBlock {
85public:
86 // Entity hardware identifier information.
87 static constexpr auto TYPE = MBlock::TYPES::M_INT8_BLOCK;
88
89 static MIntBlock *from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address);
90
91public:
92 static constexpr uint8_t NUM_INTEGRATORS = 8;
93 static constexpr unsigned int DEFAULT_TIME_FACTOR = 10000;
94
95 static constexpr std::array<uint8_t, NUM_INTEGRATORS> INTEGRATORS_INPUT_RANGE() {
96 return {0, 1, 2, 3, 4, 5, 6, 7};
97 }
98
99 static constexpr std::array<uint8_t, NUM_INTEGRATORS> INTEGRATORS_OUTPUT_RANGE() {
100 return {0, 1, 2, 3, 4, 5, 6, 7};
101 }
102
103protected:
105
106 std::array<float, NUM_INTEGRATORS> ic_values;
107 std::array<unsigned int, NUM_INTEGRATORS> time_factors;
108
109 utils::status _config_elements_from_json(const JsonVariantConst &cfg);
110
111public:
113
114 explicit MIntBlock(SLOT slot) : MIntBlock(slot, new MIntBlockHAL_Dummy(bus::NULL_ADDRESS)) {}
115
116 metadata::eui_t get_entity_eui() const override;
117
118 bool init() override;
119 void reset(entities::ResetAction action) override;
120
121 [[nodiscard]] const std::array<float, 8> &get_ic_values() const;
122 [[nodiscard]] float get_ic_value(uint8_t idx) const;
123 bool set_ic_values(float value);
124 bool set_ic_values(const std::array<float, 8> &ic_values_);
125 bool set_ic_value(uint8_t idx, float value);
126 void reset_ic_values();
127
128 [[nodiscard]] const std::array<unsigned int, 8> &get_time_factors() const;
129 unsigned int get_time_factor(uint8_t idx) const;
130 bool set_time_factors(unsigned int k);
131 bool set_time_factors(const std::array<unsigned int, 8> &time_factors_);
132 bool set_time_factor(uint8_t int_idx, unsigned int k);
133 void reset_time_factors();
134
135 [[nodiscard]] utils::status write_to_hardware() override;
136
137 utils::status config_self_from_json(JsonObjectConst cfg) override;
138
139protected:
140 void config_self_to_json(JsonObject &cfg) override;
141};
142
144public:
146
147 [[nodiscard]] utils::status write_to_hardware() override;
148 void reset(entities::ResetAction action) override;
149
150 [[nodiscard]] const std::array<IntegratorCalibration, NUM_INTEGRATORS> &get_calibration() const;
151 [[nodiscard]] blocks::IntegratorCalibration get_calibration(uint8_t int_idx) const;
153
154 bool calibrate(platform::Cluster *cluster, carrier::Carrier *carrier) override;
155
156protected:
158
159 std::array<IntegratorCalibration, NUM_INTEGRATORS> calibration{};
160
161 bool _gain_calibration(bool use_slow_integration);
162};
163
164} // namespace blocks
A REDAC Math block (M-Block) is represented by this class.
Definition mblock.h:43
const SLOT slot
Definition mblock.h:101
bool write_time_factor_switches(std::bitset< 8 > switches) override
Definition mblock_int.h:29
std::bitset< 8 > read_overload_flags() override
Definition mblock_int.h:31
MIntBlockHAL_Dummy(bus::addr_t)
Definition mblock_int.h:35
bool write_ic(uint8_t idx, float ic) override
Definition mblock_int.h:27
metadata::eui_t get_entity_eui() const override
Definition mblock_int.h:37
void reset_overload_flags() override
Definition mblock_int.h:33
std::bitset< 8 > read_overload_flags() override
const functions::TriggerFunction f_overload_flags_reset
Definition mblock_int.h:48
MIntBlockHAL_V_1_0_X(bus::addr_t block_address)
metadata::eui_t get_entity_eui() const override
Definition mblock_int.h:61
const metadata::MetadataEditor f_meta
Definition mblock_int.h:42
bool write_ic(uint8_t idx, float ic) override
const functions::SR74HCT595 f_time_factor
Definition mblock_int.h:44
const functions::DAC60508 f_ic_dac
Definition mblock_int.h:43
const functions::SR74HC16X f_overload_flags
Definition mblock_int.h:47
bool write_time_factor_switches(std::bitset< 8 > switches) override
const functions::TriggerFunction f_time_factor_sync
Definition mblock_int.h:45
const functions::TriggerFunction f_time_factor_reset
Definition mblock_int.h:46
void reset_overload_flags() override
virtual bool write_time_factor_gain(uint8_t idx, uint8_t gain)
metadata::eui_t get_entity_eui() const override
Definition mblock_int.h:81
virtual bool write_limiters_enable(std::bitset< 8 > limiters)
functions::AD8403 f_time_factor_gain_4_7
Definition mblock_int.h:67
bool write_time_factor_switches(std::bitset< 8 > switches) override
functions::AD8403 f_time_factor_gain_0_3
Definition mblock_int.h:66
MIntBlockHAL_V_1_1_X(bus::addr_t block_address)
bool write_ic(uint8_t idx, float ic) override
virtual bool write_time_factor_switches_and_limiters_enable(std::bitset< 8 > switches, std::bitset< 8 > limiters)
virtual bool write_time_factor_switches(std::bitset< 8 > switches)=0
virtual bool write_ic(uint8_t idx, float ic)=0
std::array< IntegratorCalibration, NUM_INTEGRATORS > calibration
Definition mblock_int.h:159
utils::status write_calibration_to_hardware()
void reset(entities::ResetAction action) override
MIntBlockHAL_V_1_1_X * hardware
Definition mblock_int.h:157
MIntBlock_V_1_1_X(SLOT slot, MIntBlockHAL_V_1_1_X *hardware)
bool _gain_calibration(bool use_slow_integration)
const std::array< IntegratorCalibration, NUM_INTEGRATORS > & get_calibration() const
utils::status write_to_hardware() override
returns true in case of success
bool calibrate(platform::Cluster *cluster, carrier::Carrier *carrier) override
MIntBlock(SLOT slot)
Definition mblock_int.h:114
void config_self_to_json(JsonObject &cfg) override
Serialize the configuration of this entity to a JsonObject.
const std::array< unsigned int, 8 > & get_time_factors() const
float get_ic_value(uint8_t idx) const
static MIntBlock * from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address)
utils::status _config_elements_from_json(const JsonVariantConst &cfg)
MIntBlock(SLOT slot, MIntBlockHAL *hardware)
bool set_time_factor(uint8_t int_idx, unsigned int k)
static constexpr auto TYPE
Definition mblock_int.h:87
bool init() override
returns true in case of success
const std::array< float, 8 > & get_ic_values() const
bool set_ic_value(uint8_t idx, float value)
static constexpr std::array< uint8_t, NUM_INTEGRATORS > INTEGRATORS_INPUT_RANGE()
Definition mblock_int.h:95
static constexpr unsigned int DEFAULT_TIME_FACTOR
Definition mblock_int.h:93
std::array< unsigned int, NUM_INTEGRATORS > time_factors
Definition mblock_int.h:107
void reset(entities::ResetAction action) override
metadata::eui_t get_entity_eui() const override
std::array< float, NUM_INTEGRATORS > ic_values
Definition mblock_int.h:106
MIntBlockHAL * hardware
Definition mblock_int.h:104
bool set_time_factors(unsigned int k)
utils::status config_self_from_json(JsonObjectConst cfg) override
Deserialize a new configuration for this entity from a JsonObject.
unsigned int get_time_factor(uint8_t idx) const
static constexpr uint8_t NUM_INTEGRATORS
Definition mblock_int.h:92
bool set_ic_values(float value)
utils::status write_to_hardware() override
returns true in case of success
static constexpr std::array< uint8_t, NUM_INTEGRATORS > INTEGRATORS_OUTPUT_RANGE()
Definition mblock_int.h:99
Top-level hierarchy controlled by a single microcontroller.
Definition carrier.h:38
EntityClassifier classifier
Definition base.h:217
The AD8403 is a four channel, 8 bit digital potentiometer.
Definition AD840X.h:35
The DAC60508 is the 12-Bit 8-channel DAC, used in the MInt-Block for the initial conditions.
Definition DAC60508.h:17
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
eui_t read_eui() const
Definition entity.h:42
The Lucidac class represents a single cluster.
Definition cluster.h:20
A recoverable error, inspired from https://abseil.io/docs/cpp/guides/status and https://github....
Definition error.h:35
Definition base.h:10
struct __attribute__((packed)) IntegratorCalibration
Calibration data for each integrator.
Definition mblock_int.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