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
14
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
34
35blocks::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, 3), f_umatrix(bus::replace_function_idx(block_address, f_umatrix_cs)),
41 f_umatrix_sync(bus::replace_function_idx(block_address, f_umatrix_sync_cs)),
42 f_transmission_mode_register(bus::replace_function_idx(block_address, f_transmission_mode_register_cs),
43 f_transmission_mode_register_cs == 2 ? 3 : 2, true),
44 f_transmission_mode_sync(bus::replace_function_idx(block_address, f_transmission_mode_sync_cs)),
45 f_transmission_mode_reset(bus::replace_function_idx(block_address, f_transmission_mode_reset_cs)) {}
46
47bool blocks::UBlockHAL_Common::write_outputs(std::array<int8_t, 32> outputs) {
48 if (!f_umatrix.transfer(outputs))
49 return false;
50 f_umatrix_sync.trigger();
51 return true;
52}
53
55 std::pair<Transmission_Mode, Transmission_Mode> modes, Reference_Magnitude ref) {
56 // Reference magnitude is defined by lowest bit
57 // Group "A" mode is defined by the next two bits
58 // Group "B" mode is defined by the next two bits
59 // Remaining bits are not used
60 uint8_t data = 0b000'00'00'0;
61 data |= static_cast<uint8_t>(ref);
62 data |= (static_cast<uint8_t>(modes.first) << 1);
63 data |= (static_cast<uint8_t>(modes.second) << 3);
64
65 if (!f_transmission_mode_register.transfer8(data))
66 return false;
68 return true;
69}
70
void reset_transmission_modes_and_ref() override
Definition ublock.cpp:71
const functions::SR74HCT595 f_transmission_mode_register
Definition ublock.h:45
const functions::TriggerFunction f_transmission_mode_sync
Definition ublock.h:46
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
bool write_outputs(std::array< int8_t, 32 > outputs) override
Definition ublock.cpp:47
const functions::TriggerFunction f_umatrix_sync
Definition ublock.h:36
const functions::UMatrixFunction f_umatrix
Definition ublock.h:35
bool write_transmission_modes_and_ref(std::pair< Transmission_Mode, Transmission_Mode > modes, Reference_Magnitude ref) override
Definition ublock.cpp:54
const functions::TriggerFunction f_transmission_mode_reset
Definition ublock.h:47
const bus::addr_t address
Definition functions.h:23
UMatrixFunction(bus::addr_t address)
Definition ublock.cpp:32
static const SPISettings DEFAULT_SPI_SETTINGS
Definition ublock.h:30
DataFunction(bus::addr_t address, uint8_t alt_function_idx, const SPISettings &spiSettings)
Definition functions.cpp:24
entities::EntitySharedHardware< UBlockHAL > UBlockHAL_Parent
Definition ublock.h:31
Definition bus.h:21