On 2021-09-10 10:18 a.m., Dobler, Anton wrote:
Dear all,
I am currently trying to write an OOT block to switch a GPIO pin high
or low depending on the input signal. So far it has worked with the
configuration of the pins and I can also switch the pins according to
the input signal in a relatively simple flowgraph consisting of a
signal generator that produces a square wave signal.
The block's work function looks like this:
int GPIO_IO_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
const float *in_signal = (const float *) input_items[0];
for(int i=0; i < noutput_items; i++) {
if(in_signal[i] >= d_threshold)
{
_dev->set_gpio_attr(gpio, std::string("OUT"), "HIGH",
0xffffffff)
}
if(in_signal[i] < d_threshold)
{
_dev->set_gpio_attr(gpio, std::string("OUT"), "LOW",
0xffffff);
}
boost::this_thread::sleep_for(boost::chrono::nanoseconds((unsigned
long long)d_samp_period));
}
return noutput_items;
}
The sleep function is important in that without it, regardless of the
sampling rate of the square wave signal, the pin is switched with a
period of 20us. If I use the sleep function, the whole thing works
better, but only up to a sampling rate of about 20kHz. I have read a
little bit about the function of the scheduler in GNURadio, but I did
not find a solution.
Starting from the standing approach, I have tried using both Timed
Commands and Boost Signals, with the result that the pins are switched
completely asynchronously. Since I don't really know what to do at
this point, I wanted to ask if any of you had experience with this
kind of OOT block in GNURadio.
Best regards,
Anton
Could you clarify--you WANT the pins to be switched at a very high
rate--that is you expect your input signal to be switching between
thresholds with a period smaller than 20us?