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
746 olof 70
    config = {}
736 olof 71
 
737 olof 72
    def __init__ (self, pktHandler, cfg = None):
736 olof 73
        if cfg is None:
74
            self.config = self.DEFAULT_CONFIG
746 olof 75
        else:
76
            self.confg = cfg
736 olof 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):
738 olof 101
        if self.serialThread is not None and not self.stimThread.terminated:
736 olof 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:
739 olof 108
            return not self.serialThread.terminated
737 olof 109
        else:
110
            return False
111