#pykbd take 4 -- IR keyboard driver
import serial
import sys
from stowaway4 import *

irport = serial.Serial()

irport.baudrate = 9600
#this should be "/dev/ttyS1" for non-Collie devices.
irport.port = "/dev/ttyS2"

irport.open()

lshifted = 0
rshifted = 0
rctrl = 0
lctrl = 0
lalt = 0
ralt = 0
bluefn = 0
greenfn = 0

caps = 0
numlock = 0
key = ''

repeatRate = 1  # number of chars per repeat
repeat = 0
delay = 1  # number of repeats to ignore
delaycount = 0

while 1:
  scan = irport.read(6)
  code = ScanCodes[(ord(scan[2]), ord(scan[3]), ord(scan[4]))]
  # sys.stderr.write(ScanCodes[code])
  if code[-1] == 'v':  # key goes down
    if code[0] == LSHIFT:
      lshifted = 1
    elif code[0] == RSHIFT:
      rshifted = 1
    elif code[0] == LCTRL:
      lctrl = 1
    elif code[0] == RCTRL:
      rctrl = 1
    elif code[0] == LALT:
      lalt = 1
    elif code[0] == RALT:
      ralt = 1
    elif code[0] == BLUEFN:
      bluefn = 1
    elif code[0] == GREENFN:
      greenfn = 1
    elif code[0] == CAPS:
      caps = (caps + 1) % 2
    else:  # the leftovers should be letters etc
      if lshifted or rshifted:
        if caps and Layout[code[0]][-1]:
          key = Layout[code[0]][0]
        else:
          key = Layout[code[0]][1]
      elif rctrl or lctrl:
        key = Layout[code[0]][2]
      elif ralt or lalt:
        key = Layout[code[0]][3]
      elif bluefn:
        key = Layout[code[0]][4]
      elif greenfn:
        key = Layout[code[0]][5]
      else:  # normal character of some sort
        if caps and Layout[code[0]][-1]:
          key = Layout[code[0]][1]
        else:
          key = Layout[code[0]][0]
      sys.stderr.write(key)
      repeat = 1
      delaycount = 0
  elif code[-1] == '^':  # key comes up
    if code[0] == LSHIFT:
      lshifted = 0
    elif code[0] == RSHIFT:
      rshifted = 0
    elif code[0] == LCTRL:
      lctrl = 0
    elif code[0] == RCTRL:
      rctrl = 0
    elif code[0] == LALT:
      lalt = 0
    elif code[0] == RALT:
      ralt = 0
    elif code[0] == BLUEFN:
      bluefn = 0
    elif code[0] == GREENFN:
      greenfn = 0
    elif code[0] == CAPS:
      pass  # I don't know what else to do with CAPS up.
    else:
      repeat = 0
      # pass  # I don't know what else to do with regular characters
  elif code[-1] == '!':
    # This is the repeat!
    if repeat and (delaycount > delay):
      for i in range(repeatRate):
        sys.stderr.write(key)
        #pass
    else:
      delaycount += repeat
      #sys.stderr.write(str(delaycount))
  elif code[-1] == '?':
    pass  # This is a panic condition:  I don't know what else to do with it!
