diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1ddfbbc029bcab630581847471d7f238ec53..8053a5d4429476f0311fb185effad356849a9845 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ <project version="4"> <component name="VcsDirectoryMappings"> <mapping directory="" vcs="Git" /> + <mapping directory="$PROJECT_DIR$/src/CaptDeviceControl/resources/cmp" vcs="Git" /> </component> </project> \ No newline at end of file diff --git a/examples/main.py b/examples/main.py index f0656324d61a8b473b172b4b88dd043996115811..3137e01ba1d274dad7136e31abc9e6dd2c50a0a3 100644 --- a/examples/main.py +++ b/examples/main.py @@ -34,7 +34,7 @@ if __name__ == "__main__": conf = CaptDevice.Config() - #conf.load("config.yaml") + conf.load("CaptDeviceConfig.yaml") model = CaptDevice.Model(conf) diff --git a/src/CaptDeviceControl/CaptDeviceConfig.py b/src/CaptDeviceControl/CaptDeviceConfig.py index 6cf17efee94e3987efcfeaddb8a6b5107da4cb54..9084f8b620711845072cdf73e4df7f53d36d1b12 100644 --- a/src/CaptDeviceControl/CaptDeviceConfig.py +++ b/src/CaptDeviceControl/CaptDeviceConfig.py @@ -13,17 +13,18 @@ class CaptDeviceConfig(cfg.ConfigNode): def __init__(self) -> None: super().__init__(internal_log=True, internal_log_level=logging.DEBUG) + self.selected_device_index = cfg.Field(0, friendly_name="Selected device", + description="Selected device from the device list provided by the DreamWaves API.") + self.sample_rate = cfg.Field(500, friendly_name="Sample rate", description="Sample rate of the device") + self.streaming_rate = cfg.Field(500, friendly_name="Streaming rate", description="Streaming rate in Hz (should be below 1kHz)") self.ain_channel = cfg.Field( - cfg.SelectableList([0, 1], - description=["Channel 0", "Channel 1"], - selected_index=0, - ), + cfg.SelectableList([0, 1], description=["Channel 0", "Channel 1"], selected_index=1), friendly_name="Analog In Channel", description="Analog in channel. Defines which channel is used for capturing.") @@ -35,15 +36,10 @@ class CaptDeviceConfig(cfg.ConfigNode): description=["100 ms", "200 ms", "500 ms", "1 s", "2 s", "5 s", "10 s", "20 s", "30 s"], selected_index=3, ), - friendly_name="Streaming history", - description="Defines the range of the stream in ms") + friendly_name="Streaming history", description="Defines the range of the stream in ms") - # TODO: Old configs (not used and will probably removed in future) - self.total_samples = cfg.Field(200000) - self.sample_time = cfg.Field(45) - self.ad2_raw_out_file = cfg.Field("{output_directory}/measurement/ad2_raw/ad2_out_{wafer_nr}_{date}.csv") self.register() diff --git a/src/CaptDeviceControl/controller/BaseAD2CaptDevice.py b/src/CaptDeviceControl/controller/BaseAD2CaptDevice.py index e573e3b5944f95dc39eab564bc8a90d36238d859..068904dd473a49b553c28e3f1054d5a459ceedee 100644 --- a/src/CaptDeviceControl/controller/BaseAD2CaptDevice.py +++ b/src/CaptDeviceControl/controller/BaseAD2CaptDevice.py @@ -29,6 +29,7 @@ class BaseAD2CaptDevice(cmp.CProcessControl): device_serial_number_changed = Signal(str, name="device_serial_number_changed") ain_channels_changed = Signal(list, name="ain_channels_changed") + selected_ain_channel_changed = Signal(int, name="selected_ain_channel_changed") ain_buffer_size_changed = Signal(int, name="ain_buffer_size_changed") analog_in_bits_changed = Signal(int, name="analog_in_bits_changed") analog_in_buffer_size_changed = Signal(int, name="analog_in_buffer_size_changed") @@ -77,11 +78,16 @@ class BaseAD2CaptDevice(cmp.CProcessControl): self.connect_signals() self._connect_config_signals() + self.discover_connected_devices() + + self.selected_ain_channel = self.model.analog_in.selected_ain_channel + + def connect_signals(self): self.dwf_version_changed.connect(self._on_dwf_version_changed) self.discovered_devices_changed.connect(self.on_discovered_devices_changed) - self.selected_device_index_changed.connect(self.on_selected_device_index_changed) + self.selected_device_index_changed.connect(self._on_selected_device_index_changed) self.device_connected_changed.connect( lambda x: type(self.model.device_information).device_connected.fset(self.model.device_information, x)) @@ -92,6 +98,8 @@ class BaseAD2CaptDevice(cmp.CProcessControl): self.ain_channels_changed.connect( lambda x: type(self.model.analog_in).ain_channels.fset(self.model.analog_in, x)) + #self.selected_ain_channel_changed.connect( + # lambda x: type(self.model.analog_in).selected_ain_channel.fset(self.model.analog_in, x)) self.ain_buffer_size_changed.connect( lambda x: type(self.model.analog_in).ain_buffer_size.fset(self.model.analog_in, x)) self.analog_in_bits_changed.connect( @@ -113,9 +121,29 @@ class BaseAD2CaptDevice(cmp.CProcessControl): def _connect_config_signals(self): self.model.ad2captdev_config.streaming_history.connect(self._on_streaming_history_changed) + #self.model.ad2captdev_config.selected_device_index.connect(self._on_selected_device_index_changed) # ================================================================================================================== # Device control # ================================================================================================================== + @cmp.CProcessControl.register_function() + def set_selected_ain_channel(self, ain_channel_index: int): + """ Sets the selected analog in channel.""" + + @cmp.CProcessControl.register_function() + def set_selected_device(self, device_index: int): + """ + Sets the selected device index. + :param device_index: The index of the device. + """ + self.model.device_information.selected_device_index = device_index + + @cmp.CProcessControl.register_function() + def set_sample_rate(self, sample_rate: float): + """ + Sets the sample rate. + :param sample_rate: The sample rate. + """ + @cmp.CProcessControl.register_function(open_device_finished) def open_device(self, device_index): """ @@ -165,17 +193,9 @@ class BaseAD2CaptDevice(cmp.CProcessControl): def on_discovered_devices_changed(self, devices: list): self.model.device_information.connected_devices = devices - # ================================================================================================================== - # Selected device index - # ================================================================================================================== - @cmp.CProcessControl.register_function(discovered_devices_changed) - def selected_device_index(self, index): - """ - Sets the selected device index. - :param index: The index of the device. - """ - def on_selected_device_index_changed(self, index): + + def _on_selected_device_index_changed(self, index): self.model.device_information.selected_device_index = index @abstractmethod @@ -311,4 +331,4 @@ class BaseAD2CaptDevice(cmp.CProcessControl): # Destructor # ================================================================================================================== def exit(self): - self.mpcaptdevicecontrol.safe_exit() + self.safe_exit() diff --git a/src/CaptDeviceControl/controller/mp_AD2Capture/MPCaptDevice.py b/src/CaptDeviceControl/controller/mp_AD2Capture/MPCaptDevice.py index 39e1c305013c720f8f04760ab895c7d5b28e307a..3fd7d61bd087c33a42ae7b93aacceac6f6bccf08 100644 --- a/src/CaptDeviceControl/controller/mp_AD2Capture/MPCaptDevice.py +++ b/src/CaptDeviceControl/controller/mp_AD2Capture/MPCaptDevice.py @@ -15,6 +15,8 @@ from CaptDeviceControl.model.AD2Constants import AD2Constants class MPCaptDevice(cmp.CProcess, ): + + @staticmethod def timeit(func): def wrapper(self, *args, **kwargs): @@ -37,38 +39,43 @@ class MPCaptDevice(cmp.CProcess, ): internal_log=internal_log, internal_log_level=internal_log_level) - self._device_capturing = False - self._c_samples = None - self._c_corrupted = None - self._c_lost = None - self._c_available = None - + # Objects for data exchange self.start_capture_flag: Value = start_capture_flag self.kill_capture_flag: Value = kill_capture_flag - self.stream_data_queue = streaming_data_queue self.capture_data_queue = capture_data_queue + # WaveForms api objects and handles self.dwf = None self.hdwf = None + self._dwf_version = None + + self._connected_devices = [] + self._ain_channels = [] + # Capture data counters self._selected_device_index = 0 - - self._dwf_version = None + self._selected_ain_channel = 0 + self._sample_rate = 0 + self._connected = False self._device_serial_number: str = "" self._device_name: str = "" - self._connected = False - self._connected_devices = [] + self._device_capturing = False + # ============================================================================================================== + self._c_samples = None + self._c_corrupted = None + self._c_lost = None + self._c_available = None + # ============================================================================================================== self._samples_lost = 0 self._samples_corrupted = 0 # ================================================================================================================== # Getter and Setter # ================================================================================================================== - @CProperty def dwf_version(self): return self._dwf_version @@ -79,24 +86,13 @@ class MPCaptDevice(cmp.CProcess, ): @CProperty def connected_devices(self) -> list: + """ Returns the list of connected devices.""" return self._connected_devices @connected_devices.setter(emit_to='connected_devices_changed') def connected_devices(self, value: list): self._connected_devices = value - @cmp.CProcess.register_signal(signal_name='selected_device_index_changed') - def selected_device_index(self, device_index: int): - # self.logger.debug(f"*** Selected device index {device_index}.") - self._selected_device_index = device_index - # If the selected device index change, we need to update the device information - self.device_name = self.get_device_name(self._selected_device_index) - self.device_serial_number = self.get_device_serial_number(self._selected_device_index) - - self.ain_channels = self.get_ain_channels(self._selected_device_index) - self.ain_buffer_size = self.get_ain_buffer_size(self._selected_device_index) - return self._selected_device_index - @CProperty def device_name(self): return self._device_name @@ -122,7 +118,7 @@ class MPCaptDevice(cmp.CProcess, ): self._connected = value @CProperty - def ain_channels(self, device_id): + def ain_channels(self) -> list: return self._ain_channels @ain_channels.setter(emit_to='ain_channels_changed') @@ -130,6 +126,47 @@ class MPCaptDevice(cmp.CProcess, ): self.logger.info("Setting ain channels.") self._ain_channels = value + @CProperty + def device_capturing(self): + return self._device_capturing + + @device_capturing.setter(emit_to='device_capturing_changed') + def device_capturing(self, capturing: bool): + self._device_capturing = capturing + + @CProperty + def selected_ain_channel(self) -> int: + return self._selected_ain_channel + @selected_ain_channel.setter(emit_to='selected_ain_channel_changed') + def selected_ain_channel(self, value: int): + self.logger.debug(f"Setting selected ain channel to {value}.") + self._selected_ain_channel = value + + @CProperty + def sample_rate(self) -> float: + return self._sample_rate + + @sample_rate.setter(emit_to='sample_rate_changed') + def sample_rate(self, value): + self._sample_rate = value + + @CProperty + def selected_device_index(self): + """ Returns the selected device index.""" + return self._selected_device_index + + @selected_device_index.setter(emit_to='selected_device_index_changed') + def selected_device_index(self, device_index: int): + """ Sets the selected device index.""" + self._selected_device_index = device_index + # If the selected device index change, we need to update the device information + self.device_name = self.get_device_name(self._selected_device_index) + self.device_serial_number = self.get_device_serial_number(self._selected_device_index) + + self.ain_channels = self.get_ain_channels(self._selected_device_index) + self.ain_buffer_size = self.get_ain_buffer_size(self._selected_device_index) + + # ================================================================================================================== # # ================================================================================================================== @@ -144,14 +181,9 @@ class MPCaptDevice(cmp.CProcess, ): self.dwf_version = self.get_dwf_version() - #@CProperty - #def device_capturing(self, capturing: bool): - # return self._device_capturing - - #@device_capturing.setter(emit_to='device_capturing_changed') - #def device_capturing(self, capturing: bool): - # self._device_capturing = capturing - + # ================================================================================================================== + # DWF FUnctions + # ================================================================================================================== def get_dwf_version(self) -> str: self.logger.debug(f"Getting DWF version information...") version = create_string_buffer(16) @@ -191,7 +223,23 @@ class MPCaptDevice(cmp.CProcess, ): # _mp_log_debug(f"Found {type} device: {devicename.value.decode('UTF-8')} ({serialnum.value.decode('UTF-8')})") self.logger.info(f"Found {len(connected_devices)} devices.") return connected_devices + # ================================================================================================================== + # Settings from process Control + # ================================================================================================================== + + @cmp.CProcess.register_signal() + def set_selected_ain_channel(self, ain_channel): + self.selected_ain_channel = ain_channel + #self.ain_buffer_size = self.get_ain_buffer_size(self._selected_device_index) + + @cmp.CProcess.register_signal() + def set_selected_device(self, ain_channel): + self.selected_device_index = ain_channel + # self.ain_buffer_size = self.get_ain_buffer_size(self._selected_device_index) + @cmp.CProcess.register_signal() + def set_sample_rate(self, sample_rate): + self.sample_rate = sample_rate # ================================================================================================================== # Functions for opening and closing the device # ================================================================================================================== @@ -201,7 +249,7 @@ class MPCaptDevice(cmp.CProcess, ): Opens the device and returns the handle. :return: Device handle. """ - self.selected_device_index(device_index) + self.selected_device_index = device_index if self.hdwf is not None or not isinstance(self.hdwf, c_int): self.hdwf = c_int() @@ -471,14 +519,17 @@ class MPCaptDevice(cmp.CProcess, ): :param sample_rate: :return: None """ - self.logger.info(f"Starting capture on channel {ain_channel} with rate {sample_rate} Hz.") + self.selected_ain_channel = ain_channel + self.sample_rate = sample_rate + + self.logger.info(f"Starting capture on channel {self.selected_ain_channel} with rate {self.sample_rate} Hz.") hdwf = self.hdwf self.device_state(AD2Constants.DeviceState.DEV_CAPT_SETUP()) - ain_channel = int(0) - self.setup_sine_wave(ain_channel) - self.setup_acquisition(sample_rate, ain_channel) + self.setup_sine_wave(self.selected_ain_channel) + + self.setup_acquisition(sample_rate, self.selected_ain_channel) # Variable to receive the acquisition state # self.dwf.FDwfAnalogInStatus(self.hdwf, c_int(1), byref(self._ain_device_state)) @@ -508,9 +559,6 @@ class MPCaptDevice(cmp.CProcess, ): try: # self.dwf.FDwfAnalogOutReset(self.hdwf, c_int(0)) - - ##plt.ion() - ##hl, = plt.plot([], []) self.device_state(AD2Constants.DeviceState.DEV_CAPT_STREAMING()) while self.kill_capture_flag.value == int(False): self.dwf.FDwfAnalogInStatus(hdwf, c_int(1), byref(sts)) @@ -520,13 +568,11 @@ class MPCaptDevice(cmp.CProcess, ): # Checks the state of the acquisition. To read the data from the device, set fReadData to TRUE. For # single acquisition mode, the data will be read only when the acquisition is finished - if sts == DwfStateConfig or sts == DwfStatePrefill or sts == DwfStateArmed: # self.device_state(AD2Constants.DeviceState.ACQ_NOT_STARTED()) continue # Acquisition not yet started. self.dwf.FDwfAnalogInStatusRecord(hdwf, byref(cAvailable), byref(cLost), byref(cCorrupted)) - # self.dwf.FDwfAnalogInStatusSamplesValid(self.hdwf, byref(self.cValid)) if cAvailable.value == 0: # self.device_state(AD2Constants.DeviceState.NO_SAMPLES_AVAILABLE()) continue @@ -539,11 +585,7 @@ class MPCaptDevice(cmp.CProcess, ): iteration_time = time.time() - time_start self.stream_data_queue.put(arr) - # #np.delete(arr - # else: - # print(f"rgd_samples is empty.") - - if self.start_capture_flag.value == int(True) : + if self.start_capture_flag.value == int(True): if not capture_started: self.capture_process_state(AD2Constants.CapturingState.RUNNING()) self.logger.info( @@ -551,7 +593,6 @@ class MPCaptDevice(cmp.CProcess, ): time_capture_started = time.time() capture_started = True capture_ended = False - # capture_samples = capture_samples + len(arr) self.capture_data_queue.put(arr) elif self.start_capture_flag.value == int(False) and capture_started: capture_started = False @@ -562,12 +603,8 @@ class MPCaptDevice(cmp.CProcess, ): time_capture_stopped = time.time() time_captured = time_capture_stopped - time_capture_started self.logger.info( - f"Acquisition stopped after {time_captured} seconds. Captured {capture_samples} " - f"samples. Resulting in a time of {capture_samples / sample_rate} s.") - # capture_ended = True - # capture_started = False - # # self.capture_data_queue.put(arr) - #self._c_samples += self._c_available.value + f"Acquisition stopped after {time_captured} seconds. Captured {capture_samples} " + f"samples. Resulting in a time of {capture_samples / self.sample_rate} s.") @@ -580,12 +617,12 @@ class MPCaptDevice(cmp.CProcess, ): # ================================================================================================================== # Others # ================================================================================================================== - def setup_sine_wave(self, channel: int = 0): + def setup_sine_wave(self, channel: int = 0, amplitude: float = 1, frequency: float = 1): self.logger.debug("Generating AM sine wave...") self.dwf.FDwfAnalogOutNodeEnableSet(self.hdwf, c_int(channel), c_int(0), c_int(1)) # carrier self.dwf.FDwfAnalogOutNodeFunctionSet(self.hdwf, c_int(channel), c_int(0), c_int(1)) # sine - self.dwf.FDwfAnalogOutNodeFrequencySet(self.hdwf, c_int(channel), c_int(0), c_double(1)) - self.dwf.FDwfAnalogOutNodeAmplitudeSet(self.hdwf, c_int(channel), c_int(0), c_double(1)) + self.dwf.FDwfAnalogOutNodeFrequencySet(self.hdwf, c_int(channel), c_int(0), c_double(frequency)) + self.dwf.FDwfAnalogOutNodeAmplitudeSet(self.hdwf, c_int(channel), c_int(0), c_double(amplitude)) # dwf.FDwfAnalogOutNodeOffsetSet(hdwf, c_int(0), c_int(0), c_double(0.5)) # dwf.FDwfAnalogOutNodeEnableSet(hdwf, c_int(0), c_int(2), c_int(1)) # AM # dwf.FDwfAnalogOutNodeFunctionSet(hdwf, c_int(0), c_int(2), c_int(3)) # triangle @@ -596,6 +633,9 @@ class MPCaptDevice(cmp.CProcess, ): self.logger.debug(f"Sine wave on output channel {channel} configured.") + + + if __name__ == "__main__": state_queue = Queue() cmd_queue = Queue() diff --git a/src/CaptDeviceControl/model/AD2CaptDeviceModel.py b/src/CaptDeviceControl/model/AD2CaptDeviceModel.py index 7223d033aacb35de3a50c6978f9c0c3244e92d6c..860f8b917fdbc95cb95b2d510000deb544720eaa 100644 --- a/src/CaptDeviceControl/model/AD2CaptDeviceModel.py +++ b/src/CaptDeviceControl/model/AD2CaptDeviceModel.py @@ -16,7 +16,6 @@ class AD2CaptDeviceSignals(QObject): def __init__(self, parent=None): super().__init__(parent) - ad2captdev_config_changed = Signal(Config) # WaveForms Runtime (DWF) Information @@ -95,7 +94,7 @@ class AD2CaptDeviceModel: # Multiprocessing Information self._pid: int = 0 - self.device_information = AD2CaptDeviceInformationModel() + self.device_information = AD2CaptDeviceInformationModel(self.ad2captdev_config) self.analog_in = AD2CaptDeviceAnalogInModel(self.ad2captdev_config) self.capturing_information = AD2CaptDeviceCapturingModel(self.ad2captdev_config) # Acquisition Settings @@ -103,31 +102,6 @@ class AD2CaptDeviceModel: # Analog Out Information self.aout_channels: list = [] - - - - - # ============================================================================================================== - # Delete later - # Device information - # - self._device_ready: bool = False - - self._hwdf = c_int() - self._auto_connect: bool = False - - self._capturing_finished: bool = False - # Stores, if samples have been lost or are corrupted - self._fLost: int = 0 - self._fCorrupted: int = 0 - # List for storing the samples - # Stores only the current recorded values - self._measurement_time: float = 0 - # Stores all recorded samples with a timestamp and the measurement time - self._all_recorded_samples: list = [] - self._num_of_current_recorded_samples: int = 0 - self._n_samples: int = 0 - @property def ad2captdev_config(self) -> Config: return self._ad2captdev_config @@ -152,9 +126,6 @@ class AD2CaptDeviceModel: self._dwf_version = value self.signals.dwf_version_changed.emit(self.dwf_version) - - - # ================================================================================================================== # Analog Out Information # ================================================================================================================== @@ -167,7 +138,6 @@ class AD2CaptDeviceModel: self._aout_channels = value self.signals.aout_channels_changed.emit(self.aout_channels) - # ================================================================================================================== # Multiprocessing Flags # ================================================================================================================== @@ -179,112 +149,3 @@ class AD2CaptDeviceModel: def pid(self, value: int): self._pid = value self.signals.pid_changed.emit(self.pid) - - - - @property - def device_state(self) -> AD2Constants.DeviceState: - return self._device_state - - @device_state.setter - def device_state(self, value: AD2Constants.DeviceState): - #print(f"Set device_state to {value}") - self._device_state = value - self.signals.device_state_changed.emit(self._device_state) - - - # ================================================================================================================== - # ================================================================================================================== - # DELETE LATER - # ================================================================================================================== - # ================================================================================================================== - @property - def auto_connect(self) -> bool: - return self._auto_connect - - @auto_connect.setter - def auto_connect(self, value: bool): - self._auto_connect = value - - @property - # def ad2_properties(self) -> AD2CaptDeviceProperties: - # return AD2CaptDeviceProperties(self._fLost, self._fCorrupted, - # self._sample_rate, self._n_samples, - # self._measurement_time) - - @property - def capturing_finished(self) -> bool: - return self._capturing_finished - - @capturing_finished.setter - def capturing_finished(self, value: bool): - self._capturing_finished = value - self.signals.capturing_finished_changed.emit(self.capturing_finished) - - @property - def measurement_time(self) -> float: - return self._measurement_time - - @measurement_time.setter - def measurement_time(self, value: float): - self._measurement_time = value - self.signals.measurement_time_changed.emit(self.measurement_time) - - @property - def hdwf(self) -> c_int: - return self._hwdf - - @hdwf.setter - def hdwf(self, value: c_int): - self._hwdf = value - self.signals.hwdf_changed.emit(int(self._hwdf.value)) - - @property - def num_of_current_recorded_samples(self) -> int: - """Only setter property!""" - return self._num_of_current_recorded_samples - - @property - def device_ready(self) -> bool: - return self._device_ready - - @device_ready.setter - def device_ready(self, value: bool): - self._device_ready = value - self.signals.device_ready_changed.emit(self.device_ready) - - @property - def all_recorded_samples(self) -> list: - return self._all_recorded_samples - - @all_recorded_samples.setter - def all_recorded_samples(self, value: list): - self._all_recorded_samples = value - self.signals.all_recorded_samples_changed.emit(self.all_recorded_samples) - - @property - def n_samples(self): - return self._n_samples - - @n_samples.setter - def n_samples(self, value): - self._n_samples = value - self.signals.n_samples_changed.emit(self._n_samples) - - @property - def fCorrupted(self): - return self._fCorrupted - - @fCorrupted.setter - def fCorrupted(self, value): - self._fCorrupted = value - self.signals.fCorrupted_changed.emit(self._fCorrupted) - - @property - def fLost(self): - return self._fLost - - @fLost.setter - def fLost(self, value): - self._fLost = value - self.signals.fLost_changed.emit(self._fLost) diff --git a/src/CaptDeviceControl/model/submodels/AD2CaptDeviceCapturingModel.py b/src/CaptDeviceControl/model/submodels/AD2CaptDeviceCapturingModel.py index 0d32e92b6b86df82f77d04261d3016ade5eed4b3..a5fb8350e6bb1284b488560665a83a7c2221a78a 100644 --- a/src/CaptDeviceControl/model/submodels/AD2CaptDeviceCapturingModel.py +++ b/src/CaptDeviceControl/model/submodels/AD2CaptDeviceCapturingModel.py @@ -136,6 +136,7 @@ class AD2CaptDeviceCapturingModel: @property def start_recording(self) -> bool: + print(f">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> {self._start_recording}") return self._start_recording @start_recording.setter diff --git a/src/CaptDeviceControl/model/submodels/AD2CaptDeviceInformationModel.py b/src/CaptDeviceControl/model/submodels/AD2CaptDeviceInformationModel.py index d3668721a3d9cf04ab8b376029a812115d2095bb..c407fd3d9b2c73c852eb2f198fa452588b063e32 100644 --- a/src/CaptDeviceControl/model/submodels/AD2CaptDeviceInformationModel.py +++ b/src/CaptDeviceControl/model/submodels/AD2CaptDeviceInformationModel.py @@ -2,6 +2,7 @@ from ctypes import c_int, Array from PySide6.QtCore import QObject, Signal +from CaptDeviceConfig import CaptDeviceConfig from model.AD2Constants import AD2Constants @@ -24,15 +25,15 @@ class AD2CaptDeviceInformationSignals(QObject): class AD2CaptDeviceInformationModel: - def __init__(self): + def __init__(self, config: CaptDeviceConfig): self.signals = AD2CaptDeviceInformationSignals() - + self._config = config # Connected Device Information self._num_of_connected_devices: int = 0 self._connected_devices: list = [] # Device Information - self._selected_device_index: int = 0 + #self._selected_device_index: int = 0 self._device_connected: bool = False self._device_name: str = "Unknown" self._device_serial_number: str = "Unknown" @@ -64,11 +65,12 @@ class AD2CaptDeviceInformationModel: @property def selected_device_index(self) -> int: - return self._selected_device_index + return self._config.selected_device_index.get() @selected_device_index.setter def selected_device_index(self, value: int): - self._selected_device_index = value + print("selected_device_index", value) + self._config.selected_device_index.set(value) self.signals.selected_device_index_changed.emit(self.selected_device_index) # ================================================================================================================== diff --git a/src/CaptDeviceControl/resources/AD2ControlWindowNew.ui b/src/CaptDeviceControl/resources/AD2ControlWindowNew.ui index 70ae2209c9223d21c46348e281d2e71d19bcd879..b781c7bc7c393a46dd5b138e5e969ceab5251a10 100644 --- a/src/CaptDeviceControl/resources/AD2ControlWindowNew.ui +++ b/src/CaptDeviceControl/resources/AD2ControlWindowNew.ui @@ -795,7 +795,14 @@ QTabBar::tab:selected { </widget> </item> <item row="0" column="2"> - <widget class="QSpinBox" name="sb_acquisition_rate"/> + <widget class="QSpinBox" name="sb_acquisition_rate"> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>999999999</number> + </property> + </widget> </item> <item row="1" column="2"> <widget class="QComboBox" name="cb_streaming_history"/> @@ -1038,7 +1045,7 @@ QPushButton:disabled { <item> <widget class="QPushButton" name="btn_record"> <property name="enabled"> - <bool>true</bool> + <bool>false</bool> </property> <property name="minimumSize"> <size> @@ -1085,6 +1092,8 @@ QPushButton:disabled { QPushButton:checked { background-color: rgb(78, 47, 58); + icon: url(:/single-color/icons-svg/single_color/cil-media-play.svg); + background-color: rgb(183, 0, 0); } </string> </property> @@ -1093,7 +1102,8 @@ QPushButton:checked { </property> <property name="icon"> <iconset resource="resources.qrc"> - <normaloff>:/icons-svg/icons-svg/cil-media-record.svg</normaloff>:/icons-svg/icons-svg/cil-media-record.svg</iconset> + <normaloff>:/icons-svg/icons-svg/cil-media-record.svg</normaloff> + <selectedon>:/single-color/icons-svg/single_color/cil-media-play.svg</selectedon>:/icons-svg/icons-svg/cil-media-record.svg</iconset> </property> <property name="checkable"> <bool>true</bool> @@ -1181,7 +1191,6 @@ QPushButton:disabled { </widget> <resources> <include location="resources.qrc"/> - <include location="../../../../flexsensor/src/FlexSensor/resources/resources.qrc"/> </resources> <connections/> </ui> diff --git a/src/CaptDeviceControl/resources/resources.qrc b/src/CaptDeviceControl/resources/resources.qrc index 8f4b0d10c0437c79298cb18d2e317f2f184e10dc..6491e8192c455d4bd8c0f35cf68c6e2f3722cad9 100644 --- a/src/CaptDeviceControl/resources/resources.qrc +++ b/src/CaptDeviceControl/resources/resources.qrc @@ -1,6 +1,5 @@ <RCC> <qresource prefix="icons"> - <file>icons/cil-record.png</file> <file>icons/cil-airplane-mode-off.png</file> <file>icons/cil-alarm.png</file> <file>icons/cil-align-left.png</file> @@ -266,4 +265,7 @@ <file>icons-svg/cil-media-stop.svg</file> <file>icons-svg/cil-media-play.svg</file> </qresource> + <qresource prefix="single-color"> + <file>icons-svg/single_color/cil-media-play.svg</file> + </qresource> </RCC> diff --git a/src/CaptDeviceControl/resources_rc.py b/src/CaptDeviceControl/resources_rc.py index 65554a6403aa52c26b1afce89f503cabc95eda51..3f04c0476e07684ae37ea31e429e94c05730d23d 100644 --- a/src/CaptDeviceControl/resources_rc.py +++ b/src/CaptDeviceControl/resources_rc.py @@ -6,6 +6,40 @@ from PySide6 import QtCore qt_resource_data = b"\ +\x00\x00\x02\x00\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22utf\ +-8\x22?>\x0d\x0a<!-- Gene\ +rator: Adobe Ill\ +ustrator 24.1.2,\ + SVG Export Plug\ +-In . SVG Versio\ +n: 6.00 Build 0)\ + -->\x0d\x0a<svg vers\ +ion=\x221.1\x22 id=\x22Eb\ +ene_1\x22 xmlns=\x22ht\ +tp://www.w3.org/\ +2000/svg\x22 xmlns:\ +xlink=\x22http://ww\ +w.w3.org/1999/xl\ +ink\x22 x=\x220px\x22 y=\x22\ +0px\x22\x0d\x0a\x09 viewBox=\ +\x220 0 16 16\x22 styl\ +e=\x22enable-backgr\ +ound:new 0 0 16 \ +16;\x22 xml:space=\x22\ +preserve\x22>\x0d\x0a<sty\ +le type=\x22text/cs\ +s\x22>\x0d\x0a\x09.st0{fill:\ +#FFFFFF;stroke:#\ +E6E6E6;stroke-wi\ +dth:0.875;stroke\ +-miterlimit:10;}\ +\x0d\x0a</style>\x0d\x0a<cir\ +cle class=\x22st0\x22 \ +cx=\x228\x22 cy=\x228\x22 r=\ +\x227\x22/>\x0d\x0a</svg>\x0d\x0a\ \x00\x00\x0c\xf5\ <\ ?xml version=\x221.\ @@ -7575,131 +7609,6 @@ ft\x03\x98\xa0\xb4\x06\x10\x0b\x90j\x00\x0b\x94\x0e\x01\ Z\x1a\x88\xf7@\xd3\x02\xd1\xd1\x88\x9e\x90\xd0\xd94\ N\xca\x14\xe7FJ\x0d\x00\x00\x00\x12\xd9\xf2\x1b\xc9=\ \xce\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x07\xad\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\ -\x01\x00\x9a\x9c\x18\x00\x00\x06\xbeiTXtXML\ -:com.adobe.xmp\x00\x00\ -\x00\x00\x00<?xpacket beg\ -in=\x22\xef\xbb\xbf\x22 id=\x22W5M\ -0MpCehiHzreSzNTc\ -zkc9d\x22?> <x:xmpm\ -eta xmlns:x=\x22ado\ -be:ns:meta/\x22 x:x\ -mptk=\x22Adobe XMP \ -Core 6.0-c002 79\ -.164360, 2020/02\ -/13-01:07:22 \ - \x22> <rdf:RDF \ -xmlns:rdf=\x22http:\ -//www.w3.org/199\ -9/02/22-rdf-synt\ -ax-ns#\x22> <rdf:De\ -scription rdf:ab\ -out=\x22\x22 xmlns:xmp\ -=\x22http://ns.adob\ -e.com/xap/1.0/\x22 \ -xmlns:dc=\x22http:/\ -/purl.org/dc/ele\ -ments/1.1/\x22 xmln\ -s:photoshop=\x22htt\ -p://ns.adobe.com\ -/photoshop/1.0/\x22\ - xmlns:xmpMM=\x22ht\ -tp://ns.adobe.co\ -m/xap/1.0/mm/\x22 x\ -mlns:stEvt=\x22http\ -://ns.adobe.com/\ -xap/1.0/sType/Re\ -sourceEvent#\x22 xm\ -p:CreatorTool=\x22A\ -dobe Photoshop 2\ -1.0 (Windows)\x22 x\ -mp:CreateDate=\x222\ -020-03-03T09:50:\ -39-03:00\x22 xmp:Mo\ -difyDate=\x222023-1\ -2-19T12:32:13+01\ -:00\x22 xmp:Metadat\ -aDate=\x222023-12-1\ -9T12:32:13+01:00\ -\x22 dc:format=\x22ima\ -ge/png\x22 photosho\ -p:ColorMode=\x223\x22 \ -photoshop:ICCPro\ -file=\x22sRGB IEC61\ -966-2.1\x22 xmpMM:I\ -nstanceID=\x22xmp.i\ -id:6fd797e6-6ff4\ --9a44-9557-6799f\ -e88bef9\x22 xmpMM:D\ -ocumentID=\x22adobe\ -:docid:photoshop\ -:6f97d719-53de-6\ -e45-8ff5-06294f4\ -cb71b\x22 xmpMM:Ori\ -ginalDocumentID=\ -\x22xmp.did:dd5d3a3\ -e-a046-5146-8e7a\ --14b62eeb350d\x22> \ -<xmpMM:History> \ -<rdf:Seq> <rdf:l\ -i stEvt:action=\x22\ -created\x22 stEvt:i\ -nstanceID=\x22xmp.i\ -id:dd5d3a3e-a046\ --5146-8e7a-14b62\ -eeb350d\x22 stEvt:w\ -hen=\x222020-03-03T\ -09:50:39-03:00\x22 \ -stEvt:softwareAg\ -ent=\x22Adobe Photo\ -shop 21.0 (Windo\ -ws)\x22/> <rdf:li s\ -tEvt:action=\x22sav\ -ed\x22 stEvt:instan\ -ceID=\x22xmp.iid:ca\ -98d4da-7bf3-f243\ --8228-c9b9b28efe\ -0b\x22 stEvt:when=\x22\ -2020-05-02T17:58\ -:25-03:00\x22 stEvt\ -:softwareAgent=\x22\ -Adobe Photoshop \ -21.0 (Windows)\x22 \ -stEvt:changed=\x22/\ -\x22/> <rdf:li stEv\ -t:action=\x22saved\x22\ - stEvt:instanceI\ -D=\x22xmp.iid:6fd79\ -7e6-6ff4-9a44-95\ -57-6799fe88bef9\x22\ - stEvt:when=\x22202\ -3-12-19T12:32:13\ -+01:00\x22 stEvt:so\ -ftwareAgent=\x22Ado\ -be Photoshop 21.\ -1 (Windows)\x22 stE\ -vt:changed=\x22/\x22/>\ - </rdf:Seq> </xm\ -pMM:History> </r\ -df:Description> \ -</rdf:RDF> </x:x\ -mpmeta> <?xpacke\ -t end=\x22r\x22?>\x87\x8a\xb4f\x00\ -\x00\x00\x95IDAT8\xcb\xad\x93A\x0a\x830\x10\ -Eg%\xf4*\x9a\xb3\xd6,\x0c\xf4.\xa5\xb7(\xea\ -=ta\xc4b\xff\xc0D\xc2\x80\x053]\xbcE\x92\ -\xf9\x0f2\x99\xd0ND\x8a\x1a\xdc\xc1\x00\x16\xa1\x97\xbd\ -Z\xd7\xe7\x8b\x0at\xe0\x03\xf6\x13\xf8\xec\x01nZ\xc0\ -\xe1\xe7\x8f\xa0\xe6%\x99C\x10.\x84\x13]\x124`\ -+\x10p\xa6aA[\x10N\xb4$\xdd.\x15\x0c,\ -\x88\x06A\xb4\x0a&\xeb\x15\xde\xd6&z\x168\xc33\ -:\xcb \x85\xbf\x8e\xb2\xf93\xe5\xf0h{0\x82\x15\ -\xcc\xdcm\xd9s\xba\xfe\x0bX\xa9\xc6a\xd5\xd1B\x1d\ -\x00\x00\x00\x00IEND\xaeB`\x82\ \x00\x00\x07{\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ @@ -31591,6 +31500,19 @@ qt_resource_name = b"\ \x06V\x95\x87\ \x00i\ \x00c\x00o\x00n\x00s\x00-\x00s\x00v\x00g\ +\x00\x0c\ +\x0bz\xff\x22\ +\x00s\ +\x00i\x00n\x00g\x00l\x00e\x00-\x00c\x00o\x00l\x00o\x00r\ +\x00\x0c\ +\x04\x1a\xff\x22\ +\x00s\ +\x00i\x00n\x00g\x00l\x00e\x00_\x00c\x00o\x00l\x00o\x00r\ +\x00\x12\ +\x0f\xad\x82\xe7\ +\x00c\ +\x00i\x00l\x00-\x00m\x00e\x00d\x00i\x00a\x00-\x00p\x00l\x00a\x00y\x00.\x00s\x00v\ +\x00g\ \x00\x14\ \x07^\x97G\ \x00c\ @@ -31610,11 +31532,6 @@ qt_resource_name = b"\ \x00c\ \x00i\x00l\x00-\x00m\x00e\x00d\x00i\x00a\x00-\x00p\x00a\x00u\x00s\x00e\x00.\x00s\ \x00v\x00g\ -\x00\x12\ -\x0f\xad\x82\xe7\ -\x00c\ -\x00i\x00l\x00-\x00m\x00e\x00d\x00i\x00a\x00-\x00p\x00l\x00a\x00y\x00.\x00s\x00v\ -\x00g\ \x00\x10\ \x00\xa4\xda'\ \x00c\ @@ -31873,10 +31790,6 @@ qt_resource_name = b"\ \x00c\ \x00i\x00l\x00-\x00a\x00r\x00r\x00o\x00w\x00-\x00l\x00e\x00f\x00t\x00.\x00p\x00n\ \x00g\ -\x00\x0e\ -\x09nZ\xe7\ -\x00c\ -\x00i\x00l\x00-\x00r\x00e\x00c\x00o\x00r\x00d\x00.\x00p\x00n\x00g\ \x00\x0d\ \x09e\xcd\xe7\ \x00c\ @@ -32802,541 +32715,547 @@ qt_resource_name = b"\ " qt_resource_struct = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0d\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x10\x00\x02\x00\x00\x00\x01\x00\x00\x00\x07\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00(\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x09\ +\x00\x00\x00\x10\x00\x02\x00\x00\x00\x01\x00\x00\x00\x05\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x10\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ +\x00\x00\x00F\x00\x02\x00\x00\x00\x01\x00\x00\x00\x06\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x10\x00\x02\x00\x00\x00\x05\x00\x00\x00\x04\ +\x00\x00\x00d\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x8c\xce\xceVk\ +\x00\x00\x00\x10\x00\x02\x00\x00\x00\x05\x00\x00\x00\x08\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00V\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xf9\ -\x00\x00\x01\x8c\x82\x0a\x8e\x98\ -\x00\x00\x00(\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xfd\ +\x00\x00\x01\x8c\x8c\xa7\x01\x9f\ +\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x02\x04\ \x00\x00\x01\x8c\x82\x1by\xc8\ -\x00\x00\x00\x80\x00\x00\x00\x00\x00\x01\x00\x00\x19\x1c\ +\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x1b \ \x00\x00\x01\x8c\x820\xf4\x8b\ -\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00&\xad\ +\x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00(\xb1\ \x00\x00\x01\x8c\x82\x09\xe1%\ -\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x003K\ +\x00\x00\x00d\x00\x00\x00\x00\x00\x01\x00\x005O\ \x00\x00\x01\x8c\x82\x01\xdf*\ -\x00\x00\x00\x00\x00\x02\x00\x00\x01\x02\x00\x00\x00\x0a\ +\x00\x00\x00\x00\x00\x02\x00\x00\x01\x01\x00\x00\x00\x0e\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x08\xd6\x00\x00\x00\x00\x00\x01\x00\x01\x8e\x00\ +\x00\x00\x09\x12\x00\x00\x00\x00\x00\x01\x00\x01\x90\x04\ \x00\x00\x01\x88v;G>\ -\x00\x00 \x0a\x00\x00\x00\x00\x00\x01\x00\x05\x98+\ +\x00\x00 $\x00\x00\x00\x00\x00\x01\x00\x05\x92~\ \x00\x00\x01\x88v;F\xfe\ -\x00\x00\x04\xa4\x00\x00\x00\x00\x00\x01\x00\x00\xd4n\ +\x00\x00\x04\xe0\x00\x00\x00\x00\x00\x01\x00\x00\xd6r\ \x00\x00\x01\x88v;G$\ -\x00\x00\x08\xfe\x00\x00\x00\x00\x00\x01\x00\x01\x95X\ +\x00\x00\x09:\x00\x00\x00\x00\x00\x01\x00\x01\x97\x5c\ \x00\x00\x01\x88v;F\x05\ -\x00\x00\x03\x14\x00\x00\x00\x00\x00\x01\x00\x00\x91N\ +\x00\x00\x03P\x00\x00\x00\x00\x00\x01\x00\x00\x93R\ \x00\x00\x01\x88v;F\xa7\ -\x00\x00'\xd8\x00\x00\x00\x00\x00\x01\x00\x06\xfc\xdd\ +\x00\x00'\xf2\x00\x00\x00\x00\x00\x01\x00\x06\xf70\ \x00\x00\x01\x88v;F\xa8\ -\x00\x00%\xfc\x00\x00\x00\x00\x00\x01\x00\x06\xa9\x86\ +\x00\x00&\x16\x00\x00\x00\x00\x00\x01\x00\x06\xa3\xd9\ \x00\x00\x01\x88v;E\xf1\ -\x00\x00\x03\xae\x00\x00\x00\x00\x00\x01\x00\x00\xaf3\ +\x00\x00\x03\xea\x00\x00\x00\x00\x00\x01\x00\x00\xb17\ \x00\x00\x01\x88v;Fj\ -\x00\x00\x14\xa6\x00\x00\x00\x00\x00\x01\x00\x03\x9aO\ +\x00\x00\x14\xc0\x00\x00\x00\x00\x00\x01\x00\x03\x94\xa2\ \x00\x00\x01\x88v;E\xf2\ -\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x01\x00\x006\x02\ +\x00\x00\x014\x00\x00\x00\x00\x00\x01\x00\x008\x06\ \x00\x00\x01\x88v;F\x9d\ -\x00\x00\x15\xee\x00\x00\x00\x00\x00\x01\x00\x03\xd6!\ +\x00\x00\x16\x08\x00\x00\x00\x00\x00\x01\x00\x03\xd0t\ \x00\x00\x01\x88v;F#\ -\x00\x00\x10\xec\x00\x00\x00\x00\x00\x01\x00\x03\x05\x00\ +\x00\x00\x11\x06\x00\x00\x00\x00\x00\x01\x00\x02\xffS\ \x00\x00\x01\x88v;F\x84\ -\x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x01\x07:\ +\x00\x00\x06\x16\x00\x00\x00\x00\x00\x01\x00\x01\x09>\ \x00\x00\x01\x88v;F\x86\ -\x00\x00&\x16\x00\x00\x00\x00\x00\x01\x00\x06\xb1+\ +\x00\x00&0\x00\x00\x00\x00\x00\x01\x00\x06\xab~\ \x00\x00\x01\x88v;F\xcc\ -\x00\x00\x1e\xc0\x00\x00\x00\x00\x00\x01\x00\x05]Q\ +\x00\x00\x1e\xda\x00\x00\x00\x00\x00\x01\x00\x05W\xa4\ \x00\x00\x01\x88v;F\x1d\ -\x00\x00\x186\x00\x00\x00\x00\x00\x01\x00\x04>\xa8\ +\x00\x00\x18P\x00\x00\x00\x00\x00\x01\x00\x048\xfb\ \x00\x00\x01\x88v;E\xfb\ -\x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x82\x8f\ +\x00\x00\x02\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x84\x93\ \x00\x00\x01\x88v;F3\ -\x00\x00\x03<\x00\x00\x00\x00\x00\x01\x00\x00\x98\xdb\ +\x00\x00\x03x\x00\x00\x00\x00\x00\x01\x00\x00\x9a\xdf\ \x00\x00\x01\x88v;G=\ -\x00\x00\x1e\x04\x00\x00\x00\x00\x00\x01\x00\x05>\xe2\ +\x00\x00\x1e\x1e\x00\x00\x00\x00\x00\x01\x00\x0595\ \x00\x00\x01\x88v;F6\ -\x00\x00 \xba\x00\x00\x00\x00\x00\x01\x00\x05\xafe\ +\x00\x00 \xd4\x00\x00\x00\x00\x00\x01\x00\x05\xa9\xb8\ \x00\x00\x01\x88v;F\x99\ -\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x5c\xae\ +\x00\x00\x020\x00\x00\x00\x00\x00\x01\x00\x00^\xb2\ \x00\x00\x01\x88v;G\x14\ -\x00\x00\x01>\x00\x00\x00\x00\x00\x01\x00\x00D\xd3\ +\x00\x00\x01z\x00\x00\x00\x00\x00\x01\x00\x00F\xd7\ \x00\x00\x01\x88v;F;\ -\x00\x00#\x04\x00\x00\x00\x00\x00\x01\x00\x06\x11X\ +\x00\x00#\x1e\x00\x00\x00\x00\x00\x01\x00\x06\x0b\xab\ \x00\x00\x01\x88v;G\x16\ -\x00\x00)\x9a\x00\x00\x00\x00\x00\x01\x00\x07N/\ +\x00\x00)\xb4\x00\x00\x00\x00\x00\x01\x00\x07H\x82\ \x00\x00\x01\x88v;F\x9b\ -\x00\x00\x11N\x00\x00\x00\x00\x00\x01\x00\x03\x13\xd7\ +\x00\x00\x11h\x00\x00\x00\x00\x00\x01\x00\x03\x0e*\ \x00\x00\x01\x88v;E\xf3\ -\x00\x00\x1b4\x00\x00\x00\x00\x00\x01\x00\x04\xc02\ +\x00\x00\x1bN\x00\x00\x00\x00\x00\x01\x00\x04\xba\x85\ \x00\x00\x01\x88v;Fv\ -\x00\x00\x0d\xb8\x00\x00\x00\x00\x00\x01\x00\x02v\x13\ +\x00\x00\x0d\xd2\x00\x00\x00\x00\x00\x01\x00\x02pf\ \x00\x00\x01\x88v;Fq\ -\x00\x00\x18\xee\x00\x00\x00\x00\x00\x01\x00\x04\x5c%\ +\x00\x00\x19\x08\x00\x00\x00\x00\x00\x01\x00\x04Vx\ \x00\x00\x01\x88v;Fp\ -\x00\x00\x13\x92\x00\x00\x00\x00\x00\x01\x00\x03m^\ +\x00\x00\x13\xac\x00\x00\x00\x00\x00\x01\x00\x03g\xb1\ \x00\x00\x01\x88v;F5\ -\x00\x00 \x98\x00\x00\x00\x00\x00\x01\x00\x05\xae\x8f\ +\x00\x00 \xb2\x00\x00\x00\x00\x00\x01\x00\x05\xa8\xe2\ \x00\x00\x01\x88v;GE\ -\x00\x00%\xda\x00\x00\x00\x00\x00\x01\x00\x06\xa1\xe3\ +\x00\x00%\xf4\x00\x00\x00\x00\x00\x01\x00\x06\x9c6\ \x00\x00\x01\x88v;F\x94\ -\x00\x00\x0a \x00\x00\x00\x00\x00\x01\x00\x01\xc9\x93\ +\x00\x00\x0a\x5c\x00\x00\x00\x00\x00\x01\x00\x01\xcb\x97\ \x00\x00\x01\x88v;F\x09\ -\x00\x00\x16\x8c\x00\x00\x00\x00\x00\x01\x00\x03\xf3\x7f\ +\x00\x00\x16\xa6\x00\x00\x00\x00\x00\x01\x00\x03\xed\xd2\ \x00\x00\x01\x88v;Ff\ -\x00\x00\x1cr\x00\x00\x00\x00\x00\x01\x00\x04\xfb\xd8\ +\x00\x00\x1c\x8c\x00\x00\x00\x00\x00\x01\x00\x04\xf6+\ \x00\x00\x01\x88v;F\xa4\ -\x00\x00\x0b2\x00\x00\x00\x00\x00\x01\x00\x01\xf7\x93\ +\x00\x00\x0bL\x00\x00\x00\x00\x00\x01\x00\x01\xf1\xe6\ \x00\x00\x01\x88v;F\xb7\ -\x00\x00\x1f.\x00\x00\x00\x00\x00\x01\x00\x05s&\ +\x00\x00\x1fH\x00\x00\x00\x00\x00\x01\x00\x05my\ \x00\x00\x01\x88v;FA\ -\x00\x00\x0e\x02\x00\x00\x00\x00\x00\x01\x00\x02\x85W\ +\x00\x00\x0e\x1c\x00\x00\x00\x00\x00\x01\x00\x02\x7f\xaa\ \x00\x00\x01\x88v;FI\ -\x00\x00\x12\xc2\x00\x00\x00\x00\x00\x01\x00\x03H\x05\ +\x00\x00\x12\xdc\x00\x00\x00\x00\x00\x01\x00\x03BX\ \x00\x00\x01\x88v;G@\ -\x00\x00\x0c\xea\x00\x00\x00\x00\x00\x01\x00\x02Q\x1c\ +\x00\x00\x0d\x04\x00\x00\x00\x00\x00\x01\x00\x02Ko\ \x00\x00\x01\x88v;F \ -\x00\x00\x07\x04\x00\x00\x00\x00\x00\x01\x00\x01<\x22\ +\x00\x00\x07@\x00\x00\x00\x00\x00\x01\x00\x01>&\ \x00\x00\x01\x88v;F\xc4\ -\x00\x00\x18\x90\x00\x00\x00\x00\x00\x01\x00\x04M\x81\ +\x00\x00\x18\xaa\x00\x00\x00\x00\x00\x01\x00\x04G\xd4\ \x00\x00\x01\x88v;F\xc7\ -\x00\x00\x1ah\x00\x00\x00\x00\x00\x01\x00\x04\xa0S\ +\x00\x00\x1a\x82\x00\x00\x00\x00\x00\x01\x00\x04\x9a\xa6\ \x00\x00\x01\x88v;F\xa0\ -\x00\x00(D\x00\x00\x00\x00\x00\x01\x00\x07\x12\xf7\ +\x00\x00(^\x00\x00\x00\x00\x00\x01\x00\x07\x0dJ\ \x00\x00\x01\x88v;G\x03\ -\x00\x00\x1f\xaa\x00\x00\x00\x00\x00\x01\x00\x05\x89]\ +\x00\x00\x1f\xc4\x00\x00\x00\x00\x00\x01\x00\x05\x83\xb0\ \x00\x00\x01\x88v;G\x05\ -\x00\x00\x0e^\x00\x00\x00\x00\x00\x01\x00\x02\x94G\ +\x00\x00\x0ex\x00\x00\x00\x00\x00\x01\x00\x02\x8e\x9a\ \x00\x00\x01\x88v;F\x0d\ -\x00\x00 n\x00\x00\x00\x00\x00\x01\x00\x05\xa6\xf2\ +\x00\x00 \x88\x00\x00\x00\x00\x00\x01\x00\x05\xa1E\ \x00\x00\x01\x88v;G/\ -\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\xdby\ +\x00\x00\x05 \x00\x00\x00\x00\x00\x01\x00\x00\xdd}\ \x00\x00\x01\x88v;F\xcb\ -\x00\x00\x22\xda\x00\x00\x00\x00\x00\x01\x00\x06\x09\xbe\ +\x00\x00\x22\xf4\x00\x00\x00\x00\x00\x01\x00\x06\x04\x11\ \x00\x00\x01\x88v;G\x18\ -\x00\x00#\xe2\x00\x00\x00\x00\x00\x01\x00\x06=L\ +\x00\x00#\xfc\x00\x00\x00\x00\x00\x01\x00\x067\x9f\ \x00\x00\x01\x88v;F\x87\ -\x00\x00\x07\xa0\x00\x00\x00\x00\x00\x01\x00\x01Y\xfc\ +\x00\x00\x07\xdc\x00\x00\x00\x00\x00\x01\x00\x01\x5c\x00\ \x00\x00\x01\x88v;FN\ -\x00\x00\x04>\x00\x00\x00\x00\x00\x01\x00\x00\xc5\xc2\ +\x00\x00\x04z\x00\x00\x00\x00\x00\x01\x00\x00\xc7\xc6\ \x00\x00\x01\x88v;F{\ -\x00\x00\x05`\x00\x00\x00\x00\x00\x01\x00\x00\xf2\x1f\ +\x00\x00\x05\x9c\x00\x00\x00\x00\x00\x01\x00\x00\xf4#\ \x00\x00\x01\x88v;G<\ -\x00\x00\x18\xba\x00\x00\x00\x00\x00\x01\x00\x04U\x08\ +\x00\x00\x18\xd4\x00\x00\x00\x00\x00\x01\x00\x04O[\ \x00\x00\x01\x88v;G:\ -\x00\x00\x22@\x00\x00\x00\x00\x00\x01\x00\x05\xec\xdb\ +\x00\x00\x22Z\x00\x00\x00\x00\x00\x01\x00\x05\xe7.\ \x00\x00\x01\x88v;F\x98\ -\x00\x00\x1f\x86\x00\x00\x00\x00\x00\x01\x00\x05\x81\xa3\ +\x00\x00\x1f\xa0\x00\x00\x00\x00\x00\x01\x00\x05{\xf6\ \x00\x00\x01\x88v;F\xd8\ -\x00\x00$\xca\x00\x00\x00\x00\x00\x01\x00\x06n\x13\ +\x00\x00$\xe4\x00\x00\x00\x00\x00\x01\x00\x06hf\ \x00\x00\x01\x88v;G*\ -\x00\x00\x03\x90\x00\x00\x00\x00\x00\x01\x00\x00\xa7\xc8\ +\x00\x00\x03\xcc\x00\x00\x00\x00\x00\x01\x00\x00\xa9\xcc\ \x00\x00\x01\x88v;F`\ -\x00\x00\x1b\xa0\x00\x00\x00\x00\x00\x01\x00\x04\xcf7\ +\x00\x00\x1b\xba\x00\x00\x00\x00\x00\x01\x00\x04\xc9\x8a\ \x00\x00\x01\x88v;E\xfd\ -\x00\x00\x0d\xe0\x00\x00\x00\x00\x00\x01\x00\x02}\xcc\ +\x00\x00\x0d\xfa\x00\x00\x00\x00\x00\x01\x00\x02x\x1f\ \x00\x00\x01\x88v;FH\ -\x00\x00\x0a\xac\x00\x00\x00\x00\x00\x01\x00\x01\xe0\xc1\ +\x00\x00\x0a\xc6\x00\x00\x00\x00\x00\x01\x00\x01\xdb\x14\ \x00\x00\x01\x88v;F\xda\ -\x00\x00\x19\xb2\x00\x00\x00\x00\x00\x01\x00\x04zX\ +\x00\x00\x19\xcc\x00\x00\x00\x00\x00\x01\x00\x04t\xab\ \x00\x00\x01\x88v;G\x0b\ -\x00\x00$d\x00\x00\x00\x00\x00\x01\x00\x06WK\ +\x00\x00$~\x00\x00\x00\x00\x00\x01\x00\x06Q\x9e\ \x00\x00\x01\x88v;F+\ -\x00\x00#\x22\x00\x00\x00\x00\x00\x01\x00\x06\x18\x96\ +\x00\x00#<\x00\x00\x00\x00\x00\x01\x00\x06\x12\xe9\ \x00\x00\x01\x88v;F\x9f\ -\x00\x00\x13\xd6\x00\x00\x00\x00\x00\x01\x00\x03u\x06\ +\x00\x00\x13\xf0\x00\x00\x00\x00\x00\x01\x00\x03oY\ \x00\x00\x01\x88v;F\xbf\ -\x00\x00!L\x00\x00\x00\x00\x00\x01\x00\x05\xc5\x83\ +\x00\x00!f\x00\x00\x00\x00\x00\x01\x00\x05\xbf\xd6\ \x00\x00\x01\x88v;F\xbb\ -\x00\x00\x06\xde\x00\x00\x00\x00\x00\x01\x00\x014\x81\ +\x00\x00\x07\x1a\x00\x00\x00\x00\x00\x01\x00\x016\x85\ \x00\x00\x01\x88v;F\x0e\ -\x00\x00!\xfa\x00\x00\x00\x00\x00\x01\x00\x05\xe3m\ +\x00\x00\x22\x14\x00\x00\x00\x00\x00\x01\x00\x05\xdd\xc0\ \x00\x00\x01\x88v;F\xe5\ -\x00\x00'v\x00\x00\x00\x00\x00\x01\x00\x06\xed\x85\ +\x00\x00'\x90\x00\x00\x00\x00\x00\x01\x00\x06\xe7\xd8\ \x00\x00\x01\x88v;F\xe0\ -\x00\x00\x17\x0e\x00\x00\x00\x00\x00\x01\x00\x04\x09\x87\ +\x00\x00\x17(\x00\x00\x00\x00\x00\x01\x00\x04\x03\xda\ \x00\x00\x01\x88v;G#\ -\x00\x00 B\x00\x00\x00\x00\x00\x01\x00\x05\x9fm\ +\x00\x00 \x5c\x00\x00\x00\x00\x00\x01\x00\x05\x99\xc0\ \x00\x00\x01\x88v;F\xad\ -\x00\x00\x07\xfa\x00\x00\x00\x00\x00\x01\x00\x01i\x0b\ +\x00\x00\x086\x00\x00\x00\x00\x00\x01\x00\x01k\x0f\ \x00\x00\x01\x88v;Ft\ -\x00\x00\x09V\x00\x00\x00\x00\x00\x01\x00\x01\xa4\xbe\ +\x00\x00\x09\x92\x00\x00\x00\x00\x00\x01\x00\x01\xa6\xc2\ \x00\x00\x01\x88v;F|\ -\x00\x00\x15\xc2\x00\x00\x00\x00\x00\x01\x00\x03\xce\xcb\ +\x00\x00\x15\xdc\x00\x00\x00\x00\x00\x01\x00\x03\xc9\x1e\ \x00\x00\x01\x88v;FB\ -\x00\x00\x0e\xa0\x00\x00\x00\x00\x00\x01\x00\x02\xa3\xb0\ +\x00\x00\x0e\xba\x00\x00\x00\x00\x00\x01\x00\x02\x9e\x03\ \x00\x00\x01\x88v;F\xaf\ -\x00\x00\x1f\xe2\x00\x00\x00\x00\x00\x01\x00\x05\x90\xb1\ +\x00\x00\x1f\xfc\x00\x00\x00\x00\x00\x01\x00\x05\x8b\x04\ \x00\x00\x01\x88v;G\x13\ -\x00\x00#\xb6\x00\x00\x00\x00\x00\x01\x00\x066'\ +\x00\x00#\xd0\x00\x00\x00\x00\x00\x01\x00\x060z\ \x00\x00\x01\x88v;E\xff\ -\x00\x00\x1b\xca\x00\x00\x00\x00\x00\x01\x00\x04\xd6i\ +\x00\x00\x1b\xe4\x00\x00\x00\x00\x00\x01\x00\x04\xd0\xbc\ \x00\x00\x01\x88v;F\xa1\ -\x00\x00\x17\xde\x00\x00\x00\x00\x00\x01\x00\x04/s\ +\x00\x00\x17\xf8\x00\x00\x00\x00\x00\x01\x00\x04)\xc6\ \x00\x00\x01\x88v;Fr\ -\x00\x00#v\x00\x00\x00\x00\x00\x01\x00\x06&\xbd\ +\x00\x00#\x90\x00\x00\x00\x00\x00\x01\x00\x06!\x10\ \x00\x00\x01\x88v;F~\ -\x00\x00\x0d\x0c\x00\x00\x00\x00\x00\x01\x00\x02X\xb0\ +\x00\x00\x0d&\x00\x00\x00\x00\x00\x01\x00\x02S\x03\ \x00\x00\x01\x88v;G-\ -\x00\x00*\x8e\x00\x00\x00\x00\x00\x01\x00\x07za\ +\x00\x00*\xa8\x00\x00\x00\x00\x00\x01\x00\x07t\xb4\ \x00\x00\x01\x88v;F\xab\ -\x00\x00\x0e\xf6\x00\x00\x00\x00\x00\x01\x00\x02\xb2\x84\ +\x00\x00\x0f\x10\x00\x00\x00\x00\x00\x01\x00\x02\xac\xd7\ \x00\x00\x01\x88v;F\x19\ -\x00\x00\x14\x88\x00\x00\x00\x00\x00\x01\x00\x03\x92\xed\ +\x00\x00\x14\xa2\x00\x00\x00\x00\x00\x01\x00\x03\x8d@\ \x00\x00\x01\x88v;F(\ -\x00\x00\x17\x90\x00\x00\x00\x00\x00\x01\x00\x04 \x16\ +\x00\x00\x17\xaa\x00\x00\x00\x00\x00\x01\x00\x04\x1ai\ \x00\x00\x01\x88v;G\x10\ -\x00\x00$\x8c\x00\x00\x00\x00\x00\x01\x00\x06^\xeb\ +\x00\x00$\xa6\x00\x00\x00\x00\x00\x01\x00\x06Y>\ \x00\x00\x01\x88v;F'\ -\x00\x00%T\x00\x00\x00\x00\x00\x01\x00\x06\x83\xf6\ +\x00\x00%n\x00\x00\x00\x00\x00\x01\x00\x06~I\ \x00\x00\x01\x88v;G\x1a\ -\x00\x00\x16:\x00\x00\x00\x00\x00\x01\x00\x03\xe4\xb9\ +\x00\x00\x16T\x00\x00\x00\x00\x00\x01\x00\x03\xdf\x0c\ \x00\x00\x01\x88v;F\x97\ -\x00\x00\x09\xa4\x00\x00\x00\x00\x00\x01\x00\x01\xb3u\ +\x00\x00\x09\xe0\x00\x00\x00\x00\x00\x01\x00\x01\xb5y\ \x00\x00\x01\x88v;F]\ -\x00\x00'\xa4\x00\x00\x00\x00\x00\x01\x00\x06\xf5*\ +\x00\x00'\xbe\x00\x00\x00\x00\x00\x01\x00\x06\xef}\ \x00\x00\x01\x88v;Fb\ -\x00\x00(&\x00\x00\x00\x00\x00\x01\x00\x07\x0bd\ +\x00\x00(@\x00\x00\x00\x00\x00\x01\x00\x07\x05\xb7\ \x00\x00\x01\x88v;F\xfa\ -\x00\x00\x16\x18\x00\x00\x00\x00\x00\x01\x00\x03\xddb\ +\x00\x00\x162\x00\x00\x00\x00\x00\x01\x00\x03\xd7\xb5\ \x00\x00\x01\x88v;F\xe8\ -\x00\x00)P\x00\x00\x00\x00\x00\x01\x00\x07?\xb2\ +\x00\x00)j\x00\x00\x00\x00\x00\x01\x00\x07:\x05\ \x00\x00\x01\x88v;F\xa6\ -\x00\x00\x17\x5c\x00\x00\x00\x00\x00\x01\x00\x04\x18\x8d\ +\x00\x00\x17v\x00\x00\x00\x00\x00\x01\x00\x04\x12\xe0\ \x00\x00\x01\x88v;F\x81\ -\x00\x00\x22`\x00\x00\x00\x00\x00\x01\x00\x05\xf42\ +\x00\x00\x22z\x00\x00\x00\x00\x00\x01\x00\x05\xee\x85\ \x00\x00\x01\x88v;F\xc8\ -\x00\x00\x156\x00\x00\x00\x00\x00\x01\x00\x03\xb8\x81\ +\x00\x00\x15P\x00\x00\x00\x00\x00\x01\x00\x03\xb2\xd4\ \x00\x00\x01\x88v;F\xc1\ -\x00\x00\x10l\x00\x00\x00\x00\x00\x01\x00\x02\xee\x80\ +\x00\x00\x10\x86\x00\x00\x00\x00\x00\x01\x00\x02\xe8\xd3\ \x00\x00\x01\x88v;F\x1e\ -\x00\x00\x02 \x00\x00\x00\x00\x00\x01\x00\x00d\x1a\ +\x00\x00\x02\x5c\x00\x00\x00\x00\x00\x01\x00\x00f\x1e\ \x00\x00\x01\x88v;FU\ -\x00\x00\x0bl\x00\x00\x00\x00\x00\x01\x00\x02\x06\x81\ +\x00\x00\x0b\x86\x00\x00\x00\x00\x00\x01\x00\x02\x00\xd4\ \x00\x00\x01\x88v;F/\ -\x00\x00\x1c\x1a\x00\x00\x00\x00\x00\x01\x00\x04\xe5+\ +\x00\x00\x1c4\x00\x00\x00\x00\x00\x01\x00\x04\xdf~\ \x00\x00\x01\x88v;F\xec\ -\x00\x00\x0fJ\x00\x00\x00\x00\x00\x01\x00\x02\xc1`\ +\x00\x00\x0fd\x00\x00\x00\x00\x00\x01\x00\x02\xbb\xb3\ \x00\x00\x01\x88v;Fu\ -\x00\x00\x1b\x14\x00\x00\x00\x00\x00\x01\x00\x04\xb8\x8e\ +\x00\x00\x1b.\x00\x00\x00\x00\x00\x01\x00\x04\xb2\xe1\ \x00\x00\x01\x88v;FD\ -\x00\x00 \xec\x00\x00\x00\x00\x00\x01\x00\x05\xb6\x83\ +\x00\x00!\x06\x00\x00\x00\x00\x00\x01\x00\x05\xb0\xd6\ \x00\x00\x01\x88v;Fa\ -\x00\x00\x06\x0a\x00\x00\x00\x00\x00\x01\x00\x01\x0e\xc0\ +\x00\x00\x06F\x00\x00\x00\x00\x00\x01\x00\x01\x10\xc4\ \x00\x00\x01\x88v;F0\ -\x00\x00\x11\x22\x00\x00\x00\x00\x00\x01\x00\x03\x0cy\ +\x00\x00\x11<\x00\x00\x00\x00\x00\x01\x00\x03\x06\xcc\ \x00\x00\x01\x88v;E\xf6\ -\x00\x00\x0a\x8c\x00\x00\x00\x00\x00\x01\x00\x01\xdf\xc5\ +\x00\x00\x0a\xa6\x00\x00\x00\x00\x00\x01\x00\x01\xda\x18\ \x00\x00\x01\x88v;GH\ -\x00\x00\x14\xea\x00\x00\x00\x00\x00\x01\x00\x03\xa9\x9e\ +\x00\x00\x15\x04\x00\x00\x00\x00\x00\x01\x00\x03\xa3\xf1\ \x00\x00\x01\x88v;G'\ -\x00\x00\x1d(\x00\x00\x00\x00\x00\x01\x00\x05\x19\x83\ +\x00\x00\x1dB\x00\x00\x00\x00\x00\x01\x00\x05\x13\xd6\ \x00\x00\x01\x88v;G%\ -\x00\x00\x16f\x00\x00\x00\x00\x00\x01\x00\x03\xec5\ +\x00\x00\x16\x80\x00\x00\x00\x00\x00\x01\x00\x03\xe6\x88\ \x00\x00\x01\x88v;G\x1c\ -\x00\x00'>\x00\x00\x00\x00\x00\x01\x00\x06\xe5\xbe\ +\x00\x00'X\x00\x00\x00\x00\x00\x01\x00\x06\xe0\x11\ \x00\x00\x01\x88v;E\xf7\ -\x00\x00\x02>\x00\x00\x00\x00\x00\x01\x00\x00k\xaa\ +\x00\x00\x02z\x00\x00\x00\x00\x00\x01\x00\x00m\xae\ \x00\x00\x01\x88v;F\x06\ -\x00\x00\x13<\x00\x00\x00\x00\x00\x01\x00\x03^G\ +\x00\x00\x13V\x00\x00\x00\x00\x00\x01\x00\x03X\x9a\ \x00\x00\x01\x88v;FW\ -\x00\x00\x0a\xc8\x00\x00\x00\x00\x00\x01\x00\x01\xe8<\ +\x00\x00\x0a\xe2\x00\x00\x00\x00\x00\x01\x00\x01\xe2\x8f\ \x00\x00\x01\x88v;F\x1b\ -\x00\x00&\xf6\x00\x00\x00\x00\x00\x01\x00\x06\xd6\xcf\ +\x00\x00'\x10\x00\x00\x00\x00\x00\x01\x00\x06\xd1\x22\ \x00\x00\x01\x88v;G\x0e\ -\x00\x00(\xf8\x00\x00\x00\x00\x00\x01\x00\x070\xbd\ +\x00\x00)\x12\x00\x00\x00\x00\x00\x01\x00\x07+\x10\ \x00\x00\x01\x88v;G!\ -\x00\x00#\xfc\x00\x00\x00\x00\x00\x01\x00\x06D\xd5\ +\x00\x00$\x16\x00\x00\x00\x00\x00\x01\x00\x06?(\ \x00\x00\x01\x88v;FY\ -\x00\x00\x0c\x82\x00\x00\x00\x00\x00\x01\x00\x02:>\ +\x00\x00\x0c\x9c\x00\x00\x00\x00\x00\x01\x00\x024\x91\ \x00\x00\x01\x88v;F\x80\ -\x00\x00\x1d\xa0\x00\x00\x00\x00\x00\x01\x00\x05/\xf5\ +\x00\x00\x1d\xba\x00\x00\x00\x00\x00\x01\x00\x05*H\ \x00\x00\x01\x88v;FM\ -\x00\x00\x04\x18\x00\x00\x00\x00\x00\x01\x00\x00\xbeO\ +\x00\x00\x04T\x00\x00\x00\x00\x00\x01\x00\x00\xc0S\ \x00\x00\x01\x88v;F\x8c\ -\x00\x00\x1e\x94\x00\x00\x00\x00\x00\x01\x00\x05U\x98\ +\x00\x00\x1e\xae\x00\x00\x00\x00\x00\x01\x00\x05O\xeb\ \x00\x00\x01\x88v;G\x01\ -\x00\x00\x22\xb0\x00\x00\x00\x00\x00\x01\x00\x06\x02O\ +\x00\x00\x22\xca\x00\x00\x00\x00\x00\x01\x00\x05\xfc\xa2\ \x00\x00\x01\x88v;F\x8a\ -\x00\x00)\xc8\x00\x00\x00\x00\x00\x01\x00\x07UI\ +\x00\x00)\xe2\x00\x00\x00\x00\x00\x01\x00\x07O\x9c\ \x00\x00\x01\x88v;F\x02\ -\x00\x00\x10&\x00\x00\x00\x00\x00\x01\x00\x02\xe6\xdb\ +\x00\x00\x10@\x00\x00\x00\x00\x00\x01\x00\x02\xe1.\ \x00\x00\x01\x88v;F7\ -\x00\x00\x15\x16\x00\x00\x00\x00\x00\x01\x00\x03\xb18\ +\x00\x00\x150\x00\x00\x00\x00\x00\x01\x00\x03\xab\x8b\ \x00\x00\x01\x88v;F2\ -\x00\x00#\x96\x00\x00\x00\x00\x00\x01\x00\x06.j\ +\x00\x00#\xb0\x00\x00\x00\x00\x00\x01\x00\x06(\xbd\ \x00\x00\x01\x88v;G\x1d\ -\x00\x00\x1a\xec\x00\x00\x00\x00\x00\x01\x00\x04\xb7\x08\ +\x00\x00\x1b\x06\x00\x00\x00\x00\x00\x01\x00\x04\xb1[\ \x00\x00\x01\x88v;GL\ -\x00\x00\x04j\x00\x00\x00\x00\x00\x01\x00\x00\xcdG\ +\x00\x00\x04\xa6\x00\x00\x00\x00\x00\x01\x00\x00\xcfK\ \x00\x00\x01\x88v;F\xdd\ -\x00\x00\x0b\xde\x00\x00\x00\x00\x00\x01\x00\x02\x1c\x01\ +\x00\x00\x0b\xf8\x00\x00\x00\x00\x00\x01\x00\x02\x16T\ \x00\x00\x01\x88v;Fe\ -\x00\x00\x07\xcc\x00\x00\x00\x00\x00\x01\x00\x01a\x84\ +\x00\x00\x08\x08\x00\x00\x00\x00\x00\x01\x00\x01c\x88\ \x00\x00\x01\x88v;F\xac\ -\x00\x00\x0bN\x00\x00\x00\x00\x00\x01\x00\x01\xff\x0b\ +\x00\x00\x0bh\x00\x00\x00\x00\x00\x01\x00\x01\xf9^\ \x00\x00\x01\x88v;FI\ -\x00\x00!\xa4\x00\x00\x00\x00\x00\x01\x00\x05\xd4\x91\ +\x00\x00!\xbe\x00\x00\x00\x00\x00\x01\x00\x05\xce\xe4\ \x00\x00\x01\x88v;F\x96\ -\x00\x00\x0d6\x00\x00\x00\x00\x00\x01\x00\x02`D\ +\x00\x00\x0dP\x00\x00\x00\x00\x00\x01\x00\x02Z\x97\ \x00\x00\x01\x88v;F\x0a\ -\x00\x00&r\x00\x00\x00\x00\x00\x01\x00\x06\xc0Y\ +\x00\x00&\x8c\x00\x00\x00\x00\x00\x01\x00\x06\xba\xac\ \x00\x00\x01\x88v;F\xb1\ -\x00\x00%z\x00\x00\x00\x00\x00\x01\x00\x06\x8bG\ +\x00\x00%\x94\x00\x00\x00\x00\x00\x01\x00\x06\x85\x9a\ \x00\x00\x01\x88v;F\xea\ -\x00\x00\x1aL\x00\x00\x00\x00\x00\x01\x00\x04\x98\xc2\ +\x00\x00\x1af\x00\x00\x00\x00\x00\x01\x00\x04\x93\x15\ \x00\x00\x01\x88v;F\x0f\ -\x00\x00(|\x00\x00\x00\x00\x00\x01\x00\x07\x19\xf9\ +\x00\x00(\x96\x00\x00\x00\x00\x00\x01\x00\x07\x14L\ \x00\x00\x01\x88v;F\x07\ -\x00\x00\x1d|\x00\x00\x00\x00\x00\x01\x00\x05(C\ +\x00\x00\x1d\x96\x00\x00\x00\x00\x00\x01\x00\x05\x22\x96\ \x00\x00\x01\x88v;F\x8e\ -\x00\x00%\x9c\x00\x00\x00\x00\x00\x01\x00\x06\x93\x01\ +\x00\x00%\xb6\x00\x00\x00\x00\x00\x01\x00\x06\x8dT\ \x00\x00\x01\x88v;F\x17\ -\x00\x00\x01\xd2\x00\x00\x00\x00\x00\x01\x00\x00U&\ +\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00W*\ \x00\x00\x01\x88v;F\xf6\ -\x00\x00#D\x00\x00\x00\x00\x00\x01\x00\x06\x1f\xb4\ +\x00\x00#^\x00\x00\x00\x00\x00\x01\x00\x06\x1a\x07\ \x00\x00\x01\x88v;F\x01\ -\x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x89\xef\ +\x00\x00\x030\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xf3\ \x00\x00\x01\x88v;F\xdb\ -\x00\x00&\xc6\x00\x00\x00\x00\x00\x01\x00\x06\xcfb\ +\x00\x00&\xe0\x00\x00\x00\x00\x00\x01\x00\x06\xc9\xb5\ \x00\x00\x01\x88v;F\x15\ -\x00\x00\x22\x80\x00\x00\x00\x00\x00\x01\x00\x05\xfa\xd7\ +\x00\x00\x22\x9a\x00\x00\x00\x00\x00\x01\x00\x05\xf5*\ \x00\x00\x01\x88v;F\xc3\ -\x00\x00\x0al\x00\x00\x00\x00\x00\x01\x00\x01\xd8F\ +\x00\x00\x0a\x86\x00\x00\x00\x00\x00\x01\x00\x01\xd2\x99\ \x00\x00\x01\x88v;G2\ -\x00\x00\x09\xe6\x00\x00\x00\x00\x00\x01\x00\x01\xbb\x02\ +\x00\x00\x0a\x22\x00\x00\x00\x00\x00\x01\x00\x01\xbd\x06\ \x00\x00\x01\x88v;F\xc5\ -\x00\x00\x0aJ\x00\x00\x00\x00\x00\x01\x00\x01\xd0\x95\ -\x00\x00\x01\x8c\x81\xd9 \xf7\ -\x00\x00*$\x00\x00\x00\x00\x00\x01\x00\x07c\xde\ +\x00\x00*>\x00\x00\x00\x00\x00\x01\x00\x07^1\ \x00\x00\x01\x88v;F\xf7\ -\x00\x00\x03n\x00\x00\x00\x00\x00\x01\x00\x00\xa0Z\ +\x00\x00\x03\xaa\x00\x00\x00\x00\x00\x01\x00\x00\xa2^\ \x00\x00\x01\x88v;FP\ -\x00\x00\x0f\xae\x00\x00\x00\x00\x00\x01\x00\x02\xd0.\ +\x00\x00\x0f\xc8\x00\x00\x00\x00\x00\x01\x00\x02\xca\x81\ \x00\x00\x01\x88v;F\xf9\ -\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00=h\ +\x00\x00\x01Z\x00\x00\x00\x00\x00\x01\x00\x00?l\ \x00\x00\x01\x88v;FE\ -\x00\x00*\xcc\x00\x00\x00\x00\x00\x01\x00\x07\x89\x8f\ +\x00\x00*\xe6\x00\x00\x00\x00\x00\x01\x00\x07\x83\xe2\ \x00\x00\x01\x88v;F\xb8\ -\x00\x00\x14\x12\x00\x00\x00\x00\x00\x01\x00\x03|R\ +\x00\x00\x14,\x00\x00\x00\x00\x00\x01\x00\x03v\xa5\ \x00\x00\x01\x88v;F\xeb\ -\x00\x00*@\x00\x00\x00\x00\x00\x01\x00\x07k\x86\ +\x00\x00*Z\x00\x00\x00\x00\x00\x01\x00\x07e\xd9\ \x00\x00\x01\x88v;FC\ -\x00\x00\x07t\x00\x00\x00\x00\x00\x01\x00\x01R\xaa\ +\x00\x00\x07\xb0\x00\x00\x00\x00\x00\x01\x00\x01T\xae\ \x00\x00\x01\x88v;E\xf5\ -\x00\x00'\xfe\x00\x00\x00\x00\x00\x01\x00\x07\x04.\ +\x00\x00(\x18\x00\x00\x00\x00\x00\x01\x00\x06\xfe\x81\ \x00\x00\x01\x88v;F&\ -\x00\x00\x1a\x8a\x00\x00\x00\x00\x00\x01\x00\x04\xa8\x15\ +\x00\x00\x1a\xa4\x00\x00\x00\x00\x00\x01\x00\x04\xa2h\ \x00\x00\x01\x88v;FS\ -\x00\x00!\x88\x00\x00\x00\x00\x00\x01\x00\x05\xcd\x05\ +\x00\x00!\xa2\x00\x00\x00\x00\x00\x01\x00\x05\xc7X\ \x00\x00\x01\x88v;FQ\ -\x00\x00\x1a$\x00\x00\x00\x00\x00\x01\x00\x04\x91*\ +\x00\x00\x1a>\x00\x00\x00\x00\x00\x01\x00\x04\x8b}\ \x00\x00\x01\x88v;F\x1a\ -\x00\x00\x10\xc0\x00\x00\x00\x00\x00\x01\x00\x02\xfdQ\ +\x00\x00\x10\xda\x00\x00\x00\x00\x00\x01\x00\x02\xf7\xa4\ \x00\x00\x01\x88v;G\x0c\ -\x00\x00$F\x00\x00\x00\x00\x00\x01\x00\x06M;\ +\x00\x00$`\x00\x00\x00\x00\x00\x01\x00\x06G\x8e\ \x00\x00\x01\x88v\xe8\xa8x\ -\x00\x00\x22\x22\x00\x00\x00\x00\x00\x01\x00\x05\xea\xca\ +\x00\x00\x22<\x00\x00\x00\x00\x00\x01\x00\x05\xe5\x1d\ \x00\x00\x01\x88v\xecih\ -\x00\x00\x0c\xa6\x00\x00\x00\x00\x00\x01\x00\x02A\xfb\ +\x00\x00\x0c\xc0\x00\x00\x00\x00\x00\x01\x00\x02<N\ \x00\x00\x01\x88v;F\xf4\ -\x00\x00)\xf6\x00\x00\x00\x00\x00\x01\x00\x07\x5cj\ +\x00\x00*\x10\x00\x00\x00\x00\x00\x01\x00\x07V\xbd\ \x00\x00\x01\x88v;Fl\ -\x00\x00\x142\x00\x00\x00\x00\x00\x01\x00\x03\x83\xb7\ +\x00\x00\x14L\x00\x00\x00\x00\x00\x01\x00\x03~\x0a\ \x00\x00\x01\x88v;F\xe7\ -\x00\x00\x02x\x00\x00\x00\x00\x00\x01\x00\x00s_\ +\x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00uc\ \x00\x00\x01\x88v;G\x0f\ -\x00\x00\x06\x8c\x00\x00\x00\x00\x00\x01\x00\x01%\x87\ +\x00\x00\x06\xc8\x00\x00\x00\x00\x00\x01\x00\x01'\x8b\ \x00\x00\x01\x88v;F\x83\ -\x00\x00\x07N\x00\x00\x00\x00\x00\x01\x00\x01K!\ +\x00\x00\x07\x8a\x00\x00\x00\x00\x00\x01\x00\x01M%\ \x00\x00\x01\x88v;Fn\ -\x00\x00%$\x00\x00\x00\x00\x00\x01\x00\x06|\x83\ +\x00\x00%>\x00\x00\x00\x00\x00\x01\x00\x06v\xd6\ \x00\x00\x01\x88v;G3\ -\x00\x00!\xca\x00\x00\x00\x00\x00\x01\x00\x05\xdb\xe8\ +\x00\x00!\xe4\x00\x00\x00\x00\x00\x01\x00\x05\xd6;\ \x00\x00\x01\x88v;G5\ -\x00\x00\x05B\x00\x00\x00\x00\x00\x01\x00\x00\xea\xa5\ +\x00\x00\x05~\x00\x00\x00\x00\x00\x01\x00\x00\xec\xa9\ \x00\x00\x01\x88v;F\x90\ -\x00\x00\x17\xae\x00\x00\x00\x00\x00\x01\x00\x04'\xba\ +\x00\x00\x17\xc8\x00\x00\x00\x00\x00\x01\x00\x04\x22\x0d\ \x00\x00\x01\x88v;G7\ -\x00\x00\x19\xf4\x00\x00\x00\x00\x00\x01\x00\x04\x89\x8e\ +\x00\x00\x1a\x0e\x00\x00\x00\x00\x00\x01\x00\x04\x83\xe1\ \x00\x00\x01\x88v;G6\ -\x00\x00'\x14\x00\x00\x00\x00\x00\x01\x00\x06\xdea\ +\x00\x00'.\x00\x00\x00\x00\x00\x01\x00\x06\xd8\xb4\ \x00\x00\x01\x88v;F*\ -\x00\x00\x12\xe8\x00\x00\x00\x00\x00\x01\x00\x03O\xbb\ +\x00\x00\x13\x02\x00\x00\x00\x00\x00\x01\x00\x03J\x0e\ \x00\x00\x01\x88v;F\xfc\ -\x00\x00\x03\xda\x00\x00\x00\x00\x00\x01\x00\x00\xb6\xae\ +\x00\x00\x04\x16\x00\x00\x00\x00\x00\x01\x00\x00\xb8\xb2\ \x00\x00\x01\x88v;F=\ -\x00\x00(\xb2\x00\x00\x00\x00\x00\x01\x00\x07!\xb0\ +\x00\x00(\xcc\x00\x00\x00\x00\x00\x01\x00\x07\x1c\x03\ \x00\x00\x01\x88v;F\x5c\ -\x00\x00\x0b\x14\x00\x00\x00\x00\x00\x01\x00\x01\xf0+\ +\x00\x00\x0b.\x00\x00\x00\x00\x00\x01\x00\x01\xea~\ \x00\x00\x01\x88v;F\xb3\ -\x00\x00\x06l\x00\x00\x00\x00\x00\x01\x00\x01\x1e\x18\ +\x00\x00\x06\xa8\x00\x00\x00\x00\x00\x01\x00\x01 \x1c\ \x00\x00\x01\x88v;F,\ -\x00\x00%\xba\x00\x00\x00\x00\x00\x01\x00\x06\x9at\ +\x00\x00%\xd4\x00\x00\x00\x00\x00\x01\x00\x06\x94\xc7\ \x00\x00\x01\x88v;F\x8b\ -\x00\x00*\xac\x00\x00\x00\x00\x00\x01\x00\x07\x81\xd5\ +\x00\x00*\xc6\x00\x00\x00\x00\x00\x01\x00\x07|(\ \x00\x00\x01\x88v;E\xfa\ -\x00\x00\x1cR\x00\x00\x00\x00\x00\x01\x00\x04\xf4S\ +\x00\x00\x1cl\x00\x00\x00\x00\x00\x01\x00\x04\xee\xa6\ \x00\x00\x01\x88v;G\x02\ -\x00\x00\x09x\x00\x00\x00\x00\x00\x01\x00\x01\xab\xec\ +\x00\x00\x09\xb4\x00\x00\x00\x00\x00\x01\x00\x01\xad\xf0\ \x00\x00\x01\x88v;G\x1f\ -\x00\x00\x16\xb2\x00\x00\x00\x00\x00\x01\x00\x03\xfa\xbe\ +\x00\x00\x16\xcc\x00\x00\x00\x00\x00\x01\x00\x03\xf5\x11\ \x00\x00\x01\x88v;F$\ -\x00\x00\x0a\x04\x00\x00\x00\x00\x00\x01\x00\x01\xc1\xf5\ +\x00\x00\x0a@\x00\x00\x00\x00\x00\x01\x00\x01\xc3\xf9\ \x00\x00\x01\x88v;FZ\ -\x00\x00\x05\xbc\x00\x00\x00\x00\x00\x01\x00\x00\xff\xb8\ +\x00\x00\x05\xf8\x00\x00\x00\x00\x00\x01\x00\x01\x01\xbc\ \x00\x00\x01\x88v;F\xd2\ -\x00\x00\x1f^\x00\x00\x00\x00\x00\x01\x00\x05z\x7f\ +\x00\x00\x1fx\x00\x00\x00\x00\x00\x01\x00\x05t\xd2\ \x00\x00\x01\x88v;F\x0b\ -\x00\x00\x06\xc0\x00\x00\x00\x00\x00\x01\x00\x01-\x03\ +\x00\x00\x06\xfc\x00\x00\x00\x00\x00\x01\x00\x01/\x07\ \x00\x00\x01\x88v;F\xd5\ -\x00\x00\x11\xe8\x00\x00\x00\x00\x00\x01\x00\x03*\x5c\ +\x00\x00\x12\x02\x00\x00\x00\x00\x00\x01\x00\x03$\xaf\ \x00\x00\x01\x88v;FR\ -\x00\x00\x0f\xd4\x00\x00\x00\x00\x00\x01\x00\x02\xd7\xca\ +\x00\x00\x0f\xee\x00\x00\x00\x00\x00\x01\x00\x02\xd2\x1d\ \x00\x00\x01\x88v;F\xb4\ -\x00\x00! \x00\x00\x00\x00\x00\x01\x00\x05\xbe\x03\ +\x00\x00!:\x00\x00\x00\x00\x00\x01\x00\x05\xb8V\ \x00\x00\x01\x88v;G \ -\x00\x00\x12\x5c\x00\x00\x00\x00\x00\x01\x00\x038\xd4\ +\x00\x00\x12v\x00\x00\x00\x00\x00\x01\x00\x033'\ \x00\x00\x01\x88v;FG\ -\x00\x00$\xf6\x00\x00\x00\x00\x00\x01\x00\x06u3\ +\x00\x00%\x10\x00\x00\x00\x00\x00\x01\x00\x06o\x86\ \x00\x00\x01\x88v;F\x22\ -\x00\x00)t\x00\x00\x00\x00\x00\x01\x00\x07G\x09\ +\x00\x00)\x8e\x00\x00\x00\x00\x00\x01\x00\x07A\x5c\ \x00\x00\x01\x88v;F\xa3\ -\x00\x00(\xd0\x00\x00\x00\x00\x00\x01\x00\x07(\xf4\ +\x00\x00(\xea\x00\x00\x00\x00\x00\x01\x00\x07#G\ \x00\x00\x01\x88v;G\x06\ -\x00\x00\x1eH\x00\x00\x00\x00\x00\x01\x00\x05F\x89\ +\x00\x00\x1eb\x00\x00\x00\x00\x00\x01\x00\x05@\xdc\ \x00\x00\x01\x88v;Fm\ -\x00\x00\x13`\x00\x00\x00\x00\x00\x01\x00\x03e\xc7\ +\x00\x00\x13z\x00\x00\x00\x00\x00\x01\x00\x03`\x1a\ \x00\x00\x01\x88v;FF\ -\x00\x00\x10\x98\x00\x00\x00\x00\x00\x01\x00\x02\xf6'\ +\x00\x00\x10\xb2\x00\x00\x00\x00\x00\x01\x00\x02\xf0z\ \x00\x00\x01\x88v;F\x11\ -\x00\x00\x08\x18\x00\x00\x00\x00\x00\x01\x00\x01p]\ +\x00\x00\x08T\x00\x00\x00\x00\x00\x01\x00\x01ra\ \x00\x00\x01\x88v;F\x12\ -\x00\x00)(\x00\x00\x00\x00\x00\x01\x00\x078W\ +\x00\x00)B\x00\x00\x00\x00\x00\x01\x00\x072\xaa\ \x00\x00\x01\x88v;F\x13\ -\x00\x00\x11\xb8\x00\x00\x00\x00\x00\x01\x00\x03\x22\xa7\ +\x00\x00\x11\xd2\x00\x00\x00\x00\x00\x01\x00\x03\x1c\xfa\ \x00\x00\x01\x88v;Fd\ -\x00\x00\x0a\xec\x00\x00\x00\x00\x00\x01\x00\x01\xef{\ +\x00\x00\x0b\x06\x00\x00\x00\x00\x00\x01\x00\x01\xe9\xce\ \x00\x00\x01\x88v;GI\ -\x00\x00\x1c\xc8\x00\x00\x00\x00\x00\x01\x00\x05\x0a\xe5\ +\x00\x00\x1c\xe2\x00\x00\x00\x00\x00\x01\x00\x05\x058\ \x00\x00\x01\x88v;FK\ -\x00\x00\x01z\x00\x00\x00\x00\x00\x01\x00\x00Ll\ +\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x00Np\ \x00\x00\x01\x88v;GF\ -\x00\x00\x15`\x00\x00\x00\x00\x00\x01\x00\x03\xbf\x8d\ +\x00\x00\x15z\x00\x00\x00\x00\x00\x01\x00\x03\xb9\xe0\ \x00\x00\x01\x88v;F:\ -\x00\x00\x1f\x0a\x00\x00\x00\x00\x00\x01\x00\x05l\x07\ +\x00\x00\x1f$\x00\x00\x00\x00\x00\x01\x00\x05fZ\ \x00\x00\x01\x88v;F\xde\ -\x00\x00\x0c\xc8\x00\x00\x00\x00\x00\x01\x00\x02I|\ +\x00\x00\x0c\xe2\x00\x00\x00\x00\x00\x01\x00\x02C\xcf\ \x00\x00\x01\x88v;F\xb0\ -\x00\x00\x15\x9c\x00\x00\x00\x00\x00\x01\x00\x03\xc75\ +\x00\x00\x15\xb6\x00\x00\x00\x00\x00\x01\x00\x03\xc1\x88\ \x00\x00\x01\x88v;GD\ -\x00\x00\x01\xa2\x00\x00\x00\x00\x00\x01\x00\x00Mh\ +\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00Ol\ \x00\x00\x01\x88v;F\xcf\ -\x00\x00\x0cV\x00\x00\x00\x00\x00\x01\x00\x022\xb8\ +\x00\x00\x0cp\x00\x00\x00\x00\x00\x01\x00\x02-\x0b\ \x00\x00\x01\x88v;FV\ -\x00\x00\x0c&\x00\x00\x00\x00\x00\x01\x00\x02+-\ +\x00\x00\x0c@\x00\x00\x00\x00\x00\x01\x00\x02%\x80\ \x00\x00\x01\x88v;F\xef\ -\x00\x00\x11\x80\x00\x00\x00\x00\x00\x01\x00\x03\x1b$\ +\x00\x00\x11\x9a\x00\x00\x00\x00\x00\x01\x00\x03\x15w\ \x00\x00\x01\x88v;FF\ -\x00\x00\x13\x1a\x00\x00\x00\x00\x00\x01\x00\x03V\xfa\ +\x00\x00\x134\x00\x00\x00\x00\x00\x01\x00\x03QM\ \x00\x00\x01\x88v;G0\ -\x00\x00\x0e\xd0\x00\x00\x00\x00\x00\x01\x00\x02\xab\x1f\ +\x00\x00\x0e\xea\x00\x00\x00\x00\x00\x01\x00\x02\xa5r\ \x00\x00\x01\x88v;G\x12\ -\x00\x00\x0f\xfe\x00\x00\x00\x00\x00\x01\x00\x02\xdf\x8e\ +\x00\x00\x10\x18\x00\x00\x00\x00\x00\x01\x00\x02\xd9\xe1\ \x00\x00\x01\x88v;FC\ -\x00\x00\x16\xde\x00\x00\x00\x00\x00\x01\x00\x04\x02\x09\ +\x00\x00\x16\xf8\x00\x00\x00\x00\x00\x01\x00\x03\xfc\x5c\ \x00\x00\x01\x88v;F\x16\ -\x00\x00\x0e$\x00\x00\x00\x00\x00\x01\x00\x02\x8c\xc4\ +\x00\x00\x0e>\x00\x00\x00\x00\x00\x01\x00\x02\x87\x17\ \x00\x00\x01\x88v;F\xbd\ -\x00\x00\x12\x22\x00\x00\x00\x00\x00\x01\x00\x031\x83\ +\x00\x00\x12<\x00\x00\x00\x00\x00\x01\x00\x03+\xd6\ \x00\x00\x01\x88v;F\xc0\ -\x00\x00\x1ep\x00\x00\x00\x00\x00\x01\x00\x05M\xfb\ +\x00\x00\x1e\x8a\x00\x00\x00\x00\x00\x01\x00\x05HN\ \x00\x00\x01\x88v;GB\ -\x00\x00\x19\x1e\x00\x00\x00\x00\x00\x01\x00\x04c\x97\ +\x00\x00\x198\x00\x00\x00\x00\x00\x01\x00\x04]\xea\ \x00\x00\x01\x88v;FJ\ -\x00\x00\x05\x06\x00\x00\x00\x00\x00\x01\x00\x00\xe2\xef\ +\x00\x00\x05B\x00\x00\x00\x00\x00\x01\x00\x00\xe4\xf3\ \x00\x00\x01\x88v;F\x03\ -\x00\x00\x1b\xf4\x00\x00\x00\x00\x00\x01\x00\x04\xdd\x90\ +\x00\x00\x1c\x0e\x00\x00\x00\x00\x00\x01\x00\x04\xd7\xe3\ \x00\x00\x01\x88v;G\x19\ -\x00\x00&<\x00\x00\x00\x00\x00\x01\x00\x06\xb8\xdf\ +\x00\x00&V\x00\x00\x00\x00\x00\x01\x00\x06\xb32\ \x00\x00\x01\x88v;F\xb5\ -\x00\x00\x19\x94\x00\x00\x00\x00\x00\x01\x00\x04r\xb7\ +\x00\x00\x19\xae\x00\x00\x00\x00\x00\x01\x00\x04m\x0a\ \x00\x00\x01\x88v;Fx\ -\x00\x00\x1c\x9e\x00\x00\x00\x00\x00\x01\x00\x05\x03v\ +\x00\x00\x1c\xb8\x00\x00\x00\x00\x00\x01\x00\x04\xfd\xc9\ \x00\x00\x01\x88v;G(\ -\x00\x00\x0d\x92\x00\x00\x00\x00\x00\x01\x00\x02n]\ +\x00\x00\x0d\xac\x00\x00\x00\x00\x00\x01\x00\x02h\xb0\ \x00\x00\x01\x88v;F\xff\ -\x00\x00\x17,\x00\x00\x00\x00\x00\x01\x00\x04\x10\xeb\ +\x00\x00\x17F\x00\x00\x00\x00\x00\x01\x00\x04\x0b>\ \x00\x00\x01\x88v;E\xf9\ -\x00\x00*b\x00\x00\x00\x00\x00\x01\x00\x07r\xf5\ +\x00\x00*|\x00\x00\x00\x00\x00\x01\x00\x07mH\ \x00\x00\x01\x88v;Fi\ -\x00\x00\x08\x96\x00\x00\x00\x00\x00\x01\x00\x01\x86Y\ +\x00\x00\x08\xd2\x00\x00\x00\x00\x00\x01\x00\x01\x88]\ \x00\x00\x01\x88v;F8\ -\x00\x00\x0fx\x00\x00\x00\x00\x00\x01\x00\x02\xc8\xe8\ +\x00\x00\x0f\x92\x00\x00\x00\x00\x00\x01\x00\x02\xc3;\ \x00\x00\x01\x88v;F\xc9\ -\x00\x00\x1b`\x00\x00\x00\x00\x00\x01\x00\x04\xc8\x03\ +\x00\x00\x1bz\x00\x00\x00\x00\x00\x01\x00\x04\xc2V\ \x00\x00\x01\x88v;F>\ -\x00\x00\x0b\x94\x00\x00\x00\x00\x00\x01\x00\x02\x0dr\ +\x00\x00\x0b\xae\x00\x00\x00\x00\x00\x01\x00\x02\x07\xc5\ \x00\x00\x01\x88v;F\xe2\ -\x00\x00\x18d\x00\x00\x00\x00\x00\x01\x00\x04E\xdb\ +\x00\x00\x18~\x00\x00\x00\x00\x00\x01\x00\x04@.\ \x00\x00\x01\x88v;F.\ -\x00\x00$ \x00\x00\x00\x00\x00\x01\x00\x06K\xf5\ +\x00\x00$:\x00\x00\x00\x00\x00\x01\x00\x06FH\ \x00\x00\x01\x88v;GK\ -\x00\x00\x1c6\x00\x00\x00\x00\x00\x01\x00\x04\xec\xbc\ +\x00\x00\x1cP\x00\x00\x00\x00\x00\x01\x00\x04\xe7\x0f\ \x00\x00\x01\x88v;F\x88\ -\x00\x00\x12\x8a\x00\x00\x00\x00\x00\x01\x00\x03@s\ +\x00\x00\x12\xa4\x00\x00\x00\x00\x00\x01\x00\x03:\xc6\ \x00\x00\x01\x88v;F?\ -\x00\x00\x08@\x00\x00\x00\x00\x00\x01\x00\x01w\xda\ +\x00\x00\x08|\x00\x00\x00\x00\x00\x01\x00\x01y\xde\ \x00\x00\x01\x88v;F\xb9\ -\x00\x00\x068\x00\x00\x00\x00\x00\x01\x00\x01\x16q\ +\x00\x00\x06t\x00\x00\x00\x00\x00\x01\x00\x01\x18u\ \x00\x00\x01\x88v;G9\ -\x00\x00\x1c\xfa\x00\x00\x00\x00\x00\x01\x00\x05\x12\x09\ +\x00\x00\x1d\x14\x00\x00\x00\x00\x00\x01\x00\x05\x0c\x5c\ \x00\x00\x01\x88v;Fy\ -\x00\x00\x14V\x00\x00\x00\x00\x00\x01\x00\x03\x8b8\ +\x00\x00\x14p\x00\x00\x00\x00\x00\x01\x00\x03\x85\x8b\ \x00\x00\x01\x88v;F\xd0\ -\x00\x00\x05\x94\x00\x00\x00\x00\x00\x01\x00\x00\xf8\xbc\ +\x00\x00\x05\xd0\x00\x00\x00\x00\x00\x01\x00\x00\xfa\xc0\ \x00\x00\x01\x88v;F\xf2\ -\x00\x00\x0b\xc0\x00\x00\x00\x00\x00\x01\x00\x02\x14\xfe\ +\x00\x00\x0b\xda\x00\x00\x00\x00\x00\x01\x00\x02\x0fQ\ \x00\x00\x01\x88v;F\xee\ -\x00\x00\x19\xd4\x00\x00\x00\x00\x00\x01\x00\x04\x81\xba\ +\x00\x00\x19\xee\x00\x00\x00\x00\x00\x01\x00\x04|\x0d\ \x00\x00\x01\x88v;F\xd7\ -\x00\x00\x1a\xc0\x00\x00\x00\x00\x00\x01\x00\x04\xafB\ +\x00\x00\x1a\xda\x00\x00\x00\x00\x00\x01\x00\x04\xa9\x95\ \x00\x00\x01\x88v;G,\ -\x00\x00\x0ex\x00\x00\x00\x00\x00\x01\x00\x02\x9c\x02\ +\x00\x00\x0e\x92\x00\x00\x00\x00\x00\x01\x00\x02\x96U\ \x00\x00\x01\x88v;F\xcd\ -\x00\x00\x02\x96\x00\x00\x00\x00\x00\x01\x00\x00z\xf9\ +\x00\x00\x02\xd2\x00\x00\x00\x00\x00\x01\x00\x00|\xfd\ \x00\x00\x01\x88v;F\xa9\ -\x00\x00\x07 \x00\x00\x00\x00\x00\x01\x00\x01C\xcd\ +\x00\x00\x07\x5c\x00\x00\x00\x00\x00\x01\x00\x01E\xd1\ \x00\x00\x01\x88v;F@\ -\x00\x00\x14\xc0\x00\x00\x00\x00\x00\x01\x00\x03\xa1\xef\ +\x00\x00\x14\xda\x00\x00\x00\x00\x00\x01\x00\x03\x9cB\ \x00\x00\x01\x88v;F\x93\ -\x00\x00\x0db\x00\x00\x00\x00\x00\x01\x00\x02gJ\ +\x00\x00\x0d|\x00\x00\x00\x00\x00\x01\x00\x02a\x9d\ \x00\x00\x01\x88v;F\x9c\ -\x00\x00\x1e\xf2\x00\x00\x00\x00\x00\x01\x00\x05d\xcf\ +\x00\x00\x1f\x0c\x00\x00\x00\x00\x00\x01\x00\x05_\x22\ \x00\x00\x01\x88v;GA\ -\x00\x00&\xa2\x00\x00\x00\x00\x00\x01\x00\x06\xc7\xc8\ +\x00\x00&\xbc\x00\x00\x00\x00\x00\x01\x00\x06\xc2\x1b\ \x00\x00\x01\x88v;G\x09\ -\x00\x00\x0f\x1e\x00\x00\x00\x00\x00\x01\x00\x02\xb9\xe2\ +\x00\x00\x0f8\x00\x00\x00\x00\x00\x01\x00\x02\xb45\ \x00\x00\x01\x88v;Fg\ -\x00\x00$\xaa\x00\x00\x00\x00\x00\x01\x00\x06fs\ +\x00\x00$\xc4\x00\x00\x00\x00\x00\x01\x00\x06`\xc6\ \x00\x00\x01\x88v;F\x91\ -\x00\x00\x0c\x06\x00\x00\x00\x00\x00\x01\x00\x02#\xa5\ +\x00\x00\x0c \x00\x00\x00\x00\x00\x01\x00\x02\x1d\xf8\ \x00\x00\x01\x88v;F\xd3\ -\x00\x00\x1d\xcc\x00\x00\x00\x00\x00\x01\x00\x057;\ +\x00\x00\x1d\xe6\x00\x00\x00\x00\x00\x01\x00\x051\x8e\ \x00\x00\x01\x88v;G+\ -\x00\x00\x19P\x00\x00\x00\x00\x00\x01\x00\x04k(\ +\x00\x00\x19j\x00\x00\x00\x00\x00\x01\x00\x04e{\ \x00\x00\x01\x88v;F^\ -\x00\x00\x1dT\x00\x00\x00\x00\x00\x01\x00\x05 \xce\ +\x00\x00\x1dn\x00\x00\x00\x00\x00\x01\x00\x05\x1b!\ \x00\x00\x01\x88v;F\xe3\ -\x00\x00\x18\x16\x00\x00\x00\x00\x00\x01\x00\x046\xf2\ +\x00\x00\x180\x00\x00\x00\x00\x00\x01\x00\x041E\ \x00\x00\x01\x88v;F\xf1\ -\x00\x00\x08l\x00\x00\x00\x00\x00\x01\x00\x01\x7f\x15\ +\x00\x00\x08\xa8\x00\x00\x00\x00\x00\x01\x00\x01\x81\x19\ \x00\x00\x01\x88v;F\xba\ -\x00\x00\x096\x00\x00\x00\x00\x00\x01\x00\x01\x9d\x0b\ +\x00\x00\x09r\x00\x00\x00\x00\x00\x01\x00\x01\x9f\x0f\ \x00\x00\x01\x88v;G\x08\ " diff --git a/src/CaptDeviceControl/view/AD2CaptDeviceView.py b/src/CaptDeviceControl/view/AD2CaptDeviceView.py index eb5aab560f8392234d05e546e354982dea2486af..f096209787ac820ecd93158957d5acf6b058f672 100644 --- a/src/CaptDeviceControl/view/AD2CaptDeviceView.py +++ b/src/CaptDeviceControl/view/AD2CaptDeviceView.py @@ -15,17 +15,9 @@ from rich.logging import RichHandler from CaptDeviceControl.controller.BaseAD2CaptDevice import BaseAD2CaptDevice from CaptDeviceControl.model.AD2CaptDeviceModel import AD2CaptDeviceModel from CaptDeviceControl.model.AD2Constants import AD2Constants -from CaptDeviceControl.view.Ui_AD2ControlWindow import Ui_AD2ControlWindow from CaptDeviceControl.view.Ui_AD2ControlWindowNew import Ui_AD2ControlWindowNew from CaptDeviceControl.view.widget.WidgetCapturingInformation import WidgetCapturingInformation, WidgetDeviceInformation - -from CaptDeviceControl.constants.dwfconstants import DwfStateReady, DwfStateConfig, DwfStatePrefill, DwfStateArmed, \ - DwfStateWait, \ - DwfStateTriggered, DwfStateRunning, DwfStateDone -from fswidgets import PlayPushButton - from model.submodels.AD2CaptDeviceAnalogInModel import AD2CaptDeviceAnalogInModel -from model.submodels.AD2CaptDeviceCapturingModel import AD2CaptDeviceCapturingModel class ControlWindow(QMainWindow): @@ -44,9 +36,6 @@ class ControlWindow(QMainWindow): self._ui = Ui_AD2ControlWindowNew() self._ui.setupUi(self) - # self._ui.btn_start_capture = PlayPushButton(self._ui.btn_start_capture) - - # self.capt_info = WidgetCapturingInformation() self.dev_info = WidgetDeviceInformation() @@ -68,10 +57,6 @@ class ControlWindow(QMainWindow): self.stream_update_timer = QTimer() self.stream_update_timer.setInterval(40) self.stream_update_timer.timeout.connect(self._on_stream_update_timer_timeout) - # self.stream_update_timer.start() - - self.stream_samples_frequency = 1000 - self.stream_n = 1 # Connect the signals and controls self._connect_config_properties() @@ -80,39 +65,59 @@ class ControlWindow(QMainWindow): # self._init_other_ui_elements() # self._ui.cb_duration_streaming_history.setCurrentIndex(5) - self.controller.discover_connected_devices() + self._ui.sb_acquisition_rate.setValue(self.model.capturing_information.sample_rate) # self._ui.cb_duration_streaming_history.set(self.model.capturing_information.streaming_history) # ================================================================================================================== # # ================================================================================================================== + def _init_UI_live_plot(self): + area = DockArea() + + d1 = Dock("Analog Discovery 2") + area.addDock(d1, 'top') + + d2 = Dock("Captured Data") + area.addDock(d2, 'bottom') + + self.scope_original = pg.PlotWidget(title="AD2 Acquisition") + self.scope_original.plotItem.showGrid(x=True, y=True, alpha=1) + d1.addWidget(self.scope_original) + self.scope_original.setYRange(-1.5, 1.5, padding=0) + + self.scope_captured = pg.PlotWidget(title="Captured Data") + self.scope_captured.plotItem.showGrid(x=True, y=True, alpha=1) + d2.addWidget(self.scope_captured) + + return area + # ================================================================================================================== + # + # ================================================================================================================== def _add_menues(self): pass def _connect_config_properties(self): # Connect the Controls that are also Settings self.model.ad2captdev_config.streaming_history.view.add_new_view(self._ui.cb_streaming_history) - - # Selected Analog IN Channel + self.model.ad2captdev_config.sample_rate.view.add_new_view(self._ui.sb_acquisition_rate) + # Selected Analog In Channel self.model.ad2captdev_config.ain_channel.view.add_new_view(self._ui.cb_channel_select) - # self.model.ad2captdev_config.ain_channel.connect_property( - # self.model.analog_in, AD2CaptDeviceAnalogInModel.selected_ain_channel, - # ) + #self.model.ad2captdev_config.ain_channel.connect(self._ui_on_selected_ain_changed) + + #self.model.ad2captdev_config.selected_device_index.view.add_new_view(self._ui.cb_device_select) def _connect_controls(self): - self._ui.cb_device_select.currentIndexChanged.connect(self._on_ui_selected_index_changed) + self._ui.cb_device_select.currentIndexChanged.connect(self._on_ui_selected_device_index_changed) self._ui.btn_connect.clicked.connect(self._on_ui_btn_connect_clicked) self._ui.sb_acquisition_rate.valueChanged.connect(self._on_ui_sample_rate_changed) # Connect the buttons - #self._ui.btn_stop.clicked.connect(self.on_btn_stop_clicked) self._ui.btn_play.clicked.connect( - lambda: self.controller.start_capturing_process( - self.model.capturing_information.sample_rate, - self.model.analog_in.selected_ain_channel) + lambda: self.controller.start_capturing_process(self.model.capturing_information.sample_rate, + self.model.analog_in.selected_ain_channel) ) self._ui.btn_record.clicked.connect(self._ui_on_btn_recording_clicked) self._ui.btn_reset.clicked.connect(self._ui_on_btn_reset_clicked) @@ -121,49 +126,24 @@ class ControlWindow(QMainWindow): def _connect_signals(self): self.model.signals.dwf_version_changed.connect(self._on_dwf_version_changed) - self.model.device_information.signals.connected_devices_changed.connect(self._on_connected_devices_changed) self.model.device_information.signals.device_state_changed.connect(self._on_device_state_changed) self.model.device_information.signals.device_connected_changed.connect(self._on_connected_changed) self.model.capturing_information.signals.sample_rate_changed.connect(self._on_model_sample_rate_changed) self.model.capturing_information.signals.device_capturing_state_changed.connect( self._on_capture_process_state_changed) + self.model.analog_in.signals.selected_ain_channel_changed.connect(self._on_selected_ain_channel_changed) # # WaveForms Runtime (DWF) Information # # Connected Device Information - # self.model.device_information.signals.num_of_connected_devices_changed.connect(self._on_num_of_connected_devices_changed) - # #self.model.device_information.signals.discovered_devices_changed.connect(self._on_connected_devices_changed) - # Device information self.model.device_information.signals.device_name_changed.connect(self._on_device_name_changed) self.model.device_information.signals.device_serial_number_changed.connect( self._on_device_serial_number_changed) - # self.model.device_information.signals.device_index_changed.connect(self._on_device_index_changed) - # self.model.device_information.selected_device_index_changed.connect(self._on_selected_device_index_changed) - # # Acquisition Settings - # self.model.capturing_information.signals.streaming_history.connect(self.) - # # Analog In Information - # self.model.analog_in.signals.selected_ain_channel_changed.connect(self._model_on_selected_ain_changed) - # self.model.analog_in.signals.ain_channels_changed.connect(self._on_ain_channels_changed) - # self.model.analog_in.signals.ain_buffer_size_changed.connect(self._on_ain_buffer_size_changed) - # self.model.analog_in.signals.ain_bits_changed.connect(self._on_ain_bits_changed) - # self.model.analog_in.signals.ain_device_state_changed.connect(self._on_ain_device_state_changed) - # # Analog Out Information - # self.model.signals.aout_channels_changed.connect(self._on_aout_channels_changed) - # # Acquired Signal Information - # #self.model.signals.recorded_samples_changed.connect(self._on_recorded_samples_changed) - # #self.model.signals.recording_time_changed.connect(self._on_recording_time_changed) - # #self.model.signals.samples_captured_changed.connect(self._on_samples_captured_changed) - # self.model.signals.samples_lost_changed.connect(self._on_samples_lost_changed) - # self.model.signals.samples_corrupted_changed.connect(self._on_samples_corrupted_changed) - # # Recording Flags (starting, stopping and pausing) - # self.model.signals.device_capturing_state_changed.connect(self._on_device_capturing_state_changed) - # self.model.signals.start_recording_changed.connect(self._on_start_recording_changed) - # self.model.signals.stop_recording_changed.connect(self._on_stop_recording_changed) - # self.model.signals.reset_recording_changed.connect(self._on_reset_recording_changed) - # # Multiprocessing Information - # self.model.signals.pid_changed.connect(self._on_pid_changed) - # # Plotting Timer (periodically updating the plot) - # # self.capture_update_timer.timeout.connect(self._on_capture_update_plot) + + # ================================================================================================================== + # Slots + # ================================================================================================================== + def _on_dwf_version_changed(self, dwf_version): """ @@ -178,12 +158,13 @@ class ControlWindow(QMainWindow): :param connected_devices: :return: """ + selection_index = self.model.device_information.selected_device_index self._ui.cb_device_select.clear() for it, dev in enumerate(connected_devices): dev: dict # 'type': type, 'device_id', 'device_name', 'serial_number' self._ui.cb_device_select.addItem(f"{it}: {dev['type']}{dev['device_id']} - {dev['device_name']}") - self._ui.cb_device_select.setCurrentIndex(0) + self._ui.cb_device_select.setCurrentIndex(selection_index) def _on_device_state_changed(self, capturing): if capturing == AD2Constants.DeviceState.ACQ_NOT_STARTED(): @@ -217,6 +198,12 @@ class ControlWindow(QMainWindow): # ================================================================================================================== # UI Slots # ================================================================================================================== + def _on_ui_selected_device_index_changed(self, index): + self.controller.set_selected_device(index) + + def _ui_on_selected_ain_changed(self, channel_index): + """ Gets called if the ui changes the field (should modify the model) """ + self.model.analog_in.selected_ain_channel = channel_index def _on_ui_btn_connect_clicked(self): if self.model.device_information.device_connected: self.controller.close_device() @@ -239,21 +226,27 @@ class ControlWindow(QMainWindow): self._ui.sb_acquisition_rate.setValue(sample_rate) def _ui_on_btn_recording_clicked(self): - if self._ui.btn_record.isChecked(): - print("Start Recording") + if not self.model.capturing_information.device_capturing_state == AD2Constants.CapturingState.RUNNING(): + self._ui.btn_record.setChecked(True) self.capture_update_timer.start() self.controller.start_capture() else: - print("Stop Recording") - #self._ui.btn_record.setChecked(False) + self._ui.btn_record.setChecked(False) self.controller.stop_capture() def _ui_on_btn_reset_clicked(self): + self.scope_captured.clear() self.controller.reset_capture() # ================================================================================================================== # Device information changed # ================================================================================================================== + def _on_selected_ain_channel_changed(self, channel): + self.controller.set_selected_ain_channel(channel) + + def _on_selected_index_changed(self, index): + self._ui.cb_channel_select.setCurrentIndex(index) + def _on_connected_changed(self, connected): if connected: self.capt_info.lbl_conn_state.setText("Connected") @@ -309,74 +302,47 @@ class ControlWindow(QMainWindow): + def _on_device_name_changed(self, device_name): + self.dev_info.device_name = device_name + def _on_device_serial_number_changed(self, serial_number): + self.dev_info.serial_number = serial_number - # ================================================================================================================== - # - # ================================================================================================================== - def _init_UI_live_plot(self): - area = DockArea() - - d1 = Dock("Analog Discovery 2") - area.addDock(d1, 'top') - - d2 = Dock("Captured Data") - area.addDock(d2, 'bottom') + # ============== Plotting + def _on_capture_update_plot(self): - self.scope_original = pg.PlotWidget(title="AD2 Acquisition") - self.scope_original.plotItem.showGrid(x=True, y=True, alpha=1) - d1.addWidget(self.scope_original) - self.scope_original.setYRange(-1.5, 1.5, padding=0) + if len(self.model.capturing_information.recorded_samples) > 0: + self.scope_captured.clear() + # print(self.ad2device.recorded_samples) + d = self.model.capturing_information.recorded_samples + self.scope_captured.plot(d, pen=pg.mkPen(width=1)) + # print(f"Length: {len(self.controller.recorded_sample_stream)}") - self.scope_captured = pg.PlotWidget(title="Captured Data") - self.scope_captured.plotItem.showGrid(x=True, y=True, alpha=1) - d2.addWidget(self.scope_captured) + #if len(self.controller.status_dqueue) > 0: + # print(self.controller.status_dqueue) + # self.model.samples_captured = self.controller.status_dqueue[-1]["captured"] + # self.model.samples_lost = d[1]["lost"] + # self.model.samples_corrupted = d[1]["corrupted"] + #self._ui.lcd_unconsumed_capture.display(self.model.unconsumed_capture_samples) - return area + def _on_stream_update_timer_timeout(self): + self.scope_original.clear() + # print(self.ad2device.recorded_samples) - # def _init_other_ui_elements(self): - # self._ui.cb_duration_streaming_history.addItem("100ms", 0.1) - # self._ui.cb_duration_streaming_history.addItem("200ms", 0.2) - # self._ui.cb_duration_streaming_history.addItem("500ms", 0.5) - # self._ui.cb_duration_streaming_history.addItem("1s", 1) - # self._ui.cb_duration_streaming_history.addItem("2s", 2) - # self._ui.cb_duration_streaming_history.addItem("5s", 5) - ## self._ui.cb_duration_streaming_history.addItem("10s", 10) - # self._ui.cb_duration_streaming_history.addItem("20s", 20) - # self._ui.cb_duration_streaming_history.addItem("30s", 30) - # self._ui.cb_duration_streaming_history.addItem("1min", 60) - # self._ui.cb_duration_streaming_history.addItem("2min", 120) - # self._ui.cb_duration_streaming_history.addItem("5min", 300) + self.scope_original.plot( + np.array(self.controller.streaming_dqueue), # [::100], + pen=pg.mkPen(width=1)) + # self._ui.lcd_unconsumed_stream.display(self.model.capturing_information.unconsumed_stream_samples) - # ================================================================================================================== - # Slots for Model - # ================================================================================================================== - def _on_ui_selected_index_changed(self, index): - self.controller.selected_device_index(index) - # self.controller.device_selected_index_changed() - # self.controller.mpcaptdevicecontrol.selected_device_index(index) - # First populate the AIn box+ - # m: dict = self.model.connected_devices[index] - # self.model.ain_channels = list(range(0, int(m['analog_in_channels']))) # ============== Connected Device Information def _on_num_of_connected_devices_changed(self, num_of_connected_devices): pass - def _on_device_name_changed(self, device_name): - self.dev_info.device_name = device_name - # self.ad2_settings['Device Name'] = device_name - self.update_ad2_settings_list_view() - - def _on_device_serial_number_changed(self, serial_number): - self.dev_info.serial_number = serial_number - # self.ad2_settings['Serial Number'] = serial_number - self.update_ad2_settings_list_view() - # ============== Acquisition Settings def _model_on_selected_ain_changed(self, channel): @@ -384,13 +350,8 @@ class ControlWindow(QMainWindow): self._on_selected_ain_channel_changed(channel) self._ui.cb_channel_select.setCurrentIndex(channel) - def _ui_on_selected_ain_changed(self, channel): - """ Gets called if the ui changes the field (should modify the model) """ - self._on_selected_ain_channel_changed(channel) - self.model.selected_ain_channel = channel - def _on_selected_ain_channel_changed(self, channel): - self.dev_info.analog_in_channel = channel + # ============== Analog In Information def _on_ain_channels_changed(self, list_of_ad_ins): @@ -404,71 +365,6 @@ class ControlWindow(QMainWindow): def _on_ain_bits_changed(self, bits): pass - def _on_ain_device_state_changed(self, device_state): - if device_state == int(DwfStateReady.value): - self.capt_info.lbl_device_state.setText(f"Ready ({device_state})") - self.capt_info.led_device_state.set_color(color="green") - # self.ad2_settings['Device State'] = f"Ready ({device_state})" - elif device_state == int(DwfStateConfig.value): - self.capt_info.lbl_device_state.setText(f"Config ({device_state})") - self.capt_info.led_device_state.set_color(color="yellow") - # self.ad2_settings['Device State'] = f"Config ({device_state})" - elif device_state == int(DwfStatePrefill.value): - self.capt_info.lbl_device_state.setText(f"Prefill ({device_state})") - self.capt_info.led_device_state.set_color(color="yellow") - # self.ad2_settings['Device State'] = f"Prefill ({device_state})" - elif device_state == int(DwfStateArmed.value): - self.capt_info.lbl_device_state.setText(f"Armed ({device_state})") - self.capt_info.led_device_state.set_color(color="blue") - # self.ad2_settings['Device State'] = f"Armed ({device_state})" - elif device_state == int(DwfStateWait.value): - self.capt_info.lbl_device_state.setText(f"Wait ({device_state})") - self.capt_info.led_device_state.set_color(color="red") - # self.ad2_settings['Device State'] = f"Wait ({device_state})" - elif device_state == int(DwfStateTriggered.value): - self.capt_info.lbl_device_state.setText(f"Triggered ({device_state})") - self.capt_info.led_device_state.set_color(color="green") - # self.ad2_settings['Device State'] = f"Triggered ({device_state})" - elif device_state == int(DwfStateRunning.value): - self.capt_info.lbl_device_state.setText(f"Running ({device_state})") - self.capt_info.led_device_state.set_color(color="green") - # self.ad2_settings['Device State'] = f"Running ({device_state})" - elif device_state == int(DwfStateDone.value): - self.capt_info.lbl_device_state.setText(f"Done ({device_state})") - self.capt_info.led_device_state.set_color(color="yellow") - # self.ad2_settings['Device State'] = f"Done ({device_state})" - elif device_state == -1: - self.capt_info.lbl_device_state.setText(f"Disconnected ({device_state})") - self.capt_info.led_device_state.set_color(color="black") - # self.ad2_settings['Device State'] = f"Disconnected ({device_state})" - else: - self.capt_info.lbl_device_state.setText(f" >>> Unknown ({device_state})") - self.capt_info.led_device_state.set_color(color="gray") - # self.ad2_settings['Device State'] = f"Unknown ({device_state})" - # self.update_ad2_settings_list_view() - - # ============== Analog Out Information - def _on_aout_channels_changed(self, list_of_ad_outs): - pass - - # ============== Acquired Signal Information - def _on_recorded_samples_changed(self, recorded_samples): - pass - # print(recorded_samples) - # self._ui.lcd_captured_samples.display(len(recorded_samples)) - - def _on_recording_time_changed(self, recording_time): - self._ui.lcd_sampled_time.display(recording_time) - - def _on_samples_captured_changed(self, samples_captured): - self._ui.lcd_captured_samples.display(samples_captured) - self._ui.lcd_total_captured_samples.display(len(self.model.recorded_samples)) - - def _on_samples_lost_changed(self, samples_lost): - self._ui.lcd_samples_lost.display(samples_lost) - - def _on_samples_corrupted_changed(self, samples_corrupted): - self._ui.lcd_samples_corrupted.display(samples_corrupted) def _on_start_recording_changed(self, start_recording): self.logger.debug(f"Start Recording: {start_recording}") @@ -494,81 +390,9 @@ class ControlWindow(QMainWindow): def _on_reset_recording_changed(self, reset_recording): pass - # ============== Multiprocessing Information - def _on_pid_changed(self, pid): - pass - # ============== Plotting - def _on_capture_update_plot(self): - if len(self.model.capturing_information.recorded_samples) > 0: - self.scope_captured.clear() - # print(self.ad2device.recorded_samples) - d = self.model.capturing_information.recorded_samples[::self.stream_n] - self.scope_captured.plot( - x=np.arange(0, len(d)) / self.stream_samples_frequency, - y=d, pen=pg.mkPen(width=1) - ) - # print(f"Length: {len(self.controller.recorded_sample_stream)}") - #if len(self.controller.status_dqueue) > 0: - # print(self.controller.status_dqueue) - # self.model.samples_captured = self.controller.status_dqueue[-1]["captured"] - # self.model.samples_lost = d[1]["lost"] - # self.model.samples_corrupted = d[1]["corrupted"] - #self._ui.lcd_unconsumed_capture.display(self.model.unconsumed_capture_samples) - - def _on_stream_update_timer_timeout(self): - self.scope_original.clear() - # print(self.ad2device.recorded_samples) - - self.scope_original.plot( - np.array(self.controller.streaming_dqueue), # [::100], - pen=pg.mkPen(width=1)) - # self._ui.lcd_unconsumed_stream.display(self.model.capturing_information.unconsumed_stream_samples) - - # ================================================================================================================== - # - # ================================================================================================================== - - - def closeEvent(self, event): - super(ControlWindow, self).closeEvent(event) - - # def _on_cb_duration_streaming_history_currentIndexChanged(self, index):# - # self.model.duration_streaming_history = self._ui.cb_duration_streaming_history.currentData() - # self.controller.streaming_dqueue = deque( - # maxlen=int( - # self.model.duration_streaming_history * - # self.model.capturing_information.streaming_history)) - - # ================================================================================================================== - # - # ================================================================================================================== - def update_ad2_settings_list_view(self): - item_model = QStandardItemModel() - # self.treeview.setModel(item_model) - # self._populate_model(self.model, self.ad2_settings) - - def _populate_model(self, parent, data): - """ - Recursively populate QStandardItemModel with YAML data - """ - if isinstance(data, dict): - for key, value in data.items(): - item = QStandardItem(str(key)) - parent.appendRow(item) - self._populate_model(item, value) - elif isinstance(data, list): - for value in data: - item = QStandardItem(str(value)) - parent.appendRow(item) - # self._populate_model(item, str(data)) - elif isinstance(data, logging.Logger): - pass - else: - item = QStandardItem(str(data)) - parent.appendRow(item) def closeEvent(self, args): print("Destroyed") diff --git a/src/CaptDeviceControl/view/Ui_AD2ControlWindowNew.py b/src/CaptDeviceControl/view/Ui_AD2ControlWindowNew.py index 53b57573393d6a1d4435af62e9da99450379b1c5..a8006dcd51366cfe09afd5548c8837c1f8e90b86 100644 --- a/src/CaptDeviceControl/view/Ui_AD2ControlWindowNew.py +++ b/src/CaptDeviceControl/view/Ui_AD2ControlWindowNew.py @@ -20,7 +20,6 @@ from PySide6.QtWidgets import (QApplication, QComboBox, QFormLayout, QFrame, QMainWindow, QMenuBar, QPushButton, QSizePolicy, QSpinBox, QToolButton, QWidget) import resources_rc -import resources_rc class Ui_AD2ControlWindowNew(object): def setupUi(self, AD2ControlWindowNew): @@ -641,6 +640,8 @@ class Ui_AD2ControlWindowNew(object): self.sb_acquisition_rate = QSpinBox(self.grd_controls) self.sb_acquisition_rate.setObjectName(u"sb_acquisition_rate") + self.sb_acquisition_rate.setMinimum(1) + self.sb_acquisition_rate.setMaximum(999999999) self.gridLayout_3.addWidget(self.sb_acquisition_rate, 0, 2, 1, 1) @@ -796,7 +797,7 @@ class Ui_AD2ControlWindowNew(object): self.btn_record = QPushButton(self.horizontalFrame) self.btn_record.setObjectName(u"btn_record") - self.btn_record.setEnabled(True) + self.btn_record.setEnabled(False) self.btn_record.setMinimumSize(QSize(40, 40)) self.btn_record.setMaximumSize(QSize(40, 40)) self.btn_record.setBaseSize(QSize(40, 40)) @@ -826,10 +827,13 @@ class Ui_AD2ControlWindowNew(object): "\n" "QPushButton:checked { \n" " background-color: rgb(78, 47, 58);\n" +" icon: url(:/single-color/icons-svg/single_color/cil-media-play.svg);\n" +" background-color: rgb(183, 0, 0);\n" "}\n" "") icon3 = QIcon() icon3.addFile(u":/icons-svg/icons-svg/cil-media-record.svg", QSize(), QIcon.Normal, QIcon.Off) + icon3.addFile(u":/single-color/icons-svg/single_color/cil-media-play.svg", QSize(), QIcon.Selected, QIcon.On) self.btn_record.setIcon(icon3) self.btn_record.setCheckable(True) self.btn_record.setChecked(False)