#ifndef USBD_XINPUT_H
#define USBD_XINPUT_H

#ifdef __cplusplus
extern "C" {
#endif

#include "usbd_core.h"
#include "usbd_ioreq.h"

#define XINPUT_EPIN_ADDR          0x81U
#define XINPUT_EPOUT_ADDR         0x02U
#define XINPUT_SETUP_EPIN_ADDR    0x83U
#define XINPUT_SETUP_EPOUT_ADDR   0x03U
#define XINPUT_RAW_EPIN_ADDR      0x84U
#define XINPUT_EP_SIZE            64U
#define XINPUT_REPORT_SIZE        20U
#define USB_XINPUT_CONFIG_DESC_SIZ 106U

typedef enum
{
  XINPUT_IDLE = 0,
  XINPUT_BUSY
} XINPUT_StateTypeDef;

typedef struct
{
  uint8_t AltSetting[3];
  XINPUT_StateTypeDef state;
} USBD_XINPUT_HandleTypeDef;

extern USBD_ClassTypeDef USBD_XINPUT;

uint8_t USBD_XINPUT_SendReport(USBD_HandleTypeDef *pdev,
                               uint8_t *report,
                               uint16_t len);
uint8_t USBD_XINPUT_GetRumbleLeft(void);
uint8_t USBD_XINPUT_GetRumbleRight(void);

#ifdef __cplusplus
}
#endif

#endif /* USBD_XINPUT_H */
