import appuifw
import socket
import e32
from key_codes import *

#################################################
###### ENTER YOUR PC's BLUETOOTH ADDRESS HERE ###
#################################################
address = '00:10:60:d0:0f:25'

end = '@'
noAction = 'noAction'
delim = '#'
prefixText =  'text' + delim
prefixNav = 'nav' + delim
cancel = 'cancel' + delim + '\n'

# set up the keyboard listener
class Keyboard(object):
    def __init__(self,onevent=lambda:None):
        self._keyboard_state={}
        self._downs={}
        self._onevent=onevent
    def handle_event(self,event):
        if event['type'] == appuifw.EEventKeyDown:
            code=event['scancode']
            if not self.is_down(code):
                self._downs[code]=self._downs.get(code,0)+1
            self._keyboard_state[code]=1
        elif event['type'] == appuifw.EEventKeyUp:
            self._keyboard_state[event['scancode']]=0
        self._onevent()
    def is_down(self,scancode):
        return self._keyboard_state.get(scancode,0)
    def pressed(self,scancode):
        if self._downs.get(scancode,0):
            self._downs[scancode]-=1
            return True
        return False

keyboard=Keyboard()

def exit_key_handler():
    global running
    running=0
    appuifw.app.set_exit()

# method that receives data from the application
def recv_end(the_socket):
    total_data=[];data=''
    while True:
            data=the_socket.recv(8192)
            if end in data:
                total_data.append(data[:data.find(end)])
                break
            total_data.append(data)
            if len(total_data)>1:
                #check if end_of_data was split
                last_pair=total_data[-2]+total_data[-1]
                if end in last_pair:
                    total_data[-2]=last_pair[:last_pair.find(end)]
                    total_data.pop()
                    break
    return u''.join(total_data)

# the main loop that waits for keypresses and sends
# them to the app through the socket
def keyboardListener():
    global sock
    sock=socket.socket(socket.AF_BT,socket.SOCK_STREAM)
    #address,services=socket.bt_discover()
    #target=(address,services.values()[0])
    target = (address, 1)
    sock.connect(target)
    # codes correspond to the values for the given actions
    # in Flash 8
    while running:
        if keyboard.pressed(EScancodeLeftArrow):
            sock.send(prefixNav + "37\n")

        if keyboard.pressed(EScancodeRightArrow):
            sock.send(prefixNav + "39\n")


        if keyboard.pressed(EScancodeDownArrow):
            sock.send(prefixNav + "40\n")


        if keyboard.pressed(EScancodeUpArrow):
            sock.send(prefixNav + "38\n")
            
        if keyboard.pressed(EScancodeSelect):
            sock.send(prefixNav + "13\n")
            
            prompt = recv_end(sock);
            if prompt != noAction:
                data = appuifw.query(prompt, "text")
                if data:
                    sock.send(prefixText + data + '\n')
                else:
                    sock.send(cancel)        
        e32.ao_yield()

running=1

appuifw.app.screen='normal'

canvas=appuifw.Canvas(event_callback=keyboard.handle_event, redraw_callback=None)
appuifw.app.body=canvas

appuifw.app.title = u"Toy Flash To Bluetooth App"

appuifw.app.exit_key_handler = exit_key_handler

# call the main loop
keyboardListener()





