2024-01-10 22:18:30 +00:00
|
|
|
/* -*- c++ -*- */
|
|
|
|
/*
|
|
|
|
* Copyright 2023 CaribouLabs LTD.
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <gnuradio/io_signature.h>
|
|
|
|
#include "caribouLiteSource_impl.h"
|
|
|
|
|
|
|
|
namespace gr {
|
2024-02-03 21:55:46 +00:00
|
|
|
namespace caribouLite {
|
2024-01-10 22:18:30 +00:00
|
|
|
|
|
|
|
void detectBoard()
|
|
|
|
{
|
|
|
|
CaribouLite::SysVersion ver;
|
|
|
|
std::string name;
|
|
|
|
std::string guid;
|
|
|
|
|
|
|
|
if (CaribouLite::DetectBoard(&ver, name, guid))
|
|
|
|
{
|
|
|
|
std::cout << "Detected Version: " << CaribouLite::GetSystemVersionStr(ver) << ", Name: " << name << ", GUID: " << guid << std::endl;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::cout << "Undetected CaribouLite!" << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
2024-02-06 09:48:41 +00:00
|
|
|
caribouLiteSource::sptr caribouLiteSource::make(int channel,
|
|
|
|
bool enable_agc,
|
|
|
|
float rx_gain,
|
|
|
|
float rx_bw,
|
|
|
|
float sample_rate,
|
|
|
|
float freq,
|
2024-02-06 12:12:11 +00:00
|
|
|
bool provide_meta)
|
2024-01-10 22:18:30 +00:00
|
|
|
{
|
2024-02-06 09:48:41 +00:00
|
|
|
return gnuradio::make_block_sptr<caribouLiteSource_impl>(channel,
|
|
|
|
enable_agc,
|
|
|
|
rx_gain,
|
|
|
|
rx_bw,
|
|
|
|
sample_rate,
|
|
|
|
freq,
|
2024-02-06 12:12:11 +00:00
|
|
|
provide_meta);
|
2024-01-10 22:18:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2024-01-31 15:39:41 +00:00
|
|
|
// public constructor
|
2024-01-10 22:18:30 +00:00
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
2024-02-06 09:48:41 +00:00
|
|
|
caribouLiteSource_impl::caribouLiteSource_impl(int channel,
|
|
|
|
bool enable_agc,
|
|
|
|
float rx_gain,
|
|
|
|
float rx_bw,
|
|
|
|
float sample_rate,
|
|
|
|
float freq,
|
2024-02-06 12:12:11 +00:00
|
|
|
bool provide_meta)
|
2024-01-10 22:18:30 +00:00
|
|
|
: gr::sync_block("caribouLiteSource",
|
|
|
|
gr::io_signature::make(0, 0, 0),
|
2024-02-06 12:59:55 +00:00
|
|
|
gr::io_signature::make(1, 2, {sizeof(gr_complex), sizeof(uint8_t)})
|
|
|
|
)
|
2024-01-10 22:18:30 +00:00
|
|
|
{
|
2024-01-31 15:39:41 +00:00
|
|
|
detectBoard();
|
|
|
|
|
2024-01-10 22:18:30 +00:00
|
|
|
_channel = (CaribouLiteRadio::RadioType)channel;
|
|
|
|
_enable_agc = enable_agc;
|
|
|
|
_rx_gain = rx_gain;
|
|
|
|
_rx_bw = rx_bw;
|
|
|
|
_sample_rate = sample_rate;
|
|
|
|
_frequency = freq;
|
2024-02-06 12:12:11 +00:00
|
|
|
_provide_meta = provide_meta;
|
2024-02-06 09:48:41 +00:00
|
|
|
|
2024-01-31 16:45:05 +00:00
|
|
|
CaribouLite &cl = CaribouLite::GetInstance(false);
|
2024-01-10 22:18:30 +00:00
|
|
|
_cl = &cl;
|
|
|
|
_radio = cl.GetRadioChannel(_channel);
|
2024-02-06 12:12:11 +00:00
|
|
|
_mtu_size = _radio->GetNativeMtuSample();
|
2024-01-10 22:18:30 +00:00
|
|
|
|
|
|
|
// setup parameters
|
|
|
|
_radio->SetRxGain(rx_gain);
|
|
|
|
_radio->SetAgc(enable_agc);
|
|
|
|
_radio->SetRxBandwidth(rx_bw);
|
|
|
|
_radio->SetRxSampleRate(sample_rate);
|
|
|
|
_radio->SetFrequency(freq);
|
2024-01-31 16:35:51 +00:00
|
|
|
|
|
|
|
//do the thing
|
|
|
|
_radio->StartReceiving();
|
2024-01-10 22:18:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// virtual destructor
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
|
|
caribouLiteSource_impl::~caribouLiteSource_impl()
|
|
|
|
{
|
|
|
|
_radio->StopReceiving();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
2024-01-31 15:39:41 +00:00
|
|
|
int caribouLiteSource_impl::work(int noutput_items,
|
|
|
|
gr_vector_const_void_star &input_items,
|
|
|
|
gr_vector_void_star &output_items)
|
2024-01-10 22:18:30 +00:00
|
|
|
{
|
2024-02-05 18:01:10 +00:00
|
|
|
auto out_samples = static_cast<gr_complex*>(output_items[0]);
|
2024-02-06 12:12:11 +00:00
|
|
|
auto out_meta = _provide_meta == true ? static_cast<uint8_t*>(output_items[1]) : (uint8_t*) NULL ;
|
2024-04-10 15:19:38 +00:00
|
|
|
int read_samples = _radio->ReadSamples(out_samples, static_cast<size_t>(noutput_items), out_meta);
|
|
|
|
if (read_samples <= 0) { return 0;}
|
2024-04-10 10:28:15 +00:00
|
|
|
|
|
|
|
for (int i = 0; i < read_samples; i++)
|
|
|
|
{
|
2024-04-10 15:19:38 +00:00
|
|
|
if (out_meta[i] == 1) {
|
|
|
|
add_item_tag(0, i, pmt::string_to_symbol("pps") ,pmt::from_bool(true));
|
2024-04-10 10:28:15 +00:00
|
|
|
}
|
|
|
|
}
|
2024-02-06 09:28:17 +00:00
|
|
|
|
2024-04-10 10:28:15 +00:00
|
|
|
return read_samples;
|
2024-01-10 22:18:30 +00:00
|
|
|
}
|
|
|
|
|
2024-04-14 11:08:35 +00:00
|
|
|
//-------------------------------------------------------------------------------------------------------------
|
|
|
|
uint64_t caribouLiteSource_impl::getHandle() const
|
|
|
|
{
|
|
|
|
return (uint64_t)((void*)(_radio));
|
|
|
|
}
|
|
|
|
|
2024-01-10 22:18:30 +00:00
|
|
|
} /* namespace caribouLite */
|
|
|
|
} /* namespace gr */
|