#include #include #include #include #include #include #include #include #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; }