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 <proto/main.pb.h>
7#include <block/ctrlblock.h>
8
9// bus::address_from_tuple(1, 0)
10blocks::CTRLBlock::CTRLBlock(CTRLBlockHALBase *hardware) : FunctionBlock("CTRL", hardware), hardware(hardware) {
11 classifier.class_enum = CLASS_;
12}
13
14metadata::eui_t blocks::CTRLBlock::get_entity_eui() const {
15 if (hardware)
16 return hardware->get_entity_eui();
17 return {};
18}
19
20bool blocks::CTRLBlock::write_to_hardware() {
21 if (!hardware->write_adc_bus_muxers(adc_bus))
22 return UnitResult::err("Writing ctrl-block adc bus muxes failed");
23 return UnitResult::ok();
24}
25
26bool blocks::CTRLBlock::init() {
27 // Hardware defaults are not very good, e.g. adc bus is by default on CL0_GAIN.
28 // That's why we write more sane defaults on init.
29 return FunctionBlock::init() && write_to_hardware();
30}
31
32blocks::CTRLBlock::ADCBus blocks::CTRLBlock::get_adc_bus() const { return adc_bus; }
33
34void blocks::CTRLBlock::set_adc_bus(blocks::CTRLBlock::ADCBus adc_bus_) { adc_bus = adc_bus_; }
35
36void blocks::CTRLBlock::reset_adc_bus() { adc_bus = ADCBus::ADC; }
37
38bool blocks::CTRLBlock::set_adc_bus_to_cluster_gain(uint8_t cluster_idx) {
39 if (cluster_idx >= 3)
40 return false;
41 set_adc_bus(static_cast<ADCBus>(cluster_idx));
42 return true;
43}
44
45void blocks::CTRLBlock::reset(entities::ResetAction action) {
46 FunctionBlock::reset(action);
47
48 if (action.has(entities::ResetAction::CIRCUIT_RESET))
49 reset_adc_bus();
50}
51
52UnitResult blocks::CTRLBlock::send_sync(uint8_t id) {
53 if (!hardware->write_sync_id(id))
54 return UnitResult::err("Error while sending SYNC.");
55 return UnitResult::ok();
56}