code: func (j *Driver) Start() (err error) {
  	switch j.configPath {
  	case "dualshock3":
  		j.config = dualshock3Config
  	case "dualshock4":
  		j.config = dualshock4Config
  	case "tflightHotasX":
  		j.config = tflightHotasXConfig
  	case "xbox360":
  		j.config = xbox360Config
  	case "xbox360RockBandDrums":
  		j.config = xbox360RockBandDrumsConfig
  	default:
  		err := j.loadFile()
  		if err != nil {
  			return err
  		}
  	}
  
  	for _, value := range j.config.Buttons {
  		j.AddEvent(fmt.Sprintf("%s_press", value.Name))
  		j.AddEvent(fmt.Sprintf("%s_release", value.Name))
  	}
  	for _, value := range j.config.Axis {
  		j.AddEvent(value.Name)
  	}
  	for _, value := range j.config.Hats {
  		j.AddEvent(fmt.Sprintf("%s_press", value.Name))
  		j.AddEvent(fmt.Sprintf("%s_release", value.Name))
  	}
  
  	go func() {
  		for {
  			for event := j.poll(); event != nil; event = j.poll() {
  				if errs := j.handleEvent(event); errs != nil {
  					j.Publish(j.Event("error"), errs)
  				}
  			}
  			select {
  			case <-time.After(j.interval):
  			case <-j.halt:
  				return
  			}
  		}
  	}()
  	return
  }
docs: // Start and polls the state of the joystick at the given interval.
  //
  // Emits the Events:
  //	Error error - On button error
  //	Events defined in the json button configuration file.
  //	They will have the format:
  //		[button]_press
  //		[button]_release
  //		[axis]