REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
ublock.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
5#include <algorithm>
6
7#include <block/ublock.h>
8#include <entity/meta.h>
9#include <utils/logging.h>
10
11#include "teensy/ublock.h"
12#include <chips/SR74HCT595.h>
13
14FLASHMEM
15blocks::UBlock *blocks::UBlock::from_entity_classifier(entities::EntityClassifier classifier,
16 bus::addr_t block_address) {
17 if (!classifier or classifier.class_enum != CLASS_ or classifier.type != TYPE)
18 return nullptr;
19
20 if (classifier.version < entities::Version(1, 2))
21 return nullptr;
22 if (classifier.version < entities::Version(1, 3)) {
23 auto *new_block = new UBlock(new UBlockHAL_V_1_2_X(block_address));
24 new_block->classifier = classifier;
25 return new_block;
26 }
27 return nullptr;
28}
29
30const SPISettings functions::UMatrixFunction::DEFAULT_SPI_SETTINGS{4'000'000, MSBFIRST, SPI_MODE2};
31
33 : functions::DataFunction(address, DEFAULT_SPI_SETTINGS) {}
34
35FLASHMEM blocks::UBlockHAL_Common::UBlockHAL_Common(bus::addr_t block_address, const uint8_t f_umatrix_cs,
36 const uint8_t f_umatrix_sync_cs,
37 const uint8_t f_transmission_mode_register_cs,
38 const uint8_t f_transmission_mode_sync_cs,
39 const uint8_t f_transmission_mode_reset_cs)
40 : UBlockHAL_Parent(block_address),
41 f_umatrix(bus::replace_function_idx(block_address, f_umatrix_cs)),
42 f_umatrix_sync(bus::replace_function_idx(block_address, f_umatrix_sync_cs)),
43 f_transmission_mode_register(bus::replace_function_idx(block_address, f_transmission_mode_register_cs),
44 true),
45 f_transmission_mode_sync(bus::replace_function_idx(block_address, f_transmission_mode_sync_cs)),
46 f_transmission_mode_reset(bus::replace_function_idx(block_address, f_transmission_mode_reset_cs)) {}
47
48FLASHMEM bool blocks::UBlockHAL_Common::write_outputs(std::array<int8_t, 32> outputs) {
49 if (!f_umatrix.transfer(outputs))
50 return false;
51 f_umatrix_sync.trigger();
52 return true;
53}
54
56 std::pair<Transmission_Mode, Transmission_Mode> modes, Reference_Magnitude ref) {
57 // Reference magnitude is defined by lowest bit
58 // Group "A" mode is defined by the next two bits
59 // Group "B" mode is defined by the next two bits
60 // Remaining bits are not used
61 uint8_t data = 0b000'00'00'0;
62 data |= static_cast<uint8_t>(ref);
63 data |= (static_cast<uint8_t>(modes.first) << 1);
64 data |= (static_cast<uint8_t>(modes.second) << 3);
65
66 if (!f_transmission_mode_register.transfer8(data))
67 return false;
68 f_transmission_mode_sync.trigger();
69 return true;
70}
71
73 f_transmission_mode_reset.trigger();
74}
bool write_outputs(std::array< int8_t, 32 > outputs) override
Definition ublock.cpp:48
void reset_transmission_modes_and_ref() override
Definition ublock.cpp:72
bool write_transmission_modes_and_ref(std::pair< Transmission_Mode, Transmission_Mode > modes, Reference_Magnitude ref) override
Definition ublock.cpp:55
UBlockHAL_Common(bus::addr_t block_address, uint8_t f_umatrix_cs, uint8_t f_umatrix_sync_cs, uint8_t f_transmission_mode_register_cs, uint8_t f_transmission_mode_sync_cs, uint8_t f_transmission_mode_reset_cs)
Definition ublock.cpp:35
A DataFunction class wraps SPI communication over the digital bus.
Definition functions.h:47
UMatrixFunction(bus::addr_t address)
Definition ublock.cpp:32
static const SPISettings DEFAULT_SPI_SETTINGS
Definition ublock.h:30
Definition bus.h:21
namespace for internal helpers
Definition icmd.h:6