REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
functions.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 <array>
8#include <cstdint>
9
10#include "teensy/bus.h"
11
12namespace functions {
13
21class Function {
22public:
23 const bus::addr_t address;
24
25 // explicit keyword shall most certainly avoid accidental downcasting
26 explicit Function(bus::addr_t address);
27};
28
33class TriggerFunction : public Function {
34public:
35 void trigger(uint32_t pulse_length_ns = 200) const;
36
38};
39
47class DataFunction : public Function {
48protected:
49 static SPIClass &get_raw_spi();
51 bool use_csel = false;
52
53public:
54 const SPISettings &spi_settings;
55
56 /*
57 * Constructor for a new DataFunction.
58 * To take care of the SPI bus hardware issues
59 * (https://lab.analogparadigm.com/lucidac/hardware/dimm-template-rev1/-/issues/2) each DataFunction must
60 * provide an alternative function index, which gets activated first, to take care of those issues.
61 *
62 * CARE: In my goal to optimize resource usage, I did not want each instance of DataFunction to hold
63 * onto its own SPISettings object, as e.g. all N ~= 100 coefficients use the same. Instead, a reference to
64 * e.g. a static member variable of the subclass should be passed. If the constructor is called like
65 * DataFunction(address, SPISettings(...)), the reference to the cleaned-up SPISettings object will be
66 * invalid and things will break.
67 */
68 DataFunction(bus::addr_t address, uint8_t alt_function_idx, const SPISettings &spiSettings);
69
70 void begin_communication() const;
71 void end_communication() const;
72
73 void transfer(const void *mosi_buf, void *miso_buf, size_t count) const;
74 uint8_t transfer8(uint8_t data_in) const;
75 uint16_t transfer16(uint16_t data_in) const;
76 uint32_t transfer32(uint32_t data_in) const;
77};
78
79class SyncFunction : public DataFunction {
80public:
83};
84
85} // namespace functions
void end_communication() const
Definition functions.cpp:60
static SPIClass & get_raw_spi()
Definition functions.cpp:95
uint16_t transfer16(uint16_t data_in) const
Definition functions.cpp:81
const SPISettings & spi_settings
Definition functions.h:54
uint8_t transfer8(uint8_t data_in) const
Definition functions.cpp:74
void begin_communication() const
Definition functions.cpp:31
DataFunction(bus::addr_t address, uint8_t alt_function_idx, const SPISettings &spiSettings)
Definition functions.cpp:24
void transfer(const void *mosi_buf, void *miso_buf, size_t count) const
Definition functions.cpp:68
uint32_t transfer32(uint32_t data_in) const
Definition functions.cpp:88
bus::addr_t alt_function_address
Definition functions.h:50
Function(bus::addr_t address)
Definition functions.cpp:7
const bus::addr_t address
Definition functions.h:23
DataFunction(bus::addr_t address, uint8_t alt_function_idx, const SPISettings &spiSettings)
Definition functions.cpp:24
A trigger function exploits the fact that setting an address on the bus triggers an action.
Definition functions.h:33
Function(bus::addr_t address)
Definition functions.cpp:7
void trigger(uint32_t pulse_length_ns=200) const
Definition functions.cpp:9
uint32_t
Definition flasher.cpp:195
namespace for internal helpers
Definition icmd.h:6