mirror of
https://github.com/netfun2000/lcd4linux.git
synced 2026-02-27 09:44:34 +08:00
drv_picoLCDGraphic.c: alternative use of keypad widgets (instead of GPIO)
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@1118 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
This commit is contained in:
+78
-2
@@ -58,6 +58,7 @@
|
||||
#include "widget_text.h"
|
||||
#include "widget_icon.h"
|
||||
#include "widget_bar.h"
|
||||
#include "widget_keypad.h"
|
||||
#include "drv.h"
|
||||
#include "drv_generic_gpio.h"
|
||||
#include "drv_generic_keypad.h"
|
||||
@@ -281,6 +282,28 @@ static void drv_pLG_update_img()
|
||||
}
|
||||
|
||||
|
||||
#define _USBLCD_MAX_DATA_LEN 24
|
||||
#define IN_REPORT_KEY_STATE 0x11
|
||||
static void drv_pLG_update_keypad()
|
||||
{
|
||||
static int pressed_key = 0;
|
||||
|
||||
int ret;
|
||||
unsigned char read_packet[_USBLCD_MAX_DATA_LEN];
|
||||
ret = drv_pLG_read(read_packet, _USBLCD_MAX_DATA_LEN);
|
||||
if ((ret > 0) && (read_packet[0] == IN_REPORT_KEY_STATE)) {
|
||||
debug("picoLCD: pressed key= 0x%02x\n", read_packet[1]);
|
||||
int new_pressed_key = read_packet[1];
|
||||
if (pressed_key != new_pressed_key) {
|
||||
/* negative values mark a key release */
|
||||
drv_generic_keypad_press(-pressed_key);
|
||||
drv_generic_keypad_press(new_pressed_key);
|
||||
pressed_key = new_pressed_key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* for graphic displays only */
|
||||
static void drv_pLG_blit(const int row, const int col, const int height, const int width)
|
||||
{
|
||||
@@ -418,8 +441,6 @@ static int drv_pLG_backlight(int backlight)
|
||||
return backlight;
|
||||
}
|
||||
|
||||
#define _USBLCD_MAX_DATA_LEN 24
|
||||
#define IN_REPORT_KEY_STATE 0x11
|
||||
static int drv_pLG_gpi( __attribute__ ((unused))
|
||||
int num)
|
||||
{
|
||||
@@ -539,6 +560,11 @@ static int drv_pLG_start(const char *section, const int quiet)
|
||||
if (update > 0)
|
||||
timer_add(drv_pLG_update_img, NULL, update, 0);
|
||||
|
||||
/* setup a timer that regularly checks the keypad for pressed or
|
||||
released keys */
|
||||
/* FIXME: make 100msec configurable */
|
||||
timer_add(drv_pLG_update_keypad, NULL, 100, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -594,6 +620,48 @@ int drv_pLG_list(void)
|
||||
}
|
||||
|
||||
|
||||
static int drv_pLG_keypad(const int num)
|
||||
{
|
||||
int val;
|
||||
int new_num = num;
|
||||
|
||||
if (new_num == 0)
|
||||
return 0;
|
||||
else if (new_num > 0)
|
||||
val = WIDGET_KEY_PRESSED;
|
||||
else {
|
||||
/* negative values mark a key release */
|
||||
new_num = -num;
|
||||
val = WIDGET_KEY_RELEASED;
|
||||
}
|
||||
|
||||
switch (new_num) {
|
||||
case 1:
|
||||
val += WIDGET_KEY_CANCEL;
|
||||
break;
|
||||
case 2:
|
||||
val += WIDGET_KEY_LEFT;
|
||||
break;
|
||||
case 3:
|
||||
val += WIDGET_KEY_RIGHT;
|
||||
break;
|
||||
case 5:
|
||||
val += WIDGET_KEY_UP;
|
||||
break;
|
||||
case 6:
|
||||
val += WIDGET_KEY_CONFIRM;
|
||||
break;
|
||||
case 7:
|
||||
val += WIDGET_KEY_DOWN;
|
||||
break;
|
||||
default:
|
||||
error("%s: unknown keypad value %d", Name, num);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
/* initialize driver & display */
|
||||
int drv_pLG_init(const char *section, const int quiet)
|
||||
{
|
||||
@@ -610,6 +678,7 @@ int drv_pLG_init(const char *section, const int quiet)
|
||||
GPIS = 1;
|
||||
/* real worker functions */
|
||||
drv_generic_graphic_real_blit = drv_pLG_blit;
|
||||
drv_generic_keypad_real_press = drv_pLG_keypad;
|
||||
drv_generic_gpio_real_set = drv_pLG_gpo;
|
||||
drv_generic_gpio_real_get = drv_pLG_gpi;
|
||||
|
||||
@@ -623,6 +692,12 @@ int drv_pLG_init(const char *section, const int quiet)
|
||||
if ((ret = drv_generic_graphic_init(section, Name)) != 0)
|
||||
return ret;
|
||||
|
||||
|
||||
/* initialize generic key pad driver */
|
||||
if ((ret = drv_generic_keypad_init(section, Name)) != 0)
|
||||
return ret;
|
||||
|
||||
|
||||
/* GPO's init */
|
||||
|
||||
if ((ret = drv_generic_gpio_init(section, Name)) != 0)
|
||||
@@ -660,6 +735,7 @@ int drv_pLG_quit(const int quiet)
|
||||
}
|
||||
|
||||
drv_generic_graphic_quit();
|
||||
drv_generic_keypad_quit();
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user