diff --git a/rfg_adc_plotter/io/sweep_parser_core.py b/rfg_adc_plotter/io/sweep_parser_core.py index c84673f..fbb52c1 100644 --- a/rfg_adc_plotter/io/sweep_parser_core.py +++ b/rfg_adc_plotter/io/sweep_parser_core.py @@ -500,18 +500,27 @@ class SweepAssembler: self._reset_current() if event.ch is not None: self._cur_channel = int(event.ch) - self._cur_channels.add(int(event.ch)) return packet + point_ch = int(event.ch) + packet: Optional[SweepPacket] = None if self._cur_channel is None: - self._cur_channel = int(event.ch) - self._cur_channels.add(int(event.ch)) + self._cur_channel = point_ch + elif point_ch != self._cur_channel: + if self._xs: + # Never mix channels in a single sweep packet: otherwise + # identical step indexes can overwrite each other. + packet = self.finalize_current() + self._reset_current() + self._cur_channel = point_ch + + self._cur_channels.add(point_ch) self._xs.append(int(event.x)) self._ys.append(float(event.y)) if event.aux is not None: self._aux_1.append(float(event.aux[0])) self._aux_2.append(float(event.aux[1])) - return None + return packet def finalize_current(self) -> Optional[SweepPacket]: if not self._xs: diff --git a/tests/test_sweep_parser_core.py b/tests/test_sweep_parser_core.py index 3c99bd2..fb50cc7 100644 --- a/tests/test_sweep_parser_core.py +++ b/tests/test_sweep_parser_core.py @@ -315,6 +315,24 @@ class SweepParserCoreTests(unittest.TestCase): self.assertEqual(aux[0][1], 100.0) self.assertEqual(aux[1][2], 95.0) + def test_sweep_assembler_splits_packet_on_channel_switch(self): + assembler = SweepAssembler(fancy=False, apply_inversion=False) + self.assertIsNone(assembler.consume(PointEvent(ch=1, x=1, y=10.0))) + packet = assembler.consume(PointEvent(ch=2, x=1, y=20.0)) + self.assertIsNotNone(packet) + + sweep_1, info_1, aux_1 = packet + self.assertIsNone(aux_1) + self.assertEqual(info_1["ch"], 1) + self.assertEqual(info_1["chs"], [1]) + self.assertAlmostEqual(float(sweep_1[1]), 10.0, places=6) + + sweep_2, info_2, aux_2 = assembler.finalize_current() + self.assertIsNone(aux_2) + self.assertEqual(info_2["ch"], 2) + self.assertEqual(info_2["chs"], [2]) + self.assertAlmostEqual(float(sweep_2[1]), 20.0, places=6) + if __name__ == "__main__": unittest.main()