void Worker::doWork() { struct pollfd fdset[1]; unsigned char buf[20]; for (;;) { // Checks if the process should be aborted mutex.lock(); bool abort = _abort; mutex.unlock(); if (abort) { break; } memset((void*)fdset, 0, sizeof(fdset)); fdset[0].fd = _gpio_fd; fdset[0].events = POLLPRI; poll(fdset, 1, 1800); if (fdset[0].revents & POLLPRI) { ssize_t res = read(fdset[0].fd, buf, sizeof(buf)); (void) res; emit gpioInterruptCaptured(); } } mutex.lock(); _working = false; mutex.unlock(); emit finished(); }
/* Main */ Tohkbd::Tohkbd(QObject *parent) : QObject(parent) { dbusRegistered = false; interruptsEnabled = false; vddEnabled = false; capsLockSeq = 0; vkbLayoutIsTohkbd = false; currentActiveLayout = QString(); currentOrientationLock = QString(); keypadIsPresent = false; gpio_fd = -1; displayIsOn = false; keyIsPressed = false; keyRepeat = false; slideEventEmitted = false; taskSwitcherVisible = false; ssNotifyReplacesId = 0; ssFilename = QString(); tohkbd2user = new QDBusInterface("com.kimmoli.tohkbd2user", "/", "com.kimmoli.tohkbd2user", QDBusConnection::sessionBus(), this); tohkbd2user->setTimeout(2000); thread = new QThread(); worker = new Worker(); worker->moveToThread(thread); connect(worker, SIGNAL(gpioInterruptCaptured()), this, SLOT(handleGpioInterrupt())); connect(worker, SIGNAL(workRequested()), thread, SLOT(start())); connect(thread, SIGNAL(started()), worker, SLOT(doWork())); connect(worker, SIGNAL(finished()), thread, SLOT(quit()), Qt::DirectConnection); backlightTimer = new QTimer(this); backlightTimer->setSingleShot(true); connect(backlightTimer, SIGNAL(timeout()), this, SLOT(backlightTimerTimeout())); presenceTimer = new QTimer(this); presenceTimer->setInterval(2000); presenceTimer->setSingleShot(true); connect(presenceTimer, SIGNAL(timeout()), this, SLOT(presenceTimerTimeout())); repeatTimer = new QTimer(this); repeatTimer->setSingleShot(true); connect(repeatTimer, SIGNAL(timeout()), this, SLOT(repeatTimerTimeout())); /* do this automatically at startup */ setVddState(true); setInterruptEnable(true); uinputif = new UinputIf(); uinputif->openUinputDevice(); tca8424 = new tca8424driver(0x3b); keymap = new keymapping(); FKEYS.clear(); FKEYS.append(KEY_F1); FKEYS.append(KEY_F2); FKEYS.append(KEY_F3); FKEYS.append(KEY_F4); FKEYS.append(KEY_F5); FKEYS.append(KEY_F6); FKEYS.append(KEY_F7); FKEYS.append(KEY_F8); FKEYS.append(KEY_F9); FKEYS.append(KEY_F10); FKEYS.append(KEY_F11); FKEYS.append(KEY_F12); reloadSettings(); if (currentActiveLayout.isEmpty()) changeActiveLayout(true); if (currentOrientationLock.isEmpty()) { changeOrientationLock(true); saveOrientation(); } checkKeypadPresence(); connect(keymap, SIGNAL(shiftChanged()), this, SLOT(handleShiftChanged())); connect(keymap, SIGNAL(ctrlChanged()), this, SLOT(handleCtrlChanged())); connect(keymap, SIGNAL(altChanged()), this, SLOT(handleAltChanged())); connect(keymap, SIGNAL(symChanged()), this, SLOT(handleSymChanged())); connect(keymap, SIGNAL(keyPressed(QList< QPair<int, int> >)), this, SLOT(handleKeyPressed(QList< QPair<int, int> >))); connect(keymap, SIGNAL(keyReleased()), this, SLOT(handleKeyReleased())); }
/* Main */ Tohkbd::Tohkbd(QObject *parent) : QObject(parent) { dbusRegistered = false; interruptsEnabled = false; vddEnabled = false; vkbLayoutIsTohkbd = false; currentActiveLayout = QString(); currentOrientationLock = QString(); keypadIsPresent = false; gpio_fd = -1; displayIsOn = false; keyIsPressed = false; keyRepeat = false; slideEventEmitted = false; taskSwitcherVisible = false; selfieLedOn = false; gpioInterruptCounter = 0; actualSailfishVersion = QString(); fix_CapsLock = !checkSailfishVersion("1.1.7.0"); capsLock = false; tohkbd2user = new ComKimmoliTohkbd2userInterface("com.kimmoli.tohkbd2user", "/", QDBusConnection::sessionBus(), this); tohkbd2user->setTimeout(2000); thread = new QThread(); worker = new Worker(); worker->moveToThread(thread); connect(worker, SIGNAL(gpioInterruptCaptured()), this, SLOT(handleGpioInterrupt())); connect(worker, SIGNAL(workRequested()), thread, SLOT(start())); connect(thread, SIGNAL(started()), worker, SLOT(doWork())); connect(worker, SIGNAL(finished()), thread, SLOT(quit()), Qt::DirectConnection); backlightTimer = new QTimer(this); backlightTimer->setSingleShot(true); connect(backlightTimer, SIGNAL(timeout()), this, SLOT(backlightTimerTimeout())); presenceTimer = new QTimer(this); presenceTimer->setInterval(2000); presenceTimer->setSingleShot(true); connect(presenceTimer, SIGNAL(timeout()), this, SLOT(presenceTimerTimeout())); repeatTimer = new QTimer(this); repeatTimer->setSingleShot(true); connect(repeatTimer, SIGNAL(timeout()), this, SLOT(repeatTimerTimeout())); /* do this automatically at startup */ setVddState(true); setInterruptEnable(true); uinputif = new UinputIf(); uinputif->openUinputDevice(); uinputevpoll = new UinputEvPoll(); evpollThread = new QThread(); uinputevpoll->moveToThread(evpollThread); connect(uinputevpoll, SIGNAL(capsLockLedChanged(bool)), this, SLOT(capsLockLedState(bool))); connect(uinputevpoll, SIGNAL(pollingRequested()), evpollThread, SLOT(start())); connect(evpollThread, SIGNAL(started()), uinputevpoll, SLOT(doPoll())); connect(uinputevpoll, SIGNAL(finished()), evpollThread, SLOT(quit()), Qt::DirectConnection); uinputevpoll->requestPolling(uinputif->getFd()); printf("uinputevpoll->requestPolling(uinputif->getFd());\n"); tca8424 = new tca8424driver(0x3b); keymap = new keymapping(); FKEYS.clear(); FKEYS.append(KEY_F1); FKEYS.append(KEY_F2); FKEYS.append(KEY_F3); FKEYS.append(KEY_F4); FKEYS.append(KEY_F5); FKEYS.append(KEY_F6); FKEYS.append(KEY_F7); FKEYS.append(KEY_F8); FKEYS.append(KEY_F9); FKEYS.append(KEY_F10); FKEYS.append(KEY_F11); FKEYS.append(KEY_F12); reloadSettings(); keymap->setLayout(masterLayout); if (currentActiveLayout.isEmpty()) changeActiveLayout(true); if (currentOrientationLock.isEmpty()) { changeOrientationLock(true); saveOrientation(); } checkKeypadPresence(); connect(keymap, SIGNAL(shiftChanged()), this, SLOT(handleShiftChanged())); connect(keymap, SIGNAL(ctrlChanged()), this, SLOT(handleCtrlChanged())); connect(keymap, SIGNAL(altChanged()), this, SLOT(handleAltChanged())); connect(keymap, SIGNAL(symChanged()), this, SLOT(handleSymChanged())); connect(keymap, SIGNAL(toggleCapsLock()), this, SLOT(toggleCapsLock())); connect(keymap, SIGNAL(keyPressed(QList< QPair<int, int> >)), this, SLOT(handleKeyPressed(QList< QPair<int, int> >))); connect(keymap, SIGNAL(keyReleased()), this, SLOT(handleKeyReleased())); connect(keymap, SIGNAL(bogusDetected()), tca8424, SLOT(reset())); }