From a988ca1a061b322f20f28e8106b8c217b3a6b73a Mon Sep 17 00:00:00 2001 From: jupfi Date: Tue, 9 Jan 2024 18:25:15 +0100 Subject: [PATCH] Added preliminary drivers for lime spectrometer w. permission from Andrin Doll. --- .gitignore | 7 - .../contrib/limr.py | 533 +++++ .../contrib/pulseN_test_USB | Bin 0 -> 451440 bytes .../contrib/pulseN_test_USB.cpp | 1834 ++++++++++++++++ .../contrib/pulseN_test_USB_TX2 | Bin 0 -> 453984 bytes .../contrib/pulseN_test_USB_TX2.cpp | 1851 +++++++++++++++++ 6 files changed, 4218 insertions(+), 7 deletions(-) create mode 100644 src/nqrduck_spectrometer_limenqr/contrib/limr.py create mode 100755 src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB create mode 100644 src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB.cpp create mode 100755 src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2 create mode 100644 src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2.cpp diff --git a/.gitignore b/.gitignore index 473acdf..8bfe87e 100644 --- a/.gitignore +++ b/.gitignore @@ -20,10 +20,3 @@ venv/ # Other *.DS_Store - -# Contrib files without permission -src/nqrduck_spectrometer_limenqr/contrib/limr.py -src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB.cpp -src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB -src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2 -src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2.cpp \ No newline at end of file diff --git a/src/nqrduck_spectrometer_limenqr/contrib/limr.py b/src/nqrduck_spectrometer_limenqr/contrib/limr.py new file mode 100644 index 0000000..1123bf3 --- /dev/null +++ b/src/nqrduck_spectrometer_limenqr/contrib/limr.py @@ -0,0 +1,533 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Dec 7 10:46:20 2018 + +@author: andrin + +Class that eases interfacing with the limesdr routines written in Cpp, +notably the pulse_test_USB and pulseN_test_USB routines, which runs a pulse sequence +according to passed arguments + +The class allows for setting of the arguments as well as for parametric sweeps to +implement arbitrary sequences + +Note for release: The communication between the python and the Cpp routine is very rudimentary, meaning using command line arguments that are parametrically read from the Cpp source. +Update Feb 2020: Slight changes to make it compatible with Python 3 + +""" +import subprocess # to call the program +import datetime # to generate timestamps for parsweeps +import h5py # to have organized data storage..... +import numpy as np # ... +import matplotlib.pyplot as plt + + +class limr(): + + def __init__(self, filename = './pulseN_USB.cpp'): + + # check first for the filename provided + if filename[-3:] == 'cpp': + self.Csrc = filename + else: + self.Csrc = './pulseN_USB.cpp' + + # the program to call + self.Cprog = self.Csrc[:-4] + + fp = open(self.Csrc, 'r') + + in_arg = {} + startpattern = 'struct Config2HDFattr_t HDFattr[]' + stoppattern = '};' + parsing = False + ii_oupargs = 0 + for line in fp.readlines(): + if (stoppattern in line) & parsing: + break + if parsing: + stripped = line.replace('\t','').replace('"','').strip('\n').strip(',').strip('{').strip('}') + splitted = stripped.split(',') + # remove irrrelevant stuff + rmvidx = range(4,len(splitted)-1) + for ii in range(len(rmvidx)): + splitted.pop(4) + if splitted[0] == '///': + splitted[0] = '//' + str(ii_oupargs) + ii_oupargs+=1 + in_arg[splitted[0]] = splitted + in_arg[splitted[0]][0] = [] + if startpattern in line: + parsing = True + fp.close() + + self.parsinp = in_arg + + for key in in_arg: + setattr(self, key, in_arg[key][0]) + + # initialize other variables + self.parvar = {} + self.parvar_cpl = {} + self.HDFfile = [] + + self.HDF = HDF() + + self.segcount = 0 + + # print the arguments that have been set + def print_params(self, allel = False): + for key in sorted(self.parsinp): + val = getattr(self,key) + if (val != []) | (allel): + print('{:<5}: {:>50} {:<25}'.format(key, val, self.parsinp[key][1])) + + + + # add parameter variation: + # key is the argument to vary + # idx the indices of values + # strt the starting point + # end the endpoint + # npts the dimension of the sweep + def parsweep(self, key, strt, end, npts, idx = 0): + + if ~isinstance(idx,list): idx = [idx] # idx as list eases iteration + + # check the key + try: + vals = getattr(self,key) + except: + print('Problem with sweep: Key ' + key + ' is not valid! See below for valid keys') + self.print_params(allel=True) + return + + # check for existing val and for proper dimension. Dimension is a priori not known due to number of pulses that can be flexible + if (vals == []): + print('Problem with sweep: Initialize first a value to argument ' + key +'. I will try with assuming zero') + vals = 0; + if isinstance(vals, (list, np.ndarray)): + if len(vals) < max(idx): + print('Problem with sweep: ' + key + ' has only ' + str(len(vals)) + ' objects, while an index of ' + str(max(idx)) + ' was requested!') + return + startlist = [[vals[jj] for jj in range(len(vals))] for ii in range(npts)] + elif max(idx) > 0: + print('Problem with sweep: ' + key + ' is scalar, while an index of ' + str(max(idx)) + ' was requested!') + return + else: + startlist = [[vals] for ii in range(npts)] + + # check if a parvar already exists for this key + if len(self.parvar) == 0: + self.parvar['sweeplist'] = startlist + elif not((key == self.parvar['key']) & (npts == self.parvar['dim'])): + self.parvar['sweeplist'] = startlist + + self.parvar['key'] = key + self.parvar['dim'] = npts + + if npts > 1: + incr = (end - strt)/(npts-1) + else: + incr = 0; + + + for ii_swp in range(npts): + for swp_idx in idx: + self.parvar['sweeplist'][ii_swp][swp_idx] = strt + ii_swp*incr + + # add coupled parameter variation of another variable: (one variable is not enough... two neither, but better than one. A list of dicts would more general....) + # key is the argument to vary + # idx the indices of values + # strt the starting point + # end the endpoint + # npts the dimension of the sweep + def parsweep_cpl(self, key, strt, end, npts, idx = 0): + + if ~isinstance(idx,list): idx = [idx] # idx as list eases iteration + + # check the key + try: + vals = getattr(self,key) + except: + print('Problem with sweep: Key ' + key + ' is not valid! See below for valid keys') + self.print_params(allel=True) + return + + # check for existing val and for proper dimension. Dimension is a priori not known due to number of pulses that can be flexible + if (vals == []): + print('Problem with sweep: Initialize first a value to argument ' + key +'. I will try with assuming zero') + vals = 0; + if isinstance(vals, (list, np.ndarray)): + if len(vals) < max(idx): + print('Problem with sweep: ' + key + ' has only ' + str(len(vals)) + ' objects, while an index of ' + str(max(idx)) + ' was requested!') + return + startlist = [[vals[jj] for jj in range(len(vals))] for ii in range(npts)] + elif max(idx) > 0: + print('Problem with sweep: ' + key + ' is scalar, while an index of ' + str(max(idx)) + ' was requested!') + return + else: + startlist = [[vals] for ii in range(npts)] + + # check if a parvar already exists for this key + if len(self.parvar_cpl) == 0: + self.parvar_cpl['sweeplist'] = startlist + elif not((key == self.parvar_cpl['key']) & (npts == self.parvar_cpl['dim'])): + self.parvar_cpl['sweeplist'] = startlist + + self.parvar_cpl['key'] = key + self.parvar_cpl['dim'] = npts + + incr = (end - strt)/(npts-1) + + for ii_swp in range(npts): + for swp_idx in idx: + self.parvar_cpl['sweeplist'][ii_swp][swp_idx] = strt + ii_swp*incr + + + + def run(self, oup = True): + # check if there is a parvar or only a single + if len(self.parvar) == 0: + self.__run_single(oup) + else: + # store the value currently in the swept parameter + stdval = getattr(self, self.parvar['key']) + + if len(self.parvar_cpl) != 0: + stdval2 = getattr(self, self.parvar_cpl['key']) + + # handle the timestamp + stddatestr = getattr(self,'fst') + if (stddatestr == []): + setattr(self, 'fst', datetime.datetime.now().strftime("%Y%m%d_%H%M%S")) + + # give it a useful name + stdfilepat = getattr(self,'fpa') + if (stdfilepat == []): + setattr(self, 'fpa', self.parvar['key'] + '_swp') + + # actual iteration over the sweeplist + for ii in range(self.parvar['dim']): + setattr(self, self.parvar['key'], self.parvar['sweeplist'][ii]) + if len(self.parvar_cpl) != 0: # as well as the coupled variable + setattr(self, self.parvar_cpl['key'], self.parvar_cpl['sweeplist'][ii]) + + self.__run_single(oup) + + # save parvar info as attribute, which means that we need to detect the file + if getattr(self,'nos') != 0: # this one is suspicious... + if self.HDFfile == []: + self.HDFfile = self.__guess_savepath() + try: + # this is probably erroneous and was never recognized...! self.parvar is not a key/value pair + f = h5py.File(self.HDFfile, 'r+') + for key in self.parvar: + f.attrs.create(key, self.parvar[key]) + f.close() + except: + print('Problem opening file ' + self.HDFfile) + + setattr(self, self.parvar['key'], stdval) # set back to non-swept value + setattr(self, 'fst', stddatestr) # set back to non-swept value + setattr(self, 'fpa', stdfilepat) # set back to non-swept value + if len(self.parvar_cpl) != 0: + setattr(self, self.parvar_cpl['key'], stdval2) # set back to non-swept value + + + def readHDF(self, filename = ''): + if filename != '': + self.HDFfile = filename + + self.HDF.load(self.HDFfile) + + + # helper functoin to guess the savepath from the file. This should not be called, since it should be obtained from the output of the program call + def __guess_savepath(self): + savepath = getattr(self,'spt') + if savepath == []: savepath = './asdf/' # not recommended here: knowledge about the standard directory in the cpp file.... could be parsed, but user will usually provide a folder to limr.spt + if savepath[-1] != '/': savepath += '/' # and that little fix since users seldomly put the '/' for the directory... + savepath = savepath + getattr(self,'fst') + '_' + getattr(self,'fpa') + '.h5' + return savepath + + # run for one single constellation + def __run_single(self, oup = True): + terminated = False + + while (terminated == False): + + str2call= self.Cprog + + for key in self.parsinp: + vals = getattr(self,key) + if (vals == []): continue # ignore arguments that are not set + str2call += ' -' + key # set the key and then the value/s + if isinstance(vals, (list, np.ndarray)): + for val in vals: + str2call += ' ' + str(val) + else: + str2call += ' ' + str(vals) + + + if oup: print(str2call) + p = subprocess.Popen(str2call.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT); + + if getattr(self,'nos') != 0: + terminated = True + + for line_b in p.stdout.readlines(): + line = line_b.decode('utf-8').rstrip() + if oup: print(line), + if '.h5' in line: + self.HDFfile = line + terminated = True + if 'Unable to open device' in line: + terminated = True + if 'Muted output, exiting immediate' in line: + terminated = True + if self.Cprog + ': not found' in line: + terminated = True + if 'Devices found: 0' in line: + terminated = True + if 'Segmentation' in line: + self.segcount += 1 + terminated = False + self.retval = p.wait() + + if terminated == False: + print('RE-RUNNING DUE TO PROBLEM WITH SAVING!!!') + +# class for accessing data of stored HDF5 file +class HDF(): + + def __init__(self, filename = ''): + + # check first for the filename provided + if filename != '': + self.HDFsrc = filename + else: + self.HDFsrc = '' + + # get data + self.__get_data() + + # just an alias for __init__ that does load a specific file + def load(self, filename = ''): + self.__init__(filename) + + # gets the data of the file + def __get_data(self): + + if (self.HDFsrc == '') | (self.HDFsrc == []): + # initialize all as empty + self.tdy = [] + self.tdx = [] + self.attrs = [] + self.parsoutp = {} + self.parvar = {} + + else: + f = h5py.File(self.HDFsrc, 'r') + + + HDFkeys = list(f.keys()) + + for ii, HDFkey in enumerate(HDFkeys): + if ii == 0: + # initialize data array + dsize = f[HDFkey].shape + inddim = dsize[0] + self.tdy = np.zeros((int(dsize[1]/2), int(dsize[0] * len(HDFkeys))),dtype=np.complex_) + + # initialize the output objects + self.attrs = [dynclass() for jj in range(len(HDFkeys))] + + # get the attribute keys + self.parsoutp = {} + ii_oupargs = 0 + for item in f[HDFkey].attrs.items(): + itemname = item[0][5:] + itemarg = item[0][1:4] + if not ('///' in itemarg): + self.parsoutp[itemarg] = [ item[1], itemname] + else: + self.parsoutp['//'+str(ii_oupargs)] = [ item[1], itemname] + ii_oupargs+=1 + + # look for eventual parvar lists + self.parvar = {} + for item in f.attrs.items(): + self.parvar[item[0]] = item[1] + + + # Get the data + data_raw = np.array(f[HDFkey]) + try: + self.tdy[:,ii*inddim:(ii+1)*inddim] = np.transpose(np.float_(data_raw[:,::2])) + 1j*np.transpose(np.float_(data_raw[:,1::2])) + except: + pass + + + # Get the arguments + ii_oupargs = 0 + for item in f[HDFkey].attrs.items(): + itemname = item[0][5:] + itemarg = item[0][1:4] + if not ('///' in itemarg): + setattr(self.attrs[ii], itemarg, item[1]) + else: + setattr(self.attrs[ii], '//'+str(ii_oupargs), item[1]) + ii_oupargs+=1 + + f.close() + srate_MHz = getattr(self.attrs[0], 'sra')*1e-6 + self.tdx = 1/srate_MHz*np.arange(self.tdy.shape[0]) + + # get an argument by matching the text description + def attr_by_txt(self, pattern): + for key in sorted(self.parsoutp): + if pattern in self.parsoutp[key][1]: # pattern match + attr = getattr(self.attrs[0], key) + try: + ouparr = np.zeros( ( len(attr), len(self.attrs)), attr.dtype) + except: + ouparr = np.zeros( ( 1, len(self.attrs)), attr.dtype) + + for ii in np.arange(len(self.attrs)): + ouparr[:,ii] = getattr(self.attrs[ii], key) + return np.transpose(ouparr) + + print('Problem obtaining the attribute from the description using the pattern ' + pattern + '!') + print('Valid descriptions are: ') + self.print_params() + + # get an argument by key + def attr_by_key(self, key): + if key in dir(self.attrs[0]): + attr = getattr(self.attrs[0], key) + try: + ouparr = np.zeros( ( len(attr), len(self.attrs)), attr.dtype) + except: + ouparr = np.zeros( ( 1, len(self.attrs)), attr.dtype) + for ii in np.arange(len(self.attrs)): + ouparr[:,ii] = getattr(self.attrs[ii], key) + return np.transpose(ouparr) + + print('Problem obtaining the attribute from key ' + key + '!') + print('Valid keys are: ') + self.print_params() + + + # print the arguments + def print_params(self, ouponly = False): + for key in sorted(self.parsoutp): + val = getattr(self.attrs[0], key) + if not('//' in key): # input argument? + if ouponly: continue; + + print('{:<5}: {:>50} {:<25}'.format(key, val, self.parsoutp[key][1])) + + def plot_dta(self, fignum = 1, stack = False, dtamax = 0.0): + if (fignum == 1) & stack: fignum = 2; + + if self.tdy != []: + + if dtamax == 0: + dtamax = np.max(np.max(abs(self.tdy),axis=0)) + offset = 1.5*dtamax + + plt.figure(fignum) + plt.clf() + if stack: + for ii in np.arange(self.tdy.shape[1]): + plt.plot(self.tdx, self.tdy[:,ii].real + ii* offset) + else: + plt.plot(self.tdx, self.tdy.real) + plt.xlabel('$t$ [$\mu$s]') + plt.ylabel('$y$ [Counts]') + +# empty class to store dynamic attributes, basically for the attributes in HDF keys +class dynclass: + pass + + +# addendum that does not fit 100% into this class file, but is related +# class to control the E3631A via serial interface +import serial +import time +from os import listdir + +class PSU(): + + def __init__(self): + + self.GperV = 14.309 + self.sleeptime = 0.4 + + devdir = '/dev/' + ttydevs = [f for f in listdir(devdir) if 'ttyUSB' in f] +# ttydev = devdir + [f for f in ttydevs if int(f[-1]) > 4][0] + ttydev = devdir + [f for f in ttydevs][0] + + self.psu=serial.Serial(ttydev, stopbits=2, dsrdtr=True) + + # read at the beginning to remove eventual junk + response = self.psu.read_all() + + self.psu.write("*IDN?\r\n") + time.sleep(self.sleeptime) + response = self.psu.read_all() + if response == 'HEWLETT-PACKARD,E3631A,0,2.1-5.0-1.0\r\n': + print('Success in opening the HP PSU!') + else: + print('Fail!!!') + + self.psu.write("INST:SEL P6V\r\n") + time.sleep(self.sleeptime) + self.psu.write("OUTP:STAT ON\r\n") + time.sleep(self.sleeptime) + + self.psu.close() + + + def getVoltage(self): + + if not self.psu.isOpen(): + self.psu.open() + # read at the beginning to remove eventual junk + self.psu.read_all() + time.sleep(self.sleeptime) + self.psu.write("VOLT?\r\n") + time.sleep(self.sleeptime) + actval = float(self.psu.read_all()) + self.psu.close() + return actval + + + def setVoltage(self, setval, dV = 0.02, ramptime = 0.1): + + actval = self.getVoltage() + + diff = setval - actval + dVsigned = dV * (-1 if diff < 0 else 1) + + if not self.psu.isOpen(): + self.psu.open() + while (abs(diff) > dV): + actval += dVsigned + diff -= dVsigned + self.psu.write("VOLT " + str(actval) + "\r\n") + time.sleep(ramptime) + + self.psu.write("VOLT " + str(setval) + "\r\n") + time.sleep(ramptime) + + self.psu.close() + + def getField(self): + + return self.getVoltage() * self.GperV + + def setField(self, field): + + return self.setVoltage(field / self.GperV) diff --git a/src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB b/src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB new file mode 100755 index 0000000000000000000000000000000000000000..a7ed76dcc3e18434c71dad7bddf7830bbba6a047 GIT binary patch literal 451440 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 z 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

jE_>~qx+qDo{3)Ji&@3H6DOJ*x!Zkfz!QNmD6 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include "H5Cpp.h" + +#include // stat +#include +#include // errno, ENOENT, EEXIST +#if defined(_WIN32) +#include // _mkdir +#endif + +using namespace std; + +// structure that holds all the relevant parameters for a N-pulse experiment. See initialization below for description +const int maxNpulse = 50; +struct LimeConfig_t { + + float srate; + float frq; + float frq_set; + float RX_LPF; + float TX_LPF; + int RX_gain; + int TX_gain; + int TX_IcorrDC; + int TX_QcorrDC; + int TX_IcorrGain; + int TX_QcorrGain; + int TX_IQcorrPhase; + int RX_IcorrGain; + int RX_QcorrGain; + int RX_IQcorrPhase; + int RX_gain_rback[4]; + int TX_gain_rback[3]; + + int Npulses; + double *p_dur; + int *p_dur_smp; + int *p_offs; + double *p_amp; + double *p_frq; + double *p_frq_smp; + double *p_pha; + int *p_phacyc_N; + int *p_phacyc_lev; + double *am_frq; + double *am_pha; + double *am_depth; + int *am_mode; + double *am_frq_smp; + double *fm_frq; + double *fm_pha; + double *fm_width; + int *fm_mode; + double *fm_frq_smp; + + int *p_c0_en; + int *p_c1_en; + int *p_c2_en; + int *p_c3_en; + + int c0_tim[4]; + int c1_tim[4]; + int c2_tim[4]; + int c3_tim[4]; + + int c0_synth[5]; + int c1_synth[5]; + int c2_synth[5]; + int c3_synth[5]; + + int averages; + int repetitions; + int pcyc_bef_avg; + double reptime_secs; + double rectime_secs; + int reptime_smps; + int rectime_smps; + int buffersize; + + string file_pattern; + string file_stamp; + string save_path; + int override_save; + int override_init; + + string stamp_start; + string stamp_end; +}; + +// structure that will be used to map LimeConfig to HDF attribute +struct Config2HDFattr_t { + string arg; + H5std_string Name; + H5::DataType dType; + void * Value; + hsize_t dim; +}; + +//Device structure, should be initialize to NULL +static lms_device_t* device = NULL; + +// LMS error function +int error() +{ + if (device != NULL) + LMS_Close(device); + exit(-1); +} + +// portable way to check and create directory (from stackexchange) +// https://stackoverflow.com/questions/675039/how-can-i-create-directory-tree-in-c-linux +bool isDirExist(const std::string& path) +{ +#if defined(_WIN32) + struct _stat info; + if (_stat(path.c_str(), &info) != 0) { return false; } + return (info.st_mode & _S_IFDIR) != 0; +#else + struct stat info; + if (stat(path.c_str(), &info) != 0) { return false; } + return (info.st_mode & S_IFDIR) != 0; +#endif +} + +bool makePath(const std::string& path) +{ +#if defined(_WIN32) + int ret = _mkdir(path.c_str()); +#else + mode_t mode = 0755; + int ret = mkdir(path.c_str(), mode); +#endif + if (ret == 0) return true; + + switch (errno) + { + case ENOENT: + // parent didn't exist, try to create it + { + int pos = path.find_last_of('/'); + if (pos == std::string::npos) +#if defined(_WIN32) + pos = path.find_last_of('\\'); + if (pos == std::string::npos) +#endif + return false; + if (!makePath( path.substr(0, pos) )) + return false; + } + // now, try to create again +#if defined(_WIN32) + return 0 == _mkdir(path.c_str()); +#else + return 0 == mkdir(path.c_str(), mode); +#endif + + case EEXIST: + // done! + return isDirExist(path); + + default: + return false; + } +} + +inline bool file_exists (const std::string& name) { + struct stat buffer; + return (stat (name.c_str(), &buffer) == 0); +} + +// 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.. +//int GetGainRXTX(array< int, 4>* RXgain, array* TXgain) { +int GetGainRXTX(int* RXgain, int* TXgain) { + // RX gain: LNA, TIA and PGA + uint16_t gain_lna, gain_tia, gain_pga; + if (LMS_ReadParam(device, LMS7_G_LNA_RFE, &gain_lna) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_TIA_RFE, &gain_tia) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_PGA_RBB, &gain_pga) != 0) error(); + // convert to actual gain + + // TX gain: PAD and TBB + uint16_t gain_pad, gain_tbb; + if (LMS_ReadParam(device, LMS7_LOSS_LIN_TXPAD_TRF, &gain_pad) != 0) error(); + if (LMS_ReadParam(device, LMS7_CG_IAMP_TBB, &gain_tbb) != 0) error(); + + // convert to actual gain + // TXpad + const int pmax = 52; + if (gain_pad > 10) TXgain[1] = pmax-10-2*(gain_pad-10); + else TXgain[1] = pmax-gain_pad; + + // TBB gain: linear to dB. Impossible to obtain like this. It is calibrated to an optimum value, called opt_gain_tbb. This is only available if a calibration is done. However, as long as the TXgain is below 43+12 = 55 dB, gain is fully determined by TX PAD + TXgain[2] = gain_tbb; + // TXgain[2] = 20.0*log10((float_type)gain_tbb / (float_type) opt_gain_tbb); from LMS7002.cpp + + // RFE LNA + int gmax = 30; + if (gain_lna >= 9) + RXgain[1] = gmax + (gain_lna-15); + else + RXgain[1] = gmax + 3*( gain_lna - 11); + + // RFE TIA + gmax = 12; + switch (gain_tia) + { + case 3: RXgain[2] = gmax-0; break; + case 2: RXgain[2] = gmax-3; break; + case 1: RXgain[2] = gmax-12; break; + } + + // RBB PGA + RXgain[3] = gain_pga - 12; + + // Sum to first element, adding that mysterious +12+0.5 as it is done in the API + RXgain[0] = RXgain[1] + RXgain[2] + RXgain[3] + 12 + 0.5; + TXgain[0] = TXgain[1] + 0*TXgain[2] + 12 + 0.5; + + // Print in function to ease debugging + cout << "TX: " << TXgain[0] << " dB : " << TXgain[1] << " dB PAD, " << TXgain[2] << " setting of BB + 12 dB" << endl; + cout << "RX: " << RXgain[0] << " dB : " << RXgain[1] << " dB LNA, " << RXgain[2] << " dB TIA, " << RXgain[3] << " dB PGA + 12 dB" << endl; + + return 0; +} + +// Modulation function for AM/FM using different modes, i.e. sinusoidal (mode = 0), triangular (mode = 1), square (mode = 2) +double Modfunction(double argument, int mode) { + + const double pi = acos(-1); + double P; + + double retval; + switch (mode) { + case 0: + { // sinusoidal + retval = cos(argument); + break; + } + case 1: + { // triangular + + // A = 2.0; P = np.pi + // y = (A/P) * (P - abs(np.mod(x+np.pi/2,2*P)-P)) - A/2 + P = pi/2; + retval = (2.0 / P) * (P - fabs(fmod(argument+pi/2,2*P)-P)) - 1.0; + break; + } + case 2: + { // square + retval = (fmod(argument,2*pi) < pi) ? 1.0 : -1.0; + break; + } + default: + { + retval = 1.0; + break; + } + } + + return retval; + +} + + +int main(int argc, char** argv) +{ + const double pi = acos(-1); + + + + LimeConfig_t LimeCfg; + + LimeCfg.Npulses = 2; // Number of pulses, default value + + // check if nPulses has been given as argument, so that all the arrays are initialized with proper size + for (int ii_arg = 1; ii_arg < argc; ii_arg++) { + if (strcmp(argv[ii_arg], "-npu") == 0 && ii_arg + 1 < argc) { + LimeCfg.Npulses = atoi(argv[ii_arg+1]); + break; + } + } + + // ---------------------------------------------------------------------------------- + // set all the DEFAULT parameters. Command line arguments allow for modification! + LimeCfg.srate = 30.72e6; // sample rate of the IF DAC/ADC + LimeCfg.frq = 50e6; // LO carrier frequency + LimeCfg.RX_gain = 20; // total gain of the receiver + LimeCfg.TX_gain = 30; // total gain of the transmitter + LimeCfg.RX_LPF = 5e6; // IF lowpass of the receiver + LimeCfg.TX_LPF = 130e6; // IF lowpass of the transmitter + + LimeCfg.TX_IcorrDC = -32; // DC corr to TX mixer at IF (evaluate with LimeSuiteGUI) + LimeCfg.TX_QcorrDC = 50; // DC corr to TX mixer at IF + LimeCfg.TX_IcorrGain = 2047; // I Gain corr of TX mixer + LimeCfg.TX_QcorrGain = 2039; // Q Gain corr of TX mixer + LimeCfg.TX_IQcorrPhase = 10; // Phase corr of TX mixer + LimeCfg.RX_IcorrGain = 2047; // I Gain corr of RX mixer + LimeCfg.RX_QcorrGain = 2047; // Q Gain corr of RX mixer + LimeCfg.RX_IQcorrPhase = 0; // Phase corr of RX mixer + + // Allocate the arrays with pulse parametes + LimeCfg.p_dur = new double[LimeCfg.Npulses]; // pulse duration (secs) + LimeCfg.p_offs = new int[LimeCfg.Npulses]; // pulse time offset + LimeCfg.p_amp = new double[LimeCfg.Npulses]; // pulse digital IF amplitude + LimeCfg.p_frq = new double[LimeCfg.Npulses]; // pulse digital IF frequency (unit: Hz) + LimeCfg.p_pha = new double[LimeCfg.Npulses]; // pulse digital IF phase + LimeCfg.p_phacyc_N = new int[LimeCfg.Npulses]; // number of pulse phases (cycled within 2*pi, must be at least 1) + LimeCfg.p_phacyc_lev = new int[LimeCfg.Npulses]; // stacking level of phase cycle (for eventual coupling) + LimeCfg.p_c0_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c0 + LimeCfg.p_c1_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c1 + LimeCfg.p_c2_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c2 + LimeCfg.p_c3_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c3 + LimeCfg.am_frq = new double[LimeCfg.Npulses]; // pulse AM frequency + LimeCfg.am_pha = new double[LimeCfg.Npulses]; // pulse AM phase + LimeCfg.am_depth = new double[LimeCfg.Npulses]; // pulse AM depth + LimeCfg.am_mode = new int[LimeCfg.Npulses]; // pulse AM mode (0: sinus, 1: triangle, 2: square) + LimeCfg.fm_frq = new double[LimeCfg.Npulses]; // pulse FM frequency + LimeCfg.fm_pha = new double[LimeCfg.Npulses]; // pulse FM phase + LimeCfg.fm_width = new double[LimeCfg.Npulses]; // pulse FM width + LimeCfg.fm_mode = new int[LimeCfg.Npulses]; // pulse FM mode (0: sinus, 1: triangle, 2: square) + + // and set standard values + for (int ii = 0; ii < LimeCfg.Npulses; ii++) { + + LimeCfg.p_dur[ii] = 2e-6; + LimeCfg.p_offs[ii] = (4080*3)/(LimeCfg.Npulses+1); // distribute them evenly within the buffer... + LimeCfg.p_amp[ii] = 1.0; + LimeCfg.p_frq[ii] = 4.0/LimeCfg.p_dur[0]; + LimeCfg.p_pha[ii] = 0.0; + LimeCfg.p_phacyc_N[ii] = 1; + LimeCfg.p_phacyc_lev[ii]= 0; + LimeCfg.p_c0_en[ii] = 1; + LimeCfg.p_c1_en[ii] = 1; + LimeCfg.p_c2_en[ii] = 1; + LimeCfg.p_c3_en[ii] = 1; + LimeCfg.am_frq[ii] = 0; + LimeCfg.am_pha[ii] = 0; + LimeCfg.am_depth[ii] = 0; + LimeCfg.am_mode[ii] = 0; + LimeCfg.fm_frq[ii] = 0; + LimeCfg.fm_pha[ii] = 0; + LimeCfg.fm_width[ii] = 0; + LimeCfg.fm_mode[ii] = 0; + } + + // Timing of TTL controls: [enabled? , pre, offs, post] + int c0_tim[4] = {0, 70, 56, -5}; + int c1_tim[4] = {0, 70, 56, -5}; + int c2_tim[4] = {0, 70, 56, -5}; + int c3_tim[4] = {0, 70, 56, -5}; + + // Use TTL channel as synth: [enabled? , half-period, strt, PSK shift, PSK adv] + int c0_synth[5] = {0, 500, 0, 0, 0}; + int c1_synth[5] = {0, 500, 0, 0, 0}; + int c2_synth[5] = {0, 500, 0, 0, 0}; + int c3_synth[5] = {0, 500, 0, 0, 0}; + + LimeCfg.averages = 6; // number of averages + LimeCfg.repetitions = 4; // number of repetions + LimeCfg.reptime_secs = 4e-3; // repetition time + LimeCfg.rectime_secs = 0.2e-3; // duration of acquisition window + LimeCfg.buffersize = 4080 * 3; // number of samples in buffer + LimeCfg.pcyc_bef_avg = 0; // phase cycle before average + + LimeCfg.file_pattern = "test"; // identifier when saving the file + LimeCfg.save_path = "./asdf/"; // path to save the file to + LimeCfg.override_save = 0; // default: save data + LimeCfg.override_init = 0; // default: init LimeSDR + + + // that's it for the parameters + // ---------------------------------------------------------------------------------- + + // .. copy here those arrays ... + memcpy(LimeCfg.c0_tim, c0_tim, 4* sizeof *LimeCfg.c0_tim); + memcpy(LimeCfg.c1_tim, c1_tim, 4* sizeof *LimeCfg.c1_tim); + memcpy(LimeCfg.c2_tim, c2_tim, 4* sizeof *LimeCfg.c2_tim); + memcpy(LimeCfg.c3_tim, c3_tim, 4* sizeof *LimeCfg.c3_tim); + memcpy(LimeCfg.c0_synth, c0_synth, 5* sizeof *LimeCfg.c0_synth); + memcpy(LimeCfg.c1_synth, c1_synth, 5* sizeof *LimeCfg.c1_synth); + memcpy(LimeCfg.c2_synth, c2_synth, 5* sizeof *LimeCfg.c2_synth); + memcpy(LimeCfg.c3_synth, c3_synth, 5* sizeof *LimeCfg.c3_synth); + + // and add the timestamp for the file + auto now = std::chrono::system_clock::now(); + auto itt = std::chrono::system_clock::to_time_t(now); + std::ostringstream stringstream; + stringstream << std::put_time(localtime(&itt), "%G%m%d_%H%M%S"); + LimeCfg.file_stamp = stringstream.str(); + LimeCfg.stamp_start = stringstream.str(); + LimeCfg.stamp_end = stringstream.str(); // will be overwritten just before data is written + + // allocate other variables that depend on Npulses + LimeCfg.p_dur_smp = new int[LimeCfg.Npulses]; + LimeCfg.p_frq_smp = new double[LimeCfg.Npulses]; + LimeCfg.am_frq_smp = new double[LimeCfg.Npulses]; + LimeCfg.fm_frq_smp = new double[LimeCfg.Npulses]; + + // LimeCfg as attributes for writing to HDF and for parsing command line input + // This is all done 'manually', since there is no reflection in cpp.. at least not by default + struct Config2HDFattr_t HDFattr[] = { + {"sra", "SampleRate [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.srate, 1}, + {"lof", "LO Frequency [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.frq, 1}, + {"rlp", "RX LowPass BW [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.RX_LPF, 1}, + {"tlp", "TX LowPass BW [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.TX_LPF, 1}, + {"rgn", "RX Gain [dB]", H5::PredType::NATIVE_INT, &LimeCfg.RX_gain, 1}, + {"tgn", "TX Gain [dB]", H5::PredType::NATIVE_INT, &LimeCfg.TX_gain, 1}, + {"///", "RX Gain readback [dB]",H5::PredType::NATIVE_INT, &LimeCfg.RX_gain_rback, 4}, + {"///", "TX Gain readback [dB]",H5::PredType::NATIVE_INT, &LimeCfg.TX_gain_rback, 3}, + {"tdq", "TX DC-correction Q", H5::PredType::NATIVE_INT, &LimeCfg.TX_QcorrDC, 1}, + {"tdi", "TX DC-correction I", H5::PredType::NATIVE_INT, &LimeCfg.TX_IcorrDC, 1}, + {"tgi", "TX I Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.TX_IcorrGain, 1}, + {"tgq", "TX Q Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.TX_QcorrGain, 1}, + {"tpc", "TX Phase correction", H5::PredType::NATIVE_INT, &LimeCfg.TX_IQcorrPhase,1}, + {"rgi", "RX I Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.RX_IcorrGain, 1}, + {"rgq", "RX Q Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.RX_QcorrGain, 1}, + {"rpc", "RX Phase correction", H5::PredType::NATIVE_INT, &LimeCfg.RX_IQcorrPhase,1}, + {"npu", "Number of Pulses", H5::PredType::NATIVE_INT, &LimeCfg.Npulses, 1}, + {"pdr", "Pulse Duration [s]", H5::PredType::IEEE_F64LE, LimeCfg.p_dur, (hsize_t) LimeCfg.Npulses}, + {"pof", "Pulse Offset [Sa]", H5::PredType::NATIVE_INT, LimeCfg.p_offs, (hsize_t) LimeCfg.Npulses}, + {"pam", "IF Pulse Amplitude", H5::PredType::IEEE_F64LE, LimeCfg.p_amp, (hsize_t) LimeCfg.Npulses}, + {"pfr", "IF Pulse Frequency [Hz]",H5::PredType::IEEE_F64LE, LimeCfg.p_frq, (hsize_t) LimeCfg.Npulses}, + {"pph", "IF Pulse Phase", H5::PredType::IEEE_F64LE, LimeCfg.p_pha, (hsize_t) LimeCfg.Npulses}, + {"pcn", "Nmbr of Phasecycles", H5::PredType::NATIVE_INT, LimeCfg.p_phacyc_N, (hsize_t) LimeCfg.Npulses}, + {"pcl", "Level of Phasecycle", H5::PredType::NATIVE_INT, LimeCfg.p_phacyc_lev, (hsize_t) LimeCfg.Npulses}, + {"///", "Pulse Duration [Sa]", H5::PredType::NATIVE_INT, LimeCfg.p_dur_smp, (hsize_t) LimeCfg.Npulses}, + {"///", "IF Pulse Frequency [1/Sa]",H5::PredType::IEEE_F64LE, LimeCfg.p_frq_smp, (hsize_t) LimeCfg.Npulses}, + {"amf", "AM Frequency [Hz]", H5::PredType::IEEE_F64LE, LimeCfg.am_frq, (hsize_t) LimeCfg.Npulses}, + {"amp", "AM Phase [rad]", H5::PredType::IEEE_F64LE, LimeCfg.am_pha, (hsize_t) LimeCfg.Npulses}, + {"amd", "AM Depth", H5::PredType::IEEE_F64LE, LimeCfg.am_depth, (hsize_t) LimeCfg.Npulses}, + {"amm", "AM Mode", H5::PredType::NATIVE_INT, LimeCfg.am_mode, (hsize_t) LimeCfg.Npulses}, + {"///", "AM Frequency [1/Sa]", H5::PredType::IEEE_F64LE, LimeCfg.am_frq_smp, (hsize_t) LimeCfg.Npulses}, + {"fmf", "FM Frequency [Hz]", H5::PredType::IEEE_F64LE, LimeCfg.fm_frq, (hsize_t) LimeCfg.Npulses}, + {"fmp", "FM Phase [rad]", H5::PredType::IEEE_F64LE, LimeCfg.fm_pha, (hsize_t) LimeCfg.Npulses}, + {"fmw", "FM width [Hz]", H5::PredType::IEEE_F64LE, LimeCfg.fm_width, (hsize_t) LimeCfg.Npulses}, + {"fmm", "FM Mode", H5::PredType::NATIVE_INT, LimeCfg.fm_mode, (hsize_t) LimeCfg.Npulses}, + {"///", "FM Frequency [1/Sa]", H5::PredType::IEEE_F64LE, LimeCfg.fm_frq_smp, (hsize_t) LimeCfg.Npulses}, + {"t0d", "Trigger0 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c0_tim, 4}, + {"t1d", "Trigger1 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c1_tim, 4}, + {"t2d", "Trigger2 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c2_tim, 4}, + {"t3d", "Trigger3 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c3_tim, 4}, + {"t0s", "Trigger0 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c0_synth, 5}, + {"t1s", "Trigger1 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c1_synth, 5}, + {"t2s", "Trigger2 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c2_synth, 5}, + {"t3s", "Trigger3 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c3_synth, 5}, + {"t0p", "Trigger0 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c0_en, (hsize_t) LimeCfg.Npulses}, + {"t1p", "Trigger1 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c1_en, (hsize_t) LimeCfg.Npulses}, + {"t2p", "Trigger2 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c2_en, (hsize_t) LimeCfg.Npulses}, + {"t3p", "Trigger3 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c3_en, (hsize_t) LimeCfg.Npulses}, + {"nrp", "Nmbr of Repetitions", H5::PredType::NATIVE_INT, &LimeCfg.repetitions, 1}, + {"nav", "Nmbr of Averages", H5::PredType::NATIVE_INT, &LimeCfg.averages, 1}, + {"trp", "Repetition Time [s]", H5::PredType::IEEE_F64LE, &LimeCfg.reptime_secs, 1}, + {"tac", "Acquisition Time [s]", H5::PredType::IEEE_F64LE, &LimeCfg.rectime_secs, 1}, + {"///", "Repetition Time [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.reptime_smps, 1}, + {"///", "Acquisition Time [Sa]",H5::PredType::NATIVE_INT, &LimeCfg.rectime_smps, 1}, + {"bsz", "Buffersize", H5::PredType::NATIVE_INT, &LimeCfg.buffersize, 1}, + {"pba", "Pcyc before Avg if >0",H5::PredType::NATIVE_INT, &LimeCfg.pcyc_bef_avg, 1}, + {"fpa", "Filename Pattern", H5::StrType(H5::PredType::C_S1, LimeCfg.file_pattern.length()+1), (void *) LimeCfg.file_pattern.c_str(), 1}, + {"spt", "Save Path", H5::StrType(H5::PredType::C_S1, LimeCfg.save_path.length()+1), (void *) LimeCfg.save_path.c_str(), 1}, + {"nos", "Don't save if >0", H5::PredType::NATIVE_INT, &LimeCfg.override_save, 1}, + {"noi", "Don't init if >0", H5::PredType::NATIVE_INT, &LimeCfg.override_init, 1}, + {"fst", "Filename Timestamp", H5::StrType(H5::PredType::C_S1, LimeCfg.file_stamp.length()+1), (void *) LimeCfg.file_stamp.c_str(), 1}, + {"///", "Exp Start Timestamp", H5::StrType(H5::PredType::C_S1, LimeCfg.stamp_start.length()+1), (void *) LimeCfg.stamp_start.c_str(), 1}, + {"///", "Exp End Timestamp", H5::StrType(H5::PredType::C_S1, LimeCfg.stamp_end.length()+1), (void *) LimeCfg.stamp_end.c_str(), 1} + }; + int no_of_attr = sizeof(HDFattr)/sizeof(Config2HDFattr_t); + + // iterate through arguments to parse eventual user input + // (exposing the actual content of the struct to python would be nicer...) + bool parse_prob = false; + int curr_attr = -1; + int curr_attr_last = -1; + int attr2read = 0; + int attr2read_last = 0; + int attr_read = 0; + for (int ii_arg = 1; ii_arg < argc; ii_arg++) { + + // get the attribute for the argument based on '-' (which also is there for negative numbers..) + if (argv[ii_arg][0] == '-') { + + if ((strlen(argv[ii_arg]+1) != 3) && (attr2read == 0)) { + cout << "Invalid argument "<< ii_arg <<": " << argv[ii_arg] << endl; + parse_prob = true; + continue; + } + // find matching attribute + curr_attr_last = curr_attr; + attr2read_last = attr2read; + curr_attr = -1; + for (int ii_attr = 0; ii_attr < no_of_attr; ii_attr++) { + if (strcmp(argv[ii_arg]+1, HDFattr[ii_attr].arg.c_str()) == 0) { + curr_attr = ii_attr; + attr2read = HDFattr[ii_attr].dim; + attr_read = 0; + cout << "Found argument " << HDFattr[curr_attr].arg << ": " << HDFattr[curr_attr].Name << endl; + } + } + // found nothing + if (curr_attr == -1 && attr2read_last == 0) { + cout << "Could not find valid attribute for argument "<< ii_arg <<": " << argv[ii_arg] << endl; + parse_prob = true; + // found something, but did not read the previous arguments + } else if (curr_attr > -1 && attr2read_last > 0) { + cout << "Missing argument: "<< attr2read_last <<" value missing for argument " << HDFattr[curr_attr_last].arg << endl; + parse_prob = true; + } + // found nothing and did not read the previous arguments: a negative number + if (curr_attr == -1 && attr2read_last > 0) { + // restore the attribute and it as number + curr_attr = curr_attr_last; + attr2read = attr2read_last; + } else + // all other cases: jump to the next argument + continue; + } + + // parse the value from the current attribute + if (curr_attr != -1 && attr2read != 0) { + + // differentiate between the different types of input based on the H5::DataType + // float values + if (HDFattr[curr_attr].dType == H5::PredType::IEEE_F32LE) { + *((float *) HDFattr[curr_attr].Value+attr_read) = atof(argv[ii_arg]); + attr2read--; attr_read++; + //cout << "Got value " << atof(argv[ii_arg]) << " from " << argv[ii_arg] << endl; + } + // double values + if (HDFattr[curr_attr].dType == H5::PredType::IEEE_F64LE) { + *((double *) HDFattr[curr_attr].Value+attr_read) = (double) atof(argv[ii_arg]); + attr2read--; attr_read++; + //cout << "Got value " << (double) atof(argv[ii_arg]) << " from " << argv[ii_arg] << endl; + } + // integer values + if (HDFattr[curr_attr].dType == H5::PredType::NATIVE_INT) { + *((int *) HDFattr[curr_attr].Value+attr_read) = atoi(argv[ii_arg]); + attr2read--; attr_read++; + //cout << "Got value " << atoi(argv[ii_arg]) << " from " << argv[ii_arg] << endl; + } + // strings: stored as std::string in LimeCfg and as Cstring in HDFattr.. + // --> explicitly treat strings, these are anyhow just a few for file/path info + if (strcmp(HDFattr[curr_attr].arg.c_str(), "spt") == 0) { + LimeCfg.save_path = argv[ii_arg]; + HDFattr[curr_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.save_path.length()+1); + HDFattr[curr_attr].Value = (void *) LimeCfg.save_path.c_str(); + attr2read--; attr_read++; + } + if (strcmp(HDFattr[curr_attr].arg.c_str(), "fpa") == 0) { + LimeCfg.file_pattern = argv[ii_arg]; + HDFattr[curr_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.file_pattern.length()+1); + HDFattr[curr_attr].Value = (void *) LimeCfg.file_pattern.c_str(); + attr2read--; attr_read++; + } + if (strcmp(HDFattr[curr_attr].arg.c_str(), "fst") == 0) { + LimeCfg.file_stamp = argv[ii_arg]; + HDFattr[curr_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.file_stamp.length()+1); + HDFattr[curr_attr].Value = (void *) LimeCfg.file_stamp.c_str(); + attr2read--; attr_read++; + } + } else if (attr2read == 0) { + cout << "Problem with argument " << HDFattr[curr_attr].arg << ": There is an input that is not clear, probably one input more than required! " << endl; + parse_prob = true; + } + } + // check if the last argument had all the values + if (attr2read > 0) { + cout << "Missing argument: "<< attr2read <<" value missing for argument " << HDFattr[curr_attr].arg << endl; + parse_prob = true; + } + if (parse_prob) { + cout << "Exiting due to problem with provided arguments! Valid arguments are (exept -///, which cannot be set by the user):" << endl; + string datatype; + for (int ii_attr = 0; ii_attr < no_of_attr; ii_attr++) { + + // get the datatype + if (HDFattr[ii_attr].dType == H5::PredType::IEEE_F32LE) datatype = "float"; + else if (HDFattr[ii_attr].dType == H5::PredType::IEEE_F64LE) datatype = "double"; + else if (HDFattr[ii_attr].dType == H5::PredType::NATIVE_INT) datatype = "int"; + else datatype = "string"; + cout << "-" << HDFattr[ii_attr].arg << " " << left << setw(30) << HDFattr[ii_attr].Name << ": " << HDFattr[ii_attr].dim << "x " << datatype << endl; + + } + return 1; + } + + + // convert input in seconds/Hz to samples + for (int ii = 0; ii < LimeCfg.Npulses; ii++) { + LimeCfg.p_dur_smp[ii] = round(LimeCfg.p_dur[ii] * LimeCfg.srate); + LimeCfg.p_frq_smp[ii] = LimeCfg.p_frq[ii] / LimeCfg.srate; + LimeCfg.am_frq_smp[ii] = LimeCfg.am_frq[ii] / LimeCfg.srate; + LimeCfg.fm_frq_smp[ii] = LimeCfg.fm_frq[ii] / LimeCfg.srate; + } + + + // check directory first + if (makePath(LimeCfg.save_path) == 0) { + cout << "Problem entering the specified path: " << LimeCfg.save_path << endl; + return 1; + } + + + //Find devices + int n; + lms_info_str_t list[8]; //should be large enough to hold all detected devices + + if ((n = LMS_GetDeviceList(list)) < 0) //NULL can be passed to only get number of devices + error(); + + cout << "Devices found: " << n << endl; //print number of devices + if (n < 1) return -1; + + //open the first device + if (LMS_Open(&device, list[n-1], 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 + if ((n = LMS_GetNumChannels(device, LMS_CH_RX)) < 0) error(); + cout << "Number of RX channels: " << n << endl; + if ((n = LMS_GetNumChannels(device, LMS_CH_TX)) < 0) error(); + cout << "Number of TX channels: " << n << endl; + + + // check if the settings are already there + float_type frq_read; + if (LMS_GetLOFrequency(device, LMS_CH_RX, 0, &frq_read) != 0) error(); + + float_type srate_read, rf_rate; + if (LMS_GetSampleRate(device, LMS_CH_RX, 0, &srate_read, &rf_rate) != 0) error(); + + bool frqdev = fabs(frq_read - LimeCfg.frq) > 1.0; + bool sratedev = fabs(srate_read - LimeCfg.srate) > 1.0; + + + // Getting the gain + int RXgain[4]; + int TXgain[3]; + GetGainRXTX(RXgain, TXgain); + + bool rgndev = RXgain[0] != LimeCfg.RX_gain; + bool tgndev = TXgain[0] != LimeCfg.TX_gain; + if (TXgain[0] > 55 && LimeCfg.TX_gain > 55) { + tgndev = false; + cout << "Unable to check for variation in TXgain setting, since it is impossible to retrieve it for TXgain > 55 dB without altering the RF performance. Eventual changes in the TXgain are thus not taken into account." << endl; + } + + /* + // Similar as with the built in GetGaindB function, the GetLPFBW function is also affecting the actual reading of the LPF. It is actually not entirely clear why this happens, as compared to the GetGaindB function, where it is evident that some calibration is done.. + // Accordingly, one must take care that the LPFBW is set right at the beginning when opening the device + float_type LPFBW, LPFBW2; // lowpass bandwidth + if (LMS_GetLPFBW(device, LMS_CH_RX, 0, &LPFBW) != 0) error(); + bool rlpfdev = LPFBW != LimeCfg.RX_LPF; + if (LMS_GetLPFBW(device, LMS_CH_TX, 0, &LPFBW2) != 0) error(); + bool tlpfdev = LPFBW2 != LimeCfg.TX_LPF; + */ + + + // initialize LimeSDR if there is a deviation in relevant parameters or if it is enforced to init, not init + //if (frqdev || sratedev || tgndev || rgndev || rlpfdev || tlpfdev || true) { + bool override_init = LimeCfg.override_init > 0; // override the initialization if -noi > 0 + bool enforce_init = LimeCfg.override_init < 0; // enforce init if -noi < 0 + + if ( ((frqdev || sratedev || tgndev || rgndev ) && !override_init) || enforce_init ) { + + // just to re-assure why there is another setup + cout << "Re-initialization of parameters ... " << endl; + if (frqdev) cout << "... due to LOfrequency deviation by " << frq_read - LimeCfg.frq << " from " << LimeCfg.frq << endl; + if (sratedev) cout << "... due to samplerate deviation by " << srate_read - LimeCfg.srate << " from " << LimeCfg.srate << endl; + if (rgndev) cout << "... due to RX gain deviation by " << RXgain[0] - LimeCfg.RX_gain << " from " << LimeCfg.RX_gain << endl; + if (tgndev) cout << "... due to TX gain deviation by " << TXgain[0] - LimeCfg.TX_gain << " from " << LimeCfg.TX_gain << endl; + //if (rlpfdev) cout << "... due to RX LPF deviation by " << LPFBW - LimeCfg.RX_LPF << " from " << LimeCfg.RX_LPF << endl; + //if (tlpfdev) cout << "... due to TX LPF deviation by " << LPFBW2 - LimeCfg.TX_LPF << " from " << LimeCfg.TX_LPF << endl; + + // First mute the TX output, as the init commands create a lot of garbage + if (LMS_WriteParam(device, LMS7_PD_TLOBUF_TRF, 1) != 0) error(); + if (LMS_SetGaindB(device, LMS_CH_TX, 0, 0)!= 0) { + + cout << "Initializing device first!" << endl; + + // this might fail for a freshly connected device + // --> init the device + if (LMS_Init(device) != 0) error(); + // retry + if (LMS_SetGaindB(device, LMS_CH_TX, 0, 0) != 0) error(); + } + if (LMS_SetNormalizedGain(device, LMS_CH_TX, 0, 0.0) != 0) error(); + + //Set RX center frequency + if (LMS_SetLOFrequency(device, LMS_CH_RX, 0, LimeCfg.frq) != 0) error(); + + //Set TX center frequency + if (LMS_SetLOFrequency(device, LMS_CH_TX, 0, LimeCfg.frq) != 0) error(); + + // Read back the updated frequency for later storage + if (LMS_GetLOFrequency(device, LMS_CH_RX, 0, &frq_read) != 0) error(); + + //Enable RX channel + //Channels are numbered starting at 0 + if (LMS_EnableChannel(device, LMS_CH_RX, 0, true) != 0) error(); + //Enable TX channels + if (LMS_EnableChannel(device, LMS_CH_TX, 0, true) != 0) error(); + + + // apply DC offset in TxTSP + uint16_t DC_I, DC_Q, DC_EN; + DC_EN = 0; + if (LMS_WriteParam(device, LMS7_DCCORRI_TXTSP, LimeCfg.TX_IcorrDC) != 0) error(); + if (LMS_WriteParam(device, LMS7_DCCORRQ_TXTSP, LimeCfg.TX_QcorrDC) != 0) error(); + if (LMS_WriteParam(device, LMS7_DC_BYP_TXTSP, DC_EN) != 0) error(); + + + if (LMS_WriteParam(device, LMS7_GCORRI_TXTSP, LimeCfg.TX_IcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_GCORRQ_TXTSP, LimeCfg.TX_QcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_IQCORR_TXTSP, LimeCfg.TX_IQcorrPhase) != 0) error(); + if (LMS_WriteParam(device, LMS7_GCORRI_RXTSP, LimeCfg.RX_IcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_GCORRQ_RXTSP, LimeCfg.RX_QcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_IQCORR_RXTSP, LimeCfg.RX_IQcorrPhase) != 0) error(); + + //added by me as the IQ calibration did not happen on the chip from python or c++ + if (LMS_WriteParam(device, LMS7_MAC, 1) != 0) error(); + /* + // read back DC offset in TxTSP + if (LMS_ReadParam(device, LMS7_DCCORRI_TXTSP, &DC_I) != 0) error(); + if (LMS_ReadParam(device, LMS7_DCCORRQ_TXTSP, &DC_Q) != 0) error(); + if (LMS_ReadParam(device, LMS7_DC_BYP_TXTSP, &DC_EN) != 0) error(); + cout << "TxTSP DC corr (EN, I, Q): " << DC_EN << ", " << DC_I << ", " << DC_Q << endl; + */ + + + //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(); + + cout << "Available RX LNAs:\n"; //print available antennae names + for (int i = 0; i < n; i++) + cout << i << ": " << antenna_list[i] << endl; + // 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; + + // manually select antenna + if (LMS_SetAntenna(device, LMS_CH_RX, 0, LMS_PATH_LNAL) != 0) error(); + + // get and print antenna index and name + if ((n = LMS_GetAntenna(device, LMS_CH_RX, 0)) < 0) error(); + cout << "Manually selected RX LNA: " << n << ": " << antenna_list[n] << endl; + + //select antenna port + //Alternatively, NULL can be passed to LMS_GetAntennaList() to obtain number of antennae + if ((n = LMS_GetAntennaList(device, LMS_CH_TX, 0, antenna_list)) < 0) error(); + + cout << "Available TX pathways:\n"; //print available antennae names + for (int i = 0; i < n; i++) + cout << i << ": " << antenna_list[i] << endl; + + // get and print print antenna index and name + if ((n = LMS_GetAntenna(device, LMS_CH_TX, 0)) < 0) + error(); + cout << "Automatically selected TX pathway: " << n << ": " << antenna_list[n] << endl; + + // manually select antenna + int mychoice = LMS_PATH_TX1; + if (LimeCfg.frq > 1500e6) mychoice = LMS_PATH_TX2; + mychoice = LMS_PATH_TX1; // HACK: hardcode TX2 pathway + if (LMS_SetAntenna(device, LMS_CH_TX, 0, mychoice) != 0) error(); + + // get and print print antenna index and name + if ((n = LMS_GetAntenna(device, LMS_CH_TX, 0)) < 0) error(); + cout << "Manually selected TX pathway: " << n << ": " << antenna_list[n] << endl; + + // Set sample rate, w/o oversampling, so that we can remove the invsinc filter + if (LMS_SetSampleRate(device, LimeCfg.srate, 1) != 0) error(); + // Invsinc, which removes that non-causal wiggle in timedomain + if (LMS_WriteParam(device, LMS7_ISINC_BYP_TXTSP, 1) != 0) error(); + // CMIX: Disable, as it is not used + if (LMS_WriteParam(device, LMS7_CMIX_BYP_TXTSP, 1) != 0) error(); + if (LMS_WriteParam(device, LMS7_CMIX_BYP_RXTSP, 1) != 0) error(); + + // experiment with the GFIR filters + // if (LMS_SetGFIRLPF(device, LMS_CH_RX, 0, 1, 0.5e6) != 0) error(); // Works nicely. Allows, for instance, to perform narrowband observation together with CMIX + + + // Remute the TX output here, as the init commands create a lot of garbage + if (LMS_WriteParam(device, LMS7_PD_TLOBUF_TRF, 1) != 0) error(); + + // Set RX and TX to the gain values + if (LMS_SetGaindB(device, LMS_CH_TX, 0, LimeCfg.TX_gain) != 0) error(); + if (LMS_SetGaindB(device, LMS_CH_RX, 0, LimeCfg.RX_gain) != 0) error(); + + cout << "After gain setting: " << endl; + GetGainRXTX(RXgain, TXgain); + + // special for low frequency operation: LNA gain saturates rather early -> reduce lna gain and increase pga + // ( and even though we have that function GetGainRXTX(), we need to re-read the values here explicitly, since + // we need to operate on the actual settings of the LMS Parameter, and not the gain values ) + uint16_t gain_lna, gain_tia, gain_pga; + if (LMS_ReadParam(device, LMS7_G_LNA_RFE, &gain_lna) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_TIA_RFE, &gain_tia) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_PGA_RBB, &gain_pga) != 0) error(); + // cout << "Indiv gain addr: " << gain_lna << " LNA, " << gain_tia << " TIA, " << gain_pga << " PGA" << endl; + // gain_lna > 7 means a gain beyond gmax-12. Convert that to gains in dB + uint16_t crit_val = 7; + uint16_t gain_corr = (gain_lna - crit_val); + if (gain_corr > 2) gain_corr += 4; // gain steps of 1 dB for gain_lna > 9 + else gain_corr *= 3; // gain steps of 3 dB for gain_lna <= 9 + // eventually put this to the pga gain + if (gain_corr > 0) { + if (LMS_WriteParam(device, LMS7_G_LNA_RFE, crit_val) != 0) error(); + if (LMS_WriteParam(device, LMS7_G_PGA_RBB, gain_pga + gain_corr) != 0) error(); + } + GetGainRXTX(RXgain, TXgain); + + //Get allowed LPF bandwidth range + lms_range_t range; + if (LMS_GetLPFBWRange(device,LMS_CH_RX,&range)!=0) error(); + cout << "RX LPF bandwitdh range: " << range.min / 1e6 << " - " << range.max / 1e6 << " MHz\n\n"; + + if (LMS_GetLPFBWRange(device,LMS_CH_TX,&range)!=0) error(); + cout << "TX LPF bandwitdh range: " << range.min / 1e6 << " - " << range.max / 1e6 << " MHz\n\n"; + + if (LMS_SetLPFBW(device,LMS_CH_RX,0, LimeCfg.RX_LPF)!=0) error(); + if (LMS_SetLPFBW(device,LMS_CH_TX,0, LimeCfg.TX_LPF)!=0) error(); + + + float_type LPFBW; // lowpass bandwidth + if (LMS_GetLPFBW(device, LMS_CH_RX, 0, &LPFBW) != 0) error(); + cout << "RX LPFBW: " << LPFBW/1e6 << " MHz" << endl; + if (LMS_GetLPFBW(device, LMS_CH_TX, 0, &LPFBW) != 0) error(); + cout << "TX LPFBW: " << LPFBW/1e6 << " MHz" << endl; + + // Set limelight interface to TRXIQ, as the std value (JESD) will not communicate + if (LMS_WriteParam(device, LMS7_LML1_MODE, 0) != 0) error(); + if (LMS_WriteParam(device, LMS7_LML2_MODE, 0) != 0) error(); + + // Unmute the TX output, as the init commands are now written + if (LMS_WriteParam(device, LMS7_PD_TLOBUF_TRF, 0) != 0) error(); + + } + + // read back values that tend to depend on the specific configuration + memcpy(LimeCfg.TX_gain_rback, TXgain, 3* sizeof *LimeCfg.TX_gain_rback); + memcpy(LimeCfg.RX_gain_rback, RXgain, 4* sizeof *LimeCfg.RX_gain_rback); + + + const int chCount = 1; //number of RX/TX streams + + // Initialize acquisition data buffer + int buffersize = LimeCfg.buffersize; //complex samples per buffer + // note that proper scheduling requires buffersize that is a multiple of 1360 (12bit RX) and 1020 (16bit TX) + // accordingly, buffersize needs to be a multiple of 4080, which is 3*1360 and 4*1020 + if (buffersize % 4080 != 0) { + + cout << "Problem with requested buffersize of " << LimeCfg.buffersize << ", as it is not a multiple of 4080." << endl; + LMS_Close(device); + return 1; + + } + + + int timestampOffset = 0; // for offsets between TX and RX timestamps + int bufferOffset = 0; // to correct for those offsets + int16_t * buffers[chCount]; + for (int ii = 0; ii < chCount; ++ii) + { + buffers[ii] = new int16_t[buffersize * 2]; //buffer to hold complex values (2*samples) + } + + //Streaming Setup + lms_stream_t rx_streams[chCount]; + lms_stream_t tx_streams[chCount]; + + int N_buffers_per_fifo = 96; // Number of buffers that can be put onto the fifo + + //Initialize streams + //All streams setups should be done before starting streams. New streams cannot be set-up if at least stream is running. + for (int ii = 0; ii < chCount; ++ii) + { + rx_streams[ii].channel = ii; //channel number + rx_streams[ii].fifoSize = buffersize * N_buffers_per_fifo; //fifo size in samples + rx_streams[ii].throughputVsLatency = 1.0; //1.0 max throuhput, 0.0 min latency + rx_streams[ii].isTx = false; //RX channel + rx_streams[ii].dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers + + if (LMS_SetupStream(device, &rx_streams[ii]) != 0) error(); + + tx_streams[ii].channel = ii; //channel number + tx_streams[ii].fifoSize = buffersize * N_buffers_per_fifo; //fifo size in samples + tx_streams[ii].throughputVsLatency = 1.0; //1.0 max throuhput, 0.0 min latency + tx_streams[ii].isTx = true; //TX channel + tx_streams[ii].dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit float + + if (LMS_SetupStream(device, &tx_streams[ii]) != 0) error(); + } + + + //gather parameters for the TX pulse + + // first get all the phase-cycles + // which at first requires few maximum quantities.... + // .... the number of levels ... + int max_lev = 0; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) if (LimeCfg.p_phacyc_lev[ii_pls] > max_lev) max_lev = LimeCfg.p_phacyc_lev[ii_pls]; + + // check if there are no gaps in the level specification + bool found_level[max_lev+1]; + bool level_problem = false; + for (int ii = 0; ii < max_lev + 1; ii++) { + found_level[ii] = false; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) if (LimeCfg.p_phacyc_lev[ii_pls] == ii) found_level[ii] = true; + if (!found_level[ii]) level_problem = true; + } + if (level_problem) { + cout << "Problem with specified phase cycle levels: "; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) cout << setw(5) << left << LimeCfg.p_phacyc_lev[ii_pls]; + cout << endl; + cout << "A consecutive level numbering is required, but level/s "; + for (int ii = 0; ii < max_lev + 1; ii++) if (!found_level[ii]) cout << setw(2) << left << ii; + cout << " is/are missing!" << endl; + + LMS_Close(device); + return 1; + } + // ... the maximum number of phase cycles per level ... + int * steps_per_lev = new int[max_lev + 1]; + for (int ii = 0; ii < max_lev + 1; ii++) steps_per_lev[ii] = 0; + + int curr_lev_steps; // to make the code more readable... + for (int ii = 0; ii < LimeCfg.Npulses; ii++) { + curr_lev_steps = steps_per_lev[LimeCfg.p_phacyc_lev[ii]]; + if (LimeCfg.p_phacyc_N[ii] > curr_lev_steps) steps_per_lev[LimeCfg.p_phacyc_lev[ii]] = LimeCfg.p_phacyc_N[ii]; + } + + // ... which gives the total number of phase variations ... + int num_phavar = 1; + int steps_incr[max_lev + 1] = {1}; // .. and the number of steps where phase is constant ... + for (int ii = 0; ii < max_lev + 1; ii++) { + if (ii > 0) steps_incr[ii] = steps_incr[ii-1] * steps_per_lev[ii-1]; + num_phavar *= steps_per_lev[ii]; + } + if (num_phavar < 1) { + cout << "Problem with specified number of phases (pcn) for pulses 0 to " << LimeCfg.Npulses-1 << ": " << endl; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) cout << setw(5) << left <0 for pulses:"; + for (int ii = 0; ii < LimeCfg.Npulses; ii++) if (LimeCfg.p_phacyc_N[ii] < 1) cout << setw(2) << left << ii; + cout << endl; + + LMS_Close(device); + return 1; + } + + // ... which allows to construct the entire phase table ... + double pha_tab[num_phavar][LimeCfg.Npulses]; + + double pha_incr, curr_pha; + int step_incr = 1; + + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + // retrieve the phase increment + if (LimeCfg.p_phacyc_N[ii_pls] != 0) + pha_incr = 1.0/LimeCfg.p_phacyc_N[ii_pls]; + else + pha_incr = 1.0; + + curr_pha = 0; + + // get the step increment + step_incr = steps_incr[LimeCfg.p_phacyc_lev[ii_pls]]; + + // start to fill the table + for (int ii_pha = 0; ii_pha < num_phavar; ii_pha++) { + // eventually increment the phase + if ((ii_pha > 0) && (ii_pha % step_incr == 0)) curr_pha += pha_incr; + + pha_tab[ii_pha][ii_pls] = fmod(curr_pha, 1.0); + } + } + + // debug: print that phase table + cout << "Phase Table : " << endl; + for (int ii_pha = 0; ii_pha < num_phavar; ii_pha++) { + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + cout << setw(10) << left << pha_tab[ii_pha][ii_pls]; + } + cout << endl; + } + + + // get the number of buffers that are required in order to fit the entire experiment + long exc_len = 0; + int exc_buffers; + int pulsedur, pulseoffs; + pulseoffs = 0; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + + pulsedur = LimeCfg.p_dur_smp[ii_pls]; // duration of pulse in samples + pulseoffs += LimeCfg.p_offs[ii_pls]; // offset of pulse in samples + + if (pulseoffs + pulsedur > exc_len) + exc_len = pulseoffs + pulsedur; + } + exc_buffers = ceil((double) exc_len / (double) buffersize); + cout << "Excitation pattern: " << exc_len << " samples (" << exc_buffers << " buffers with " << buffersize << " samples each)" << endl; + + + // TX buffers + //int16_t tx_buffer[num_phavar][exc_buffers][2*buffersize]; // buffer to hold complex values (2* samples), including phase cycles + // TODO: put in the same way as the acq buffer, i.e. as an array of pointers. Otherwise, there is a limitation in space that can be used + int16_t * tx_buffer[num_phavar][exc_buffers]; + for (int ii = 0; ii < num_phavar; ++ii) { + for (int jj = 0; jj < exc_buffers; ++jj) { + tx_buffer[ii][jj] = new int16_t[2*buffersize]; + } + } + int16_t tx_buffer_1st[2*buffersize]; // buffer to hold complex values + float fsmpI, fsmpQ; + int16_t smpI, smpQ; + + // init with zero, as we add to it + for (int ii = 0; ii < 2*buffersize; ii++) { + for (int jj = 0; jj < exc_buffers; jj++) { + for (int ll = 0; ll < num_phavar; ll++) tx_buffer[ll][jj][ii] = 0; + } + } + + + // pulse parameters + double pulsefrq, pulseamp, pulsepha, pulsepha_inst, pulseamp_inst; + double w, w_mod, mlt_mod, pha_acc, fm_width_smp; + int buffoffs; + + + pulseoffs = 0; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + + pulsedur = LimeCfg.p_dur_smp[ii_pls]; // duration of pulse in samples + pulseoffs += LimeCfg.p_offs[ii_pls]; // offset of pulse in samples + pulsefrq = LimeCfg.p_frq_smp[ii_pls]; // frequency of pulse in samples + pulseamp = LimeCfg.p_amp[ii_pls]; // relative amplitude of pulses + pulsepha = LimeCfg.p_pha[ii_pls]; // phase of pulse + + pha_acc = 0; // phase accumulation under FM + fm_width_smp = 2*pi*LimeCfg.fm_width[ii_pls] / LimeCfg.srate; // width of FM in rad/sample for correct accumulation + + for (int ll = 0; ll < num_phavar; ll++) { // generate TX Pulse for different phases + buffoffs = 0; + for (int jj = 0; jj < exc_buffers; jj++) { // distribute 'long experiment' amongst buffers + for (int ii = 0; ii < buffersize; ii++) { // generate TX Pulse point by point + if ((ii + buffoffs >= pulseoffs) & (ii + buffoffs < pulsedur + pulseoffs)) { + + //w = 2*pi*(ii+buffoffs-pulseoffs)*pulsefrq; // frequency*time, such that each pulse begins at zero phase + + w = 2*pi*(ii-pulseoffs)*pulsefrq; // re-put absolute phase, which is better suited for pulsed experiments. The inclusion of buffoffs above was actually intended for CW type experiments, which were put separately in CW_AFC_engine. + + // instantaneous pulseamp/pha + pulsepha_inst = pulsepha; + pulseamp_inst = pulseamp; + + // implement AM + if (LimeCfg.am_frq[ii_pls] != 0) { + w_mod = 2*pi*(ii+buffoffs-pulseoffs)*LimeCfg.am_frq_smp[ii_pls]; // inst modphase + mlt_mod = Modfunction(w_mod + LimeCfg.am_pha[ii_pls], LimeCfg.am_mode[ii_pls]); + mlt_mod = ((mlt_mod - 1.0)*LimeCfg.am_depth[ii_pls])+1.0; + pulseamp_inst = pulseamp*mlt_mod; + } + + // implement FM, currently by implementing the corresponding phase integral analytically + if (LimeCfg.fm_frq[ii_pls] != 0) { + w_mod = 2*pi*(ii+buffoffs-pulseoffs)*LimeCfg.fm_frq_smp[ii_pls]; // inst modphase + if (LimeCfg.fm_mode[ii_pls] == 0) {// cosine FM -> sine PM + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls] - pi/2, LimeCfg.fm_mode[ii_pls]); + } + else if (LimeCfg.fm_mode[ii_pls] == 1) { // tirangluar FM --> quadratic PM + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls] - pi/2, LimeCfg.fm_mode[ii_pls]); + + } + else if (LimeCfg.fm_mode[ii_pls] == 2) {// square FM --> triangular PM + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls] - pi/2, 1); + + } + mlt_mod = LimeCfg.fm_width[ii_pls]/2 * mlt_mod / LimeCfg.fm_frq[ii_pls]; + pulsepha_inst = pulsepha+mlt_mod; + + if (LimeCfg.fm_mode[ii_pls] > 90) { // method with accumulator + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls], LimeCfg.fm_mode[ii_pls]-100); + mlt_mod = fm_width_smp/2 * mlt_mod; + pha_acc += mlt_mod; + pulsepha_inst = pulsepha+pha_acc; + + } + } + + fsmpI = pulseamp_inst*cos(w+pulsepha_inst+2*pi*pha_tab[ll][ii_pls]); + fsmpQ = pulseamp_inst*sin(w+pulsepha_inst+2*pi*pha_tab[ll][ii_pls]); + + // convert to int16 ... + smpI = 2047.0 * fsmpI; + smpQ = 2047.0 * fsmpQ; + + // ... with 4 LSB at 0 for marker + if (tx_streams[0].dataFmt == lms_stream_t::LMS_FMT_I16) { + smpI = smpI << 4; + smpQ = smpQ << 4; + } + // add to buffer + tx_buffer[ll][jj][2*ii] += smpI; + tx_buffer[ll][jj][2*ii+1] += smpQ; + } else { + //fsmpI = 0.0; + //fsmpQ = 0.0; + } + } + buffoffs += buffersize; // jump to next buffer + } + } + + // Pulse Marker for timing relative to pulse flanks + // TODO: we might need some gate joining and one should also warn if the triggers do not fit into the buffer + if (tx_streams[0].dataFmt == lms_stream_t::LMS_FMT_I16) { + int* curr_marker; + int* curr_marker_en; + // marker channel for that offset + for (int ii_c = 0; ii_c <4; ii_c++) { // iterate through the four marker channels + // get the proper configuration of the trigger channel + switch (ii_c) { + case 0: curr_marker = LimeCfg.c0_tim; curr_marker_en = LimeCfg.p_c0_en; break; + case 1: curr_marker = LimeCfg.c1_tim; curr_marker_en = LimeCfg.p_c1_en; break; + case 2: curr_marker = LimeCfg.c2_tim; curr_marker_en = LimeCfg.p_c2_en; break; + case 3: curr_marker = LimeCfg.c3_tim; curr_marker_en = LimeCfg.p_c3_en; break; + default : break; + } + + // check if the channel is activated + if (curr_marker[0] == 0 || curr_marker_en[ii_pls] == 0) continue; + + // set trigger with bitset operation + for (int ll = 0; ll < num_phavar; ll++) { + buffoffs = 0; + for (int jj = 0; jj < exc_buffers; jj++) { // distribute 'long experiment' amongst buffers + for (int ii = 0; ii < 2*buffersize; ii++) { // set trigger point by point + if ((ii + buffoffs >= 2*pulseoffs + curr_marker[2] - curr_marker[1]) & (ii + buffoffs < 2*pulsedur + 2*pulseoffs + curr_marker[2] + curr_marker[3])) { + tx_buffer[ll][jj][ii] |= 1< 0) { + if ((ll % curr_synth[4]) == 0) synthstart += curr_synth[3]; + } + + for (int jj = 0; jj < exc_buffers; jj++) { // distribute 'long experiment' amongst buffers + for (int ii = 0; ii < 2*buffersize; ii++) { // set trigger point by point + // wrap the phase counter + wrapped_phase = int(int(ii + buffoffs + synthstart) % int(2 * curr_synth[1])); + + //wrapped_phase = 0; + //test = (wrapped_phase < curr_synth[1]); + if (wrapped_phase < curr_synth[1]) { + tx_buffer[ll][jj][ii] |= 1< rep_offset) { + cout << "Acquisition time of " << rec_len << " samples cannot be longer than repetition time (" << rep_offset << " Samples)" << endl; + error(); + } + + cout << "Repetition and acquisition times: " << rep_offset << " Sa (" << rep_offset/buffersize << " buffers), " << rec_len << " Sa (" << rec_len/buffersize << " buffers with " << buffersize << " Sa each)" << endl; + + + // Buffer for acqisition signal: integer datatype, so that we can have a sufficient number of averages of acquired 16 bit data into the 32 bit buffer + // for some reason, there are segfaults here when acqbuf_size becomes something on the order of 100 + int acqbuf_size = LimeCfg.repetitions * num_phavar; + //int acqbuf[acqbuf_size][2*rec_len]; // causes segfaults with large arrays... + + // init as non-contiguous memory (which will require writing as chunks to HDF5) + int * acqbuf[acqbuf_size]; + for (int ii = 0; ii < acqbuf_size; ++ii) + { + acqbuf[ii] = new int[2*rec_len]; + } + + // brute-force initialization by zero ( memset(acqbuf, 0, acqbuf_size*2*rec_len); ) did not work... + for (int ii = 0; ii lost_acqs = {}; + + + //Streaming + lms_stream_meta_t rx_metadata; //Use metadata for additional control over sample receive function behavior + rx_metadata.flushPartialPacket = false; //currently has no effect in RX + rx_metadata.waitForTimestamp = false; //currently has no effect in RX + + lms_stream_meta_t tx_metadata; //Use metadata for additional control over sample send function behavior + tx_metadata.flushPartialPacket = false; //do not force sending of incomplete packet + tx_metadata.waitForTimestamp = true; //Enable synchronization to HW timestamp + + lms_stream_status_t status; // To check the FIFO + + + // counters to keep track of the transmission FIFO + int TXFIFO_slots = N_buffers_per_fifo; + int ii_TXavg = 0; + int ii_TXpcyc = 0; + int ii_TXoffset = 0; + int ii_TXrep = 0; + int ii_sent = 0; + double init_delay_s = 10e-3; // delay in seconds until TX packets are forwarded from FPGA to the FPRF + long next_TXtimestamp = ceil( (init_delay_s * LimeCfg.srate) / (double) buffersize) * buffersize; + long last_TXtimestamp = 0; // this one stores the last timestamp of the beginning of a repetition + + // Timestamps to schedule the acquisition + long next_RXtimestamp = 0; + long last_RXtimestamp = 0; + + // Acquisition loop + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = t1; + + int samplesRead; + int samplesReadSum = 0; + int rcvattempts = 0; + + int ii_rep = 0; // number of repetions + int ii_pcyc = 0; // number of phase cycle + int ii_avg = 0; // number of averages + int ii_acqd = 0; // number of complete acquisitions + int ii_acq = -1; // acquisition index (== ii_acqd if there is no packet loss) + int samples2Acquire = 0; // number of samples to acquire in current acquisition + int validSamples = 0; // number of valid samples in current datapacket + int * acqbuf_pos; // pointer to acqbuffer + int * delayedacqbuf_pos; // pointer to acqbuffer for delayed fwd + int reps_btw_stamps; // number of repetions between last valid timestamp + int16_t * mirbuf_pos; // pointer to mirror buffer + + + bool acquiring = false; // RX stream to acqbuffer? + bool acquire = true; // disable one single acquisition in acq loop + bool delayedAcqbufFwd = false; // to delay the forwarding of the acqbuffer + + int ndebug = 100; + + //Start streaming + for (int i = 0; i < chCount; ++i) + { + LMS_StartStream(&rx_streams[i]); + LMS_StartStream(&tx_streams[i]); + } + + // pre-fill the TX fifo + for (int ii_TXbuff = 0; ii_TXbuff < N_buffers_per_fifo; ii_TXbuff++) { + + // save the TX timestamp to the current packet + tx_metadata.timestamp = next_TXtimestamp; + + // First packet is special, since it is cut off in some weird way + if (ii_TXbuff == 0) { + LMS_SendStream(&tx_streams[0], tx_buffer_1st, buffersize, &tx_metadata, 1000); // so we put zeros + TXFIFO_slots--; + + // advance TX timestamp for the next packet + next_TXtimestamp += rep_offset; + + next_RXtimestamp = next_TXtimestamp; // ... and do not wait for it + last_TXtimestamp = next_TXtimestamp; + continue; // proceed the for loop with the first actual TX packet + } + + // Put data to FIFO + LMS_SendStream(&tx_streams[0], tx_buffer[ii_TXpcyc][ii_TXoffset], buffersize, &tx_metadata, 1000); + + // Update TX FIFO counters + TXFIFO_slots--; + ii_sent++; + + + // advance the tx_buffer counter + ii_TXoffset++; + next_TXtimestamp += buffersize; + if (ii_TXoffset == exc_buffers) { + ii_TXoffset = 0; + next_TXtimestamp = last_TXtimestamp + rep_offset; + last_TXtimestamp = next_TXtimestamp; + + if (LimeCfg.pcyc_bef_avg > 0) { + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXrep++; + // in case the entire experiment fits within the TX FIFO + if (ii_TXrep == LimeCfg.repetitions){ + TXFIFO_slots = 0; + break; + } + } + } + } else { + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXrep++; + // in case the entire experiment fits within the TX FIFO + if (ii_TXrep == LimeCfg.repetitions){ + TXFIFO_slots = 0; + break; + } + } + } + } + } else { + // if there is still data to be put on the buffer + } + } + + /* + // Check for the TX buffer and keep it filled + LMS_GetStreamStatus(tx_streams, &status); //Obtain TX stream stats + if (status.fifoFilledCount != 0) cout << TXFIFO_slots <<" TXFIFO slots free before start: " << status.fifoFilledCount << " samples of " << status.fifoSize << " with HW stamp " << status.timestamp <<" at RX timestamp" << rx_metadata.timestamp << endl; + */ + // Main acquisition loop + while (ii_acq < LimeCfg.repetitions * LimeCfg.averages * num_phavar) + { + + //Receive samples + if (acquire) { + samplesRead = LMS_RecvStream(&rx_streams[0], buffers[0], buffersize, &rx_metadata, 1000); + rcvattempts++; + samplesReadSum += samplesRead; + } + + if (ndebug < 100) { + cout << rx_metadata.timestamp << ", " << samplesReadSum << endl; + ndebug++; + LMS_GetStreamStatus(rx_streams, &status); //Obtain RX stream stats + cout << "Rx stream info: " << status.overrun << ", " << status.underrun << status.droppedPackets << ", " << status.overrun << ", actually " << status.fifoFilledCount << endl; + + } + + // check if the scheduled timestamp is coming here + //if (rx_metadata.timestamp >= next_RXtimestamp) { + if ((rx_metadata.timestamp >= next_RXtimestamp - samplesRead + 1) && acquire) { + + // first check out scheduling + timestampOffset = (signed long) next_RXtimestamp - (signed long) rx_metadata.timestamp; + + // normal case: scheduling as it should, where one reptime passed between the current and the last stamp + reps_btw_stamps = 1; + + // abnoral case: packet loss, i.e. more than one reptime passed since last stamp + if (timestampOffset < 0) { + reps_btw_stamps = ceil( -(double) timestampOffset / (double) rep_offset) + 1; + //cout << "Acq: rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << " : sched/act tstamp: " << next_RXtimestamp << ", " << rx_metadata.timestamp << " Diff to last: " << next_RXtimestamp - last_RXtimestamp << " Offset: " << timestampOffset << ", which corresponds to " << -(double) timestampOffset /(double) rep_offset << " repetitions, currently processing " << samplesRead << " RX samples with delayed fwd " << delayedAcqbufFwd << endl; + + // shift the timestamp scheduling correspondingly + timestampOffset += (reps_btw_stamps-1) * rep_offset; + next_RXtimestamp += (reps_btw_stamps-1) * rep_offset; + + // abort any ongoing acquisition, including delayed acquisition due to offsets + if (acquiring) { + cout << "Packet loss during rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << ", acq " << ii_acq << ", acqd " << ii_acqd << ": " << samples2Acquire << " Samples were not written and only the first few samples are non-corrupted with certainty. " << endl; + + // substract the content of the mirror_buf from the acqbuf, just to avoid that crap is being kept on the main buffer. + acqbuf_pos = acqbuf[ii_rep*num_phavar + ii_pcyc]; + for (int ii_acqbuf = 0; ii_acqbuf < 2*(rec_len - samples2Acquire); ii_acqbuf++) acqbuf_pos[ii_acqbuf] -= (int) mirror_buf[ii_acqbuf]; + + // store that this is lost + lost[ii_rep*num_phavar + ii_pcyc]++; + lost_acqs.push_back(ii_acq); + + //ii_acq++; // for an ongoing acquisition, we still need to increment the acquisition counter + // this is actually weird here. It seems that we land here sometimes with ii_acq already advanced + // and sometimes with ii_acq still needing to be incremented. + // in fact, when resuming, we are sometimes having ii_acq one before ii_avg, or aligned, as it should + // so we do lose one acq and are moreover shifting the entire indexing. However, if ii_acq is uncommented, + // there is a segfault from advancing ii_acq once too few, so that it is better to keep this one + // it is probably related to delayed acqbuf fwd. + // the cleanest would eventually be to make a new ii_acq counter that counts the memory location and is incremented together with the ii_pcyc counters, etc. The actual ii_acq that is incremented after having acquired data, could be named ii_acqd to count for the acquired data packets. + + } + acquiring = false; // this will be reset to true just below, which will cause those unwritten samples + delayedAcqbufFwd = false; // ... and make sure that these unwritten samples do not go anywhere to the buffer + + } + + // Advance counters to new position + for (int ii = 0; ii < reps_btw_stamps; ii++) { + + // except at the very first acquisition, where the counters are already at the right position + //if (ii_acq == 0 & ii == 0) break; + + // book keep any of the lost acquisitions + if (ii > 0) { + lost[ii_rep*num_phavar + ii_pcyc]++; + lost_acqs.push_back(ii_acq); + } + + ii_acq++; + + // except at the very first acquisition, where the counters are already at the right position + if (ii_acq == 0) break; + + // advance counters + if (LimeCfg.pcyc_bef_avg > 0) { + ii_pcyc++; + if (ii_pcyc == num_phavar) { + ii_pcyc = 0; + ii_avg++; + if (ii_avg == LimeCfg.averages) { + ii_avg = 0; + ii_rep++; + } + } + } else { + ii_avg++; + if (ii_avg == LimeCfg.averages) { + ii_avg = 0; + ii_pcyc++; + if (ii_pcyc == num_phavar) { + ii_pcyc = 0; + ii_rep++; + } + } + } + + } + + + // additional reporting in case of packet loss + if (reps_btw_stamps > 1) { + + cout << " Resuming acq at rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << ", acq " << ii_acq << ": " << "Skipped " << reps_btw_stamps - 1 << " acquisitions to restore a timestamp offset of " << timestampOffset << endl; + } + + + // Advance acqbuf in case that there is not an ongoing acquisition (just in the case of gap-free acquisition, that has usually a timestamp offset) + if (acquiring == false) { + acqbuf_pos = acqbuf[ii_rep*num_phavar + ii_pcyc]; + samples2Acquire = rec_len; + } else { + delayedacqbuf_pos = acqbuf[ii_rep*num_phavar + ii_pcyc]; + delayedAcqbufFwd = true; + } + acquiring = true; + + //cout << "Now at rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << ", acq " << ii_acq << ", acqd " << ii_acqd << "."<< endl; + + + // Warn in case of packet loss + // Important: We exclude here packet loss at the very beginning of the RX stream. This is actually rather normal and the reason for the offset in the RX buffer + LMS_GetStreamStatus(rx_streams, &status); //Obtain RX stream stats + if ((status.droppedPackets > 0 | status.overrun > 0 | status.underrun > 0) & ii_acq > 0) { + cout << "Rx stream trouble! Status (overrun, underrun, dropped Packets): " << status.overrun << ", " << status.underrun << ", " << status.droppedPackets << ". Currently " << status.fifoFilledCount << " samples in RX stream buffer (" << 100.0 * ((float) status.fifoFilledCount)/( (float) status.fifoSize ) << "%)" << endl; + //cout << "Next acq: rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << " : sched/act tstamp: " << next_RXtimestamp << ", " << rx_metadata.timestamp << " Diff to last: " << next_RXtimestamp - last_RXtimestamp << " Offset: " << timestampOffset << " currently processing " << samplesRead << " RX samples with delayed fwd " << delayedAcqbufFwd << endl; + } + + + // advance to the forthcoming RX timestamp and keep the current one + next_RXtimestamp += rep_offset; + last_RXtimestamp = rx_metadata.timestamp; + } + acquire = true; + + // Do not enter into acquiring for the case that the experiment is at its end + if (ii_rep == LimeCfg.repetitions & delayedAcqbufFwd == false) break; + + // copy RX data into acquisition buffer + if (acquiring) { + + // standard case: copy everything, without offset + bufferOffset = 0; + validSamples = buffersize; + + // first packet: consider eventual timestamp offset + if (samples2Acquire == rec_len) { + bufferOffset = timestampOffset; + validSamples = buffersize - bufferOffset; + + mirbuf_pos = mirror_buf; + // last packet with timestamp offset: just get the tail without offset + } else if (samples2Acquire < buffersize) { + validSamples = samples2Acquire; + } + + for (int ii_acqbuf = 0; ii_acqbuf < 2*(validSamples); ii_acqbuf++) acqbuf_pos[ii_acqbuf] += (int) buffers[0][ii_acqbuf + 2* bufferOffset]; + samples2Acquire -= validSamples; + + // memcopy mirrorbuf + memcpy(mirbuf_pos, acqbuf_pos, 2*validSamples * sizeof(int16_t)); + + // advance position in acquisition buffer + acqbuf_pos += 2*validSamples; + mirbuf_pos += 2*validSamples; + + if (samples2Acquire == 0) { + ii_acqd++; + + + // check for continuous RX with timestamp offset, where we would actually still have valid samples to copy in the buffer + if (delayedAcqbufFwd) { + // put pointer to right place + acqbuf_pos = delayedacqbuf_pos; + samples2Acquire = rec_len; + + delayedAcqbufFwd = false; + // important: rerun this entire block without getting a new data or forwarding the timestamp packet. + // We still need to copy the part beyond the validsamples to the next acqbuf position + acquire = false; + } else { + // standard case: signal that the acquisition is finished and wait for the next scheduled timestamp + acquiring = false; + } + } + } + + // Check for the TX buffer and keep it filled + if (ii_TXrep < LimeCfg.repetitions) { + LMS_GetStreamStatus(tx_streams, &status); //Obtain TX stream stats + TXFIFO_slots = (status.fifoSize - status.fifoFilledCount)/buffersize; + } + + /* + // debug + if (TXFIFO_slots > 0) cout << TXFIFO_slots << " free fifo slots to fill" << endl; + */ + + // re-fill the TX fifo + while (TXFIFO_slots > 0) { + + // save the TX timestamp to the current packet + tx_metadata.timestamp = next_TXtimestamp; + + // Put data to FIFO + LMS_SendStream(&tx_streams[0], tx_buffer[ii_TXpcyc][ii_TXoffset], buffersize, &tx_metadata, 1000); + + // Update TX counters + TXFIFO_slots--; + ii_sent++; + + // advance the tx_buffer counter + ii_TXoffset++; + next_TXtimestamp += buffersize; + if (ii_TXoffset == exc_buffers) { + ii_TXoffset = 0; + next_TXtimestamp = last_TXtimestamp + rep_offset; + last_TXtimestamp = next_TXtimestamp; + + if (LimeCfg.pcyc_bef_avg > 0) { + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXrep++; + // in case the experiment is finished + if (ii_TXrep == LimeCfg.repetitions) + TXFIFO_slots = 0; + } + } + } else { + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXrep++; + // in case the experiment is finished + if (ii_TXrep == LimeCfg.repetitions) + TXFIFO_slots = 0; + } + } + } + } + } +} + +//Stop streaming +for (int i = 0; i < chCount; ++i) +{ + LMS_StopStream(&rx_streams[i]); //stream is stopped but can be started again with LMS_StartStream() + LMS_StopStream(&tx_streams[i]); +} +for (int i = 0; i < chCount; ++i) +{ + LMS_DestroyStream(device, &rx_streams[i]); //stream is deallocated and can no longer be used + LMS_DestroyStream(device, &tx_streams[i]); + delete[] buffers[i]; +} + +delete mirror_buf; + +cout << "Lost acquisitions: "; +for (int ii = 0; ii < acqbuf_size; ii++) { + cout << lost[ii] << ", "; +} +cout << endl; + +// Iterate and print values of the list +for (int n : lost_acqs) { + std::cout << n << '\n'; +} + +//------------------------------------------------------------------------------------- +// SAVE TO HDF5 +//------------------------------------------------------------------------------------- + +if (LimeCfg.override_save == 0) { + + // Open HDF5 file + string filename; + // check for save_path delimiter + if (LimeCfg.save_path.back() == '/') + filename = LimeCfg.save_path + LimeCfg.file_stamp + "_" + LimeCfg.file_pattern + ".h5"; + else + filename = LimeCfg.save_path + '/' + LimeCfg.file_stamp + "_" + LimeCfg.file_pattern + ".h5"; + cout << filename << endl; + H5::H5File* h5f; + + // create or open + if (file_exists(filename)) h5f = new H5::H5File( filename, H5F_ACC_RDWR ); + else h5f = new H5::H5File( filename, H5F_ACC_EXCL ); + + // Check for the number of datasets already in there (only >0 if an external file_stamp is provided or if the program is called more than once within a second..) + hsize_t num_obj = 0; + H5Gget_num_objs(h5f->getId(), &num_obj); // if success, num_obj will be assigned the number of objects in the group + + // write dataset to HDF5 file + // 1. specify datatype and dimensions and dataset name + H5::DataType saveDataType( H5::PredType::NATIVE_INT); + hsize_t saveDataDim[] = { (hsize_t) acqbuf_size, (hsize_t) 2*rec_len}; + string DataName = "Acqbuf_"; + std::ostringstream oss; + oss << setfill('0') << setw(2) << num_obj; + DataName += oss.str(); + + H5std_string saveDataName(DataName.c_str()); + + // 2. allocate dataspace and init + // set parameters to have a chunked file, so that each acquired trace is one chunk + H5::DSetCreatPropList cparms; + hsize_t chunk_dims[2] = {1, saveDataDim[1]}; + cparms.setChunk(2, chunk_dims); + + int fill_val = 0; + cparms.setFillValue (H5::PredType::NATIVE_INT , &fill_val); + + H5::DataSpace mspace1( 2, saveDataDim ); + H5::DataSet dataset = h5f->createDataSet(saveDataName, saveDataType, mspace1, cparms); + + // write with standard procedure + //dataset.write( acqbuf, saveDataType); // requires contiguous memory of the entire acqbuf, which does not work for large buffers + // write row-wise + H5::DataSpace fspace_row = dataset.getSpace(); + hsize_t offset[2] = {0, 0}; + hsize_t dims_row[2] = {1, saveDataDim[1]}; + H5::DataSpace mspace_row( 1, &saveDataDim[1] ); // contiguous memory space of data to write + for (int ii = 0; ii < acqbuf_size; ii++) { + fspace_row.selectHyperslab( H5S_SELECT_SET, dims_row, offset); + dataset.write( acqbuf[ii], saveDataType, mspace_row, fspace_row); + offset[0] += 1; // advance to next row + } + + // get the timestamp at the end of the experiment ... + now = std::chrono::system_clock::now(); + itt = std::chrono::system_clock::to_time_t(now); + stringstream.str(""); + stringstream.clear(); + stringstream << std::put_time(localtime(&itt), "%G%m%d_%H%M%S"); + + // ... and write it to the appropriate index + for (int ii_attr = 0; ii_attr < no_of_attr; ii_attr++) { + if (strcmp("Exp End Timestamp", HDFattr[ii_attr].Name.c_str()) == 0) { + LimeCfg.stamp_end = stringstream.str(); + HDFattr[ii_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.stamp_end.length()+1); + HDFattr[ii_attr].Value = (void *) LimeCfg.stamp_end.c_str(); + } + } + + // write the attributes + for (int ii = 0; ii < no_of_attr; ii++) { + + H5::DataSpace* tmpSpace = new H5::DataSpace(); + // special case: arrays + if (HDFattr[ii].dim > 1) { + delete tmpSpace; + H5::DataSpace* tmpSpace = new H5::DataSpace(1, &HDFattr[ii].dim); + } + H5std_string concat("-" + HDFattr[ii].arg + " " + HDFattr[ii].Name); + //H5::Attribute attribute = h5f->createAttribute(concat, HDFattr[ii].dType, *tmpSpace); // write the attribute to the file + H5::Attribute attribute = dataset.createAttribute(concat, HDFattr[ii].dType, *tmpSpace); // write the attribute to the dataset + attribute.write(HDFattr[ii].dType, HDFattr[ii].Value); + delete tmpSpace; + } + + // special attribute for N pulses: the phase table, which is certainly of use in evaluation + hsize_t phatab_len = LimeCfg.Npulses*num_phavar; + H5::DataSpace* tmpSpace = new H5::DataSpace(1, &phatab_len); + H5std_string concat("-/// Phase Table"); + H5::Attribute attribute = dataset.createAttribute(concat, H5::PredType::IEEE_F64LE, *tmpSpace); // write the attribute to the dataset + attribute.write( H5::PredType::IEEE_F64LE, &pha_tab); + delete tmpSpace; + + // close file + h5f->close(); + delete h5f; + + cout << "Written to HDFfile as " << saveDataDim[0] << " by "<< saveDataDim[1] << " array" << endl; + +} + +//Close device +LMS_Close(device); + +return 0; +} + + + diff --git a/src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2 b/src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2 new file mode 100755 index 0000000000000000000000000000000000000000..98fbe0283c70754e00050d965d2714e761e5cb0b GIT binary patch literal 453984 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%0DlvGuloLahoqMy$(AI(f1utXQ)msNBvQMwOz;Jz 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úUV?5TgtY+{X5=M0ZG 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 literal 0 HcmV?d00001 diff --git a/src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2.cpp b/src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2.cpp new file mode 100644 index 0000000..73a96bc --- /dev/null +++ b/src/nqrduck_spectrometer_limenqr/contrib/pulseN_test_USB_TX2.cpp @@ -0,0 +1,1851 @@ +/** + @file N pulses + @author Andrin Doll + @brief N pulses on TX and collection on RX + + +requirements: +LimeSuite +HDF5 library + +compilation: +g++ pulseN_test_USB.cpp -std=c++11 -lLimeSuite -o pulseN_test_USB -I/usr/include/hdf5/serial -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -L/usr/lib/x86_64-linux-gnu/hdf5/serial /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_hl_cpp.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_cpp.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_hl.a /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.a -Wl,-Bsymbolic-functions -Wl,-z,relro -lpthread -lsz -lz -ldl -lm -Wl,-rpath -Wl,/usr/lib/x86_64-linux-gnu/hdf5/serial + + +Installation note: this compilation line looks terrifyingly long.. The reason is the inclusion of the HDF5 library, which is responsible for all the arguments after the -o specification. All this arguments can actually be retrieved from the command: +h5c++ -show + + */ +#include "lime/LimeSuite.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "H5Cpp.h" + +#include // stat +#include +#include // errno, ENOENT, EEXIST +#if defined(_WIN32) +#include // _mkdir +#endif + +using namespace std; + +// structure that holds all the relevant parameters for a N-pulse experiment. See initialization below for description +const int maxNpulse = 50; +struct LimeConfig_t { + + float srate; + float frq; + float frq_set; + float RX_LPF; + float TX_LPF; + int RX_gain; + int TX_gain; + int TX_IcorrDC; + int TX_QcorrDC; + int TX_IcorrGain; + int TX_QcorrGain; + int TX_IQcorrPhase; + int RX_IcorrGain; + int RX_QcorrGain; + int RX_IQcorrPhase; + int RX_gain_rback[4]; + int TX_gain_rback[3]; + + int Npulses; + double *p_dur; + int *p_dur_smp; + int *p_offs; + double *p_amp; + double *p_frq; + double *p_frq_smp; + double *p_pha; + int *p_phacyc_N; + int *p_phacyc_lev; + double *am_frq; + double *am_pha; + double *am_depth; + int *am_mode; + double *am_frq_smp; + double *fm_frq; + double *fm_pha; + double *fm_width; + int *fm_mode; + double *fm_frq_smp; + + int *p_c0_en; + int *p_c1_en; + int *p_c2_en; + int *p_c3_en; + + int c0_tim[4]; + int c1_tim[4]; + int c2_tim[4]; + int c3_tim[4]; + + int c0_synth[5]; + int c1_synth[5]; + int c2_synth[5]; + int c3_synth[5]; + + int averages; + int repetitions; + int pcyc_bef_avg; + double reptime_secs; + double rectime_secs; + int reptime_smps; + int rectime_smps; + int buffersize; + + string file_pattern; + string file_stamp; + string save_path; + int override_save; + int override_init; + + string stamp_start; + string stamp_end; +}; + +// structure that will be used to map LimeConfig to HDF attribute +struct Config2HDFattr_t { + string arg; + H5std_string Name; + H5::DataType dType; + void * Value; + hsize_t dim; +}; + +//Device structure, should be initialize to NULL +static lms_device_t* device = NULL; + +// LMS error function +int error() +{ + if (device != NULL) + LMS_Close(device); + exit(-1); +} + +// portable way to check and create directory (from stackexchange) +// https://stackoverflow.com/questions/675039/how-can-i-create-directory-tree-in-c-linux +bool isDirExist(const std::string& path) +{ +#if defined(_WIN32) + struct _stat info; + if (_stat(path.c_str(), &info) != 0) { return false; } + return (info.st_mode & _S_IFDIR) != 0; +#else + struct stat info; + if (stat(path.c_str(), &info) != 0) { return false; } + return (info.st_mode & S_IFDIR) != 0; +#endif +} + +bool makePath(const std::string& path) +{ +#if defined(_WIN32) + int ret = _mkdir(path.c_str()); +#else + mode_t mode = 0755; + int ret = mkdir(path.c_str(), mode); +#endif + if (ret == 0) return true; + + switch (errno) + { + case ENOENT: + // parent didn't exist, try to create it + { + int pos = path.find_last_of('/'); + if (pos == std::string::npos) +#if defined(_WIN32) + pos = path.find_last_of('\\'); + if (pos == std::string::npos) +#endif + return false; + if (!makePath( path.substr(0, pos) )) + return false; + } + // now, try to create again +#if defined(_WIN32) + return 0 == _mkdir(path.c_str()); +#else + return 0 == mkdir(path.c_str(), mode); +#endif + + case EEXIST: + // done! + return isDirExist(path); + + default: + return false; + } +} + +inline bool file_exists (const std::string& name) { + struct stat buffer; + return (stat (name.c_str(), &buffer) == 0); +} + +// 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.. +//int GetGainRXTX(array< int, 4>* RXgain, array* TXgain) { +int GetGainRXTX(int* RXgain, int* TXgain) { + // RX gain: LNA, TIA and PGA + uint16_t gain_lna, gain_tia, gain_pga; + if (LMS_ReadParam(device, LMS7_G_LNA_RFE, &gain_lna) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_TIA_RFE, &gain_tia) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_PGA_RBB, &gain_pga) != 0) error(); + // convert to actual gain + + // TX gain: PAD and TBB + uint16_t gain_pad, gain_tbb; + if (LMS_ReadParam(device, LMS7_LOSS_LIN_TXPAD_TRF, &gain_pad) != 0) error(); + if (LMS_ReadParam(device, LMS7_CG_IAMP_TBB, &gain_tbb) != 0) error(); + + // convert to actual gain + // TXpad + const int pmax = 52; + if (gain_pad > 10) TXgain[1] = pmax-10-2*(gain_pad-10); + else TXgain[1] = pmax-gain_pad; + + // TBB gain: linear to dB. Impossible to obtain like this. It is calibrated to an optimum value, called opt_gain_tbb. This is only available if a calibration is done. However, as long as the TXgain is below 43+12 = 55 dB, gain is fully determined by TX PAD + TXgain[2] = gain_tbb; + // TXgain[2] = 20.0*log10((float_type)gain_tbb / (float_type) opt_gain_tbb); from LMS7002.cpp + + // RFE LNA + int gmax = 30; + if (gain_lna >= 9) + RXgain[1] = gmax + (gain_lna-15); + else + RXgain[1] = gmax + 3*( gain_lna - 11); + + // RFE TIA + gmax = 12; + switch (gain_tia) + { + case 3: RXgain[2] = gmax-0; break; + case 2: RXgain[2] = gmax-3; break; + case 1: RXgain[2] = gmax-12; break; + } + + // RBB PGA + RXgain[3] = gain_pga - 12; + + // Sum to first element, adding that mysterious +12+0.5 as it is done in the API + RXgain[0] = RXgain[1] + RXgain[2] + RXgain[3] + 12 + 0.5; + TXgain[0] = TXgain[1] + 0*TXgain[2] + 12 + 0.5; + + // Print in function to ease debugging + cout << "TX: " << TXgain[0] << " dB : " << TXgain[1] << " dB PAD, " << TXgain[2] << " setting of BB + 12 dB" << endl; + cout << "RX: " << RXgain[0] << " dB : " << RXgain[1] << " dB LNA, " << RXgain[2] << " dB TIA, " << RXgain[3] << " dB PGA + 12 dB" << endl; + + return 0; +} + +// Modulation function for AM/FM using different modes, i.e. sinusoidal (mode = 0), triangular (mode = 1), square (mode = 2) +double Modfunction(double argument, int mode) { + + const double pi = acos(-1); + double P; + + double retval; + switch (mode) { + case 0: + { // sinusoidal + retval = cos(argument); + break; + } + case 1: + { // triangular + + // A = 2.0; P = np.pi + // y = (A/P) * (P - abs(np.mod(x+np.pi/2,2*P)-P)) - A/2 + P = pi/2; + retval = (2.0 / P) * (P - fabs(fmod(argument+pi/2,2*P)-P)) - 1.0; + break; + } + case 2: + { // square + retval = (fmod(argument,2*pi) < pi) ? 1.0 : -1.0; + break; + } + default: + { + retval = 1.0; + break; + } + } + + return retval; + +} + + +int main(int argc, char** argv) +{ + const double pi = acos(-1); + + + + LimeConfig_t LimeCfg; + + LimeCfg.Npulses = 2; // Number of pulses, default value + + // check if nPulses has been given as argument, so that all the arrays are initialized with proper size + for (int ii_arg = 1; ii_arg < argc; ii_arg++) { + if (strcmp(argv[ii_arg], "-npu") == 0 && ii_arg + 1 < argc) { + LimeCfg.Npulses = atoi(argv[ii_arg+1]); + break; + } + } + + // ---------------------------------------------------------------------------------- + // set all the DEFAULT parameters. Command line arguments allow for modification! + LimeCfg.srate = 30.72e6; // sample rate of the IF DAC/ADC + LimeCfg.frq = 50e6; // LO carrier frequency + LimeCfg.RX_gain = 20; // total gain of the receiver + LimeCfg.TX_gain = 30; // total gain of the transmitter + LimeCfg.RX_LPF = 5e6; // IF lowpass of the receiver + LimeCfg.TX_LPF = 130e6; // IF lowpass of the transmitter + + LimeCfg.TX_IcorrDC = -32; // DC corr to TX mixer at IF (evaluate with LimeSuiteGUI) + LimeCfg.TX_QcorrDC = 50; // DC corr to TX mixer at IF + LimeCfg.TX_IcorrGain = 2047; // I Gain corr of TX mixer + LimeCfg.TX_QcorrGain = 2047; // Q Gain corr of TX mixer + LimeCfg.TX_IQcorrPhase = 0; // Phase corr of TX mixer + LimeCfg.RX_IcorrGain = 2047; // I Gain corr of RX mixer + LimeCfg.RX_QcorrGain = 2047; // Q Gain corr of RX mixer + LimeCfg.RX_IQcorrPhase = 0; // Phase corr of RX mixer + + // Allocate the arrays with pulse parametes + LimeCfg.p_dur = new double[LimeCfg.Npulses]; // pulse duration (secs) + LimeCfg.p_offs = new int[LimeCfg.Npulses]; // pulse time offset + LimeCfg.p_amp = new double[LimeCfg.Npulses]; // pulse digital IF amplitude + LimeCfg.p_frq = new double[LimeCfg.Npulses]; // pulse digital IF frequency (unit: Hz) + LimeCfg.p_pha = new double[LimeCfg.Npulses]; // pulse digital IF phase + LimeCfg.p_phacyc_N = new int[LimeCfg.Npulses]; // number of pulse phases (cycled within 2*pi, must be at least 1) + LimeCfg.p_phacyc_lev = new int[LimeCfg.Npulses]; // stacking level of phase cycle (for eventual coupling) + LimeCfg.p_c0_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c0 + LimeCfg.p_c1_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c1 + LimeCfg.p_c2_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c2 + LimeCfg.p_c3_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c3 + LimeCfg.am_frq = new double[LimeCfg.Npulses]; // pulse AM frequency + LimeCfg.am_pha = new double[LimeCfg.Npulses]; // pulse AM phase + LimeCfg.am_depth = new double[LimeCfg.Npulses]; // pulse AM depth + LimeCfg.am_mode = new int[LimeCfg.Npulses]; // pulse AM mode (0: sinus, 1: triangle, 2: square) + LimeCfg.fm_frq = new double[LimeCfg.Npulses]; // pulse FM frequency + LimeCfg.fm_pha = new double[LimeCfg.Npulses]; // pulse FM phase + LimeCfg.fm_width = new double[LimeCfg.Npulses]; // pulse FM width + LimeCfg.fm_mode = new int[LimeCfg.Npulses]; // pulse FM mode (0: sinus, 1: triangle, 2: square) + + // and set standard values + for (int ii = 0; ii < LimeCfg.Npulses; ii++) { + + LimeCfg.p_dur[ii] = 2e-6; + LimeCfg.p_offs[ii] = (4080*3)/(LimeCfg.Npulses+1); // distribute them evenly within the buffer... + LimeCfg.p_amp[ii] = 1.0; + LimeCfg.p_frq[ii] = 4.0/LimeCfg.p_dur[0]; + LimeCfg.p_pha[ii] = 0.0; + LimeCfg.p_phacyc_N[ii] = 1; + LimeCfg.p_phacyc_lev[ii]= 0; + LimeCfg.p_c0_en[ii] = 1; + LimeCfg.p_c1_en[ii] = 1; + LimeCfg.p_c2_en[ii] = 1; + LimeCfg.p_c3_en[ii] = 1; + LimeCfg.am_frq[ii] = 0; + LimeCfg.am_pha[ii] = 0; + LimeCfg.am_depth[ii] = 0; + LimeCfg.am_mode[ii] = 0; + LimeCfg.fm_frq[ii] = 0; + LimeCfg.fm_pha[ii] = 0; + LimeCfg.fm_width[ii] = 0; + LimeCfg.fm_mode[ii] = 0; + } + + // Timing of TTL controls: [enabled? , pre, offs, post] + int c0_tim[4] = {0, 70, 56, -5}; + int c1_tim[4] = {0, 70, 56, -5}; + int c2_tim[4] = {0, 70, 56, -5}; + int c3_tim[4] = {0, 70, 56, -5}; + + // Use TTL channel as synth: [enabled? , half-period, strt, PSK shift, PSK adv] + int c0_synth[5] = {0, 500, 0, 0, 0}; + int c1_synth[5] = {0, 500, 0, 0, 0}; + int c2_synth[5] = {0, 500, 0, 0, 0}; + int c3_synth[5] = {0, 500, 0, 0, 0}; + + LimeCfg.averages = 6; // number of averages + LimeCfg.repetitions = 4; // number of repetions + LimeCfg.reptime_secs = 4e-3; // repetition time + LimeCfg.rectime_secs = 0.2e-3; // duration of acquisition window + LimeCfg.buffersize = 4080 * 3; // number of samples in buffer + LimeCfg.pcyc_bef_avg = 0; // phase cycle before average + + LimeCfg.file_pattern = "test"; // identifier when saving the file + LimeCfg.save_path = "./asdf/"; // path to save the file to + LimeCfg.override_save = 0; // default: save data + LimeCfg.override_init = 0; // default: init LimeSDR + + + // that's it for the parameters + // ---------------------------------------------------------------------------------- + + // .. copy here those arrays ... + memcpy(LimeCfg.c0_tim, c0_tim, 4* sizeof *LimeCfg.c0_tim); + memcpy(LimeCfg.c1_tim, c1_tim, 4* sizeof *LimeCfg.c1_tim); + memcpy(LimeCfg.c2_tim, c2_tim, 4* sizeof *LimeCfg.c2_tim); + memcpy(LimeCfg.c3_tim, c3_tim, 4* sizeof *LimeCfg.c3_tim); + memcpy(LimeCfg.c0_synth, c0_synth, 5* sizeof *LimeCfg.c0_synth); + memcpy(LimeCfg.c1_synth, c1_synth, 5* sizeof *LimeCfg.c1_synth); + memcpy(LimeCfg.c2_synth, c2_synth, 5* sizeof *LimeCfg.c2_synth); + memcpy(LimeCfg.c3_synth, c3_synth, 5* sizeof *LimeCfg.c3_synth); + + // and add the timestamp for the file + auto now = std::chrono::system_clock::now(); + auto itt = std::chrono::system_clock::to_time_t(now); + std::ostringstream stringstream; + stringstream << std::put_time(localtime(&itt), "%G%m%d_%H%M%S"); + LimeCfg.file_stamp = stringstream.str(); + LimeCfg.stamp_start = stringstream.str(); + LimeCfg.stamp_end = stringstream.str(); // will be overwritten just before data is written + + // allocate other variables that depend on Npulses + LimeCfg.p_dur_smp = new int[LimeCfg.Npulses]; + LimeCfg.p_frq_smp = new double[LimeCfg.Npulses]; + LimeCfg.am_frq_smp = new double[LimeCfg.Npulses]; + LimeCfg.fm_frq_smp = new double[LimeCfg.Npulses]; + + // LimeCfg as attributes for writing to HDF and for parsing command line input + // This is all done 'manually', since there is no reflection in cpp.. at least not by default + struct Config2HDFattr_t HDFattr[] = { + {"sra", "SampleRate [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.srate, 1}, + {"lof", "LO Frequency [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.frq, 1}, + {"rlp", "RX LowPass BW [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.RX_LPF, 1}, + {"tlp", "TX LowPass BW [Hz]", H5::PredType::IEEE_F32LE, &LimeCfg.TX_LPF, 1}, + {"rgn", "RX Gain [dB]", H5::PredType::NATIVE_INT, &LimeCfg.RX_gain, 1}, + {"tgn", "TX Gain [dB]", H5::PredType::NATIVE_INT, &LimeCfg.TX_gain, 1}, + {"///", "RX Gain readback [dB]",H5::PredType::NATIVE_INT, &LimeCfg.RX_gain_rback, 4}, + {"///", "TX Gain readback [dB]",H5::PredType::NATIVE_INT, &LimeCfg.TX_gain_rback, 3}, + {"tdq", "TX DC-correction Q", H5::PredType::NATIVE_INT, &LimeCfg.TX_QcorrDC, 1}, + {"tdi", "TX DC-correction I", H5::PredType::NATIVE_INT, &LimeCfg.TX_IcorrDC, 1}, + {"tgi", "TX I Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.TX_IcorrGain, 1}, + {"tgq", "TX Q Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.TX_QcorrGain, 1}, + {"tpc", "TX Phase correction", H5::PredType::NATIVE_INT, &LimeCfg.TX_IQcorrPhase,1}, + {"rgi", "RX I Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.RX_IcorrGain, 1}, + {"rgq", "RX Q Gain correction", H5::PredType::NATIVE_INT, &LimeCfg.RX_QcorrGain, 1}, + {"rpc", "RX Phase correction", H5::PredType::NATIVE_INT, &LimeCfg.RX_IQcorrPhase,1}, + {"npu", "Number of Pulses", H5::PredType::NATIVE_INT, &LimeCfg.Npulses, 1}, + {"pdr", "Pulse Duration [s]", H5::PredType::IEEE_F64LE, LimeCfg.p_dur, (hsize_t) LimeCfg.Npulses}, + {"pof", "Pulse Offset [Sa]", H5::PredType::NATIVE_INT, LimeCfg.p_offs, (hsize_t) LimeCfg.Npulses}, + {"pam", "IF Pulse Amplitude", H5::PredType::IEEE_F64LE, LimeCfg.p_amp, (hsize_t) LimeCfg.Npulses}, + {"pfr", "IF Pulse Frequency [Hz]",H5::PredType::IEEE_F64LE, LimeCfg.p_frq, (hsize_t) LimeCfg.Npulses}, + {"pph", "IF Pulse Phase", H5::PredType::IEEE_F64LE, LimeCfg.p_pha, (hsize_t) LimeCfg.Npulses}, + {"pcn", "Nmbr of Phasecycles", H5::PredType::NATIVE_INT, LimeCfg.p_phacyc_N, (hsize_t) LimeCfg.Npulses}, + {"pcl", "Level of Phasecycle", H5::PredType::NATIVE_INT, LimeCfg.p_phacyc_lev, (hsize_t) LimeCfg.Npulses}, + {"///", "Pulse Duration [Sa]", H5::PredType::NATIVE_INT, LimeCfg.p_dur_smp, (hsize_t) LimeCfg.Npulses}, + {"///", "IF Pulse Frequency [1/Sa]",H5::PredType::IEEE_F64LE, LimeCfg.p_frq_smp, (hsize_t) LimeCfg.Npulses}, + {"amf", "AM Frequency [Hz]", H5::PredType::IEEE_F64LE, LimeCfg.am_frq, (hsize_t) LimeCfg.Npulses}, + {"amp", "AM Phase [rad]", H5::PredType::IEEE_F64LE, LimeCfg.am_pha, (hsize_t) LimeCfg.Npulses}, + {"amd", "AM Depth", H5::PredType::IEEE_F64LE, LimeCfg.am_depth, (hsize_t) LimeCfg.Npulses}, + {"amm", "AM Mode", H5::PredType::NATIVE_INT, LimeCfg.am_mode, (hsize_t) LimeCfg.Npulses}, + {"///", "AM Frequency [1/Sa]", H5::PredType::IEEE_F64LE, LimeCfg.am_frq_smp, (hsize_t) LimeCfg.Npulses}, + {"fmf", "FM Frequency [Hz]", H5::PredType::IEEE_F64LE, LimeCfg.fm_frq, (hsize_t) LimeCfg.Npulses}, + {"fmp", "FM Phase [rad]", H5::PredType::IEEE_F64LE, LimeCfg.fm_pha, (hsize_t) LimeCfg.Npulses}, + {"fmw", "FM width [Hz]", H5::PredType::IEEE_F64LE, LimeCfg.fm_width, (hsize_t) LimeCfg.Npulses}, + {"fmm", "FM Mode", H5::PredType::NATIVE_INT, LimeCfg.fm_mode, (hsize_t) LimeCfg.Npulses}, + {"///", "FM Frequency [1/Sa]", H5::PredType::IEEE_F64LE, LimeCfg.fm_frq_smp, (hsize_t) LimeCfg.Npulses}, + {"t0d", "Trigger0 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c0_tim, 4}, + {"t1d", "Trigger1 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c1_tim, 4}, + {"t2d", "Trigger2 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c2_tim, 4}, + {"t3d", "Trigger3 Timing [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c3_tim, 4}, + {"t0s", "Trigger0 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c0_synth, 5}, + {"t1s", "Trigger1 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c1_synth, 5}, + {"t2s", "Trigger2 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c2_synth, 5}, + {"t3s", "Trigger3 Synth [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.c3_synth, 5}, + {"t0p", "Trigger0 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c0_en, (hsize_t) LimeCfg.Npulses}, + {"t1p", "Trigger1 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c1_en, (hsize_t) LimeCfg.Npulses}, + {"t2p", "Trigger2 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c2_en, (hsize_t) LimeCfg.Npulses}, + {"t3p", "Trigger3 Enable", H5::PredType::NATIVE_INT, LimeCfg.p_c3_en, (hsize_t) LimeCfg.Npulses}, + {"nrp", "Nmbr of Repetitions", H5::PredType::NATIVE_INT, &LimeCfg.repetitions, 1}, + {"nav", "Nmbr of Averages", H5::PredType::NATIVE_INT, &LimeCfg.averages, 1}, + {"trp", "Repetition Time [s]", H5::PredType::IEEE_F64LE, &LimeCfg.reptime_secs, 1}, + {"tac", "Acquisition Time [s]", H5::PredType::IEEE_F64LE, &LimeCfg.rectime_secs, 1}, + {"///", "Repetition Time [Sa]", H5::PredType::NATIVE_INT, &LimeCfg.reptime_smps, 1}, + {"///", "Acquisition Time [Sa]",H5::PredType::NATIVE_INT, &LimeCfg.rectime_smps, 1}, + {"bsz", "Buffersize", H5::PredType::NATIVE_INT, &LimeCfg.buffersize, 1}, + {"pba", "Pcyc before Avg if >0",H5::PredType::NATIVE_INT, &LimeCfg.pcyc_bef_avg, 1}, + {"fpa", "Filename Pattern", H5::StrType(H5::PredType::C_S1, LimeCfg.file_pattern.length()+1), (void *) LimeCfg.file_pattern.c_str(), 1}, + {"spt", "Save Path", H5::StrType(H5::PredType::C_S1, LimeCfg.save_path.length()+1), (void *) LimeCfg.save_path.c_str(), 1}, + {"nos", "Don't save if >0", H5::PredType::NATIVE_INT, &LimeCfg.override_save, 1}, + {"noi", "Don't init if >0", H5::PredType::NATIVE_INT, &LimeCfg.override_init, 1}, + {"fst", "Filename Timestamp", H5::StrType(H5::PredType::C_S1, LimeCfg.file_stamp.length()+1), (void *) LimeCfg.file_stamp.c_str(), 1}, + {"///", "Exp Start Timestamp", H5::StrType(H5::PredType::C_S1, LimeCfg.stamp_start.length()+1), (void *) LimeCfg.stamp_start.c_str(), 1}, + {"///", "Exp End Timestamp", H5::StrType(H5::PredType::C_S1, LimeCfg.stamp_end.length()+1), (void *) LimeCfg.stamp_end.c_str(), 1} + }; + int no_of_attr = sizeof(HDFattr)/sizeof(Config2HDFattr_t); + + // iterate through arguments to parse eventual user input + // (exposing the actual content of the struct to python would be nicer...) + bool parse_prob = false; + int curr_attr = -1; + int curr_attr_last = -1; + int attr2read = 0; + int attr2read_last = 0; + int attr_read = 0; + for (int ii_arg = 1; ii_arg < argc; ii_arg++) { + + // get the attribute for the argument based on '-' (which also is there for negative numbers..) + if (argv[ii_arg][0] == '-') { + + if ((strlen(argv[ii_arg]+1) != 3) && (attr2read == 0)) { + cout << "Invalid argument "<< ii_arg <<": " << argv[ii_arg] << endl; + parse_prob = true; + continue; + } + // find matching attribute + curr_attr_last = curr_attr; + attr2read_last = attr2read; + curr_attr = -1; + for (int ii_attr = 0; ii_attr < no_of_attr; ii_attr++) { + if (strcmp(argv[ii_arg]+1, HDFattr[ii_attr].arg.c_str()) == 0) { + curr_attr = ii_attr; + attr2read = HDFattr[ii_attr].dim; + attr_read = 0; + cout << "Found argument " << HDFattr[curr_attr].arg << ": " << HDFattr[curr_attr].Name << endl; + } + } + // found nothing + if (curr_attr == -1 && attr2read_last == 0) { + cout << "Could not find valid attribute for argument "<< ii_arg <<": " << argv[ii_arg] << endl; + parse_prob = true; + // found something, but did not read the previous arguments + } else if (curr_attr > -1 && attr2read_last > 0) { + cout << "Missing argument: "<< attr2read_last <<" value missing for argument " << HDFattr[curr_attr_last].arg << endl; + parse_prob = true; + } + // found nothing and did not read the previous arguments: a negative number + if (curr_attr == -1 && attr2read_last > 0) { + // restore the attribute and it as number + curr_attr = curr_attr_last; + attr2read = attr2read_last; + } else + // all other cases: jump to the next argument + continue; + } + + // parse the value from the current attribute + if (curr_attr != -1 && attr2read != 0) { + + // differentiate between the different types of input based on the H5::DataType + // float values + if (HDFattr[curr_attr].dType == H5::PredType::IEEE_F32LE) { + *((float *) HDFattr[curr_attr].Value+attr_read) = atof(argv[ii_arg]); + attr2read--; attr_read++; + //cout << "Got value " << atof(argv[ii_arg]) << " from " << argv[ii_arg] << endl; + } + // double values + if (HDFattr[curr_attr].dType == H5::PredType::IEEE_F64LE) { + *((double *) HDFattr[curr_attr].Value+attr_read) = (double) atof(argv[ii_arg]); + attr2read--; attr_read++; + //cout << "Got value " << (double) atof(argv[ii_arg]) << " from " << argv[ii_arg] << endl; + } + // integer values + if (HDFattr[curr_attr].dType == H5::PredType::NATIVE_INT) { + *((int *) HDFattr[curr_attr].Value+attr_read) = atoi(argv[ii_arg]); + attr2read--; attr_read++; + //cout << "Got value " << atoi(argv[ii_arg]) << " from " << argv[ii_arg] << endl; + } + // strings: stored as std::string in LimeCfg and as Cstring in HDFattr.. + // --> explicitly treat strings, these are anyhow just a few for file/path info + if (strcmp(HDFattr[curr_attr].arg.c_str(), "spt") == 0) { + LimeCfg.save_path = argv[ii_arg]; + HDFattr[curr_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.save_path.length()+1); + HDFattr[curr_attr].Value = (void *) LimeCfg.save_path.c_str(); + attr2read--; attr_read++; + } + if (strcmp(HDFattr[curr_attr].arg.c_str(), "fpa") == 0) { + LimeCfg.file_pattern = argv[ii_arg]; + HDFattr[curr_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.file_pattern.length()+1); + HDFattr[curr_attr].Value = (void *) LimeCfg.file_pattern.c_str(); + attr2read--; attr_read++; + } + if (strcmp(HDFattr[curr_attr].arg.c_str(), "fst") == 0) { + LimeCfg.file_stamp = argv[ii_arg]; + HDFattr[curr_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.file_stamp.length()+1); + HDFattr[curr_attr].Value = (void *) LimeCfg.file_stamp.c_str(); + attr2read--; attr_read++; + } + } else if (attr2read == 0) { + cout << "Problem with argument " << HDFattr[curr_attr].arg << ": There is an input that is not clear, probably one input more than required! " << endl; + parse_prob = true; + } + } + // check if the last argument had all the values + if (attr2read > 0) { + cout << "Missing argument: "<< attr2read <<" value missing for argument " << HDFattr[curr_attr].arg << endl; + parse_prob = true; + } + if (parse_prob) { + cout << "Exiting due to problem with provided arguments! Valid arguments are (exept -///, which cannot be set by the user):" << endl; + string datatype; + for (int ii_attr = 0; ii_attr < no_of_attr; ii_attr++) { + + // get the datatype + if (HDFattr[ii_attr].dType == H5::PredType::IEEE_F32LE) datatype = "float"; + else if (HDFattr[ii_attr].dType == H5::PredType::IEEE_F64LE) datatype = "double"; + else if (HDFattr[ii_attr].dType == H5::PredType::NATIVE_INT) datatype = "int"; + else datatype = "string"; + cout << "-" << HDFattr[ii_attr].arg << " " << left << setw(30) << HDFattr[ii_attr].Name << ": " << HDFattr[ii_attr].dim << "x " << datatype << endl; + + } + return 1; + } + + + // convert input in seconds/Hz to samples + for (int ii = 0; ii < LimeCfg.Npulses; ii++) { + LimeCfg.p_dur_smp[ii] = round(LimeCfg.p_dur[ii] * LimeCfg.srate); + LimeCfg.p_frq_smp[ii] = LimeCfg.p_frq[ii] / LimeCfg.srate; + LimeCfg.am_frq_smp[ii] = LimeCfg.am_frq[ii] / LimeCfg.srate; + LimeCfg.fm_frq_smp[ii] = LimeCfg.fm_frq[ii] / LimeCfg.srate; + } + + + // check directory first + if (makePath(LimeCfg.save_path) == 0) { + cout << "Problem entering the specified path: " << LimeCfg.save_path << endl; + return 1; + } + + + //Find devices + int n; + lms_info_str_t list[8]; //should be large enough to hold all detected devices + + if ((n = LMS_GetDeviceList(list)) < 0) //NULL can be passed to only get number of devices + error(); + + cout << "Devices found: " << n << endl; //print number of devices + if (n < 1) return -1; + + //open the first device + if (LMS_Open(&device, list[n-1], 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; +*/ + + int chn=1; + + //Get number of channels + if ((n = LMS_GetNumChannels(device, LMS_CH_RX)) < 0) error(); + cout << "Number of RX channels: " << n << endl; + if ((n = LMS_GetNumChannels(device, LMS_CH_TX)) < 0) error(); + cout << "Number of TX channels: " << n << endl; + + + // check if the settings are already there + float_type frq_read; + if (LMS_GetLOFrequency(device, LMS_CH_RX, chn, &frq_read) != 0) error(); + + float_type srate_read, rf_rate; + if (LMS_GetSampleRate(device, LMS_CH_RX, chn, &srate_read, &rf_rate) != 0) error(); + + bool frqdev = fabs(frq_read - LimeCfg.frq) > 1.0; + bool sratedev = fabs(srate_read - LimeCfg.srate) > 1.0; + + + // Getting the gain + int RXgain[4]; + int TXgain[3]; + + + + GetGainRXTX(RXgain, TXgain); + + bool rgndev = RXgain[0] != LimeCfg.RX_gain; + bool tgndev = TXgain[0] != LimeCfg.TX_gain; + if (TXgain[0] > 55 && LimeCfg.TX_gain > 55) { + tgndev = false; + cout << "Unable to check for variation in TXgain setting, since it is impossible to retrieve it for TXgain > 55 dB without altering the RF performance. Eventual changes in the TXgain are thus not taken into account." << endl; + } + + /* + // Similar as with the built in GetGaindB function, the GetLPFBW function is also affecting the actual reading of the LPF. It is actually not entirely clear why this happens, as compared to the GetGaindB function, where it is evident that some calibration is done.. + // Accordingly, one must take care that the LPFBW is set right at the beginning when opening the device + float_type LPFBW, LPFBW2; // lowpass bandwidth + if (LMS_GetLPFBW(device, LMS_CH_RX, 0, &LPFBW) != 0) error(); + bool rlpfdev = LPFBW != LimeCfg.RX_LPF; + if (LMS_GetLPFBW(device, LMS_CH_TX, 0, &LPFBW2) != 0) error(); + bool tlpfdev = LPFBW2 != LimeCfg.TX_LPF; + */ + + + // initialize LimeSDR if there is a deviation in relevant parameters or if it is enforced to init, not init + //if (frqdev || sratedev || tgndev || rgndev || rlpfdev || tlpfdev || true) { + bool override_init = LimeCfg.override_init > 0; // override the initialization if -noi > 0 + bool enforce_init = LimeCfg.override_init < 0; // enforce init if -noi < 0 + + if ( ((frqdev || sratedev || tgndev || rgndev ) && !override_init) || enforce_init ) { + + // just to re-assure why there is another setup + cout << "Re-initialization of parameters ... " << endl; + if (frqdev) cout << "... due to LOfrequency deviation by " << frq_read - LimeCfg.frq << " from " << LimeCfg.frq << endl; + if (sratedev) cout << "... due to samplerate deviation by " << srate_read - LimeCfg.srate << " from " << LimeCfg.srate << endl; + if (rgndev) cout << "... due to RX gain deviation by " << RXgain[0] - LimeCfg.RX_gain << " from " << LimeCfg.RX_gain << endl; + if (tgndev) cout << "... due to TX gain deviation by " << TXgain[0] - LimeCfg.TX_gain << " from " << LimeCfg.TX_gain << endl; + //if (rlpfdev) cout << "... due to RX LPF deviation by " << LPFBW - LimeCfg.RX_LPF << " from " << LimeCfg.RX_LPF << endl; + //if (tlpfdev) cout << "... due to TX LPF deviation by " << LPFBW2 - LimeCfg.TX_LPF << " from " << LimeCfg.TX_LPF << endl; + + // First mute the TX output, as the init commands create a lot of garbage + if (LMS_WriteParam(device, LMS7_PD_TLOBUF_TRF, 1) != 0) error(); + if (LMS_SetGaindB(device, LMS_CH_TX, chn, 0)!= 0) { + + cout << "Initializing device first!" << endl; + + // this might fail for a freshly connected device + // --> init the device + if (LMS_Init(device) != 0) error(); + // retry + if (LMS_SetGaindB(device, LMS_CH_TX, chn, 0) != 0) error(); + } + if (LMS_SetNormalizedGain(device, LMS_CH_TX, chn, 0.0) != 0) error(); + if (LMS_SetNormalizedGain(device, LMS_CH_TX, chn, 0.0) != 0) error(); + + //Set RX center frequency + if (LMS_SetLOFrequency(device, LMS_CH_RX, chn, LimeCfg.frq) != 0) error(); + + //Set TX center frequency + if (LMS_SetLOFrequency(device, LMS_CH_TX, chn, LimeCfg.frq) != 0) error(); + + // Read back the updated frequency for later storage + if (LMS_GetLOFrequency(device, LMS_CH_RX, chn, &frq_read) != 0) error(); + + //Enable RX channel + //Channels are numbered starting at 0 + if (LMS_EnableChannel(device, LMS_CH_RX, 0, true) != 0) error(); + //Enable TX channels + if (LMS_EnableChannel(device, LMS_CH_TX, 0, true) != 0) error(); + + if (LMS_EnableChannel(device, LMS_CH_RX, chn, true) != 0) error(); + //Enable TX channels + if (LMS_EnableChannel(device, LMS_CH_TX, chn, true) != 0) error(); + + // fwd the TX1 LO to TX2 + if (LMS_WriteParam(device, LMS7_EN_NEXTTX_TRF, true) != 0) error(); + if (LMS_WriteParam(device, LMS7_EN_NEXTRX_RFE, true) != 0) error(); + + // apply DC offset in TxTSP + if (LMS_WriteParam(device, LMS7_MAC, chn+1) != 0) error(); + //if (LMS_WriteParam(device, LMS7_MAC, chn) != 0) error(); + uint16_t DC_I, DC_Q, DC_EN; + DC_EN = 0; + + if (LMS_WriteParam(device, LMS7_DCCORRI_TXTSP, LimeCfg.TX_IcorrDC) != 0) error(); + if (LMS_WriteParam(device, LMS7_DCCORRQ_TXTSP, LimeCfg.TX_QcorrDC) != 0) error(); + if (LMS_WriteParam(device, LMS7_DC_BYP_TXTSP, DC_EN) != 0) error(); + + + if (LMS_WriteParam(device, LMS7_GCORRI_TXTSP, LimeCfg.TX_IcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_GCORRQ_TXTSP, LimeCfg.TX_QcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_IQCORR_TXTSP, LimeCfg.TX_IQcorrPhase) != 0) error(); + if (LMS_WriteParam(device, LMS7_GCORRI_RXTSP, LimeCfg.RX_IcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_GCORRQ_RXTSP, LimeCfg.RX_QcorrGain) != 0) error(); + if (LMS_WriteParam(device, LMS7_IQCORR_RXTSP, LimeCfg.RX_IQcorrPhase) != 0) error(); + + //added by me as the IQ calibration did not happen on the chip from python or c++ + if (LMS_WriteParam(device, LMS7_MAC, chn+1) != 0) error(); + + //if (LMS_WriteParam(device, LMS7_MAC, 1) != 0) error(); + + /* + // read back DC offset in TxTSP + if (LMS_ReadParam(device, LMS7_DCCORRI_TXTSP, &DC_I) != 0) error(); + if (LMS_ReadParam(device, LMS7_DCCORRQ_TXTSP, &DC_Q) != 0) error(); + if (LMS_ReadParam(device, LMS7_DC_BYP_TXTSP, &DC_EN) != 0) error(); + cout << "TxTSP DC corr (EN, I, Q): " << DC_EN << ", " << DC_I << ", " << DC_Q << endl; + */ + + + //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, chn, antenna_list)) < 0) error(); + + cout << "Available RX LNAs:\n"; //print available antennae names + for (int i = 0; i < n; i++) + cout << i << ": " << antenna_list[i] << endl; + // get and print antenna index and name + if ((n = LMS_GetAntenna(device, LMS_CH_RX, chn)) < 0) error(); + cout << "Automatically selected RX LNA: " << n << ": " << antenna_list[n] << endl; + + // manually select antenna + if (LMS_SetAntenna(device, LMS_CH_RX, chn, LMS_PATH_LNAL) != 0) error(); + + // get and print antenna index and name + //if ((n = LMS_GetAntenna(device, LMS_CH_RX, 0)) < 0) error(); + //cout << "Manually selected RX LNA: " << n << ": " << antenna_list[n] << endl; + + //select antenna port + //Alternatively, NULL can be passed to LMS_GetAntennaList() to obtain number of antennae + if ((n = LMS_GetAntennaList(device, LMS_CH_TX, chn, antenna_list)) < 0) error(); + + cout << "Available TX pathways:\n"; //print available antennae names + for (int i = 0; i < n; i++) + cout << i << ": " << antenna_list[i] << endl; + + // get and print print antenna index and name + if ((n = LMS_GetAntenna(device, LMS_CH_TX, chn)) < 0) + error(); + cout << "Automatically selected TX pathway: " << n << ": " << antenna_list[n] << endl; + + // manually select antenna + int mychoice = LMS_PATH_TX2; + if (LimeCfg.frq > 1500e6) mychoice = LMS_PATH_TX2; + //mychoice = LMS_PATH_TX2; // HACK: hardcode TX2 pathway + if (LMS_SetAntenna(device, LMS_CH_TX, chn, LMS_PATH_TX1) != 0) error(); + + // get and print print antenna index and name + if ((n = LMS_GetAntenna(device, LMS_CH_TX, chn)) < 0) error(); + cout << "Manually selected TX pathway: " << n << ": " << antenna_list[n] << endl; + + // Set sample rate, w/o oversampling, so that we can remove the invsinc filter + if (LMS_SetSampleRate(device, LimeCfg.srate, 1) != 0) error(); + // Invsinc, which removes that non-causal wiggle in timedomain + + //if (LMS_WriteParam(device, LMS7_MAC, chn) != 0) error(); + if (LMS_WriteParam(device, LMS7_MAC, chn+1) != 0) error(); + + if (LMS_WriteParam(device, LMS7_ISINC_BYP_TXTSP, 1) != 0) error(); + // CMIX: Disable, as it is not used + if (LMS_WriteParam(device, LMS7_CMIX_BYP_TXTSP, 1) != 0) error(); + if (LMS_WriteParam(device, LMS7_CMIX_BYP_RXTSP, 1) != 0) error(); + + // experiment with the GFIR filters + // if (LMS_SetGFIRLPF(device, LMS_CH_RX, 0, 1, 0.5e6) != 0) error(); // Works nicely. Allows, for instance, to perform narrowband observation together with CMIX + + + // Remute the TX output here, as the init commands create a lot of garbage + if (LMS_WriteParam(device, LMS7_PD_TLOBUF_TRF, 1) != 0) error(); + + // Set RX and TX to the gain values + if (LMS_SetGaindB(device, LMS_CH_TX, chn, LimeCfg.TX_gain) != 0) error(); + if (LMS_SetGaindB(device, LMS_CH_RX, chn, LimeCfg.RX_gain) != 0) error(); + + cout << "After gain setting: " << endl; + GetGainRXTX(RXgain, TXgain); + + // special for low frequency operation: LNA gain saturates rather early -> reduce lna gain and increase pga + // ( and even though we have that function GetGainRXTX(), we need to re-read the values here explicitly, since + // we need to operate on the actual settings of the LMS Parameter, and not the gain values ) + uint16_t gain_lna, gain_tia, gain_pga; + if (LMS_ReadParam(device, LMS7_G_LNA_RFE, &gain_lna) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_TIA_RFE, &gain_tia) != 0) error(); + if (LMS_ReadParam(device, LMS7_G_PGA_RBB, &gain_pga) != 0) error(); + // cout << "Indiv gain addr: " << gain_lna << " LNA, " << gain_tia << " TIA, " << gain_pga << " PGA" << endl; + // gain_lna > 7 means a gain beyond gmax-12. Convert that to gains in dB + uint16_t crit_val = 7; + uint16_t gain_corr = (gain_lna - crit_val); + if (gain_corr > 2) gain_corr += 4; // gain steps of 1 dB for gain_lna > 9 + else gain_corr *= 3; // gain steps of 3 dB for gain_lna <= 9 + // eventually put this to the pga gain + if (gain_corr > 0) { + if (LMS_WriteParam(device, LMS7_G_LNA_RFE, crit_val) != 0) error(); + if (LMS_WriteParam(device, LMS7_G_PGA_RBB, gain_pga + gain_corr) != 0) error(); + } + GetGainRXTX(RXgain, TXgain); + + //Get allowed LPF bandwidth range + lms_range_t range; + if (LMS_GetLPFBWRange(device,LMS_CH_RX,&range)!=0) error(); + cout << "RX LPF bandwitdh range: " << range.min / 1e6 << " - " << range.max / 1e6 << " MHz\n\n"; + + if (LMS_GetLPFBWRange(device,LMS_CH_TX,&range)!=0) error(); + cout << "TX LPF bandwitdh range: " << range.min / 1e6 << " - " << range.max / 1e6 << " MHz\n\n"; + + if (LMS_SetLPFBW(device,LMS_CH_RX,chn, LimeCfg.RX_LPF)!=0) error(); + if (LMS_SetLPFBW(device,LMS_CH_TX,chn, LimeCfg.TX_LPF)!=0) error(); + + + float_type LPFBW; // lowpass bandwidth + if (LMS_GetLPFBW(device, LMS_CH_RX, chn, &LPFBW) != 0) error(); + cout << "RX LPFBW: " << LPFBW/1e6 << " MHz" << endl; + if (LMS_GetLPFBW(device, LMS_CH_TX, chn, &LPFBW) != 0) error(); + cout << "TX LPFBW: " << LPFBW/1e6 << " MHz" << endl; + + // Set limelight interface to TRXIQ, as the std value (JESD) will not communicate + if (LMS_WriteParam(device, LMS7_LML1_MODE, 0) != 0) error(); + if (LMS_WriteParam(device, LMS7_LML2_MODE, 0) != 0) error(); + + // Unmute the TX output, as the init commands are now written + if (LMS_WriteParam(device, LMS7_PD_TLOBUF_TRF, 0) != 0) error(); + + } + + // read back values that tend to depend on the specific configuration + memcpy(LimeCfg.TX_gain_rback, TXgain, 3* sizeof *LimeCfg.TX_gain_rback); + memcpy(LimeCfg.RX_gain_rback, RXgain, 4* sizeof *LimeCfg.RX_gain_rback); + + + const int chCount = 1; //number of RX/TX streams + + // Initialize acquisition data buffer + int buffersize = LimeCfg.buffersize; //complex samples per buffer + // note that proper scheduling requires buffersize that is a multiple of 1360 (12bit RX) and 1020 (16bit TX) + // accordingly, buffersize needs to be a multiple of 4080, which is 3*1360 and 4*1020 + if (buffersize % 4080 != 0) { + + cout << "Problem with requested buffersize of " << LimeCfg.buffersize << ", as it is not a multiple of 4080." << endl; + LMS_Close(device); + return 1; + + } + + + int timestampOffset = 0; // for offsets between TX and RX timestamps + int bufferOffset = 0; // to correct for those offsets + int16_t * buffers[chCount]; + for (int ii = 0; ii < chCount; ++ii) + { + buffers[ii] = new int16_t[buffersize * 2]; //buffer to hold complex values (2*samples) + } + + //Streaming Setup + lms_stream_t rx_streams[chCount]; + lms_stream_t tx_streams[chCount]; + + int N_buffers_per_fifo = 96; // Number of buffers that can be put onto the fifo + + //Initialize streams + //All streams setups should be done before starting streams. New streams cannot be set-up if at least stream is running. + for (int ii = 0; ii < chCount; ++ii) + { + rx_streams[ii].channel = chn; //channel number + rx_streams[ii].fifoSize = buffersize * N_buffers_per_fifo; //fifo size in samples + rx_streams[ii].throughputVsLatency = 1.0; //1.0 max throuhput, 0.0 min latency + rx_streams[ii].isTx = false; //RX channel + rx_streams[ii].dataFmt = lms_stream_t::LMS_FMT_I12; //12-bit integers + + if (LMS_SetupStream(device, &rx_streams[ii]) != 0) error(); + + tx_streams[ii].channel = chn; //channel number + tx_streams[ii].fifoSize = buffersize * N_buffers_per_fifo; //fifo size in samples + tx_streams[ii].throughputVsLatency = 1.0; //1.0 max throuhput, 0.0 min latency + tx_streams[ii].isTx = true; //TX channel + tx_streams[ii].dataFmt = lms_stream_t::LMS_FMT_I16; //16-bit float + + if (LMS_SetupStream(device, &tx_streams[ii]) != 0) error(); + } + + + //gather parameters for the TX pulse + + // first get all the phase-cycles + // which at first requires few maximum quantities.... + // .... the number of levels ... + int max_lev = 0; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) if (LimeCfg.p_phacyc_lev[ii_pls] > max_lev) max_lev = LimeCfg.p_phacyc_lev[ii_pls]; + + // check if there are no gaps in the level specification + bool found_level[max_lev+1]; + bool level_problem = false; + for (int ii = 0; ii < max_lev + 1; ii++) { + found_level[ii] = false; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) if (LimeCfg.p_phacyc_lev[ii_pls] == ii) found_level[ii] = true; + if (!found_level[ii]) level_problem = true; + } + if (level_problem) { + cout << "Problem with specified phase cycle levels: "; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) cout << setw(5) << left << LimeCfg.p_phacyc_lev[ii_pls]; + cout << endl; + cout << "A consecutive level numbering is required, but level/s "; + for (int ii = 0; ii < max_lev + 1; ii++) if (!found_level[ii]) cout << setw(2) << left << ii; + cout << " is/are missing!" << endl; + + LMS_Close(device); + return 1; + } + // ... the maximum number of phase cycles per level ... + int * steps_per_lev = new int[max_lev + 1]; + for (int ii = 0; ii < max_lev + 1; ii++) steps_per_lev[ii] = 0; + + int curr_lev_steps; // to make the code more readable... + for (int ii = 0; ii < LimeCfg.Npulses; ii++) { + curr_lev_steps = steps_per_lev[LimeCfg.p_phacyc_lev[ii]]; + if (LimeCfg.p_phacyc_N[ii] > curr_lev_steps) steps_per_lev[LimeCfg.p_phacyc_lev[ii]] = LimeCfg.p_phacyc_N[ii]; + } + + // ... which gives the total number of phase variations ... + int num_phavar = 1; + int steps_incr[max_lev + 1] = {1}; // .. and the number of steps where phase is constant ... + for (int ii = 0; ii < max_lev + 1; ii++) { + if (ii > 0) steps_incr[ii] = steps_incr[ii-1] * steps_per_lev[ii-1]; + num_phavar *= steps_per_lev[ii]; + } + if (num_phavar < 1) { + cout << "Problem with specified number of phases (pcn) for pulses 0 to " << LimeCfg.Npulses-1 << ": " << endl; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) cout << setw(5) << left <0 for pulses:"; + for (int ii = 0; ii < LimeCfg.Npulses; ii++) if (LimeCfg.p_phacyc_N[ii] < 1) cout << setw(2) << left << ii; + cout << endl; + + LMS_Close(device); + return 1; + } + + // ... which allows to construct the entire phase table ... + double pha_tab[num_phavar][LimeCfg.Npulses]; + + double pha_incr, curr_pha; + int step_incr = 1; + + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + // retrieve the phase increment + if (LimeCfg.p_phacyc_N[ii_pls] != 0) + pha_incr = 1.0/LimeCfg.p_phacyc_N[ii_pls]; + else + pha_incr = 1.0; + + curr_pha = 0; + + // get the step increment + step_incr = steps_incr[LimeCfg.p_phacyc_lev[ii_pls]]; + + // start to fill the table + for (int ii_pha = 0; ii_pha < num_phavar; ii_pha++) { + // eventually increment the phase + if ((ii_pha > 0) && (ii_pha % step_incr == 0)) curr_pha += pha_incr; + + pha_tab[ii_pha][ii_pls] = fmod(curr_pha, 1.0); + } + } + + // debug: print that phase table + cout << "Phase Table : " << endl; + for (int ii_pha = 0; ii_pha < num_phavar; ii_pha++) { + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + cout << setw(10) << left << pha_tab[ii_pha][ii_pls]; + } + cout << endl; + } + + + // get the number of buffers that are required in order to fit the entire experiment + long exc_len = 0; + int exc_buffers; + int pulsedur, pulseoffs; + pulseoffs = 0; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + + pulsedur = LimeCfg.p_dur_smp[ii_pls]; // duration of pulse in samples + pulseoffs += LimeCfg.p_offs[ii_pls]; // offset of pulse in samples + + if (pulseoffs + pulsedur > exc_len) + exc_len = pulseoffs + pulsedur; + } + exc_buffers = ceil((double) exc_len / (double) buffersize); + cout << "Excitation pattern: " << exc_len << " samples (" << exc_buffers << " buffers with " << buffersize << " samples each)" << endl; + + + // TX buffers + //int16_t tx_buffer[num_phavar][exc_buffers][2*buffersize]; // buffer to hold complex values (2* samples), including phase cycles + // TODO: put in the same way as the acq buffer, i.e. as an array of pointers. Otherwise, there is a limitation in space that can be used + int16_t * tx_buffer[num_phavar][exc_buffers]; + for (int ii = 0; ii < num_phavar; ++ii) { + for (int jj = 0; jj < exc_buffers; ++jj) { + tx_buffer[ii][jj] = new int16_t[2*buffersize]; + } + } + int16_t tx_buffer_1st[2*buffersize]; // buffer to hold complex values + float fsmpI, fsmpQ; + int16_t smpI, smpQ; + + // init with zero, as we add to it + for (int ii = 0; ii < 2*buffersize; ii++) { + for (int jj = 0; jj < exc_buffers; jj++) { + for (int ll = 0; ll < num_phavar; ll++) tx_buffer[ll][jj][ii] = 0; + } + } + + + // pulse parameters + double pulsefrq, pulseamp, pulsepha, pulsepha_inst, pulseamp_inst; + double w, w_mod, mlt_mod, pha_acc, fm_width_smp; + int buffoffs; + + + pulseoffs = 0; + for (int ii_pls = 0; ii_pls < LimeCfg.Npulses; ii_pls++) { + + pulsedur = LimeCfg.p_dur_smp[ii_pls]; // duration of pulse in samples + pulseoffs += LimeCfg.p_offs[ii_pls]; // offset of pulse in samples + pulsefrq = LimeCfg.p_frq_smp[ii_pls]; // frequency of pulse in samples + pulseamp = LimeCfg.p_amp[ii_pls]; // relative amplitude of pulses + pulsepha = LimeCfg.p_pha[ii_pls]; // phase of pulse + + pha_acc = 0; // phase accumulation under FM + fm_width_smp = 2*pi*LimeCfg.fm_width[ii_pls] / LimeCfg.srate; // width of FM in rad/sample for correct accumulation + + for (int ll = 0; ll < num_phavar; ll++) { // generate TX Pulse for different phases + buffoffs = 0; + for (int jj = 0; jj < exc_buffers; jj++) { // distribute 'long experiment' amongst buffers + for (int ii = 0; ii < buffersize; ii++) { // generate TX Pulse point by point + if ((ii + buffoffs >= pulseoffs) & (ii + buffoffs < pulsedur + pulseoffs)) { + + //w = 2*pi*(ii+buffoffs-pulseoffs)*pulsefrq; // frequency*time, such that each pulse begins at zero phase + + w = 2*pi*(ii-pulseoffs)*pulsefrq; // re-put absolute phase, which is better suited for pulsed experiments. The inclusion of buffoffs above was actually intended for CW type experiments, which were put separately in CW_AFC_engine. + + // instantaneous pulseamp/pha + pulsepha_inst = pulsepha; + pulseamp_inst = pulseamp; + + // implement AM + if (LimeCfg.am_frq[ii_pls] != 0) { + w_mod = 2*pi*(ii+buffoffs-pulseoffs)*LimeCfg.am_frq_smp[ii_pls]; // inst modphase + mlt_mod = Modfunction(w_mod + LimeCfg.am_pha[ii_pls], LimeCfg.am_mode[ii_pls]); + mlt_mod = ((mlt_mod - 1.0)*LimeCfg.am_depth[ii_pls])+1.0; + pulseamp_inst = pulseamp*mlt_mod; + } + + // implement FM, currently by implementing the corresponding phase integral analytically + if (LimeCfg.fm_frq[ii_pls] != 0) { + w_mod = 2*pi*(ii+buffoffs-pulseoffs)*LimeCfg.fm_frq_smp[ii_pls]; // inst modphase + if (LimeCfg.fm_mode[ii_pls] == 0) {// cosine FM -> sine PM + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls] - pi/2, LimeCfg.fm_mode[ii_pls]); + } + else if (LimeCfg.fm_mode[ii_pls] == 1) { // tirangluar FM --> quadratic PM + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls] - pi/2, LimeCfg.fm_mode[ii_pls]); + + } + else if (LimeCfg.fm_mode[ii_pls] == 2) {// square FM --> triangular PM + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls] - pi/2, 1); + + } + mlt_mod = LimeCfg.fm_width[ii_pls]/2 * mlt_mod / LimeCfg.fm_frq[ii_pls]; + pulsepha_inst = pulsepha+mlt_mod; + + if (LimeCfg.fm_mode[ii_pls] > 90) { // method with accumulator + mlt_mod = Modfunction(w_mod + LimeCfg.fm_pha[ii_pls], LimeCfg.fm_mode[ii_pls]-100); + mlt_mod = fm_width_smp/2 * mlt_mod; + pha_acc += mlt_mod; + pulsepha_inst = pulsepha+pha_acc; + + } + } + + fsmpI = pulseamp_inst*cos(w+pulsepha_inst+2*pi*pha_tab[ll][ii_pls]); + fsmpQ = pulseamp_inst*sin(w+pulsepha_inst+2*pi*pha_tab[ll][ii_pls]); + + // convert to int16 ... + smpI = 2047.0 * fsmpI; + smpQ = 2047.0 * fsmpQ; + + // ... with 4 LSB at 0 for marker + if (tx_streams[0].dataFmt == lms_stream_t::LMS_FMT_I16) { + smpI = smpI << 4; + smpQ = smpQ << 4; + } + // add to buffer + tx_buffer[ll][jj][2*ii] += smpI; + tx_buffer[ll][jj][2*ii+1] += smpQ; + } else { + //fsmpI = 0.0; + //fsmpQ = 0.0; + } + } + buffoffs += buffersize; // jump to next buffer + } + } + + // Pulse Marker for timing relative to pulse flanks + // TODO: we might need some gate joining and one should also warn if the triggers do not fit into the buffer + if (tx_streams[0].dataFmt == lms_stream_t::LMS_FMT_I16) { + int* curr_marker; + int* curr_marker_en; + // marker channel for that offset + for (int ii_c = 0; ii_c <4; ii_c++) { // iterate through the four marker channels + // get the proper configuration of the trigger channel + switch (ii_c) { + case 0: curr_marker = LimeCfg.c0_tim; curr_marker_en = LimeCfg.p_c0_en; break; + case 1: curr_marker = LimeCfg.c1_tim; curr_marker_en = LimeCfg.p_c1_en; break; + case 2: curr_marker = LimeCfg.c2_tim; curr_marker_en = LimeCfg.p_c2_en; break; + case 3: curr_marker = LimeCfg.c3_tim; curr_marker_en = LimeCfg.p_c3_en; break; + default : break; + } + + // check if the channel is activated + if (curr_marker[0] == 0 || curr_marker_en[ii_pls] == 0) continue; + + // set trigger with bitset operation + for (int ll = 0; ll < num_phavar; ll++) { + buffoffs = 0; + for (int jj = 0; jj < exc_buffers; jj++) { // distribute 'long experiment' amongst buffers + for (int ii = 0; ii < 2*buffersize; ii++) { // set trigger point by point + if ((ii + buffoffs >= 2*pulseoffs + curr_marker[2] - curr_marker[1]) & (ii + buffoffs < 2*pulsedur + 2*pulseoffs + curr_marker[2] + curr_marker[3])) { + tx_buffer[ll][jj][ii] |= 1< 0) { + if ((ll % curr_synth[4]) == 0) synthstart += curr_synth[3]; + } + + for (int jj = 0; jj < exc_buffers; jj++) { // distribute 'long experiment' amongst buffers + for (int ii = 0; ii < 2*buffersize; ii++) { // set trigger point by point + // wrap the phase counter + wrapped_phase = int(int(ii + buffoffs + synthstart) % int(2 * curr_synth[1])); + + //wrapped_phase = 0; + //test = (wrapped_phase < curr_synth[1]); + if (wrapped_phase < curr_synth[1]) { + tx_buffer[ll][jj][ii] |= 1< rep_offset) { + cout << "Acquisition time of " << rec_len << " samples cannot be longer than repetition time (" << rep_offset << " Samples)" << endl; + error(); + } + + cout << "Repetition and acquisition times: " << rep_offset << " Sa (" << rep_offset/buffersize << " buffers), " << rec_len << " Sa (" << rec_len/buffersize << " buffers with " << buffersize << " Sa each)" << endl; + + + // Buffer for acqisition signal: integer datatype, so that we can have a sufficient number of averages of acquired 16 bit data into the 32 bit buffer + // for some reason, there are segfaults here when acqbuf_size becomes something on the order of 100 + int acqbuf_size = LimeCfg.repetitions * num_phavar; + //int acqbuf[acqbuf_size][2*rec_len]; // causes segfaults with large arrays... + + // init as non-contiguous memory (which will require writing as chunks to HDF5) + int * acqbuf[acqbuf_size]; + for (int ii = 0; ii < acqbuf_size; ++ii) + { + acqbuf[ii] = new int[2*rec_len]; + } + + // brute-force initialization by zero ( memset(acqbuf, 0, acqbuf_size*2*rec_len); ) did not work... + for (int ii = 0; ii lost_acqs = {}; + + + //Streaming + lms_stream_meta_t rx_metadata; //Use metadata for additional control over sample receive function behavior + rx_metadata.flushPartialPacket = false; //currently has no effect in RX + rx_metadata.waitForTimestamp = false; //currently has no effect in RX + + lms_stream_meta_t tx_metadata; //Use metadata for additional control over sample send function behavior + tx_metadata.flushPartialPacket = false; //do not force sending of incomplete packet + tx_metadata.waitForTimestamp = true; //Enable synchronization to HW timestamp + + lms_stream_status_t status; // To check the FIFO + + + // counters to keep track of the transmission FIFO + int TXFIFO_slots = N_buffers_per_fifo; + int ii_TXavg = 0; + int ii_TXpcyc = 0; + int ii_TXoffset = 0; + int ii_TXrep = 0; + int ii_sent = 0; + double init_delay_s = 10e-3; // delay in seconds until TX packets are forwarded from FPGA to the FPRF + long next_TXtimestamp = ceil( (init_delay_s * LimeCfg.srate) / (double) buffersize) * buffersize; + long last_TXtimestamp = 0; // this one stores the last timestamp of the beginning of a repetition + + // Timestamps to schedule the acquisition + long next_RXtimestamp = 0; + long last_RXtimestamp = 0; + + // Acquisition loop + auto t1 = chrono::high_resolution_clock::now(); + auto t2 = t1; + + int samplesRead; + int samplesReadSum = 0; + int rcvattempts = 0; + + int ii_rep = 0; // number of repetions + int ii_pcyc = 0; // number of phase cycle + int ii_avg = 0; // number of averages + int ii_acqd = 0; // number of complete acquisitions + int ii_acq = -1; // acquisition index (== ii_acqd if there is no packet loss) + int samples2Acquire = 0; // number of samples to acquire in current acquisition + int validSamples = 0; // number of valid samples in current datapacket + int * acqbuf_pos; // pointer to acqbuffer + int * delayedacqbuf_pos; // pointer to acqbuffer for delayed fwd + int reps_btw_stamps; // number of repetions between last valid timestamp + int16_t * mirbuf_pos; // pointer to mirror buffer + + + bool acquiring = false; // RX stream to acqbuffer? + bool acquire = true; // disable one single acquisition in acq loop + bool delayedAcqbufFwd = false; // to delay the forwarding of the acqbuffer + + int ndebug = 100; + + //Start streaming + for (int i = 0; i < chCount; ++i) + { + LMS_StartStream(&rx_streams[i]); + LMS_StartStream(&tx_streams[i]); + } + + // pre-fill the TX fifo + for (int ii_TXbuff = 0; ii_TXbuff < N_buffers_per_fifo; ii_TXbuff++) { + + // save the TX timestamp to the current packet + tx_metadata.timestamp = next_TXtimestamp; + + // First packet is special, since it is cut off in some weird way + if (ii_TXbuff == 0) { + LMS_SendStream(&tx_streams[0], tx_buffer_1st, buffersize, &tx_metadata, 1000); // so we put zeros + TXFIFO_slots--; + + // advance TX timestamp for the next packet + next_TXtimestamp += rep_offset; + + next_RXtimestamp = next_TXtimestamp; // ... and do not wait for it + last_TXtimestamp = next_TXtimestamp; + continue; // proceed the for loop with the first actual TX packet + } + + // Put data to FIFO + LMS_SendStream(&tx_streams[0], tx_buffer[ii_TXpcyc][ii_TXoffset], buffersize, &tx_metadata, 1000); + + // Update TX FIFO counters + TXFIFO_slots--; + ii_sent++; + + + // advance the tx_buffer counter + ii_TXoffset++; + next_TXtimestamp += buffersize; + if (ii_TXoffset == exc_buffers) { + ii_TXoffset = 0; + next_TXtimestamp = last_TXtimestamp + rep_offset; + last_TXtimestamp = next_TXtimestamp; + + if (LimeCfg.pcyc_bef_avg > 0) { + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXrep++; + // in case the entire experiment fits within the TX FIFO + if (ii_TXrep == LimeCfg.repetitions) break; + } + } + } else { + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXrep++; + // in case the entire experiment fits within the TX FIFO + if (ii_TXrep == LimeCfg.repetitions) break; + } + } + } + } else { + // if there is still data to be put on the buffer + } + } + + + // Check for the TX buffer and keep it filled + LMS_GetStreamStatus(tx_streams, &status); //Obtain TX stream stats + if (status.fifoFilledCount != 0) cout << TXFIFO_slots <<" TXFIFO slots free before start: " << status.fifoFilledCount << " samples of " << status.fifoSize << " with HW stamp " << status.timestamp <<" at RX timestamp" << rx_metadata.timestamp << endl; + + // Main acquisition loop + while (ii_acq < LimeCfg.repetitions * LimeCfg.averages * num_phavar) + { + + //Receive samples + if (acquire) { + samplesRead = LMS_RecvStream(&rx_streams[0], buffers[0], buffersize, &rx_metadata, 1000); + rcvattempts++; + samplesReadSum += samplesRead; + } + + if (ndebug < 100) { + cout << rx_metadata.timestamp << ", " << samplesReadSum << endl; + ndebug++; + LMS_GetStreamStatus(rx_streams, &status); //Obtain RX stream stats + cout << "Rx stream info: " << status.overrun << ", " << status.underrun << status.droppedPackets << ", " << status.overrun << ", actually " << status.fifoFilledCount << endl; + + } + + // check if the scheduled timestamp is coming here + //if (rx_metadata.timestamp >= next_RXtimestamp) { + if ((rx_metadata.timestamp >= next_RXtimestamp - samplesRead + 1) && acquire) { + + // first check out scheduling + timestampOffset = (signed long) next_RXtimestamp - (signed long) rx_metadata.timestamp; + + // normal case: scheduling as it should, where one reptime passed between the current and the last stamp + reps_btw_stamps = 1; + + // abnoral case: packet loss, i.e. more than one reptime passed since last stamp + if (timestampOffset < 0) { + reps_btw_stamps = ceil( -(double) timestampOffset / (double) rep_offset) + 1; + //cout << "Acq: rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << " : sched/act tstamp: " << next_RXtimestamp << ", " << rx_metadata.timestamp << " Diff to last: " << next_RXtimestamp - last_RXtimestamp << " Offset: " << timestampOffset << ", which corresponds to " << -(double) timestampOffset /(double) rep_offset << " repetitions, currently processing " << samplesRead << " RX samples with delayed fwd " << delayedAcqbufFwd << endl; + + // shift the timestamp scheduling correspondingly + timestampOffset += (reps_btw_stamps-1) * rep_offset; + next_RXtimestamp += (reps_btw_stamps-1) * rep_offset; + + // abort any ongoing acquisition, including delayed acquisition due to offsets + if (acquiring) { + cout << "Packet loss during rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << ", acq " << ii_acq << ", acqd " << ii_acqd << ": " << samples2Acquire << " Samples were not written and only the first few samples are non-corrupted with certainty. " << endl; + + // substract the content of the mirror_buf from the acqbuf, just to avoid that crap is being kept on the main buffer. + acqbuf_pos = acqbuf[ii_rep*num_phavar + ii_pcyc]; + for (int ii_acqbuf = 0; ii_acqbuf < 2*(rec_len - samples2Acquire); ii_acqbuf++) acqbuf_pos[ii_acqbuf] -= (int) mirror_buf[ii_acqbuf]; + + // store that this is lost + lost[ii_rep*num_phavar + ii_pcyc]++; + lost_acqs.push_back(ii_acq); + + //ii_acq++; // for an ongoing acquisition, we still need to increment the acquisition counter + // this is actually weird here. It seems that we land here sometimes with ii_acq already advanced + // and sometimes with ii_acq still needing to be incremented. + // in fact, when resuming, we are sometimes having ii_acq one before ii_avg, or aligned, as it should + // so we do lose one acq and are moreover shifting the entire indexing. However, if ii_acq is uncommented, + // there is a segfault from advancing ii_acq once too few, so that it is better to keep this one + // it is probably related to delayed acqbuf fwd. + // the cleanest would eventually be to make a new ii_acq counter that counts the memory location and is incremented together with the ii_pcyc counters, etc. The actual ii_acq that is incremented after having acquired data, could be named ii_acqd to count for the acquired data packets. + + } + acquiring = false; // this will be reset to true just below, which will cause those unwritten samples + delayedAcqbufFwd = false; // ... and make sure that these unwritten samples do not go anywhere to the buffer + + } + + // Advance counters to new position + for (int ii = 0; ii < reps_btw_stamps; ii++) { + + // except at the very first acquisition, where the counters are already at the right position + //if (ii_acq == 0 & ii == 0) break; + + // book keep any of the lost acquisitions + if (ii > 0) { + lost[ii_rep*num_phavar + ii_pcyc]++; + lost_acqs.push_back(ii_acq); + } + + ii_acq++; + + // except at the very first acquisition, where the counters are already at the right position + if (ii_acq == 0) break; + + // advance counters + if (LimeCfg.pcyc_bef_avg > 0) { + ii_pcyc++; + if (ii_pcyc == num_phavar) { + ii_pcyc = 0; + ii_avg++; + if (ii_avg == LimeCfg.averages) { + ii_avg = 0; + ii_rep++; + } + } + } else { + ii_avg++; + if (ii_avg == LimeCfg.averages) { + ii_avg = 0; + ii_pcyc++; + if (ii_pcyc == num_phavar) { + ii_pcyc = 0; + ii_rep++; + } + } + } + + } + + + // additional reporting in case of packet loss + if (reps_btw_stamps > 1) { + + cout << " Resuming acq at rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << ", acq " << ii_acq << ": " << "Skipped " << reps_btw_stamps - 1 << " acquisitions to restore a timestamp offset of " << timestampOffset << endl; + } + + + // Advance acqbuf in case that there is not an ongoing acquisition (just in the case of gap-free acquisition, that has usually a timestamp offset) + if (acquiring == false) { + acqbuf_pos = acqbuf[ii_rep*num_phavar + ii_pcyc]; + samples2Acquire = rec_len; + } else { + delayedacqbuf_pos = acqbuf[ii_rep*num_phavar + ii_pcyc]; + delayedAcqbufFwd = true; + } + acquiring = true; + + //cout << "Now at rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << ", acq " << ii_acq << ", acqd " << ii_acqd << "."<< endl; + + + // Warn in case of packet loss + // Important: We exclude here packet loss at the very beginning of the RX stream. This is actually rather normal and the reason for the offset in the RX buffer + LMS_GetStreamStatus(rx_streams, &status); //Obtain RX stream stats + if ((status.droppedPackets > 0 | status.overrun > 0 | status.underrun > 0) & ii_acq > 0) { + cout << "Rx stream trouble! Status (overrun, underrun, dropped Packets): " << status.overrun << ", " << status.underrun << ", " << status.droppedPackets << ". Currently " << status.fifoFilledCount << " samples in RX stream buffer (" << 100.0 * ((float) status.fifoFilledCount)/( (float) status.fifoSize ) << "%)" << endl; + //cout << "Next acq: rep " << ii_rep << ", avg " << ii_avg << ", pcyc " << ii_pcyc << " : sched/act tstamp: " << next_RXtimestamp << ", " << rx_metadata.timestamp << " Diff to last: " << next_RXtimestamp - last_RXtimestamp << " Offset: " << timestampOffset << " currently processing " << samplesRead << " RX samples with delayed fwd " << delayedAcqbufFwd << endl; + } + + + // advance to the forthcoming RX timestamp and keep the current one + next_RXtimestamp += rep_offset; + last_RXtimestamp = rx_metadata.timestamp; + } + acquire = true; + + // Do not enter into acquiring for the case that the experiment is at its end + if (ii_rep == LimeCfg.repetitions & delayedAcqbufFwd == false) break; + + // copy RX data into acquisition buffer + if (acquiring) { + + // standard case: copy everything, without offset + bufferOffset = 0; + validSamples = buffersize; + + // first packet: consider eventual timestamp offset + if (samples2Acquire == rec_len) { + bufferOffset = timestampOffset; + validSamples = buffersize - bufferOffset; + + mirbuf_pos = mirror_buf; + // last packet with timestamp offset: just get the tail without offset + } else if (samples2Acquire < buffersize) { + validSamples = samples2Acquire; + } + + for (int ii_acqbuf = 0; ii_acqbuf < 2*(validSamples); ii_acqbuf++) acqbuf_pos[ii_acqbuf] += (int) buffers[0][ii_acqbuf + 2* bufferOffset]; + samples2Acquire -= validSamples; + + // memcopy mirrorbuf + memcpy(mirbuf_pos, acqbuf_pos, 2*validSamples * sizeof(int16_t)); + + // advance position in acquisition buffer + acqbuf_pos += 2*validSamples; + mirbuf_pos += 2*validSamples; + + if (samples2Acquire == 0) { + ii_acqd++; + + + // check for continuous RX with timestamp offset, where we would actually still have valid samples to copy in the buffer + if (delayedAcqbufFwd) { + // put pointer to right place + acqbuf_pos = delayedacqbuf_pos; + samples2Acquire = rec_len; + + delayedAcqbufFwd = false; + // important: rerun this entire block without getting a new data or forwarding the timestamp packet. + // We still need to copy the part beyond the validsamples to the next acqbuf position + acquire = false; + } else { + // standard case: signal that the acquisition is finished and wait for the next scheduled timestamp + acquiring = false; + } + } + } + + // Check for the TX buffer and keep it filled + if (ii_TXrep < LimeCfg.repetitions) { + LMS_GetStreamStatus(tx_streams, &status); //Obtain TX stream stats + TXFIFO_slots = (status.fifoSize - status.fifoFilledCount)/buffersize; + } + + /* + // debug + if (TXFIFO_slots > 0) cout << TXFIFO_slots << " free fifo slots to fill" << endl; + */ + + // re-fill the TX fifo + while (TXFIFO_slots > 0) { + + // save the TX timestamp to the current packet + tx_metadata.timestamp = next_TXtimestamp; + + // Put data to FIFO + LMS_SendStream(&tx_streams[0], tx_buffer[ii_TXpcyc][ii_TXoffset], buffersize, &tx_metadata, 1000); + + // Update TX counters + TXFIFO_slots--; + ii_sent++; + + // advance the tx_buffer counter + ii_TXoffset++; + next_TXtimestamp += buffersize; + if (ii_TXoffset == exc_buffers) { + ii_TXoffset = 0; + next_TXtimestamp = last_TXtimestamp + rep_offset; + last_TXtimestamp = next_TXtimestamp; + + if (LimeCfg.pcyc_bef_avg > 0) { + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXrep++; + // in case the experiment is finished + if (ii_TXrep == LimeCfg.repetitions) + TXFIFO_slots = 0; + } + } + } else { + ii_TXavg++; + if (ii_TXavg == LimeCfg.averages) { + ii_TXavg = 0; + ii_TXpcyc++; + if (ii_TXpcyc == num_phavar) { + ii_TXpcyc = 0; + ii_TXrep++; + // in case the experiment is finished + if (ii_TXrep == LimeCfg.repetitions) + TXFIFO_slots = 0; + } + } + } + } + } +} + +//Stop streaming +for (int i = 0; i < chCount; ++i) +{ + LMS_StopStream(&rx_streams[i]); //stream is stopped but can be started again with LMS_StartStream() + LMS_StopStream(&tx_streams[i]); +} +for (int i = 0; i < chCount; ++i) +{ + LMS_DestroyStream(device, &rx_streams[i]); //stream is deallocated and can no longer be used + LMS_DestroyStream(device, &tx_streams[i]); + delete[] buffers[i]; +} + +delete mirror_buf; + +cout << "Lost acquisitions: "; +for (int ii = 0; ii < acqbuf_size; ii++) { + cout << lost[ii] << ", "; +} +cout << endl; + +// Iterate and print values of the list +for (int n : lost_acqs) { + std::cout << n << '\n'; +} + +//------------------------------------------------------------------------------------- +// SAVE TO HDF5 +//------------------------------------------------------------------------------------- + +if (LimeCfg.override_save == 0) { + + // Open HDF5 file + string filename; + // check for save_path delimiter + if (LimeCfg.save_path.back() == '/') + filename = LimeCfg.save_path + LimeCfg.file_stamp + "_" + LimeCfg.file_pattern + ".h5"; + else + filename = LimeCfg.save_path + '/' + LimeCfg.file_stamp + "_" + LimeCfg.file_pattern + ".h5"; + cout << filename << endl; + H5::H5File* h5f; + + // create or open + if (file_exists(filename)) h5f = new H5::H5File( filename, H5F_ACC_RDWR ); + else h5f = new H5::H5File( filename, H5F_ACC_EXCL ); + + // Check for the number of datasets already in there (only >0 if an external file_stamp is provided or if the program is called more than once within a second..) + hsize_t num_obj = 0; + H5Gget_num_objs(h5f->getId(), &num_obj); // if success, num_obj will be assigned the number of objects in the group + + // write dataset to HDF5 file + // 1. specify datatype and dimensions and dataset name + H5::DataType saveDataType( H5::PredType::NATIVE_INT); + hsize_t saveDataDim[] = { (hsize_t) acqbuf_size, (hsize_t) 2*rec_len}; + string DataName = "Acqbuf_"; + std::ostringstream oss; + oss << setfill('0') << setw(2) << num_obj; + DataName += oss.str(); + + H5std_string saveDataName(DataName.c_str()); + + // 2. allocate dataspace and init + // set parameters to have a chunked file, so that each acquired trace is one chunk + H5::DSetCreatPropList cparms; + hsize_t chunk_dims[2] = {1, saveDataDim[1]}; + cparms.setChunk(2, chunk_dims); + + int fill_val = 0; + cparms.setFillValue (H5::PredType::NATIVE_INT , &fill_val); + + H5::DataSpace mspace1( 2, saveDataDim ); + H5::DataSet dataset = h5f->createDataSet(saveDataName, saveDataType, mspace1, cparms); + + // write with standard procedure + //dataset.write( acqbuf, saveDataType); // requires contiguous memory of the entire acqbuf, which does not work for large buffers + // write row-wise + H5::DataSpace fspace_row = dataset.getSpace(); + hsize_t offset[2] = {0, 0}; + hsize_t dims_row[2] = {1, saveDataDim[1]}; + H5::DataSpace mspace_row( 1, &saveDataDim[1] ); // contiguous memory space of data to write + for (int ii = 0; ii < acqbuf_size; ii++) { + fspace_row.selectHyperslab( H5S_SELECT_SET, dims_row, offset); + dataset.write( acqbuf[ii], saveDataType, mspace_row, fspace_row); + offset[0] += 1; // advance to next row + } + + // get the timestamp at the end of the experiment ... + now = std::chrono::system_clock::now(); + itt = std::chrono::system_clock::to_time_t(now); + stringstream.str(""); + stringstream.clear(); + stringstream << std::put_time(localtime(&itt), "%G%m%d_%H%M%S"); + + // ... and write it to the appropriate index + for (int ii_attr = 0; ii_attr < no_of_attr; ii_attr++) { + if (strcmp("Exp End Timestamp", HDFattr[ii_attr].Name.c_str()) == 0) { + LimeCfg.stamp_end = stringstream.str(); + HDFattr[ii_attr].dType = H5::StrType(H5::PredType::C_S1, LimeCfg.stamp_end.length()+1); + HDFattr[ii_attr].Value = (void *) LimeCfg.stamp_end.c_str(); + } + } + + // write the attributes + for (int ii = 0; ii < no_of_attr; ii++) { + + H5::DataSpace* tmpSpace = new H5::DataSpace(); + // special case: arrays + if (HDFattr[ii].dim > 1) { + delete tmpSpace; + H5::DataSpace* tmpSpace = new H5::DataSpace(1, &HDFattr[ii].dim); + } + H5std_string concat("-" + HDFattr[ii].arg + " " + HDFattr[ii].Name); + //H5::Attribute attribute = h5f->createAttribute(concat, HDFattr[ii].dType, *tmpSpace); // write the attribute to the file + H5::Attribute attribute = dataset.createAttribute(concat, HDFattr[ii].dType, *tmpSpace); // write the attribute to the dataset + attribute.write(HDFattr[ii].dType, HDFattr[ii].Value); + delete tmpSpace; + } + + // special attribute for N pulses: the phase table, which is certainly of use in evaluation + hsize_t phatab_len = LimeCfg.Npulses*num_phavar; + H5::DataSpace* tmpSpace = new H5::DataSpace(1, &phatab_len); + H5std_string concat("-/// Phase Table"); + H5::Attribute attribute = dataset.createAttribute(concat, H5::PredType::IEEE_F64LE, *tmpSpace); // write the attribute to the dataset + attribute.write( H5::PredType::IEEE_F64LE, &pha_tab); + delete tmpSpace; + + // close file + h5f->close(); + delete h5f; + + cout << "Written to HDFfile as " << saveDataDim[0] << " by "<< saveDataDim[1] << " array" << endl; + +} + +//Close device +LMS_Close(device); + +return 0; +} + + +