// (c) 2014 Don Coleman
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/* global mainPage, deviceList, refreshButton */
/* global detailPage, lightSwitch, dimmer, disconnectButton */
/* global cordova, ble */
/* jshint browser: true , devel: true*/
'use strict';
var arrayBufferToInt = function (ab) {
var a = new Uint8Array(ab);
return a[0];
};
var robosmart = {
service: 'FF10',
lightSwitch: 'FF11',
brightness: 'FF12',
powerConsumed: 'FF16',
name: 'FF17',
description: 'FF18',
room: 'FF19',
locationName: 'FF1b',
locationGps: 'FF1d',
disconnect: 'FF1a',
};
var app = {
initialize: function() {
this.bindEvents();
detailPage.hidden = true;
},
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
refreshButton.addEventListener('touchstart', this.refreshDeviceList, false);
lightSwitch.addEventListener('change', this.setOnOff, false);
dimmer.addEventListener('change', this.setBrightness, false);
disconnectButton.addEventListener('touchstart', this.disconnect, false);
deviceList.addEventListener('touchstart', this.connect, false); // assume not scrolling
},
onDeviceReady: function() {
app.refreshDeviceList();
},
refreshDeviceList: function() {
deviceList.innerHTML = ''; // empties the list
if (cordova.platformId === 'android') {
// Bug: Android can't find RoboSmart when scanning for service
ble.scan([], 5, app.onDiscoverDevice, app.onError);
} else {
ble.scan([robosmart.service], 5, app.onDiscoverDevice, app.onError);
}
},
onDiscoverDevice: function(device) {
var listItem = document.createElement('li'),
html = '' + device.name + '
' +
'RSSI: ' + device.rssi + ' | ' +
device.id;
listItem.dataset.deviceId = device.id;
listItem.innerHTML = html;
deviceList.appendChild(listItem);
},
connect: function(e) {
var deviceId = e.target.dataset.deviceId,
onConnect = function() {
// subscribe for power consumption notifications
disconnectButton.dataset.deviceId = deviceId;
lightSwitch.dataset.deviceId = deviceId;
dimmer.dataset.deviceId = deviceId;
app.showDetailPage();
app.syncUI(deviceId);
};
ble.connect(deviceId, onConnect, app.onError);
},
setOnOff: function(event) { // send data to robosmart
var success = function() {
console.log("success");
};
var failure = function() {
alert("Failed writing data to the robosmart");
};
var data = new Uint8Array(1);
data[0] = event.target.checked ? 0x1 : 0x0;
var deviceId = event.target.dataset.deviceId;
ble.write(deviceId, robosmart.service, robosmart.lightSwitch, data.buffer, success, failure);
},
setBrightness: function(event) { // send data to robosmart
var success = function() {
// if the light was off and brightness is adjusted, the light will turn on
lightSwitch.checked = true;
console.log("success");
};
var failure = function() {
alert("Failed writing data to the robosmart");
};
var deviceId = event.target.dataset.deviceId;
// pass the brightness from the slider to the light
var brightness = new Uint8Array(1);
brightness[0] = event.target.value;
ble.write(deviceId, robosmart.service, robosmart.brightness, brightness.buffer, success, failure);
},
syncUI: function(deviceId) {
var switchCallback = function(data) {
lightSwitch.checked = arrayBufferToInt(data) === 0x1;
};
var dimmerCallback = function(data) {
dimmer.value = arrayBufferToInt(data);
};
var failure = function(reason) {
console.log("Error syncing UI with the current state " + reason);
};
ble.read(deviceId, robosmart.service, robosmart.lightSwitch, switchCallback, failure);
ble.read(deviceId, robosmart.service, robosmart.brightness, dimmerCallback, failure);
},
disconnect: function(event) {
var deviceId = event.target.dataset.deviceId;
ble.disconnect(deviceId, app.showMainPage, app.onError);
},
showMainPage: function() {
mainPage.hidden = false;
detailPage.hidden = true;
},
showDetailPage: function() {
mainPage.hidden = true;
detailPage.hidden = false;
},
onError: function(reason) {
alert("ERROR: " + reason); // real apps should use notification.alert
}
};