Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
736 olof 1
###########################################################
2
#
3
# The default implementation of the packet handler
4
#
5
###########################################################
6
from CanPktHandlerBase import CanPktHandlerBase
738 olof 7
from CanPkt import CanPkt
752 olof 8
import logging as log
736 olof 9
 
748 olof 10
class SpacePort():
11
 
12
    filterSpaces = {}
13
 
14
    def __init__ (self, filterSpaces):
15
        for fs in filterSpaces:
750 olof 16
            sName = fs.__module__.split('.')[1] # implies module name is statespace.XXX
17
            self.filterSpaces[sName] = fs
748 olof 18
 
19
    def runAll(self, args):
750 olof 20
        for fs in self.filterSpaces.values():
21
            relatedSpaces = fs.__RELATED_SPACES__
748 olof 22
            fs.run(relatedSpaces, args)
750 olof 23
        return True
748 olof 24
 
25
    def run(self, spaceName, args):
750 olof 26
        if not self.filterSpaces.has_key(spaceName):
27
            return False
28
        else:
29
            relatedSpaces = self.filterSpaces[spaceName].__RELATED_SPACES__
30
            self.filtersSpaces[spaceName].run(relatedSpaces, args)
31
            return True
748 olof 32
 
736 olof 33
class CanPktHandler1(CanPktHandlerBase):
34
 
35
    daemonCfg = None
752 olof 36
    serverListeners =[]
736 olof 37
 
38
    def __init__ (self, daemonCfg):
39
        self.daemonCfg = daemonCfg
738 olof 40
 
41
    def input(self, strdata):
736 olof 42
        """Make data buffer into CanPkt and do early discard check """
43
        """Call all filters in chain """
748 olof 44
 
738 olof 45
        if len(strdata) < 2:
736 olof 46
            return
738 olof 47
        if strdata[0:3] != 'PKT':
736 olof 48
            return
738 olof 49
 
746 olof 50
#        print strdata
738 olof 51
        pkt = CanPkt.stringToCanPkt(self, strdata)
746 olof 52
#        print 'incoming: ' + pkt.toString()
738 olof 53
 
737 olof 54
        for filter in self.daemonCfg.filterChain:
55
            fObj = self.daemonCfg.filterCfg.filterModules[filter]
748 olof 56
            sp = SpacePort(fObj.__ASSOCIATED_SPACES__)
57
            fObj.filter('', pkt, sp) # FIXME: use if name
752 olof 58
 
59
        for sl in self.serverListeners:
60
            if not sl.full():
61
                sl.write(pkt.toString())
62
            else:
63
                log.debug('WARNING: Overflow in server buffer: ' + sl + ', packet dropped')
748 olof 64
 
736 olof 65
    def output(self, data):
66
        pass
752 olof 67
 
68
    def addServerListener(self, serverListener):
69
        self.serverListeners.append(serverListener)
70
 
71
    def remServerListener(self, serverListener):
72
        self.serverListeners.remove(serverListerner)
73