#include "Keyboard.h" #include #include #include "utilsfunc.h" #define KEYCODE_POWER 116 #define KEYCODE_START 60 #define KEYCODE_STOP 115 namespace huagao { Keyboard::Keyboard(std::function buttonevent) { m_event = buttonevent; mInputFd = open("/dev/input/event0", O_RDONLY | O_NONBLOCK); } Keyboard::~Keyboard() { b_run = false; if (pollthread.joinable()) pollthread.join(); if (mInputFd > 0) { ::close(mInputFd); } ::close(mEpId); } void Keyboard::init() { mEpId = epoll_create(1); int err; int len; int i; unsigned char byte; int bit; struct input_id id; unsigned int evbit[2]; std::string ev_name[] = { "EV_SYN", "EV_KEY", "EV_REL", "EV_ABS", "EV_MSC", "EV_SW", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "NULL", "EV_LED", "EV_LND", "NULL", "EV_REP", "EV_FF", "EV_PWR", }; if (mInputFd == -1) { LOG("open kd device or mouse fail! \n"); } else { ev.data.fd = mInputFd; ev.events = EPOLLIN | EPOLLET; int ret = epoll_ctl(mEpId, EPOLL_CTL_ADD, mInputFd, &ev); if (ret == -1) { LOG("add kd device in epoll fail! \n"); } } err = ioctl(mInputFd, EVIOCGID, &id); if (err == 0) { LOG("bustype = 0x%x\n", id.bustype); LOG("vendor = 0x%x\n", id.vendor); LOG("product = 0x%x\n", id.product); LOG("version = 0x%x\n", id.version); } len = ioctl(mInputFd, EVIOCGBIT(0, sizeof(evbit)), &evbit); if (len > 0 && len <= sizeof(evbit)) { LOG("support ev type : "); for (i = 0; i < len; i++) { byte = ((unsigned char *)evbit)[i]; for (bit = 0; bit < 8; bit++) { if (byte & (1 << bit)) LOG("%s ", ev_name[i * 8 + bit].c_str()); } } LOG("\n"); } b_run = true; pollthread = std::thread(&Keyboard::poll, this); } void Keyboard::poll() { int re = 0; while (b_run) { re = epoll_wait(mEpId, events, MAX_EVENTS, 1000); for (int i = 0; i < re; ++i) { if (events[i].events & EPOLLIN) { LOG("poll\n"); doInput(events + i); } } re = 0; } } long time_pressed_sec; long time_pressed_usec; void Keyboard::doInput(const epoll_event *ev) { ssize_t resize = 0; ssize_t n = 0; struct input_event input_ev; while ((resize = read(ev->data.fd, buffer + n, sizeof(struct input_event) - n)) > 0) { n += resize; if (n == sizeof(input_event)) { memcpy((void *)(&input_ev), buffer, sizeof(input_event)); if (input_ev.type != 1) // 非按键不响应 { n = 0; continue; } LOG("keyboard type=%d; code=%d; value=%d, sec=%ld, usec=%ld\n", (int)input_ev.type, (int)input_ev.code, (int)input_ev.value, input_ev.time.tv_sec, input_ev.time.tv_usec); if (input_ev.value == 0 && input_ev.type == 1) //记录按下的时间状态 { time_pressed_sec = (long)input_ev.time.tv_sec; time_pressed_usec = (long)input_ev.time.tv_usec; n = 0; continue; } LOG("keyboard press tiem sec=%ld, usec=%ld\n", time_pressed_sec, time_pressed_usec); double delay = (input_ev.time.tv_usec - time_pressed_usec) / 1000; delay = delay + (input_ev.time.tv_sec - time_pressed_sec) * 1000; LOG("press delay:%lf\n", delay); switch (input_ev.code) { case KEYCODE_POWER: if (delay >= 3000 && delay <= 200000) { printf("设备关机中。。。\r\n"); system("poweroff"); } else if (get_devs_status(SLEEP_STATUS_PATH) == SCANNER_ERR_SLEEP) { m_event(3); printf("按键唤醒设备中。。。\r\n"); } break; case KEYCODE_START: printf("KEYCODE_START\r\n"); m_event(0); break; case KEYCODE_STOP: printf("按键停止扫描!!!\n"); m_event(1); break; default: break; } n = 0; } } } } // namespace huagao