/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
- import sys, os
- import serial
- import array
- import time
- import optparse
- import ConfigParser
- import logging
- logging.basicConfig(level=logging.INFO)
- log = logging.getLogger( 'ScannerInterface' )
- class ScannerInterface( object ):
- cmdprefix = [22, 77, 13]
- response = { 6: 'ACK', 5: 'ENQ', 21: 'NAK' }
-
- def __init__( self, port ):
- if os.name in ['posix', 'mac']:
- self.port = port
- elif os.name == 'nt':
- self.port = int(port)
- if self.port:
- self.open()
-
- def open(self):
- try:
- self.serial_conn = serial.Serial(self.port)
- except serial.SerialException:
- log.exception('Unable to open port: %s' % str(self.port))
- sys.exit(1)
- log.debug('Port %s is open: %s' %( str(self.port), self.serial_conn.isOpen() ) )
-
- def is_open(self):
- return self.serial_conn.isOpen()
-
- def close(self):
- self.serial_conn.close()
- log.debug('Port %s is open: %s' %( str(self.port), self.serial_conn.isOpen() ) )
-
- def send(self, msg):
- message = self.cmdprefix + map(ord, msg)
- byte_array = array.array('B', message)
- log.debug('Sending message to %s: %s' % ( str(self.port), message) )
- bytes = self.serial_conn.write( byte_array.tostring() )
- log.debug('%i bytes out of %i bytes sent to the scanner' % ( bytes, len(message) ) )
-
- def recv(self):
- time.sleep(1)
- self.serial_conn.flush()
- nbytes = self.serial_conn.inWaiting()
- log.debug('%i bytes received' % nbytes)
- if nbytes:
- msg = self.serial_conn.read(nbytes)
- byte_array = map(ord, msg)
- log.debug('Message received [%s]: %s' % (self.response.get(byte_array[len(byte_array)-2], byte_array[len(byte_array)-2]),
- msg))
- return msg
- else:
- log.error('Error!')
- return None
-
- def setup_recv(self, callback):
- self.recv_callback = callback
-
- def wait(self):
- nbytes = self.serial_conn.inWaiting()
- if nbytes:
- msg = self.serial_conn.read(nbytes)
- byte_array = map(ord, msg)
- log.debug('Message received [%s]: %s' % (self.response.get(byte_array[len(byte_array)-2], byte_array[len(byte_array)-2],
- msg)))
- if self.recv_callback:
- self.recv_callback(msg)
- return