@openhps/web-sensors
Version:
Open Hybrid Positioning System - Web Sensors API
2 lines • 6.15 kB
JavaScript
import*as e from"./openhps-core.es.min.js";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},r={};t.d(r,{Z:()=>o});const n=(e=>{var r={};return t.d(r,e),r})({AbsoluteOrientationSensor:()=>e.AbsoluteOrientationSensor,Acceleration:()=>e.Acceleration,AccelerationUnit:()=>e.AccelerationUnit,Accelerometer:()=>e.Accelerometer,AngularVelocity:()=>e.AngularVelocity,AngularVelocityUnit:()=>e.AngularVelocityUnit,DataFrame:()=>e.DataFrame,DataObject:()=>e.DataObject,Gyroscope:()=>e.Gyroscope,LinearAccelerationSensor:()=>e.LinearAccelerationSensor,Magnetism:()=>e.Magnetism,MagnetismUnit:()=>e.MagnetismUnit,Magnetometer:()=>e.Magnetometer,Orientation:()=>e.Orientation,Quaternion:()=>e.Quaternion,RelativeOrientationSensor:()=>e.RelativeOrientationSensor,SourceNode:()=>e.SourceNode});class SensorSourceNode extends n.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)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 n.DataFrame;t.source=this.source;const r=this._values.get(n.Accelerometer),o=this._values.get(n.LinearAccelerationSensor),i=this._values.get(n.Gyroscope),s=this._values.get(n.AbsoluteOrientationSensor),a=this._values.get(n.RelativeOrientationSensor),c=this._values.get(n.Magnetometer),u=this.source?this.source.uid:this.uid,l=1e3/this.options.interval;r&&t.addSensor(new n.Accelerometer(u+"_accel",new n.Acceleration(r.x,r.y,r.z,n.AccelerationUnit.METER_PER_SECOND_SQUARE),l)),o&&t.addSensor(new n.LinearAccelerationSensor(u+"_linearaccel",new n.Acceleration(o.x,o.y,o.z,n.AccelerationUnit.METER_PER_SECOND_SQUARE),l)),i&&t.addSensor(new n.Gyroscope(u+"_gyro",new n.AngularVelocity(i.x,i.y,i.z,n.AngularVelocityUnit.RADIAN_PER_SECOND),l)),s&&t.addSensor(new n.AbsoluteOrientationSensor(u+"_absoluteorientation",n.Orientation.fromQuaternion(new n.Quaternion(...s.quaternion)),l)),a&&t.addSensor(new n.RelativeOrientationSensor(u+"_relativeorientation",n.Orientation.fromQuaternion(new n.Quaternion(...a.quaternion)),l)),c&&t.addSensor(new n.Magnetometer(u+"_mag",new n.Magnetism(c.x,c.y,c.z,n.MagnetismUnit.MICROTESLA),l)),this.push(t),e()}))}onPull(){return new Promise((e=>{e(void 0)}))}findSensor(e){switch(e){case n.RelativeOrientationSensor:return RelativeOrientationSensor;case n.AbsoluteOrientationSensor:return AbsoluteOrientationSensor;case n.LinearAccelerationSensor:return LinearAccelerationSensor;case n.Gyroscope:return Gyroscope;case n.Magnetometer:return window.Magnetometer;case n.Accelerometer:return Accelerometer;default:return}}static getPermissions(e){switch(e){case n.RelativeOrientationSensor:case n.AbsoluteOrientationSensor:return["gyroscope","accelerometer","magnetometer"];case n.Gyroscope:return["gyroscope"];case n.Magnetometer:return["magnetometer"];case n.LinearAccelerationSensor:case n.Accelerometer:return["accelerometer"];default:return}}}class SensorSourceNode_SensorSourceNode extends n.SourceNode{constructor(e){var t;super(e),this.options.source=null!==(t=this.options.source)&&void 0!==t?t:new n.DataObject(this.uid),this.options.autoStart&&this.once("build",this.start.bind(this)),this.once("destroy",this.stop.bind(this))}requestPermission(){return Promise.resolve()}start(){return new Promise((e=>{const t=this.source?this.source.uid:this.uid;window.addEventListener("devicemotion",(e=>{const r=new n.DataFrame,o=1e3/e.interval;r.addSensor(new n.Accelerometer(t+"_accl",new n.Acceleration(e.accelerationIncludingGravity.x,e.accelerationIncludingGravity.y,e.accelerationIncludingGravity.z,n.AccelerationUnit.METER_PER_SECOND_SQUARE),o)),r.addSensor(new n.Gyroscope(t+"_gyro",new n.AngularVelocity(e.rotationRate.beta,e.rotationRate.gamma,e.rotationRate.alpha,n.AngularVelocityUnit.RADIAN_PER_SECOND),o)),r.addSensor(new n.Accelerometer(t+"_linearaccl",new n.Acceleration(e.acceleration.x,e.acceleration.y,e.acceleration.z,n.AccelerationUnit.METER_PER_SECOND_SQUARE),o));const i=this.source;i.getPosition().angularVelocity=r.getSensor(n.Gyroscope).value,r.addSensor(new n.AbsoluteOrientationSensor(t+"_orientation",i.getPosition().orientation)),r.source=i,this.push(r)}),!0),window.addEventListener("deviceorientation",(e=>{this.source.getPosition().orientation=n.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)}))}}let o=SensorSourceNode;"Accelerometer"in window||(o=SensorSourceNode_SensorSourceNode);var i=r.Z;export{i as SensorSourceNode};
//# sourceMappingURL=openhps-web-sensors.es.min.js.map