#ifndef DEVICE_H_INCLUDED
#define DEVICE_H_INCLUDED

#include "usbjoystick.h"   // JOY_AXES

#define JOY_TYPE_STANDARD   0
#define JOY_TYPE_XBOX360    1
#define JOY_TYPE_XBOX360WL  2

#define JOY_INIT_COMMAND_MAX_LENGTH 255

// Per-driver quirk bits (joy_device_struct.quirks).
//   JOY_QUIRK_NO_SERIAL - this device's USB iSerialNumber is not a stable,
//     per-unit identifier (cheap Xbox360 clones synthesise a fresh value
//     each enumeration; even genuine Xbox360 pads have no useful serial).
//     The config-store fingerprint ignores the serial for such devices and
//     keys by VID:PID only - see c.config config_fingerprint(), doc.Config.
#define JOY_QUIRK_NO_SERIAL   (1u << 0)

typedef int (joy_device_data_valid_fn)(char *d);

struct joy_device_struct {
  uint8_t                    interface_class;
  uint8_t                    interface_subclass;
  uint8_t                    interface_protocol;
  uint16_t                   vendor_id;
  uint16_t                   product_id;
  char                       *name;
  uint8_t                    type;
  uint8_t                    *report_descriptor;
  uint8_t                    report_descriptor_length;
  uint8_t                    report_data_offset;      // additional bytes before report data starts
  uint8_t                    init_command[JOY_INIT_COMMAND_MAX_LENGTH];
  uint8_t                    init_command_length;
  uint8_t                    auto_flip_axes[JOY_AXES];
  uint8_t                    auto_flip_axes_length;
  joy_device_data_valid_fn   *data_valid;
  uint32_t                   quirks;                  // JOY_QUIRK_* bitfield
};

extern uint32_t joy_devices_count;



int xbox360wireless_data_validator(char *d);

struct joy_device_struct *lookup_joy_device(uint8_t iClass, uint8_t iSubClass, uint8_t iProtocol, uint16_t vendor, uint16_t product);


#endif
