1
|
{"version":3,"sources":["../node_modules/nipplejs/dist/nipplejs.js","../src/services/dfu-control.ts","../src/promise-queue.ts","../src/services/device-information.ts","../src/service-helper.ts","../node_modules/rollup-plugin-node-builtins/src/es6/events.js","../src/event-dispatcher.ts","../src/services/button.ts","../src/services/led.ts","../src/services/temperature.ts","../src/services/accelerometer.ts","../src/services/magnetometer.ts","../src/services/io-pin.ts","../src/services/uart.ts","../src/services/event.ts","../src/index.ts","js/notification.js","js/hoverControlModule.js","js/main.js"],"names":["DeviceInformationCharacteristic","concurrent","this","PromiseQueue","running","promise","queue","shift","fn","result","_a","resolve","reject","error_1","pump","Promise","_this","push","service","emitter","ServiceHelper","uuid","characteristics","getCharacteristics","_b","find","characteristic","getCharacteristic","Error","add","readValue","value","writeValue","event","handler","startNotifications","on","emitterEvent","listenerCount","addEventListener","removeEventListener","helper","DeviceInformationService","info","readStringCharacteristic","modelNumber","serialNumber","firmwareRevision","hardwareRevision","manufacturer","getCharacteristicValue","view","buffer","slice","byteOffset","byteLength","String","fromCharCode","apply","Array","from","Uint8Array","undefined","EventHandlers","EventEmitter","init","call","$getMaxListeners","that","_maxListeners","defaultMaxListeners","emitNone","isFn","self","len","length","listeners","arrayClone","i","emitOne","arg1","emitTwo","arg2","emitThree","arg3","emitMany","args","_addListener","target","type","listener","prepend","m","events","existing","e","TypeError","_events","newListener","emit","_eventsCount","unshift","warned","w","name","count","console","warn","log","_onceWrap","fired","g","removeListener","arguments","evlistener","arr","copy","prototype","Object","create","usingDomains","domain","active","getPrototypeOf","setMaxListeners","n","isNaN","getMaxListeners","er","doError","error","err","context","domainEmitter","domainThrown","addListener","prependListener","once","prependOnceListener","list","position","originalListener","index","k","pop","removeAllListeners","key","keys","ret","eventNames","Reflect","ownKeys","ButtonCharacteristic","ButtonState","handleEvent","__extends","EventDispatcher","isEventListenerObject","_super","callback","eventOrType","detail","CustomEvent","LedCharacteristic","ButtonService","bluetoothService","handleListener","buttonAState","buttonAStateChangedHandler","bind","buttonBState","buttonBStateChangedHandler","getUint8","dispatchEvent","TemperatureCharacteristic","LedService","text","encoded","encodeString","setCharacteristicValue","ledText","ledMatrixState","viewToLedMatrix","state","ledMatrixToView","scrollingDelay","getUint16","delay","DataView","ArrayBuffer","setUint16","charCodeAt","matrix","byteToBoolArray","byte","bools","reverse","setUint8","boolArrayToByte","reduce","bool","AccelerometerCharacteristic","TemperatureService","temperature","temperatureChangedHandler","getInt8","temperaturePeriod","frequency","MagnetometerCharacteristic","MagnetometerCalibration","AccelerometerService","accelerometerData","accelerometerDataChangedHandler","dataViewToAccelerometerData","accelerometerPeriod","x","getInt16","y","z","IoPinCharacteristic","AD","IO","MagnetometerService","magnetometerData","magnetometerDataChangedHandler","magnetometerBearing","magnetometerBearingChangedHandler","magnetometerCalibration","magnetometerCalibrationChangedHandler","dataViewToMagnetometerData","magnetometerPeriod","UartCharacteristic","IoPinService","pinData","pinDataChangedHandler","dataViewToPinData","data","pinDataToDataView","pinAdConfiguration","dataViewToConfig","config","configToDataView","pinIoConfiguration","pwmControlDataToDataView","pwmControl","pin","forEach","setUint32","period","EventCharacteristic","UartService","tx","receiveHandler","receiveTextHandler","rx","arrayData","split","map","numberArray","DfuCharacteristic","EventService","microBitEvent","eventHandler","microBitRequirements","microbitRequirementsChangedHandler","viewToMicrobitEvent","clientRequirements","clientEvent","microbitEvent","DfuControlService","dfuControl","services","ServiceBuilder","serviceClass","found","requestMicrobit","bluetooth","requestDevice","filters","namePrefix","optionalServices","getServices","device","gatt","connected","connect","getPrimaryServices","builder","createService","deviceInformationService","buttonService","ledService","temperatureService","accelerometerService","magnetometerService","uartService","eventService","dfuControlService","ioPinService","waiting_timer","notif_queue","notif","notif_c","notification_area","document","querySelector","screen","availHeight","availWidth","body","classList","contains","setInterval","clearInterval","notif_elem","createElement","className","appendChild","setTimeout","removeChild","notif_alert","alert_str","div","innerHTML","icon","notif_warn","notif_info","info_str","notif_success","success_str","hoverControlModule","constructor","acc","accString","match","item","substring","parseInt","remove","reset","setArm","setThrottle","setRudder","throttle","getThrottle","rudder","getRudder","arm","getArm","sw","navigator","serviceWorker","register","scope","then","registration","onupdatefound","installingWorker","installing","onstatechange","controller","update","catch","getElementById","bluetoothDevice","bluetoothDeviceServices","hoverControl","joystickLeft","nipplejs","zone","size","left","bottom","mode","lockX","joystickRight","lockY","evt","distance","angle","degree","disconnect","intervalConnectionChecker","reconnect","intervalSendCommands","command","toString","sendText","receiveText","elm","newone","cloneNode","parentNode","replaceChild","indexOf","parts","onclick","window"],"mappings":"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","file":"main.a4da0525.js","sourceRoot":"../src","sourcesContent":["!function(t,i){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(\"nipplejs\",[],i):\"object\"==typeof exports?exports.nipplejs=i():t.nipplejs=i()}(window,function(){return function(t){var i={};function e(o){if(i[o])return i[o].exports;var n=i[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,e),n.l=!0,n.exports}return e.m=t,e.c=i,e.d=function(t,i,o){e.o(t,i)||Object.defineProperty(t,i,{enumerable:!0,get:o})},e.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},e.t=function(t,i){if(1&i&&(t=e(t)),8&i)return t;if(4&i&&\"object\"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(e.r(o),Object.defineProperty(o,\"default\",{enumerable:!0,value:t}),2&i&&\"string\"!=typeof t)for(var n in t)e.d(o,n,function(i){return t[i]}.bind(null,n));return o},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,\"a\",i),i},e.o=function(t,i){return Object.prototype.hasOwnProperty.call(t,i)},e.p=\"\",e(e.s=0)}([function(t,i,e){\"use strict\";e.r(i);var o,n=function(t,i){var e=i.x-t.x,o=i.y-t.y;return Math.sqrt(e*e+o*o)},s=function(t){return t*(Math.PI/180)},r=function(t){return t*(180/Math.PI)},d=function(t,i,e){for(var o,n=i.split(/[ ,]+/g),s=0;s<n.length;s+=1)o=n[s],t.addEventListener?t.addEventListener(o,e,!1):t.attachEvent&&t.attachEvent(o,e)},a=function(t,i,e){for(var o,n=i.split(/[ ,]+/g),s=0;s<n.length;s+=1)o=n[s],t.removeEventListener?t.removeEventListener(o,e):t.detachEvent&&t.detachEvent(o,e)},p=function(t){return t.preventDefault(),t.type.match(/^touch/)?t.changedTouches:t},c=function(){return{x:void 0!==window.pageXOffset?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft,y:void 0!==window.pageYOffset?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop}},h=function(t,i){i.top||i.right||i.bottom||i.left?(t.style.top=i.top,t.style.right=i.right,t.style.bottom=i.bottom,t.style.left=i.left):(t.style.left=i.x+\"px\",t.style.top=i.y+\"px\")},l=function(t,i,e){var o=u(t);for(var n in o)if(o.hasOwnProperty(n))if(\"string\"==typeof i)o[n]=i+\" \"+e;else{for(var s=\"\",r=0,d=i.length;r<d;r+=1)s+=i[r]+\" \"+e+\", \";o[n]=s.slice(0,-2)}return o},u=function(t){var i={};i[t]=\"\";return[\"webkit\",\"Moz\",\"o\"].forEach(function(e){i[e+t.charAt(0).toUpperCase()+t.slice(1)]=\"\"}),i},f=function(t,i){for(var e in i)i.hasOwnProperty(e)&&(t[e]=i[e]);return t},y=function(t,i){if(t.length)for(var e=0,o=t.length;e<o;e+=1)i(t[e]);else i(t)},m=!!(\"ontouchstart\"in window),v=!!window.PointerEvent,g=!!window.MSPointerEvent,b={start:\"mousedown\",move:\"mousemove\",end:\"mouseup\"},x={};function O(){}v?o={start:\"pointerdown\",move:\"pointermove\",end:\"pointerup, pointercancel\"}:g?o={start:\"MSPointerDown\",move:\"MSPointerMove\",end:\"MSPointerUp\"}:m?(o={start:\"touchstart\",move:\"touchmove\",end:\"touchend, touchcancel\"},x=b):o=b,O.prototype.on=function(t,i){var e,o=t.split(/[ ,]+/g);this._handlers_=this._handlers_||{};for(var n=0;n<o.length;n+=1)e=o[n],this._handlers_[e]=this._handlers_[e]||[],this._handlers_[e].push(i);return this},O.prototype.off=function(t,i){return this._handlers_=this._handlers_||{},void 0===t?this._handlers_={}:void 0===i?this._handlers_[t]=null:this._handlers_[t]&&this._handlers_[t].indexOf(i)>=0&&this._handlers_[t].splice(this._handlers_[t].indexOf(i),1),this},O.prototype.trigger=function(t,i){var e,o=this,n=t.split(/[ ,]+/g);o._handlers_=o._handlers_||{};for(var s=0;s<n.length;s+=1)e=n[s],o._handlers_[e]&&o._handlers_[e].length&&o._handlers_[e].forEach(function(t){t.call(o,{type:e,target:o},i)})},O.prototype.config=function(t){this.options=this.defaults||{},t&&(this.options=function(t,i){var e={};for(var o in t)t.hasOwnProperty(o)&&i.hasOwnProperty(o)?e[o]=i[o]:t.hasOwnProperty(o)&&(e[o]=t[o]);return e}(this.options,t))},O.prototype.bindEvt=function(t,i){var e=this;return e._domHandlers_=e._domHandlers_||{},e._domHandlers_[i]=function(){\"function\"==typeof e[\"on\"+i]?e[\"on\"+i].apply(e,arguments):console.warn('[WARNING] : Missing \"on'+i+'\" handler.')},d(t,o[i],e._domHandlers_[i]),x[i]&&d(t,x[i],e._domHandlers_[i]),e},O.prototype.unbindEvt=function(t,i){return this._domHandlers_=this._domHandlers_||{},a(t,o[i],this._domHandlers_[i]),x[i]&&a(t,x[i],this._domHandlers_[i]),delete this._domHandlers_[i],this};var _=O;function w(t,i){return this.identifier=i.identifier,this.position=i.position,this.frontPosition=i.frontPosition,this.collection=t,this.defaults={size:100,threshold:.1,color:\"white\",fadeTime:250,dataOnly:!1,restJoystick:!0,restOpacity:.5,mode:\"dynamic\",zone:document.body,lockX:!1,lockY:!1,shape:\"circle\"},this.config(i),\"dynamic\"===this.options.mode&&(this.options.restOpacity=0),this.id=w.id,w.id+=1,this.buildEl().stylize(),this.instance={el:this.ui.el,on:this.on.bind(this),off:this.off.bind(this),show:this.show.bind(this),hide:this.hide.bind(this),add:this.addToDom.bind(this),remove:this.removeFromDom.bind(this),destroy:this.destroy.bind(this),setPosition:this.setPosition.bind(this),resetDirection:this.resetDirection.bind(this),computeDirection:this.computeDirection.bind(this),trigger:this.trigger.bind(this),position:this.position,frontPosition:this.frontPosition,ui:this.ui,identifier:this.identifier,id:this.id,options:this.options},this.instance}w.prototype=new _,w.constructor=w,w.id=0,w.prototype.buildEl=function(t){return this.ui={},this.options.dataOnly?this:(this.ui.el=document.createElement(\"div\"),this.ui.back=document.createElement(\"div\"),this.ui.front=document.createElement(\"div\"),this.ui.el.className=\"nipple collection_\"+this.collection.id,this.ui.back.className=\"back\",this.ui.front.className=\"front\",this.ui.el.setAttribute(\"id\",\"nipple_\"+this.collection.id+\"_\"+this.id),this.ui.el.appendChild(this.ui.back),this.ui.el.appendChild(this.ui.front),this)},w.prototype.stylize=function(){if(this.options.dataOnly)return this;var t=this.options.fadeTime+\"ms\",i=function(t,i){var e=u(t);for(var o in e)e.hasOwnProperty(o)&&(e[o]=i);return e}(\"borderRadius\",\"50%\"),e=l(\"transition\",\"opacity\",t),o={};return o.el={position:\"absolute\",opacity:this.options.restOpacity,display:\"block\",zIndex:999},o.back={position:\"absolute\",display:\"block\",width:this.options.size+\"px\",height:this.options.size+\"px\",marginLeft:-this.options.size/2+\"px\",marginTop:-this.options.size/2+\"px\",background:this.options.color,opacity:\".5\"},o.front={width:this.options.size/2+\"px\",height:this.options.size/2+\"px\",position:\"absolute\",display:\"block\",marginLeft:-this.options.size/4+\"px\",marginTop:-this.options.size/4+\"px\",background:this.options.color,opacity:\".5\"},f(o.el,e),\"circle\"===this.options.shape&&f(o.back,i),f(o.front,i),this.applyStyles(o),this},w.prototype.applyStyles=function(t){for(var i in this.ui)if(this.ui.hasOwnProperty(i))for(var e in t[i])this.ui[i].style[e]=t[i][e];return this},w.prototype.addToDom=function(){return this.options.dataOnly||document.body.contains(this.ui.el)?this:(this.options.zone.appendChild(this.ui.el),this)},w.prototype.removeFromDom=function(){return this.options.dataOnly||!document.body.contains(this.ui.el)?this:(this.options.zone.removeChild(this.ui.el),this)},w.prototype.destroy=function(){clearTimeout(this.removeTimeout),clearTimeout(this.showTimeout),clearTimeout(this.restTimeout),this.trigger(\"destroyed\",this.instance),this.removeFromDom(),this.off()},w.prototype.show=function(t){var i=this;return i.options.dataOnly?i:(clearTimeout(i.removeTimeout),clearTimeout(i.showTimeout),clearTimeout(i.restTimeout),i.addToDom(),i.restCallback(),setTimeout(function(){i.ui.el.style.opacity=1},0),i.showTimeout=setTimeout(function(){i.trigger(\"shown\",i.instance),\"function\"==typeof t&&t.call(this)},i.options.fadeTime),i)},w.prototype.hide=function(t){var i=this;return i.options.dataOnly?i:(i.ui.el.style.opacity=i.options.restOpacity,clearTimeout(i.removeTimeout),clearTimeout(i.showTimeout),clearTimeout(i.restTimeout),i.removeTimeout=setTimeout(function(){var e=\"dynamic\"===i.options.mode?\"none\":\"block\";i.ui.el.style.display=e,\"function\"==typeof t&&t.call(i),i.trigger(\"hidden\",i.instance)},i.options.fadeTime),i.options.restJoystick&&i.setPosition(t,{x:0,y:0}),i)},w.prototype.setPosition=function(t,i){var e=this;e.frontPosition={x:i.x,y:i.y};var o=e.options.fadeTime+\"ms\",n={};n.front=l(\"transition\",[\"top\",\"left\"],o);var s={front:{}};s.front={left:e.frontPosition.x+\"px\",top:e.frontPosition.y+\"px\"},e.applyStyles(n),e.applyStyles(s),e.restTimeout=setTimeout(function(){\"function\"==typeof t&&t.call(e),e.restCallback()},e.options.fadeTime)},w.prototype.restCallback=function(){var t={};t.front=l(\"transition\",\"none\",\"\"),this.applyStyles(t),this.trigger(\"rested\",this.instance)},w.prototype.resetDirection=function(){this.direction={x:!1,y:!1,angle:!1}},w.prototype.computeDirection=function(t){var i,e,o,n=t.angle.radian,s=Math.PI/4,r=Math.PI/2;if(n>s&&n<3*s&&!t.lockX?i=\"up\":n>-s&&n<=s&&!t.lockY?i=\"left\":n>3*-s&&n<=-s&&!t.lockX?i=\"down\":t.lockY||(i=\"right\"),t.lockY||(e=n>-r&&n<r?\"left\":\"right\"),t.lockX||(o=n>0?\"up\":\"down\"),t.force>this.options.threshold){var d,a={};for(d in this.direction)this.direction.hasOwnProperty(d)&&(a[d]=this.direction[d]);var p={};for(d in this.direction={x:e,y:o,angle:i},t.direction=this.direction,a)a[d]===this.direction[d]&&(p[d]=!0);if(p.x&&p.y&&p.angle)return t;p.x&&p.y||this.trigger(\"plain\",t),p.x||this.trigger(\"plain:\"+e,t),p.y||this.trigger(\"plain:\"+o,t),p.angle||this.trigger(\"dir dir:\"+i,t)}else this.resetDirection();return t};var T=w;function k(t,i){return this.nipples=[],this.idles=[],this.actives=[],this.ids=[],this.pressureIntervals={},this.manager=t,this.id=k.id,k.id+=1,this.defaults={zone:document.body,multitouch:!1,maxNumberOfNipples:10,mode:\"dynamic\",position:{top:0,left:0},catchDistance:200,size:100,threshold:.1,color:\"white\",fadeTime:250,dataOnly:!1,restJoystick:!0,restOpacity:.5,lockX:!1,lockY:!1,shape:\"circle\",dynamicPage:!1},this.config(i),\"static\"!==this.options.mode&&\"semi\"!==this.options.mode||(this.options.multitouch=!1),this.options.multitouch||(this.options.maxNumberOfNipples=1),this.updateBox(),this.prepareNipples(),this.bindings(),this.begin(),this.nipples}k.prototype=new _,k.constructor=k,k.id=0,k.prototype.prepareNipples=function(){var t=this.nipples;t.on=this.on.bind(this),t.off=this.off.bind(this),t.options=this.options,t.destroy=this.destroy.bind(this),t.ids=this.ids,t.id=this.id,t.processOnMove=this.processOnMove.bind(this),t.processOnEnd=this.processOnEnd.bind(this),t.get=function(i){if(void 0===i)return t[0];for(var e=0,o=t.length;e<o;e+=1)if(t[e].identifier===i)return t[e];return!1}},k.prototype.bindings=function(){this.bindEvt(this.options.zone,\"start\"),this.options.zone.style.touchAction=\"none\",this.options.zone.style.msTouchAction=\"none\"},k.prototype.begin=function(){var t=this.options;if(\"static\"===t.mode){var i=this.createNipple(t.position,this.manager.getIdentifier());i.add(),this.idles.push(i)}},k.prototype.createNipple=function(t,i){var e=c(),o={},n=this.options;if(t.x&&t.y)o={x:t.x-(e.x+this.box.left),y:t.y-(e.y+this.box.top)};else if(t.top||t.right||t.bottom||t.left){var s=document.createElement(\"DIV\");s.style.display=\"hidden\",s.style.top=t.top,s.style.right=t.right,s.style.bottom=t.bottom,s.style.left=t.left,s.style.position=\"absolute\",n.zone.appendChild(s);var r=s.getBoundingClientRect();n.zone.removeChild(s),o=t,t={x:r.left+e.x,y:r.top+e.y}}var d=new T(this,{color:n.color,size:n.size,threshold:n.threshold,fadeTime:n.fadeTime,dataOnly:n.dataOnly,restJoystick:n.restJoystick,restOpacity:n.restOpacity,mode:n.mode,identifier:i,position:t,zone:n.zone,frontPosition:{x:0,y:0},shape:n.shape});return n.dataOnly||(h(d.ui.el,o),h(d.ui.front,d.frontPosition)),this.nipples.push(d),this.trigger(\"added \"+d.identifier+\":added\",d),this.manager.trigger(\"added \"+d.identifier+\":added\",d),this.bindNipple(d),d},k.prototype.updateBox=function(){this.box=this.options.zone.getBoundingClientRect()},k.prototype.bindNipple=function(t){var i,e=this,o=function(t,o){i=t.type+\" \"+o.id+\":\"+t.type,e.trigger(i,o)};t.on(\"destroyed\",e.onDestroyed.bind(e)),t.on(\"shown hidden rested dir plain\",o),t.on(\"dir:up dir:right dir:down dir:left\",o),t.on(\"plain:up plain:right plain:down plain:left\",o)},k.prototype.pressureFn=function(t,i,e){var o=this,n=0;clearInterval(o.pressureIntervals[e]),o.pressureIntervals[e]=setInterval(function(){var e=t.force||t.pressure||t.webkitForce||0;e!==n&&(i.trigger(\"pressure\",e),o.trigger(\"pressure \"+i.identifier+\":pressure\",e),n=e)}.bind(o),100)},k.prototype.onstart=function(t){var i=this,e=i.options,o=t;t=p(t),i.updateBox();return y(t,function(n){i.actives.length<e.maxNumberOfNipples?i.processOnStart(n):o.type.match(/^touch/)&&(Object.keys(i.manager.ids).forEach(function(e){if(Object.values(o.touches).findIndex(function(t){return t.identifier===e})<0){var n=[t[0]];n.identifier=e,i.processOnEnd(n)}}),i.actives.length<e.maxNumberOfNipples&&i.processOnStart(n))}),i.manager.bindDocument(),!1},k.prototype.processOnStart=function(t){var i,e=this,o=e.options,s=e.manager.getIdentifier(t),r=t.force||t.pressure||t.webkitForce||0,d={x:t.pageX,y:t.pageY},a=e.getOrCreate(s,d);a.identifier!==s&&e.manager.removeIdentifier(a.identifier),a.identifier=s;var p=function(i){i.trigger(\"start\",i),e.trigger(\"start \"+i.id+\":start\",i),i.show(),r>0&&e.pressureFn(t,i,i.identifier),e.processOnMove(t)};if((i=e.idles.indexOf(a))>=0&&e.idles.splice(i,1),e.actives.push(a),e.ids.push(a.identifier),\"semi\"!==o.mode)p(a);else{if(!(n(d,a.position)<=o.catchDistance))return a.destroy(),void e.processOnStart(t);p(a)}return a},k.prototype.getOrCreate=function(t,i){var e,o=this.options;return/(semi|static)/.test(o.mode)?(e=this.idles[0])?(this.idles.splice(0,1),e):\"semi\"===o.mode?this.createNipple(i,t):(console.warn(\"Coudln't find the needed nipple.\"),!1):e=this.createNipple(i,t)},k.prototype.processOnMove=function(t){var i=this.options,e=this.manager.getIdentifier(t),o=this.nipples.get(e);if(function(t){return isNaN(t.buttons)?0!==t.pressure:0!==t.buttons}(t)){if(!o)return console.error(\"Found zombie joystick with ID \"+e),void this.manager.removeIdentifier(e);if(i.dynamicPage){var d=c();p=o.el.getBoundingClientRect(),o.position={x:d.x+p.left,y:d.y+p.top}}o.identifier=e;var a=o.options.size/2,p={x:t.pageX,y:t.pageY};i.lockX&&(p.y=o.position.y),i.lockY&&(p.x=o.position.x);var l,u,f,y,m,v,g,b,x=n(p,o.position),O=(l=p,u=o.position,f=u.x-l.x,y=u.y-l.y,r(Math.atan2(y,f))),_=s(O),w=x/a,T={distance:x,position:p};\"circle\"===o.options.shape?(x=Math.min(x,a),m=o.position,v=x,b={x:0,y:0},g=s(g=O),b.x=m.x-v*Math.cos(g),b.y=m.y-v*Math.sin(g),p=b):(p=function(t,i,e){return{x:Math.min(Math.max(t.x,i.x-e),i.x+e),y:Math.min(Math.max(t.y,i.y-e),i.y+e)}}(p,o.position,a),x=n(p,o.position));var k=p.x-o.position.x,P=p.y-o.position.y;o.frontPosition={x:k,y:P},i.dataOnly||h(o.ui.front,o.frontPosition);var E={identifier:o.identifier,position:p,force:w,pressure:t.force||t.pressure||t.webkitForce||0,distance:x,angle:{radian:_,degree:O},vector:{x:k/a,y:-P/a},raw:T,instance:o,lockX:i.lockX,lockY:i.lockY};(E=o.computeDirection(E)).angle={radian:s(180-O),degree:180-O},o.trigger(\"move\",E),this.trigger(\"move \"+o.id+\":move\",E)}else this.processOnEnd(t)},k.prototype.processOnEnd=function(t){var i=this,e=i.options,o=i.manager.getIdentifier(t),n=i.nipples.get(o),s=i.manager.removeIdentifier(n.identifier);n&&(e.dataOnly||n.hide(function(){\"dynamic\"===e.mode&&(n.trigger(\"removed\",n),i.trigger(\"removed \"+n.id+\":removed\",n),i.manager.trigger(\"removed \"+n.id+\":removed\",n),n.destroy())}),clearInterval(i.pressureIntervals[n.identifier]),n.resetDirection(),n.trigger(\"end\",n),i.trigger(\"end \"+n.id+\":end\",n),i.ids.indexOf(n.identifier)>=0&&i.ids.splice(i.ids.indexOf(n.identifier),1),i.actives.indexOf(n)>=0&&i.actives.splice(i.actives.indexOf(n),1),/(semi|static)/.test(e.mode)?i.idles.push(n):i.nipples.indexOf(n)>=0&&i.nipples.splice(i.nipples.indexOf(n),1),i.manager.unbindDocument(),/(semi|static)/.test(e.mode)&&(i.manager.ids[s.id]=s.identifier))},k.prototype.onDestroyed=function(t,i){this.nipples.indexOf(i)>=0&&this.nipples.splice(this.nipples.indexOf(i),1),this.actives.indexOf(i)>=0&&this.actives.splice(this.actives.indexOf(i),1),this.idles.indexOf(i)>=0&&this.idles.splice(this.idles.indexOf(i),1),this.ids.indexOf(i.identifier)>=0&&this.ids.splice(this.ids.indexOf(i.identifier),1),this.manager.removeIdentifier(i.identifier),this.manager.unbindDocument()},k.prototype.destroy=function(){for(var t in this.unbindEvt(this.options.zone,\"start\"),this.nipples.forEach(function(t){t.destroy()}),this.pressureIntervals)this.pressureIntervals.hasOwnProperty(t)&&clearInterval(this.pressureIntervals[t]);this.trigger(\"destroyed\",this.nipples),this.manager.unbindDocument(),this.off()};var P=k;function E(t){var i,e=this;return e.ids={},e.index=0,e.collections=[],e.config(t),e.prepareCollections(),d(window,\"resize\",function(t){clearTimeout(i),i=setTimeout(function(){var t,i=c();e.collections.forEach(function(e){e.forEach(function(e){t=e.el.getBoundingClientRect(),e.position={x:i.x+t.left,y:i.y+t.top}})})},100)}),e.collections}E.prototype=new _,E.constructor=E,E.prototype.prepareCollections=function(){var t=this;t.collections.create=t.create.bind(t),t.collections.on=t.on.bind(t),t.collections.off=t.off.bind(t),t.collections.destroy=t.destroy.bind(t),t.collections.get=function(i){var e;return t.collections.every(function(t){return!(e=t.get(i))}),e}},E.prototype.create=function(t){return this.createCollection(t)},E.prototype.createCollection=function(t){var i=new P(this,t);return this.bindCollection(i),this.collections.push(i),i},E.prototype.bindCollection=function(t){var i,e=this,o=function(t,o){i=t.type+\" \"+o.id+\":\"+t.type,e.trigger(i,o)};t.on(\"destroyed\",e.onDestroyed.bind(e)),t.on(\"shown hidden rested dir plain\",o),t.on(\"dir:up dir:right dir:down dir:left\",o),t.on(\"plain:up plain:right plain:down plain:left\",o)},E.prototype.bindDocument=function(){this.binded||(this.bindEvt(document,\"move\").bindEvt(document,\"end\"),this.binded=!0)},E.prototype.unbindDocument=function(t){Object.keys(this.ids).length&&!0!==t||(this.unbindEvt(document,\"move\").unbindEvt(document,\"end\"),this.binded=!1)},E.prototype.getIdentifier=function(t){var i;return t?void 0===(i=void 0===t.identifier?t.pointerId:t.identifier)&&(i=this.latest||0):i=this.index,void 0===this.ids[i]&&(this.ids[i]=this.index,this.index+=1),this.latest=i,this.ids[i]},E.prototype.removeIdentifier=function(t){var i={};for(var e in this.ids)if(this.ids[e]===t){i.id=e,i.identifier=this.ids[e],delete this.ids[e];break}return i},E.prototype.onmove=function(t){return this.onAny(\"move\",t),!1},E.prototype.onend=function(t){return this.onAny(\"end\",t),!1},E.prototype.oncancel=function(t){return this.onAny(\"end\",t),!1},E.prototype.onAny=function(t,i){var e,o=this,n=\"processOn\"+t.charAt(0).toUpperCase()+t.slice(1);i=p(i);return y(i,function(t){e=o.getIdentifier(t),y(o.collections,function(t,i,e){e.ids.indexOf(i)>=0&&(e[n](t),t._found_=!0)}.bind(null,t,e)),t._found_||o.removeIdentifier(e)}),!1},E.prototype.destroy=function(){this.unbindDocument(!0),this.ids={},this.index=0,this.collections.forEach(function(t){t.destroy()}),this.off()},E.prototype.onDestroyed=function(t,i){if(this.collections.indexOf(i)<0)return!1;this.collections.splice(this.collections.indexOf(i),1)};var I=new E;i.default={create:function(t){return I.create(t)},factory:I}}]).default});","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum DfuCharacteristic {\n dfuControl = \"e95d93b1-251d-470a-a062-fa1922dfa9a8\"\n}\n\n/**\n * @hidden\n */\nexport class DfuControlService {\n\n /**\n * @hidden\n */\n public static uuid = \"e95d93b0-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<DfuControlService> {\n return new DfuControlService(service);\n }\n\n /**\n * @hidden\n */\n public helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n this.helper = new ServiceHelper(service);\n }\n\n /**\n * Request device switches to DFU mode\n */\n public requestDfu(): Promise<void> {\n return this.helper.setCharacteristicValue(DfuCharacteristic.dfuControl, new Uint8Array([1]));\n }\n\n /**\n * Request flash code\n */\n public requestFlashCode(): Promise<void> {\n return this.helper.setCharacteristicValue(DfuCharacteristic.dfuControl, new Uint8Array([2]));\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\n/**\n * @hidden\n */\ninterface QueuedPromise {\n fn: () => Promise<any>;\n resolve: (value?: any | PromiseLike<any> | undefined) => void;\n reject: (reason?: any) => void;\n}\n\n/**\n * @hidden\n */\nexport class PromiseQueue {\n\n private queue: QueuedPromise[] = [];\n private running = 0;\n\n constructor(private concurrent = 1) {\n }\n\n private async pump(): Promise<void> {\n if (this.running >= this.concurrent) {\n return;\n }\n\n const promise = this.queue.shift();\n\n if (!promise) {\n return;\n }\n\n this.running ++;\n\n try {\n const result = await promise.fn();\n promise.resolve(result);\n } catch (error) {\n promise.reject(error);\n }\n\n this.running --;\n return this.pump();\n }\n\n public add<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this.queue.push({\n fn,\n resolve,\n reject\n });\n\n return this.pump();\n });\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum DeviceInformationCharacteristic {\n modelNumber = \"00002a24-0000-1000-8000-00805f9b34fb\",\n serialNumber = \"00002a25-0000-1000-8000-00805f9b34fb\",\n firmwareRevision = \"00002a26-0000-1000-8000-00805f9b34fb\",\n hardwareRevision = \"00002a27-0000-1000-8000-00805f9b34fb\",\n manufacturer = \"00002a29-0000-1000-8000-00805f9b34fb\"\n}\n\n/**\n * Device information structure\n */\nexport interface DeviceInformation {\n /**\n * Model Number\n */\n modelNumber?: string;\n /**\n * Serial Number\n */\n serialNumber?: string;\n /**\n * Firmware Revision\n */\n firmwareRevision?: string;\n /**\n * Hardware Revision\n */\n hardwareRevision?: string;\n /**\n * Manufacturer Name\n */\n manufacturer?: string;\n}\n\n/**\n * Device Information Service\n */\nexport class DeviceInformationService {\n\n /**\n * @hidden\n */\n public static uuid = \"0000180a-0000-1000-8000-00805f9b34fb\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<DeviceInformationService> {\n return new DeviceInformationService(service);\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n this.helper = new ServiceHelper(service);\n }\n\n /**\n * Read device information\n */\n public async readDeviceInformation(): Promise<DeviceInformation> {\n const info: DeviceInformation = {};\n\n const modelNumber = await this.readStringCharacteristic(DeviceInformationCharacteristic.modelNumber);\n if (modelNumber) info.modelNumber = modelNumber;\n\n const serialNumber = await this.readStringCharacteristic(DeviceInformationCharacteristic.serialNumber);\n if (serialNumber) info.serialNumber = serialNumber;\n\n const firmwareRevision = await this.readStringCharacteristic(DeviceInformationCharacteristic.firmwareRevision);\n if (firmwareRevision) info.firmwareRevision = firmwareRevision;\n\n const hardwareRevision = await this.readStringCharacteristic(DeviceInformationCharacteristic.hardwareRevision);\n if (hardwareRevision) info.hardwareRevision = hardwareRevision;\n\n const manufacturer = await this.readStringCharacteristic(DeviceInformationCharacteristic.manufacturer);\n if (manufacturer) info.manufacturer = manufacturer;\n\n return info;\n }\n\n private async readStringCharacteristic(uuid: BluetoothCharacteristicUUID): Promise<string | undefined> {\n try {\n const view = await this.helper.getCharacteristicValue(uuid);\n const buffer = view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength);\n return String.fromCharCode.apply(null, Array.from(new Uint8Array(buffer)));\n } catch (_e) {\n return undefined;\n }\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { EventEmitter } from \"events\";\nimport { PromiseQueue } from \"./promise-queue\";\n\n/**\n * @hidden\n */\nexport interface ServiceEventHandler {\n characteristic: BluetoothCharacteristicUUID;\n handler: (event: Event) => void;\n}\n\n/**\n * @hidden\n */\nexport class ServiceHelper {\n\n private static queue = new PromiseQueue();\n\n private characteristics?: BluetoothRemoteGATTCharacteristic[];\n\n constructor(private service: BluetoothRemoteGATTService, private emitter?: EventEmitter) {\n }\n\n private async getCharacteristic(uuid: BluetoothCharacteristicUUID): Promise<BluetoothRemoteGATTCharacteristic | undefined> {\n if (!this.characteristics) {\n this.characteristics = await this.service.getCharacteristics();\n }\n\n return this.characteristics.find(characteristic => characteristic.uuid === uuid);\n }\n\n public async getCharacteristicValue(uuid: BluetoothCharacteristicUUID): Promise<DataView> {\n const characteristic = await this.getCharacteristic(uuid);\n\n if (!characteristic) {\n throw new Error(\"Unable to locate characteristic\");\n }\n\n return await ServiceHelper.queue.add(async () => characteristic.readValue());\n }\n\n public async setCharacteristicValue(uuid: BluetoothCharacteristicUUID, value: BufferSource): Promise<void> {\n const characteristic = await this.getCharacteristic(uuid);\n\n if (!characteristic) {\n throw new Error(\"Unable to locate characteristic\");\n }\n\n await ServiceHelper.queue.add(async () => characteristic.writeValue(value));\n }\n\n public async handleListener(event: string, uuid: BluetoothCharacteristicUUID, handler: (event: Event) => void) {\n const characteristic = await this.getCharacteristic(uuid);\n\n if (!characteristic) {\n return;\n }\n\n await ServiceHelper.queue.add(async () => characteristic.startNotifications());\n\n this.emitter!.on(\"newListener\", (emitterEvent: string) => {\n if (emitterEvent !== event || this.emitter!.listenerCount(event) > 0) {\n return;\n }\n\n return ServiceHelper.queue.add(async () => characteristic.addEventListener(\"characteristicvaluechanged\", handler));\n });\n\n this.emitter!.on(\"removeListener\", (emitterEvent: string) => {\n if (emitterEvent !== event || this.emitter!.listenerCount(event) > 0) {\n return;\n }\n\n return ServiceHelper.queue.add(async () => characteristic.removeEventListener(\"characteristicvaluechanged\", handler));\n });\n }\n}\n","'use strict';\n\nvar domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nexport default EventEmitter;\nexport {EventEmitter};\n\n// nodejs oddity\n// require('events') === require('events').EventEmitter\nEventEmitter.EventEmitter = EventEmitter\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active && !(this instanceof domain.Domain)) {\n this.domain = domain.active;\n }\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var needDomainExit = false;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n if (needDomainExit)\n domain.exit();\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { EventEmitter } from \"events\";\n\n/**\n * @hidden\n */\nexport interface TypedDispatcher<T> {\n addEventListener<K extends keyof T>(type: K, listener: (event: CustomEvent<T[K]>) => void): void;\n removeEventListener<K extends keyof T>(type: K, callback: (event: CustomEvent<T[K]>) => void): void;\n dispatchEvent(event: CustomEvent<T>): boolean;\n dispatchEvent<K extends keyof T>(type: K, detail: T[K]): boolean;\n addListener<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\n on<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\n once<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\n prependListener<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\n prependOnceListener<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\n removeListener<K extends keyof T>(event: K, listener: (data: T[K]) => void): this;\n removeAllListeners<K extends keyof T>(event?: K): this;\n // tslint:disable-next-line:ban-types\n listeners<K extends keyof T>(event: K): Function[];\n emit<K extends keyof T>(event: K, data: T[K]): boolean;\n // tslint:disable-next-line:array-type\n eventNames<K extends keyof T>(): Array<K>;\n listenerCount<K extends keyof T>(type: K): number;\n setMaxListeners(n: number): this;\n getMaxListeners(): number;\n}\n\n/**\n * @hidden\n */\nexport class EventDispatcher extends EventEmitter implements EventTarget {\n\n private isEventListenerObject = (listener: EventListenerOrEventListenerObject): listener is EventListenerObject => (listener as EventListenerObject).handleEvent !== undefined;\n\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject | null) {\n if (listener) {\n const handler = this.isEventListenerObject(listener) ? listener.handleEvent : listener;\n super.addListener(type, handler);\n }\n }\n\n public removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null) {\n if (callback) {\n const handler = this.isEventListenerObject(callback) ? callback.handleEvent : callback;\n super.removeListener(type, handler);\n }\n }\n\n public dispatchEvent(event: Event): boolean;\n public dispatchEvent<T>(type: string, detail: T): boolean;\n public dispatchEvent<T>(eventOrType: Event | string, detail?: T): boolean {\n let event: Event;\n if (typeof eventOrType === \"string\") {\n event = new CustomEvent(eventOrType, {\n detail\n });\n } else {\n event = eventOrType;\n }\n\n return super.emit(event.type, event);\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { EventDispatcher, TypedDispatcher } from \"../event-dispatcher\";\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum ButtonCharacteristic {\n buttonAState = \"e95dda90-251d-470a-a062-fa1922dfa9a8\",\n buttonBState = \"e95dda91-251d-470a-a062-fa1922dfa9a8\"\n}\n\n/**\n * Button state enum\n */\nexport enum ButtonState {\n /**\n * Button released\n */\n Release = 0,\n /**\n * Button pressed - short\n */\n ShortPress = 1,\n /**\n * Button pressed - long\n */\n LongPress = 2\n}\n\n/**\n * Events raised by the button service\n */\nexport interface ButtonEvents {\n /**\n * @hidden\n */\n newListener: keyof ButtonEvents;\n /**\n * @hidden\n */\n removeListener: keyof ButtonEvents;\n /**\n * Button A state changed event\n */\n buttonastatechanged: ButtonState;\n /**\n * Button B state changed event\n */\n buttonbstatechanged: ButtonState;\n}\n\n/**\n * Button Service\n */\nexport class ButtonService extends (EventDispatcher as new() => TypedDispatcher<ButtonEvents>) {\n\n /**\n * @hidden\n */\n public static uuid = \"e95d9882-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<ButtonService> {\n const bluetoothService = new ButtonService(service);\n await bluetoothService.init();\n return bluetoothService;\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n super();\n this.helper = new ServiceHelper(service, this);\n }\n\n private async init() {\n await this.helper.handleListener(\"buttonastatechanged\", ButtonCharacteristic.buttonAState, this.buttonAStateChangedHandler.bind(this));\n await this.helper.handleListener(\"buttonbstatechanged\", ButtonCharacteristic.buttonBState, this.buttonBStateChangedHandler.bind(this));\n }\n\n /**\n * Read state of button A\n */\n public async readButtonAState(): Promise<ButtonState> {\n const view = await this.helper.getCharacteristicValue(ButtonCharacteristic.buttonAState);\n return view.getUint8(0);\n }\n\n /**\n * Read state of button B\n */\n public async readButtonBState(): Promise<ButtonState> {\n const view = await this.helper.getCharacteristicValue(ButtonCharacteristic.buttonBState);\n return view.getUint8(0);\n }\n\n private buttonAStateChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n this.dispatchEvent(\"buttonastatechanged\", view.getUint8(0));\n }\n\n private buttonBStateChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n this.dispatchEvent(\"buttonbstatechanged\", view.getUint8(0));\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum LedCharacteristic {\n ledMatrixState = \"e95d7b77-251d-470a-a062-fa1922dfa9a8\",\n ledText = \"e95d93ee-251d-470a-a062-fa1922dfa9a8\",\n scrollingDelay = \"e95d0d2d-251d-470a-a062-fa1922dfa9a8\"\n}\n\n/**\n * LED matrix structure\n */\nexport type LedMatrix = [\n [boolean, boolean, boolean, boolean, boolean],\n [boolean, boolean, boolean, boolean, boolean],\n [boolean, boolean, boolean, boolean, boolean],\n [boolean, boolean, boolean, boolean, boolean],\n [boolean, boolean, boolean, boolean, boolean]\n];\n\n/**\n * LED Service\n */\nexport class LedService {\n\n /**\n * @hidden\n */\n public static uuid = \"e95dd91d-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<LedService> {\n return new LedService(service);\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n this.helper = new ServiceHelper(service);\n }\n\n /**\n * Write text to the LED matrix\n * @param text Te text to display\n */\n public async writeText(text: string): Promise<void> {\n const encoded = this.encodeString(text);\n return this.helper.setCharacteristicValue(LedCharacteristic.ledText, encoded);\n }\n\n /**\n * Read matrix state\n */\n public async readMatrixState(): Promise<LedMatrix> {\n const view = await this.helper.getCharacteristicValue(LedCharacteristic.ledMatrixState);\n return this.viewToLedMatrix(view);\n }\n\n /**\n * Write matrix state\n * @param state The matrix data to set\n */\n public async writeMatrixState(state: LedMatrix): Promise<void> {\n const view = this.ledMatrixToView(state);\n return this.helper.setCharacteristicValue(LedCharacteristic.ledMatrixState, view);\n }\n\n /**\n * Get scrolling delay\n */\n public async getScrollingDelay(): Promise<number> {\n const view = await this.helper.getCharacteristicValue(LedCharacteristic.scrollingDelay);\n return view.getUint16(0, true);\n }\n\n /**\n * Set scrolling delay\n * @param delay The delay to set (milliseconds)\n */\n public async setScrollingDelay(delay: number): Promise<void> {\n const view = new DataView(new ArrayBuffer(2));\n view.setUint16(0, delay, true);\n return this.helper.setCharacteristicValue(LedCharacteristic.scrollingDelay, view);\n }\n\n private encodeString(text: string): ArrayBuffer {\n const buffer = new ArrayBuffer(text.length);\n const view = new Uint8Array(buffer);\n for (let i = 0; i < text.length; i++) {\n view[i] = text.charCodeAt(i);\n }\n return buffer;\n }\n\n private viewToLedMatrix(view: DataView): LedMatrix {\n const matrix: boolean[][] = [];\n for (let i = 0; i < 5; i ++) {\n matrix[i] = this.byteToBoolArray(view.getUint8(i));\n }\n return matrix as LedMatrix;\n }\n\n private byteToBoolArray(byte: number): boolean[] {\n const bools = [false, false, false, false, false];\n for (let i = 0; i < bools.length; i++) {\n bools[i] = (byte & 1) === 1;\n byte >>= 1;\n }\n return bools.reverse();\n }\n\n private ledMatrixToView(matrix: LedMatrix): DataView {\n const view = new DataView(new ArrayBuffer(5));\n for (let i = 0; i < 5; i ++) {\n view.setUint8(i, this.boolArrayToByte(matrix[i]));\n }\n return view;\n }\n\n private boolArrayToByte(bools: boolean[]): number {\n return bools.reduce((byte, bool) => byte << 1 | (bool ? 1 : 0), 0);\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { TypedDispatcher, EventDispatcher } from \"../event-dispatcher\";\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum TemperatureCharacteristic {\n temperature = \"e95d9250-251d-470a-a062-fa1922dfa9a8\",\n temperaturePeriod = \"e95d1b25-251d-470a-a062-fa1922dfa9a8\"\n}\n\n/**\n * Events raised by the temperature service\n */\nexport interface TemperatureEvents {\n /**\n * @hidden\n */\n newListener: keyof TemperatureEvents;\n /**\n * @hidden\n */\n removeListener: keyof TemperatureEvents;\n /**\n * Temperature changed event\n */\n temperaturechanged: number;\n}\n\n/**\n * Temperature Service\n */\nexport class TemperatureService extends (EventDispatcher as new() => TypedDispatcher<TemperatureEvents>) {\n\n /**\n * @hidden\n */\n public static uuid = \"e95d6100-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<TemperatureService> {\n const bluetoothService = new TemperatureService(service);\n await bluetoothService.init();\n return bluetoothService;\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n super();\n this.helper = new ServiceHelper(service, this);\n }\n\n private async init() {\n await this.helper.handleListener(\"temperaturechanged\", TemperatureCharacteristic.temperature, this.temperatureChangedHandler.bind(this));\n }\n\n /**\n * Read temperature\n */\n public async readTemperature(): Promise<number> {\n const view = await this.helper.getCharacteristicValue(TemperatureCharacteristic.temperature);\n return view.getInt8(0);\n }\n\n /**\n * Get temperature sample period\n */\n public async getTemperaturePeriod(): Promise<number> {\n const view = await this.helper.getCharacteristicValue(TemperatureCharacteristic.temperaturePeriod);\n return view.getUint16(0, true);\n }\n\n /**\n * Set temperature sample period\n * @param frequency The frequency to use (milliseconds)\n */\n public async setTemperaturePeriod(frequency: number): Promise<void> {\n const view = new DataView(new ArrayBuffer(2));\n view.setUint16(0, frequency, true);\n return await this.helper.setCharacteristicValue(TemperatureCharacteristic.temperaturePeriod, view);\n }\n\n private temperatureChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n this.dispatchEvent(\"temperaturechanged\", view.getInt8(0));\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { EventDispatcher, TypedDispatcher } from \"../event-dispatcher\";\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum AccelerometerCharacteristic {\n accelerometerData = \"e95dca4b-251d-470a-a062-fa1922dfa9a8\",\n accelerometerPeriod = \"e95dfb24-251d-470a-a062-fa1922dfa9a8\"\n}\n\n/**\n * Data received from the accelerometer\n */\nexport interface AccelerometerData {\n /**\n * Force in direction X\n */\n x: number;\n /**\n * Force in direction Y\n */\n y: number;\n /**\n * Force in direction Z\n */\n z: number;\n}\n\n/**\n * The sample period to read accelerometer data (milliseconds)\n */\nexport type AccelerometerPeriod = 1 | 2 | 5 | 10 | 20 | 80 | 160 | 640;\n\n/**\n * Events raised by the accelerometer service\n */\nexport interface AccelerometerEvents {\n /**\n * @hidden\n */\n newListener: keyof AccelerometerEvents;\n /**\n * @hidden\n */\n removeListener: keyof AccelerometerEvents;\n /**\n * Accelerometer data changed event\n */\n accelerometerdatachanged: AccelerometerData;\n}\n\n/**\n * Accelerometer Service\n */\nexport class AccelerometerService extends (EventDispatcher as new() => TypedDispatcher<AccelerometerEvents>) {\n\n /**\n * @hidden\n */\n public static uuid = \"e95d0753-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<AccelerometerService> {\n const bluetoothService = new AccelerometerService(service);\n await bluetoothService.init();\n return bluetoothService;\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n super();\n this.helper = new ServiceHelper(service, this);\n }\n\n private async init() {\n await this.helper.handleListener(\"accelerometerdatachanged\", AccelerometerCharacteristic.accelerometerData, this.accelerometerDataChangedHandler.bind(this));\n }\n\n /**\n * Read acceleromter data\n */\n public async readAccelerometerData(): Promise<AccelerometerData> {\n const view = await this.helper.getCharacteristicValue(AccelerometerCharacteristic.accelerometerData);\n return this.dataViewToAccelerometerData(view);\n }\n\n /**\n * Get accelerometer sample period\n */\n public async getAccelerometerPeriod(): Promise<AccelerometerPeriod> {\n const view = await this.helper.getCharacteristicValue(AccelerometerCharacteristic.accelerometerPeriod);\n return view.getUint16(0, true) as AccelerometerPeriod;\n }\n\n /**\n * Set accelerometer sample period\n * @param frequency The frequency interval to use\n */\n public async setAccelerometerPeriod(frequency: AccelerometerPeriod): Promise<void> {\n const view = new DataView(new ArrayBuffer(2));\n view.setUint16(0, frequency, true);\n return this.helper.setCharacteristicValue(AccelerometerCharacteristic.accelerometerPeriod, view);\n }\n\n private accelerometerDataChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n const value = this.dataViewToAccelerometerData(view);\n this.dispatchEvent(\"accelerometerdatachanged\", value);\n }\n\n private dataViewToAccelerometerData(view: DataView): AccelerometerData {\n return {\n x: view.getInt16(0, true) / 1000.0,\n y: view.getInt16(2, true) / 1000.0,\n z: view.getInt16(4, true) / 1000.0\n };\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { EventDispatcher, TypedDispatcher } from \"../event-dispatcher\";\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum MagnetometerCharacteristic {\n magnetometerData = \"e95dfb11-251d-470a-a062-fa1922dfa9a8\",\n magnetometerPeriod = \"e95d386c-251d-470a-a062-fa1922dfa9a8\",\n magnetometerBearing = \"e95d9715-251d-470a-a062-fa1922dfa9a8\",\n magnetometerCalibration = \"e95db358-251d-470a-a062-fa1922dfa9a8\"\n}\n\n/**\n * Data received from the magnetometer\n */\nexport interface MagnetometerData {\n /**\n * Force in direction X\n */\n x: number;\n /**\n * Force in direction Y\n */\n y: number;\n /**\n * Force in direction Z\n */\n z: number;\n}\n\n/**\n * Magnetometer calibation state\n */\nexport enum MagnetometerCalibration {\n /**\n * Unknown state\n */\n unknown = 0,\n /**\n * Calibration has been requestes\n */\n requested = 1,\n /**\n * Calibration completed\n */\n completed = 2,\n /**\n * Calibration had an error\n */\n errored = 3\n}\n\n/**\n * The sample period to read magnetometer data (milliseconds)\n */\nexport type MagnetometerPeriod = 1 | 2 | 5 | 10 | 20 | 80 | 160 | 640;\n\n/**\n * Events raised by the magnetometer service\n */\nexport interface MagnetometerEvents {\n /**\n * @hidden\n */\n newListener: keyof MagnetometerEvents;\n /**\n * @hidden\n */\n removeListener: keyof MagnetometerEvents;\n /**\n * Magnetometer data changed event\n */\n magnetometerdatachanged: MagnetometerData;\n /**\n * Magnetometer bearing changed event\n */\n magnetometerbearingchanged: number;\n /**\n * Magnetometer calibration changed event\n */\n magnetometercalibrationchanged: MagnetometerCalibration;\n}\n\n/**\n * Magnetometer Service\n */\nexport class MagnetometerService extends (EventDispatcher as new() => TypedDispatcher<MagnetometerEvents>) {\n\n /**\n * @hidden\n */\n public static uuid = \"e95df2d8-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<MagnetometerService> {\n const bluetoothService = new MagnetometerService(service);\n await bluetoothService.init();\n return bluetoothService;\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n super();\n this.helper = new ServiceHelper(service, this);\n }\n\n private async init() {\n await this.helper.handleListener(\"magnetometerdatachanged\", MagnetometerCharacteristic.magnetometerData, this.magnetometerDataChangedHandler.bind(this));\n await this.helper.handleListener(\"magnetometerbearingchanged\", MagnetometerCharacteristic.magnetometerBearing, this.magnetometerBearingChangedHandler.bind(this));\n await this.helper.handleListener(\"magnetometercalibrationchanged\", MagnetometerCharacteristic.magnetometerCalibration, this.magnetometerCalibrationChangedHandler.bind(this));\n }\n\n /**\n * Request magnetometer calibration\n */\n public async calibrate() {\n return this.helper.setCharacteristicValue(MagnetometerCharacteristic.magnetometerCalibration, new Uint8Array([1]));\n }\n\n /**\n * Read magnetometer data\n */\n public async readMagnetometerData(): Promise<MagnetometerData> {\n const view = await this.helper.getCharacteristicValue(MagnetometerCharacteristic.magnetometerData);\n return this.dataViewToMagnetometerData(view);\n }\n\n /**\n * Read magnetometer bearing\n */\n public async readMagnetometerBearing(): Promise<number | undefined> {\n const view = await this.helper.getCharacteristicValue(MagnetometerCharacteristic.magnetometerBearing);\n if (view.byteLength === 2) {\n return view.getUint16(0, true);\n }\n return undefined;\n }\n\n /**\n * Get magnetometer sample period\n */\n public async getMagnetometerPeriod(): Promise<MagnetometerPeriod> {\n const view = await this.helper.getCharacteristicValue(MagnetometerCharacteristic.magnetometerPeriod);\n return view.getUint16(0, true) as MagnetometerPeriod;\n }\n\n /**\n * Set magnetometer sample period\n * @param frequency The frequency interval to use\n */\n public async setMagnetometerPeriod(frequency: MagnetometerPeriod): Promise<void> {\n const view = new DataView(new ArrayBuffer(2));\n view.setUint16(0, frequency, true);\n return this.helper.setCharacteristicValue(MagnetometerCharacteristic.magnetometerPeriod, view);\n }\n\n private magnetometerDataChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n const value = this.dataViewToMagnetometerData(view);\n this.dispatchEvent(\"magnetometerdatachanged\", value);\n }\n\n private magnetometerBearingChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n if (view.byteLength === 2) {\n this.dispatchEvent(\"magnetometerbearingchanged\", view.getUint16(0, true));\n }\n }\n\n private magnetometerCalibrationChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n if (view.byteLength === 1) {\n this.dispatchEvent(\"magnetometercalibrationchanged\", view.getUint8(0) as MagnetometerCalibration);\n }\n }\n\n private dataViewToMagnetometerData(view: DataView): MagnetometerData {\n return {\n x: view.getInt16(0, true),\n y: view.getInt16(1, true),\n z: view.getInt16(2, true)\n };\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { ServiceHelper } from \"../service-helper\";\nimport { EventDispatcher, TypedDispatcher } from \"../event-dispatcher\";\n\n/**\n * @hidden\n */\nexport enum IoPinCharacteristic {\n pinData = \"e95d8d00-251d-470a-a062-fa1922dfa9a8\",\n pinAdConfiguration = \"e95d5899-251d-470a-a062-fa1922dfa9a8\",\n pinIoConfiguration = \"e95db9fe-251d-470a-a062-fa1922dfa9a8\",\n pwmControl = \"e95dd822-251d-470a-a062-fa1922dfa9a8\"\n}\n\nconst littleEndian = true;\n\n/**\n * Pin data\n */\nexport interface PinData {\n /**\n * Pin number\n */\n pin: number;\n /**\n * Pin value\n */\n value: number;\n}\n\n/**\n * PWM control data\n */\nexport interface PwmControlData {\n /**\n * Pin number\n */\n pin: number;\n /**\n * Pin value\n */\n value: number;\n /**\n * Period (in microseconds)\n */\n period: number;\n}\n\n/**\n * Analogue/Digital Enum\n */\nexport enum AD {\n Digital = 0,\n Analogue = 1\n}\n\n/**\n * Input/Output Enum\n */\nexport enum IO {\n Output = 0,\n Input = 1\n}\n\n/**\n * Events raised by the magnetometer service\n */\nexport interface IoPinEvents {\n /**\n * @hidden\n */\n newListener: keyof IoPinEvents;\n /**\n * @hidden\n */\n removeListener: keyof IoPinEvents;\n /**\n * Pin data changed event\n */\n pindatachanged: PinData[];\n}\n\n/**\n * @hidden\n */\nexport class IoPinService extends (EventDispatcher as new() => TypedDispatcher<IoPinEvents>) {\n\n /**\n * @hidden\n */\n public static uuid = \"e95d127b-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<IoPinService> {\n const bluetoothService = new IoPinService(service);\n await bluetoothService.init();\n return bluetoothService;\n }\n\n /**\n * @hidden\n */\n public helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n super();\n this.helper = new ServiceHelper(service, this);\n }\n\n private async init() {\n await this.helper.handleListener(\"pindatachanged\", IoPinCharacteristic.pinData, this.pinDataChangedHandler.bind(this));\n }\n\n /**\n * Read pin data\n */\n public async readPinData(): Promise<PinData[]> {\n const view = await this.helper.getCharacteristicValue(IoPinCharacteristic.pinData);\n return this.dataViewToPinData(view);\n }\n\n /**\n * Write pin data\n * @param data The pin data to write\n */\n public async writePinData(data: PinData[]): Promise<void> {\n const view = this.pinDataToDataView(data);\n return this.helper.setCharacteristicValue(IoPinCharacteristic.pinData, view);\n }\n\n /**\n * Get pin analogue/digital configuration\n */\n public async getAdConfiguration(): Promise<AD[]> {\n const view = await this.helper.getCharacteristicValue(IoPinCharacteristic.pinAdConfiguration);\n return this.dataViewToConfig(view);\n }\n\n /**\n * Set pin analogue/digital configuration\n * @param config The analogue/digital configuration to set\n */\n public async setAdConfiguration(config: AD[]): Promise<void> {\n const view = this.configToDataView(config);\n return this.helper.setCharacteristicValue(IoPinCharacteristic.pinAdConfiguration, view);\n }\n\n /**\n * Get pin input/output configuration\n */\n public async getIoConfiguration(): Promise<IO[]> {\n const view = await this.helper.getCharacteristicValue(IoPinCharacteristic.pinIoConfiguration);\n return this.dataViewToConfig(view);\n }\n\n /**\n * Set pin input/output configuration\n * @param config The input/output configuration to set\n */\n public async setIoConfiguration(config: IO[]): Promise<void> {\n const view = this.configToDataView(config);\n return this.helper.setCharacteristicValue(IoPinCharacteristic.pinIoConfiguration, view);\n }\n\n /**\n * Set pin PWM control\n * @param data The PWM control data to set\n */\n public async setPwmControl(data: PwmControlData): Promise<void> {\n const view = this.pwmControlDataToDataView(data);\n return this.helper.setCharacteristicValue(IoPinCharacteristic.pwmControl, view);\n }\n\n private pinDataChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n const value = this.dataViewToPinData(view);\n this.dispatchEvent(\"pindatachanged\", value);\n }\n\n private dataViewToPinData(view: DataView): PinData[] {\n const data = [];\n for (let i = 0; i < view.byteLength; i += 2) {\n data.push({\n pin: view.getUint8(i),\n value: view.getUint8(i + 1)\n });\n }\n return data;\n }\n\n private pinDataToDataView(data: PinData[]): DataView {\n const view = new DataView(new ArrayBuffer(data.length * 2));\n data.forEach((pinData, index) => {\n view.setUint8(index * 2, pinData.pin);\n view.setUint8(index * 2 + 1, pinData.value);\n });\n return view;\n }\n\n private dataViewToConfig(view: DataView): number[] {\n const result: number[] = [];\n const value = (view.getUint16(0) << 8) + view.getUint8(2);\n\n for (let i = 0; i < 24; i++) {\n result.push(value >> i);\n }\n\n return result;\n }\n\n private configToDataView(config: number[]): DataView {\n const view = new DataView(new ArrayBuffer(3));\n let value = 0;\n\n // tslint:disable-next-line:prefer-for-of\n for (let i = 0; i < config.length; i++) {\n value &= 1 << config[i];\n }\n\n view.setUint16(0, value >> 8, littleEndian);\n view.setUint8(2, value & 0xff);\n return view;\n }\n\n private pwmControlDataToDataView(data: PwmControlData): DataView {\n const view = new DataView(new ArrayBuffer(7));\n view.setUint8(0, data.pin);\n view.setUint16(1, data.value, littleEndian);\n view.setUint32(3, data.period, littleEndian);\n return view;\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { EventDispatcher, TypedDispatcher } from \"../event-dispatcher\";\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum UartCharacteristic {\n tx = \"6e400002-b5a3-f393-e0a9-e50e24dcca9e\",\n rx = \"6e400003-b5a3-f393-e0a9-e50e24dcca9e\"\n}\n\n/**\n * Events raised by the UART service\n */\nexport interface UartEvents {\n /**\n * @hidden\n */\n newListener: keyof UartEvents;\n /**\n * @hidden\n */\n removeListener: keyof UartEvents;\n /**\n * Serial data received event\n */\n receive: Uint8Array;\n /**\n * Serial received text event\n */\n receiveText: string;\n}\n\n/**\n * UART Service\n */\nexport class UartService extends (EventDispatcher as new() => TypedDispatcher<UartEvents>) {\n\n /**\n * @hidden\n */\n public static uuid = \"6e400001-b5a3-f393-e0a9-e50e24dcca9e\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<UartService> {\n const bluetoothService = new UartService(service);\n await bluetoothService.init();\n return bluetoothService;\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n super();\n this.helper = new ServiceHelper(service, this);\n }\n\n private async init() {\n await this.helper.handleListener(\"receive\", UartCharacteristic.tx, this.receiveHandler.bind(this));\n await this.helper.handleListener(\"receiveText\", UartCharacteristic.tx, this.receiveTextHandler.bind(this));\n }\n\n /**\n * Send serial data\n * @param value The buffer to send\n */\n public async send(value: BufferSource): Promise<void> {\n return this.helper.setCharacteristicValue(UartCharacteristic.rx, value);\n }\n\n /**\n * Send serial text\n * @param value The text to send\n */\n public async sendText(value: string): Promise<void> {\n const arrayData = value.split(\"\").map((e: string) => e.charCodeAt(0));\n return this.helper.setCharacteristicValue(UartCharacteristic.rx, new Uint8Array(arrayData).buffer);\n }\n\n private receiveHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n const value = new Uint8Array(view.buffer);\n this.dispatchEvent(\"receive\", value);\n }\n\n private receiveTextHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n const numberArray = Array.prototype.slice.call(new Uint8Array(view.buffer));\n const value = String.fromCharCode.apply(null, numberArray);\n this.dispatchEvent(\"receiveText\", value);\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { EventDispatcher, TypedDispatcher } from \"../event-dispatcher\";\nimport { ServiceHelper } from \"../service-helper\";\n\n/**\n * @hidden\n */\nexport enum EventCharacteristic {\n microBitRequirements = \"e95db84c-251d-470a-a062-fa1922dfa9a8\",\n microBitEvent = \"e95d9775-251d-470a-a062-fa1922dfa9a8\",\n clientRequirements = \"e95d23c4-251d-470a-a062-fa1922dfa9a8\",\n clientEvent = \"e95d5404-251d-470a-a062-fa1922dfa9a8\"\n}\n\n/**\n * micro:bit event\n */\nexport interface MicrobitEvent {\n /**\n * The type of event\n */\n type: number;\n /**\n * The value for the event\n */\n value: number;\n}\n\n/**\n * Events raised by the event service\n */\nexport interface MicrobitEvents {\n /**\n * @hidden\n */\n newListener: keyof MicrobitEvents;\n /**\n * @hidden\n */\n removeListener: keyof MicrobitEvents;\n /**\n * micro:bit requirements changed event\n */\n microbitrequirementschanged: MicrobitEvent;\n /**\n * micro:bit event event\n */\n microbitevent: MicrobitEvent;\n}\n\n/**\n * Event Service\n */\nexport class EventService extends (EventDispatcher as new() => TypedDispatcher<MicrobitEvents>) {\n\n /**\n * @hidden\n */\n public static uuid = \"e95d93af-251d-470a-a062-fa1922dfa9a8\";\n\n /**\n * @hidden\n */\n public static async create(service: BluetoothRemoteGATTService): Promise<EventService> {\n const bluetoothService = new EventService(service);\n await bluetoothService.init();\n return bluetoothService;\n }\n\n private helper: ServiceHelper;\n\n /**\n * @hidden\n */\n constructor(service: BluetoothRemoteGATTService) {\n super();\n this.helper = new ServiceHelper(service, this);\n }\n\n private async init() {\n await this.helper.handleListener(\"microbitevent\", EventCharacteristic.microBitEvent, this.eventHandler.bind(this));\n await this.helper.handleListener(\"microbitrequirementschanged\", EventCharacteristic.microBitRequirements, this.microbitRequirementsChangedHandler.bind(this));\n }\n\n /**\n * Get micro:bit event requirements\n */\n public async getMicrobitRequirements(): Promise<MicrobitEvent> {\n const view = await this.helper.getCharacteristicValue(EventCharacteristic.microBitRequirements);\n return this.viewToMicrobitEvent(view);\n }\n\n /**\n * Set client event requirements\n * @param type The type of event to set\n * @param value The value to set\n */\n public async setClientRequirements(type: number, value: number): Promise<void> {\n const view = new DataView(new ArrayBuffer(4));\n view.setUint16(0, type, true);\n view.setUint16(1, value, true);\n return await this.helper.setCharacteristicValue(EventCharacteristic.clientRequirements, view);\n }\n\n /**\n * Read micro:bit event\n */\n public async readMicrobitEvent(): Promise<MicrobitEvent> {\n const view = await this.helper.getCharacteristicValue(EventCharacteristic.microBitEvent);\n return this.viewToMicrobitEvent(view);\n }\n\n /**\n * Write client event\n * @param type The event type\n * @param value The event value\n */\n public async writeClientEvent(type: number, value: number): Promise<void> {\n const view = new DataView(new ArrayBuffer(4));\n view.setUint16(0, type, true);\n view.setUint16(1, value, true);\n return await this.helper.setCharacteristicValue(EventCharacteristic.clientEvent, view);\n }\n\n private microbitRequirementsChangedHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n const microbitEvent = this.viewToMicrobitEvent(view);\n this.dispatchEvent(\"microbitrequirementschanged\", microbitEvent);\n }\n\n private eventHandler(event: Event) {\n const view = (event.target as BluetoothRemoteGATTCharacteristic).value!;\n const microbitEvent = this.viewToMicrobitEvent(view);\n this.dispatchEvent(\"microbitevent\", microbitEvent);\n }\n\n private viewToMicrobitEvent(view: DataView): MicrobitEvent {\n const type = view.getUint16(0, true);\n const value = view.getUint16(1, true);\n return {\n type,\n value\n };\n }\n}\n","/*\n* micro:bit Web Bluetooth\n* Copyright (c) 2019 Rob Moran\n*\n* The MIT License (MIT)\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.\n*/\n\nimport { DeviceInformationService } from \"./services/device-information\";\nimport { ButtonService } from \"./services/button\";\nimport { LedService } from \"./services/led\";\nimport { TemperatureService } from \"./services/temperature\";\nimport { AccelerometerService } from \"./services/accelerometer\";\nimport { MagnetometerService } from \"./services/magnetometer\";\nimport { IoPinService } from \"./services/io-pin\";\nimport { UartService } from \"./services/uart\";\nimport { EventService } from \"./services/event\";\nimport { DfuControlService } from \"./services/dfu-control\";\n\nexport interface Services {\n deviceInformationService?: DeviceInformationService;\n buttonService?: ButtonService;\n ledService?: LedService;\n temperatureService?: TemperatureService;\n accelerometerService?: AccelerometerService;\n magnetometerService?: MagnetometerService;\n uartService?: UartService;\n eventService?: EventService;\n dfuControlService?: DfuControlService;\n ioPinService?: IoPinService;\n}\n\n/**\n * @hidden\n */\ninterface Service {\n uuid: BluetoothCharacteristicUUID;\n create(service: BluetoothRemoteGATTService): Promise<any>;\n}\n\n/**\n * @hidden\n */\nclass ServiceBuilder {\n\n constructor(private services: BluetoothRemoteGATTService[]) {\n }\n\n public async createService<T>(serviceClass: (new (service: BluetoothRemoteGATTService) => T) & Service): Promise<T | undefined> {\n const found = this.services.find(service => service.uuid === serviceClass.uuid);\n\n if (!found) {\n return undefined;\n }\n\n return await serviceClass.create(found);\n }\n}\n\nexport const requestMicrobit = async (bluetooth: Bluetooth): Promise<BluetoothDevice | undefined> => {\n const device = await bluetooth.requestDevice({\n filters: [\n {\n namePrefix: \"BBC micro:bit\"\n }\n ],\n optionalServices: [\n DeviceInformationService.uuid,\n ButtonService.uuid,\n LedService.uuid,\n TemperatureService.uuid,\n AccelerometerService.uuid,\n MagnetometerService.uuid,\n IoPinService.uuid,\n UartService.uuid,\n EventService.uuid,\n DfuControlService.uuid\n ]\n });\n\n return device;\n};\n\nexport const getServices = async (device: BluetoothDevice): Promise<Services> => {\n if (!device || !device.gatt) {\n return {};\n }\n\n if (!device.gatt.connected) {\n await device.gatt.connect();\n }\n\n const services = await device.gatt.getPrimaryServices();\n const builder = new ServiceBuilder(services);\n\n const deviceInformationService = await builder.createService(DeviceInformationService);\n const buttonService = await builder.createService(ButtonService);\n const ledService = await builder.createService(LedService);\n const temperatureService = await builder.createService(TemperatureService);\n const accelerometerService = await builder.createService(AccelerometerService);\n const magnetometerService = await builder.createService(MagnetometerService);\n const uartService = await builder.createService(UartService);\n const eventService = await builder.createService(EventService);\n const dfuControlService = await builder.createService(DfuControlService);\n const ioPinService = await builder.createService(IoPinService);\n\n return {\n deviceInformationService,\n buttonService,\n ledService,\n temperatureService,\n accelerometerService,\n magnetometerService,\n uartService,\n eventService,\n dfuControlService,\n ioPinService\n };\n};\n","let waiting_timer = undefined;\nlet notif_queue = [];\n\nfunction notif(notif_c) {\n let notification_area = document.querySelector(\".statusline .notification-area\");\n\n if ((notification_area.querySelector(\".notification\") === null) && (waiting_timer === undefined)) {\n // This is just so no notifications will be played and disappears while the full screen landscape warning is in the way.\n if( (screen.availHeight > screen.availWidth) && (!document.body.classList.contains(\"ignore-landscape-warning\"))){\n waiting_timer = setInterval(() => {\n if( (screen.availHeight < screen.availWidth) || (document.body.classList.contains(\"ignore-landscape-warning\"))){\n clearInterval(waiting_timer);\n waiting_timer = undefined;\n notif(notif_queue.pop());\n }\n }, 1000);\n notif_queue.push(notif_c);\n return;\n }\n\n let notif_elem = document.createElement(\"div\");\n notif_elem.className = \"notification\";\n notif_elem.appendChild(notif_c[0]);\n notif_elem.appendChild(notif_c[1]);\n\n notification_area.appendChild(notif_elem);\n\n setTimeout(() => {\n notification_area.removeChild(notif_elem);\n if (notif_queue.length > 0) {\n notif(notif_queue.pop());\n }\n }, 5000);\n } else {\n notif_queue.push(notif_c);\n }\n}\n\nexport function notif_alert(alert_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = alert_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"alert fas fa-exclamation-triangle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_warn(alert_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = alert_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"warning fas fa-exclamation-triangle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_info(info_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = info_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"info fas fa-info-circle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_success(success_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = success_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"success fas fa-check-circle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n","import { notif_alert, notif_warn, notif_info, notif_success } from './notification';\n\nexport default class hoverControlModule {\n #throttle = 0;\n #throttleAcc = 0;\n #rudder = 0;\n #rudderAcc = 0;\n #arm = 0;\n #armAcc = 0;\n\n constructor() {}\n\n acc(accString) {\n accString.match(/[A-Z][-,0-9]+/g).forEach((item, i) => {\n switch (item.substring(0, 1)) {\n case \"T\":\n this.#throttleAcc = parseInt(item.substring(1, item.length));\n break;\n case \"R\":\n this.#rudderAcc = parseInt(item.substring(1, item.length));\n break;\n case \"A\":\n this.#armAcc = parseInt(item.substring(1, item.length)) == 1;\n if (this.#armAcc) {\n document.body.classList.add(\"armed\");\n } else {\n document.body.classList.remove(\"armed\");\n }\n break;\n case \"S\":\n break;\n default:\n console.log(`Unkown acc: ${item}`);\n }\n });\n document.querySelector(\".acc-string pre\").innerHTML = `T: ${this.#throttleAcc}, R: ${this.#rudderAcc}`;\n }\n\n reset() {\n this.setArm(0);\n this.setThrottle(0);\n this.setRudder(0);\n }\n\n setThrottle(throttle) {\n if (!this.#armAcc) { return; }\n if (throttle > 100) { throttle = 100; }\n if (throttle < 0) { throttle = 0; }\n this.#throttle = throttle;\n }\n getThrottle() {\n return this.#throttle;\n }\n\n setRudder(rudder) {\n if (!this.#armAcc) { return; }\n if (rudder > 90) { rudder = 90; }\n if (rudder < -90) { rudder = -90; }\n this.#rudder = rudder;\n }\n getRudder() {\n return this.#rudder;\n }\n\n setArm(arm) {\n this.#arm = arm;\n if (!this.#arm) {\n this.#throttle = 0;\n this.#rudder = 0;\n }\n }\n getArm() {\n return this.#arm;\n }\n}\n","import nipplejs from 'nipplejs';\nimport { requestMicrobit, getServices } from 'microbit-web-bluetooth';\nimport hoverControlModule from './hoverControlModule';\nimport { notif_alert, notif_warn, notif_info, notif_success } from './notification';\n\nlet sw = \"service-worker.js\";\nif (navigator.serviceWorker) {\n navigator.serviceWorker.register(\n sw, {scope: '/hoverbit-ble/'}\n ).then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) { return; }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n notif_info(\"New content is available, relaunch the app to install it.\");\n } else {\n notif_success(\"Content is cached for offline use.\");\n }\n }\n };\n };\n registration.update();\n }).catch(error => {\n notif_alert(\"Could not install service worker...\");\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\ndocument.getElementById(\"btn_ignore_landscape_warning\").addEventListener(\"click\", () => {\n document.body.classList.add(\"ignore-landscape-warning\");\n});\n\n/* Define and initialize things */\nlet hoverControl = new hoverControlModule();\nlet bluetoothDevice;\nlet bluetoothDeviceServices;\n\nlet joystickLeft = nipplejs.create({\n zone: document.querySelector(\".joystick-left\"),\n size: 200,\n position: {left: '50%', bottom: '50%'},\n mode: \"static\",\n lockX: true\n});\nlet joystickRight = nipplejs.create({\n zone: document.querySelector(\".joystick-right\"),\n size: 200,\n position: {left: '50%', bottom: '50%'},\n mode: \"static\",\n lockY: true\n});\n\n/* Setup event_listeners */\njoystickLeft.on(\"move\", (evt, data) => {\n let rudder = ((data.distance * 90) / 100);\n if (data.angle.degree > 90) { rudder = rudder * -1; }\n hoverControl.setRudder(rudder);\n});\njoystickLeft.on(\"end\", (evt, data) => {\n hoverControl.setRudder(0);\n});\n\njoystickRight.on(\"move\", (evt, data) => {\n let throttle = data.distance;\n\n if (data.angle.degree > 90) {\n throttle = 0;\n if (data.distance >= 100) {\n hoverControl.reset();\n if (hoverControl.getArm()) {\n notif_alert(\"Detected panicy reducing of throttle, dearming...\");\n }\n }\n }\n hoverControl.setThrottle(throttle);\n});\njoystickRight.on(\"end\", (evt, data) => {\n hoverControl.setThrottle(0);\n});\n\ndocument.getElementById(\"btn_arm\").addEventListener(\"click\", () => {\n hoverControl.setArm(true);\n});\n\ndocument.getElementById(\"btn_disarm\").addEventListener(\"click\", () => {\n hoverControl.setArm(false);\n});\n\ndocument.querySelector(\"#btn_disconnect\").addEventListener(\"click\", () => {\n hoverControl.reset();\n bluetoothDevice.gatt.disconnect();\n});\n\nlet intervalConnectionChecker = setInterval(() => {\n if (bluetoothDevice !== undefined && bluetoothDevice) {\n if (bluetoothDevice.gatt.connected) {\n document.body.classList.add(\"connected\");\n } else {\n document.body.classList.remove(\"connected\");\n document.body.classList.remove(\"armed\");\n }\n } else if (bluetoothDevice !== undefined) {\n bluetoothDevice.gatt.reconnect();\n }\n}, 500);\n\nlet intervalSendCommands = setInterval(async() => {\n if (bluetoothDevice !== undefined && bluetoothDevice) {\n if (bluetoothDevice.gatt.connected && bluetoothDeviceServices.uartService) {\n let command =\n \"T\" + hoverControl.getThrottle().toString() +\n \"R\" + hoverControl.getRudder().toString() +\n \"A\" + (hoverControl.getArm() ? \"1\" : \"0\") +\n \"S0\" +\n \":\";\n await bluetoothDeviceServices.uartService.sendText(command);\n }\n }\n}, 70);\n\nfunction receiveText(event) {\n /* Just make the ping symbol reappear. */\n var elm = document.querySelector(\".ping i\");\n var newone = elm.cloneNode(true);\n elm.parentNode.replaceChild(newone, elm);\n\n /* Actually handle received text. */\n if ((event.detail).indexOf(\":\") != -1) {\n let parts = (event.detail).split(\":\");\n\n if (parts[0] == \"B\") {\n document.querySelector(\".battery-status\").innerHTML = parts[1] + \"mV\";\n } else if (parts[0] == \"ACC\") {\n hoverControl.acc(parts[1]);\n } else {\n console.log(parts);\n }\n } else {\n notif_warn(\"Received weird data from MICRO:BIT...\");\n console.log(`Received unknown: ${event.detail}`);\n }\n}\n\ndocument.getElementById(\"btn_connect\").onclick = async () => {\n if (bluetoothDevice !== undefined && bluetoothDevice.gatt.connected) {\n bluetoothDevice.disconnect();\n }\n\n const device = await requestMicrobit(window.navigator.bluetooth);\n bluetoothDevice = device;\n\n if (device) {\n hoverControl.reset();\n const services = await getServices(device);\n bluetoothDeviceServices = services;\n\n if (bluetoothDeviceServices.deviceInformationService) {\n // logJson(await services.deviceInformationService.readDeviceInformation());\n }\n\n if (services.uartService) {\n services.uartService.addEventListener(\"receiveText\", receiveText);\n }\n }\n}\n"]}
|