void QQnxNavigatorEventNotifier::readData() { qNavigatorEventNotifierDebug() << Q_FUNC_INFO << "reading navigator data"; // allocate buffer for pps data char buffer[ppsBufferSize]; // attempt to read pps data errno = 0; int bytes = qt_safe_read(m_fd, buffer, ppsBufferSize - 1); if (bytes == -1) qFatal("QQNX: failed to read navigator pps, errno=%d", errno); // check if pps data was received if (bytes > 0) { // ensure data is null terminated buffer[bytes] = '\0'; // process received message QByteArray ppsData(buffer); QByteArray msg; QByteArray dat; QByteArray id; parsePPS(ppsData, msg, dat, id); handleMessage(msg, dat, id); } }
bool QQnxNavigatorPps::sendPpsMessage(const QByteArray &message, const QByteArray &data) { QByteArray ppsMessage = "msg::" + message; if (!data.isEmpty()) ppsMessage += "\ndat::" + data; ppsMessage += "\n"; qNavigatorDebug() << Q_FUNC_INFO << "sending PPS message:\n" << ppsMessage; // send pps message to navigator errno = 0; int bytes = qt_safe_write(m_fd, ppsMessage.constData(), ppsMessage.size()); if (bytes == -1) qFatal("QQNX: failed to write navigator pps, errno=%d", errno); // allocate buffer for pps data char buffer[ppsBufferSize]; // attempt to read pps data do { errno = 0; bytes = qt_safe_read(m_fd, buffer, ppsBufferSize - 1); if (bytes == -1) qFatal("QQNX: failed to read navigator pps, errno=%d", errno); } while (bytes == 0); // ensure data is null terminated buffer[bytes] = '\0'; qNavigatorDebug() << Q_FUNC_INFO << "received PPS message:\n" << buffer; // process received message QByteArray ppsData(buffer); QHash<QByteArray, QByteArray> responseFields; parsePPS(ppsData, responseFields); if (responseFields.contains("res") && responseFields.value("res") == message) { if (responseFields.contains("err")) { qCritical() << "navigator responded with error: " << responseFields.value("err"); return false; } } return true; }
void QQnxButtonEventNotifier::updateButtonStates() { // Allocate buffer for pps data char buffer[ppsBufferSize]; // Attempt to read pps data errno = 0; int bytes = qt_safe_read(m_fd, buffer, ppsBufferSize - 1); qButtonDebug() << "Read" << bytes << "bytes of data"; if (bytes == -1) { qWarning("QQNX: failed to read hardware buttons pps object, errno=%d", errno); return; } // We seem to get a spurious read notification after the real one. Ignore it if (bytes == 0) return; // Ensure data is null terminated buffer[bytes] = '\0'; qButtonDebug() << Q_FUNC_INFO << "received PPS message:\n" << buffer; // Process received message QByteArray ppsData = QByteArray::fromRawData(buffer, bytes); QHash<QByteArray, QByteArray> fields; if (!parsePPS(ppsData, &fields)) return; // Update our state and inject key events as needed for (int buttonId = bid_minus; buttonId < ButtonCount; ++buttonId) { // Extract the new button state QByteArray key = m_buttonKeys.at(buttonId); ButtonState newState = (fields.value(key) == QByteArrayLiteral("b_up") ? ButtonUp : ButtonDown); // If state has changed, update our state and inject a keypress event if (m_state[buttonId] != newState) { qButtonDebug() << "Hardware button event: button =" << key << "state =" << fields.value(key); m_state[buttonId] = newState; // Is it a key press or key release event? QEvent::Type type = (newState == ButtonDown) ? QEvent::KeyPress : QEvent::KeyRelease; Qt::Key key; switch (buttonId) { case bid_minus: key = Qt::Key_VolumeDown; break; case bid_playpause: key = Qt::Key_Play; break; case bid_plus: key = Qt::Key_VolumeUp; break; case bid_power: key = Qt::Key_PowerDown; break; default: qButtonDebug() << "Unknown hardware button"; continue; } // No modifiers Qt::KeyboardModifiers modifier = Qt::NoModifier; // Post the event QWindowSystemInterface::handleKeyEvent(QGuiApplication::focusWindow(), type, key, modifier); } } }