code: function ButtonMgr(btnEventSpec) {
    var self = this;
  
    // initialize event handlers
    var buttonEventFunction = btnEventSpec.buttonEventFunction;
    var buttonObject = btnEventSpec.buttonObject;
    buttonEventFunction.call(buttonObject, btnEventSpec.pressEventName, function(time) {
      ButtonMgr.prototype._processButtonPress.call(self, time)
    });
    buttonEventFunction.call(buttonObject, btnEventSpec.releaseEventName, function(time) {
      ButtonMgr.prototype._processButtonRelease.call(self, time)
    });
  }
docs: ------------------------------------------------------------------------- Public/Client functions ------------------------------------------------------------------------- 
  Constructs a new ButtonMgr instance for the button specified by btnEventSpec.
  Uses the tessel-kit config section to initialize the value for the long-press duration in milliseconds (longPressTriggerMillis).
  
  See:https://tessel.io/docs/hardwareAPI
  
  @param btnEventSpec specifies the target button event handler (buttonEventFunction) and button object (buttonObject),
  so that the ButtonMgr can hook in and receive 'press' and 'release' events from the button.
  btnEventSpec {
  buttonObject:  Tessel button object - Tessel has two buttons.
  The reset button (nearer to the edge of the board) will stop running any program that is currently executing and restart the microcontroller (erasing any memory in RAM).
  The config button will eventually be used for other purposes but is currently a simple way to get user feedback into a script
  buttonEventFunction:function(buttonObject, pressEventName,
  pressEventName:
  releaseEventName:
  }
  
  @constructor