#!/usr/bin/env python
#
# thtpv6.py
#
# i0 SLIP virtual node and TCP<->UDP THTP bridge
# assumes v4 host address
# command line syntax: thtpv6 serial_port serial_speed Web_port
# URL syntax: http://computer_address:WEB_SERVER_PORT/i0_node_address:80
#
# Neil Gershenfeld
# CBA MIT 11/10/07
#
# (c) Massachusetts Institute of Technology 2007
# Permission granted for experimental and personal use;
# license for commercial use available from MIT.

from Tkinter import *
from string import *
from socket import *
from numpy import *
from select import *
import serial, time, signal

TIMEOUT = 2
END = 192
ESC = 219
ESC_END = 220
ESC_ESC = 221

def handler(signum, frame):
   #
   # timeout handler
   #
   raise IOError, "i0 timeout"

def high(number):
   #
   # return high byte
   #
   return (number >> 8)

def low(number):
   #
   # return low byte
   #
   return (number & 255)

def idle(parent):
   #
   # idle routine
   #
   [read_ready, write_ready, error_ready] = select([server_socket],[],[],0)
   if (read_ready != []):
      #
      # Web server data waiting, read packet
      #
      get_Web_packet()
   elif (ser.inWaiting() != 0):
      #
      # i0 serial data waiting, read packet
      #
      # set timout alarm
      #
#      signal.signal(signal.SIGALRM, handler)
#      signal.alarm(TIMEOUT)
      #
      # try to read packet, otherwise set error message
      #
      try:
         get_i0_packet()
      except:
         sindata.set("i0 timeout")
      #
      # turn off alarm
      #
#      signal.alarm(0)
   #
   # sleep to reduce OS load
   #
   time.sleep(0.001)
   parent.after_idle(idle,parent)

def output(byte):
   #
   # output a byte
   #
   ser.write(chr(byte))
   time.sleep(.001)

def get_Web_packet():
   global Web_port
   #
   # read and display an incoming Web request
   #
   (client_socket, client_address) = server_socket.accept()
   data = client_socket.recv(1000)
   #
   # set source address, port, and data
   #
   sinsource1.set(0)
   sinsource2.set(0)
   sinsource3.set(0)
   sinsource4.set(0)
   sinsource5.set(0)
   sinsource6.set(0)
   sinsource7.set(0)
   sinsource8.set(0)
   sinsource9.set(0)
   sinsource10.set(0)
   sinsource11.set(0)
   sinsource12.set(0)
   dot1 = find(client_address[0],".")
   sinsource13.set(client_address[0][:dot1])
   dot2 = find(client_address[0],".",(dot1+1))
   sinsource14.set(client_address[0][(dot1+1):dot2])
   dot3 = find(client_address[0],".",(dot2+1))
   sinsource15.set(client_address[0][(dot2+1):dot3])
   sinsource16.set(client_address[0][(dot3+1):])
   sinsourceport.set(str(Web_port))
   sindata.set(data)
   #
   # check for path with valid i0 address
   #
   start = find(data,"GET /")
   end = find(data,"HTTP")
   colon = find(data,":",start,end)
   if ((colon != -1) & (count(data,".",start,end) == 15)):
      #
      # found path; parse destination address and port in incoming packet
      #
      start = find(data,"GET /")
      dot1 = find(data,".",start)
      sindest1.set(data[(start+5):dot1])
      dot2 = find(data,".",(dot1+1))
      sindest2.set(data[(dot1+1):dot2])
      dot3 = find(data,".",(dot2+1))
      sindest3.set(data[(dot2+1):dot3])
      dot4 = find(data,".",(dot3+1))
      sindest4.set(data[(dot3+1):dot4])
      dot5 = find(data,".",(dot4+1))
      sindest5.set(data[(dot4+1):dot5])
      dot6 = find(data,".",(dot5+1))
      sindest6.set(data[(dot5+1):dot6])
      dot7 = find(data,".",(dot6+1))
      sindest7.set(data[(dot6+1):dot7])
      dot8 = find(data,".",(dot7+1))
      sindest8.set(data[(dot7+1):dot8])
      dot9 = find(data,".",(dot8+1))
      sindest9.set(data[(dot8+1):dot9])
      dot10 = find(data,".",(dot9+1))
      sindest10.set(data[(dot9+1):dot10])
      dot11 = find(data,".",(dot10+1))
      sindest11.set(data[(dot10+1):dot11])
      dot12 = find(data,".",(dot11+1))
      sindest12.set(data[(dot11+1):dot12])
      dot13 = find(data,".",(dot12+1))
      sindest13.set(data[(dot12+1):dot13])
      dot14 = find(data,".",(dot13+1))
      sindest14.set(data[(dot13+1):dot14])
      dot15 = find(data,".",(dot14+1))
      sindest15.set(data[(dot14+1):dot15])
      colon = find(data,":",(dot15+1))
      sindest16.set(data[(dot15+1):colon])
      space = find(data," ",(colon+1))
      sindestport.set(data[(colon+1):space])
      #
      # set and send outgoing i0 packet
      #
      soutsource1.set(sinsource1.get())
      soutsource2.set(sinsource2.get())
      soutsource3.set(sinsource3.get())
      soutsource4.set(sinsource4.get())
      soutsource5.set(sinsource5.get())
      soutsource6.set(sinsource6.get())
      soutsource7.set(sinsource7.get())
      soutsource8.set(sinsource8.get())
      soutsource9.set(sinsource9.get())
      soutsource10.set(sinsource10.get())
      soutsource11.set(sinsource11.get())
      soutsource12.set(sinsource12.get())
      soutsource13.set(sinsource13.get())
      soutsource14.set(sinsource14.get())
      soutsource15.set(sinsource15.get())
      soutsource16.set(sinsource16.get())
      soutdest1.set(sindest1.get())
      soutdest2.set(sindest2.get())
      soutdest3.set(sindest3.get())
      soutdest4.set(sindest4.get())
      soutdest5.set(sindest5.get())
      soutdest6.set(sindest6.get())
      soutdest7.set(sindest7.get())
      soutdest8.set(sindest8.get())
      soutdest9.set(sindest9.get())
      soutdest10.set(sindest10.get())
      soutdest11.set(sindest11.get())
      soutdest12.set(sindest12.get())
      soutdest13.set(sindest13.get())
      soutdest14.set(sindest14.get())
      soutdest15.set(sindest15.get())
      soutdest16.set(sindest16.get())
      soutdestport.set(sindestport.get())
      put_i0_packet()
      #
      # if port = 80, read and return Web page
      #
      if (soutdestport.get() == "80"):
         #
	 # set timout alarm
	 #
#         signal.signal(signal.SIGALRM, handler)
#         signal.alarm(TIMEOUT)
	 #
	 # try to read Web page, otherwise set error message
	 #
	 try:
            get_i0_packet()
	 except:
	    sindata.set("i0 timeout")
	 #
	 # turn off alarm
	 #
#         signal.alarm(0)
	 #
	 # send Web page
	 #
         client_socket.send(sindata.get())
         client_socket.close()
      #
      # not port 80: close socket
      #
      else:
         client_socket.send("HTTP/1.1 200 OK\nContent-Type: text/html\n\n")
         client_socket.close()
   else:
      #
      # no i0 address; close socket
      #
      client_socket.send("HTTP/1.1 200 OK\nContent-Type: text/html\n\n")
      client_socket.close()

def put_i0_packet():
   #
   # send i0 packet
   #
   packet = []
   data = soutdata.get()
   length = 8 + len(data) # UDP + data
   #
   # IP
   #
   packet.append(0x60) # version = 6 (4 bits), traffic class (high 4 bits) #0
   packet.append(0) # traffic class (low 4 bits), flow label (20 bits) #1
   packet.append(0) # " #2
   packet.append(0) # " #3
   packet.append(high(length)) # packet length high byte #4
   packet.append(low(length)) # packet length low byte #5
   packet.append(17) # next header byte = 17 for UDP #6
   packet.append(255) # hop limit byte = 255 #7
   packet.append(int(soutsource1.get())) # source address byte 1 #8
   packet.append(int(soutsource2.get())) # source address byte 2 #9
   packet.append(int(soutsource3.get())) # source address byte 3 #10
   packet.append(int(soutsource4.get())) # source address byte 4 #11
   packet.append(int(soutsource5.get())) # source address byte 5 #12
   packet.append(int(soutsource6.get())) # source address byte 6 #13
   packet.append(int(soutsource7.get())) # source address byte 7 #14
   packet.append(int(soutsource8.get())) # source address byte 8 #15
   packet.append(int(soutsource9.get())) # source address byte 9 #16
   packet.append(int(soutsource10.get())) # source address byte 10 #17
   packet.append(int(soutsource11.get())) # source address byte 11 #18
   packet.append(int(soutsource12.get())) # source address byte 12 #19
   packet.append(int(soutsource13.get())) # source address byte 13 #20
   packet.append(int(soutsource14.get())) # source address byte 14 #21
   packet.append(int(soutsource15.get())) # source address byte 15 #22
   packet.append(int(soutsource16.get())) # source address byte 16 #23
   packet.append(int(soutdest1.get())) # destination address byte 1 #24
   packet.append(int(soutdest2.get())) # destination address byte 2 #25
   packet.append(int(soutdest3.get())) # destination address byte 3 #26
   packet.append(int(soutdest4.get())) # destination address byte 4 #27
   packet.append(int(soutdest5.get())) # destination address byte 5 #28
   packet.append(int(soutdest6.get())) # destination address byte 6 #29
   packet.append(int(soutdest7.get())) # destination address byte 7 #30
   packet.append(int(soutdest8.get())) # destination address byte 8 #31
   packet.append(int(soutdest9.get())) # destination address byte 9 #32
   packet.append(int(soutdest10.get())) # destination address byte 10 #33
   packet.append(int(soutdest11.get())) # destination address byte 11 #34
   packet.append(int(soutdest12.get())) # destination address byte 12 #35
   packet.append(int(soutdest13.get())) # destination address byte 13 #36
   packet.append(int(soutdest14.get())) # destination address byte 14 #37
   packet.append(int(soutdest15.get())) # destination address byte 15 #38
   packet.append(int(soutdest16.get())) # destination address byte 16 #39
   #
   # UDP
   #
   packet.append(high(int(soutsourceport.get()))) # source port high byte #40
   packet.append(low(int(soutsourceport.get()))) # source port low byte #41
   packet.append(high(int(soutdestport.get()))) # destination port high byte #42
   packet.append(low(int(soutdestport.get()))) # destination port low byte #43
   packet.append(high(length)) # payload length high byte #44
   packet.append(low(length)) # payload length low byte #45
   packet.append(0) # payload checksum high byte #46
   packet.append(0) # payload checksum low byte #47
   #
   # data
   #
   ndata = len(data)
   for i in range(ndata):
      packet.append(ord(data[i]))
   if ((ndata % 2) == 1):
      packet.append(0)
      ndata += 1
   #
   # checksum
   #
   sum = array(0,uint32)
   pseudo_header_words = [\
      # source address
      8,10,12,14,16,18,20,22,\
      # destination address
      24,26,28,30,32,34,36,38,\
      # UDP packet length
      44,\
      # source port, destination port, length
      40,42,44]
   for word in pseudo_header_words:
      sum += (packet[word] << 8) + packet[word+1]
   sum += 17 # UDP next header
   while (sum >> 16):
      sum = (sum & 0xffff) + (sum >> 16)
   sum = sum.astype(uint16)
   sum = ~sum
   if (sum == 0):
      sum = 0xFFFF
   packet[46] = high(sum)
   packet[47] = low(sum)
   #
   # send the packet with SLIP mapping and framing
   #
   output(END)
   for byte in range(len(packet)):
      if (packet[byte] == END):
         output(ESC)
         output(ESC_END)
      elif (packet[byte] == ESC):
         output(ESC)
         output(ESC_ESC)
      else:
         output(packet[byte])
   output(END)

def get_i0_packet():
   #
   # read and display an i0 packet
   #
   sindata.set("reading ...")
   root.update()
   packet_length_offset = 4
   source_address_offset = 8
   destination_address_offset = 24
   source_port_offset = 40
   destination_port_offset = 42
   data_offset = 48
   #
   # find starting END
   #
   while 1:
      byte = ord(ser.read())
      if (byte == END):
         #
         # check whether beginning or end of packet
         #
         byte = ord(ser.read())
         if (byte == END):
            #
            # was end of packet, read next char
            #
            byte = ord(ser.read())
         break
   #
   # read until closing END
   #
   packet = []
   while 1:
      #
      # do SLIP mapping and save byte
      #
      if (byte == ESC):
         byte = ord(ser.read())
         if (byte == ESC_END):
            byte = END
         elif (byte == ESC_ESC):
            byte = ESC
         else:
            print "error: unknown ESC"
            break
      packet.append(byte)
      #
      # get next byte
      #
      byte = ord(ser.read())
      if (byte == END):
         sinsource1.set(str(packet[source_address_offset+1-1]))
         sinsource2.set(str(packet[source_address_offset+2-1]))
         sinsource3.set(str(packet[source_address_offset+3-1]))
         sinsource4.set(str(packet[source_address_offset+4-1]))
         sinsource5.set(str(packet[source_address_offset+5-1]))
         sinsource6.set(str(packet[source_address_offset+6-1]))
         sinsource7.set(str(packet[source_address_offset+7-1]))
         sinsource8.set(str(packet[source_address_offset+8-1]))
         sinsource9.set(str(packet[source_address_offset+9-1]))
         sinsource10.set(str(packet[source_address_offset+10-1]))
         sinsource11.set(str(packet[source_address_offset+11-1]))
         sinsource12.set(str(packet[source_address_offset+12-1]))
         sinsource13.set(str(packet[source_address_offset+13-1]))
         sinsource14.set(str(packet[source_address_offset+14-1]))
         sinsource15.set(str(packet[source_address_offset+15-1]))
         sinsource16.set(str(packet[source_address_offset+16-1]))
         sindest1.set(str(packet[destination_address_offset+1-1]))
         sindest2.set(str(packet[destination_address_offset+2-1]))
         sindest3.set(str(packet[destination_address_offset+3-1]))
         sindest4.set(str(packet[destination_address_offset+4-1]))
         sindest5.set(str(packet[destination_address_offset+5-1]))
         sindest6.set(str(packet[destination_address_offset+6-1]))
         sindest7.set(str(packet[destination_address_offset+7-1]))
         sindest8.set(str(packet[destination_address_offset+8-1]))
         sindest9.set(str(packet[destination_address_offset+9-1]))
         sindest10.set(str(packet[destination_address_offset+10-1]))
         sindest11.set(str(packet[destination_address_offset+11-1]))
         sindest12.set(str(packet[destination_address_offset+12-1]))
         sindest13.set(str(packet[destination_address_offset+13-1]))
         sindest14.set(str(packet[destination_address_offset+14-1]))
         sindest15.set(str(packet[destination_address_offset+15-1]))
         sindest16.set(str(packet[destination_address_offset+16-1]))
         sinsourceport.set(str(256*packet[source_port_offset+1-1]+packet[source_port_offset+2-1]))
         sindestport.set(str(256*packet[destination_port_offset+1-1]+packet[destination_port_offset+2-1]))
         packet_length = 256*packet[packet_length_offset+1-1]+packet[packet_length_offset+2-1] - 8
         data = join(map(chr,packet[(data_offset+1-1):(data_offset+1+packet_length-1)]),sep="")
         sindata.set(data)
         return

def copy_source():
   #
   # copy incoming to outgoing source
   #
   soutsource1.set(sinsource1.get())
   soutsource2.set(sinsource2.get())
   soutsource3.set(sinsource3.get())
   soutsource4.set(sinsource4.get())
   soutsource5.set(sinsource5.get())
   soutsource6.set(sinsource6.get())
   soutsource7.set(sinsource7.get())
   soutsource8.set(sinsource8.get())
   soutsource9.set(sinsource9.get())
   soutsource10.set(sinsource10.get())
   soutsource11.set(sinsource11.get())
   soutsource12.set(sinsource12.get())
   soutsource13.set(sinsource13.get())
   soutsource14.set(sinsource14.get())
   soutsource15.set(sinsource15.get())
   soutsource16.set(sinsource16.get())
   return

def copy_dest():
   #
   # copy incoming to outgoing destination
   #
   soutdest1.set(sindest1.get())
   soutdest2.set(sindest2.get())
   soutdest3.set(sindest3.get())
   soutdest4.set(sindest4.get())
   soutdest5.set(sindest5.get())
   soutdest6.set(sindest6.get())
   soutdest7.set(sindest7.get())
   soutdest8.set(sindest8.get())
   soutdest9.set(sindest9.get())
   soutdest10.set(sindest10.get())
   soutdest11.set(sindest11.get())
   soutdest12.set(sindest12.get())
   soutdest13.set(sindest13.get())
   soutdest14.set(sindest14.get())
   soutdest15.set(sindest15.get())
   soutdest16.set(sindest16.get())
   return

def quit():
   #
   # clean up and quit
   #
   server_socket.close()
   sys.exit()

#
# get command line arguments
#
if (len(sys.argv) != 4):
   print "command line syntax: thtpv6 serial_port serial_speed Web_port"
   sys.exit()
serial_port = sys.argv[1]
serial_speed = int(sys.argv[2])
Web_port = int(sys.argv[3])
#
# set up GUI
#
root = Tk()
root.title('thtpv6.py')
#
incomingframe = Frame(root)
Label(incomingframe,text="incoming packet: ").pack(side="left")
incomingframe.pack()
#
insourceframe = Frame(root)
Label(insourceframe,text="source address: ").pack(side="left")
sinsource1 = StringVar()
winsource1 = Entry(insourceframe, width=3, textvariable=sinsource1)
winsource1.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource2 = StringVar()
winsource2 = Entry(insourceframe, width=3, textvariable=sinsource2)
winsource2.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource3 = StringVar()
winsource3 = Entry(insourceframe, width=3, textvariable=sinsource3)
winsource3.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource4 = StringVar()
winsource4 = Entry(insourceframe, width=3, textvariable=sinsource4)
winsource4.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource5 = StringVar()
winsource5 = Entry(insourceframe, width=3, textvariable=sinsource5)
winsource5.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource6 = StringVar()
winsource6 = Entry(insourceframe, width=3, textvariable=sinsource6)
winsource6.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource7 = StringVar()
winsource7 = Entry(insourceframe, width=3, textvariable=sinsource7)
winsource7.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource8 = StringVar()
winsource8 = Entry(insourceframe, width=3, textvariable=sinsource8)
winsource8.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource9 = StringVar()
winsource9 = Entry(insourceframe, width=3, textvariable=sinsource9)
winsource9.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource10 = StringVar()
winsource10 = Entry(insourceframe, width=3, textvariable=sinsource10)
winsource10.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource11 = StringVar()
winsource11 = Entry(insourceframe, width=3, textvariable=sinsource11)
winsource11.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource12 = StringVar()
winsource12 = Entry(insourceframe, width=3, textvariable=sinsource12)
winsource12.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource13 = StringVar()
winsource13 = Entry(insourceframe, width=3, textvariable=sinsource13)
winsource13.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource14 = StringVar()
winsource14 = Entry(insourceframe, width=3, textvariable=sinsource14)
winsource14.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource15 = StringVar()
winsource15 = Entry(insourceframe, width=3, textvariable=sinsource15)
winsource15.pack(side="left")
Label(insourceframe,text=".").pack(side="left")
sinsource16 = StringVar()
winsource16 = Entry(insourceframe, width=3, textvariable=sinsource16)
winsource16.pack(side="left")
insourceframe.pack()
#
indestframe = Frame(root)
Label(indestframe,text="destination address: ").pack(side="left")
sindest1 = StringVar()
windest1 = Entry(indestframe, width=3, textvariable=sindest1)
windest1.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest2 = StringVar()
windest2 = Entry(indestframe, width=3, textvariable=sindest2)
windest2.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest3 = StringVar()
windest3 = Entry(indestframe, width=3, textvariable=sindest3)
windest3.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest4 = StringVar()
windest4 = Entry(indestframe, width=3, textvariable=sindest4)
windest4.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest5 = StringVar()
windest5 = Entry(indestframe, width=3, textvariable=sindest5)
windest5.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest6 = StringVar()
windest6 = Entry(indestframe, width=3, textvariable=sindest6)
windest6.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest7 = StringVar()
windest7 = Entry(indestframe, width=3, textvariable=sindest7)
windest7.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest8 = StringVar()
windest8 = Entry(indestframe, width=3, textvariable=sindest8)
windest8.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest9 = StringVar()
windest9 = Entry(indestframe, width=3, textvariable=sindest9)
windest9.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest10 = StringVar()
windest10 = Entry(indestframe, width=3, textvariable=sindest10)
windest10.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest11 = StringVar()
windest11 = Entry(indestframe, width=3, textvariable=sindest11)
windest11.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest12 = StringVar()
windest12 = Entry(indestframe, width=3, textvariable=sindest12)
windest12.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest13 = StringVar()
windest13 = Entry(indestframe, width=3, textvariable=sindest13)
windest13.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest14 = StringVar()
windest14 = Entry(indestframe, width=3, textvariable=sindest14)
windest14.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest15 = StringVar()
windest15 = Entry(indestframe, width=3, textvariable=sindest15)
windest15.pack(side="left")
Label(indestframe,text=".").pack(side="left")
sindest16 = StringVar()
windest16 = Entry(indestframe, width=3, textvariable=sindest16)
windest16.pack(side="left")
indestframe.pack()
#
inportframe = Frame(root)
Label(inportframe,text="source port: ").pack(side="left")
sinsourceport = StringVar()
winsourceport = Entry(inportframe, width=6, textvariable=sinsourceport)
winsourceport.pack(side="left")
Label(inportframe,text="  destination port: ").pack(side="left")
sindestport = StringVar()
windestport = Entry(inportframe, width=6, textvariable=sindestport)
windestport.pack(side="left")
inportframe.pack()
#
indataframe = Frame(root)
Label(indataframe,text="data: ").pack(side="left")
sindata = StringVar()
windata = Entry(indataframe, width=30, textvariable=sindata)
windata.pack(side="left")
indataframe.pack()
#
webframe = Frame(root)
Label(webframe,text="Web server port: %d"%Web_port).pack(side="left")
webframe.pack()
#
copyframe = Frame(root)
sourcebtn = Button(copyframe, text="copy source address",command=copy_source)
sourcebtn.pack(side="left")
Label(copyframe,text=" ").pack(side="left")
destbtn = Button(copyframe, text="copy destination address",command=copy_dest)
destbtn.pack(side="left")
copyframe.pack()
#
outgoingframe = Frame(root)
Label(outgoingframe,text="outgoing packet: ").pack(side="left")
outgoingframe.pack()
#
outsourceframe = Frame(root)
Label(outsourceframe,text="source address: ").pack(side="left")
soutsource1 = StringVar()
soutsource1.set("0")
woutsource1 = Entry(outsourceframe, width=3, textvariable=soutsource1)
woutsource1.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource2 = StringVar()
soutsource2.set("0")
woutsource2 = Entry(outsourceframe, width=3, textvariable=soutsource2)
woutsource2.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource3 = StringVar()
soutsource3.set("0")
woutsource3 = Entry(outsourceframe, width=3, textvariable=soutsource3)
woutsource3.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource4 = StringVar()
soutsource4.set("0")
woutsource4 = Entry(outsourceframe, width=3, textvariable=soutsource4)
woutsource4.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource5 = StringVar()
soutsource5.set("0")
woutsource5 = Entry(outsourceframe, width=3, textvariable=soutsource5)
woutsource5.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource6 = StringVar()
soutsource6.set("0")
woutsource6 = Entry(outsourceframe, width=3, textvariable=soutsource6)
woutsource6.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource7 = StringVar()
soutsource7.set("0")
woutsource7 = Entry(outsourceframe, width=3, textvariable=soutsource7)
woutsource7.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource8 = StringVar()
soutsource8.set("0")
woutsource8 = Entry(outsourceframe, width=3, textvariable=soutsource8)
woutsource8.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource9 = StringVar()
soutsource9.set("0")
woutsource9 = Entry(outsourceframe, width=3, textvariable=soutsource9)
woutsource9.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource10 = StringVar()
soutsource10.set("0")
woutsource10 = Entry(outsourceframe, width=3, textvariable=soutsource10)
woutsource10.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource11 = StringVar()
soutsource11.set("255")
woutsource11 = Entry(outsourceframe, width=3, textvariable=soutsource11)
woutsource11.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource12 = StringVar()
soutsource12.set("255")
woutsource12 = Entry(outsourceframe, width=3, textvariable=soutsource12)
woutsource12.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource13 = StringVar()
soutsource13.set("10")
woutsource13 = Entry(outsourceframe, width=3, textvariable=soutsource13)
woutsource13.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource14 = StringVar()
soutsource14.set("0")
woutsource14 = Entry(outsourceframe, width=3, textvariable=soutsource14)
woutsource14.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource15 = StringVar()
soutsource15.set("0")
woutsource15 = Entry(outsourceframe, width=3, textvariable=soutsource15)
woutsource15.pack(side="left")
Label(outsourceframe,text=".").pack(side="left")
soutsource16 = StringVar()
soutsource16.set("1")
woutsource16 = Entry(outsourceframe, width=3, textvariable=soutsource16)
woutsource16.pack(side="left")
outsourceframe.pack()
#
outdestframe = Frame(root)
Label(outdestframe,text="destination address: ").pack(side="left")
soutdest1 = StringVar()
soutdest1.set("0")
woutdest1 = Entry(outdestframe, width=3, textvariable=soutdest1)
woutdest1.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest2 = StringVar()
soutdest2.set("0")
woutdest2 = Entry(outdestframe, width=3, textvariable=soutdest2)
woutdest2.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest3 = StringVar()
soutdest3.set("0")
woutdest3 = Entry(outdestframe, width=3, textvariable=soutdest3)
woutdest3.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest4 = StringVar()
soutdest4.set("0")
woutdest4 = Entry(outdestframe, width=3, textvariable=soutdest4)
woutdest4.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest5 = StringVar()
soutdest5.set("0")
woutdest5 = Entry(outdestframe, width=3, textvariable=soutdest5)
woutdest5.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest6 = StringVar()
soutdest6.set("0")
woutdest6 = Entry(outdestframe, width=3, textvariable=soutdest6)
woutdest6.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest7 = StringVar()
soutdest7.set("0")
woutdest7 = Entry(outdestframe, width=3, textvariable=soutdest7)
woutdest7.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest8 = StringVar()
soutdest8.set("0")
woutdest8 = Entry(outdestframe, width=3, textvariable=soutdest8)
woutdest8.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest9 = StringVar()
soutdest9.set("0")
woutdest9 = Entry(outdestframe, width=3, textvariable=soutdest9)
woutdest9.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest10 = StringVar()
soutdest10.set("0")
woutdest10 = Entry(outdestframe, width=3, textvariable=soutdest10)
woutdest10.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest11 = StringVar()
soutdest11.set("255")
woutdest11 = Entry(outdestframe, width=3, textvariable=soutdest11)
woutdest11.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest12 = StringVar()
soutdest12.set("255")
woutdest12 = Entry(outdestframe, width=3, textvariable=soutdest12)
woutdest12.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest13 = StringVar()
soutdest13.set("10")
woutdest13 = Entry(outdestframe, width=3, textvariable=soutdest13)
woutdest13.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest14 = StringVar()
soutdest14.set("0")
woutdest14 = Entry(outdestframe, width=3, textvariable=soutdest14)
woutdest14.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest15 = StringVar()
soutdest15.set("0")
woutdest15 = Entry(outdestframe, width=3, textvariable=soutdest15)
woutdest15.pack(side="left")
Label(outdestframe,text=".").pack(side="left")
soutdest16 = StringVar()
soutdest16.set("2")
woutdest16 = Entry(outdestframe, width=3, textvariable=soutdest16)
woutdest16.pack(side="left")
outdestframe.pack()
#
outportframe = Frame(root)
Label(outportframe,text="source port: ").pack(side="left")
soutsourceport = StringVar()
soutsourceport.set("0")
woutsourceport = Entry(outportframe, width=6, textvariable=soutsourceport)
woutsourceport.pack(side="left")
Label(outportframe,text="  destination port: ").pack(side="left")
soutdestport = StringVar()
soutdestport.set("1002")
woutdestport = Entry(outportframe, width=6, textvariable=soutdestport)
woutdestport.pack(side="left")
outportframe.pack()
#
outdataframe = Frame(root)
Label(outdataframe,text="data: ").pack(side="left")
soutdata = StringVar()
woutdata = Entry(outdataframe, width=30, textvariable=soutdata)
woutdata.pack(side="left")
outdataframe.pack()
#
ioframe = Frame(root)
wbtn = Button(ioframe, text="send outgoing packet",command=put_i0_packet)
wbtn.pack(side="left")
ioframe.pack()
#
quitframe = Frame(root)
wquit = Button(quitframe, text="quit",command=quit)
wquit.pack(side="left")
quitframe.pack()
#
# open serial port
#
ser = serial.Serial(port=serial_port, baudrate=serial_speed)
ser.flushInput()
#
# open Web server socket
#
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.bind((gethostname(), Web_port))
server_socket.listen(1)
#
# start mainloop
#
root.after(100,idle,root)
root.mainloop()
