Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
158 lines
5.3 KiB
JavaScript
Executable file
158 lines
5.3 KiB
JavaScript
Executable file
/**
|
|
* BluetoothDevice:
|
|
* - BluetoothDevice is an Observable that wraps the platform
|
|
* BluetoothDevice object.
|
|
* - It has some observable properties: name, paired, cod
|
|
* BluetoothDevice only update device information and does not involve in any
|
|
* UI logic.
|
|
*
|
|
* @module BluetoothDevice
|
|
*/
|
|
define(function(require) {
|
|
'use strict';
|
|
|
|
var BtClassOfDeviceMapper = require('modules/bluetooth/bluetooth_cod_mapper');
|
|
var Observable = require('modules/mvvm/observable');
|
|
|
|
var _debug = false;
|
|
var debug = function() {};
|
|
if (_debug) {
|
|
debug = function btd_debug(msg) {
|
|
console.log('--> [BluetoothDevice]: ' + msg);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Provide a function to update connection info.
|
|
*
|
|
* @access public
|
|
* @memberOf BluetoothDevice
|
|
* @param {Object} options
|
|
* @param {Boolean} options.connectionStatus - is connected or not
|
|
* @param {Object} options.profiles - profiles of the connection type
|
|
*/
|
|
var updateConnectionInfo = function(options) {
|
|
debug('updateConnectionInfo(): this.address = ' + this.address +
|
|
', this.name = ' + this.name +
|
|
', options = ' + JSON.stringify(options));
|
|
if (options.connectionStatus) {
|
|
this.connectionStatus = options.connectionStatus;
|
|
}
|
|
|
|
if (options.profiles) {
|
|
this.profiles = Object.create(options.profiles);
|
|
}
|
|
|
|
debug('updateConnectionInfo(): this.connectionStatus = ' +
|
|
this.connectionStatus + ', this.profiles = ' +
|
|
JSON.stringify(this.profiles));
|
|
};
|
|
|
|
/**
|
|
* Provide a function to update description text.
|
|
*
|
|
* @access public
|
|
* @memberOf BluetoothDevice
|
|
*/
|
|
var updateDescriptionText = function() {
|
|
debug('updateDescriptionText():');
|
|
// Define description for found device.
|
|
if (this.paired === false) {
|
|
this.descriptionText = 'tapToConnect';
|
|
} else if (this.paired === 'pairing') {
|
|
this.descriptionText = 'pairing';
|
|
} else if (this.paired === true) {
|
|
this.descriptionText = 'paired';
|
|
// Define description for paired device.
|
|
if (this.connectionStatus === 'connecting') {
|
|
this.descriptionText = 'connecting';
|
|
} else if (this.connectionStatus === 'connected') {
|
|
if (this.profiles) {
|
|
var hfpConnected = this.profiles.hfp;
|
|
var a2dpConnected = this.profiles.a2dp;
|
|
if (hfpConnected && a2dpConnected) {
|
|
this.descriptionText = 'connectedWithDeviceMedia';
|
|
} else if (hfpConnected) {
|
|
this.descriptionText = 'connectedWithDevice';
|
|
} else if (a2dpConnected) {
|
|
this.descriptionText = 'connectedWithMedia';
|
|
} else {
|
|
this.descriptionText = 'connectedWithNoProfileInfo';
|
|
}
|
|
} else {
|
|
this.descriptionText = 'connectedWithNoProfileInfo';
|
|
}
|
|
} else if (this.connectionStatus === 'disconnected') {
|
|
this.descriptionText = 'disconnected';
|
|
}
|
|
}
|
|
debug('updateDescriptionText(): this.descriptionText = ' +
|
|
this.descriptionText);
|
|
};
|
|
|
|
/**
|
|
* @class BluetoothDevice
|
|
* @requires module:modules/mvvm/observable
|
|
* @param {BluetoothDevice} device
|
|
* @return {Observable} observableBluetoothDevice
|
|
*/
|
|
return function ctor_bluetooth_device(device) {
|
|
var type = BtClassOfDeviceMapper.getDeviceType(device.cod);
|
|
var connectionStatus = device.connectionStatus || 'disconnected';
|
|
var observableBluetoothDevice = Observable({
|
|
name: device.name,
|
|
paired: device.paired,
|
|
address: device.address,
|
|
type: type,
|
|
connectionStatus: connectionStatus,
|
|
profiles: null,
|
|
descriptionText: '',
|
|
get data() {return device;},
|
|
updateConnectionInfo: updateConnectionInfo,
|
|
updateDescriptionText: updateDescriptionText
|
|
});
|
|
|
|
/**
|
|
* Observe 'paired', 'connectionStatus', and 'profiles' properties changed
|
|
* event in init function. Once these properties changed, we can update
|
|
* corrected description for the device.
|
|
*/
|
|
observableBluetoothDevice._init = function btd__init() {
|
|
this.observe('paired', this.updateDescriptionText.bind(this));
|
|
this.observe('connectionStatus', this.updateDescriptionText.bind(this));
|
|
this.observe('profiles', this.updateDescriptionText.bind(this));
|
|
};
|
|
|
|
/**
|
|
* watch 'onattributechanged' event
|
|
* A function to receive device which is just found via discovery handler.
|
|
* And set a function to handle 'onattributechanged' event.
|
|
*/
|
|
device.onattributechanged = function btd_onDeviceAttributeChanged(evt) {
|
|
for (var i in evt.attrs) {
|
|
debug('onDeviceAttributeChanged(): ' + evt.attrs[i]);
|
|
switch (evt.attrs[i]) {
|
|
case 'name':
|
|
observableBluetoothDevice.name = device.name;
|
|
break;
|
|
case 'paired':
|
|
debug('onDeviceAttributeChanged(): ' +
|
|
'device.paired = ' + device.paired);
|
|
observableBluetoothDevice.paired = device.paired;
|
|
break;
|
|
case 'cod':
|
|
debug('onDeviceAttributeChanged(): ' +
|
|
'device.cod = ' + device.cod);
|
|
observableBluetoothDevice.type =
|
|
BtClassOfDeviceMapper.getDeviceType(device.cod);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
observableBluetoothDevice._init();
|
|
return observableBluetoothDevice;
|
|
};
|
|
});
|