Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
736 olof 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
 
737 olof 26
    def __init__ (self, pktHandler, port):
736 olof 27
        Thread.__init__(self)
28
        self.pktHandler = pktHandler
29
        self.port = port
30
 
31
    def run(self):
737 olof 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)
736 olof 45
 
737 olof 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
 
736 olof 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
 
737 olof 74
    def __init__ (self, pktHandler, cfg = None):
736 olof 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
 
737 olof 96
        self.serialThread = SerialThread(self.pktHandler, port)
736 olof 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')
737 olof 105
 
106
    def running(self):
107
        if self.serialThread is not None:
108
            return self.serialThread.terminated
109
        else:
110
            return False
111