From c16f54a7f01bb9eaca86acdaa3f0871f27007b8d Mon Sep 17 00:00:00 2001 From: Sergey Musikhin <musihin_sergei@mail.ru> Date: Fri, 11 Jun 2021 11:41:21 +0000 Subject: [PATCH] trigger functionality --- grc/gen_bladerf_blocks.py | 4 --- lib/bladerf/bladerf_common.cc | 55 ++++++++++++++++++++++++++++----- lib/bladerf/bladerf_common.h | 5 ++- lib/bladerf/bladerf_sink_c.cc | 4 +-- lib/bladerf/bladerf_source_c.cc | 3 +- lib/bladerf/common_sync_block.h | 5 --- lib/common_hier_block.h | 2 -- 7 files changed, 55 insertions(+), 23 deletions(-) diff --git a/grc/gen_bladerf_blocks.py b/grc/gen_bladerf_blocks.py index 09f8c43..e63b34a 100644 --- a/grc/gen_bladerf_blocks.py +++ b/grc/gen_bladerf_blocks.py @@ -136,10 +136,6 @@ inputs: id: pmic_in optional: true -- domain: message - id: fire - optional: true - % if sourk == 'source': outputs: diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc index 11d4065..adca35f 100644 --- a/lib/bladerf/bladerf_common.cc +++ b/lib/bladerf/bladerf_common.cc @@ -130,6 +130,30 @@ size_t num_streams(bladerf_channel_layout layout) #endif } +bladerf_trigger_signal get_signal(const std::string & name) +{ + const std::vector<std::pair<std::string, bladerf_trigger_signal>> signals + { + {"J71_4",BLADERF_TRIGGER_J71_4}, + {"J51_1",BLADERF_TRIGGER_J51_1}, + {"MINI_EXP_1",BLADERF_TRIGGER_MINI_EXP_1}, + {"USER_0",BLADERF_TRIGGER_USER_0}, + {"USER_1",BLADERF_TRIGGER_USER_1}, + {"USER_2",BLADERF_TRIGGER_USER_2}, + {"USER_3",BLADERF_TRIGGER_USER_3}, + {"USER_4",BLADERF_TRIGGER_USER_4}, + {"USER_5",BLADERF_TRIGGER_USER_5}, + {"USER_6",BLADERF_TRIGGER_USER_6}, + {"USER_7",BLADERF_TRIGGER_USER_7}, + }; + for(const auto & s: signals) + { + if(s.first == name) + return s.second; + } + return BLADERF_TRIGGER_INVALID; +} + /****************************************************************************** * Public methods ******************************************************************************/ @@ -296,13 +320,16 @@ void bladerf_common::init(dict_t const &dict, bladerf_direction direction) BLADERF_THROW_STATUS(status, "Failed to set bias-tee"); } } - } - - - - - + auto ch_trigger = ch_label("trigger"); + if(dict.count(ch_trigger) && _get(dict, ch_trigger) == "True") + { + auto role = _get(dict, ch_label("trigger_role")) == "master" + ? BLADERF_TRIGGER_ROLE_MASTER : BLADERF_TRIGGER_ROLE_SLAVE; + auto signal = get_signal(_get(dict, ch_label("trigger_signal"))); + setup_trigger(ch,signal,role); + } + } /* Show some info about the device we've opened */ print_device_info(); @@ -592,13 +619,14 @@ std::string bladerf_common::get_pmic_value(const std::string ®_name) } -void bladerf_common::setup_trigger(bladerf_channel ch, bladerf_trigger_signal signal, bool master) +void bladerf_common::setup_trigger(bladerf_channel ch, bladerf_trigger_signal signal, + bladerf_trigger_role role) { auto status = bladerf_trigger_init(_dev.get(), ch, signal, &_triggers[ch]); if (status != 0) { BLADERF_THROW_STATUS(status, "bladerf_trigger_init failed"); } - _triggers[ch].role = master ? BLADERF_TRIGGER_ROLE_MASTER : BLADERF_TRIGGER_ROLE_SLAVE; + _triggers[ch].role = role; // Arm the triggering functionality status = bladerf_trigger_arm(_dev.get(), &_triggers[ch], true, 0, 0); if (status != 0) { @@ -606,6 +634,17 @@ void bladerf_common::setup_trigger(bladerf_channel ch, bladerf_trigger_signal si } } +void bladerf_common::disable_triggers() +{ + for(auto & trigger: _triggers) + { + auto status = bladerf_trigger_arm(_dev.get(), &trigger.second, false, 0, 0); + if (status != 0) { + BLADERF_THROW_STATUS(status, "bladerf_trigger_arm failed"); + } + } +} + void bladerf_common::fire_trigger() { for(auto & trigger: _triggers) diff --git a/lib/bladerf/bladerf_common.h b/lib/bladerf/bladerf_common.h index ac6878a..816730f 100644 --- a/lib/bladerf/bladerf_common.h +++ b/lib/bladerf/bladerf_common.h @@ -185,7 +185,10 @@ protected: return value; } - void setup_trigger(bladerf_channel ch, bladerf_trigger_signal, bool master); + void setup_trigger(bladerf_channel ch, bladerf_trigger_signal signal, + bladerf_trigger_role role); + void disable_triggers(); + void fire_trigger(); diff --git a/lib/bladerf/bladerf_sink_c.cc b/lib/bladerf/bladerf_sink_c.cc index 1dbf3b5..d7b5634 100644 --- a/lib/bladerf/bladerf_sink_c.cc +++ b/lib/bladerf/bladerf_sink_c.cc @@ -177,7 +177,7 @@ bool bladerf_sink_c::start() } } } - + fire_trigger(); /* Allocate memory for conversions in work() */ size_t alignment = volk_get_alignment(); @@ -213,7 +213,7 @@ bool bladerf_sink_c::stop() } } } - + disable_triggers(); /* Deallocate conversion memory */ volk_free(_16icbuf); volk_free(_32fcbuf); diff --git a/lib/bladerf/bladerf_source_c.cc b/lib/bladerf/bladerf_source_c.cc index c140f7f..2ae1a75 100644 --- a/lib/bladerf/bladerf_source_c.cc +++ b/lib/bladerf/bladerf_source_c.cc @@ -241,12 +241,13 @@ bool bladerf_source_c::start() _32fcbuf = reinterpret_cast<gr_complex *>(volk_malloc(_samples_per_buffer*sizeof(gr_complex), alignment)); _running = true; - + fire_trigger(); return true; } bool bladerf_source_c::stop() { + disable_triggers(); int status; BLADERF_DEBUG("stopping source"); diff --git a/lib/bladerf/common_sync_block.h b/lib/bladerf/common_sync_block.h index 780393a..6b4b980 100644 --- a/lib/bladerf/common_sync_block.h +++ b/lib/bladerf/common_sync_block.h @@ -14,7 +14,6 @@ public: void setup_blade_messaging() { message_port_register_in(pmt::mp("pmic_in")); - message_port_register_in(pmt::mp("fire")); message_port_register_out(pmt::mp("pmic_out")); set_msg_handler(pmt::mp("pmic_in"),[=](const pmt::pmt_t & msg) @@ -25,10 +24,6 @@ public: message_port_pub(pmt::mp("pmic_out"), pair); }); - set_msg_handler(pmt::mp("fire"),[=](const pmt::pmt_t & msg) - { - fire_trigger(); - }); } }; diff --git a/lib/common_hier_block.h b/lib/common_hier_block.h index fdf0d5e..53f0121 100644 --- a/lib/common_hier_block.h +++ b/lib/common_hier_block.h @@ -12,7 +12,6 @@ public: } void setup_message_ports() { - message_port_register_hier_in(pmt::mp("fire")); message_port_register_hier_in(pmt::mp("pmic_in")); message_port_register_hier_out(pmt::mp("pmic_out")); @@ -20,7 +19,6 @@ public: template<typename T> void setup_device_connects(T device) { - msg_connect(self(), pmt::mp("fire"), device, pmt::mp("fire")); msg_connect(self(), pmt::mp("pmic_in"), device, pmt::mp("pmic_in")); msg_connect(device,pmt::mp("pmic_out"), self(), pmt::mp("pmic_out")); } -- GitLab