src/provider/ControlProvider.js

goog.module('gep.provider.ControlProvider');

const {Event,EventTarget,EventType} = goog.require('goog.events');

/**
 * This provider (singleton) monitors in short time intervals if a gamepad is available.
 * Currently the provider is only active if the URL parameter `gamepad=1` is set.
 * @extends {EventTarget}
 */
class ControlProvider extends EventTarget
{
    constructor()
    {
        super();
    }

    /**
     * Starts the interval check for a gamepad instance
     */
    startCheck()
    {
        this.checkControllingMode_();
        setInterval(() => {this.checkControllingMode_()}, 1000);
    }

    /**
     * Init check for gamepad instance
     * @private
     */
    checkControllingMode_()
    {
        let gamepad = this.getGamepad_(null);
        if(gamepad) {
            this.update();
        }
    }

    /**
     * Dispatch an update event if a gamepad was found
     * @private
     */
    update()
    {
        this.dispatchEvent(new Event(EventType.UPDATE));
    }

    /**
     * Determines a gamepad instance that optionally satisfies a condition for its ID to distinguish a particular type of gamepad.
     * @param {string|null} idCondition
     * @return {Gamepad}
     */
    getGamepad_(idCondition)
    {
        try{
            if(idCondition != null)
            {
                // console.log('gamepads', window.navigator.getGamepads());
                for(let i=0; i<window.navigator.getGamepads().length; i++)
                {
                    const gamepad = window.navigator.getGamepads()[i];
                    const condition = idCondition.substr(0,1) == '!' ? gamepad.id.indexOf(idCondition.substr(1)) == -1 : gamepad.id.indexOf(idCondition) != -1;
                    if(gamepad && gamepad.id && condition)
                    {
                        // console.log('used gamepad', gamepad.id);
                        return gamepad;
                    }
                }
            }
            else
                return window.navigator.getGamepads()[0];
        }catch(error){console.warn(error);}

        return null;
    }
}

goog.addSingletonGetter(ControlProvider);

exports = ControlProvider;