8#include <entity/visitor.h>
9#include <lucidac/lucidac.h>
12platform::LUCIDAC::LUCIDAC(LUCIDAC_HAL *hardware)
13 : Carrier({Cluster(0)}, hardware), hardware(hardware) {}
15bool platform::LUCIDAC::init() {
16 LOG(ANABRID_DEBUG_INIT, __PRETTY_FUNCTION__);
20 LOG(ANABRID_DEBUG_INIT,
"Detecting front panel...");
22 front_panel = entities::detect<LUCIDACFrontPanel>(bus::address_from_tuple(bus::FRONTPLANE_BADDR, 0));
24 LOG_ALWAYS(
"Warning: Front panel is missing or unknown.");
26 LOG(ANABRID_DEBUG_INIT,
"Initialising detected front panel...");
27 if (!front_panel->init()) {
28 LOG_ALWAYS(
"Error: Could not initialize front panel");
30 LOG(ANABRID_DEBUG_INIT,
"Front panel initialized.");
35 return status::success();
38void platform::LUCIDAC::reset(entities::ResetAction action) {
39 Carrier::reset(action);
41 front_panel->reset(action);
43 if (action.has(entities::ResetAction::CIRCUIT_RESET)) {
49status platform::LUCIDAC::route_in_external(uint8_t in, uint8_t i_out) {
51 return status(
"in must be less or equal to 7");
53 if (!clusters[0].iblock->connect(in + 24, i_out))
54 return status(
"I block connection not possible");
55 return status::success();
58status platform::LUCIDAC::route_out_external(uint8_t u_in, uint8_t out,
float c_factor) {
60 return status(
"out must be less or equal to 7");
62 if (!clusters[0].ublock->connect(u_in, out + 24))
63 return status(
"U block connection not possible");
64 if (!clusters[0].cblock->set_factor(out + 24, c_factor))
65 return status(
"C block configuration not possible");
66 return status::success();
69std::vector<entities::Entity *> platform::LUCIDAC::get_child_entities() {
70 auto entities = this->Carrier::get_child_entities();
76entities::Entity *platform::LUCIDAC::get_child_entity(std::string_view child_id) {
79 return this->carrier::Carrier::get_child_entity(child_id);
82status platform::LUCIDAC::write_to_hardware() {
83 status error = Carrier::write_to_hardware();
85 front_panel->write_to_hardware().attach_to(error,
"Front Panel write failed.");
86 if (!hardware->write_acl(acl_select))
87 error.attach(1 << 5,
"Write ACL failed");
91const std::array<platform::LUCIDAC::ACL, 8> &platform::LUCIDAC::get_acl_select()
const {
95void platform::LUCIDAC::set_acl_select(
const std::array<ACL, 8> &acl_select_) {
96 acl_select = acl_select_;
99bool platform::LUCIDAC::set_acl_select(uint8_t idx, LUCIDAC::ACL acl) {
100 if (idx >= acl_select.size())
102 acl_select[idx] = acl;
106void platform::LUCIDAC::reset_acl_select() {
107 std::fill(acl_select.begin(), acl_select.end(), ACL::INTERNAL_);
112status platform::LUCIDAC::calibrate_routes() {
113 LOG(ANABRID_DEBUG_CALIBRATION, __PRETTY_FUNCTION__);
118 auto& cluster = clusters[0];
119 std::array<std::vector<uint8_t>, blocks::IBlock::NUM_OUTPUTS> old_i_block_connections;
120 for (
auto i_out_idx : blocks::IBlock::OUTPUT_IDX_RANGE())
121 for (
auto i_in_idx : blocks::IBlock::INPUT_IDX_RANGE())
122 if (cluster.iblock->is_connected(i_in_idx, i_out_idx))
123 old_i_block_connections[i_out_idx].emplace_back(i_in_idx);
126 auto old_acl_selection = get_acl_select();
128 if (!hardware->write_acl(acl_select))
129 success.attach(
"Writing ACL before calibrate_routes() failed");
131 success.attach(Carrier::calibrate_routes());
133 set_acl_select(old_acl_selection);
134 if (!hardware->write_acl(acl_select))
135 success.attach(
"Writing ACL after calibrate_routes() failed");
138 for (
auto i_out_idx : blocks::IBlock::OUTPUT_IDX_RANGE())
139 for (
auto i_in_idx : old_i_block_connections[i_out_idx])
140 if (!cluster.iblock->connect(i_in_idx, i_out_idx))
141 LOG_ANABRID_DEBUG_CALIBRATION(
"Connecting i-block failed");
143 if (!cluster.iblock->write_to_hardware())
144 success.attach(
"Restoring i-block failed");
146 LOG(ANABRID_DEBUG_CALIBRATION, __PRETTY_FUNCTION__);
151ConfigResult platform::LUCIDAC::config(
const pb_Config &cfg) {
152 if (cfg.which_kind == pb_Config_port_config_tag) {
153 auto& port_config = cfg.kind.port_config;
156 for (
size_t idx = 0; idx < port_config.states_count ; ++idx) {
157 acl_select[idx] = (port_config.states[idx] == pb_PortConfig_AclState_EXTERNAL) ?
158 ACL::EXTERNAL_ : ACL::INTERNAL_;
161 if (!hardware->write_acl(acl_select))
162 return ConfigResult::err(
"cannot write acl select to hardware");
164 return ConfigResult::ok(
true);
167 return Carrier::config(cfg);
170void platform::LUCIDAC::extract(entities::ExtractVisitor &collector) {
171 Carrier::extract(collector);
173 auto& cfg = collector.create(pb_Config_port_config_tag);
174 auto& lucidac_config = cfg.kind.port_config;
176 lucidac_config.states_count = acl_select.size();
177 for (
size_t idx = 0; idx < acl_select.size(); idx++) {
178 lucidac_config.states[idx] =
179 (acl_select[idx] == ACL::EXTERNAL_)
180 ? pb_PortConfig_AclState_EXTERNAL
181 : pb_PortConfig_AclState_INTERNAL;
185status platform::LUCIDAC::calibrate_offsets() {
186 LOG(ANABRID_DEBUG_CALIBRATION, __PRETTY_FUNCTION__);
189 auto old_acl_selection = get_acl_select();
191 if (!hardware->write_acl(acl_select))
192 success.attach(
"Writing ACL before calibrate_offsets() failed");
194 success.attach(Carrier::calibrate_offsets());
196 set_acl_select(old_acl_selection);
197 if (!hardware->write_acl(acl_select))
198 success.attach(
"Writing ACL after calibrate_offsets() failed");
200 LOG(ANABRID_DEBUG_CALIBRATION, __PRETTY_FUNCTION__);
static constexpr int success