#!/usr/bin/python2

import powermate
import time
import os

EVENT_BUTTON_PRESS = 1
EVENT_RELATIVE_MOTION = 2


button_pressed = False
single_tap = False
mode = "nav"

current_event=(0,0,time.time())
last_event=current_event
skipped_event = 0
pressed_time = 0
button_held = False
led_brightness = 255
#pm = powermate.PowerMate("/dev/powermate")

pm = powermate.PowerMate()
pm.SetLEDState(led_brightness,0,0,0,0)


def runcmd(cmd):
#    print cmd
    os.system(cmd)


def volume_action(action):
    global mode
    global led_brightness
    if action == "L" :
        print "Volume down"

    if action == "R" :
        print "Volume UP"

    if action == "tap" :
        print "toggle mute"

    if action == "double_tap" :
        mode = "nav"
        led_brightness = 500
        print "mode is now nav"

    return


def nav_action(action):
    global mode
    global led_brightness
    keycmd = '''xdotool search --name "Mythtv Frontend" key %s'''
    if action == "L" :
        #print "prev"
       cmd =  keycmd %"Up"
       runcmd(cmd)

    if action == "R" :
        #print "next"
        cmd =  keycmd %"Down"
        runcmd(cmd)

    if action == "LP" :
        #print "back"
        cmd =  keycmd %"Left"
        runcmd(cmd)

    if action == "RP" :
        #print "tab"
        cmd =  keycmd %"Right"
        runcmd(cmd)


    if action == "tap" :
        #print "select"
        cmd =  keycmd %"Return"
        runcmd(cmd)

    if action == "double_tap" :
        mode = "volume"
        led_brightness = 10
        print "mode is now vol"

    if action == "button_held" :
        cmd =  keycmd %"Escape"
        runcmd(cmd)



    return




def act_on_event(action):

    if mode == "volume":
        volume_action(action)

    elif mode == "nav":
        nav_action(action)




event_stack=[current_event]
while 1:
        #process_events = True
        reset_lastevent = False
	event = pm.WaitForEvent(2)
       # print event
        if event:
            #event that happens after every button push, can be thrown away.
            if event[2] == 0:
                continue


        elif single_tap:
            pressed_diff = time.time() - pressed_time
            #This takes care of the holding down the button for X amount of time
            #print event,  button_pressed, pressed_diff, current_event
            #if pressed_diff >= 2 and button_pressed and current_event[0] == EVENT_BUTTON_PRESS:
            if pressed_diff >= 2 and button_pressed :
                act_on_event("button_held")
                single_tap = False
                pressed_time = 0
                button_pressed = False
                last_event_time = time.time()
                last_event=(0,0,time.time())
                pm.SetLEDState(led_brightness,0,0,0,0)
                #print "resetting last event:",  last_event


           #This handles a single press of the button.
            elif not button_pressed :
                act_on_event("tap")
                single_tap = False
                last_event_time = time.time()
                last_event=(0,0,time.time())

        if event:
            #print "processing:" , event
            current_event = event[2],event[4],time.time()

            last_event_time = last_event[2]
            current_event_time = current_event[2]

            last_event_only = last_event[0], last_event[1]
            current_event_only = current_event[0], current_event[1]

            repeat_rate = 10
            repeat_time = .50

            if last_event_only == current_event_only and  current_event[0] == EVENT_RELATIVE_MOTION :
                #check for time diff
                event_time_diff = current_event_time - last_event_time

                if  skipped_event <= repeat_rate and event_time_diff <= repeat_time:
                    skipped_event = skipped_event + 1
                    #print "skipped a repeat event : %s" %skipped_event
                    continue
            #event occured, reset skip counter
            skipped_event = 0

            #rotate dial
            if current_event[0] == EVENT_RELATIVE_MOTION:
                reset_lastevent = True
                single_tap = False
                if current_event[1] >= 0 :
                    if button_pressed :
                        #print "dial turned Counter clockwise and button is pressed"
                        act_on_event("RP")
                    else:
                        #print "dial turned Counter clockwise"
                        act_on_event("R")

                if current_event[1]  <=0 :
                    if button_pressed :
                        #print "dial turned clockwise and button is pressed"
                        act_on_event("LP")
                    else:
                        #print "dial turned clockwise"
                        act_on_event("L")


            #button was pushed
            if current_event[0] == EVENT_BUTTON_PRESS :
                pm.SetLEDState(0,0,0,0,0)
                if current_event[1] == 1:
                    button_pressed = True
                    pressed_time = current_event_time
                    tap_diff = current_event_time - last_event_time
                    #double tap
                    if tap_diff < 0.2 and last_event[0] == EVENT_BUTTON_PRESS:
                        act_on_event("double_tap")
                        single_tap = False
                    else:
                        single_tap = True
                        reset_lastevent = True

                #button was released
                elif current_event[1] == 0:
                    button_pressed = False
                    pressed_time  = 0
                    pm.SetLEDState(led_brightness,0,0,0,0)

        if reset_lastevent:
            last_event = current_event