33from yahdlc import *
44from threading import Thread , Event , Lock
55from queue import Queue , Full
6- from time import sleep
6+ from time import sleep , time
77
88class 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