Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ readme = "README.md"
license = {text = "GPL-3.0"}
requires-python = ">=3.8"
Comment thread
puddly marked this conversation as resolved.
Outdated
dependencies = [
"zigpy>=0.91.2",
"zigpy>=1.3.0",
'async-timeout; python_version<"3.11"',
"voluptuous",
"coloredlogs",
Expand Down
10 changes: 6 additions & 4 deletions tests/api/test_connect.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,11 @@ async def test_connect_skip_bootloader_rts_dtr_pins(make_znp_server, mocker):
await znp.connect(test_port=True)

serial = znp._uart._transport
assert serial._mock_dtr_prop.mock_calls == [call(False), call(False), call(False)]
assert serial._mock_rts_prop.mock_calls == [call(False), call(True), call(False)]
assert serial._mock_set_modem_pins.mock_calls == [
call(dtr=False, rts=False),
call(dtr=False, rts=True),
call(dtr=False, rts=False),
]

await znp.disconnect()

Expand All @@ -130,8 +133,7 @@ async def test_connect_skip_bootloader_config(make_znp_server, mocker):
await znp.connect(test_port=True)

serial = znp._uart._transport
assert serial._mock_dtr_prop.called is False
assert serial._mock_rts_prop.called is False
assert len(serial._mock_set_modem_pins.mock_calls) == 0

await znp.disconnect()

Expand Down
10 changes: 6 additions & 4 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import inspect
import logging
import pathlib
from unittest.mock import Mock, PropertyMock, patch
from unittest.mock import Mock, patch

import pytest
import zigpy.types
Expand Down Expand Up @@ -56,8 +56,10 @@ def __init__(self, protocol):
self.serial = Mock()
self.serial.name = FAKE_SERIAL_PORT
self.serial.baudrate = 45678
type(self.serial).dtr = self._mock_dtr_prop = PropertyMock(return_value=None)
type(self.serial).rts = self._mock_rts_prop = PropertyMock(return_value=None)
self._mock_set_modem_pins = Mock()

async def set_modem_pins(self, *, dtr=None, rts=None, **kwargs):
self._mock_set_modem_pins(dtr=dtr, rts=rts, **kwargs)

def _connect(self):
assert not self._is_connected
Expand Down Expand Up @@ -154,7 +156,7 @@ def passthrough_serial_conn(loop, protocol_factory, url, *args, **kwargs):
return fut

mocker.patch(
"serial_asyncio_fast.create_serial_connection", new=passthrough_serial_conn
"zigpy_znp.uart.create_serial_connection", new=passthrough_serial_conn
)

# So we don't have to import it every time
Expand Down
12 changes: 3 additions & 9 deletions tests/test_uart.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import asyncio

import pytest
from serial_asyncio_fast import SerialTransport

import zigpy_znp.types as t
import zigpy_znp.config as conf
Expand Down Expand Up @@ -33,21 +32,16 @@ def create_serial_conn(loop, protocol_factory, url, *args, **kwargs):

protocol = protocol_factory()

# Our event loop doesn't really do anything
loop.add_writer = lambda *args, **kwargs: None
loop.add_reader = lambda *args, **kwargs: None
loop.remove_writer = lambda *args, **kwargs: None
loop.remove_reader = lambda *args, **kwargs: None

transport = SerialTransport(loop, protocol, serial_interface)
transport = mocker.Mock()
transport.serial = serial_interface

protocol.connection_made(transport)

fut.set_result((transport, protocol))

return fut

mocker.patch("serial_asyncio_fast.create_serial_connection", new=create_serial_conn)
mocker.patch("zigpy_znp.uart.create_serial_connection", new=create_serial_conn)

return device, serial_interface

Expand Down
2 changes: 1 addition & 1 deletion zigpy_znp/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,7 @@ async def ping_task():
self._znp_config[conf.CONF_CONNECT_DTR_STATES],
self._znp_config[conf.CONF_CONNECT_RTS_STATES],
):
self._uart.set_dtr_rts(dtr=dtr, rts=rts)
await self._uart.set_dtr_rts(dtr=dtr, rts=rts)
await asyncio.sleep(BOOTLOADER_PIN_TOGGLE_DELAY)

# First, just try pinging
Expand Down
16 changes: 5 additions & 11 deletions zigpy_znp/uart.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import logging

import zigpy.config
import zigpy.serial
from zigpy.serial import SerialProtocol, create_serial_connection

import zigpy_znp.config as conf
import zigpy_znp.frames as frames
Expand All @@ -20,7 +20,7 @@ class BufferTooShort(Exception):
pass


class ZnpMtProtocol(zigpy.serial.SerialProtocol):
class ZnpMtProtocol(SerialProtocol):
def __init__(self, api, *, url: str | None = None) -> None:
super().__init__()
self._api = api
Expand Down Expand Up @@ -74,15 +74,9 @@ def write(self, data: bytes) -> None:
LOGGER.log(log.TRACE, "Sending data: %s", Bytes.__repr__(data))
self._transport.write(data)

def set_dtr_rts(self, *, dtr: bool, rts: bool) -> None:
# TCP transport does not have DTR or RTS pins
if not hasattr(self._transport, "serial"):
return

async def set_dtr_rts(self, *, dtr: bool, rts: bool) -> None:
LOGGER.debug("Setting serial pin states: DTR=%s, RTS=%s", dtr, rts)

self._transport.serial.dtr = dtr
self._transport.serial.rts = rts
await self._transport.set_modem_pins(dtr=dtr, rts=rts)

def _extract_frames(self) -> typing.Iterator[frames.TransportFrame]:
"""Extracts frames from the buffer until it is exhausted."""
Expand Down Expand Up @@ -145,7 +139,7 @@ def __repr__(self) -> str:
async def connect(config: conf.ConfigType, api) -> ZnpMtProtocol:
port = config[zigpy.config.CONF_DEVICE_PATH]

_, protocol = await zigpy.serial.create_serial_connection(
_, protocol = await create_serial_connection(
loop=asyncio.get_running_loop(),
protocol_factory=lambda: ZnpMtProtocol(api, url=port),
url=port,
Expand Down
Loading