Skip to content

Commit 71544c8

Browse files
committed
Count the number of frames sent such as for testing issue bobjacobsen#70 (needs confirmation) and bobjacobsen#71. Helps validate pull request bobjacobsen#67.
1 parent 466c369 commit 71544c8

10 files changed

+45
-12
lines changed

examples/example_frame_interface.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def sendToSocket(frame: CanFrame):
4949

5050
def handleFrameSent(frame):
5151
# No state to manage since no link layer
52-
pass
52+
physicalLayer._sentFramesCount += 1
5353

5454

5555
def handleFrameReceived(frame):
@@ -60,9 +60,11 @@ def handleFrameReceived(frame):
6060
def printFrame(frame):
6161
print("RL: {}".format(frame))
6262

63+
6364
def handleDisconnect():
6465
print("Disconnected.")
6566

67+
6668
physicalLayer = CanPhysicalLayerGridConnect()
6769

6870
# NOTE: Normally the required handlers are set by link layer

examples/example_tcp_message_interface.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,17 @@ def printMessage(msg):
7979
# send an VerifyNodes message to provoke response
8080
message = Message(MTI.Verify_NodeID_Number_Global,
8181
NodeID(settings['localNodeID']), None)
82-
print("SM: {}".format(message))
82+
print("Sending Message: {}...".format(message))
83+
previousCount = physicalLayer._sentFramesCount
8384
tcpLinkLayer.sendMessage(message, verbose=True)
85+
thisSentCount = physicalLayer._sentFramesCount - previousCount
86+
messageCount = 1
87+
assert thisSentCount == messageCount, \
88+
"Expected {} sent since realtime, got {}".format(messageCount,
89+
thisSentCount)
90+
# ^ Change the assertion if more than one message is required for some
91+
# reason (expected one sent here instead of after sendAll *only* since
92+
# using a Realtime subclass for physicalLayer in this example.)
8493
physicalLayer.sendAll(sock, verbose=True) # only a formality since Realtime
8594
# N/A
8695
# while not tcpLinkLayer.getState() == TcpLink.State.Permitted:

openlcb/linklayer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ def pollState(self):
101101

102102
def handleFrameSent(self, frame):
103103
"""Update state based on the frame having been sent."""
104-
if frame.afterSendState is not None:
104+
if self.physicalLayer:
105+
self.physicalLayer._sentFramesCount += 1
106+
if (hasattr(frame, 'afterSendState')
107+
and (frame.afterSendState is not None)):
105108
self.setState(frame.afterSendState) # may change again
106109
# since setState calls pollState via _onStateChanged.
107110

openlcb/physicallayer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,12 @@ class PhysicalLayer:
5656
"""
5757

5858
def __init__(self):
59+
self._sentFramesCount = 0
5960
self._send_frames = deque()
6061
# self._send_chunks = deque()
6162
self.onQueuedFrame = None
6263

63-
def sendDataAfter(self, data: Union[bytes, bytearray]):
64+
def sendDataAfter(self, data: Union[bytes, bytearray], verbose=False):
6465
raise NotImplementedError(
6566
"This method is only for Realtime subclass(es)"
6667
" (which should only be used when not using GridConnect"

openlcb/realtimephysicallayer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ def sendDataAfter(self, data: Union[bytearray, bytes], verbose=True):
4646
# )
4747
assert isinstance(data, (bytes, bytearray))
4848
if verbose:
49-
print(" SR: {}".format(data))
49+
print("- SENT data (realtime): {}".format(data.strip()))
5050
self.sock.send(data)
51+
self.onFrameSent(data)
5152

5253
def sendFrameAfter(self, frame, verbose=False):
5354
"""Send frame (immediately, since realtime subclass).
@@ -73,11 +74,12 @@ def sendFrameAfter(self, frame, verbose=False):
7374
# .format(type(data).__name__, data)
7475
# )
7576
if verbose:
76-
print(" SR: {}".format(frame))
77+
print("- SENT frame (realtime): {}".format(frame))
7778
# send and fireFrameReceived would usually occur after
7879
# frame from _send_frames.popleft is sent,
7980
# but we do all this here in the Realtime subclass:
8081
self.sock.send(data)
82+
self.onFrameSent(data)
8183
if hasattr(frame, 'afterSendState') and frame.afterSendState:
8284
# Use hasattr since only applicable to subclasses that use
8385
# CanFrame.

openlcb/realtimerawphysicallayer.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ class RealtimeRawPhysicalLayer(RealtimePhysicalLayer, RawPhysicalLayer):
1313
See RealtimePhysicalLayer for more information.
1414
"""
1515
def sendFrameAfter(self, frame, verbose=False):
16-
self.sendDataAfter(frame, verbose=verbose)
16+
self._sendDataAfter(frame, verbose=verbose)
17+
self.onFrameSent(frame)
1718

1819
def sendDataAfter(self, data: Union[bytearray, bytes], verbose=False):
20+
self._sendDataAfter(data, verbose=verbose)
21+
self.onFrameSent(data)
22+
23+
def _sendDataAfter(self, data: Union[bytearray, bytes], verbose=False):
1924
# ^ data for sendDataAfter,
2025
# For frame see sendFrameAfter.
2126
# verbose is only for Realtime subclass (since data is sent
@@ -29,5 +34,5 @@ def sendDataAfter(self, data: Union[bytearray, bytes], verbose=False):
2934
data = data.encode("utf-8")
3035
assert isinstance(data, (bytes, bytearray))
3136
if verbose:
32-
print(" SR: {}".format(data))
37+
print("- SENT data (realtime raw): {}".format(data.strip()))
3338
self.sock.send(data)

openlcb/tcplink/tcplink.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,6 @@ def sendMessage(self, message: Message, verbose=False):
238238

239239
outputBytes.extend(message.data)
240240

241-
self.physicalLayer.sendDataAfter(outputBytes)
241+
self.physicalLayer.sendDataAfter(outputBytes, verbose=verbose)
242242
# ^ The physical layer should be one with "Raw" in the name
243243
# since takes bytes. See example_tcp_message_interface.

tests/test_canlink.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ def __init__(self):
2525
self.sentFrames = []
2626
CanPhysicalLayer.__init__(self)
2727

28-
def sendDataAfter(self, data):
28+
def sendDataAfter(self, data, verbose=False):
29+
# verbose: ignored since used in sendAll when not a Realtime subclass.
2930
assert isinstance(data, (bytes, bytearray))
3031
self.sentFrames.append(data)
3132

@@ -58,7 +59,8 @@ def sendAll(self, _, mode="binary", verbose=True) -> int:
5859
string = frame.encodeAsString()
5960
# device.sendString(string) # commented since simulation
6061
if verbose:
61-
print(" SENT (simulated socket) packet: "+string.strip())
62+
print("- SENT frame (simulated socket) packet: {}"
63+
.format(string.strip()))
6264
self.physicalLayer.onFrameSent(frame)
6365
count += 1
6466
return count

tests/test_canphysicallayer.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,28 @@ class TestCanPhysicalLayerClass(unittest.TestCase):
99
# test function marks that the listeners were fired
1010
received = False
1111

12+
def __init__(self, *args):
13+
unittest.TestCase.__init__(self, *args)
14+
self.layer = None
15+
self._sentFramesCount = 0
16+
1217
def receiveListener(self, frame: CanFrame):
1318
self.received = True
1419

1520
def handleFrameReceived(self, frame: CanFrame):
1621
pass
1722

1823
def handleFrameSent(self, frame: CanFrame):
19-
pass
24+
self._sentFramesCount += 1
25+
if self.layer:
26+
self.layer._sentFramesCount += 1
2027

2128
def testReceipt(self):
2229
self.received = False
2330
frame = CanFrame(0x000, bytearray())
2431
receiver = self.receiveListener
2532
layer = CanPhysicalLayer()
33+
self.layer = layer
2634
layer.onFrameReceived = self.handleFrameReceived
2735
layer.onFrameSent = self.handleFrameSent
2836
layer.registerFrameReceivedListener(receiver)

tests/test_canphysicallayergridconnect.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def captureString(self, frame: CanFrame):
3030

3131
def onFrameSent(self, frame: CanFrame):
3232
pass
33+
self._sentFramesCount += 1
3334
# NOTE: not patching this method to be canLink.handleFrameSent
3435
# since testing only physical layer not link layer.
3536

0 commit comments

Comments
 (0)