#!/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