示例#1
0
文件: ProtocoLabel.py 项目: yarda/urh
    def from_xml(cls, tag: ET.Element, field_types_by_caption=None):
        """

        :param tag:
        :type field_types_by_caption: dict[str, FieldType]
        :return:
        """
        field_types_by_caption = dict() if field_types_by_caption is None else field_types_by_caption

        name = tag.get("name")
        start, end = int(tag.get("start", 0)), int(tag.get("end", 0)) - 1
        color_index = int(tag.get("color_index", 0))

        result = ProtocolLabel(name=name, start=start, end=end, color_index=color_index)
        result.apply_decoding = True if tag.get("apply_decoding", 'True') == "True" else False
        result.show = Qt.Checked if Formatter.str2val(tag.get("show", 0), int) else Qt.Unchecked
        result.fuzz_me = Qt.Checked if Formatter.str2val(tag.get("fuzz_me", 0), int) else Qt.Unchecked
        result.fuzz_values = tag.get("fuzz_values", "").split(",")
        result.display_format_index = int(tag.get("display_format_index", 0))
        result.auto_created = True if tag.get("auto_created", 'False') == "True" else False

        if result.name in field_types_by_caption:
            result.field_type = field_types_by_caption[result.name]
        else:
            result.field_type = None

        return result
示例#2
0
    def from_xml(cls, tag: ET.Element, field_types_by_caption=None):
        """

        :param tag:
        :type field_types_by_caption: dict[str, FieldType]
        :return:
        """
        field_types_by_caption = dict() if field_types_by_caption is None else field_types_by_caption

        name = tag.get("name")
        start, end = int(tag.get("start", 0)), int(tag.get("end", 0)) - 1
        color_index = int(tag.get("color_index", 0))

        result = ProtocolLabel(name=name, start=start, end=end, color_index=color_index)
        result.apply_decoding = True if tag.get("apply_decoding", 'True') == "True" else False
        result.show = Qt.Checked if Formatter.str2val(tag.get("show", 0), int) else Qt.Unchecked
        result.fuzz_me = Qt.Checked if Formatter.str2val(tag.get("fuzz_me", 0), int) else Qt.Unchecked
        result.fuzz_values = tag.get("fuzz_values", "").split(",")
        result.auto_created = True if tag.get("auto_created", 'False') == "True" else False

        if result.name in field_types_by_caption:
            result.field_type = field_types_by_caption[result.name]
        else:
            result.field_type = None

        # set this after result.field_type because this would change display_format_index to field_types default
        result.display_format_index = int(tag.get("display_format_index", 0))
        result.display_bit_order_index = int(tag.get("display_bit_order_index", 0))
        result.display_endianness = tag.get("display_endianness", "big")

        return result
示例#3
0
 def from_xml(tag: ET.Element):
     result = Modulator("")
     for attrib, value in tag.attrib.items():
         if attrib == "index":
             continue
         elif attrib == "name" or attrib == "modulation_type":
             setattr(result, attrib, str(value))
         elif attrib == "samples_per_bit" or attrib == "samples_per_symbol":
             # samples_per_bit as legacy support for older project files
             result.samples_per_symbol = Formatter.str2val(value, int, 100)
         elif attrib == "sample_rate":
             result.sample_rate = Formatter.str2val(
                 value, float, 1e6) if value != "None" else None
         elif attrib == "param_for_zero":
             result.parameters[0] = Formatter.str2val(value, float,
                                                      0)  # legacy
         elif attrib == "param_for_one":
             result.parameters[1] = Formatter.str2val(value, float,
                                                      100)  # legacy
         elif attrib == "parameters":
             try:
                 result.parameters = array.array(
                     "f", map(float, value.split(",")))
             except ValueError:
                 continue
         else:
             setattr(result, attrib, Formatter.str2val(value, float, 1))
     return result
示例#4
0
    def from_xml(cls, tag: ET.Element, field_types_by_type_id=None):
        """

        :param tag:
        :type field_types_by_type_id: dict[str, FieldType]
        :return:
        """
        field_types_by_type_id = dict() if field_types_by_type_id is None else field_types_by_type_id

        name = tag.get("name")
        start, end = int(tag.get("start", 0)), int(tag.get("end", 0)) - 1
        color_index = int(tag.get("color_index", 0))

        result = ProtocolLabel(name=name, start=start, end=end, color_index=color_index)
        result.apply_decoding = True if tag.get("apply_decoding", 'True') == "True" else False
        result.show = Qt.Checked if Formatter.str2val(tag.get("show", 0), int) else Qt.Unchecked
        result.fuzz_me = Qt.Checked if Formatter.str2val(tag.get("fuzz_me", 0), int) else Qt.Unchecked
        result.fuzz_values = tag.get("fuzz_values", "").split(",")
        result.display_format_index = int(tag.get("display_format_index", 0))
        result.auto_created = True if tag.get("auto_created", 'False') == "True" else False
        type_id = tag.get("type_id", None)

        if type_id and type_id in field_types_by_type_id:
            result.field_type = field_types_by_type_id[type_id]
        else:
            result.field_type = None

        return result
示例#5
0
    def test_set_sample_rate(self):
        self.assertEqual(Formatter.science_time(self.signal.num_samples / self.signal.sample_rate),
                         self.dialog.ui.lDuration.text())

        self.dialog.ui.dsb_sample_rate.setValue(5e6)
        self.assertEqual(self.signal.sample_rate, 5e6)
        self.assertEqual(Formatter.science_time(self.signal.num_samples / self.signal.sample_rate),
                         self.dialog.ui.lDuration.text())
    def test_set_sample_rate(self):
        self.assertEqual(Formatter.science_time(self.signal.num_samples / self.signal.sample_rate),
                         self.dialog.ui.lDuration.text())

        self.dialog.ui.dsb_sample_rate.setValue(5e6)
        self.assertEqual(self.signal.sample_rate, 5e6)
        self.assertEqual(Formatter.science_time(self.signal.num_samples / self.signal.sample_rate),
                         self.dialog.ui.lDuration.text())
示例#7
0
    def drawBackground(self, painter: QPainter, rect: QRectF):

        # freqs = np.fft.fftfreq(len(w), 1 / self.sample_rate)
        if self.draw_grid and len(self.frequencies) > 0:
            painter.setPen(QPen(painter.pen().color(), 0))
            parent_width = self.parent().width() if hasattr(
                self.parent(), "width") else 750
            view_rect = self.parent().view_rect() if hasattr(
                self.parent(), "view_rect") else rect

            font_width = self.font_metrics.width(
                Formatter.big_value_with_suffix(self.center_freq) + "   ")
            x_grid_size = int(view_rect.width() / parent_width * font_width)
            # x_grid_size = int(0.1 * view_rect.width()) if 0.1 * view_rect.width() > 1 else 1
            y_grid_size = 1
            x_mid = np.where(self.frequencies == 0)[0]
            x_mid = int(x_mid[0]) if len(x_mid) > 0 else 0

            left = int(rect.left()) - (int(rect.left()) % x_grid_size)
            left = left if left > 0 else 0

            top = rect.top() - (rect.top() % y_grid_size)
            bottom = rect.bottom() - (rect.bottom() % y_grid_size)
            right_border = int(
                rect.right()) if rect.right() < len(self.frequencies) else len(
                    self.frequencies)

            x_range = list(range(x_mid, left, -x_grid_size)) + list(
                range(x_mid, right_border, x_grid_size))
            lines = [QLineF(x, rect.top(), x, bottom) for x in x_range] \
                    + [QLineF(rect.left(), y, rect.right(), y) for y in np.arange(top, bottom, y_grid_size)]

            painter.drawLines(lines)
            scale_x, scale_y = util.calc_x_y_scale(rect, self.parent())

            painter.scale(scale_x, scale_y)
            counter = -1  # Counter for Label for every second line

            for x in x_range:
                freq = self.frequencies[x]
                counter += 1

                if freq != 0 and (counter % 2 !=
                                  0):  # Label for every second line
                    continue

                if freq != 0:
                    prefix = "+" if freq > 0 else ""
                    value = prefix + Formatter.big_value_with_suffix(freq, 2)
                else:
                    counter = 0
                    value = Formatter.big_value_with_suffix(6800e6 -
                                                            self.center_freq +
                                                            self.status_k)
                font_width = self.font_metrics.width(value)
                painter.drawText(x / scale_x - font_width / 2,
                                 bottom / scale_y, value)
示例#8
0
    def sample_rate(self, value):
        if value > self._max_sample_rate:
            err = "{0} sample rate {1}Sps too high. Correcting to {2}Sps".format(
                type(self).__name__, Formatter.big_value_with_suffix(value),
                Formatter.big_value_with_suffix(self._max_sample_rate))
            self.errors.add(err)
            logger.warning(err)
            value = self._max_sample_rate

        if value != self.__sample_rate:
            self.__sample_rate = value
            self.set_device_sample_rate(value)
示例#9
0
    def frequency(self, value):
        if value > self._max_frequency:
            err = "{0} frequency {1}Hz too high. Correcting to {2}Hz".format(
                type(self).__name__, Formatter.big_value_with_suffix(value),
                Formatter.big_value_with_suffix(self._max_frequency))
            self.errors.add(err)
            logger.warning(err)
            value = self._max_frequency

        if value != self.__frequency:
            self.__frequency = value
            self.set_device_frequency(value)
示例#10
0
    def bandwidth(self, value):
        if value > self._max_bandwidth:
            err = "{0} bandwidth {1}Hz too high. Correcting to {2}Hz".format(type(self).__name__,
                                                                         Formatter.big_value_with_suffix(value),
                                                                         Formatter.big_value_with_suffix(self._max_bandwidth))
            self.errors.add(err)
            logger.warning(err)
            value = self._max_bandwidth

        if value != self.__bandwidth:
            self.__bandwidth = value
            if self.is_open:
                self.set_device_bandwidth(value)
示例#11
0
    def drawBackground(self, painter: QPainter, rect: QRectF):
        # freqs = np.fft.fftfreq(len(w), 1 / self.sample_rate)
        if self.draw_grid and len(self.frequencies) > 0:
            painter.setPen(QPen(painter.pen().color(), Qt.FlatCap))
            parent_width = self.parent().width() if hasattr(self.parent(), "width") else 750
            view_rect = self.parent().view_rect() if hasattr(self.parent(), "view_rect") else rect

            font_width = self.font_metrics.width(Formatter.big_value_with_suffix(self.center_freq) + "   ")
            x_grid_size = int(view_rect.width() / parent_width * font_width)
            # x_grid_size = int(0.1 * view_rect.width()) if 0.1 * view_rect.width() > 1 else 1
            y_grid_size = view_rect.height() / parent_width * font_width
            x_mid = np.where(self.frequencies == 0)[0]
            x_mid = int(x_mid[0]) if len(x_mid) > 0 else 0

            left = int(rect.left()) - (int(rect.left()) % x_grid_size)
            left = left if left > 0 else 0

            top = rect.top() - (rect.top() % y_grid_size)
            bottom = rect.bottom() - (rect.bottom() % y_grid_size)
            right_border = int(rect.right()) if rect.right() < len(self.frequencies) else len(self.frequencies)

            x_range = list(range(x_mid, left, -x_grid_size)) + list(range(x_mid, right_border, x_grid_size))
            lines = [QLineF(x, rect.top(), x, bottom) for x in x_range] \
                    + [QLineF(rect.left(), y, rect.right(), y) for y in np.arange(top, bottom, y_grid_size)]

            painter.drawLines(lines)
            scale_x = view_rect.width() / parent_width
            scale_y = view_rect.height() / parent_width
            painter.scale(scale_x, scale_y)

            font_height = self.font_metrics.height()
            counter = -1  # Counter for Label for every second line

            for x in x_range:
                freq =  self.frequencies[x]
                counter += 1

                if freq != 0 and (counter % 2 != 0): # Label for every second line
                    continue

                if freq != 0:
                    prefix = "+" if freq > 0 else ""
                    value = prefix+Formatter.big_value_with_suffix(freq, 2)
                else:
                    counter = 0
                    value = Formatter.big_value_with_suffix(self.center_freq)
                font_width = self.font_metrics.width(value)
                painter.drawText(x / scale_x - font_width / 2,
                                 bottom / scale_y + font_height, value)
示例#12
0
    def add_fuzz_value(self):
        cur_val = self.fuzz_values[-1]
        format_string = "{0:0" + str(len(cur_val)) + "b}"
        maximum = 2 ** len(cur_val)
        cur_val = format_string.format((int(str(Formatter.str2val(cur_val, int)), 2) + 1) % maximum)

        self.fuzz_values.append(cur_val)
示例#13
0
    def view_to_string(self,
                       view: int,
                       decoded: bool,
                       show_pauses=True,
                       sample_rate: float = None) -> str:
        """

        :param view: 0 - Bits ## 1 - Hex ## 2 - ASCII
        """
        if view == 0:
            proto = self.decoded_bits_str if decoded else self.plain_bits_str
        elif view == 1:
            proto = self.decoded_hex_str if decoded else self.plain_hex_str
        elif view == 2:
            proto = self.decoded_ascii_str if decoded else self.plain_ascii_str
        else:
            return None

        if show_pauses:
            if sample_rate:
                return '%s [Pause: %s]' % (
                    proto, Formatter.science_time(self.pause / sample_rate))
            else:
                return '%s [Pause: %d samples]' % (proto, self.pause)
        else:
            return proto
 def refresh_pause_list(self):
     self.ui.lWPauses.clear()
     fmt_str = "Pause ({1:d}-{2:d}) <{0:d} samples ({3})>"
     for i, pause in enumerate(self.table_model.protocol.pauses):
         sr = self.__get_modulator_of_message(self.table_model.protocol.messages[i]).sample_rate
         item = fmt_str.format(pause, i + 1, i + 2, Formatter.science_time(pause / sr))
         self.ui.lWPauses.addItem(item)
示例#15
0
    def update_view(self):
        try:
            self.ui.sliderYscale.setValue(int(self.graphics_view.transform().m22()))
        except AttributeError:
            return

        txt = self.ui.txtEditErrors.toPlainText()
        new_messages = self.device.read_messages()

        self.__parse_error_messages(new_messages)

        if len(new_messages) > 1:
            self.ui.txtEditErrors.setPlainText(txt + new_messages)

        self.ui.lSamplesCaptured.setText(Formatter.big_value_with_suffix(self.device.current_index, decimals=1))
        self.ui.lSignalSize.setText(locale.format_string("%.2f", (8 * self.device.current_index) / (1024 ** 2)))
        self.ui.lTime.setText(locale.format_string("%.2f", self.device.current_index / self.device.sample_rate))

        if self.is_rx and self.device.data is not None and len(self.device.data) > 0:
            self.ui.labelReceiveBufferFull.setText("{0}%".format(int(100 * self.device.current_index /
                                                                     len(self.device.data))))

        if self.device.current_index == 0:
            return False

        return True
示例#16
0
 def refresh_pause_list(self):
     self.ui.lWPauses.clear()
     fmt_str = "Pause ({1:d}-{2:d}) <{0:d} samples ({3})>"
     for i, pause in enumerate(self.table_model.protocol.pauses):
         sr = self.modulators[self.table_model.protocol.blocks[i].modulator_indx].sample_rate
         item = fmt_str.format(pause, i + 1, i + 2, Formatter.science_time(pause / sr))
         self.ui.lWPauses.addItem(item)
示例#17
0
    def on_save_clicked(self):
        data = self.device.data[:self.device.current_index]

        dev = self.device
        big_val = Formatter.big_value_with_suffix
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        initial_name = "{0}-{1}-{2}Hz-{3}Sps".format(dev.name, timestamp,
                                                     big_val(dev.frequency),
                                                     big_val(dev.sample_rate))

        if dev.bandwidth_is_adjustable:
            initial_name += "-{}Hz.wav".format(big_val(dev.bandwidth))

        initial_name = initial_name.replace(
            Formatter.local_decimal_seperator(), "_").replace("_000", "")

        FileOperator.save_data(data,
                               initial_name,
                               sample_rate=20e6,
                               long_record=True)
        # filename = FileOperator.save_data_dialog(initial_name, data,
        #                                          sample_rate=dev.sample_rate)
        # filename = self.recorded_files

        self.already_saved = True

        # if filename is not None and filename not in self.recorded_files:
        #     self.recorded_files.append(filename)

        self.close()
示例#18
0
 def from_xml(tag: ET.Element):
     result = Modulator("")
     for attrib, value in tag.attrib.items():
         if attrib == "index":
             continue
         elif attrib == "name":
             setattr(result, attrib, str(value))
         elif attrib == "modulation_type":
             setattr(result, attrib, Formatter.str2val(value, int, 0))
         elif attrib == "samples_per_bit":
             setattr(result, attrib, Formatter.str2val(value, int, 100))
         elif attrib == "sample_rate":
             result.sample_rate = Formatter.str2val(value, float, 1e6) if value != "None" else None
         else:
             setattr(result, attrib, Formatter.str2val(value, float, 1))
     return result
示例#19
0
    def update_view(self):
        try:
            self.ui.sliderYscale.setValue(
                int(self.graphics_view.transform().m22()))
        except AttributeError:
            return

        txt = self.ui.txtEditErrors.toPlainText()
        new_messages = self.device.read_messages()

        self.__parse_error_messages(new_messages)

        if len(new_messages) > 1:
            self.ui.txtEditErrors.setPlainText(txt + new_messages)

        self.ui.lSamplesCaptured.setText(
            Formatter.big_value_with_suffix(self.device.current_index,
                                            decimals=1))
        self.ui.lSignalSize.setText(
            locale.format_string("%.2f Мб",
                                 (8 * self.device.current_index) / (1024**2)))
        self.ui.lTime.setText(
            locale.format_string(
                "%.2f с", self.device.current_index / self.device.sample_rate))

        # if self.is_rx and self.device.data is not None and len(self.device.data) > 0:
        #     self.ui.labelReceiveBufferFull.setText("{0}%".format(int(100 * self.device.current_index /
        #                                                              len(self.device.data))))

        if self.device.current_index == 0:
            return False

        return True
示例#20
0
文件: GridScene.py 项目: jopohl/urh
    def draw_frequency_marker(self, x_pos, frequency):
        if frequency is None:
            self.clear_frequency_marker()
            return

        y1 = self.sceneRect().y()
        y2 = self.sceneRect().y() + self.sceneRect().height()

        if self.frequency_marker is None:
            pen = QPen(constants.LINECOLOR, 0)
            self.frequency_marker = [None, None]
            self.frequency_marker[0] = self.addLine(x_pos, y1, x_pos, y2, pen)
            self.frequency_marker[1] = self.addSimpleText("")
            self.frequency_marker[1].setBrush(QBrush(constants.LINECOLOR))
            font = QFont()
            font.setBold(True)
            font.setPointSize(int(font.pointSize() * 1.25)+1)
            self.frequency_marker[1].setFont(font)

        self.frequency_marker[0].setLine(x_pos, y1, x_pos, y2)
        scale_x, scale_y = self.__calc_x_y_scale(self.sceneRect())
        self.frequency_marker[1].setTransform(QTransform.fromScale(scale_x, scale_y), False)
        self.frequency_marker[1].setText("Tune to " + Formatter.big_value_with_suffix(frequency, decimals=3))
        font_metric = QFontMetrics(self.frequency_marker[1].font())
        text_width = font_metric.width("Tune to") * scale_x
        text_width += (font_metric.width(" ") * scale_x) / 2
        self.frequency_marker[1].setPos(x_pos-text_width, 0.95*y1)
示例#21
0
    def draw_frequency_marker(self, x_pos, frequency):
        if frequency is None:
            self.clear_frequency_marker()
            return

        y1 = self.sceneRect().y()
        y2 = self.sceneRect().y() + self.sceneRect().height()

        if self.frequency_marker is None:
            pen = QPen(constants.LINECOLOR, 0)
            self.frequency_marker = [None, None]
            self.frequency_marker[0] = self.addLine(x_pos, y1, x_pos, y2, pen)
            self.frequency_marker[1] = self.addSimpleText("")
            self.frequency_marker[1].setBrush(QBrush(constants.LINECOLOR))
            font = QFont()
            font.setBold(True)
            font.setPointSize(int(font.pointSize() * 1.25)+1)
            self.frequency_marker[1].setFont(font)

        self.frequency_marker[0].setLine(x_pos, y1, x_pos, y2)
        scale_x, scale_y = util.calc_x_y_scale(self.sceneRect(), self.parent())
        self.frequency_marker[1].setTransform(QTransform.fromScale(scale_x, scale_y), False)
        self.frequency_marker[1].setText("Tune to " + Formatter.big_value_with_suffix(frequency, decimals=3))
        font_metric = QFontMetrics(self.frequency_marker[1].font())
        text_width = font_metric.width("Tune to") * scale_x
        text_width += (font_metric.width(" ") * scale_x) / 2
        self.frequency_marker[1].setPos(x_pos-text_width, 0.95*y1)
示例#22
0
文件: ProtocoLabel.py 项目: yarda/urh
    def add_fuzz_value(self):
        cur_val = self.fuzz_values[-1]
        format_string = "{0:0" + str(len(cur_val)) + "b}"
        maximum = 2 ** len(cur_val)
        cur_val = format_string.format((int(str(Formatter.str2val(cur_val, int)), 2) + 1) % maximum)

        self.fuzz_values.append(cur_val)
示例#23
0
 def update_number_selected_samples(self):
     self.ui.lNumSelectedSamples.setText(str(abs(int(self.ui.gvSignal.selection_area.width))))
     self.__set_duration()
     sel_messages = self.ui.gvSignal.selected_messages
     if len(sel_messages) == 1:
         self.ui.labelRSSI.setText("RSSI: {}".format(Formatter.big_value_with_suffix(sel_messages[0].rssi)))
     else:
         self.ui.labelRSSI.setText("")
示例#24
0
    def test_insert_sine_plugin(self):
        insert_sine_plugin = self.sframe.ui.gvSignal.insert_sine_plugin
        num_samples = 10000
        tests.utils_testing.short_wait()
        dialog = insert_sine_plugin.get_insert_sine_dialog(
            original_data=self.signal.data,
            position=2000,
            sample_rate=self.signal.sample_rate,
            num_samples=num_samples)

        graphics_view = dialog.graphicsViewSineWave  # type: ZoomableGraphicView

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            tests.utils_testing.short_wait()

        self.assertEqual(int(graphics_view.sceneRect().width()),
                         self.signal.num_samples + num_samples)
        self.assertEqual(insert_sine_plugin.insert_indicator.rect().width(),
                         num_samples)
        self.assertEqual(insert_sine_plugin.insert_indicator.rect().x(), 2000)

        dialog.doubleSpinBoxAmplitude.setValue(0.1)
        dialog.doubleSpinBoxAmplitude.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.amplitude, 0.1)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            tests.utils_testing.short_wait()

        dialog.doubleSpinBoxFrequency.setValue(1e6)
        dialog.doubleSpinBoxFrequency.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.frequency, 1e6)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            tests.utils_testing.short_wait()

        dialog.doubleSpinBoxPhase.setValue(100)
        dialog.doubleSpinBoxPhase.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.phase, 100)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            tests.utils_testing.short_wait()

        dialog.doubleSpinBoxSampleRate.setValue(2e6)
        dialog.doubleSpinBoxSampleRate.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.sample_rate, 2e6)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            tests.utils_testing.short_wait()

        dialog.doubleSpinBoxNSamples.setValue(0.5e6)
        dialog.doubleSpinBoxNSamples.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.num_samples, 0.5e6)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            tests.utils_testing.short_wait()

        sep = Formatter.local_decimal_seperator()
        self.assertEqual(dialog.lineEditTime.text(), "250" + sep + "000m")
示例#25
0
    def __set_duration(self):  # On Signal Sample Rate changed
        try:
            num_samples = int(self.ui.lNumSelectedSamples.text())
        except ValueError:
            return

        if self.signal:
            t = num_samples / self.signal.sample_rate
            self.ui.lDuration.setText(Formatter.science_time(t))
示例#26
0
 def mouseMoveEvent(self, event: QMouseEvent):
     if isinstance(self.scene(), GridScene):
         freq = self.scene().get_freq_for_pos(
             int(self.mapToScene(event.pos()).x()))
         if freq is not None:
             QToolTip.showText(
                 self.mapToGlobal(event.pos()),
                 "Tune to:" + Formatter.big_value_with_suffix(freq), None,
                 QRect(), 10000)
示例#27
0
 def from_xml(self,
              tag: ET.Element,
              participants,
              decoders=None,
              message_types=None):
     super().from_xml(tag, participants, decoders, message_types)
     self.destination = Participant.find_matching(
         tag.get("destination_id", ""), participants)
     self.repeat = Formatter.str2val(tag.get("repeat", "1"), int, 1)
示例#28
0
    def __set_selected_bandwidth(self):
        try:
            num_samples = int(self.ui.lNumSelectedSamples.text())
        except ValueError:
            return

        if self.ui.gvSpectrogram.height_spectrogram and self.signal:
            bw = (num_samples / self.ui.gvSpectrogram.height_spectrogram) * self.signal.sample_rate
            self.ui.lDuration.setText(Formatter.big_value_with_suffix(bw) + "Hz")
示例#29
0
    def __set_duration(self):  # On Signal Sample Rate changed
        try:
            num_samples = int(self.ui.lNumSelectedSamples.text())
        except ValueError:
            return

        if self.signal:
            t = num_samples / self.signal.sample_rate
            self.ui.lDuration.setText(Formatter.science_time(t))
示例#30
0
    def test_insert_sine_plugin(self):
        insert_sine_plugin = self.sframe.ui.gvSignal.insert_sine_plugin
        num_samples = 10000
        dialog = insert_sine_plugin.get_insert_sine_dialog(
            original_data=self.sframe.signal.iq_array.data,
            position=2000,
            sample_rate=self.sframe.signal.sample_rate,
            num_samples=num_samples)

        graphics_view = dialog.graphicsViewSineWave  # type: ZoomableGraphicView

        self.__wait_for_spinbox_enabled(dialog)

        self.assertEqual(int(graphics_view.sceneRect().width()),
                         self.sframe.signal.num_samples + num_samples)
        self.assertEqual(insert_sine_plugin.insert_indicator.rect().width(),
                         num_samples)
        self.assertEqual(insert_sine_plugin.insert_indicator.rect().x(), 2000)

        dialog.doubleSpinBoxAmplitude.setValue(0.1)
        dialog.doubleSpinBoxAmplitude.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.amplitude, 0.1)

        self.__wait_for_spinbox_enabled(dialog)

        dialog.doubleSpinBoxFrequency.setValue(1e6)
        dialog.doubleSpinBoxFrequency.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.frequency, 1e6)

        self.__wait_for_spinbox_enabled(dialog)

        dialog.doubleSpinBoxPhase.setValue(100)
        dialog.doubleSpinBoxPhase.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.phase, 100)

        self.__wait_for_spinbox_enabled(dialog)

        dialog.doubleSpinBoxSampleRate.setValue(2e6)
        dialog.doubleSpinBoxSampleRate.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.sample_rate, 2e6)

        self.__wait_for_spinbox_enabled(dialog)

        dialog.doubleSpinBoxNSamples.setValue(0.5e6)
        dialog.doubleSpinBoxNSamples.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.num_samples, 0.5e6)

        self.__wait_for_spinbox_enabled(dialog)

        sep = Formatter.local_decimal_seperator()
        self.assertEqual(dialog.lineEditTime.text(), "250" + sep + "000m")

        #  Close the dialog via finished
        dialog.finished.emit(0)
        QApplication.instance().processEvents()
        QTest.qWait(self.CLOSE_TIMEOUT)
示例#31
0
    def refresh_pause_list(self):
        self.ui.lWPauses.clear()

        fmt_str = "Pause ({1:d}-{2:d}) <{0:d} samples ({3})>"
        for i, pause in enumerate(self.table_model.protocol.pauses):
            sr = self.__get_modulator_of_message(self.table_model.protocol.messages[i]).sample_rate
            item = fmt_str.format(pause, i + 1, i + 2, Formatter.science_time(pause / sr))
            self.ui.lWPauses.addItem(item)

        self.refresh_estimated_time()
示例#32
0
    def from_xml(cls, tag: ET.Element, field_types_by_caption=None):
        """

        :param tag:
        :type field_types_by_caption: dict[str, FieldType]
        :return:
        """
        label_tag = tag.find("label")
        if label_tag is not None:
            label = ProtocolLabel.from_xml(label_tag, field_types_by_caption)
        else:
            label = ChecksumLabel.from_xml(tag.find("checksum_label"), field_types_by_caption)
        result = SimulatorProtocolLabel(label)
        result.value_type_index = Formatter.str2val(tag.get("value_type_index", "0"), int)
        result.external_program = tag.get("external_program", "")
        result.formula = tag.get("formula", "")
        result.random_min = Formatter.str2val(tag.get("random_min", "0"), int)
        result.random_max = Formatter.str2val(tag.get("random_max", str(label.fuzz_maximum-1)), int)
        return result
示例#33
0
 def update_number_selected_samples(self):
     self.ui.lNumSelectedSamples.setText(str(abs(int(self.ui.gvSignal.selection_area.width))))
     self.__set_duration()
     try:
         sel_messages = self.ui.gvSignal.selected_messages
     except AttributeError:
         sel_messages = []
     if len(sel_messages) == 1:
         self.ui.labelRSSI.setText("RSSI: {}".format(Formatter.big_value_with_suffix(sel_messages[0].rssi)))
     else:
         self.ui.labelRSSI.setText("")
示例#34
0
 def get_receive_buffer_size(resume_on_full_receive_buffer: bool, spectrum_mode: bool) -> int:
     if resume_on_full_receive_buffer:
         if spectrum_mode:
             num_samples = constants.SPECTRUM_BUFFER_SIZE
         else:
             num_samples = constants.SNIFF_BUFFER_SIZE
     else:
         # Take 60% of avail memory
         threshold = constants.SETTINGS.value('ram_threshold', 0.6, float)
         num_samples = threshold * (psutil.virtual_memory().available / 8)
     logger.info("Initializing receive buffer with size {0}B".format(Formatter.big_value_with_suffix(num_samples*8)))
     return int(num_samples)
示例#35
0
    def from_xml(cls, tag: ET.Element, field_types_by_caption=None):
        """

        :param tag:
        :type field_types_by_caption: dict[str, FieldType]
        :return:
        """
        label_tag = tag.find("label")
        if label_tag is not None:
            label = ProtocolLabel.from_xml(label_tag, field_types_by_caption)
        else:
            label = ChecksumLabel.from_xml(tag.find("checksum_label"),
                                           field_types_by_caption)
        result = SimulatorProtocolLabel(label)
        result.value_type_index = Formatter.str2val(
            tag.get("value_type_index", "0"), int)
        result.external_program = tag.get("external_program", "")
        result.formula = tag.get("formula", "")
        result.random_min = Formatter.str2val(tag.get("random_min", "0"), int)
        result.random_max = Formatter.str2val(
            tag.get("random_max", str(label.fuzz_maximum - 1)), int)
        return result
示例#36
0
    def not_enough_ram_for_sending_precache(memory_size_bytes):
        w = QWidget()
        if memory_size_bytes:
            msg = "Precaching all your modulated data would take <b>{0}B</b> of memory, " \
                  "which does not fit into your RAM.<br>".format(Formatter.big_value_with_suffix(memory_size_bytes))
        else:
            msg = ""

        msg += "Sending will be done in <b>continuous mode</b>.<br><br>" \
               "This means, modulation will be performed live during sending.<br><br>" \
               "If you experience problems, " \
               "consider sending less messages or upgrade your RAM."

        QMessageBox.information(w, w.tr("Entering continuous send mode"), w.tr(msg))
    def on_save_clicked(self):
        data = self.device.data[:self.device.current_index]

        dev = self.device
        big_val = Formatter.big_value_with_suffix
        initial_name = "{0} {1}Hz {2}Sps {3}Hz.complex".format(dev.name, big_val(dev.frequency),
                                                               big_val(dev.sample_rate),
                                                               big_val(dev.bandwidth)).replace(
            Formatter.local_decimal_seperator(), "_").replace("_000", "")

        filename = FileOperator.save_data_dialog(initial_name, data, parent=self)
        self.already_saved = True
        if filename is not None and filename not in self.recorded_files:
            self.recorded_files.append(filename)
示例#38
0
文件: Errors.py 项目: yarda/urh
    def not_enough_ram_for_sending_precache(memory_size_bytes):
        w = QWidget()
        if memory_size_bytes:
            msg = "Precaching all your modulated data would take <b>{0}B</b> of memory, " \
                  "which does not fit into your RAM.<br>".format(Formatter.big_value_with_suffix(memory_size_bytes))
        else:
            msg = ""

        msg += "Sending will be done in <b>continuous mode</b>.<br><br>" \
               "This means, modulation will be performed live during sending.<br><br>" \
               "If you experience problems, " \
               "consider sending less messages or upgrade your RAM."

        QMessageBox.information(w, w.tr("Entering continuous send mode"),
                                w.tr(msg))
示例#39
0
    def on_save_clicked(self):
        data = self.device.data[:self.device.current_index]

        dev = self.device
        big_val = Formatter.big_value_with_suffix
        initial_name = "{0}-{1}Hz-{2}Sps".format(dev.name, big_val(dev.frequency), big_val(dev.sample_rate))

        if dev.bandwidth_is_adjustable:
            initial_name += "-{}Hz".format(big_val(dev.bandwidth))

        initial_name = initial_name.replace(Formatter.local_decimal_seperator(), "_").replace("_000", "")

        filename = FileOperator.save_data_dialog(initial_name + ".complex", data, parent=self)
        self.already_saved = True
        if filename is not None and filename not in self.recorded_files:
            self.recorded_files.append(filename)
示例#40
0
    def update_number_selected_samples(self):
        if self.spectrogram_is_active:
            self.ui.lNumSelectedSamples.setText(str(abs(int(self.ui.gvSpectrogram.selection_area.length))))
            self.__set_selected_bandwidth()
            return
        else:
            self.ui.lNumSelectedSamples.setText(str(abs(int(self.ui.gvSignal.selection_area.length))))
            self.__set_duration()

        try:
            sel_messages = self.ui.gvSignal.selected_messages
        except AttributeError:
            sel_messages = []
        if len(sel_messages) == 1:
            self.ui.labelRSSI.setText("RSSI: {}".format(Formatter.big_value_with_suffix(sel_messages[0].rssi)))
        else:
            self.ui.labelRSSI.setText("")
示例#41
0
    def get_receive_buffer_size(resume_on_full_receive_buffer: bool,
                                spectrum_mode: bool) -> int:
        if resume_on_full_receive_buffer:
            if spectrum_mode:
                num_samples = constants.SPECTRUM_BUFFER_SIZE
            else:
                num_samples = constants.SNIFF_BUFFER_SIZE
        else:
            # Take 60% of avail memory
            threshold = constants.SETTINGS.value('ram_threshold', 0.6, float)
            num_samples = threshold * (psutil.virtual_memory().available / 8)

        # Do not let it allocate too much on 32 bit
        if 8 * num_samples > sys.maxsize // 2:
            num_samples = sys.maxsize // (8 * 2)
            logger.info("Correcting buffer size to {}".format(num_samples))

        logger.info("Initializing receive buffer with size {0}B".format(
            Formatter.big_value_with_suffix(num_samples * 8)))
        return int(num_samples)
示例#42
0
    def get_receive_buffer_size(resume_on_full_receive_buffer: bool, spectrum_mode: bool) -> int:
        if SettingsProxy.OVERWRITE_RECEIVE_BUFFER_SIZE:
            return SettingsProxy.OVERWRITE_RECEIVE_BUFFER_SIZE

        if resume_on_full_receive_buffer:
            if spectrum_mode:
                num_samples = constants.SPECTRUM_BUFFER_SIZE
            else:
                num_samples = constants.SNIFF_BUFFER_SIZE
        else:
            # Take 60% of avail memory
            threshold = constants.SETTINGS.value('ram_threshold', 0.6, float)
            num_samples = threshold * (psutil.virtual_memory().available / 8)

        # Do not let it allocate too much memory on 32 bit
        if 8 * 2 * num_samples > sys.maxsize:
            num_samples = sys.maxsize // (8 * 2 * 1.5)
            logger.info("Correcting buffer size to {}".format(num_samples))

        logger.info("Allocate receive buffer with {0}B".format(Formatter.big_value_with_suffix(num_samples * 8)))
        return int(num_samples)
示例#43
0
    def on_save_clicked(self):
        data = self.device.data[:self.device.current_index]

        dev = self.device
        big_val = Formatter.big_value_with_suffix
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        initial_name = "{0}-{1}-{2}Hz-{3}Sps".format(dev.name, timestamp,
                                                     big_val(dev.frequency),
                                                     big_val(dev.sample_rate))

        if dev.bandwidth_is_adjustable:
            initial_name += "-{}Hz".format(big_val(dev.bandwidth))

        initial_name = initial_name.replace(
            Formatter.local_decimal_seperator(), "_").replace("_000", "")

        filename = FileOperator.ask_signal_file_name_and_save(
            initial_name, data, sample_rate=dev.sample_rate, parent=self)
        self.already_saved = True
        if filename is not None and filename not in self.recorded_files:
            self.recorded_files.append(filename)
示例#44
0
def get_receive_buffer_size(resume_on_full_receive_buffer: bool, spectrum_mode: bool) -> int:
    if OVERWRITE_RECEIVE_BUFFER_SIZE:
        return OVERWRITE_RECEIVE_BUFFER_SIZE

    if resume_on_full_receive_buffer:
        if spectrum_mode:
            num_samples = SPECTRUM_BUFFER_SIZE
        else:
            num_samples = SNIFF_BUFFER_SIZE
    else:
        # Take 60% of avail memory
        threshold = read('ram_threshold', 0.6, float)
        num_samples = threshold * (psutil.virtual_memory().available / 8)

    # Do not let it allocate too much memory on 32 bit
    if 8 * 2 * num_samples > sys.maxsize:
        num_samples = sys.maxsize // (8 * 2 * 1.5)
        logger.info("Correcting buffer size to {}".format(num_samples))

    logger.info("Allocate receive buffer with {0}B".format(Formatter.big_value_with_suffix(num_samples * 8)))
    return int(num_samples)
示例#45
0
 def caption(self):
     return "Sleep for " + Formatter.science_time(self.sleep_time)
示例#46
0
    def test_insert_sine_plugin(self):
        insert_sine_plugin = self.sframe.ui.gvSignal.insert_sine_plugin
        num_samples = 10000
        dialog = insert_sine_plugin.get_insert_sine_dialog(original_data=self.sframe.signal.data,
                                                           position=2000,
                                                           sample_rate=self.sframe.signal.sample_rate,
                                                           num_samples=num_samples)

        graphics_view = dialog.graphicsViewSineWave  # type: ZoomableGraphicView

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            QApplication.instance().processEvents()
            QTest.qWait(10)

        self.assertEqual(int(graphics_view.sceneRect().width()), self.sframe.signal.num_samples + num_samples)
        self.assertEqual(insert_sine_plugin.insert_indicator.rect().width(), num_samples)
        self.assertEqual(insert_sine_plugin.insert_indicator.rect().x(), 2000)

        dialog.doubleSpinBoxAmplitude.setValue(0.1)
        dialog.doubleSpinBoxAmplitude.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.amplitude, 0.1)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            self.app.processEvents()
            QTest.qWait(10)

        dialog.doubleSpinBoxFrequency.setValue(1e6)
        dialog.doubleSpinBoxFrequency.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.frequency, 1e6)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            self.app.processEvents()
            QTest.qWait(10)

        dialog.doubleSpinBoxPhase.setValue(100)
        dialog.doubleSpinBoxPhase.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.phase, 100)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            self.app.processEvents()
            QTest.qWait(10)

        dialog.doubleSpinBoxSampleRate.setValue(2e6)
        dialog.doubleSpinBoxSampleRate.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.sample_rate, 2e6)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            self.app.processEvents()
            QTest.qWait(10)

        dialog.doubleSpinBoxNSamples.setValue(0.5e6)
        dialog.doubleSpinBoxNSamples.editingFinished.emit()
        self.assertEqual(insert_sine_plugin.num_samples, 0.5e6)

        while not dialog.doubleSpinBoxAmplitude.isEnabled():
            self.app.processEvents()
            QTest.qWait(10)

        sep = Formatter.local_decimal_seperator()
        self.assertEqual(dialog.lineEditTime.text(), "250" + sep + "000m")

        #  Close the dialog via finished
        dialog.finished.emit(0)
        QApplication.instance().processEvents()
        QTest.qWait(self.CLOSE_TIMEOUT)
示例#47
0
 def from_xml(cls, tag):
     result = SimulatorSleepAction()
     result.sleep_time = Formatter.str2val(tag.get("sleep_time", "1.0"), float, 1.0)
     return result
示例#48
0
 def set_time(self):
     self.dialog_ui.lineEditTime.setText(Formatter.science_time(self.num_samples / self.sample_rate, decimals=3,
                                                                append_seconds=False, remove_spaces=True))
示例#49
0
 def from_xml(self, tag: ET.Element, participants, decoders=None, message_types=None):
     super().from_xml(tag, participants, decoders, message_types)
     self.destination = Participant.find_matching(tag.get("destination_id", ""), participants)
     self.repeat = Formatter.str2val(tag.get("repeat", "1"), int, 1)
示例#50
0
 def get_pause_str(self, sample_rate):
     if sample_rate:
         return ' [<b>Pause:</b> %s]' % (Formatter.science_time(self.pause / sample_rate))
     else:
         return ' [<b>Pause:</b> %d samples]' % (self.pause)
示例#51
0
 def mouseMoveEvent(self, event: QMouseEvent):
     if isinstance(self.scene(), GridScene):
         freq = self.scene().get_freq_for_pos(int(self.mapToScene(event.pos()).x()))
         if freq is not None:
             QToolTip.showText(self.mapToGlobal(event.pos()), "Tune to:" + Formatter.big_value_with_suffix(freq),
                               None, QRect(), 10000)
示例#52
0
 def set_duration(self):
     dur = self.signal.num_samples / self.signal.sample_rate
     self.ui.lDuration.setText(Formatter.science_time(dur))