Skip to content

Commit 1aa1aa3

Browse files
committed
CLEXI BLE beacon integration BETA
1 parent 5c64e59 commit 1aa1aa3

File tree

3 files changed

+100
-27
lines changed

3 files changed

+100
-27
lines changed

www/scripts/clexi-0.7.0.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var ClexiJS = (function(){
1313
var msgId = 0;
1414

1515
var reconnectBaseDelay = 330;
16-
var reconnectMaxDelay = 30000;
16+
var reconnectMaxDelay = 300000;
1717
var reconnectTry = 0;
1818
var reconnectTimer = undefined;
1919
var requestedClose = false;
@@ -23,6 +23,9 @@ var ClexiJS = (function(){
2323
return isConnected;
2424
}
2525
Clexi.doAutoReconnect = true;
26+
Clexi.setMaxReconnectDelay = function(delay){
27+
reconnectMaxDelay = delay;
28+
}
2629

2730
Clexi.onLog = undefined; //set this in your code to get log messages
2831
Clexi.onDebug = undefined;
@@ -126,7 +129,7 @@ var ClexiJS = (function(){
126129
}, delay);
127130
}
128131

129-
Clexi.send = function(extensionName, data){
132+
Clexi.send = function(extensionName, data, numOfRetries){
130133
if (ws && isConnected){
131134
var msg = {
132135
type: extensionName,
@@ -136,8 +139,26 @@ var ClexiJS = (function(){
136139
};
137140
// Send the msg object as a JSON-formatted string.
138141
ws.send(JSON.stringify(msg));
142+
}else if (numOfRetries && numOfRetries > 0){
143+
Clexi.schedule(extensionName, data, 0, numOfRetries);
144+
}
145+
}
146+
Clexi.schedule = function(extensionName, data, thisRetry, maxRetries){
147+
thisRetry++;
148+
if (thisRetry <= maxRetries){
149+
setTimeout(function(){
150+
if (ws && isConnected){
151+
Clexi.send(extensionName, data, maxRetries - thisRetry);
152+
}else{
153+
Clexi.schedule(extensionName, data, thisRetry, maxRetries);
154+
}
155+
}, Clexi.scheduleDelay);
156+
}else{
157+
//Error: message not delivered - what TODO ?
158+
if (Clexi.onError) Clexi.onError('CLEXI send failed!');
139159
}
140160
}
161+
Clexi.scheduleDelay = 1500;
141162

142163
/**
143164
* Subscribe to an extension event.

www/scripts/sepiaFW.clexi.js

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ function sepiaFW_build_clexi(){
55
Clexi.socketURI = ""; //default CLEXI server: wss://raspberrypi.local:8443
66
Clexi.doConnect = false;
77

8+
Clexi.numOfSendRetries = 10;
9+
810
Clexi.setSocketURI = function(newURI){
911
SepiaFW.data.set('clexiSocketURI', newURI);
1012
Clexi.socketURI = newURI;
@@ -48,27 +50,30 @@ function sepiaFW_build_clexi(){
4850

4951
//subscribe
5052
subscribeToBeaconScanner();
51-
subscribeToBroadcaster();
53+
//subscribeToBroadcaster();
5254

5355
//request some states
54-
Clexi.requestBleBeaconScannerState();
56+
Clexi.requestBleBeaconScannerState(); //TODO: repeat from time to time or at least on error?
5557

5658
}, function(e){
5759
//closed
58-
removeBroadcasterSubscription();
5960
removeBeaconScannerSubscription();
61+
//removeBroadcasterSubscription();
6062

6163
}, function(err){
6264
//error
63-
removeBroadcasterSubscription();
6465
removeBeaconScannerSubscription();
66+
//removeBroadcasterSubscription();
6567
});
6668
}
6769
Clexi.close = function(){
6870
ClexiJS.close();
6971
}
7072

71-
Clexi.send = ClexiJS.send;
73+
Clexi.send = function(extensionName, data, numOfRetries){
74+
if (numOfRetries == undefined) numOfRetries = Clexi.numOfSendRetries;
75+
ClexiJS.send(extensionName, data, numOfRetries);
76+
}
7277

7378
Clexi.getXtensions = function(){
7479
return ClexiJS.availableXtensions;
@@ -80,9 +85,10 @@ function sepiaFW_build_clexi(){
8085
//CLEXI broadcaster:
8186

8287
Clexi.broadcastToAll = function(data){
83-
ClexiJS.send('clexi-broadcaster', data);
88+
ClexiJS.send('clexi-broadcaster', data, Clexi.numOfSendRetries);
8489
}
8590

91+
//TODO: do something useful with this ;-)
8692
function subscribeToBroadcaster(){
8793
ClexiJS.subscribeTo('clexi-broadcaster', function(e){
8894
console.log('Broadcaster event: ' + JSON.stringify(e));
@@ -99,40 +105,70 @@ function sepiaFW_build_clexi(){
99105
//CLEXI ble beacon scanner
100106

101107
Clexi.bleBeaconScannerState = undefined;
108+
var expectedBleBeaconScannerState = undefined;
102109

103110
Clexi.startBleBeaconScanner = function(){
104111
ClexiJS.send('ble-beacon-scanner', {
105112
ctrl: "start"
106-
});
113+
}, Clexi.numOfSendRetries);
114+
expectedBleBeaconScannerState = "on";
107115
}
108116
Clexi.stopBleBeaconScanner = function(){
109117
ClexiJS.send('ble-beacon-scanner', {
110118
ctrl: "stop"
111-
});
119+
}, Clexi.numOfSendRetries);
120+
expectedBleBeaconScannerState = "off";
112121
}
113122
Clexi.requestBleBeaconScannerState = function(){
114123
ClexiJS.send('ble-beacon-scanner', {
115124
ctrl: "state"
116-
});
125+
}, Clexi.numOfSendRetries);
126+
}
127+
128+
Clexi.addBleBeaconEventListener = function(callback){
129+
document.addEventListener('clexi-event-ble-beacon-scanner', callback);
130+
}
131+
Clexi.removeBleBeaconEventListener = function(callback){
132+
document.removeEventListener('clexi-event-ble-beacon-scanner', callback);
133+
}
134+
Clexi.addBleBeaconErrorListener = function(callback){
135+
document.addEventListener('clexi-error-ble-beacon-scanner', callback);
136+
}
137+
Clexi.removeBleBeaconErrorListener = function(callback){
138+
document.removeEventListener('clexi-error-ble-beacon-scanner', callback);
117139
}
118140

119141
function subscribeToBeaconScanner(){
120142
ClexiJS.subscribeTo('ble-beacon-scanner', function(e){
121-
console.log('BLE Beacon event: ' + JSON.stringify(e));
143+
//console.log('BLE Beacon event: ' + JSON.stringify(e));
122144
if (e.ctrl){
123145
if (e.ctrl == "started"){
124146
Clexi.bleBeaconScannerState = "on";
125147
}else if (e.ctrl == "stopped"){
126148
Clexi.bleBeaconScannerState = "off";
127149
}
128150
}
151+
var event = new CustomEvent('clexi-event-ble-beacon-scanner', {detail: e});
152+
document.dispatchEvent(event);
153+
129154
}, function(e){
130-
console.log('BLE Beacon response: ' + JSON.stringify(e));
155+
//console.log('BLE Beacon response: ' + JSON.stringify(e));
131156
if (e.state){
132157
Clexi.bleBeaconScannerState = e.state;
158+
//start
159+
if (Clexi.bleBeaconScannerState != expectedBleBeaconScannerState && expectedBleBeaconScannerState == "on"){
160+
//auto-restart scanner
161+
Clexi.startBleBeaconScanner();
162+
}
133163
}
164+
var event = new CustomEvent('clexi-response-ble-beacon-scanner', {detail: e});
165+
document.dispatchEvent(event);
166+
134167
}, function(e){
135-
console.log('BLE Beacon error: ' + JSON.stringify(e));
168+
//console.log('BLE Beacon error: ' + JSON.stringify(e));
169+
var event = new CustomEvent('clexi-error-ble-beacon-scanner', {detail: e});
170+
document.dispatchEvent(event);
171+
//Clexi.requestBleBeaconScannerState(); //TODO: do this here?
136172
});
137173
}
138174
function removeBeaconScannerSubscription(){

www/scripts/sepiaFW.inputControls.js

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -266,25 +266,23 @@ function sepiaFW_build_input_controls() {
266266
InputControls.listenToBluetoothBeacons = function(){
267267
if (InputControls.areBluetoothBeaconsSupported()){
268268
if (!isScannigBeacons){
269-
//evothings scanner
269+
//evothings scanner - TODO: what if we want to force CLEXI BLE?
270270
if (bleBeaconInterface == "evothings"){
271271
evothings.eddystone.startScan(function(beaconData){
272272
//Found
273273
InputControls.handleBluetoothBeaconData(beaconData);
274274
}, function(error){
275275
//Error
276-
SepiaFW.debug.error("Bluetooth-Beacon - " + error);
277-
if (InputControls.settingsAreOpen){
278-
settingsAppendDebug("Bluetooth-Beacon - " + error);
279-
}
280-
SepiaFW.ui.build.toggleButtonSetState('sepiaFW-input-controls-beacon', 'off'); //note: will not trigger "off" actions. OK?
281-
isScannigBeacons = false;
276+
InputControls.handleBluetoothBeaconError(error);
282277
});
283278
isScannigBeacons = true;
284279

285280
//clexi xtension scanner
286281
}else if (bleBeaconInterface == "clexi"){
287-
282+
SepiaFW.clexi.startBleBeaconScanner();
283+
SepiaFW.clexi.addBleBeaconEventListener(InputControls.handleBluetoothBeaconData);
284+
SepiaFW.clexi.addBleBeaconErrorListener(InputControls.handleBluetoothBeaconError);
285+
isScannigBeacons = true;
288286
}
289287
}
290288
}else{
@@ -302,24 +300,42 @@ function sepiaFW_build_input_controls() {
302300

303301
//clexi xtension scanner
304302
}else if (bleBeaconInterface == "clexi"){
305-
303+
SepiaFW.clexi.stopBleBeaconScanner();
304+
SepiaFW.clexi.removeBleBeaconEventListener(InputControls.handleBluetoothBeaconData);
305+
SepiaFW.clexi.removeBleBeaconErrorListener(InputControls.handleBluetoothBeaconError);
306+
isScannigBeacons = false;
306307
}
307308
}
308309
}
309310

311+
InputControls.handleBluetoothBeaconError = function(error){
312+
SepiaFW.debug.error("Bluetooth-Beacon - " + error);
313+
if (InputControls.settingsAreOpen){
314+
settingsAppendDebug("Bluetooth-Beacon - " + error);
315+
}
316+
//TODO: do we want to switch off and reset or just set the button to off with no other effect?
317+
SepiaFW.ui.build.toggleButtonSetState('sepiaFW-input-controls-beacon', 'off'); //note: will not trigger "off" actions. OK?
318+
isScannigBeacons = false;
319+
}
320+
310321
InputControls.handleBluetoothBeaconData = function(beaconData){
322+
if (beaconData && beaconData.detail && beaconData.detail.beacon){
323+
beaconData = beaconData.detail.beacon.eddystoneUrl; //for now we just use eddystone URL
324+
}
311325
//TODO: we probably need a method to filter duplicated calls ... e.g. an ID of the beacon "session"
312326
//console.error("Beacon URL: " + beaconData.url + ", power: " + beaconData.txPower);
313-
if (InputControls.settingsAreOpen){
327+
if (InputControls.settingsAreOpen && beaconData){
314328
if (bleBeaconInterface == "evothings"){
315-
//debug distance
329+
//debug with distance
316330
var distance = evothings.eddystone.calculateAccuracy(beaconData.txPower, beaconData.rssi);
317331
settingsAppendDebug("Beacon URL: " + beaconData.url + ", distance: " + distance);
318332
}else if (bleBeaconInterface == "clexi"){
319-
//skip
333+
//debug
334+
console.log(beaconData);
335+
settingsAppendDebug("Beacon URL: " + beaconData.url);
320336
}
321337
}else{
322-
if (!beaconData.url){
338+
if (!beaconData || !beaconData.url){
323339
return;
324340
}
325341
if (beaconData.url == lastBeaconUrl){

0 commit comments

Comments
 (0)