REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
mblock_mul.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
11class MMulBlockHAL : public MBlockHAL {
12public:
13 virtual bool write_calibration_input_offsets(uint8_t idx, uint16_t offset_x, uint16_t offset_y) = 0;
14 virtual bool write_calibration_output_offset(uint8_t idx, uint16_t offset_z) = 0;
15
16 bool init() override;
17};
18
20protected:
26
27public:
28 explicit MMulBlockHAL_V_1_0_X(bus::addr_t block_address);
29
30 metadata::eui_t get_entity_eui() const override { return f_meta.read_eui(); }
31
32 bool init() override;
33
34public:
35 bool write_calibration_input_offsets(uint8_t idx, uint16_t offset_x, uint16_t offset_y) override;
36 bool write_calibration_output_offset(uint8_t idx, uint16_t offset_z) override;
37
38 static constexpr float MIN_OFFSET = -0.1f;
39 static constexpr float MAX_OFFSET = +0.1f;
40
42 static float raw_to_float_calibration(uint16_t raw) {
43 return map(static_cast<float>(raw), functions::DAC60508::RAW_ZERO, functions::DAC60508::RAW_MAX,
45 }
46
48 static uint16_t float_to_raw_calibration(float value) {
49 return static_cast<uint16_t>(roundf(
51 }
52
53 std::bitset<8> read_overload_flags() override;
54 void reset_overload_flags() override;
55};
56
58public:
59 explicit MMulBlockHAL_FullAutoCalibration(bus::addr_t block_address) : MMulBlockHAL_V_1_0_X(block_address) {}
60
61 virtual bool write_calibration_gain(uint8_t idx, uint8_t gain) = 0;
62};
63
65protected:
68
69public:
70 explicit MMulBlockHAL_V_1_M1_X(bus::addr_t block_address);
71
72 bool write_calibration_gain(uint8_t idx, uint8_t gain) override;
73};
74
76protected:
78
79public:
80 explicit MMulBlockHAL_V_1_1_X(bus::addr_t block_address);
81
82 bool write_calibration_gain(uint8_t idx, uint8_t gain) override;
83};
84
88struct __attribute__((packed)) MultiplierCalibration {
89 uint16_t offset_x = MMulBlockHAL_V_1_0_X::float_to_raw_calibration(0.0f),
92 // Raw DAC values, because we need to step through them. Set to zero offset at first
93
94 uint8_t gain = 127; // Raw gain value, for step through. Equals mid setting
95};
96
105class MMulBlock : public MBlock::MBlock {
106public:
107 // Entity hardware identifier information.
108 static constexpr auto TYPE = MBlock::TYPES::M_MUL4_BLOCK;
109
110 static MMulBlock *from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address);
111
112public:
113 static constexpr uint8_t NUM_MULTIPLIERS = 4;
114
115 static constexpr std::array<uint8_t, NUM_MULTIPLIERS * 2> MULTIPLIERS_INPUT_RANGE() {
116 return {0, 1, 2, 3, 4, 5, 6, 7};
117 };
118
119 static constexpr std::array<uint8_t, NUM_MULTIPLIERS> MULTIPLIERS_OUTPUT_RANGE() { return {0, 1, 2, 3}; };
120
121protected:
123
124 std::array<MultiplierCalibration, NUM_MULTIPLIERS> calibration{};
125
126public:
127 using MBlock::MBlock;
128 MMulBlock(SLOT slot, MMulBlockHAL *hardware);
129
130 metadata::eui_t get_entity_eui() const override;
131
133
134 bool init() override;
135
136 [[nodiscard]] utils::status write_to_hardware() override;
137
138 bool calibrate(platform::Cluster *cluster, carrier::Carrier *carrier) override;
139
140 void reset(entities::ResetAction action);
141
142 [[nodiscard]] const std::array<MultiplierCalibration, NUM_MULTIPLIERS> &get_calibration() const;
143 [[nodiscard]] blocks::MultiplierCalibration get_calibration(uint8_t mul_idx) const;
145
146protected:
147 utils::status config_self_from_json(JsonObjectConst cfg) override;
148 utils::status _config_elements_from_json(const JsonVariantConst &cfg);
149 void config_self_to_json(JsonObject &cfg) override;
150};
151
163
164} // namespace blocks
MMulBlockHAL_FullAutoCalibration(bus::addr_t block_address)
Definition mblock_mul.h:59
virtual bool write_calibration_gain(uint8_t idx, uint8_t gain)=0
std::bitset< 8 > read_overload_flags() override
const functions::TriggerFunction f_overload_flags_reset
Definition mblock_mul.h:22
metadata::eui_t get_entity_eui() const override
Definition mblock_mul.h:30
bool write_calibration_output_offset(uint8_t idx, uint16_t offset_z) override
MMulBlockHAL_V_1_0_X(bus::addr_t block_address)
static constexpr float MIN_OFFSET
Definition mblock_mul.h:38
const metadata::MetadataEditor f_meta
Definition mblock_mul.h:21
const functions::SR74HC16X f_overload_flags
Definition mblock_mul.h:23
const functions::DAC60508 f_calibration_dac_0
Definition mblock_mul.h:24
void reset_overload_flags() override
static float raw_to_float_calibration(uint16_t raw)
Takes in DAC raw value, returns voltage recieved by multiplier.
Definition mblock_mul.h:42
bool write_calibration_input_offsets(uint8_t idx, uint16_t offset_x, uint16_t offset_y) override
const functions::DAC60508 f_calibration_dac_1
Definition mblock_mul.h:25
static uint16_t float_to_raw_calibration(float value)
Takes in voltage recieved by multiplier, returns DAC raw value.
Definition mblock_mul.h:48
static constexpr float MAX_OFFSET
Definition mblock_mul.h:39
MMulBlockHAL_V_1_1_X(bus::addr_t block_address)
functions::AD8403 f_gain
Definition mblock_mul.h:77
bool write_calibration_gain(uint8_t idx, uint8_t gain) override
functions::AD8402 f_gain_ch0_1
Definition mblock_mul.h:66
bool write_calibration_gain(uint8_t idx, uint8_t gain) override
functions::AD8402 f_gain_ch2_3
Definition mblock_mul.h:67
MMulBlockHAL_V_1_M1_X(bus::addr_t block_address)
virtual bool write_calibration_input_offsets(uint8_t idx, uint16_t offset_x, uint16_t offset_y)=0
bool init() override
virtual bool write_calibration_output_offset(uint8_t idx, uint16_t offset_z)=0
MMulBlock_FullAutoCalibration(SLOT slot, blocks::MMulBlockHAL_FullAutoCalibration *hardware)
bool calibrate(platform::Cluster *cluster, carrier::Carrier *carrier) override
utils::status write_calibration_to_hardware() override
MMulBlockHAL_FullAutoCalibration * hardware
Definition mblock_mul.h:161
Multplier Math Block (or: Math Multplier Block, hence MMulBlock).
Definition mblock_mul.h:105
MMulBlock(bus::addr_t block_address, MMulBlockHAL *hardware)
void config_self_to_json(JsonObject &cfg) override
static MMulBlock * from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address)
bool init() override
std::array< MultiplierCalibration, NUM_MULTIPLIERS > calibration
Definition mblock_mul.h:124
const std::array< MultiplierCalibration, NUM_MULTIPLIERS > & get_calibration() const
void reset(entities::ResetAction action)
utils::status config_self_from_json(JsonObjectConst cfg) override
utils::status _config_elements_from_json(const JsonVariantConst &cfg)
static constexpr uint8_t NUM_MULTIPLIERS
Definition mblock_mul.h:113
static constexpr std::array< uint8_t, NUM_MULTIPLIERS > MULTIPLIERS_OUTPUT_RANGE()
Definition mblock_mul.h:119
MMulBlockHAL * hardware
Definition mblock_mul.h:122
MMulBlock(SLOT slot, MMulBlockHAL *hardware)
virtual utils::status write_calibration_to_hardware()
utils::status write_to_hardware() override
static constexpr std::array< uint8_t, NUM_MULTIPLIERS *2 > MULTIPLIERS_INPUT_RANGE()
Definition mblock_mul.h:115
metadata::eui_t get_entity_eui() const override
static constexpr auto TYPE
Definition mblock_mul.h:108
bool calibrate(platform::Cluster *cluster, carrier::Carrier *carrier) override
Top-level hierarchy controlled by a single microcontroller.
Definition carrier.h:38
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
static constexpr uint16_t RAW_ZERO
Definition DAC60508.h:30
static constexpr uint16_t RAW_MAX
Definition DAC60508.h:31
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
uint16_t addr_t
Definition bus.h:27
std::array< uint8_t, 8 > eui_t
Definition base.h:20