def check(self):
        alerts = super().check()

        if self.range_length < 1e-6:
            alerts.append(
                cb.Warning("range_interval",
                           "Will only return a single point"))

        if self.downsampling_factor not in [1, 2, 4]:
            alerts.append(cb.Error("downsampling_factor",
                                   "Must be 1, 2, or 4"))

        if self.repetition_mode == __class__.RepetitionMode.SENSOR_DRIVEN:
            chunks = self.range_length / 0.06
            chunks += 2 if self.mode == Mode.IQ else 0
            points_per_chunk = 124 / self.downsampling_factor
            if points_per_chunk * chunks > 2048:
                alerts.append(
                    cb.Error("range_interval", "Too large for buffer"))

        if self.power_save_mode == __class__.PowerSaveMode.HIBERNATE:
            alerts.append(
                cb.Error("power_save_mode", "Not supported for this service"))

        return alerts
Ejemplo n.º 2
0
    def check(self):
        alerts = super().check()

        if self.range_length < self._MIN_BIN_SIZE:
            alerts.append(cb.Error("range_interval", "Too short"))
        elif self.range_length / self.bin_count < self._MIN_BIN_SIZE:
            alerts.append(cb.Error("bin_count", "Too high for current range"))

        return alerts
    def check_sensor_config(self, conf):
        alerts = []

        if conf.update_rate is None:
            alerts.append(configbase.Error("update_rate", "Must be set"))

        if not conf.sweeps_per_frame > 3:
            alerts.append(configbase.Error("sweeps_per_frame", "Must be > 3"))

        return alerts
    def check(self):
        alerts = super().check()

        if self.range_start < (0.06 - 1e-6):
            alerts.append(cb.Error("range_interval",
                                   "Start must be >= 0.06 m"))

        if self.sampling_mode == __class__.SamplingMode.B:
            alerts.append(
                cb.Error("sampling_mode", "IQ sampling mode B is removed"))

        return alerts
    def check(self):
        alerts = super().check()

        if self.range_start < (0.06 - 1e-6):
            alerts.append(cb.Error("range_interval", "Start must be >= 0.06 m"))

        return alerts
    def check_sensor_config(self, sensor_config):
        alerts = []

        if sensor_config.update_rate is None:
            alerts.append(configbase.Error("update_rate", "Must be set"))

        if not sensor_config.noise_level_normalization:
            alerts.append(
                configbase.Error("noise_level_normalization", "Must be set"))

        if self.depth_leak_sample < sensor_config.range_start \
           or self.depth_leak_sample > sensor_config.range_end:
            alerts.append(
                configbase.Error(
                    "range_interval",
                    "Leak sample position outside the range interval"))

        return alerts
    def check(self):
        alerts = []

        if self.depth_leak_sample >= self.depth_leak_end:
            alerts.append(
                configbase.Error("depth_leak_sample",
                                 "Must be less than the leak end position"))

        return alerts
    def check(self):
        alerts = super().check()

        if self.sampling_mode == __class__.SamplingMode.B:
            if self.sweeps_per_frame > 64:
                alerts.append(cb.Error("sweeps_per_frame", "Must be < 64 with sampling mode B"))

        if self.sweep_rate is not None and self.update_rate is not None:
            max_frame_rate = self.sweep_rate / self.sweeps_per_frame

            if self.update_rate > max_frame_rate:
                alerts.append(cb.Error("sweep_rate", "Too low for current update rate"))

        # Pessimistic buffer size check
        start_p = int(round(self.range_start / 0.06 - 0.01))
        end_p = int(round(self.range_end / 0.06 + 0.01))
        sweep_size = (end_p - start_p) // self.downsampling_factor + 1
        if sweep_size * self.sweeps_per_frame > 2048:
            alerts.append(cb.Error("range_interval", "Too long for buffer"))

        return alerts
    def check(self):
        alerts = []

        if self.repetition_mode == __class__.RepetitionMode.SENSOR_DRIVEN:
            if self.update_rate is None:
                alerts.append(cb.Error("update_rate", "Must be set when sensor driven"))

        if self.gain > 0.9:
            alerts.append(cb.Warning("gain", "Too high gain causes degradation"))

        if self.range_start < self.profile.approx_direct_leakage_length:
            alerts.append(cb.Info("range_interval", "Direct leakage might be seen"))

        return alerts
    def check_sensor_config(self, sensor_config):
        alerts = []

        if sensor_config.update_rate is None:
            alerts.append(configbase.Error("update_rate", "Must be set"))

        if not sensor_config.noise_level_normalization:
            if self.threshold_type == self.ThresholdType.FIXED:
                alerts.append(
                    configbase.Warning(
                        "noise_level_normalization",
                        ("Enabling noise level normalization is "
                         "recommended with Fixed threshold")))

        return alerts
    def check(self):
        alerts = []

        if self.repetition_mode == __class__.RepetitionMode.SENSOR_DRIVEN:
            msg = "Must be set when sensor driven"

            if self.update_rate is None:
                alerts.append(cb.Error("update_rate", msg))

            if not self.asynchronous_measurement:
                alerts.append(cb.Error("asynchronous_measurement", msg))

        if self.gain > 0.9:
            alerts.append(
                cb.Warning("gain", "Too high gain causes degradation"))

        if self.range_start < self.profile.approx_direct_leakage_length:
            alerts.append(
                cb.Info("range_interval", "Direct leakage might be seen"))

        if self.power_save_mode == __class__.PowerSaveMode.HIBERNATE:
            alerts.append(
                cb.Warning("power_save_mode", "Limited hardware support"))

            if self.repetition_mode == __class__.RepetitionMode.SENSOR_DRIVEN:
                alerts.append(
                    cb.Error("power_save_mode",
                             "Unavailable when sensor driven"))

        psms = [__class__.PowerSaveMode.HIBERNATE, __class__.PowerSaveMode.OFF]
        if self.power_save_mode in psms:
            if self.asynchronous_measurement:
                msg = "PSM hibernate/off is always synchronous"
                alerts.append(cb.Info("asynchronous_measurement", msg))

        return alerts
    def _update(self, *args, **kwargs):
        super()._update(*args, **kwargs)

        config = self._get_param_value()

        if config.is_loaded:
            enabled = config.source == "buffer"
            text = "Save" if enabled else "Already saved"
        else:
            enabled = config.has_buffered

            if config.has_buffered:
                text = "Use measured"
            else:
                if self._parent_instance._state == cb.Config.State.LIVE:
                    text = "Measuring..."
                else:
                    text = "Waiting..."

        self.buffer_btn.setEnabled(enabled)
        self.buffer_btn.setText(text)

        text = "Unload" if config.is_loaded else "Load from file"
        self.load_btn.setText(text)

        if config.is_loaded:
            if config.source == "file":
                text = "Loaded {}".format(config.source_file)
            else:
                text = "Loaded measured data"
        else:
            text = ""

        self.info_label.setText(text)
        self.info_label.setVisible(config.is_loaded)

        self.use_cb.setEnabled(not config.error)
        self.use_cb.setChecked(False if config.error else config.use)
        self.use_cb.setVisible(config.is_loaded)

        if config.error:
            self._set_alert(cb.Error(None, config.error))
        else:
            self._set_alert(None)