diff --git a/README.md b/README.md index be1ba3a..f164a0b 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ You can find more information about the installation of dependencies in the [Lim Additional dependencies should be installed by the pyproject.toml file when installing this module. -## Setup +### Setup To install the module you need the NQRduck core. You can find the installation instructions for the NQRduck core [here](https://github.com/nqrduck/nqrduck). Ideally you should install the module in a virtual environment. You can create a virtual environment by running the following command in the terminal: diff --git a/src/nqrduck_spectrometer_limenqr/model.py b/src/nqrduck_spectrometer_limenqr/model.py index ae1d991..efd2bbb 100644 --- a/src/nqrduck_spectrometer_limenqr/model.py +++ b/src/nqrduck_spectrometer_limenqr/model.py @@ -1,6 +1,7 @@ import logging from nqrduck_spectrometer.base_spectrometer_model import BaseSpectrometerModel from nqrduck_spectrometer.pulseparameters import TXPulse, RXReadout +from nqrduck_spectrometer.settings import FloatSetting, IntSetting, BooleanSetting, SelectionSetting logger = logging.getLogger(__name__) @@ -52,37 +53,91 @@ class LimeNQRModel(BaseSpectrometerModel): def __init__(self, module) -> None: super().__init__(module) # Acquisition settings - self.add_setting(self.CHANNEL, 0, "TX/RX Channel", self.ACQUISITION) - self.add_setting(self.TX_MATCHING, 0, "TX Matching", self.ACQUISITION) - self.add_setting(self.RX_MATCHING, 0, "RX Matching", self.ACQUISITION) - self.add_setting(self.SAMPLING_FREQUENCY, 30.72e6 , "Sampling frequency", self.ACQUISITION) - self.add_setting(self.IF_FREQUENCY, 5e6, "IF Frequency", self.ACQUISITION) - self.if_frequency = 1.2e6 - self.add_setting(self.ACQUISITION_TIME, 82e-6, "Acquisition time - this is from the beginning of the pulse sequence", self.ACQUISITION) + channel_options = ["1", "2"] + channel_setting = SelectionSetting(self.CHANNEL, channel_options, "1", "TX/RX Channel") + self.add_setting(channel_setting, self.ACQUISITION) + + tx_matching_options = ["1", "2"] + tx_matching_setting = SelectionSetting(self.TX_MATCHING, tx_matching_options, "1", "TX Matching") + self.add_setting(tx_matching_setting, self.ACQUISITION) + + rx_matching_options = ["1", "2"] + rx_matching_setting = SelectionSetting(self.RX_MATCHING, rx_matching_options, "1", "RX Matching") + self.add_setting(rx_matching_setting, self.ACQUISITION) + + sampling_frequency_setting = FloatSetting(self.SAMPLING_FREQUENCY, 30.72e6, "Sampling frequency") + self.add_setting(sampling_frequency_setting, self.ACQUISITION) + + if_frequency_setting = FloatSetting(self.IF_FREQUENCY, 5e6, "IF Frequency") + self.add_setting(if_frequency_setting, self.ACQUISITION) + self.if_frequency = 5e6 + + acquisition_time_setting = FloatSetting(self.ACQUISITION_TIME, 82e-6, "Acquisition time - this is from the beginning of the pulse sequence") + self.add_setting(acquisition_time_setting, self.ACQUISITION) + # Gate Settings - self.add_setting(self.GATE_ENABLE, True, "Enable", self.GATE_SETTINGS) - self.add_setting(self.GATE_PADDING_LEFT, 10, "Gate padding left", self.GATE_SETTINGS) - self.add_setting(self.GATE_PADDING_RIGHT, 10, "Gate padding right", self.GATE_SETTINGS) - self.add_setting(self.GATE_SHIFT, 53, "Gate shift", self.GATE_SETTINGS) + gate_enable_setting = BooleanSetting(self.GATE_ENABLE, True, "Enable") + self.add_setting(gate_enable_setting, self.GATE_SETTINGS) + + gate_padding_left_setting = IntSetting(self.GATE_PADDING_LEFT, 10, "Gate padding left") + self.add_setting(gate_padding_left_setting, self.GATE_SETTINGS) + + gate_padding_right_setting = IntSetting(self.GATE_PADDING_RIGHT, 10, "Gate padding right") + self.add_setting(gate_padding_right_setting, self.GATE_SETTINGS) + + gate_shift_setting = IntSetting(self.GATE_SHIFT, 53, "Gate shift") + self.add_setting(gate_shift_setting, self.GATE_SETTINGS) + # RX/TX settings - self.add_setting(self.RX_GAIN, 55, "RX Gain", self.RX_TX_SETTINGS) - self.add_setting(self.TX_GAIN, 30, "TX Gain", self.RX_TX_SETTINGS) - self.add_setting(self.RX_LPF_BW, 30.72e6/2, "RX LPF BW", self.RX_TX_SETTINGS) - self.add_setting(self.TX_LPF_BW, 130.0e6, "TX LPF BW", self.RX_TX_SETTINGS) + rx_gain_setting = IntSetting(self.RX_GAIN, 55, "RX Gain") + self.add_setting(rx_gain_setting, self.RX_TX_SETTINGS) + + tx_gain_setting = IntSetting(self.TX_GAIN, 30, "TX Gain") + self.add_setting(tx_gain_setting, self.RX_TX_SETTINGS) + + rx_lpf_bw_setting = FloatSetting(self.RX_LPF_BW, 30.72e6/2, "RX LPF BW") + self.add_setting(rx_lpf_bw_setting, self.RX_TX_SETTINGS) + + tx_lpf_bw_setting = FloatSetting(self.TX_LPF_BW, 130.0e6, "TX LPF BW") + self.add_setting(tx_lpf_bw_setting, self.RX_TX_SETTINGS) + # Calibration settings - self.add_setting(self.TX_I_DC_CORRECTION, -45, "TX I DC correction", self.CALIBRATION) - self.add_setting(self.TX_Q_DC_CORRECTION, 0, "TX Q DC correction", self.CALIBRATION) - self.add_setting(self.TX_I_GAIN_CORRECTION, 2047, "TX I Gain correction", self.CALIBRATION) - self.add_setting(self.TX_Q_GAIN_CORRECTION, 2039, "TX Q Gain correction", self.CALIBRATION) - self.add_setting(self.TX_PHASE_ADJUSTMENT, 3, "TX phase adjustment", self.CALIBRATION) - self.add_setting(self.RX_I_DC_CORRECTION, 0, "RX I DC correction", self.CALIBRATION) - self.add_setting(self.RX_Q_DC_CORRECTION, 0, "RX Q DC correction", self.CALIBRATION) - self.add_setting(self.RX_I_GAIN_CORRECTION, 2047, "RX I Gain correction", self.CALIBRATION) - self.add_setting(self.RX_Q_DC_CORRECTION, 2047, "TX Q Gain correction", self.CALIBRATION) - self.add_setting(self.RX_PHASE_ADJUSTMENT, 0, "TX phase adjustment", self.CALIBRATION) + tx_i_dc_correction_setting = IntSetting(self.TX_I_DC_CORRECTION, -45, "TX I DC correction") + self.add_setting(tx_i_dc_correction_setting, self.CALIBRATION) + + tx_q_dc_correction_setting = IntSetting(self.TX_Q_DC_CORRECTION, 0, "TX Q DC correction") + self.add_setting(tx_q_dc_correction_setting, self.CALIBRATION) + + tx_i_gain_correction_setting = IntSetting(self.TX_I_GAIN_CORRECTION, 2047, "TX I Gain correction") + self.add_setting(tx_i_gain_correction_setting, self.CALIBRATION) + + tx_q_gain_correction_setting = IntSetting(self.TX_Q_GAIN_CORRECTION, 2039, "TX Q Gain correction") + self.add_setting(tx_q_gain_correction_setting, self.CALIBRATION) + + tx_phase_adjustment_setting = IntSetting(self.TX_PHASE_ADJUSTMENT, 3, "TX phase adjustment") + self.add_setting(tx_phase_adjustment_setting, self.CALIBRATION) + + rx_i_dc_correction_setting = IntSetting(self.RX_I_DC_CORRECTION, 0, "RX I DC correction") + self.add_setting(rx_i_dc_correction_setting, self.CALIBRATION) + + rx_q_dc_correction_setting = IntSetting(self.RX_Q_DC_CORRECTION, 0, "RX Q DC correction") + self.add_setting(rx_q_dc_correction_setting, self.CALIBRATION) + + rx_i_gain_correction_setting = IntSetting(self.RX_I_GAIN_CORRECTION, 2047, "RX I Gain correction") + self.add_setting(rx_i_gain_correction_setting, self.CALIBRATION) + + rx_q_gain_correction_setting = IntSetting(self.RX_Q_GAIN_CORRECTION, 2047, "RX Q Gain correction") + self.add_setting(rx_q_gain_correction_setting, self.CALIBRATION) + + rx_phase_adjustment_setting = IntSetting(self.RX_PHASE_ADJUSTMENT, 0, "RX phase adjustment") + self.add_setting(rx_phase_adjustment_setting, self.CALIBRATION) + # Signal Processing settings - self.add_setting(self.RX_OFFSET, 2.4e-6, "The offset of the RX event, this changes all the time", self.SIGNAL_PROCESSING) - self.add_setting(self.FFT_SHIFT, False, "FFT shift", self.SIGNAL_PROCESSING) + rx_offset_setting = FloatSetting(self.RX_OFFSET, 2.4e-6, "The offset of the RX event, this changes all the time") + self.add_setting(rx_offset_setting, self.SIGNAL_PROCESSING) + + fft_shift_setting = BooleanSetting(self.FFT_SHIFT, False, "FFT shift") + self.add_setting(fft_shift_setting, self.SIGNAL_PROCESSING) # Pulse parameter options self.add_pulse_parameter_option(self.TX, TXPulse)