UNPKG

@openhps/web-sensors

Version:

Open Hybrid Positioning System - Web Sensors API

2 lines 6.36 kB
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@openhps/core")):"function"==typeof define&&define.amd?define("OpenHPS",["core"],t):"object"==typeof exports?exports.OpenHPS=t(require("@openhps/core")):(e.OpenHPS=e.OpenHPS||{},e.OpenHPS.sensors=t(e.OpenHPS.core))}("undefined"!=typeof self?self:this,e=>(()=>{"use strict";var t={556:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SensorSourceNode=void 0;const o=r(955);class SensorSourceNode extends o.SourceNode{constructor(e){var t;super(e),this.options.source=null!==(t=this.options.source)&&void 0!==t?t:new o.DataObject(this.uid),this.options.autoStart&&this.once("build",this.start.bind(this)),this.once("destroy",this.stop.bind(this))}static requestPermissions(...e){return"function"==typeof DeviceMotionEvent.requestPermission?DeviceMotionEvent.requestPermission().then(e=>{if("granted"!==e)return Promise.reject(new Error("Permission to access device motion was denied."))}):Promise.resolve()}start(){return new Promise(e=>{const t=this.source?this.source.uid:this.uid;window.addEventListener("devicemotion",e=>{const r=new o.DataFrame,n=1e3/e.interval;r.addSensor(new o.Accelerometer(t+"_accl",new o.Acceleration(e.accelerationIncludingGravity.x,e.accelerationIncludingGravity.y,e.accelerationIncludingGravity.z,o.AccelerationUnit.METER_PER_SECOND_SQUARE),n)),r.addSensor(new o.Gyroscope(t+"_gyro",new o.AngularVelocity(e.rotationRate.beta,e.rotationRate.gamma,e.rotationRate.alpha,o.AngularVelocityUnit.RADIAN_PER_SECOND),n)),r.addSensor(new o.Accelerometer(t+"_linearaccl",new o.Acceleration(e.acceleration.x,e.acceleration.y,e.acceleration.z,o.AccelerationUnit.METER_PER_SECOND_SQUARE),n));const s=this.source;s.getPosition().angularVelocity=r.getSensor(o.Gyroscope).value,r.addSensor(new o.AbsoluteOrientationSensor(t+"_orientation",s.getPosition().orientation)),r.source=s,this.push(r)},!0),window.addEventListener("deviceorientation",e=>{this.source.getPosition().orientation=o.Orientation.fromEuler([e.beta,e.gamma,e.alpha])}),this.logger("debug","Browser orientation and motion events registered!"),e()})}stop(){return Promise.resolve()}onPull(){return new Promise(e=>{e(void 0)})}}t.SensorSourceNode=SensorSourceNode},655:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SensorSourceNode=void 0;const o=r(955);class SensorSourceNode extends o.SourceNode{constructor(e){super(e),this._subscriptions=new Map,this._values=new Map,this._lastPush=0,this._running=!1,this.options.interval=this.options.interval||100,this.options.autoStart&&this.once("build",this.start.bind(this)),this.once("destroy",this.stop.bind(this))}static checkPermissions(e){return this.requestPermissions(e)}static requestPermissions(e){return new Promise((t,r)=>{if(void 0===navigator.permissions||void 0===e||0===e.length)return t(!0);Promise.all(e.map(e=>this.getPermissions(e).map(e=>navigator.permissions.query({name:e}))).reduce((e,t)=>[...e,...t])).then(e=>{e.every(e=>"granted"===e.state)?t(!0):t(!1)}).catch(r)})}requestPermissions(){return SensorSourceNode.requestPermissions(this.options.sensors)}start(){return new Promise(e=>{if(this._running=!0,this._subscriptions.size>0)return e();this.options.sensors.forEach(e=>{const t=this.findSensor(e);if(void 0===t)return;const r=new t({frequency:Math.round(1e3/this.options.interval)});r.addEventListener("reading",t=>{this._running&&(this._values.set(e,t.target),this._isUpdated()&&(this._lastPush=t.timeStamp,this.createFrame().catch(e=>{this.logger("error","Unable to create sensor data frame!",e)})))}),r.start(),this._subscriptions.set(e,r)}),e()})}_isUpdated(){return Array.from(this._values.values()).filter(e=>e.timestamp>this._lastPush).length===Array.from(this._subscriptions.values()).filter(e=>e.activated).length}stop(){return new Promise(e=>{this.options.softStop?this._running=!1:(this._subscriptions.forEach(e=>e.stop()),this._subscriptions=new Map,this._values=new Map),e()})}createFrame(){return new Promise(e=>{const t=new o.DataFrame;t.source=this.source;const r=this._values.get(o.Accelerometer),n=this._values.get(o.LinearAccelerationSensor),s=this._values.get(o.Gyroscope),i=this._values.get(o.AbsoluteOrientationSensor),a=this._values.get(o.RelativeOrientationSensor),c=this._values.get(o.Magnetometer),u=this.source?this.source.uid:this.uid,l=1e3/this.options.interval;r&&t.addSensor(new o.Accelerometer(u+"_accel",new o.Acceleration(r.x,r.y,r.z,o.AccelerationUnit.METER_PER_SECOND_SQUARE),l)),n&&t.addSensor(new o.LinearAccelerationSensor(u+"_linearaccel",new o.Acceleration(n.x,n.y,n.z,o.AccelerationUnit.METER_PER_SECOND_SQUARE),l)),s&&t.addSensor(new o.Gyroscope(u+"_gyro",new o.AngularVelocity(s.x,s.y,s.z,o.AngularVelocityUnit.RADIAN_PER_SECOND),l)),i&&t.addSensor(new o.AbsoluteOrientationSensor(u+"_absoluteorientation",o.Orientation.fromQuaternion(new o.Quaternion(...i.quaternion)),l)),a&&t.addSensor(new o.RelativeOrientationSensor(u+"_relativeorientation",o.Orientation.fromQuaternion(new o.Quaternion(...a.quaternion)),l)),c&&t.addSensor(new o.Magnetometer(u+"_mag",new o.Magnetism(c.x,c.y,c.z,o.MagnetismUnit.MICROTESLA),l)),this.push(t),e()})}onPull(){return new Promise(e=>{e(void 0)})}findSensor(e){switch(e){case o.RelativeOrientationSensor:return RelativeOrientationSensor;case o.AbsoluteOrientationSensor:return AbsoluteOrientationSensor;case o.LinearAccelerationSensor:return LinearAccelerationSensor;case o.Gyroscope:return Gyroscope;case o.Magnetometer:return window.Magnetometer;case o.Accelerometer:return Accelerometer;default:return}}static getPermissions(e){switch(e){case o.RelativeOrientationSensor:case o.AbsoluteOrientationSensor:return["gyroscope","accelerometer","magnetometer"];case o.Gyroscope:return["gyroscope"];case o.Magnetometer:return["magnetometer"];case o.LinearAccelerationSensor:case o.Accelerometer:return["accelerometer"];default:return}}}t.SensorSourceNode=SensorSourceNode},955:t=>{t.exports=e}},r={};function o(e){var n=r[e];if(void 0!==n)return n.exports;var s=r[e]={exports:{}};return t[e](s,s.exports,o),s.exports}var n={};return(()=>{var e=n;Object.defineProperty(e,"__esModule",{value:!0}),e.SensorSourceNode=void 0;const t=o(655),r=o(556);let s=t.SensorSourceNode;e.SensorSourceNode=s,"Accelerometer"in window||(e.SensorSourceNode=s=r.SensorSourceNode)})(),n})()); //# sourceMappingURL=openhps-web-sensors.min.js.map