UNPKG

@openhps/web-sensors

Version:

Open Hybrid Positioning System - Web Sensors API

344 lines (327 loc) 18.9 kB
import * as __WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__ from "./openhps-core.es.js"; /******/ var __webpack_modules__ = ({ /***/ "./dist/esm/legacy/SensorSourceNode.js": /*!*********************************************!*\ !*** ./dist/esm/legacy/SensorSourceNode.js ***! \*********************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SensorSourceNode: () => (/* binding */ SensorSourceNode) /* harmony export */ }); /* harmony import */ var _openhps_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openhps/core */ "@openhps/core"); /** * IMU source using the HTML5 browser API for device motion and device orientation. * @category Source node */ class SensorSourceNode extends _openhps_core__WEBPACK_IMPORTED_MODULE_0__.SourceNode { constructor(options) { var _a; super(options); this.options.source = (_a = this.options.source) !== null && _a !== void 0 ? _a : new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.DataObject(this.uid); if (this.options.autoStart) { this.once('build', this.start.bind(this)); } this.once('destroy', this.stop.bind(this)); } // eslint-disable-next-line @typescript-eslint/no-unused-vars static requestPermissions(...args) { if (typeof DeviceMotionEvent.requestPermission === 'function') { return DeviceMotionEvent.requestPermission().then((response) => { if (response !== 'granted') { return Promise.reject(new Error('Permission to access device motion was denied.')); } }); } return Promise.resolve(); } start() { return new Promise((resolve) => { const sensorUID = this.source ? this.source.uid : this.uid; window.addEventListener('devicemotion', (event) => { // Create a new data frame for the orientation change const dataFrame = new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.DataFrame(); const frequency = 1000 / event.interval; dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Accelerometer(sensorUID + '_accl', new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Acceleration(event.accelerationIncludingGravity.x, event.accelerationIncludingGravity.y, event.accelerationIncludingGravity.z, _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AccelerationUnit.METER_PER_SECOND_SQUARE), frequency)); dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Gyroscope(sensorUID + '_gyro', new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AngularVelocity(event.rotationRate.beta, event.rotationRate.gamma, event.rotationRate.alpha, _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AngularVelocityUnit.RADIAN_PER_SECOND), frequency)); dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Accelerometer(sensorUID + '_linearaccl', new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Acceleration(event.acceleration.x, event.acceleration.y, event.acceleration.z, _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AccelerationUnit.METER_PER_SECOND_SQUARE), frequency)); const source = this.source; source.getPosition().angularVelocity = dataFrame.getSensor(_openhps_core__WEBPACK_IMPORTED_MODULE_0__.Gyroscope).value; dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AbsoluteOrientationSensor(sensorUID + '_orientation', source.getPosition().orientation)); dataFrame.source = source; this.push(dataFrame); }, true); window.addEventListener('deviceorientation', (event) => { const source = this.source; source.getPosition().orientation = _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Orientation.fromEuler([event.beta, event.gamma, event.alpha]); }); this.logger('debug', 'Browser orientation and motion events registered!'); resolve(); }); } stop() { return Promise.resolve(); } onPull() { return new Promise((resolve) => { resolve(undefined); }); } } //# sourceMappingURL=SensorSourceNode.js.map /***/ }), /***/ "./dist/esm/web/SensorSourceNode.js": /*!******************************************!*\ !*** ./dist/esm/web/SensorSourceNode.js ***! \******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SensorSourceNode: () => (/* binding */ SensorSourceNode) /* harmony export */ }); /* harmony import */ var _openhps_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @openhps/core */ "@openhps/core"); /// <reference types="web" /> /** * Sensor source node using Web Sensor API. */ class SensorSourceNode extends _openhps_core__WEBPACK_IMPORTED_MODULE_0__.SourceNode { constructor(options) { super(options); this._subscriptions = new Map(); this._values = new Map(); this._lastPush = 0; this._running = false; this.options.interval = this.options.interval || 100; if (this.options.autoStart) { this.once('build', this.start.bind(this)); } this.once('destroy', this.stop.bind(this)); } static checkPermissions(sensors) { return this.requestPermissions(sensors); } static requestPermissions(sensors) { return new Promise((resolve, reject) => { if (navigator.permissions === undefined || sensors === undefined || sensors.length === 0) { return resolve(true); } Promise.all(sensors .map((sensor) => this.getPermissions(sensor).map((permission) => navigator.permissions.query({ name: permission }))) .reduce((a, b) => [...a, ...b])) .then((results) => { if (results.every((result) => result.state === 'granted')) { resolve(true); } else { resolve(false); } }) .catch(reject); }); } requestPermissions() { return SensorSourceNode.requestPermissions(this.options.sensors); } start() { return new Promise((resolve) => { this._running = true; if (this._subscriptions.size > 0) { return resolve(); } this.options.sensors.forEach((sensor) => { const SensorType = this.findSensor(sensor); if (SensorType === undefined) { // Not supported return; } const sensorInstance = new SensorType({ frequency: Math.round(1000 / this.options.interval), }); sensorInstance.addEventListener('reading', (event) => { if (!this._running) return; this._values.set(sensor, event.target); if (this._isUpdated()) { this._lastPush = event.timeStamp; this.createFrame().catch((ex) => { this.logger('error', 'Unable to create sensor data frame!', ex); }); } }); sensorInstance.start(); this._subscriptions.set(sensor, sensorInstance); }); resolve(); }); } _isUpdated() { return (Array.from(this._values.values()).filter((sensor) => sensor.timestamp > this._lastPush).length === Array.from(this._subscriptions.values()).filter((sensor) => sensor.activated).length); } stop() { return new Promise((resolve) => { if (this.options.softStop) { this._running = false; } else { this._subscriptions.forEach((value) => value.stop()); this._subscriptions = new Map(); this._values = new Map(); } resolve(); }); } createFrame() { return new Promise((resolve) => { const dataFrame = new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.DataFrame(); dataFrame.source = this.source; const acceleration = this._values.get(_openhps_core__WEBPACK_IMPORTED_MODULE_0__.Accelerometer); const linearAcceleration = this._values.get(_openhps_core__WEBPACK_IMPORTED_MODULE_0__.LinearAccelerationSensor); const gyroscope = this._values.get(_openhps_core__WEBPACK_IMPORTED_MODULE_0__.Gyroscope); const orientation = this._values.get(_openhps_core__WEBPACK_IMPORTED_MODULE_0__.AbsoluteOrientationSensor); const relativeOrientation = this._values.get(_openhps_core__WEBPACK_IMPORTED_MODULE_0__.RelativeOrientationSensor); const magnetometer = this._values.get(_openhps_core__WEBPACK_IMPORTED_MODULE_0__.Magnetometer); const sourceUID = this.source ? this.source.uid : this.uid; const frequency = 1000 / this.options.interval; if (acceleration) { dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Accelerometer(sourceUID + '_accel', new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Acceleration(acceleration.x, acceleration.y, acceleration.z, _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AccelerationUnit.METER_PER_SECOND_SQUARE), frequency)); } if (linearAcceleration) { dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.LinearAccelerationSensor(sourceUID + '_linearaccel', new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Acceleration(linearAcceleration.x, linearAcceleration.y, linearAcceleration.z, _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AccelerationUnit.METER_PER_SECOND_SQUARE), frequency)); } if (gyroscope) { dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Gyroscope(sourceUID + '_gyro', new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AngularVelocity(gyroscope.x, gyroscope.y, gyroscope.z, _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AngularVelocityUnit.RADIAN_PER_SECOND), frequency)); } if (orientation) { dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AbsoluteOrientationSensor(sourceUID + '_absoluteorientation', _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Orientation.fromQuaternion(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Quaternion(...orientation.quaternion)), frequency)); } if (relativeOrientation) { dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.RelativeOrientationSensor(sourceUID + '_relativeorientation', _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Orientation.fromQuaternion(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Quaternion(...relativeOrientation.quaternion)), frequency)); } if (magnetometer) { dataFrame.addSensor(new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Magnetometer(sourceUID + '_mag', new _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Magnetism(magnetometer.x, magnetometer.y, magnetometer.z, _openhps_core__WEBPACK_IMPORTED_MODULE_0__.MagnetismUnit.MICROTESLA), frequency)); } this.push(dataFrame); resolve(); }); } onPull() { return new Promise((resolve) => { resolve(undefined); }); } findSensor(sensor) { switch (sensor) { case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.RelativeOrientationSensor: return RelativeOrientationSensor; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AbsoluteOrientationSensor: return AbsoluteOrientationSensor; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.LinearAccelerationSensor: return LinearAccelerationSensor; // case SensorType.AMBIENT_LIGHT: // return AmbientLightSensor; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Gyroscope: return Gyroscope; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Magnetometer: return window.Magnetometer; // Experimental case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Accelerometer: return Accelerometer; default: return undefined; } } static getPermissions(sensor) { switch (sensor) { // case SensorType.AMBIENT_LIGHT: // return ["ambient-light-sensor"]; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.RelativeOrientationSensor: case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.AbsoluteOrientationSensor: return ['gyroscope', 'accelerometer', 'magnetometer']; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Gyroscope: return ['gyroscope']; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Magnetometer: return ['magnetometer']; case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.LinearAccelerationSensor: case _openhps_core__WEBPACK_IMPORTED_MODULE_0__.Accelerometer: return ['accelerometer']; default: return undefined; } } } //# sourceMappingURL=SensorSourceNode.js.map /***/ }), /***/ "@openhps/core": /*!***************************************!*\ !*** external "./openhps-core.es.js" ***! \***************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { var x = (y) => { var x = {}; __webpack_require__.d(x, y); return x } var y = (x) => (() => (x)) module.exports = x({ ["AbsoluteOrientationSensor"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.AbsoluteOrientationSensor), ["Acceleration"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.Acceleration), ["AccelerationUnit"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.AccelerationUnit), ["Accelerometer"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.Accelerometer), ["AngularVelocity"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.AngularVelocity), ["AngularVelocityUnit"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.AngularVelocityUnit), ["DataFrame"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.DataFrame), ["DataObject"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.DataObject), ["Gyroscope"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.Gyroscope), ["LinearAccelerationSensor"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.LinearAccelerationSensor), ["Magnetism"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.Magnetism), ["MagnetismUnit"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.MagnetismUnit), ["Magnetometer"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.Magnetometer), ["Orientation"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.Orientation), ["Quaternion"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.Quaternion), ["RelativeOrientationSensor"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.RelativeOrientationSensor), ["SourceNode"]: () => (__WEBPACK_EXTERNAL_MODULE__openhps_core_es_js_870a26f4__.SourceNode) }); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. (() => { /*!***************************!*\ !*** ./dist/esm/index.js ***! \***************************/ /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ SensorSourceNode: () => (/* binding */ implementation) /* harmony export */ }); /* harmony import */ var _web_SensorSourceNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./web/SensorSourceNode */ "./dist/esm/web/SensorSourceNode.js"); /* harmony import */ var _legacy_SensorSourceNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./legacy/SensorSourceNode */ "./dist/esm/legacy/SensorSourceNode.js"); let implementation = _web_SensorSourceNode__WEBPACK_IMPORTED_MODULE_0__.SensorSourceNode; if (!('Accelerometer' in window)) { implementation = _legacy_SensorSourceNode__WEBPACK_IMPORTED_MODULE_1__.SensorSourceNode; } //# sourceMappingURL=index.js.map })(); const __webpack_exports__SensorSourceNode = __webpack_exports__.SensorSourceNode; export { __webpack_exports__SensorSourceNode as SensorSourceNode }; //# sourceMappingURL=openhps-web-sensors.es.js.map