Skip to content

Commit 6ef4f5e

Browse files
authored
Make Network.notifier timeouts customizable (fixes #530) (#536)
* Add configurable timeouts for Network.notifier. Move the hard-coded 1 second maximum cycle duration passed during can.Notifier construction to a class variable NOTIFIER_CYCLE. Explicitly specify the timeout to stop the notifier in another class variable NOTIFIER_SHUTDOWN_TIMEOUT, matching the default used in python-can. These can be overridden per instance if needed. * Do not wait for notifier thread shutdown during tests. Explicitly set the NOTIFIER_SHUTDOWN_TIMEOUT to zero in all Network instances created for unit tests. This reduces total test running time from ~30 to ~9 seconds when run locally.
1 parent 932c621 commit 6ef4f5e

File tree

8 files changed

+20
-2
lines changed

8 files changed

+20
-2
lines changed

canopen/network.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
class Network(MutableMapping):
2626
"""Representation of one CAN bus containing one or more nodes."""
2727

28+
NOTIFIER_CYCLE: float = 1.0 #: Maximum waiting time for one notifier iteration.
29+
NOTIFIER_SHUTDOWN_TIMEOUT: float = 5.0 #: Maximum waiting time to stop notifiers.
30+
2831
def __init__(self, bus: Optional[can.BusABC] = None):
2932
"""
3033
:param can.BusABC bus:
@@ -105,7 +108,7 @@ def connect(self, *args, **kwargs) -> Network:
105108
if self.bus is None:
106109
self.bus = can.Bus(*args, **kwargs)
107110
logger.info("Connected to '%s'", self.bus.channel_info)
108-
self.notifier = can.Notifier(self.bus, self.listeners, 1)
111+
self.notifier = can.Notifier(self.bus, self.listeners, self.NOTIFIER_CYCLE)
109112
return self
110113

111114
def disconnect(self) -> None:
@@ -117,7 +120,7 @@ def disconnect(self) -> None:
117120
if hasattr(node, "pdo"):
118121
node.pdo.stop()
119122
if self.notifier is not None:
120-
self.notifier.stop()
123+
self.notifier.stop(self.NOTIFIER_SHUTDOWN_TIMEOUT)
121124
if self.bus is not None:
122125
self.bus.shutdown()
123126
self.bus = None

test/test_emcy.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ def setUp(self):
185185
self.txbus = can.Bus(interface="virtual")
186186
self.rxbus = can.Bus(interface="virtual")
187187
self.net = canopen.Network(self.txbus)
188+
self.net.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
188189
self.net.connect()
189190
self.emcy = canopen.emcy.EmcyProducer(0x80 + 1)
190191
self.emcy.network = self.net

test/test_local.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ class TestSDO(unittest.TestCase):
1313
@classmethod
1414
def setUpClass(cls):
1515
cls.network1 = canopen.Network()
16+
cls.network1.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
1617
cls.network1.connect("test", interface="virtual")
1718
cls.remote_node = cls.network1.add_node(2, SAMPLE_EDS)
1819

1920
cls.network2 = canopen.Network()
21+
cls.network2.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
2022
cls.network2.connect("test", interface="virtual")
2123
cls.local_node = cls.network2.create_node(2, SAMPLE_EDS)
2224

@@ -176,10 +178,12 @@ class TestPDO(unittest.TestCase):
176178
@classmethod
177179
def setUpClass(cls):
178180
cls.network1 = canopen.Network()
181+
cls.network1.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
179182
cls.network1.connect("test", interface="virtual")
180183
cls.remote_node = cls.network1.add_node(2, SAMPLE_EDS)
181184

182185
cls.network2 = canopen.Network()
186+
cls.network2.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
183187
cls.network2.connect("test", interface="virtual")
184188
cls.local_node = cls.network2.create_node(2, SAMPLE_EDS)
185189

test/test_network.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class TestNetwork(unittest.TestCase):
1111

1212
def setUp(self):
1313
self.network = canopen.Network()
14+
self.network.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
1415

1516
def test_network_add_node(self):
1617
# Add using str.
@@ -328,6 +329,7 @@ def test_scanner_search(self):
328329
self.addCleanup(txbus.shutdown)
329330

330331
net = canopen.Network(txbus)
332+
net.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
331333
net.connect()
332334
self.addCleanup(net.disconnect)
333335

@@ -347,6 +349,7 @@ def test_scanner_search(self):
347349
def test_scanner_search_limit(self):
348350
bus = can.Bus(interface="virtual", receive_own_messages=True)
349351
net = canopen.Network(bus)
352+
net.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
350353
net.connect()
351354
self.addCleanup(net.disconnect)
352355

test/test_nmt.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def setUp(self):
5252
receive_own_messages=True,
5353
)
5454
net = canopen.Network(bus)
55+
net.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
5556
net.connect()
5657
with self.assertLogs():
5758
node = net.add_node(self.NODE_ID, SAMPLE_EDS)
@@ -127,11 +128,13 @@ def test_nmt_master_node_guarding(self):
127128
class TestNmtSlave(unittest.TestCase):
128129
def setUp(self):
129130
self.network1 = canopen.Network()
131+
self.network1.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
130132
self.network1.connect("test", interface="virtual")
131133
with self.assertLogs():
132134
self.remote_node = self.network1.add_node(2, SAMPLE_EDS)
133135

134136
self.network2 = canopen.Network()
137+
self.network2.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
135138
self.network2.connect("test", interface="virtual")
136139
with self.assertLogs():
137140
self.local_node = self.network2.create_node(2, SAMPLE_EDS)

test/test_sdo.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def _send_message(self, can_id, data, remote=False):
3131

3232
def setUp(self):
3333
network = canopen.Network()
34+
network.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
3435
network.send_message = self._send_message
3536
node = network.add_node(2, SAMPLE_EDS)
3637
node.sdo.RESPONSE_TIMEOUT = 0.01
@@ -181,6 +182,7 @@ def _send_message(self, can_id, data, remote=False):
181182

182183
def setUp(self):
183184
network = canopen.Network()
185+
network.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
184186
network.send_message = self._send_message
185187
node = network.add_node(2, DATATYPES_EDS)
186188
node.sdo.RESPONSE_TIMEOUT = 0.01

test/test_sync.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
class TestSync(unittest.TestCase):
1313
def setUp(self):
1414
self.net = canopen.Network()
15+
self.net.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
1516
self.net.connect(interface="virtual")
1617
self.sync = canopen.sync.SyncProducer(self.net)
1718
self.rxbus = can.Bus(interface="virtual")

test/test_time.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class TestTime(unittest.TestCase):
66

77
def test_time_producer(self):
88
network = canopen.Network()
9+
network.NOTIFIER_SHUTDOWN_TIMEOUT = 0.0
910
network.connect(interface="virtual", receive_own_messages=True)
1011
producer = canopen.timestamp.TimeProducer(network)
1112
producer.transmit(1486236238)

0 commit comments

Comments
 (0)