nqrduck-broadband/src/nqrduck_broadband/controller.py
2023-12-07 15:58:30 +01:00

143 lines
No EOL
6 KiB
Python

import logging
import numpy as np
from PyQt6.QtCore import pyqtSlot, pyqtSignal, QThread
from PyQt6.QtWidgets import QApplication
from nqrduck_spectrometer.measurement import Measurement
from nqrduck.module.module_controller import ModuleController
logger = logging.getLogger(__name__)
class BroadbandController(ModuleController):
start_broadband_measurement = pyqtSignal()
set_averages_failure = pyqtSignal()
set_frequency_step_failure = pyqtSignal()
def __init__(self, module):
super().__init__(module)
@pyqtSlot(str, object)
def process_signals(self, key: str, value: object) -> None:
"""Process incoming signal from the nqrduck module.
Args:
key (str): Name of the signal.
value (object): Value of the signal.
"""
if key == "measurement_data" and self.module.model.current_broadband_measurement is not None:
logger.debug("Received single measurement.")
self.module.model.current_broadband_measurement.add_measurement(value)
elif key == "failure_set_averages" and value == self.module.view._ui_form.averagesEdit.text():
logger.debug("Received set averages failure.")
self.set_averages_failure.emit()
# receive LUT data
elif key == "LUT_finished":
logger.debug("Received LUT data.")
self.module.model.LUT = value
self.change_start_frequency(self.module.model.LUT.start_frequency)
self.change_stop_frequency(self.module.model.LUT.stop_frequency)
self.change_frequency_step(self.module.model.LUT.frequency_step)
@pyqtSlot(str)
def set_frequency(self, value : str) -> None:
""" Emits the set frequency signal to the nqrduck module.
Args:
value (str): Frequency in MHz.
"""
try:
logger.debug("Setting frequency to: " + float(value))
self.module.nqrduck_signal.emit("set_frequency", value)
except ValueError:
self.set_averages_failure.emit()
self.set_frequency_step_failure.emit()
@pyqtSlot(str)
def set_averages(self, value : str) -> None:
"""Emits the set averages signal to the nqrduck module.
Args:
value (str): Number of averages.
"""
logger.debug("Setting averages to: " + value)
self.module.nqrduck_signal.emit("set_averages", value)
@pyqtSlot(str)
def change_start_frequency(self, value : str) -> None:
"""Changes the start frequency of the measurement."""
value = float(value)
if value > self.module.model.MIN_FREQUENCY:
self.module.model.start_frequency = value * 1e6
else:
self.module.model.start_frequency = self.module.model.MIN_FREQUENCY
@pyqtSlot(str)
def change_stop_frequency(self, value:str) -> None:
"""Changes the stop frequency of the measurement."""
value = float(value)
if value < self.module.model.MAX_FREQUENCY:
self.module._model.stop_frequency = value * 1e6
else:
self.module._model.stop_frequency = self.module.model.MAX_FREQUENCY
@pyqtSlot(str)
def change_frequency_step(self, value :str) -> None:
"""Changes the frequency step of the measurement."""
try:
value = float(value) * 1e6
if value > 0:
self.module.model.frequency_step = value
except ValueError:
logger.debug("Invalid frequency step value")
@pyqtSlot()
def start_broadband_measurement(self) -> None:
"""Starts a broadband measurement."""
logger.debug("Start measurement clicked")
# Create a list of different frequency values that we need for our broadband measurement
start_frequency = self.module.model.start_frequency
stop_frequency = self.module.model.stop_frequency
frequency_step = self.module.model.frequency_step
frequency_list = np.arange(start_frequency, stop_frequency + frequency_step, frequency_step)
logger.debug("Frequency list: " + str(frequency_list))
# Create a new broadband measurement object
self.module.model.current_broadband_measurement = self.module.model.BroadbandMeasurement(frequency_list, self.module.model.frequency_step)
self.module.model.current_broadband_measurement.received_measurement.connect(self.module.view.on_broadband_measurement_added)
self.module.model.current_broadband_measurement.received_measurement.connect(self.on_broadband_measurement_added)
self.module.view.add_info_text("Starting broadband measurement.")
# Start the first measurement
self.start_single_measurement(start_frequency)
@pyqtSlot()
def on_broadband_measurement_added(self) -> None:
"""This slot is called when a single measurement is added to the broadband measurement.
It then checks if there are more frequencies to measure and if so, starts the next measurement.
Furthermore it updates the plots.
"""
logger.debug("Broadband measurement added.")
# Check if there are more frequencies to measure
if not self.module.model.current_broadband_measurement.is_complete():
# Get the next frequency to measure
next_frequency = self.module.model.current_broadband_measurement.get_next_measurement_frequency()
logger.debug("Next frequency: " + str(next_frequency))
self.start_single_measurement(next_frequency)
else:
self.module.view.add_info_text("Broadband measurement finished.")
def start_single_measurement(self, frequency : float) -> None:
"""Starts a single measurement.
Args:
frequency (float): Frequency in MHz.
"""
logger.debug("Starting single measurement.")
self.module.view.add_info_text("Starting measurement at frequency: " + str(frequency))
self.module.nqrduck_signal.emit("set_frequency", str(frequency))
self.module.nqrduck_signal.emit("start_measurement", None)