X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=apps%2Fpndevmapperd.c;h=cb7d9b6bc9a0a874e94d86483fb8108d5d86b0a0;hb=dce16882dd2c3468fb9d61680d89b22d3c59f07b;hp=7de793844aa3dd053b9ad59cb8fa9d135b7abe18;hpb=a7d1b09966e1c5e5fd5c80a42154e5f74f5c33b1;p=pandora-libraries.git diff --git a/apps/pndevmapperd.c b/apps/pndevmapperd.c index 7de7938..cb7d9b6 100644 --- a/apps/pndevmapperd.c +++ b/apps/pndevmapperd.c @@ -77,6 +77,22 @@ keycode_t keycodes[] = { { KEY_0, "0" }, { KEY_BRIGHTNESSDOWN, "lcdbrightdown" }, { KEY_BRIGHTNESSUP, "lcdbrightup" }, + { KEY_COFFEE, "hold" }, /* coffee? lol */ + { KEY_F1, "f1" }, + { KEY_F2, "f2" }, + { KEY_F3, "f3" }, + { KEY_F4, "f4" }, + { KEY_F5, "f5" }, + { KEY_F6, "f6" }, + { KEY_F7, "f7" }, + { KEY_F8, "f8" }, + { KEY_F9, "f9" }, + { KEY_F10, "f10" }, + { KEY_F11, "f11" }, + { KEY_F12, "f12" }, + { KEY_F18, "f18" }, + { KEY_F23, "f23" }, + { KEY_YEN, "yen" }, { -1, NULL } }; @@ -91,6 +107,12 @@ generic_event_t generics[] = { { -1, -1, NULL } }; +// FAKESCRIPT_ entries are to better handle a virtual script name; if we have to parse +// "TOGGLE_HOLD" for every key down, it seems a little inefficient; at conf-time, if we +// see this string for example, why not change it to a magic number .. and if we see that +// down the road, we can act with just an integer compare, instead of a string compare.. +#define FAKESCRIPT_TOGGLE_HOLD 0001 + // event-to-sh mapping // typedef struct { @@ -132,6 +154,10 @@ unsigned int bc_stopcur = 80000; // charge current threshold as stop condition unsigned char bc_startcap = 95; // battery capacity threshold to resume charging char *bc_charge_devices = NULL; // charger /sys/class/power_supply/ devices, changes between kernel versions +// fd's; pulled from main() so I can be lazy +int fds [ 8 ] = { -1, -1, -1, -1, -1, -1, -1, -1 }; // 0 = keypad, 1 = gpio keys +int imaxfd = 0; + /* get to it */ void dispatch_key ( int keycode, int val ); @@ -139,6 +165,8 @@ void dispatch_event ( int code, int val ); void sigchld_handler ( int n ); unsigned char set_next_alarm ( unsigned int secs, unsigned int usecs ); void sigalrm_handler ( int n ); +void fakescript_hold_on ( void ); +void fakescript_hold_off ( void ); static void usage ( char *argv[] ) { printf ( "%s [-d]\n", argv [ 0 ] ); @@ -327,6 +355,11 @@ int main ( int argc, char *argv[] ) { } else { g_evmap [ g_evmap_max ].script = n; g_evmap [ g_evmap_max ].maxhold = 0; + + if ( strcmp ( n, "TOGGLE_HOLD" ) == 0 ) { + g_evmap [ g_evmap_max ].script = (char*)FAKESCRIPT_TOGGLE_HOLD; + } + } pnd_log ( pndn_rem, "Registered key %s [%d] to script %s with maxhold %d\n", @@ -483,8 +516,6 @@ int main ( int argc, char *argv[] ) { // try to locate the appropriate devices int id; - int fds [ 8 ] = { -1, -1, -1, -1, -1, -1, -1, -1 }; // 0 = keypad, 1 = gpio keys - int imaxfd = 0; for ( id = 0; ; id++ ) { char fname[64]; @@ -714,8 +745,17 @@ void dispatch_key ( int keycode, int val ) { // keydown if ( g_evmap [ i ].maxhold == 0 ) { - g_evmap [ i ].keydown_time = 0; - invoke_it = 1; + + // is this a special internally handled key, or normal key? + if ( g_evmap [ i ].script == (char*)FAKESCRIPT_TOGGLE_HOLD ) { + // handle this specially + fakescript_hold_on(); + } else { + // normal key, with script to run + g_evmap [ i ].keydown_time = 0; + invoke_it = 1; + } + } else { g_evmap [ i ].keydown_time = time ( NULL ); } @@ -729,13 +769,21 @@ void dispatch_key ( int keycode, int val ) { invoke_it = 1; } - } else if ( val == 0 && g_evmap [ i ].keydown_time ) { - // keyup (while key is down) + } else if ( val == 0 ) { + + if ( g_evmap [ i ].script == (char*)FAKESCRIPT_TOGGLE_HOLD ) { + // handle this specially + fakescript_hold_off(); + + } else if ( g_evmap [ i ].keydown_time ) { + // keyup (while key is down) + + if ( time ( NULL ) - g_evmap [ i ].last_trigger_time >= g_minimum_separation ) { + invoke_it = 1; + } else { + pnd_log ( pndn_rem, "Skipping invokation.. falls within minimum_separation threshold\n" ); + } - if ( time ( NULL ) - g_evmap [ i ].last_trigger_time >= g_minimum_separation ) { - invoke_it = 1; - } else { - pnd_log ( pndn_rem, "Skipping invokation.. falls within minimum_separation threshold\n" ); } } // key up or down? @@ -1000,3 +1048,25 @@ void sigalrm_handler ( int n ) { return; } + +void fakescript_hold_on ( void ) { + pnd_log ( pndn_rem, "HOLD is being enabled.\n" ); + + int i; + for ( i = 0; i < imaxfd; i++ ) { + ioctl ( fds [ i ], EVIOCGRAB, 1 /* enable */ ); + } + + return; +} + +void fakescript_hold_off ( void ) { + pnd_log ( pndn_rem, "HOLD is being disabled.\n" ); + + int i; + for ( i = 0; i < imaxfd; i++ ) { + ioctl ( fds [ i ], EVIOCGRAB, 0 /* disable */ ); + } + + return; +}