code: def add_event_handler(self, full_usage_id, handler_function,
              event_kind = HID_EVT_ALL, aux_data = None):
          
          report_id = self.find_input_usage(full_usage_id)
          if report_id != None:
              # allow first zero to trigger changes and releases events
              self.__input_report_templates[report_id][full_usage_id].__value = None
          if report_id == None or not handler_function:
              # do not add handler
              return False
          assert(isinstance(handler_function, collections.Callable)) # must be a function
          # get dictionary for full usages
          top_map_handler = self.__evt_handlers.get(full_usage_id, dict())
          event_handler_set = top_map_handler.get(event_kind, dict())
          # update handler
          event_handler_set[handler_function] = aux_data
          if event_kind not in top_map_handler:
              top_map_handler[event_kind] = event_handler_set
          if full_usage_id not in self.__evt_handlers:
              self.__evt_handlers[full_usage_id] = top_map_handler
          return True
docs: Add event handler for usage value/button changes,
          returns True if the handler function was updated