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");
    }

}