void DeviceListing::update()
{
    _model->clear();

    bt_remote_device_t **remoteDeviceArray;
    bt_remote_device_t *nextRemoteDevice = 0;

    remoteDeviceArray = bt_disc_retrieve_devices(BT_DISCOVERY_PREKNOWN, 0);
    if (remoteDeviceArray) {
        for (int i = 0; (nextRemoteDevice = remoteDeviceArray[i]); ++i) {
            QVariantMap map;
            char buffer[128];
            const int bufferSize = sizeof(buffer);

            if (isAnImmediateAlertDevice(nextRemoteDevice)) {
                qDebug() << "XXXX DeviceListing::update() - found an Immediate Alert device";
				bt_rdev_get_friendly_name(nextRemoteDevice, buffer, bufferSize);
				map["deviceName"] = QString::fromLatin1(buffer);
				bt_rdev_get_address(nextRemoteDevice, buffer);
				map["deviceAddress"] = QString::fromLatin1(buffer);
				map["deviceClass"] = QString::number(bt_rdev_get_device_class(nextRemoteDevice, BT_COD_DEVICECLASS));
				map["deviceType"] = tr("Paired Bluetooth Devices Capable of Immediate Alert");
				_model->insert(map);
            } else {
                qDebug() << "XXXX DeviceListing::update() - not an Immediate Alert device";
            }
        }

        bt_rdev_free_array(remoteDeviceArray);
    }
}
void DeviceListing::discover()
{
	qDebug() << "YYYY DeviceListing::discover()";
	bb::system::SystemToast toast;
    toast.setBody(tr("Searching for Bluetooth LE devices ... please wait until search has completed ..."));
    toast.setPosition(bb::system::SystemUiPosition::MiddleCenter);
    toast.exec();

    bt_disc_start_inquiry(BT_INQUIRY_GIAC);
    qDebug() << "XXXX done scanning";
    bt_disc_cancel_inquiry();

    toast.setBody(tr("Search completed!"));
    toast.exec();

    update();

    bt_remote_device_t *nextRemoteDevice = 0;

    qDebug() << "YYYY DeviceListing::discover() - about to call bt_disc_retrieve_devices(BT_DISCOVERY_ALL, 0)";

    bt_remote_device_t **remoteDeviceArray = bt_disc_retrieve_devices(BT_DISCOVERY_ALL, 0);

    qDebug() << "YYYY DeviceListing::discover() - returned from bt_disc_retrieve_devices(BT_DISCOVERY_ALL, 0)";

    if (remoteDeviceArray) {
        qDebug() << "YYYY DeviceListing::discover() - found devices";

    	for (int i = 0; (nextRemoteDevice = remoteDeviceArray[i]); ++i) {
            QVariantMap map;
            char buffer[128];
            const int bufferSize = sizeof(buffer);

            qDebug() << "YYYY DeviceListing::discover() - checking device";

            if (hasDeviceInformationService(nextRemoteDevice)) {
                qDebug() << "YYYY DeviceListing::discover() - found device information service";
				bt_rdev_get_friendly_name(nextRemoteDevice, buffer, bufferSize);
				map["deviceName"] = QString::fromLatin1(buffer);
                qDebug() << "YYYY DeviceListing::discover() - name=" << QString::fromLatin1(buffer);
				bt_rdev_get_address(nextRemoteDevice, buffer);
				map["deviceAddress"] = QString::fromLatin1(buffer);
				map["deviceClass"] = QString::number(bt_rdev_get_device_class(nextRemoteDevice, BT_COD_DEVICECLASS));
				map["deviceType"] = tr("Bluetooth Devices Nearby");
                qDebug() << "YYYY DeviceListing::discover() - address=" << QString::fromLatin1(buffer);
				_model->insert(map);
            } else {
                qDebug() << "YYYY DeviceListing::discover() - no device information service";
            }
        }
        qDebug() << "YYYY DeviceListing::discover() - freeing buffer";

        bt_rdev_free_array(remoteDeviceArray);
    }
    qDebug() << "YYYY DeviceListing::discover() - returning";
}
void DeviceListing::update()
{
    qDebug() << "YYYY DeviceListing::update() - clearing model";

    _model->clear();

    bt_remote_device_t **remoteDeviceArray;
    bt_remote_device_t *nextRemoteDevice = 0;

    qDebug() << "YYYY DeviceListing::update() - about to call bt_disc_retrieve_devices(BT_DISCOVERY_ALL, 0)";

    remoteDeviceArray = bt_disc_retrieve_devices(BT_DISCOVERY_ALL, 0);

    qDebug() << "YYYY DeviceListing::update() - returned from bt_disc_retrieve_devices(BT_DISCOVERY_ALL, 0)";

    if (remoteDeviceArray) {
        qDebug() << "YYYY DeviceListing::update() - found devices";
        for (int i = 0; (nextRemoteDevice = remoteDeviceArray[i]); ++i) {
            QVariantMap map;
            char buffer[128];
            const int bufferSize = sizeof(buffer);

            qDebug() << "\nYYYY DeviceListing::update() - checking device";

            bt_rdev_get_friendly_name(nextRemoteDevice, buffer, bufferSize);
            map["deviceName"] = QString::fromLatin1(buffer);
            qDebug() << "YYYY DeviceListing::update() - name=" << QString::fromLatin1(buffer);

            if (isAHeartRateMonitor(nextRemoteDevice)) {
                qDebug() << "YYYY DeviceListing::update() - found an HR device";
                bt_rdev_get_address(nextRemoteDevice, buffer);
                map["deviceAddress"] = QString::fromLatin1(buffer);
                map["deviceClass"] = QString::number(bt_rdev_get_device_class(nextRemoteDevice, BT_COD_DEVICECLASS));
                map["deviceType"] = tr("Paired Bluetooth Devices");
                qDebug() << "YYYY DeviceListing::update() - address=" << QString::fromLatin1(buffer);
                _model->insert(map);
            } else {
                qDebug() << "YYYY DeviceListing::update() - not an HR device";
            }
        }
        qDebug() << "YYYY DeviceListing::update() - freeing buffer";
        bt_rdev_free_array(remoteDeviceArray);
    }
    qDebug() << "YYYY DeviceListing::update() - returning";
}
void DeviceListing::discover()
{
	bb::system::SystemToast toast;
    toast.setBody(tr("Searching for Bluetooth devices ... please wait until search completed ..."));
    toast.setPosition(bb::system::SystemUiPosition::MiddleCenter);
    toast.show();

    bt_disc_start_inquiry(BT_INQUIRY_GIAC);
    delay(5);
    bt_disc_cancel_inquiry();

    toast.cancel();
    toast.setBody(tr("Search completed!"));
    toast.exec();

    update();

    bt_remote_device_t *nextRemoteDevice = 0;

    bt_remote_device_t **remoteDeviceArray = bt_disc_retrieve_devices(BT_DISCOVERY_CACHED, 0);
    if (remoteDeviceArray) {
        for (int i = 0; (nextRemoteDevice = remoteDeviceArray[i]); ++i) {
            QVariantMap map;
            char buffer[128];
            const int bufferSize = sizeof(buffer);

            if (isAnImmediateAlertDevice(nextRemoteDevice)) {
				bt_rdev_get_friendly_name(nextRemoteDevice, buffer, bufferSize);
				map["deviceName"] = QString::fromLatin1(buffer);
				bt_rdev_get_address(nextRemoteDevice, buffer);
				map["deviceAddress"] = QString::fromLatin1(buffer);
				map["deviceClass"] = QString::number(bt_rdev_get_device_class(nextRemoteDevice, BT_COD_DEVICECLASS));
				map["deviceType"] = tr("Bluetooth Devices Nearby Capable of Immediate Alert");
				_model->insert(map);
            } else {
                qDebug() << "XXXX DeviceListing::update() - not an Immediate Alert device";
            }
        }

        bt_rdev_free_array(remoteDeviceArray);
    }
}
//! [1]
void RemoteDeviceInfo::update(const QString &deviceAddress)
{
    bt_remote_device_t *remote_device = bt_rdev_get_device(deviceAddress.toAscii());

    if (!remote_device)
        return;

    bool ok = false;
    char buffer[128];
    const int bufferSize = sizeof(buffer);

    const QString unknown = tr("Unknown");
    const QString notAvailable = tr("N/A");

    // Display all known basic device information.
    ok = (bt_rdev_get_friendly_name(remote_device, buffer, bufferSize) == 0);
    m_name = (ok ? QString::fromLatin1(buffer) : unknown);

    m_address = deviceAddress;

    const int deviceClass = bt_rdev_get_device_class(remote_device, BT_COD_DEVICECLASS);
    if (deviceClass >= 0) {
        m_deviceClass.sprintf("0x%x", deviceClass);
    } else {
        m_deviceClass = unknown;
    }

    const int deviceType = bt_rdev_get_type(remote_device);
    m_deviceType = ((deviceType == BT_DEVICE_TYPE_LE_PUBLIC || deviceType == BT_DEVICE_TYPE_LE_PRIVATE) ? tr("Low energy") : tr("Regular"));

    m_encrypted = ((bt_rdev_is_encrypted(remote_device) >= 0) ? tr("true") : tr("false"));

    bool paired = false;
    ok = (bt_rdev_is_paired(remote_device, &paired) == 0);
    m_paired = (ok ? (paired ? tr("true") : tr("false")) : unknown);

    m_trusted = (bt_rdev_is_trusted(remote_device) ? tr("true") : tr("false"));

    int rssi = 0;
    ok = (bt_rdev_get_rssi(remote_device, &rssi) == 0);
    m_rssi = (ok ? QString::number(rssi) : unknown);

    // Display all known low energy parameters.
    uint16_t min_conn_ivl, max_conn_ivl, latency, super_tmo, appearance;
    ok = (bt_rdev_get_le_conn_params(remote_device, &min_conn_ivl, &max_conn_ivl, &latency, &super_tmo) == 0);

    m_minimumConnectionInterval = (ok ? QString::number(min_conn_ivl) : notAvailable);
    m_maximumConnectionInterval = (ok ? QString::number(max_conn_ivl) : notAvailable);
    m_latency = (ok ? QString::number(latency) : notAvailable);
    m_supervisoryTimeout = (ok ? QString::number(super_tmo) : notAvailable);

    uint8_t flags, connectable;
    ok = (bt_rdev_get_le_info(remote_device, &appearance, &flags, &connectable) == 0);

    m_appearance = (ok ? QString::number(appearance) : notAvailable);
    m_flags = (ok ? QString::number(flags) : notAvailable);
    m_connectable = (ok ? QString::number(connectable) : notAvailable);

    // clear model
	m_model->clear();

    // Display any found regular Bluetooth services.
	// get more info here: http://www.bluetooth.org/en-us/specification/assigned-numbers-overview/service-discovery
    char **services_array = bt_rdev_get_services(remote_device);
    if (services_array) {
        for (int i = 0; services_array[i]; i++) {
            QVariantMap map;

            const QString uuid = QString::fromLatin1(services_array[i]);

            map["uuid"] = uuid;
            map["address"] = m_address;

            if (uuid.startsWith("0x0001"))
                map["serviceType"] = tr("SDP");
            else if (uuid.startsWith("0x0003"))
                map["serviceType"] = tr("RFCOMM");
            else if (uuid.startsWith("0x0008"))
                map["serviceType"] = tr("OBEX");
            else if (uuid.startsWith("0x000c"))
                map["serviceType"] = tr("HTTP");
            else if (uuid.startsWith("0x0100"))
                map["serviceType"] = tr("L2CAP");
            else if (uuid.startsWith("0x000f"))
                map["serviceType"] = tr("BNEP");
            else if (uuid.startsWith("0x1000"))
                map["serviceType"] = tr("Service Discovery");
            else if (uuid.startsWith("0x1001"))
                map["serviceType"] = tr("Browse Group Descriptor");
            else if (uuid.startsWith("0x1002"))
                map["serviceType"] = tr("Public Browse Group");
            else if (uuid.startsWith("0x1101"))
                map["serviceType"] = tr("Serial Port");
            else if (uuid.startsWith("0x1102"))
                map["serviceType"] = tr("Public Browse Group");
            else if (uuid.startsWith("0x1105"))
                map["serviceType"] = tr("OBEX Object Push");
            else if (uuid.startsWith("0x1106"))
                map["serviceType"] = tr("OBEX File Transfer");
            else if (uuid.startsWith("0x1115"))
                map["serviceType"] = tr("Personal Area Networking");
            else if (uuid.startsWith("0x1116"))
                map["serviceType"] = tr("Network Access Point");
            else if (uuid.startsWith("0x1117"))
                map["serviceType"] = tr("Group Network");
            else if (uuid.startsWith("0x1124"))
				map["serviceType"] = tr("Human Interface Device (HID)");
            else if (uuid.startsWith("0x1200"))
				map["serviceType"] = tr("Device Identification (DID)");
            else
                map["serviceType"] = tr("Other");

            m_model->insert(map);
        }

        bt_rdev_free_services(services_array);
    }

    // Display any found Bluetooth low energy services.
    if (deviceType == BT_DEVICE_TYPE_LE_PUBLIC || deviceType == BT_DEVICE_TYPE_LE_PRIVATE) {
        services_array = bt_rdev_get_services_gatt(remote_device);
        if (services_array) {
            for (int i = 0; services_array[i]; i++) {
                QVariantMap map;

                map["uuid"] = QString::fromLatin1(services_array[i]);
                map["address"] = m_address;
                map["serviceType"] = tr("GATT");

                m_model->insert(map);
            }

            bt_rdev_free_services(services_array);
        }
    }

    bt_rdev_free(remote_device);

    emit changed();
}
ArduinoBTController::ArduinoBTController(QObject* parent)
    : QObject(parent)
{
    // Initialize the bt device and SPP library APIs.
    int errorCode;

    errorCode = bt_device_init(BTControllerCallbackArduino);
    errorCode = bt_spp_init();

    bt_remote_device_t **remote_device_array;
    bt_remote_device_t *next_remote_device = 0;

    // Retrieve and show all devices.
    remote_device_array = bt_disc_retrieve_devices(BT_DISCOVERY_ALL, 0);
    if (remote_device_array) {
        for (int i = 0; (next_remote_device = remote_device_array[i]); ++i) {
            QVariantMap map;
            char buffer[128];
            const int bufferSize = sizeof(buffer);

            bt_rdev_get_friendly_name(next_remote_device, buffer, bufferSize);
            map["deviceName"] = QString::fromLatin1(buffer);
            bt_rdev_get_addr(next_remote_device, buffer);
            map["deviceAddress"] = QString::fromLatin1(buffer);
            if ( (strcmp(buffer, "00:12:09:12:02:05") == 0) or  (strcmp(buffer, "20:13:06:18:04:04") == 0) ) { //this are my devicesis my device's mac adress
                qDebug() << "Found the BT device";
                int rssi = 0;
                bool ok = false;
                QString m_rssi;
                const QString unknown = tr("Unknown");
                bt_remote_device_t *remote_device = bt_rdev_get_device(buffer);

                ok = (bt_rdev_get_rssi(remote_device, &rssi) == 0);
                m_rssi = (ok ? QString::number(rssi) : unknown);

                const int fd = bt_spp_open(buffer, (char *) SPP_SERVICE_UUID,
                        false);

                if (fd >= 0) {

                    fflush(stdout);
                    if (fd >= 0) {
                        //starting the reciever/thread, I could use this to get data from a sensor
                            m_sppDataThread.init(fd,false);
                            m_sppDataThread.start();

                            //the shield has the bad habit of disconnecting if the app idles to long, so I'm sending a heartbeatsignal
                            m_keepAliveThread.init(fd);
                            m_keepAliveThread.start();

                            if (m_sppDataThread.active()) {
                                char buffer[80] = "HELLO"; //it is nice to say hello!
                                write(m_sppDataThread.getFD(), buffer, strlen(buffer));

                            }

                        }
                    } else {
                        qDebug() << "spp_open fail errno =" << QString::number(errno);
                    }

                }

            map["deviceClass"] = QString::number(
                    bt_rdev_get_device_class(next_remote_device,
                            BT_COD_DEVICECLASS));
            map["deviceType"] = tr("Bluetooth Devices  Paired");
            //  qDebug() << "map" << map;
        }
        bt_rdev_free_array(remote_device_array);
    }

    // Initialize the btdevice and SPP library APIs.
    bt_device_init(BTControllerCallbackArduino);
    bt_spp_init();
}