# Client program

from socket import *
import sys
import time
from math import *

# Set the socket parameters
local_port = 5003
# direct html udp port
remote_port = 4422
# production port
remote_port = 4321

# TODO: autodetect interface address for remote application
outgoing_if = "127.0.0.1"
remote_host = "127.0.0.1"

# udp is the default for DGRAM
UDPSock = socket(AF_INET, SOCK_DGRAM)

# we MUST bind, otherwise python will choose a different port for each
# connection
UDPSock.bind((outgoing_if, local_port))

# we will not use connections so we can keep working even if the server
# goes down or refuses connection
#UDPSock.connect((remote_host, remote_port))

hash = "s2l\n<8<18 " # 10 bytes

alpha = chr(55)

z_buffer = chr(1) + "\n"

width = 12
height = 8

segments = 8
segwidth = 12
segchannels = 3

sleeptime = 0.1
t = 0

#timer will hold the elapsed time in seconds
frequency = 2*pi/20

while (1):
  #zero out the data buffer
  data = hash
  data += z_buffer

  # windows
  for j in range(0,height):
    for i in range(0,width):
      pixel = 0.5 + 0.5*sin(2*pi*(float(i+1)/width)+t*frequency)*sin(2*pi*(float(j+1)/height)+t*frequency)
      char = chr(int(127 * pixel))
      data += char + char + char + alpha
    data += "\n"
  
  # segment/text display
  for i in range(0,segwidth):
    for j in range(0,segments):
      for a in range(0,segchannels):
        val = 63 + int(63*sin(2*pi*(1+i)*(1+j)*t*frequency/200))
        data += chr(val)
      data += alpha
    data += "\n"
  t+=1
  if not data:
    break
  else:
    UDPSock.sendto(data,(remote_host,remote_port))
  time.sleep(sleeptime)

UDPSock.close()