From d1aa55c3ff1e56ca0d6e74303659b8873da40c64 Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Mon, 11 May 2015 10:58:57 +0200 Subject: [PATCH] [BLE] add addConnectStateChangeListener and removeConnectStateChangeListener methods. [Verification] Code compiles without errors Change-Id: Ia054f9ee90b29939ef9ecfa3ea0c865e56d6f971 Signed-off-by: Lukasz Bardeli --- src/bluetooth/bluetooth_api.js | 40 +++++++++++++++++++++++++--- src/bluetooth/bluetooth_le_device.cc | 35 +++++++++++++++++++++++- src/bluetooth/bluetooth_le_device.h | 1 + 3 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/bluetooth/bluetooth_api.js b/src/bluetooth/bluetooth_api.js index ba97617e..716393f0 100644 --- a/src/bluetooth/bluetooth_api.js +++ b/src/bluetooth/bluetooth_api.js @@ -660,15 +660,38 @@ BluetoothLEDevice.prototype.getService = function() { BluetoothLEDevice.prototype.addConnectStateChangeListener = function() { console.log('Entered BluetoothLEDevice.addConnectStateChangeListener()'); - //TODO validate - //TODO call c++ layer + var args = AV.validateMethod(arguments, [ + { + name: 'listener', + type: AV.Types.LISTENER, + values: ['onconnected', 'ondisconnected'] + } + ]); + + var that = this; + + var func = function(event) { + if (event.address === that.address && args.listener[event.action]) { + args.listener[event.action](that); + } + } + + var watchId = _bleConnectChangeListener.addListener(func); + + return watchId; }; BluetoothLEDevice.prototype.removeConnectStateChangeListener = function() { console.log('Entered BluetoothLEDevice.removeConnectStateChangeListener()'); - //TODO validate - //TODO call c++ layer + var args = AV.validateMethod(arguments, [ + { + name: 'watchID', + type: AV.Types.LONG + } + ]); + + _bleConnectChangeListener.removeListener(args.watchID); }; // class BluetoothDevice //////////////////////////////////////////////////// @@ -1743,6 +1766,15 @@ var _bluetoothGATTCharacteristicListener = _multipleListenerBuilder( 'BluetoothGATTCharacteristic_removeValueChangeListener' ); +var _bleConnectChangeListener = _multipleListenerBuilder( + 'BluetoothLEConnectChangeCallback', + function(listener, event) { + listener(event); + }, + 'BluetoothLEDevice_addConnectStateChangeListener', + 'BluetoothLEDevice_removeConnectStateChangeListener' +); + BluetoothGATTCharacteristic.prototype.addValueChangeListener = function() { console.log('Entered BluetoothGATTCharacteristic.addValueChangeListener()'); diff --git a/src/bluetooth/bluetooth_le_device.cc b/src/bluetooth/bluetooth_le_device.cc index 271a3ceb..0596821b 100644 --- a/src/bluetooth/bluetooth_le_device.cc +++ b/src/bluetooth/bluetooth_le_device.cc @@ -43,11 +43,17 @@ const std::string kServiceUuids = "serviceuuids"; const std::string kManufacturerData = "manufacturerData"; const std::string kId = "id"; const std::string kData = "data"; +const std::string kAction = "action"; + +const std::string kOnConnected = "onconnected"; +const std::string kOnDisconnected = "ondisconnected"; +const std::string kConnectChangeEvent = "BluetoothLEConnectChangeCallback"; } BluetoothLEDevice::BluetoothLEDevice(BluetoothInstance& instance) - : instance_(instance) { + : instance_(instance), + is_listener_set_(false) { int ret = bt_gatt_set_connection_state_changed_cb(GattConnectionState, this); if (BT_ERROR_NONE != ret && BT_ERROR_ALREADY_DONE != ret) { LoggerE("Can't add connection state listener: %d", ret); @@ -339,11 +345,19 @@ void BluetoothLEDevice::GetService(const picojson::value& data, void BluetoothLEDevice::AddConnectStateChangeListener( const picojson::value& data, picojson::object& out) { LoggerD("Entered"); + + is_listener_set_ = true; + + ReportSuccess(out); } void BluetoothLEDevice::RemoveConnectStateChangeListener( const picojson::value& data, picojson::object& out) { LoggerD("Entered"); + + is_listener_set_ = false; + + ReportSuccess(out); } void BluetoothLEDevice::GattConnectionState(int result, bool connected, @@ -357,6 +371,25 @@ void BluetoothLEDevice::GattConnectionState(int result, bool connected, return; } + if (le_device->is_listener_set_) { + + picojson::value value = picojson::value(picojson::object()); + picojson::object* data_obj = &value.get(); + if (connected) { + LoggerD("OnConnected"); + data_obj->insert(std::make_pair(kAction, picojson::value(kOnConnected))); + } else { + LoggerD("OnDisconnected"); + data_obj->insert( + std::make_pair(kAction, picojson::value(kOnDisconnected))); + } + + data_obj->insert( + std::make_pair(kDeviceAddress, picojson::value(remote_address))); + + le_device->instance_.FireEvent(kConnectChangeEvent, value); + } + auto it = le_device->connecting_.find(remote_address); if (le_device->connecting_.end() == it) { LoggerW("Given address is not in waiting connections list"); diff --git a/src/bluetooth/bluetooth_le_device.h b/src/bluetooth/bluetooth_le_device.h index b8100842..2a1a8ac6 100644 --- a/src/bluetooth/bluetooth_le_device.h +++ b/src/bluetooth/bluetooth_le_device.h @@ -54,6 +54,7 @@ class BluetoothLEDevice { BluetoothInstance& instance_; std::unordered_map connecting_; + bool is_listener_set_; }; } // namespace bluetooth -- 2.34.1