@@ -60,6 +60,7 @@ smp_bluetooth::smp_bluetooth(QObject *parent)
6060 QObject::connect (bluetooth_window, SIGNAL (refresh_devices ()), this , SLOT (form_refresh_devices ()));
6161 QObject::connect (bluetooth_window, SIGNAL (connect_to_device (uint16_t )), this , SLOT (form_connect_to_device (uint16_t )));
6262 QObject::connect (bluetooth_window, SIGNAL (disconnect_from_device ()), this , SLOT (form_disconnect_from_device ()));
63+ QObject::connect (bluetooth_window, SIGNAL (bluetooth_status (bool *,bool *)), this , SLOT (form_bluetooth_status (bool *,bool *)));
6364
6465 discoveryAgent = new QBluetoothDeviceDiscoveryAgent ();
6566 discoveryAgent->setLowEnergyDiscoveryTimeout (8000 );
@@ -132,6 +133,7 @@ void smp_bluetooth::deviceUpdated(const QBluetoothDeviceInfo &info, QBluetoothDe
132133void smp_bluetooth::finished ()
133134{
134135 bluetooth_window->add_debug (" Discovery finished" );
136+ bluetooth_window->discovery_state (false );
135137}
136138
137139void smp_bluetooth::connected ()
@@ -174,6 +176,8 @@ void smp_bluetooth::disconnected()
174176
175177 controller = nullptr ;
176178 }
179+
180+ bluetooth_window->connection_state (false );
177181}
178182
179183void smp_bluetooth::discovery_finished ()
@@ -299,7 +303,81 @@ void smp_bluetooth::mcumgr_service_state_changed(QLowEnergyService::ServiceState
299303
300304void smp_bluetooth::errorz (QLowEnergyController::Error error)
301305{
302- bluetooth_window->add_debug (QString::number (error));
306+ bool disconnect_from_device = false ;
307+ QString err;
308+ switch (error) {
309+ case QLowEnergyController::NoError:
310+ {
311+ err = " No error" ;
312+ break ;
313+ }
314+ case QLowEnergyController::UnknownError:
315+ {
316+ disconnect_from_device = true ;
317+ err = " Unknown error" ;
318+ break ;
319+ }
320+ case QLowEnergyController::UnknownRemoteDeviceError:
321+ {
322+ disconnect_from_device = true ;
323+ err = " Unknown remote device" ;
324+ break ;
325+ }
326+ case QLowEnergyController::NetworkError:
327+ {
328+ disconnect_from_device = true ;
329+ err = " Network error" ;
330+ break ;
331+ }
332+ case QLowEnergyController::InvalidBluetoothAdapterError:
333+ {
334+ disconnect_from_device = true ;
335+ err = " Invalud bluetooth adapter" ;
336+ break ;
337+ }
338+ case QLowEnergyController::ConnectionError:
339+ {
340+ disconnect_from_device = true ;
341+ err = " Connection error" ;
342+ break ;
343+ }
344+ case QLowEnergyController::AdvertisingError:
345+ {
346+ err = " Advertising error" ;
347+ break ;
348+ }
349+ case QLowEnergyController::RemoteHostClosedError:
350+ {
351+ disconnect_from_device = true ;
352+ err = " Remote host closed" ;
353+ break ;
354+ }
355+ case QLowEnergyController::AuthorizationError:
356+ {
357+ err = " Authorisation error" ;
358+ break ;
359+ }
360+ default :
361+ {
362+ err = " Other" ;
363+ break ;
364+ }
365+ };
366+ // bluetooth_window->add_debug(QString::number(error));
367+ bluetooth_window->add_debug (err);
368+
369+ if (disconnect_from_device == true )
370+ {
371+ if (device_connected == true )
372+ {
373+ disconnect (true );
374+ }
375+ else
376+ {
377+ bluetooth_window->discovery_state (false );
378+ bluetooth_window->connection_state (false );
379+ }
380+ }
303381}
304382
305383int smp_bluetooth::is_connected ()
@@ -320,6 +398,11 @@ void smp_bluetooth::connection_updated(QLowEnergyConnectionParameters parameters
320398
321399int smp_bluetooth::send (smp_message *message)
322400{
401+ if (device_connected == false )
402+ {
403+ return -1 ;
404+ }
405+
323406 retry_count = 0 ;
324407 sendbuffer.clear ();
325408
@@ -375,6 +458,11 @@ void smp_bluetooth::mcumgr_service_error(QLowEnergyService::ServiceError error)
375458
376459void smp_bluetooth::form_refresh_devices ()
377460{
461+ if (device_connected == true )
462+ {
463+ return ;
464+ }
465+
378466 bluetooth_window->clear_devices ();
379467 bluetooth_device_list.clear ();
380468
@@ -384,10 +472,16 @@ void smp_bluetooth::form_refresh_devices()
384472 }
385473
386474 discoveryAgent->start ();
475+ bluetooth_window->discovery_state (true );
387476}
388477
389478void smp_bluetooth::form_connect_to_device (uint16_t index)
390479{
480+ if (discoveryAgent->isActive ())
481+ {
482+ discoveryAgent->stop ();
483+ }
484+
391485 if (controller)
392486 {
393487 QObject::disconnect (controller, SIGNAL (connected ()), this , SLOT (connected ()));
@@ -421,18 +515,30 @@ void smp_bluetooth::form_connect_to_device(uint16_t index)
421515 // controller->setRemoteAddressType(QLowEnergyController::PublicAddress);
422516 // }
423517 controller->connectToDevice ();
518+
519+ bluetooth_window->connection_state (true );
424520}
425521
426522void smp_bluetooth::form_disconnect_from_device ()
427523{
428- controller->disconnectFromDevice ();
524+ if (device_connected == true )
525+ {
526+ controller->disconnectFromDevice ();
527+ }
429528}
430529
431-
432530int smp_bluetooth::connect ()
433531{
434532 bluetooth_window->show ();
435- discoveryAgent->start ();
533+
534+ if (device_connected == false )
535+ {
536+ bluetooth_window->clear_devices ();
537+ bluetooth_device_list.clear ();
538+ discoveryAgent->start ();
539+ bluetooth_window->discovery_state (true );
540+ }
541+
436542 return 0 ;
437543}
438544
@@ -442,6 +548,10 @@ int smp_bluetooth::disconnect(bool force)
442548 {
443549 controller->disconnectFromDevice ();
444550 }
551+ else
552+ {
553+ bluetooth_window->connection_state (false );
554+ }
445555
446556 return 0 ;
447557}
@@ -473,3 +583,9 @@ void smp_bluetooth::close_connect_dialog()
473583 bluetooth_window->close ();
474584 }
475585}
586+
587+ void smp_bluetooth::form_bluetooth_status (bool *scanning, bool *connecting)
588+ {
589+ *scanning = discoveryAgent->isActive ();
590+ *connecting = device_connected;
591+ }
0 commit comments