/scripts/galaxy_messaging/client/scanner_interface.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 76 lines · 63 code · 13 blank · 0 comment · 9 complexity · a9e952a6e7d0a3d1e34ff237c3ff75e0 MD5 · raw file

  1. import sys, os
  2. import serial
  3. import array
  4. import time
  5. import optparse
  6. import ConfigParser
  7. import logging
  8. logging.basicConfig(level=logging.INFO)
  9. log = logging.getLogger( 'ScannerInterface' )
  10. class ScannerInterface( object ):
  11. cmdprefix = [22, 77, 13]
  12. response = { 6: 'ACK', 5: 'ENQ', 21: 'NAK' }
  13. def __init__( self, port ):
  14. if os.name in ['posix', 'mac']:
  15. self.port = port
  16. elif os.name == 'nt':
  17. self.port = int(port)
  18. if self.port:
  19. self.open()
  20. def open(self):
  21. try:
  22. self.serial_conn = serial.Serial(self.port)
  23. except serial.SerialException:
  24. log.exception('Unable to open port: %s' % str(self.port))
  25. sys.exit(1)
  26. log.debug('Port %s is open: %s' %( str(self.port), self.serial_conn.isOpen() ) )
  27. def is_open(self):
  28. return self.serial_conn.isOpen()
  29. def close(self):
  30. self.serial_conn.close()
  31. log.debug('Port %s is open: %s' %( str(self.port), self.serial_conn.isOpen() ) )
  32. def send(self, msg):
  33. message = self.cmdprefix + map(ord, msg)
  34. byte_array = array.array('B', message)
  35. log.debug('Sending message to %s: %s' % ( str(self.port), message) )
  36. bytes = self.serial_conn.write( byte_array.tostring() )
  37. log.debug('%i bytes out of %i bytes sent to the scanner' % ( bytes, len(message) ) )
  38. def recv(self):
  39. time.sleep(1)
  40. self.serial_conn.flush()
  41. nbytes = self.serial_conn.inWaiting()
  42. log.debug('%i bytes received' % nbytes)
  43. if nbytes:
  44. msg = self.serial_conn.read(nbytes)
  45. byte_array = map(ord, msg)
  46. log.debug('Message received [%s]: %s' % (self.response.get(byte_array[len(byte_array)-2], byte_array[len(byte_array)-2]),
  47. msg))
  48. return msg
  49. else:
  50. log.error('Error!')
  51. return None
  52. def setup_recv(self, callback):
  53. self.recv_callback = callback
  54. def wait(self):
  55. nbytes = self.serial_conn.inWaiting()
  56. if nbytes:
  57. msg = self.serial_conn.read(nbytes)
  58. byte_array = map(ord, msg)
  59. log.debug('Message received [%s]: %s' % (self.response.get(byte_array[len(byte_array)-2], byte_array[len(byte_array)-2],
  60. msg)))
  61. if self.recv_callback:
  62. self.recv_callback(msg)
  63. return