void HciManager::handleLeMetaEvent(const quint8 *data) { // Spec v4.2, Vol 2, part E, 7.7.65ff switch (*data) { case 0x1: { const quint16 handle = bt_get_le16(data + 2); emit connectionComplete(handle); break; } case 0x3: { // TODO: From little endian! struct ConnectionUpdateData { quint8 status; quint16 handle; quint16 interval; quint16 latency; quint16 timeout; } __attribute((packed)); const auto * const updateData = reinterpret_cast<const ConnectionUpdateData *>(data + 1); if (updateData->status == 0) { QLowEnergyConnectionParameters params; const double interval = qFromLittleEndian(updateData->interval) * 1.25; params.setIntervalRange(interval, interval); params.setLatency(qFromLittleEndian(updateData->latency)); params.setSupervisionTimeout(qFromLittleEndian(updateData->timeout) * 10); emit connectionUpdate(qFromLittleEndian(updateData->handle), params); } break; } default: break; } }
ConnectionUpdateData connectionUpdateData(const QLowEnergyConnectionParameters ¶ms) { ConnectionUpdateData data; const quint16 minInterval = forceIntervalIntoRange(params.minimumInterval()); const quint16 maxInterval = forceIntervalIntoRange(params.maximumInterval()); data.minInterval = qToLittleEndian(minInterval); data.maxInterval = qToLittleEndian(maxInterval); const quint16 latency = qMax<quint16>(0, qMin<quint16>(params.latency(), 499)); data.slaveLatency = qToLittleEndian(latency); const quint16 timeout = qMax<quint16>(100, qMin<quint16>(32000, params.supervisionTimeout())) / 10; data.timeout = qToLittleEndian(timeout); return data; }
/*! Returns \a true if \a p1 and \a p2 are equal with respect to their public state, otherwise returns false. */ bool operator==(const QLowEnergyConnectionParameters &p1, const QLowEnergyConnectionParameters &p2) { if (p1.d == p2.d) return true; return p1.minimumInterval() == p2.minimumInterval() && p1.maximumInterval() == p2.maximumInterval() && p1.latency() == p2.latency() && p1.supervisionTimeout() == p2.supervisionTimeout(); }