#!/usr/bin/env python
from twisted.internet.protocol import DatagramProtocol
import time
from twisted.internet import reactor
import sys                    
from socket import SOL_SOCKET, SO_BROADCAST
import IN, os
sys.path.append(os.path.dirname(sys.argv[0])+'/../domotika')
from dmlib import ikaprotocol as proto
from dmlib import constants as C
import struct
if not 'SO_BINDTODEVICE' in dir(IN):
   IN.SO_BINDTODEVICE = 25


class DomIka(DatagramProtocol):
 

   def startProtocol(self):
      self.transport.socket.setsockopt(SOL_SOCKET, SO_BROADCAST, True)
      if(len(sys.argv)>4):
         self.transport.socket.setsockopt(SOL_SOCKET, IN.SO_BINDTODEVICE, sys.argv[4])
      else:
         self.transport.socket.setsockopt(SOL_SOCKET, IN.SO_BINDTODEVICE, "eth0")
      p=proto.IkaPacket()
      p.setSrc("USER.ON.Q")
      p.setDst(sys.argv[2]) 
      d=C.IKAP_BROADCAST
      if(len(sys.argv) > 3):
         d=sys.argv[3]
         p.setArg("".join([struct.pack("<B",i ) for i in [int(x) for x in d.split(".")]]))
      else:
         p.setArg(d)
      
      if(len(sys.argv) > 5):
         newarg=p.arg.ljust(10, "\x00")
         print "%r" %newarg
         if sys.argv[5].startswith("PRESET:"):
            newarg+="\x02"
            dim=sys.argv[5].split(":")
            newarg+=chr(int(dim[1]))
         elif sys.argv[5].startswith("DIMMER:"):
            newarg+="\x03"
            dim=sys.argv[5].split(":")
            rgb=dim[1].split(",")
            for c in rgb:
               newarg+=chr(int(c))

         elif sys.argv[5].startswith("RGB:"):
            newarg+="\x01"
            dim=sys.argv[5].split(":")
            rgb=dim[1].split(",")
            for c in rgb:
               newarg+=chr(int(c))
         newarg=newarg.ljust(20, "\x00")
         p.setArg(newarg)

      p.setMsgType(C.IKAP_MSG_ACTION)
      p.setCtx(C.IKAP_CTX_LIGHT)
      p.setAct(C.IKAP_ACT_CHANGE)
      self.transport.write(p.toSend(), (sys.argv[1], 6654))
      print 'SEND PACKET: %r' % p.cleanpacket()


      reactor.callLater(0.1, self.stop)

   def datagramReceived(self, data, (host, port)):
      print "%d -> received %r from %s:%d" % (time.time(), data, host, port)


   def stop(self):
      reactor.stop()

if __name__ == '__main__':
   if len(sys.argv) > 2:
   	from twisted.internet import reactor
   	reactor.listenUDP(0, DomIka())
   	reactor.run()