#! /usr/bin/env python

import sys,string
from socket import *
from thread import start_new_thread

ECHO_PORT = 50007
BUFSIZE = 1024

debug = 0



from Tkinter import *


class Ship:

      def __init__(self,master):
          global mySock
          frame=Frame(master)
          frame.pack()

          print 'About to start client connect thread'
          start_new_thread(ClientConnectThread,())

          self.label1 = Label(frame, text = "Speed",font=("arial", 12, "bold") )
          self.label1.grid(row=0,column=0)

          self.label2 = Label(frame, text = "Heading",font=("arial", 12, "bold") )
          self.label2.grid(row=0,column=10)
          
          def getnum1(event):
	      y=self.scale1.get()
              SendSpeedUpdate(mySock,y)
              print 'Aircraft carrier: speed => ',y
          
          self.scale1 = Scale(frame, orient=VERTICAL, length = 200, from_=40, to=-40, tickinterval=10, resolution=1, command=getnum1)
          self.scale1.set(0)
          self.scale1.grid(row=1, column=0)

          def getnum2(event):
              self.canvas.delete()
              x=self.scale2.get()
              print 'Aircraft carrier: heading => ',
              if x >= 0:
                 print x
                 SendBearingUpdate(mySock,x)
              else:
                  print 360+x
                  SendBearingUpdate(mySock,360+x)

              self.canvas = Canvas(frame, width=200, height=200)
 	      xy = 30,30,180,180 
              self.canvas.create_arc(xy, start=0,extent=90)
              self.canvas.create_arc(xy, start=90,extent=90)
              self.canvas.create_arc(xy, start=180,extent=90)
              self.canvas.create_arc(xy, start=270,extent=90)
              self.canvas.create_text(195,103,text='90')
              self.canvas.create_text(13,103,text='270')
              self.canvas.create_text(107,15,text='0')
              self.canvas.create_text(105,193,text='180')
              self.canvas.create_arc(xy, start=-(x+270),extent=0)
              self.canvas.grid(row=1,column=10)
                   
          

          self.scale2 = Scale(frame, orient=HORIZONTAL,length=300,from_=-180,to=180,tickinterval=45,resolution=1, command=getnum2)
          self.scale2.set(0)
          self.scale2.grid(row=2,column=10)
          
             
          self.canvas = Canvas(frame, width=200, height=200)
 	  

def ClientRecvThread(_sock,_location):
    print 'Thread Function'
    global mySock
    mySock = _sock
    while 1:
      try:
        recv=_sock.recv(1000)
        ParseData(recv)
        SendUpdate(_sock)
      except:
        pass

def ClientConnectThread():
    print 'Client Connect Thread Starting'
    port = ECHO_PORT
    s = socket(AF_INET, SOCK_STREAM)
    s.bind(('', port))
    s.listen(1)
    while 1==1:
         NewSocket,location = s.accept()
         print 'connected by', location
         start_new_thread(ClientRecvThread,(NewSocket,location))



#def main():
#    if len(sys.argv) > 1:
#        port = int(eval(sys.argv[1]))
#    else:


def ParseData(_data):
    cmdBegin = 0
    cmdEnd = 1024
    cmdBegin = _data.find("!!",cmdBegin,cmdEnd)
    while (cmdBegin>=0):
      start = _data.find('=',cmdBegin,cmdEnd)
      end   = _data.find(',',cmdBegin,cmdEnd)

      command = _data[start+1:end]
      if (debug > 0):
        print command
      if (command == 'init'):
        ProcInit (_data)
      elif (command == 'end'):  
        ProcEnd(_data)
      elif (command == 'speedupdate'):  
        ProcSpeedUpdate(_data[cmdBegin:cmdEnd])
      elif (command == 'bearingupdate'):  
        ProcBearingUpdate(_data[cmdBegin:cmdEnd])
      elif (command == 'turningrateupdate'):  
        ProcTurningRateUpdate(_data)
      else:
        print "Unknown cmd" 
      cmdBegin = _data.find("##",cmdBegin,cmdEnd)
      cmdBegin = _data.find("!!",cmdBegin,cmdEnd)

def ProcInit(_data):
    if (debug > 0):
      print "ProcInit"
def ProcEnd(_data):
    if (debug > 0):
      print "End"
def ProcSpeedUpdate(_data):
    if (debug > 0):
      print "ProcSpeedUpdate"
    y = _data.find('speed=')
    start = y+6
    end = _data.find('##')
    print "Speed = " + _data[start:end] 
    speed = string.atof(_data[start:end]) 
def ProcBearingUpdate(_data):
    if (debug > 0):
      print "ProcBearingUpdate"+_data
    y = _data.find('bearing=')
    start = y+8
    end = _data.find('##')
    print "Bearing = " + _data[start:end] 
    bearing = string.atof(_data[start:end]) 

def ProcTurningRateUpdate(_data):
    if (debug > 0):
      print "ProcTurningRateUpdate"
    y = _data.find('turningrate=')
    start = y+12
    end = _data.find('##')
    print "TurningRate = " + _data[start:end] 
    turningRate = string.atof(_data[start:end]) 

def SendUpdate(_sock):
  print "Sending Update"
  _sock.send("!!type=update,count=2,bearing=23.5,speed=53.3,xcoord=43,ycoord=32,isalive=1,id=francis,bearing=54.2,speed=98.3,xcoord=23,ycoord=876,isalive=1,id=fletch##\n")

def SendSpeedUpdate(_sock, _speed):
  print "Sending Speed Update"
  updateStr = "!!type=speedupdate, speed="+str(_speed)+"##\n"
  print updateStr 
  _sock.send(updateStr)

def SendBearingUpdate(_sock, _bearing):
  print "Sending Bearing Update"
  updateStr = "!!type=bearingupdate, bearing="+str(_bearing)+"##\n"
  print updateStr 
  _sock.send(updateStr)



root=Tk()
root.title("Aircraft carrier")
alt=Ship(root)
root.mainloop() 
#main()
