REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
mblock_mdr.cpp
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#include <algorithm>
5#include <bitset>
6
7#include "carrier/carrier.h"
8#include "carrier/cluster.h"
9
10#include "block/mblock_mdr.h"
12
13#include "block/mul_calibration.h"
14
15using namespace blocks;
16
17extern int abs_clamp(float in, int min, int max);
18
19blocks::MMDRBlock *blocks::MMDRBlock::from_entity_classifier(entities::EntityClassifier classifier,
20 const bus::addr_t block_address) {
21 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != static_cast<uint8_t>(TYPE))
22 return nullptr;
23
24 // Currently, there are no different variants
25 if (classifier.variant != entities::EntityClassifier::DEFAULT_)
26 return nullptr;
27
28 SLOT slot = block_address % 8 == 4 ? SLOT::M0 : SLOT::M1;
29 // Return default implementation
30 if (classifier.version < entities::Version(1))
31 return nullptr;
32 if (classifier.version < entities::Version(1, 1)) {
33 auto *new_block = new MMDRBlock(slot, new MMDRBlockHAL_V_1_0_X(block_address));
34 new_block->classifier = classifier;
35 return new_block;
36 }
37 return nullptr;
38}
39
40UnitResult blocks::MMDRBlock::calibrate(platform::Cluster *cluster, carrier::Carrier *carrier) {
41 LOG(ANABRID_DEBUG_CALIBRATION, __PRETTY_FUNCTION__);
42 TRY(calibrate_mul(carrier, cluster, this, calibration));
43 return UnitResult::ok();
44}
45
46UnitResult blocks::MMDRBlockHAL::init() { return MBlockHAL::init(); }
47
49 : MMDRBlockHAL_Parent(block_address, 0xff),
50 f_overload_flags(bus::replace_function_idx(block_address, 2), 0xff),
51 f_overload_flags_reset(bus::replace_function_idx(block_address, 3)),
52 f_calibration_dac_0(bus::address_from_tuple(block_address, 4), 0xff, 2.0f),
53 f_calibration_dac_1(bus::address_from_tuple(block_address, 5), 0xff, 2.0f),
54 f_gain(bus::replace_function_idx(block_address, 6), 0xff),
55 f_mode_config(bus::address_from_tuple(block_address, 7), 0xff, true),
56 f_mode_config_sync(bus::address_from_tuple(block_address, 8)) {}
57
59
61
62bool MMDRBlockHAL_V_1_0_X::write_modes(MMDRBlock::CellMode m0, MMDRBlock::CellMode m1, MMDRBlock::CellMode m2,
63 MMDRBlock::CellMode m3) {
64 // Output of SR is
65 // Last bit shifted in > [4bit Cell 3][4 bit Cell 2][4 bit Cell 1][4 bit Cell 0] < First bit shifted in
66 // Data is transfered MSBFIRST, so should look like
67 // MSB > [4bit Cell 0][Cell 1][Cell 2][Cell 3] < LSB
68 uint16_t data = (static_cast<uint16_t>(m0) << 12) | (static_cast<uint16_t>(m1) << 8) |
69 (static_cast<uint16_t>(m2) << 4) | (static_cast<uint16_t>(m3) << 0);
70 if (!f_mode_config.transfer16(data))
71 return false;
72 f_mode_config_sync.trigger();
73
74 return true;
75}
76
78 uint16_t offset_y) {
79 return f_calibration_dac_0.set_channel_raw(idx * 2, offset_x) and
80 f_calibration_dac_0.set_channel_raw(idx * 2 + 1, offset_y);
81}
82
83bool MMDRBlockHAL_V_1_0_X::write_calibration_output_offset(uint8_t idx, uint16_t offset_z) {
84 return f_calibration_dac_1.set_channel_raw(idx, offset_z);
85}
86
87bool MMDRBlockHAL_V_1_0_X::write_calibration_gain(uint8_t idx, uint8_t gain) {
88 if (idx == 0)
89 return f_gain.write_channel_raw(2, gain);
90 else if (idx == 1)
91 return f_gain.write_channel_raw(0, gain);
92 else if (idx == 2)
93 return f_gain.write_channel_raw(1, gain);
94 if (idx == 3)
95 return f_gain.write_channel_raw(3, gain);
96 return false;
97}
const functions::SR74HC16X f_overload_flags
Definition mblock_mdr.h:20
functions::AD8403 f_gain
Definition mblock_mdr.h:24
bool write_calibration_gain(uint8_t idx, uint8_t gain) override
std::bitset< 8 > read_overload_flags() override
const functions::SR74HCT595 f_mode_config
Definition mblock_mdr.h:25
const functions::DAC60508 f_calibration_dac_1
Definition mblock_mdr.h:23
void reset_overload_flags() override
const functions::DAC60508 f_calibration_dac_0
Definition mblock_mdr.h:22
bool write_calibration_output_offset(uint8_t idx, uint16_t offset_z) override
const functions::TriggerFunction f_mode_config_sync
Definition mblock_mdr.h:26
const functions::TriggerFunction f_overload_flags_reset
Definition mblock_mdr.h:21
bool write_calibration_input_offsets(uint8_t idx, uint16_t offset_x, uint16_t offset_y) override
bool write_modes(MMDRBlock::CellMode m0, MMDRBlock::CellMode m1, MMDRBlock::CellMode m2, MMDRBlock::CellMode m3) override
MMDRBlockHAL_V_1_0_X(bus::addr_t block_address)
int abs_clamp(float in, int min, int max)
Definition mblock.cpp:20
entities::EntitySharedHardware< MMDRBlockHAL > MMDRBlockHAL_Parent
Definition mblock_mdr.h:16
Definition bus.h:21
Definition daq.h:14