Skip to content
Snippets Groups Projects
haptic-feedback.js 1.72 KiB
Newer Older
const strengthForIntensity = {
  low: 0.07,
  medium: 0.2,
  high: 1
};

/**
 * Listens for haptic events and actuates hardware controllers accordingly
 * @namespace user-input
 * @component haptic-feedback
 */
joni's avatar
joni committed
AFRAME.registerComponent("haptic-feedback", {
  schema: {
    hapticEventName: { default: "haptic_pulse" }
  },

  init: function() {
    this.handlePulse = this.handlePulse.bind(this);
    this.getActuator = this.getActuator.bind(this);
    this.getActuator().then(actuator => {
      this.actuator = actuator;
    });
joni's avatar
joni committed
  },

  getActuator() {
Brian Peiris's avatar
Brian Peiris committed
    return new Promise(resolve => {
joni's avatar
joni committed
      const tryGetActivator = () => {
Brian Peiris's avatar
Brian Peiris committed
        const trackedControls = this.el.components["tracked-controls"];
        if (
          trackedControls &&
          trackedControls.controller &&
          trackedControls.controller.hapticActuators &&
joni's avatar
joni committed
          trackedControls.controller.hapticActuators.length
        ) {
          resolve(trackedControls.controller.hapticActuators[0]);
        } else {
joni's avatar
joni committed
          setTimeout(tryGetActivator, 1000);
joni's avatar
joni committed
      };
      setTimeout(tryGetActivator, 1000);
joni's avatar
joni committed
  },

  play: function() {
    this.el.addEventListener(this.data.hapticEventName, this.handlePulse);
joni's avatar
joni committed
  },
  pause: function() {
    this.el.removeEventListener(this.data.hapticEventName, this.handlePulse);
joni's avatar
joni committed
  },

Brian Peiris's avatar
Brian Peiris committed
    const { intensity } = event.detail;

    if (strengthForIntensity[intensity]) {
      this.pulse(strengthForIntensity[intensity]);
    } else if (Number(intensity) === intensity) {
      this.pulse(intensity);
    } else {
      console.warn(`Invalid intensity : ${intensity}`);
joni's avatar
joni committed
    }
joni's avatar
joni committed

    if (this.actuator) {
      this.actuator.pulse(intensity, 15);
joni's avatar
joni committed
  }
});