2025-05-10 21:58:58 +08:00

161 lines
3.0 KiB
C
Executable File

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <linux/input.h>
#include <fcntl.h>
#include <dirent.h>
#include "common.h"
#include "key_test.h"
#include "test_case.h"
#include "language.h"
#define test_bit(bit, array) (array[bit/8] & (1<<(bit%8)))
#include "screen_test.h"
unsigned char keybitmask[(KEY_MAX + 1) / 8];
struct key key_code[KEY_MAX];
unsigned char key_cnt = 0; /*key counter */
unsigned int gkey = 0;
static pthread_mutex_t gkeymutex = PTHREAD_MUTEX_INITIALIZER;
int g_key_test = 0;
static struct testcase_info *tc_info;
int set_gkey(unsigned int code)
{
int i;
for (i = 0; i < key_cnt; i++) {
if (code == key_code[i].code) {
ui_print_xy_rgba(0, tc_info->y, 0, 255, 0, 255,
"%s:[%s] key down\n", PCBA_KEY,
key_code[i].name);
screenTest_key_detect(code);
break;
}
}
return 0;
}
int scan_key_code(void)
{
unsigned temp = 0;
pthread_mutex_lock(&gkeymutex);
if (gkey) {
temp = gkey;
gkey = 0;
}
pthread_mutex_unlock(&gkeymutex);
return temp;
}
void switch_key(int i)
{
key_code[key_cnt].code = i;
switch (i) {
case KEY_VOLUMEDOWN:
key_code[key_cnt].name = "vol-";
break;
case KEY_VOLUMEUP:
key_code[key_cnt].name = "vol+";
break;
case KEY_POWER:
key_code[key_cnt].name = "power";
break;
case KEY_F1:
key_code[key_cnt].name = "menu";
#ifdef RK312X_PCBA
key_code[key_cnt].name = "vol+";
#endif
break;
case KEY_HOME:
key_code[key_cnt].name = "home";
break;
case KEY_BACK:
key_code[key_cnt].name = "ESC";
break;
case KEY_UP:
key_code[key_cnt].name = "UP";
break;
case KEY_DOWN:
key_code[key_cnt].name = "DOWN";
break;
case KEY_LEFT:
key_code[key_cnt].name = "LEFT";
break;
case KEY_RIGHT:
key_code[key_cnt].name = "RIGHT";
break;
case KEY_MENU:
key_code[key_cnt].name = "MENU";
break;
case KEY_ENTER:
case KEY_REPLY:
key_code[key_cnt].name = "OK";
break;
default:
printf("un supported key:%d\n", i);
break;
}
key_cnt++;
}
int key_code_probe(void)
{
DIR *dir;
struct dirent *de;
int fd;
char name[80];
int i;
dir = opendir("/dev/input");
if (dir != 0) {
while ((de = readdir(dir))) {
if (strncmp(de->d_name, "event", 5))
continue;
fd = openat(dirfd(dir), de->d_name, O_RDONLY);
if (fd < 0) {
continue;
} else {
if (ioctl
(fd, EVIOCGNAME(sizeof(name) - 1),
&name) < 1) {
name[0] = '\0';
}
/*do not open gsensor here */
if (!strcmp(name, "gsensor"))
continue;
ioctl(fd,
EVIOCGBIT(EV_KEY, sizeof(keybitmask)),
keybitmask);
for (i = 0; i < KEY_MAX; i++) {
if (test_bit(i, keybitmask) &&
(i != KEY_WAKEUP))
switch_key(i);
}
}
}
}
return 0;
}
void *key_test(void *argc)
{
int i = 0;
int code;
int run = 1;
tc_info = (struct testcase_info *)argc;
if (tc_info->y <= 0)
tc_info->y = get_cur_print_y();
ui_print_xy_rgba(0, tc_info->y, 255, 255, 0, 255, "%s: Waiting press key...\n", PCBA_KEY);
key_code_probe();
g_key_test = 1;
return NULL;
}