#include #include #include #include #include #include "keytest.h" #include "ui_keytest.h" #include #include #include #include #define DEV_INPUT_EVENT "/dev/input" #define EVENT_DEV_NAME "event" static int is_event_device(const struct dirent *dir) { return strncmp(EVENT_DEV_NAME, dir->d_name, 5) == 0; } static char* scan_devices(void) { struct dirent **namelist; int i, ndev, devnum; char *filename; int max_device = 0; ndev = scandir(DEV_INPUT_EVENT, &namelist, is_event_device, alphasort); if (ndev <= 0) return NULL; fprintf(stderr, "Available devices:\n"); for (i = 0; i < ndev; i++) { char fname[64]; int fd = -1; char name[256] = "???"; snprintf(fname, sizeof(fname), "%s/%s", DEV_INPUT_EVENT, namelist[i]->d_name); fd = open(fname, O_RDONLY); if (fd < 0) continue; ioctl(fd, EVIOCGNAME(sizeof(name)), name); close(fd); if (strncmp(name, "adc-keys", strlen("adc-keys")) != 0) continue; fprintf(stderr, "%s: %s\n", fname, name); sscanf(namelist[i]->d_name, "event%d", &devnum); if (devnum > max_device) max_device = devnum; free(namelist[i]); } if (devnum > max_device || devnum < 0) return NULL; asprintf(&filename, "%s/%s%d", DEV_INPUT_EVENT, EVENT_DEV_NAME, devnum); return filename; } Keytest::Keytest(QWidget *parent) : QWidget(parent), ui(new Ui::Keytest) { ui->setupUi(this); ui->mainLayout; setLayout(ui->mainLayout); setWindowState(Qt::WindowMaximized); setWindowFlags(Qt::FramelessWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); char *event_name = scan_devices(); if (!event_name) return ; m_fd = open(event_name, O_RDONLY); if (m_fd < 0) { QMessageBox::information(this,"Error", "Fail to open ,Please check your key device"); return; } memset(m_oldButtonsState, 0, sizeof(m_oldButtonsState)); m_notifyObject = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); connect (m_notifyObject, SIGNAL(activated(int)), this, SLOT(keyEvent())); connect(ui->exitBtn, &QPushButton::clicked, this, [=](){ close(); }); } Keytest::~Keytest() { delete m_notifyObject; ::close(m_fd); delete ui; } void Keytest::keyEvent() { char buffer[KEYMAXNUM]; memset(buffer, 0, sizeof(buffer)); struct input_event event; int nResult=::read(m_fd, &event, sizeof(event)); if (nResult != sizeof(event)) { QMessageBox::information(this,"Debug","read error"); return; } switch(event.code) { case KEY_V_UP: buffer[0]=event.value; break; case KEY_V_DOWN: buffer[1]=event.value; break; case KEY_V_HOME: buffer[2]=event.value; break; case KEY_V_ESC: buffer[3]=event.value; break; default: return; } for (unsigned i = 0; i < sizeof(buffer) / sizeof(buffer[0]); i++) { bool oldState = m_oldButtonsState[i]; bool isOn = ((buffer[i] & 0x01) | (buffer[i] & 0x02)); if (oldState != isOn) { m_oldButtonsState[i] = isOn; update(); //this function will call paintEvent } } } void Keytest::paintEvent(QPaintEvent*) { for(unsigned i = 0; i < KEYMAXNUM; i++) { if(m_oldButtonsState[i]) { switch(i) { case 0://up ui->pbt_up ->setStyleSheet(QString::fromUtf8("background-color: rgb(0, 0, 255);")); break; case 1://down ui->pbt_down->setStyleSheet(QString::fromUtf8("background-color: rgb(0, 0, 255);")); break; case 2://home ui->pbt_home->setStyleSheet(QString::fromUtf8("background-color: rgb(0, 0, 255);")); break; case 3://esc ui->pbt_menu->setStyleSheet(QString::fromUtf8("background-color: rgb(0, 0, 255);")); break; default: break; } } else { switch(i) { case 0://up ui->pbt_up ->setStyleSheet(QString::fromUtf8("background-color: rgb(206, 206,206);")); break; case 1://down ui->pbt_down->setStyleSheet(QString::fromUtf8("background-color: rgb(206, 206,206);")); break; case 2://home ui->pbt_home->setStyleSheet(QString::fromUtf8("background-color: rgb(206, 206,206);")); break; case 3://menu ui->pbt_menu->setStyleSheet(QString::fromUtf8("background-color: rgb(206, 206,206);")); break; default: break; } } } }