Skip to content

Commit

Permalink
Change serial interface to work with callback on_data
Browse files Browse the repository at this point in the history
  • Loading branch information
BojanSof committed Apr 13, 2024
1 parent 316d111 commit 7b790da
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 18 deletions.
10 changes: 8 additions & 2 deletions examples/serial_example.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import sys
import time
import queue

from pydevdtk.coms.serial import Serial

Expand Down Expand Up @@ -31,13 +33,17 @@ def parse_data(self, data):
if port not in com_ports:
print(f"Requested port {port} not found")

ser.open(port)
data_queue = queue.Queue()
opened = ser.open(port, lambda data: data_queue.put(data))
if not opened:
print(f"Error while opening port {port}")
sys.exit(1)

parser = Parser()
t_run = 10
t_start = time.time()
while time.time() - t_start < t_run:
for sin, cos in parser.parse_data(ser.get_data_event()):
for sin, cos in parser.parse_data(data_queue.get()):
print(f"sin = {sin} | cos = {cos}")

ser.close()
28 changes: 12 additions & 16 deletions src/pydevdtk/coms/serial.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import threading
import queue
from typing import Callable

import serial
import serial.tools.list_ports as ports
Expand All @@ -10,31 +10,35 @@ def __init__(self):
self.port = None
self.data_thread_stop_event = threading.Event()
self.data_thread = None
self.data_queue = queue.Queue()
self.on_data = None

def get_found_devices(self) -> list[str]:
com_ports = ports.comports()
return [com_port.device for com_port in com_ports]

def open(self, port: str, baudrate: int = 9600) -> bool:
self.port = serial.Serial(port=port, baudrate=baudrate)
def open(
self, port: str, on_data: Callable[[bytes], None], **port_kwargs
) -> bool:
self.port = serial.Serial(port=port, **port_kwargs)
if not self.port.is_open:
self.port = None
return False
else:
self.on_data = on_data
self.data_thread = threading.Thread(
target=self._data_read,
args=(self.port, self.data_queue, self.data_thread_stop_event),
args=(self.port, self.data_thread_stop_event),
)
self.data_thread.start()
return True

def close(self) -> bool:
if self.port is not None and self.port.is_open:
if self.port is not None:
self.data_thread_stop_event.set()
self.data_thread.join()
self.port.close()
self.port = None
self.on_data = None
return True
return False

Expand All @@ -43,16 +47,8 @@ def is_open(self) -> bool:
return self.port.is_open
return False

def get_data_event(self, block=True, timeout=None):
try:
return self.data_queue.get(block, timeout)
except queue.Empty:
return None

def _data_read(
self, port: serial.Serial, data_queue, stop_event: threading.Event
):
def _data_read(self, port: serial.Serial, stop_event: threading.Event):
while not stop_event.is_set() and port.is_open:
data = port.read_all()
if len(data) > 0:
data_queue.put(data)
self.on_data(data)

0 comments on commit 7b790da

Please sign in to comment.