aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/sca/scope/picoscope_alt.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/sca/scope/picoscope_alt.py')
-rw-r--r--pyecsca/sca/scope/picoscope_alt.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/pyecsca/sca/scope/picoscope_alt.py b/pyecsca/sca/scope/picoscope_alt.py
new file mode 100644
index 0000000..69b705a
--- /dev/null
+++ b/pyecsca/sca/scope/picoscope_alt.py
@@ -0,0 +1,57 @@
+from time import time_ns, sleep
+from typing import Optional, Tuple, Sequence, Union
+
+import numpy as np
+from picoscope.ps4000 import PS4000
+from picoscope.ps6000 import PS6000
+from public import public
+
+from .base import Scope
+
+
+@public
+class PicoScopeAlt(Scope):
+
+ def __init__(self, ps: Union[PS4000, PS6000]):
+ self.ps = ps
+
+ def open(self) -> None:
+ self.ps.open()
+
+ @property
+ def channels(self) -> Sequence[str]:
+ return list(self.ps.CHANNELS.keys())
+
+ def setup_frequency(self, frequency: int, samples: int) -> Tuple[int, int]:
+ actual_frequency, max_samples = self.ps.setSamplingFrequency(frequency, samples)
+ if max_samples < samples:
+ samples = max_samples
+ return actual_frequency, samples
+
+ def setup_channel(self, channel: str, coupling: str, range: float, enable: bool) -> None:
+ self.ps.setChannel(channel, coupling, range, 0.0, enable)
+
+ def setup_trigger(self, channel: str, threshold: float, direction: str, delay: int,
+ timeout: int, enable: bool) -> None:
+ self.ps.setSimpleTrigger(channel, threshold, direction, delay, timeout, enable)
+
+ def setup_capture(self, channel: str, enable: bool) -> None:
+ pass
+
+ def arm(self) -> None:
+ self.ps.runBlock()
+
+ def capture(self, channel: str, timeout: Optional[int] = None) -> Optional[np.ndarray]:
+ start = time_ns()
+ while not self.ps.isReady():
+ sleep(0.001)
+ if timeout is not None and (time_ns() - start) / 1e6 >= timeout:
+ return None
+
+ return self.ps.getDataV(channel)
+
+ def stop(self) -> None:
+ self.ps.stop()
+
+ def close(self) -> None:
+ self.ps.close()