123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- // (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, resultDiv, messageInput, sendButton, disconnectButton */
- /* global ble, cordova */
- /* jshint browser: true , devel: true*/
- 'use strict';
- // ASCII only
- function bytesToString(buffer) {
- return String.fromCharCode.apply(null, new Uint8Array(buffer));
- }
- // ASCII only
- function stringToBytes(string) {
- var array = new Uint8Array(string.length);
- for (var i = 0, l = string.length; i < l; i++) {
- array[i] = string.charCodeAt(i);
- }
- return array.buffer;
- }
- // this is RedBear Lab's UART service
- var redbear = {
- serviceUUID: "713D0000-503E-4C75-BA94-3148F18D941E",
- txCharacteristic: "713D0003-503E-4C75-BA94-3148F18D941E", // transmit is from the phone's perspective
- rxCharacteristic: "713D0002-503E-4C75-BA94-3148F18D941E" // receive is from the phone's perspective
- };
- var app = {
- initialize: function() {
- this.bindEvents();
- detailPage.hidden = true;
- },
- bindEvents: function() {
- document.addEventListener('deviceready', this.onDeviceReady, false);
- refreshButton.addEventListener('touchstart', this.refreshDeviceList, false);
- sendButton.addEventListener('click', this.sendData, 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') { // Android filtering is broken
- ble.scan([], 5, app.onDiscoverDevice, app.onError);
- } else {
- ble.scan([redbear.serviceUUID], 5, app.onDiscoverDevice, app.onError);
- }
- },
- onDiscoverDevice: function(device) {
- var listItem = document.createElement('li'),
- html = '<b>' + device.name + '</b><br/>' +
- '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 incoming data
- ble.startNotification(deviceId, redbear.serviceUUID, redbear.rxCharacteristic, app.onData, app.onError);
- sendButton.dataset.deviceId = deviceId;
- disconnectButton.dataset.deviceId = deviceId;
- app.showDetailPage();
- };
- ble.connect(deviceId, onConnect, app.onError);
- },
- onData: function(data) { // data received from Arduino
- console.log(data);
- resultDiv.innerHTML = resultDiv.innerHTML + "Received: " + bytesToString(data) + "<br/>";
- resultDiv.scrollTop = resultDiv.scrollHeight;
- },
- sendData: function(event) { // send data to Arduino
- var success = function() {
- console.log("success");
- resultDiv.innerHTML = resultDiv.innerHTML + "Sent: " + messageInput.value + "<br/>";
- resultDiv.scrollTop = resultDiv.scrollHeight;
- };
- var failure = function() {
- alert("Failed writing data to the redbear hardware");
- };
- var data = stringToBytes(messageInput.value);
- var deviceId = event.target.dataset.deviceId;
- ble.writeWithoutResponse(deviceId, redbear.serviceUUID, redbear.txCharacteristic, data, success, 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
- }
- };
|