Refactored LimeConfig_t initalization.

This commit is contained in:
jupfi 2024-02-05 16:47:49 +01:00
parent d8fae232db
commit bde76f6b68

View file

@ -314,70 +314,63 @@ void dumpConfig(Config2HDFattr_t *config, size_t size) {
std::cout << "}" << std::endl; std::cout << "}" << std::endl;
} }
int main(int argc, char **argv) { void initializeLimeConfig(LimeConfig_t *LimeCfg, int Npulses, std::ostringstream &stringstream) {
const double pi = acos(-1); /* Initialize the LimeConfig_t struct
LimeConfig_t LimeCfg; @param LimeCfg: Pointer to LimeConfig_t struct
LimeCfg.Npulses = 2; // Number of pulses, default value */
// check if nPulses has been given as argument, so that all the arrays are LimeCfg->Npulses = Npulses;
// 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
// set all the DEFAULT parameters. Command line arguments allow for
// modification! // 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 = 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) -32; // DC corr to TX mixer at IF (evaluate with LimeSuiteGUI)
LimeCfg.TX_QcorrDC = 50; // DC corr to TX mixer at IF LimeCfg->TX_QcorrDC = 50; // DC corr to TX mixer at IF
// Allocate the arrays with pulse parametes // Allocate the arrays with pulse parametes
LimeCfg.p_dur = new double[LimeCfg.Npulses]; // pulse duration (secs) LimeCfg->p_dur = new double[LimeCfg->Npulses]; // pulse duration (secs)
LimeCfg.p_offs = new int[LimeCfg.Npulses]; // pulse time offset LimeCfg->p_offs = new int[LimeCfg->Npulses]; // pulse time offset
LimeCfg.p_amp = new double[LimeCfg.Npulses]; // pulse digital IF amplitude LimeCfg->p_amp = new double[LimeCfg->Npulses]; // pulse digital IF amplitude
LimeCfg.p_frq = LimeCfg->p_frq =
new double[LimeCfg.Npulses]; // pulse digital IF frequency (unit: Hz) new double[LimeCfg->Npulses]; // pulse digital IF frequency (unit: Hz)
LimeCfg.p_pha = new double[LimeCfg.Npulses]; // pulse digital IF phase LimeCfg->p_pha = new double[LimeCfg->Npulses]; // pulse digital IF phase
LimeCfg.p_phacyc_N = LimeCfg->p_phacyc_N =
new int[LimeCfg.Npulses]; // number of pulse phases (cycled within 2*pi, new int[LimeCfg->Npulses]; // number of pulse phases (cycled within 2*pi,
// must be at least 1) // must be at least 1)
LimeCfg.p_phacyc_lev = LimeCfg->p_phacyc_lev =
new int[LimeCfg.Npulses]; // stacking level of phase cycle (for eventual new int[LimeCfg->Npulses]; // stacking level of phase cycle (for eventual
// coupling) // coupling)
LimeCfg.p_c0_en = new int[LimeCfg.Npulses]; // pulse-wise enable of marker c0 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_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_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->p_c3_en = new int[LimeCfg->Npulses]; // pulse-wise enable of marker c3
// and set standard values // and set standard values
for (int ii = 0; ii < LimeCfg.Npulses; ii++) { for (int ii = 0; ii < LimeCfg->Npulses; ii++) {
LimeCfg.p_dur[ii] = 2e-6; LimeCfg->p_dur[ii] = 2e-6;
LimeCfg.p_offs[ii] = LimeCfg->p_offs[ii] =
(4080 * 3) / (4080 * 3) /
(LimeCfg.Npulses + 1); // distribute them evenly within the buffer... (LimeCfg->Npulses + 1); // distribute them evenly within the buffer...
LimeCfg.p_amp[ii] = 1.0; LimeCfg->p_amp[ii] = 1.0;
LimeCfg.p_frq[ii] = 4.0 / LimeCfg.p_dur[0]; LimeCfg->p_frq[ii] = 4.0 / LimeCfg->p_dur[0];
LimeCfg.p_pha[ii] = 0.0; LimeCfg->p_pha[ii] = 0.0;
LimeCfg.p_phacyc_N[ii] = 1; LimeCfg->p_phacyc_N[ii] = 1;
LimeCfg.p_phacyc_lev[ii] = 0; LimeCfg->p_phacyc_lev[ii] = 0;
LimeCfg.p_c0_en[ii] = 1; LimeCfg->p_c0_en[ii] = 1;
LimeCfg.p_c1_en[ii] = 1; LimeCfg->p_c1_en[ii] = 1;
LimeCfg.p_c2_en[ii] = 1; LimeCfg->p_c2_en[ii] = 1;
LimeCfg.p_c3_en[ii] = 1; LimeCfg->p_c3_en[ii] = 1;
} }
// Timing of TTL controls: [enabled? , pre, offs, post] // Timing of TTL controls: [enabled? , pre, offs, post]
@ -393,43 +386,64 @@ int main(int argc, char **argv) {
int c2_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}; int c3_synth[5] = {0, 500, 0, 0, 0};
LimeCfg.averages = 6; // number of averages LimeCfg->averages = 6; // number of averages
LimeCfg.repetitions = 4; // number of repetions LimeCfg->repetitions = 4; // number of repetions
LimeCfg.reptime_secs = 4e-3; // repetition time LimeCfg->reptime_secs = 4e-3; // repetition time
LimeCfg.rectime_secs = 0.2e-3; // duration of acquisition window LimeCfg->rectime_secs = 0.2e-3; // duration of acquisition window
LimeCfg.buffersize = 4080 * 3; // number of samples in buffer LimeCfg->buffersize = 4080 * 3; // number of samples in buffer
LimeCfg.pcyc_bef_avg = 0; // phase cycle before average LimeCfg->pcyc_bef_avg = 0; // phase cycle before average
LimeCfg.file_pattern = "test"; // identifier when saving the file LimeCfg->file_pattern = "test"; // identifier when saving the file
LimeCfg.save_path = "./data/"; // path to save the file to LimeCfg->save_path = "./data/"; // path to save the file to
LimeCfg.override_save = 0; // default: save data LimeCfg->override_save = 0; // default: save data
// that's it for the parameters // that's it for the parameters
// ---------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------
// .. copy here those arrays ... // .. copy here those arrays ...
memcpy(LimeCfg.c0_tim, c0_tim, 4 * sizeof *LimeCfg.c0_tim); memcpy(LimeCfg->c0_tim, c0_tim, 4 * sizeof *LimeCfg->c0_tim);
memcpy(LimeCfg.c1_tim, c1_tim, 4 * sizeof *LimeCfg.c1_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->c2_tim, c2_tim, 4 * sizeof *LimeCfg->c2_tim);
memcpy(LimeCfg.c3_tim, c3_tim, 4 * sizeof *LimeCfg.c3_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->c0_synth, c0_synth, 5 * sizeof *LimeCfg->c0_synth);
memcpy(LimeCfg.c1_synth, c1_synth, 5 * sizeof *LimeCfg.c1_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->c2_synth, c2_synth, 5 * sizeof *LimeCfg->c2_synth);
memcpy(LimeCfg.c3_synth, c3_synth, 5 * sizeof *LimeCfg.c3_synth); memcpy(LimeCfg->c3_synth, c3_synth, 5 * sizeof *LimeCfg->c3_synth);
// and add the timestamp for the file // and add the timestamp for the file
auto now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
auto itt = std::chrono::system_clock::to_time_t(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"); stringstream << std::put_time(localtime(&itt), "%G%m%d_%H%M%S");
LimeCfg.file_stamp = stringstream.str(); LimeCfg->file_stamp = stringstream.str();
LimeCfg.stamp_start = stringstream.str(); LimeCfg->stamp_start = stringstream.str();
LimeCfg.stamp_end = LimeCfg->stamp_end =
stringstream.str(); // will be overwritten just before data is written stringstream.str(); // will be overwritten just before data is written
// allocate other variables that depend on Npulses // allocate other variables that depend on Npulses
LimeCfg.p_dur_smp = new int[LimeCfg.Npulses]; LimeCfg->p_dur_smp = new int[LimeCfg->Npulses];
LimeCfg.p_frq_smp = new double[LimeCfg.Npulses]; LimeCfg->p_frq_smp = new double[LimeCfg->Npulses];
}
int main(int argc, char **argv) {
const double pi = acos(-1);
LimeConfig_t LimeCfg;
std::ostringstream stringstream;
int Npulses = 2; // default number of pulses
// 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) {
Npulses = atoi(argv[ii_arg + 1]);
break;
}
}
// Initialize the LimeConfig_t struct
initializeLimeConfig(&LimeCfg, Npulses, stringstream);
// LimeCfg as attributes for writing to HDF and for parsing command line input // 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 // This is all done 'manually', since there is no reflection in cpp.. at least
@ -1864,8 +1878,8 @@ int main(int argc, char **argv) {
} }
// get the timestamp at the end of the experiment ... // get the timestamp at the end of the experiment ...
now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
itt = std::chrono::system_clock::to_time_t(now); auto itt = std::chrono::system_clock::to_time_t(now);
stringstream.str(""); stringstream.str("");
stringstream.clear(); stringstream.clear();
stringstream << std::put_time(localtime(&itt), "%G%m%d_%H%M%S"); stringstream << std::put_time(localtime(&itt), "%G%m%d_%H%M%S");