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
class SerialThread(Thread):
15
 
16
    terminated = False
17
    port = None
18
    pktHandler = None
19
 
737 olof 20
    def __init__ (self, pktHandler, port):
736 olof 21
        Thread.__init__(self)
22
        self.pktHandler = pktHandler
23
        self.port = port
24
 
25
    def run(self):
737 olof 26
        try:
27
            log.debug('SerialThread.run')
28
            readBuffer = []
29
 
30
            while not self.terminated:
31
                inByte = self.port.read()
32
                if inByte == '\n':
33
                    msg = ''.join(readBuffer)
34
                    readBuffer = []
35
                    #print 'Incoming:', msg
36
                    self.pktHandler.input(msg)
37
                else:
38
                    readBuffer.append(inByte)
736 olof 39
 
738 olof 40
                time.sleep(0.001)
41
 
737 olof 42
            self.port.close()
738 olof 43
            self.ownerNotifier.notify(self.ownerNotifier.TERMINATE)
44
 
737 olof 45
        except: # sys.excepthook does not work in threads
46
            import traceback
47
            traceback.print_exc()
48
            self.terminate()
49
            self.port.close()
50
 
736 olof 51
    def terminate(self):
52
        log.debug('SerialThread.terminate')
53
        self.terminated = True
54
 
55
 
56
class NodeIfSerial(NodeIfBase):
57
 
58
    DEFAULT_CONFIG = {'serialPort':1, #com1
59
                      'baudRate':9600,
60
                      'byteSize':8,
61
                      'parity': 'N',
62
                      'stopBits':1,
63
                      'timeOut': 0, # must be 0 (non-blocking mode)
64
                      'softFlowCtl': 0,
65
                      'hardFlowCtl': 0
66
                      }
67
 
68
    serialThread = None
69
    pktHandler = None
70
 
737 olof 71
    def __init__ (self, pktHandler, cfg = None):
736 olof 72
        if cfg is None:
73
            self.config = self.DEFAULT_CONFIG
74
 
75
        self.pktHandler = pktHandler
76
        NodeIfBase.__init__(self, cfg, pktHandler)
77
 
78
    def start(self):
79
 
80
        try:
81
            port = serial.Serial(self.config['serialPort'],
82
                                 self.config['baudRate'],
83
                                 self.config['byteSize'],
84
                                 self.config['parity'],
85
                                 self.config['stopBits'],
86
                                 self.config['timeOut'],
87
                                 self.config['softFlowCtl'],
88
                                 self.config['hardFlowCtl'])
89
        except (serial.SerialException), Error:
90
            print Error
91
            return False
92
 
737 olof 93
        self.serialThread = SerialThread(self.pktHandler, port)
736 olof 94
        self.serialThread.start()
95
        return True
96
 
97
    def stop(self):
738 olof 98
        if self.serialThread is not None and not self.stimThread.terminated:
736 olof 99
            self.serialThread.terminate()
100
        else:
101
            log.debug('Serial interface not started, or already stopped')
737 olof 102
 
103
    def running(self):
104
        if self.serialThread is not None:
739 olof 105
            return not self.serialThread.terminated
737 olof 106
        else:
107
            return False
108