Skip to content

Commit 8e78274

Browse files
committed
add sending timeout
1 parent 1351cd5 commit 8e78274

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

hdlcontroller.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33
from yahdlc import *
44
from threading import Thread, Event, Lock
55
from queue import Queue, Full
6-
from time import sleep
6+
from time import sleep, time
77

88
class HDLController:
99
"""
1010
An HDLC controller based on python4yahdlc.
1111
"""
1212

1313
MAX_SEQ_NO = 8
14+
MIN_SENDING_TIMEOUT = 0.5
1415

15-
def __init__(self, read_func, write_func, window=3, frames_queue_size=10):
16+
def __init__(self, read_func, write_func, sending_timeout=2, window=3, frames_queue_size=10):
1617
if not hasattr(read_func, '__call__'):
1718
raise TypeError('The read function parameter is not a callable object')
1819
if not hasattr(write_func, '__call__'):
@@ -29,6 +30,8 @@ def __init__(self, read_func, write_func, window=3, frames_queue_size=10):
2930
self.send_callback = None
3031
self.receive_callback = None
3132

33+
self.set_sending_timeout(sending_timeout)
34+
3235
self.receiver = None
3336
self.frames_received = Queue(frames_queue_size)
3437

@@ -87,6 +90,14 @@ def set_receive_callback(self, callback):
8790

8891
self.receive_callback = callback
8992

93+
def set_sending_timeout(self, sending_timeout):
94+
"""
95+
Set the sending timeout.
96+
"""
97+
98+
if sending_timeout >= HDLController.MIN_SENDING_TIMEOUT:
99+
self.sending_timeout = sending_timeout
100+
90101
def get_senders_number(self):
91102
"""
92103
Return the number of active
@@ -112,6 +123,7 @@ def send(self, data):
112123
self.send_lock,
113124
data,
114125
self.new_seq_no,
126+
timeout=self.sending_timeout,
115127
callback=self.send_callback,
116128
)
117129

@@ -133,12 +145,13 @@ class Sender(Thread):
133145
Thread used to send HDLC frames.
134146
"""
135147

136-
def __init__(self, write_func, send_lock, data, seq_no, callback=None):
148+
def __init__(self, write_func, send_lock, data, seq_no, timeout=2, callback=None):
137149
super().__init__()
138150
self.write = write_func
139151
self.send_lock = send_lock
140152
self.data = data
141153
self.seq_no = seq_no
154+
self.timeout = timeout
142155
self.callback = callback
143156
self.ack = Event()
144157

@@ -147,7 +160,9 @@ def run(self):
147160
self.__send_data()
148161

149162
while not self.ack.isSet():
150-
pass
163+
if time() >= self.next_timeout:
164+
with self.send_lock:
165+
self.__send_data()
151166

152167
def join(self, timeout=None):
153168
"""
@@ -187,6 +202,7 @@ def __send_data(self):
187202
self.callback(self.data)
188203

189204
self.write(frame_data(self.data, FRAME_DATA, self.seq_no))
205+
self.next_timeout = time() + self.timeout
190206

191207
class Receiver(Thread):
192208
"""

0 commit comments

Comments
 (0)