diff --git a/src/limedriver.cpp b/src/limedriver.cpp index f6ee070..19c5309 100644 --- a/src/limedriver.cpp +++ b/src/limedriver.cpp @@ -15,6 +15,7 @@ h5c++ -shlib limedriver.cpp -std=c++11 -lLimeSuite -o limedriver #include "limedriver.h" #include +#include #include #include @@ -114,6 +115,48 @@ std::vector getDeviceList() { return deviceList; } +lms_device_t *openDevice(const std::string &info) { + // Open the device with the given info string + + string info_string = info; + + if (info_string.empty()) { + std::vector deviceList = getDeviceList(); + if (deviceList.size() == 0) { + std::cout << "No devices found" << std::endl; + error(); + } + + info_string = deviceList[0]; + } + + lms_device_t *dev = NULL; + if (LMS_Open(&dev, info_string.c_str(), NULL)) { + error(); + } + + return dev; +} + +std::pair getDeviceChannels(lms_device_t *dev) { + // Get the number of RX and TX channels of the device + + lms_info_str_t list[10]; + int rx = LMS_GetNumChannels(dev, LMS_CH_RX); + int tx = LMS_GetNumChannels(dev, LMS_CH_TX); + + return std::make_pair(rx, tx); +} + +std::pair getChannelsFromInfo(const std::string &info) { + // Get the number of RX and TX channels from the device info string + lms_device_t *dev = openDevice(info); + std::pair values = getDeviceChannels(dev); + LMS_Close(dev); + return values; +} + + // Custom function to read back the gain of the RX/TX channels. The API function // GetGaindB has to be avoided, as it also modifies the gain, which is useless // and dangerous.. @@ -192,6 +235,9 @@ int GetGainRXTX(int *RXgain, int *TXgain) { std::vector getHDFAttributes(LimeConfig_t &LimeCfg) { std::vector HDFattr = { + {"dev", "Device", + H5::StrType(H5::PredType::C_S1, LimeCfg.device.length() + 1), + (void *)LimeCfg.device.c_str(), 1}, {"sra", "SampleRate [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.srate, 1}, {"chn", "Channel", H5::PredType::NATIVE_INT, &LimeCfg.channel, 1}, {"rmt", "RX Matching", H5::PredType::NATIVE_INT, &LimeCfg.RX_matching, 1}, @@ -400,6 +446,8 @@ LimeConfig_t initializeLimeConfig(int Npulses) { // Set all the DEFAULT parameters. Command line arguments allow for // modification! + LimeCfg.device = ""; + LimeCfg.srate = 30.72e6; // sample rate of the IF DAC/ADC LimeCfg.channel = 0; // channel to use, LimeCfg.RX_matching = 0; // RX matching network - 0 to use previous logic @@ -830,33 +878,33 @@ int run_experiment(LimeConfig_t LimeCfg, if (list.size() < 1) return -1; + if (LimeCfg.device == "") { + LimeCfg.device = list[0]; + cout << "Automatically selecting device: " << LimeCfg.device << endl; + } + // open the first device - if (LMS_Open(&device, list[0].c_str(), NULL)) + if (LMS_Open(&device, LimeCfg.device.c_str(), NULL)) error(); - /* - //print available antennae names - //select antenna port - lms_name_t antenna_list[10]; //large enough list for antenna names. - //Alternatively, NULL can be passed to LMS_GetAntennaList() to obtain - number of antennae if ((n = LMS_GetAntennaList(device, LMS_CH_RX, 0, - antenna_list)) < 0) error(); - - // get and print antenna index and name - if ((n = LMS_GetAntenna(device, LMS_CH_RX, 0)) < 0) error(); - cout << "Automatically selected RX LNA: " << n << ": " << - antenna_list[n] << endl; - */ - // Get number of channels - int num_rx_channels, num_tx_channels; - if ((num_rx_channels = LMS_GetNumChannels(device, LMS_CH_RX)) < 0) - error(); + std::pair num_channels = getDeviceChannels(device); + int num_rx_channels = num_channels.first; + int num_tx_channels = num_channels.second; cout << "Number of RX channels: " << num_rx_channels << endl; - if ((num_tx_channels = LMS_GetNumChannels(device, LMS_CH_TX)) < 0) - error(); cout << "Number of TX channels: " << num_tx_channels << endl; + if (num_rx_channels < 1 || num_tx_channels < 1) { + cout << "No RX or TX channels found!" << endl; + error(); + } + + // Check if the channel selected in the config is valid + if (LimeCfg.channel < 0 || LimeCfg.channel >= num_rx_channels) { + cout << "Invalid channel selected: " << LimeCfg.channel << endl; + error(); + } + // check if the settings are already there float_type frq_read; if (LMS_GetLOFrequency(device, LMS_CH_RX, LimeCfg.channel, &frq_read) != 0) @@ -1042,8 +1090,7 @@ DC_Q << endl; error(); // get and print antenna index and name - if ((rx_path = LMS_GetAntenna(device, LMS_CH_RX, LimeCfg.channel)) < - 0) + if ((rx_path = LMS_GetAntenna(device, LMS_CH_RX, LimeCfg.channel)) < 0) error(); cout << "Manually selected RX LNA: " << rx_path << ": " << antenna_list[rx_path] << endl; @@ -1074,8 +1121,7 @@ DC_Q << endl; error(); // get and print print antenna index and name - if ((tx_path = LMS_GetAntenna(device, LMS_CH_TX, LimeCfg.channel)) < - 0) + if ((tx_path = LMS_GetAntenna(device, LMS_CH_TX, LimeCfg.channel)) < 0) error(); cout << "Manually selected TX pathway: " << tx_path << ": " << antenna_list[tx_path] << endl; diff --git a/src/limedriver.h b/src/limedriver.h index 4ede4ef..1f657a9 100644 --- a/src/limedriver.h +++ b/src/limedriver.h @@ -24,10 +24,12 @@ #include // _mkdir #endif -#define VERSION "0.3.0" +#define VERSION "0.4.0" struct LimeConfig_t { + std::string device; + float srate; int channel; int RX_matching; @@ -138,4 +140,9 @@ LimeConfig_t initializeLimeConfig(int Npulses); */ int run_experiment_from_LimeCfg(LimeConfig_t LimeCfg); +std::pair getDeviceChannels(lms_device_t *dev); +std::pair getChannelsFromInfo(const std::string &info); + +std::vector getDeviceList(); + #endif // LIMECONFIG_H \ No newline at end of file