Subversion Repositories HomeAutomation

Rev

Rev 736 | Blame | Last modification | View Log | SVN | RSS feed

  1. ###########################################################
  2. #
  3. # Serial interface, connects with can bus over a serial
  4. # line
  5. #
  6. ###########################################################
  7. import logging as log
  8. from NodeIfBase import NodeIfBase
  9. from threading import Thread
  10. import serial
  11. import sys
  12. import time
  13.  
  14. UART_START_BYTE = 253
  15. UART_END_BYTE = 250
  16. PACKET_LENGTH = 17
  17. readBufferSize = 8192
  18. UART_CONN_BYTE = 252
  19.  
  20. class SerialThread(Thread):
  21.    
  22.     terminated = False
  23.     port = None
  24.     pktHandler = None
  25.    
  26.     def __init__ (self, pktHandler, port):
  27.         Thread.__init__(self)
  28.         self.pktHandler = pktHandler
  29.         self.port = port
  30.  
  31.     def run(self):
  32.         try:
  33.             log.debug('SerialThread.run')
  34.             readBuffer = []
  35.                    
  36.             while not self.terminated:
  37.                 inByte = self.port.read()
  38.                 if inByte == '\n':
  39.                     msg = ''.join(readBuffer)
  40.                     readBuffer = []
  41.                     #print 'Incoming:', msg
  42.                     self.pktHandler.input(msg)
  43.                 else:
  44.                     readBuffer.append(inByte)
  45.    
  46.                 time.sleep(0.1)
  47.             self.port.close()
  48.         except: # sys.excepthook does not work in threads
  49.             import traceback
  50.             traceback.print_exc()
  51.             self.terminate()
  52.             self.port.close()
  53.    
  54.     def terminate(self):
  55.         log.debug('SerialThread.terminate')
  56.         self.terminated = True
  57.        
  58.  
  59. class NodeIfSerial(NodeIfBase):
  60.    
  61.     DEFAULT_CONFIG = {'serialPort':1, #com1
  62.                       'baudRate':9600,
  63.                       'byteSize':8,
  64.                       'parity': 'N',
  65.                       'stopBits':1,
  66.                       'timeOut': 0, # must be 0 (non-blocking mode)
  67.                       'softFlowCtl': 0,
  68.                       'hardFlowCtl': 0
  69.                       }
  70.    
  71.     serialThread = None
  72.     pktHandler = None
  73.    
  74.     def __init__ (self, pktHandler, cfg = None):
  75.         if cfg is None:
  76.             self.config = self.DEFAULT_CONFIG
  77.        
  78.         self.pktHandler = pktHandler
  79.         NodeIfBase.__init__(self, cfg, pktHandler)
  80.    
  81.     def start(self):
  82.        
  83.         try:
  84.             port = serial.Serial(self.config['serialPort'],
  85.                                  self.config['baudRate'],
  86.                                  self.config['byteSize'],
  87.                                  self.config['parity'],
  88.                                  self.config['stopBits'],
  89.                                  self.config['timeOut'],
  90.                                  self.config['softFlowCtl'],
  91.                                  self.config['hardFlowCtl'])
  92.         except (serial.SerialException), Error:
  93.             print Error
  94.             return False
  95.        
  96.         self.serialThread = SerialThread(self.pktHandler, port)
  97.         self.serialThread.start()
  98.         return True
  99.  
  100.     def stop(self):
  101.         if self.serialThread is not None:
  102.             self.serialThread.terminate()
  103.         else:
  104.             log.debug('Serial interface not started, or already stopped')
  105.            
  106.     def running(self):
  107.         if self.serialThread is not None:
  108.             return self.serialThread.terminated
  109.         else:
  110.             return False
  111.