14
14
import select
15
15
import sys
16
16
from .base_device import Device
17
- from ..util import CommError , TimeoutError , NoDeviceError , bytes_hack
17
+ from ..util import CommError , TimeoutError , NoDeviceError , bytes_hack , filter_ad2prot_byte
18
18
19
19
20
20
class SerialDevice (Device ):
@@ -141,7 +141,7 @@ def close(self):
141
141
def fileno (self ):
142
142
"""
143
143
Returns the file number associated with the device
144
-
144
+
145
145
:returns: int
146
146
"""
147
147
return self ._device .fileno ()
@@ -178,18 +178,18 @@ def read(self):
178
178
:returns: character read from the device
179
179
:raises: :py:class:`~alarmdecoder.util.CommError`
180
180
"""
181
- data = ''
181
+ data = b ''
182
182
183
183
try :
184
184
read_ready , _ , _ = select .select ([self ._device .fileno ()], [], [], 0.5 )
185
185
186
186
if len (read_ready ) != 0 :
187
- data = self ._device .read (1 )
187
+ data = filter_ad2prot_byte ( self ._device .read (1 ) )
188
188
189
189
except serial .SerialException as err :
190
190
raise CommError ('Error reading from device: {0}' .format (str (err )), err )
191
191
192
- return data . decode ( 'utf-8' )
192
+ return data
193
193
194
194
def read_line (self , timeout = 0.0 , purge_buffer = False ):
195
195
"""
@@ -213,62 +213,46 @@ def timeout_event():
213
213
if purge_buffer :
214
214
self ._buffer = b''
215
215
216
- got_line , data = False , ''
216
+ got_line , ret = False , None
217
217
218
218
timer = threading .Timer (timeout , timeout_event )
219
219
if timeout > 0 :
220
220
timer .start ()
221
221
222
- leftovers = b''
223
222
try :
224
- while timeout_event .reading and not got_line :
223
+ while timeout_event .reading :
225
224
read_ready , _ , _ = select .select ([self ._device .fileno ()], [], [], 0.5 )
225
+
226
226
if len (read_ready ) == 0 :
227
227
continue
228
228
229
- bytes_avail = 0
230
- if hasattr (self ._device , "in_waiting" ):
231
- bytes_avail = self ._device .in_waiting
232
- else :
233
- bytes_avail = self ._device .inWaiting ()
234
-
235
- buf = self ._device .read (bytes_avail )
236
-
237
- for idx in range (len (buf )):
238
- c = buf [idx ]
239
-
240
- ub = bytes_hack (c )
241
- if sys .version_info > (3 ,):
242
- ub = bytes ([ub ])
243
-
244
- # NOTE: AD2SERIAL and AD2PI apparently sends down \xFF on boot.
245
- if ub != b'' and ub != b"\xff " :
246
- self ._buffer += ub
229
+ buf = filter_ad2prot_byte (self ._device .read (1 ))
247
230
248
- if ub == b" \n " :
249
- self ._buffer = self . _buffer . strip ( b" \r \n " )
231
+ if buf != b'' :
232
+ self ._buffer += buf [ 0 ]
250
233
251
- if len (self ._buffer ) > 0 :
252
- got_line = True
253
- leftovers = buf [idx :]
254
- break
234
+ if buf == b"\n " :
235
+ self ._buffer = self ._buffer .rstrip (b"\r \n " )
255
236
237
+ if len (self ._buffer ) > 0 :
238
+ got_line = True
239
+ break
256
240
except (OSError , serial .SerialException ) as err :
257
241
raise CommError ('Error reading from device: {0}' .format (str (err )), err )
258
242
259
243
else :
260
244
if got_line :
261
- data , self ._buffer = self ._buffer , leftovers
245
+ ret , self ._buffer = self ._buffer , b''
262
246
263
- self .on_read (data = data )
247
+ self .on_read (data = ret )
264
248
265
249
else :
266
250
raise TimeoutError ('Timeout while waiting for line terminator.' )
267
251
268
252
finally :
269
253
timer .cancel ()
270
254
271
- return data . decode ( 'utf-8' )
255
+ return ret
272
256
273
257
def purge (self ):
274
258
"""
0 commit comments