/** 
 * @brief           Human Interface Devices Class Driver API Header
 * @author          AXELL CORPORATION
 * @description     Human Interface Devices Class Driver提供ヘッダ
 * @note            none
 * @history         2017_02_22	初版
 * @history         2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
 */
#ifndef __USB_HID_CLASS_API_H__
#define __USB_HID_CLASS_API_H__
/* DOM-IGNORE-END */

#include "usb_hid_type.h"
#include "usb_hid_log.h"

/** HID ドライバ：メジャーバージョン */
#define	HID_MAJOR_VERSION		(0x01)

/** HID ドライバ：マイナーバージョン */
#define	HID_MINOR_VERSION		(0x00)

/** HIDディスクリプタ */
#define USB_DESC_TYPE_HID		(0x21U)

/** レポートディスクリプタ */
#define USB_DESC_TYPE_REPORT	(0x22U)

/** レポートタイプ */
typedef enum {
	REPORT_TYPE_INPUT = 1,		/** Inputレポート */
	REPORT_TYPE_OUTPUT,			/** Outputレポート */
	REPORT_TYPE_FEATURE			/** Featureレポート */
} REPORT_TYPE_SELECTOR;


typedef struct HidDescInfo* PHID_DESC_INFO;	/** ディスクリプタ格納バッファ型へのポインタ */
typedef struct HidReportInfo* PHID_REPORT_INFO;	/** レポート情報型へのポインタ */
typedef struct HidProtocol* PHID_PROTOCOL;	/** プロトコル情報型へのポインタ */
typedef struct HidIdle* PHID_IDLE;	/** アイドル時間情報型へのポインタ */

/** HIDクラス固有ディスクリプタ情報<p>
    HIDクラス固有ディスクリプタの詳細については、「Device Class Definition for Human Interface Devices (HID) 
    Firmware Specification」を参照して下さい。<p>
    バッファは対象ディスクリプタが格納出来るサイズ以上の大きさのものを非キャッシュ領域より取得し、
    アプリケーション側が用意して下さい。<p>
    また、本システムではBootプロトコルのみを想定しているため、本構造体にはHIDディスクリプタ、
    レポートディスクリプタのみ格納されます。<p>
    生成タイミング ： HIDクラス固有ディスクリプタ取得前<p>
    削除タイミング ： HIDクラス固有ディスクリプタ取得後 */
typedef struct HidDescInfo {
	uhs_ubit16_t		u16Length;	/** 取得するディスクリプタ長 */
    uhs_ubit8_t*		pu8Buff;	/** バッファのポインタ(非キャッシュ領域) */
} HID_DESC_INFO;

/** GetReportで取得するレポート情報<p>
    バッファは、レポートが格納出来るサイズ以上の大きさのものをアプリケーション側が用意して下さい。<p>
    レポートIDは、本システムではBootプロトコルのみを想定しているため、通常は0を想定しています。<p>
    生成タイミング ： GetReportによるレポート取得前<p>
    削除タイミング ： GetReportによるレポート取得後 */
typedef struct HidReportInfo {
	REPORT_TYPE_SELECTOR ReportTypeSelector; /** レポートタイプ選択 */
	uhs_ubit8_t			u8Id;		/** レポートID */
	uhs_ubit16_t		u16Length;	/** レポート長 */
	uhs_ubit8_t*		pu8Buff;	/** データを格納するバッファのポインタ */
} HID_REPORT_INFO;

/** プロトコル設定情報<p>
    設定するデータの詳細については、「Device Class Definition for Human Interface Devices (HID) 
    Firmware Specification」を参照して下さい。<p>
    生成タイミング ： プロトコル設定情報取得・設定前<p>
    削除タイミング ： プロトコル設定情報取得・設定後 */
typedef struct HidProtocol {
	uhs_ubit8_t			u8Data;		/** プロトコル設定データ */
} HID_PROTOCOL;

/** レポート頻度情報<p>
    持続時間を0とすると、デバイスはデータが変化したときのみレポート通知を行います。<p>
    レポートIDは、本システムではBootプロトコルのみを想定しているため、通常は0を想定しています。<p>
    0の場合は、すべてのInputレポートに適用されます。<p>
    生成タイミング ： レポート頻度設定前<p>
    削除タイミング ： レポート頻度設定後 */
typedef struct HidIdle {
	uhs_ubit8_t			u8Id;		/** レポートID */
	uhs_ubit8_t			u8Duration;	/** 持続時間（レポート間の最大時間間隔）。4msec単位。 */
} HID_IDLE;


extern uhs_status_t Usbh_Hid_GetVersion(uhs_ubit8_t*  pu8MajorVersion, uhs_ubit8_t*  pu8MinorVersion);
extern uhs_status_t Usbh_Hid_RegistCallBack(void* pContext, hid_callback_t pUserNotifyCallback);
extern uhs_status_t Usbh_Hid_GetHIDDescriptor(void* pContext, PHID_DESC_INFO pstData);
extern uhs_status_t Usbh_Hid_GetReportDescriptor(void* pContext, PHID_DESC_INFO pstData);
extern uhs_status_t Usbh_Hid_GetReport(void* pContext, PHID_REPORT_INFO pstData);
extern uhs_status_t Usbh_Hid_GetProtocol(void* pContext, PHID_PROTOCOL pstData);
extern uhs_status_t Usbh_Hid_SetIdle(void* pContext, PHID_IDLE pstData);
extern uhs_status_t Usbh_Hid_SetProtocol(void* pContext, PHID_PROTOCOL pstData);
extern uhs_status_t Usbh_Hid_RestartIntIN(void* pContext);
extern uhs_status_t Usbh_Hid_StopIntIN(void* pContext);
/*****************************************************************************/
/*     extern variable                                                       */
/*****************************************************************************/

/*****************************************************************************/
/*     define macro                                                          */
/*****************************************************************************/
#ifdef USBH_STACK_DEBUG_BUILD
#define CIAPI_HID_REPORT_SUMMARY(err) Usbh_Hid_Log_ReportError( g_filename, __LINE__, (err), (uhs_ubit8_t*)"1", 0 )
#define CIAPI_HID_REPORT_DETAIL(err, mesg, len) Usbh_Hid_Log_ReportError( g_filename, __LINE__, (err), (mesg), (len) )
#define CIAPI_HID_REPORT_MILESTONE(num) Usbh_Hid_Log_ReportMilestone((num))
#else
#define CIAPI_HID_REPORT_SUMMARY(err) Usbh_Hid_Log_ReportDummy(err)
#define CIAPI_HID_REPORT_DETAIL(err, mesg, len) Usbh_Hid_Log_ReportDummy(err)
#define CIAPI_HID_REPORT_MILESTONE(num) Usbh_Hid_Log_ReportMilestone((num))
#endif

/*****************************************************************************/
/*     const value                                                           */
/*****************************************************************************/

/*****************************************************************************/
/*     global variable                                                       */
/*****************************************************************************/

#endif /* __USB_HID_CLASS_API_H__ */
