void gatt_service_disconnected(const char *bdaddr, const char *service, int instance, int reason, void *userData) { Q_UNUSED(userData) Q_UNUSED(instance) Q_UNUSED(reason) QString bdaddr_str = QString(bdaddr); QString service_str = QString(service); qDebug() << QString("XXXX gatt_service_disconnected: bdaddr:%1 : %2 - %3").arg(bdaddr_str).arg(service_str).arg(parse_service_uuid(service)); DataContainer *dc = DataContainer::getInstance(); if (instance == dc->getDeviceInformationServiceInstance()) { qDebug() << "XXXX reacting to device information service disconnection"; device_information_connected = false; dc->setDeviceInformationServiceInstance(0); } }
void readInfo() { if (!device_information_connected) { _handler->emitSignalLogMessage("Not connected to device information service"); return; } DataContainer* dc = DataContainer::getInstance(); if (dc->getManufacturerNameHandle() != 0) { qDebug() << "XXXX reading manufacturer name from service instance " << dc->getDeviceInformationServiceInstance(); int mfn_max_len = 80; uint8_t *manufacturer_name_bytes; manufacturer_name_bytes = (uint8_t*) calloc(mfn_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getManufacturerNameValueHandle(), 0, manufacturer_name_bytes, mfn_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value manufacturer name - errno=(" << errno<< ") :" << strerror(errno); } else { char *manufacturer_name_string = (char*) manufacturer_name_bytes; dc->setManufacturerName(QString(manufacturer_name_string)); _handler->emitSignalLogMessage("MANUFACTURER NAME:"+dc->getManufacturerName()); } free(manufacturer_name_bytes); } else { _handler->emitSignalLogMessage("MANUFACTURER NAME:not present"); } if (dc->getModelNumberHandle() != 0) { qDebug() << "XXXX reading model number from service instance " << dc->getDeviceInformationServiceInstance(); int mon_max_len = 80; uint8_t *model_number_bytes; model_number_bytes = (uint8_t*) calloc(mon_max_len, sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getModelNumberValueHandle(), 0, model_number_bytes, mon_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value model number - errno=(" << errno<< ") :" << strerror(errno); } else { char *model_number_string = (char*) model_number_bytes; dc->setModelNumber(QString(model_number_string)); _handler->emitSignalLogMessage("MODEL NUMBER:"+dc->getModelNumber()); } free(model_number_bytes); } else { _handler->emitSignalLogMessage("MODEL NUMBER:not present"); } if (dc->getSerialNumberHandle() != 0) { qDebug() << "XXXX reading serial number from service instance " << dc->getDeviceInformationServiceInstance(); int sen_max_len = 80; uint8_t *serial_number_bytes; serial_number_bytes = (uint8_t*) calloc(sen_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getSerialNumberValueHandle(), 0, serial_number_bytes, sen_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value serial number - errno=(" << errno<< ") :" << strerror(errno); } else { char *serial_number_string = (char*) serial_number_bytes; dc->setSerialNumber(QString(serial_number_string)); _handler->emitSignalLogMessage("SERIAL NUMBER:"+dc->getSerialNumber()); } free(serial_number_bytes); } else { _handler->emitSignalLogMessage("SERIAL NUMBER:not present"); } if (dc->getHardwareRevisionHandle() != 0) { qDebug() << "XXXX reading hardware revision from service instance " << dc->getDeviceInformationServiceInstance(); int hwr_max_len = 80; uint8_t *hardware_revision_bytes; hardware_revision_bytes = (uint8_t*) calloc(hwr_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getHardwareRevisionValueHandle(), 0, hardware_revision_bytes, hwr_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value hardware revision - errno=(" << errno<< ") :" << strerror(errno); } else { char *hardware_revision_string = (char*) hardware_revision_bytes; dc->setHardwareRevision(QString(hardware_revision_string)); _handler->emitSignalLogMessage("HARDWARE REVISION:"+dc->getHardwareRevision()); } free(hardware_revision_bytes); } else { _handler->emitSignalLogMessage("HARDWARE REVISION:not present"); } if (dc->getFirmwareRevisionHandle() != 0) { qDebug() << "XXXX reading firmware revision from service instance " << dc->getDeviceInformationServiceInstance(); int fwr_max_len = 80; uint8_t *firmware_revision_bytes; firmware_revision_bytes = (uint8_t*) calloc(fwr_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getFirmwareRevisionValueHandle(), 0, firmware_revision_bytes, fwr_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value firmware revision - errno=(" << errno<< ") :" << strerror(errno); } else { char *firmware_revision_string = (char*) firmware_revision_bytes; dc->setFirmwareRevision(QString(firmware_revision_string)); _handler->emitSignalLogMessage("FIRMWARE REVISION:"+dc->getFirmwareRevision()); } free(firmware_revision_bytes); } else { _handler->emitSignalLogMessage("FIRMWARE REVISION:not present"); } if (dc->getSoftwareRevisionHandle() != 0) { qDebug() << "XXXX reading software revision from service instance " << dc->getDeviceInformationServiceInstance(); int swr_max_len = 80; uint8_t *software_revision_bytes; software_revision_bytes = (uint8_t*) calloc(swr_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getSoftwareRevisionValueHandle(), 0, software_revision_bytes, swr_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value software revision - errno=(" << errno<< ") :" << strerror(errno); } else { char *software_revision_string = (char*) software_revision_bytes; dc->setSoftwareRevision(QString(software_revision_string)); _handler->emitSignalLogMessage("SOFTWARE REVISION:"+dc->getSoftwareRevision()); } free(software_revision_bytes); } else { _handler->emitSignalLogMessage("SOFTWARE REVISION:not present"); } qDebug() << "XXXX system ID next...."; if (dc->getSystemIdHandle() != 0) { qDebug() << "XXXX reading system ID from service instance " << dc->getDeviceInformationServiceInstance(); int sid_max_len = 8; uint8_t *system_id_bytes; system_id_bytes = (uint8_t*) calloc(sid_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getSystemIdValueHandle(), 0, system_id_bytes, sid_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value system ID - errno=(" << errno<< ") :" << strerror(errno); } else { uint64_t manufacturer_identifier=((system_id_bytes[4] << 40) + (system_id_bytes[3] << 32) + (system_id_bytes[2] << 16) + (system_id_bytes[1] << 8) + (system_id_bytes[0])); dc->setManufacturerIdentifier(manufacturer_identifier); _handler->emitSignalLogMessage(QString("MANUFACTURER ID:%1").arg(dc->getManufacturerIdentifier())); uint32_t organizationally_unique_identifier=((system_id_bytes[7] << 16) + (system_id_bytes[6] << 8) + (system_id_bytes[5])); dc->setOrgUniqueIdentifier(organizationally_unique_identifier); _handler->emitSignalLogMessage(QString("ORG UNIQUE ID:%1").arg(dc->getOrgUniqueIdentifier())); } free(system_id_bytes); } else { _handler->emitSignalLogMessage("SYSTEM ID:not present"); } qDebug() << "XXXX certification data next...."; if (dc->getCertificationDataHandle() != 0) { qDebug() << "XXXX reading certification data list from service instance " << dc->getDeviceInformationServiceInstance(); int cdl_max_len = 80; uint8_t *certification_data_list_bytes; certification_data_list_bytes = (uint8_t*) calloc(cdl_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getCertificationDataHandle(), 0, certification_data_list_bytes, cdl_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value certification data - errno=(" << errno<< ") :" << strerror(errno); } else { QByteArray cdl_ba = QByteArray::fromRawData(reinterpret_cast<const char *>(certification_data_list_bytes), cdl_max_len); QString cdl = QString::fromAscii(cdl_ba.toHex()); dc->setCertificationData(cdl_ba); _handler->emitSignalLogMessage("CERTIFICATION DATA:"+cdl); } free(certification_data_list_bytes); } else { _handler->emitSignalLogMessage("CERTIFICATION DATA:not present"); } qDebug() << "XXXX PnP ID next...."; if (dc->getPnpIdHandle() != 0) { qDebug() << "XXXX reading PnP ID from service instance " << dc->getDeviceInformationServiceInstance(); int pnp_max_len = 7; uint8_t *pnp_id_bytes; pnp_id_bytes = (uint8_t*) calloc(pnp_max_len,sizeof(uint8_t)); errno= 0; int result = bt_gatt_read_value(dc->getDeviceInformationServiceInstance(), dc->getPnpIdHandle(), 0, pnp_id_bytes, pnp_max_len, 0); if (result < 0) { qDebug() << "XXXX bt_gatt_read_value PnP ID - errno=(" << errno<< ") :" << strerror(errno); } else { QByteArray pnp_ba = QByteArray::fromRawData(reinterpret_cast<const char *>(pnp_id_bytes), pnp_max_len); dc->setPnpId(pnp_ba); uint8_t vendor_id_source = pnp_id_bytes[6]; _handler->emitSignalLogMessage(QString("VENDOR SOURCE ID:%1").arg(vendor_id_source)); uint16_t vendor_id = (pnp_id_bytes[5] << 8) + (pnp_id_bytes[4]); _handler->emitSignalLogMessage(QString("VENDOR ID:%1").arg(vendor_id)); uint16_t product_id = (pnp_id_bytes[3] << 8) + (pnp_id_bytes[2]); _handler->emitSignalLogMessage(QString("PRODUCT ID:%1").arg(product_id)); uint16_t product_version = (pnp_id_bytes[1] << 8) + (pnp_id_bytes[0]); _handler->emitSignalLogMessage(QString("PRODUCT VERSION:%1").arg(product_version)); } free(pnp_id_bytes); } else { _handler->emitSignalLogMessage("PNP ID:not present"); } }