91 lines
No EOL
4 KiB
Python
91 lines
No EOL
4 KiB
Python
import logging
|
|
import json
|
|
import decimal
|
|
from PyQt6.QtCore import pyqtSlot
|
|
from nqrduck.helpers.serializer import DecimalEncoder
|
|
from nqrduck.module.module_controller import ModuleController
|
|
from nqrduck_spectrometer.pulsesequence import PulseSequence
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class PulseProgrammerController(ModuleController):
|
|
|
|
def on_loading(self, pulse_parameter_options):
|
|
logger.debug("Pulse programmer controller on loading")
|
|
self.module.model.pulse_parameter_options = pulse_parameter_options
|
|
|
|
@pyqtSlot(str)
|
|
def delete_event(self, event_name):
|
|
logger.debug("Deleting event %s", event_name)
|
|
for event in self.module.model.pulse_sequence.events:
|
|
if event.name == event_name:
|
|
self.module.model.pulse_sequence.events.remove(event)
|
|
break
|
|
self.module.model.events_changed.emit()
|
|
|
|
@pyqtSlot(str, str)
|
|
def change_event_name(self, old_name : str, new_name : str):
|
|
logger.debug("Changing event name from %s to %s", old_name, new_name)
|
|
for event in self.module.model.pulse_sequence.events:
|
|
if event.name == old_name:
|
|
event.name = new_name
|
|
break
|
|
self.module.model.events_changed.emit()
|
|
|
|
@pyqtSlot(str, str)
|
|
def change_event_duration(self, event_name:str, duration):
|
|
logger.debug("Changing duration of event %s to %s", event_name, duration)
|
|
for event in self.module.model.pulse_sequence.events:
|
|
if event.name == event_name:
|
|
try:
|
|
# The u is for microseconds
|
|
event.duration = duration + "u"
|
|
except decimal.InvalidOperation:
|
|
logger.error("Duration must be a positive number")
|
|
# Emit signal to the nqrduck core to show an error message
|
|
self.module.nqrduck_signal.emit("notification", ["Error", "Duration must be a positive number"])
|
|
break
|
|
self.module.model.events_changed.emit()
|
|
|
|
@pyqtSlot(str)
|
|
def on_move_event_left(self, event_name: str):
|
|
"""This method moves the event one position to the left if possible."""
|
|
logger.debug("Moving event %s to the left", event_name)
|
|
for i, event in enumerate(self.module.model.pulse_sequence.events):
|
|
if event.name == event_name:
|
|
if i > 0:
|
|
self.module.model.pulse_sequence.events[i], self.module.model.pulse_sequence.events[i-1] = self.module.model.pulse_sequence.events[i-1], self.module.model.pulse_sequence.events[i]
|
|
break
|
|
self.module.model.events_changed.emit()
|
|
|
|
|
|
@pyqtSlot(str)
|
|
def on_move_event_right(self, event_name : str):
|
|
""" This method moves the event one position to the right if possible. """
|
|
logger.debug("Moving event %s to the right", event_name)
|
|
for i, event in enumerate(self.module.model.pulse_sequence.events):
|
|
if event.name == event_name:
|
|
if i < len(self.module.model.pulse_sequence.events) - 1:
|
|
self.module.model.pulse_sequence.events[i], self.module.model.pulse_sequence.events[i+1] = self.module.model.pulse_sequence.events[i+1], self.module.model.pulse_sequence.events[i]
|
|
break
|
|
self.module.model.events_changed.emit()
|
|
|
|
def save_pulse_sequence(self, path):
|
|
logger.debug("Saving pulse sequence to %s", path)
|
|
sequence = self.module.model.pulse_sequence.to_json()
|
|
with open(path, "w") as file:
|
|
file.write(json.dumps(sequence, cls=DecimalEncoder))
|
|
|
|
|
|
def load_pulse_sequence(self, path):
|
|
logger.debug("Loading pulse sequence from %s", path)
|
|
sequence = None
|
|
with open(path, "r") as file:
|
|
sequence = file.read()
|
|
|
|
sequence = json.loads(sequence)
|
|
|
|
loaded_sequence = PulseSequence.load_sequence(sequence, self.module.model.pulse_parameter_options)
|
|
|
|
self.module.model.pulse_sequence = loaded_sequence
|
|
self.module.model.events_changed.emit() |