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;