Subversion Repositories HomeAutomation

Rev

Rev 612 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. #!/usr/bin/python
  2.  
  3. import string
  4. import socket
  5.  
  6. import can
  7. import uncen
  8.  
  9. class Job( uncen.UncenJob ):
  10.     name    = "Socket tcp/text"
  11.     version = "0.03"
  12.  
  13.     cid     = None
  14.     listen  = True
  15.  
  16.     buffer  = ""
  17.  
  18.  
  19.     def getstatus( self ):
  20.         return "%s:%d" % (self.peername[0], self.peername[1])
  21.  
  22.     def __init__( self, core, attr ):
  23.         self.job_init( core )
  24.  
  25.         host = (str( attr[0] ), int( attr[1] ) )
  26.  
  27.         self.stream = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
  28.         self.stream.connect( host )
  29.  
  30.         self.peername = self.stream.getpeername()
  31.  
  32.         self.trigger_add( self.stream.fileno() )
  33.  
  34.     def close( self ):
  35.         self.stream.close()
  36.         self.job_close()
  37.  
  38.     def trigger( self, fd, eventmask ):
  39.         data = self.buffer + self.stream.recv( 8192 )
  40.         lines = data.split("\n")
  41.         self.buffer = lines.pop()
  42.  
  43.         if self.cid == None:
  44.             return
  45.  
  46.         for line in lines:
  47.             canp = self.decode( line )
  48.             self.can_send( self.cid, canp )
  49.  
  50.  
  51.     def can_recieve( self, cid, canp ):
  52.         line = self.encode( canp )
  53.         self.stream.send( line + "\n" )
  54.  
  55.     def can_accept( self, sjid, cid ):
  56.         self.listen = False
  57.         self.cid = cid
  58.         return True
  59.  
  60.     def can_close( self, cid ):
  61.         self.cid = None
  62.         self.listen = True
  63.  
  64.     def decode( self, line ):
  65.         words = line.split(" ")
  66.         if words[0] == "PKT":
  67.             return can.CanPacket(   int( words[1], 16 ), \
  68.                                 [ int( val, 16 ) for val in words[4:] ], \
  69.                                 words[2]!="0", \
  70.                                 words[3]!="0" )
  71.         return None
  72.  
  73.     def encode( self, canp ):
  74.         return ("PKT %08x %d %d" % (canp.id, canp.extended, canp.remote) ) + \
  75.             string.join( [ " %02x"%val for val in canp.data ], "" )
  76.