margin-bottom: 100px;
}
/* Bluetooth */
+#bluetooth_devices {
+ display: none;
+}
.device-paired .device-status {
color: green;
}
</ul>
<div id="bluetooth_devices">
<div><p>Available Devices</p></div>
- <ul data-role="listview" id="listview_bluetooth_paired" data-inset="true" class="device-list ui-listview"></ul>
- <ul data-role="listview" id="listview_bluetooth_available" data-inset="true" class="device-list ui-listview"></ul>
+ <ul data-role="listview" id="listview_device_paired" data-inset="true" class="device-list ui-listview"></ul>
+ <ul data-role="listview" id="listview_device_available" data-inset="true" class="device-list ui-listview"></ul>
<div data-role="button" id="button_bluetooth_scan">Scan</div>
</div>
</div>
/* Module */
settings.bluetooth = (function() {
- var default_adapter = null;
-
+ var default_adapter = null;
+
/* Adapter class */
var BluetoothAdapter = function(adapter) {
this.bt_adapter = adapter;
if (powered) {
// Power on
this.bt_adapter.setPowered(true, function() {
- self.powered = self.bt_adapter.powered;
+ self.powered = self.bt_adapter.powered;
success_cb();
- }, function (e) {
- self.powered = self.bt_adapter.powered;
+ }, function(e) {
+ self.powered = self.bt_adapter.powered;
error_cb(e);
});
} else {
// Power off
this.bt_adapter.setPowered(false, function() {
- self.powered = self.bt_adapter.powered;
+ self.powered = self.bt_adapter.powered;
success_cb();
- }, function (e) {
- self.powered = self.bt_adapter.powered;
+ }, function(e) {
+ self.powered = self.bt_adapter.powered;
error_cb(e);
});
}
}
function subscribeEvents(event_callback) {
- wsAPI.subscribeEvents(event_callback);
+ wsAPI.subscribeEvents(event_callback);
}
-
+
function unsubscribeEvents(event_callback) {
- wsAPI.unsubscribeEvents(event_callback);
+ wsAPI.unsubscribeEvents(event_callback);
}
function getDefaultAdapter() {
try {
- if (tizen.bluetooth.getDefaultAdapter() == null)
- return null;
- else if (default_adapter == null) {
- default_adapter = new BluetoothAdapter(tizen.bluetooth.getDefaultAdapter());
- }
- return default_adapter;
+ if (tizen.bluetooth.getDefaultAdapter() == null) {
+ return null;
+ } else if (default_adapter == null) {
+ default_adapter = new BluetoothAdapter(tizen.bluetooth.getDefaultAdapter());
+ }
+ return default_adapter;
} catch (e) {
console.error('Tizen web api missing');
return null;
function connected() {
console.log('Settings daemon connected');
+ }
+
+ function disconnected(e) {
+ console.log('Settings daemon disconnected...');
+ showMsg('Error', e);
+ }
+
+ function init() {
+ console.log('Settings init...');
+ $('#quit').on('click', function() {
+ console.log('Settings exiting...');
+ tizen.application.getCurrentApplication().exit();
+ });
+
+ wsAPI.connect('ws://localhost:16000/', 'http-only', connected, disconnected);
try {
/* Settings Panel */
/* Different sub panels */
bluetoothPanelInit();
} catch (e) {
- showMsg('Error', 'Javascript Exception Caught');
- console.log('Error - javascript exception caught: ' + e);
+ showMsg('Error', 'Javascript Exception Caught: ' + e);
}
}
- function disconnected() {
- console.log('Settings daemon disconnected');
- }
-
- function init() {
- console.log('init() called');
- $('#quit').on('click', function() {
- console.log('exiting...');
- tizen.application.getCurrentApplication().exit();
- });
-
- wsAPI.connect('ws://localhost:16000/settings', 'http-only', connected, disconnected);
- }
-
$(document).ready(function() {
init();
})
function bluetoothPanelInit() {
- settings.bluetooth.subscribeEvents(bluetoothEventReceived);
+ settings.bluetooth.subscribeEvents(bluetoothEventReceived);
/* Bluetooth Settings Panel */
$('#page_bluetooth').on('pageshow', function(event, data) {
var adapter = settings.bluetooth.getDefaultAdapter();
if (adapter === null) {
- showMsg('Error', 'Bluetooth adapter not found');
- return;
+ showMsg('Error', 'Bluetooth adapter not found');
+ return;
}
console.log('Default BT adapter: ', adapter.name);
var bt_switch = $(this);
var adapter = settings.bluetooth.getDefaultAdapter();
if (adapter === null) {
- showMsg('Error', 'Bluetooth adapter not found');
+ showMsg('Error', 'Bluetooth adapter not found');
bluetoothToggleOff();
return;
}
$('#button_bluetooth_scan').on('click', function() {
var adapter = settings.bluetooth.getDefaultAdapter();
if (adapter === null) {
- showMsg('Error', 'Bluetooth adapter not found');
- return;
+ showMsg('Error', 'Bluetooth adapter not found');
+ return;
}
if ($('#button_bluetooth_scan').text() === 'Scan') {
bluetoothStartScan(adapter);
}
function bluetoothEventReceived(event) {
- if (event.type !== WS_EVENT_TYPE.BLUETOOTH) return;
- console.log('Bluetooth event received: [' + event.name + ', ' + event.value + ']');
+ if (event.type !== WS_EVENT_TYPE.BLUETOOTH) return;
+ console.log('Bluetooth event received: [' + event.name + ', ' + event.value + ']');
}
function bluetoothClearAvailableList() {
- $('#listview_bluetooth_available').html('');
+ $('#listview_device_available').html('');
}
function bluetoothStartScan(adapter) {
}
}, function(e) {
/* error */
- showMsg('Error', 'Cannot scan: ' + e);
+ showMsg('Error', 'Cannot scan: ' + e);
});
}
function bluetoothRefreshList() {
- $('#listview_bluetooth_paired').listview('refresh');
- $('#listview_bluetooth_available').listview('refresh');
+ $('#listview_device_paired').listview('refresh');
+ $('#listview_device_available').listview('refresh');
}
function bluetoothStopScan(adapter) {
function bluetoothAppendToPairedList(device) {
console.log('Append to paired list - ' + device.address);
- if ($('#listview_bluetooth_paired').find(jqId(device.address)).length != 0) return;
+ if ($('#listview_device_paired').find(jqId(device.address)).length != 0) return;
- var parent = '#listview_bluetooth_paired';
+ var parent = '#listview_device_paired';
bluetoothConstructDeviceElement(parent, device);
bluetoothUpdateDeviceButton(device);
bluetoothRefreshList();
}
function bluetoothRemoveFromPairedList(device_addr) {
- var removeThis = $('#listview_bluetooth_paired li').filter(function() {
+ var removeThis = $('#listview_device_paired li').filter(function() {
return $(this).find(jqId(device_addr)).length === 1;
});
function bluetoothAppendToAvailableList(device) {
console.log('Append to available list - ' + device.address);
- if ($('#listview_bluetooth_available').find(jqId(device.address)).length != 0) return;
+ if ($('#listview_device_available').find(jqId(device.address)).length != 0) return;
- var parent = '#listview_bluetooth_available';
+ var parent = '#listview_device_available';
bluetoothConstructDeviceElement(parent, device);
bluetoothUpdateDeviceButton(device);
bluetoothRefreshList();
}
function bluetoothRemoveFromAvailableList(device_addr) {
- var removeThis = $('#listview_bluetooth_available li').filter(function() {
+ var removeThis = $('#listview_device_available li').filter(function() {
return $(this).find(jqId(device_addr)).length === 1;
});
}
function bluetoothConstructDeviceElement(parent, device) {
- var html = '<li data-icon="false"><a href="#" id="' + device.address + '">' +
- '<img src="images/bluetooth.png" class="device-icon ui-li-icon"></div>' +
- '<div class="device-name">' + device.name + '</div>' +
- '<div class="device-address">' + device.address + '</div>' +
- '<div class="device-status"></div>' +
- '<div data-role="button" class="device-action-button ui-li-aside" data-inline="true"></div>' +
- '</a></li>';
+ var html = '<li data-icon="false"><a href="#" id="' + jqId(device.address).replace('#', '') + '">';
+ html += '<img src="images/bluetooth.png" class="device-icon ui-li-icon"></img>';
+ html += '<div class="device-name">' + device.name + '</div>';
+ html += '<div class="device-address">' + device.address + '</div>';
+ html += '<div class="device-status"></div>';
+ html += '<div data-role="button" class="device-action-button ui-li-aside" data-inline="true"></div>';
+ html += '</a></li>';
$(parent).append(html).trigger('create');
/* store device object in the element so we can reference it later */
$(jqId(device.address)).data('device-object', device);
+ console.log('Storing device object: ' + jqId(device.address));
$(jqId(device.address)).on('click', function() {
localStorage.setItem('bluetooth_device_id', device.address);
$(jqId(device.address)).find('div.device-action-button').on('click', function(e) {
var parent = $(this).parent().attr('id');
+ console.log('device action button clicked');
- /* prevent the click event to propagate up to trigger the device info button click */
+ /*
+ * prevent the click event to propagate up
+ */
e.stopImmediatePropagation();
e.preventDefault();
var adapter = settings.bluetooth.getDefaultAdapter();
if (adapter === null) return;
+
/* retrieve the device object from element */
var device = $(jqId(parent)).data('device-object');
if (device == undefined) {
}
if (!device.paired) {
- createPopupDialog(false, false, 'Pair with ' + device.name, 'Blueotooth address: ' + device.address, 'Pair', 'Cancel', function() {
+ createPopupDialog(false, false, 'Pair with', device.name, 'Pair', 'Cancel', function() {
console.log('Bluetooth pair with device: ' + device.address);
showSpinner(false, 'Pairing...');
adapter.pairDevice(device.address, function() {
hideSpinner();
device.paired = true;
- /* changing from unpaired to paired, move to the paired list by reconstructing */
+ /* changing from unpaired to paried */
bluetoothUpdateDevice(device);
}, function(e) {
/* error */
if (device.connected) status_connected = 'Yes';
$('#page_bluetooth_detail_content').html('');
- var html = '<ul data-role="listview" id="listview_bluetooth_detail" data-inset="true" ' +
- 'class="device-list ui-listview" data-theme="c">' +
- '<li id="bluetooth_detail_name"><h2>Device Name: ' + device.name + '</h2></li>' +
- '<li id="bluetooth_detail_address"><h2>Device Address: ' + device.address + '</h2></li>' +
- '<li id="bluetooth_detail_paired"><h2>Paired: ' + status_paired + '</h2></li>' +
- '<li id="bluetooth_detail_connected"><h2>Connected: ' + status_connected + '</h2></li></ul>';
+ var html = '<ul data-role="listview" id="listview_bluetooth_detail" data-inset="true" ' + 'class="device-list ui-listview">';
+ html += '<li id="bluetooth_detail_name"><h2>Device Name: ' + device.name + '</h2></li>';
+ html += '<li id="bluetooth_detail_address"><h2>Device Address: ' + device.address + '</h2></li>';
+ html += '<li id="bluetooth_detail_paired"><h2>Paired: ' + status_paired + '</h2></li>';
+ html += '<li id="bluetooth_detail_connected"><h2>Connected: ' + status_connected + '</h2></li>';
+ html += '</ul>';
$('#page_bluetooth_detail_content').append(html).trigger('create');
if (device.paired) {
var adapter = settings.bluetooth.getDefaultAdapter();
if (adapter === null) return;
- createPopupDialog(false, false, 'Unpair with ' + device.name, 'Blueotooth address: ' + device.address, 'Unpair', 'Cancel', function() {
- showSpinner(false, 'Unpairing...');
- adapter.unpairDevice(device.address, function() {
+ createPopupDialog(false, false, 'Unpair with device', device.name, 'Unpair', 'Cancel', function() {
+ showSpinner(false, 'Unpairing...');
+ adapter.unpairDevice(device.address, function() {
/* success */
hideSpinner();
device.paired = false;
showMsg('Error', 'Bluetooth unpair failed: ' + e);
/* Something is wrong, remove from paired list */
- bluetoothRemoveFromPairedList(device);
+ bluetoothRemoveFromPairedList(device.address);
});
});
});
function jqId(id) {
if (id == undefined) return null;
- return '#' + id.replace(/(:|\.)/g, '\\$1');
+
+ /* replace colons and spaces with dash for jquery ids */
+ return '#' + id.replace(/:| /g, '-');
}
function showMsg(title, message) {
- if (title == 'Error') {
- console.error(message);
- }
- else {
- console.log(message);
- }
+ if (title == 'Error') {
+ console.error(message);
+ } else {
+ console.log(message);
+ }
createPopupDialog(true, false, title, message);
}
function showInputDialog(title, input_message, ok_button_text, cancel_button_text, ok_callback) {
- createPopupDialog(false, true, title, input_message, ok_button_text, cancel_button_text, ok_callback);
+ createPopupDialog(false, true, title, input_message, ok_button_text, cancel_button_text, ok_callback);
}
function createPopupDialog(dismiss, is_input, title, message, ok_button_text, cancel_button_text, ok_callback) {
}).appendTo($dialog);
if (is_input) {
-
+
} else {
- $('<p/>', {
- text: message
- }).appendTo($dialog);
+ $('<p/>', {
+ text: message
+ }).appendTo($dialog);
}
$('<a>', {
}).on('click', function() {
$dialog.popup('close');
if (ok_callback) {
- if (is_input) {
- /* TODO implement getting input from field */
- ok_callback();
-
- } else {
- ok_callback();
- }
+ if (is_input) {
+ /* TODO implement getting input from field */
+ ok_callback();
+
+ } else {
+ ok_callback();
+ }
}
}).appendTo($dialog);
var dummyBackend = true;
var WS_REQUEST_TYPE = {
- WIFI : 0,
- BLUETOOTH : 1,
- DISPLAY : 2,
- SOUND: 3,
- DATETIME: 4,
- LOCALE: 5
- };
+ WIFI: 0,
+ BLUETOOTH: 1,
+ DISPLAY: 2,
+ SOUND: 3,
+ DATETIME: 4,
+ LOCALE: 5
+};
var WS_EVENT_TYPE = {
- WIFI : 0,
- BLUETOOTH : 1,
- DISPLAY : 2,
- SOUND: 3,
- DATETIME: 4,
- LOCALE: 5
- };
+ WIFI: 0,
+ BLUETOOTH: 1,
+ DISPLAY: 2,
+ SOUND: 3,
+ DATETIME: 4,
+ LOCALE: 5
+};
/* web socket module to connect to the settings daemon */
var wsAPI = (function() {
/* number of connection retries to attempt if the socket closes */
var self = this;
this.connected = false;
- this.event_callbacks = $.Callbacks();
+ this.event_callbacks = $.Callbacks();
/* default values for WebSocket */
- this.socketUrl = 'ws://localhost:16000/settings';
+ this.socketUrl = 'ws://localhost:16000/';
this.socketProtocol = 'http-only';
this.methodIdx = 0;
me.done = true;
}
}
-
+
this.EventObject = function(type, name, value) {
- var me = this;
- this.type = type;
- this.name = name;
- this.value = value;
+ var me = this;
+ this.type = type;
+ this.name = name;
+ this.value = value;
}
function connect(url, protocol, sucess_cb, error_cb) {
} else {
self.socket = new WebSocket(self);
}
+ console.log('Connecting to websocket: ' + self.socketUrl);
self.socket.onopen = function() {
self.connected = true;
- console.log('socket opened');
+ console.log('websocket opened');
self.successCB();
};
self.socket.onclose = function() {
self.connected = false;
- console.log('socket closed');
+ console.log('websocket closed');
if (dummyBackend) {
- /* fake the connection for now */
+ /* fake the connection for dummy backend */
self.connected = true;
self.successCB();
+ return;
}
+
+ self.errorCB('Disconnected from settings daemon');
};
self.socket.onerror = function(e) {
- console.log('socket error: ', e.data);
- self.errorCB();
+ console.log('web socket error: ', e.data);
+
+ if (dummyBackend) {
+ /* ignore websocket error */
+ return;
+ }
+
+ if (e.data) {
+ self.errorCB('websocket error: ' + e.data);
+ } else {
+ self.errorCB('websocket error: unknown');
+ }
};
self.socket.onmessage = function(e) {
function send(msg, success_cb, error_cb) {
if (!this.connected) {
if (errorCB !== undefined) {
- errorCB('\"' + obj.name + '\" method failed because socket is closed');
+ errorCB('Settings daemon is not connected');
}
return;
}
this.methodIdx = (this.methodIdx + 1) % 100;
this.methodCalls[i] = new this.MethodCall(msg.transactionid, msg.name, success_cb, error_cb);
this.methodCalls[i].start();
- console.log('methodCalls[', i, '].start()');
+
+ var jsonMsg = JSON.stringify(msg);
+ console.log('Sending json msg: ' + jsonMsg);
if (dummyBackend) {
/* fake with dummy data */
dummyBackendSend(msg);
} else {
- this.socket.send(JSON.stringify(msg));
+ this.socket.send(jsonMsg);
}
}
function fireEvent(type, name, value) {
- var event = new this.EventObject(type, name, value);
- console.log('Fire event: [' + type + ', ' + name + ', ' + value + ']');
- event_callbacks.fire(event);
+ var event = new this.EventObject(type, name, value);
+ console.log('Fire event: [' + type + ', ' + name + ', ' + value + ']');
+ event_callbacks.fire(event);
}
function receive(msg) {
var self = this;
var event;
try {
+ console.log("Received json msg: " + msg);
event = JSON.parse(msg);
} catch (e) {
self.iErrorCB('GARBAGE MESSAGE: ' + msg);
var call = calls[i];
if (call && (!call.done) && (call.transactionid === event.transactionid)) {
call.finish();
- console.log('methodCalls[', i, '].finish()');
if (event.error !== undefined) {
call.errorCB(event.error);
}
return;
}
}
- }
- else if (event.type === 'event') {
- self.fireSevent(event.name, event.data);
+ } else if (event.type === 'event') {
+ self.fireSevent(event.name, event.data);
}
}
}
'data': request_args
};
- console.log('wsAPI.sendRequest(): ', request_type);
- console.log('request name: ', request_name);
- console.log('request args: ', request_args);
send(msg, success_cb, error_cb);
}
-
+
function subscribeEvents(callback) {
- event_callbacks.add(callback);
+ event_callbacks.add(callback);
}
-
+
function unsubscribeEvents(callback) {
- event_callbacks.remove(callback);
+ event_callbacks.remove(callback);
}
/* this is dummy data for testing purposes */
if (dummyBackend) {
console.log('Sending to dummy server');
- var calls = this.methodCalls;
- var replyMsg = null;
-
- for (var i = 0; i < calls.length; i++) {
- var call = calls[i];
- if (call && (!call.done) && (call.transactionid === msg.transactionid)) {
- call.finish();
- console.log('methodCalls[', i, '].finish()');
- if (msg.error !== undefined) {
- call.errorCB(msg.error);
- }
- if (msg.data !== undefined && call.successCB && call.errorCB !== undefined) {
- console.log('Send request to dummy backend: type - ', msg.type);
- console.log('Send request to dummy backend: name - ', msg.name);
- console.log('Send request to dummy backend: args - ', msg.data);
- switch(msg.type)
- {
- case WS_REQUEST_TYPE.BLUETOOTH:
- if (msg.name === 'enable') {
- fireEvent(WS_EVENT_TYPE.BLUETOOTH, 'enabled', true);
- } else if (msg.name === 'disable') {
- fireEvent(WS_EVENT_TYPE.BLUETOOTH, 'enabled', false);
- }
- else {
- call.errorCB('Unsupported request name: ' + msg.name);
- return;
- }
- break;
- case WS_REQUEST_TYPE.WIFI:
- case WS_REQUEST_TYPE.DISPLAY:
- case WS_REQUEST_TYPE.SOUND:
- case WS_REQUEST_TYPE.DATETIME:
- case WS_REQUEST_TYPE.LOCALE:
- call.errorCB('Request not implemented');
- return;
- default:
- call.errorCB('Invalid request type: ' + msg.type);
- return;
- }
- call.successCB(replyMsg);
- }
- return;
- }
+ var calls = this.methodCalls;
+ var replyMsg = null;
+
+ for (var i = 0; i < calls.length; i++) {
+ var call = calls[i];
+ if (call && (!call.done) && (call.transactionid === msg.transactionid)) {
+ call.finish();
+ if (msg.error !== undefined) {
+ call.errorCB(msg.error);
+ }
+ if (msg.data !== undefined && call.successCB && call.errorCB !== undefined) {
+ var replyDelay = 0;
+
+ switch (msg.type) {
+ case WS_REQUEST_TYPE.WIFI:
+ case WS_REQUEST_TYPE.BLUETOOTH:
+ if (msg.name === 'enable') {
+ fireEvent(WS_EVENT_TYPE.BLUETOOTH, 'enabled', true);
+ } else if (msg.name === 'disable') {
+ fireEvent(WS_EVENT_TYPE.BLUETOOTH, 'enabled', false);
+ } else {
+ call.errorCB('Unsupported request name: ' + msg.name);
+ return;
+ }
+ break;
+ case WS_REQUEST_TYPE.WIFI:
+ case WS_REQUEST_TYPE.DISPLAY:
+ case WS_REQUEST_TYPE.SOUND:
+ case WS_REQUEST_TYPE.DATETIME:
+ case WS_REQUEST_TYPE.LOCALE:
+ call.errorCB('Request not implemented');
+ return;
+ default:
+ call.errorCB('Invalid request type: ' + msg.type);
+ return;
+ }
+ setTimeout(function() {
+ call.successCB(replyMsg);
+ }, replyDelay);
+ }
+ return;
+ }
}
}
}