REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
ctrlblock.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3//
4// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
5
6#include "ctrlblock.h"
7
8const SPISettings blocks::CTRLBlockHAL_V_1_0_2::F_SYNC_SPI_SETTINGS{1'000'000, MSBFIRST, SPI_MODE0};
9
11 : f_meta(block_address), f_adc_mux(bus::address_from_tuple(1, 2), true),
12 f_adc_mux_latch(bus::address_from_tuple(1, 3)),
13 f_sync(bus::address_from_tuple(1, 4), F_SYNC_SPI_SETTINGS) {}
14
16 if (!f_adc_mux.transfer8(static_cast<uint8_t>(adc_bus)))
17 return false;
18 f_adc_mux_latch.trigger();
19 return true;
20}
21
22// float blocks::CTRLBlockHAL_V_1_0_2::read_temperature() { return 0; }
23
25 // The very naive encoding proposed in
26 // https://lab.analogparadigm.com/lucidac/firmware/hybrid-controller/-/issues/2
27 // uses only 6 bits of the 16 bits to ensure a "unique stream".
28 // IDs is thus limited to 0-63 currently
29 if (id > 0b00'111111)
30 return false;
31 f_sync.transfer16((id << 1) | 0b1000'0001);
32 return true;
33}
34
35// bus::address_from_tuple(1, 0)
36FLASHMEM blocks::CTRLBlock::CTRLBlock(CTRLBlockHALBase *hardware) : FunctionBlock("CTRL"), hardware(hardware) {
37 classifier.class_enum = CLASS_;
38}
39
40FLASHMEM blocks::CTRLBlock *blocks::CTRLBlock::from_entity_classifier(entities::EntityClassifier classifier,
41 bus::addr_t block_address) {
42 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
43 return nullptr;
44
45 if (classifier.version < entities::Version(1, 0, 1))
46 return nullptr;
47 if (classifier.version < entities::Version(1, 1)) {
48 auto *new_block = new CTRLBlock(new CTRLBlockHAL_V_1_0_2(block_address));
49 new_block->classifier = classifier;
50 return new_block;
51 }
52
53 return nullptr;
54}
55
57 if (hardware)
58 return hardware->get_entity_eui();
59 return {};
60}
61
64}
65
67 return utils::status(hardware->write_adc_bus_muxers(adc_bus));
68}
69
70FLASHMEM bool blocks::CTRLBlock::init() {
71 // Hardware defaults are not very good, e.g. adc bus is by default on CL0_GAIN.
72 // That's why we write more sane defaults on init.
73 return utils::status(FunctionBlock::init() and write_to_hardware());
74}
75
77
78FLASHMEM void blocks::CTRLBlock::set_adc_bus(blocks::CTRLBlock::ADCBus adc_bus_) { adc_bus = adc_bus_; }
79
80FLASHMEM void blocks::CTRLBlock::reset_adc_bus() { adc_bus = ADCBus::ADC; }
81
82FLASHMEM bool blocks::CTRLBlock::set_adc_bus_to_cluster_gain(uint8_t cluster_idx) {
83 if (cluster_idx >= 3)
84 return false;
85 set_adc_bus(static_cast<ADCBus>(cluster_idx));
86 return true;
87}
88
91
93 reset_adc_bus();
94}
bool write_adc_bus_muxers(ADCBus adc_bus) override
Definition ctrlblock.cpp:15
static const SPISettings F_SYNC_SPI_SETTINGS
Definition ctrlblock.h:8
CTRLBlockHAL_V_1_0_2(bus::addr_t block_address)
Definition ctrlblock.cpp:10
bool write_sync_id(uint8_t id) override
Definition ctrlblock.cpp:24
utils::status config_self_from_json(JsonObjectConst cfg) override
Deserialize a new configuration for this entity from a JsonObject.
Definition ctrlblock.cpp:62
bool set_adc_bus_to_cluster_gain(uint8_t cluster_idx)
Definition ctrlblock.cpp:82
bool init() override
returns true in case of success
Definition ctrlblock.cpp:70
CTRLBlock(CTRLBlockHALBase *hardware)
Definition ctrlblock.cpp:36
ADCBus get_adc_bus() const
Definition ctrlblock.cpp:76
metadata::eui_t get_entity_eui() const override
Definition ctrlblock.cpp:56
utils::status write_to_hardware() override
returns true in case of success
Definition ctrlblock.cpp:66
void reset(entities::ResetAction action) override
Definition ctrlblock.cpp:89
static CTRLBlock * from_entity_classifier(entities::EntityClassifier classifier, bus::addr_t block_address)
Definition ctrlblock.cpp:40
void set_adc_bus(ADCBus adc_bus_)
Definition ctrlblock.cpp:78
static constexpr auto CLASS_
Definition ctrlblock.h:65
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
EntityClassifier classifier
Definition base.h:217
virtual void reset(ResetAction action)
Definition base.h:155
virtual bool init()
returns true in case of success
Definition base.h:153
A recoverable error, inspired from https://abseil.io/docs/cpp/guides/status and https://github....
Definition error.h:35
static status success()
Syntactic sugar for success.
Definition error.h:104
Definition bus.h:22
uint16_t addr_t
Definition bus.h:27
std::array< uint8_t, 8 > eui_t
Definition base.h:20
bool has(uint8_t other)
Definition base.h:111
static constexpr uint8_t CIRCUIT_RESET
Definition base.h:102