Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion pyharp/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ def disconnect(self) -> None:
self._ser.close()

def read_who_am_i(self) -> int:
self.log.debug("Requesting whoami.")
address = CommonRegisters.WHO_AM_I

reply: ReplyHarpMessage = self.send(
Expand Down Expand Up @@ -271,6 +272,7 @@ def reset_device(self):
def send(self, message_bytes: bytearray, dump: bool = True) -> ReplyHarpMessage:
"""Send a harp message; return the device's reply."""
#print(f"Sending: {repr(message_bytes)}")
self.log.debug(f"sent: {repr(message_bytes)}")
self._ser.write(message_bytes)

# TODO: handle case where read is None
Expand Down Expand Up @@ -305,4 +307,4 @@ def get_events(self) -> list[ReplyHarpMessage]:

def event_count(self) -> int:
"""Get the number of events in the event queue."""
return self._ser.event_q.qsize()
return self._ser.event_q.qsize()
3 changes: 3 additions & 0 deletions pyharp/harp_serial.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,13 @@ def __init__(self, serial_port: str, **kwargs):
self._ser,
partial(HarpSerialProtocol, self._read_q),
)
self._reader.daemon = True
self._reader.name = f"{serial_port}_harp_serial_reader_worker"
self._reader.start()
transport, protocol = self._reader.connect()

self._parse_thread = threading.Thread(
name=f"{serial_port}_harp_serial_parse_worker",
target=self.parse_harp_msgs_threaded,
daemon=True,
)
Expand Down
32 changes: 32 additions & 0 deletions pyharp/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ def WriteU32(address: int, value: int) -> WriteU32HarpMessage:
def WriteS32(address: int, value: int) -> WriteS32HarpMessage:
return WriteS32HarpMessage(address, value)

def WriteS32Array(address: int, value: list[int]) -> WriteS32HarpMessage:
return WriteS32ArrayHarpMessage(address, value)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should there be a matching ReadS32Array, for completeness and parity?

@staticmethod
def parse(frame: bytearray) -> ReplyHarpMessage:
return ReplyHarpMessage(frame)
Expand Down Expand Up @@ -291,6 +294,9 @@ class ReadU32HarpMessage(ReadHarpMessage):
def __init__(self, address: int):
super().__init__(PayloadType.U32, address)

class ReadS32HarpMessage(ReadHarpMessage):
def __init__(self, address: int):
super().__init__(PayloadType.S32, address)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a duplicate, no?


class ReadS32HarpMessage(ReadHarpMessage):
def __init__(self, address: int):
Expand Down Expand Up @@ -423,3 +429,29 @@ def __init__(self, address: int, value: int | List[int]):
@property
def payload(self) -> int | List[int]:
return int.from_bytes(self._frame[5:9], byteorder="little", signed=True)


class WriteU8ArrayMessage(WriteHarpMessage):
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be WriteU8ArrayHarpMessage instead of WriteU8ArrayMessage for naming consistency?

def __init__(self, address: int, data_format, value: Union[list, tuple]):
self.data_format = data_format
packed_data = struct.pack(self.data_format, *value)
super().__init__(PayloadType.U8, packed_data, address,
offset=(len(packed_data)-1))

@property
def payload(self) -> List[int]:
return struct.unpack('{self.data_format}', self._frame[5:4*self.payload_count])[0]


class WriteS32ArrayHarpMessage(WriteHarpMessage):
def __init__(self, address: int, value: int):
self.payload_count = len(value)
super().__init__(
PayloadType.S32,
struct.pack('<{len(value)l', *value),
address, offset=(4*self.payload_count - 1))


@property
def payload(self) -> int:
return struct.unpack('<{self.payload_count}l', self._frame[5:4*self.payload_count])[0]