/** 
 * @brief           USBH HID Type Header
 * @author          AXELL CORPORATION
 * @description	    USBH HID Type Header
 * @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-2019 AXELL CORPORATION, all rights reserved.
 */


#ifndef __USB_HID_TYPE_H__
#define __USB_HID_TYPE_H__
/* DOM-IGNORE-END */

/*****************************************************************************/
/*     include files                                                         */
/*****************************************************************************/
#include "usb_hid_coreinclude.h"

/*****************************************************************************/
/*     define value                                                          */
/*****************************************************************************/
/** HIDデバイスを接続可能な数 */
#define HID_SUPPORT_DEVICE_NUM	USBH_MAX_CLS_HID_NUM

/*****************************************************************************/
/*     enum data                                                             */
/*****************************************************************************/
/* ========================================================================= */
/* HIDデバイスの状態 */
/* ========================================================================= */
typedef enum {
    HID_DEVICE_STAT_CONNECTING,						/* デバイス接続中状態 */
    HID_DEVICE_STAT_REGIST,							/* デバイス登録中状態 */
    HID_DEVICE_STAT_NO_SUPPORT,						/* 使用不可(非対応)デバイス */
    HID_DEVICE_STAT_CLOSE,							/* クローズ状態 */
    HID_DEVICE_STAT_OPEN							/* オープン状態 */
} HID_DEVICE_STAT;

/* ========================================================================= */
/* 内部関数の戻り値 */
/* ========================================================================= */
typedef enum {
	HID_FUNC_STATUS_SUCCESS,						/* 成功 */
	HID_FUNC_STATUS_BASE = 0x200,					/* エラーコードの基準値 */
	HID_FUNC_STATUS_HALT_PIPE						/* PipeがHALTしている */,
	HID_FUNC_STATUS_NOT_INIT,						/* ドライバ未初期化 */
	HID_FUNC_STATUS_NO_DEVICE,						/* デバイス未接続 */
	HID_FUNC_STATUS_NOT_USE,						/* デバイス未初期化 */
    HID_FUNC_STATUS_FAILED_BOOT_INIT,				/* Boot Protocol 層の初期化に失敗 */
    HID_FUNC_STATUS_FAILED_BOOT_EXIT,				/* Boot Protocol 層の終了処理に失敗 */
    HID_FUNC_STATUS_FAILED_CRE_HIDD,				/* HIDClassDriverの作成に失敗 */
    HID_FUNC_STATUS_FAILED_DEL_HIDD,				/* HIDClassDriverの削除に失敗 */
    HID_FUNC_STATUS_FAILED_CTRL,					/* コントロール転送に失敗 */
    HID_FUNC_STATUS_FAILED_INTERRUPT,				/* インターラプト転送に失敗 */
    HID_FUNC_STATUS_FAILED_STDREQ,					/* 標準リクエストに失敗 */
    HID_FUNC_STATUS_FAILED_CLSREQ,					/* クラスリクエストに失敗 */
	HID_FUNC_STATUS_FAILED_CRE_HDD,					/* HIDDeviceの作成に失敗 */
	HID_FUNC_STATUS_FAILED_ADD_HDD,					/* HIDDeviceの追加に失敗 */
    HID_FUNC_STATUS_FAILED_REMOVE_HDD,				/* HIDDeviceの開放に失敗 */
	HID_FUNC_STATUS_FAILED_CRE_CPIPE,				/* ControlPIPEの作成に失敗 */
	HID_FUNC_STATUS_FAILED_OPEN_CPIPE,				/* ControlPIPEのOpenに失敗 */
	HID_FUNC_STATUS_FAILED_CRE_IPIPE,				/* InterruptPIPEの作成に失敗 */
	HID_FUNC_STATUS_FAILED_OPEN_IPIPE,				/* InterruptPIPEのOpenに失敗 */
    HID_FUNC_STATUS_INTERNAL_FAILED_CORE,			/* コアからエラーが報告された */
    HID_FUNC_STATUS_INTERNAL_FAILED_HID,			/* ドライバ内部エラーが発生した */
    HID_FUNC_STATUS_SYS_SYSTEM_ERROR,				/* システムエラーが発生した */
    HID_FUNC_STATUS_SYS_OUT_OF_RESOURCE,			/* システムリソース(セマフォ、フラグ、メモリ)のアクセスでエラーが発生した */
    HID_FUNC_STATUS_SYS_PARAM_ERROR					/* パラメータ指定に誤りがあった */
} HID_FUNC_STATUS;

/*****************************************************************************/
/*     typedef                                                               */
/*****************************************************************************/
/* ========================================================================= */
/* 基本型へのポインタ型 */
/* ========================================================================= */

/** ユーザアプリケーション層への通知情報へのポインタ */
typedef struct HidNotifyInfo* PHID_NOTIFY_INFO;
/** HIDクラスドライバ情報へのポインタ */
typedef struct HidDriver* PHID_DRIVER;
/** HID情報へのポインタ */
typedef struct HidDevice* PHID_DEVICE;
/** HIDパイプ情報へのポインタ */
typedef struct HidPipe* PHID_PIPE;
/** HID Interrupt IN 用受信バッファ情報へのポインタ */
typedef struct HidIntInBuff* PHID_INTIN_BUFF;

/** ユーザアプリケーション層 通知 Callback 関数型定義 */
typedef void (*hid_callback_t)( PHID_NOTIFY_INFO pNotifyInfo, uhs_status_t RetVal );

/** ユーザアプリケーション層への通知（レポート）情報を保持するデータ型<p>
    コールバック通知関数内で必ず受信データを引き取って下さい。<p>
    コールバック通知関数内で、他の提供API関数の呼び出しを禁止します。<p>
    生成タイミング ： ユーザアプリケーションへの通知前<p>
    削除タイミング ： ユーザアプリケーションへの通知後 */
typedef struct HidNotifyInfo {
    void*				pContext;		/** デバイス識別子 */
    uhs_ubit32_t		u32Length;		/** データのレングス長 */
    uhs_ubit8_t*		pu8Buff;		/** バッファのポインタ */
} HID_NOTIFY_INFO;

/* ========================================================================= */
/* HIDデバイスクラスドライバ情報 型の定義 */
/* ========================================================================= */
typedef struct HidDriver {
    /* -- プロパティを表すメンバー ----------------------------------------- */
    usb_common_callback_t			pUserAttachCallback;									/* ユーザアプリケーション層 Attach Callback 関数 */
    usb_common_callback_t			pUserDetachCallback;									/* ユーザアプリケーション層 Detach Callback 関数 */
    struct class_driver_reginfo*	pDrvRegInfo;											/* Core 登録用テーブルのバッファ */
    PHID_DEVICE						pHidDeviceHead;											/* 本ドライバが管理するデバイスのリスト */
    kernel_context_t				oApiDetAccessLockObj[HID_SUPPORT_DEVICE_NUM];			/* API関数処理とDetach処理用ロックオブジェクトの実体 */
    kernel_context_t*				pApiDetAccessLock[HID_SUPPORT_DEVICE_NUM];				/* API関数処理とDetach処理用アクセスロックへのポインタ */
    kernel_context_t				oClsReqDetAccessLockObj[HID_SUPPORT_DEVICE_NUM];		/* Class Request API関数処理とDetach処理用ロックオブジェクトの実体 */
    kernel_context_t*				pClsReqDetAccessLock[HID_SUPPORT_DEVICE_NUM];			/* Class Request API関数処理とDetach処理用アクセスロックへのポインタ */
    kernel_context_t				oIntINDoneDetAccessLockObj[HID_SUPPORT_DEVICE_NUM];		/* Int IN 転送完了コールバックとDetach処理用ロックオブジェクトの実体 */
    kernel_context_t*				pIntINDoneDetBuffAccessLock[HID_SUPPORT_DEVICE_NUM];	/* Int IN 転送完了コールバックとDetach処理用アクセスロックへのポインタ */
	PHID_DEVICE						pDeviceID[HID_SUPPORT_DEVICE_NUM];						/* 関数処理と切断処理のセマフォ用 デバイスID */
} HID_DRIVER;

/* ========================================================================= */
/* HIDディスクリプタ型の定義 */
/* ========================================================================= */
typedef struct hid_descriptor {      // __st__
    uhs_ubit8_t data[9];
} HID_DESCRIPTOR;

/* ========================================================================= */
/* HIDデバイス情報 型の定義 */
/* ========================================================================= */
typedef struct HidDevice {
    /* -- プロパティを表すメンバー ----------------------------------------- */
    struct usbd_usb_deviceinfo*	pUsbCore_Dev;				/* USB Core が保持するデバイス情報 */
    PHID_PIPE					pCtrlPipe_I;				/* 本デバイスが持つ Default Ctrl In Pipe */
    PHID_PIPE					pCtrlPipe_O;				/* 本デバイスが持つ Default Ctrl Out Pipe */
    PHID_PIPE					pIntInPipe;					/* 本デバイスが持つ Interrupt In Pipe */
    PHID_INTIN_BUFF				pIntInBuff;					/* Interrupt IN 転送用受信バッファ情報 */
    HID_DEVICE_STAT				nDeviceStat;				/* デバイスの状態 */
    hid_callback_t				pUserNotifyCallback;		/* ユーザアプリケーション層 通知 Callback 関数 */
    uhs_ubit16_t				u16Intf_num;				/* インタフェース番号 */
    /* -- 制御のためのメンバー --------------------------------------------- */
    kernel_context_t			oHidExecuteLockObj;			/* HIDクラス用ロックオブジェクトの実体(Control転送IN/OUTに使用) */
    kernel_context_t*			pHidExecuteLock;			/* HIDクラス用実行ロックへのポインタ */
    kernel_context_t			oIntInExecuteLockObj;		/* インタラプト転送用ロックオブジェクトの実体(Interrupt転送INに使用) */
    kernel_context_t*			pIntInExecuteLock;			/* インタラプト転送用実行ロックへのポインタ */
    kernel_context_t			oRegistExecuteLockObj;		/* コールバック登録用ロックオブジェクトの実体(Usbh_Hid_RegistCallBack API に使用) */
    kernel_context_t*			pRegistExecuteLock;			/* コールバック登録用実行ロックへのポインタ */
    /* -- 構造を表すメンバー ----------------------------------------------- */
    PHID_DEVICE					pNext;						/* 次のHIDデバイス */
    PHID_DRIVER					pParent;					/* 本HIDデバイスを管理する親ドライバ */
    uhs_boolean_t				(*Delete)(PHID_DEVICE);		/* 自デバイスの削除関数 */
    HID_DESCRIPTOR				hid_desc;					/* HIDディスクリプタ */
} HID_DEVICE;

/* ========================================================================= */
/* HIDデバイスパイプ情報 型の定義 */
/* ========================================================================= */
typedef struct HidPipe {
    /* -- プロパティを表すメンバー ----------------------------------------- */
    uhs_ubit32_t				u32PipeInfo;			/* 本 Pipe 情報の Core 表現キャッシュ */
    struct usb_control_block*	pUcb;					/* 本 Pipe が使用する UCB 情報 */
    struct usb_control_block*	pClearFeature;		    /* 本 Pipe が使用する CearFeature用 UCB 情報 */  
    uhs_boolean_t				bIsOpen;				/* オープン状態 */
    uhs_ubit32_t				u32MaxPacketSize;		/* 本 Pipe の MAX PACKET SIZE */
    uhs_ubit8_t					u8Interval;				/* 本 Pipe の Interval 時間*/
	uhs_ubit8_t					dummy1;
	uhs_ubit16_t				dummy2;
    uhs_sbit32_t				s32Cnt_Transfering;		/* 転送処理数カウンタ */
    kernel_context_t*			oReq_Done;				/* 転送完了イベント用オブジェクト(Ctrlに使用)へのポインタ */
    /* -- 構造を表すメンバー ----------------------------------------------- */
    struct usbd_usb_deviceinfo*	pParentDev;				/* 本 Pipe が属する親デバイス */
} HID_PIPE;

/* ========================================================================= */
/* HIDデバイス Interrupt IN 用受信バッファ情報 型の定義 */
/* ========================================================================= */
typedef struct HidIntInBuff {
    uhs_ubit8_t*				pu8StartBuff;			/* 受信バッファの先頭ポインタ */
    uhs_ubit8_t					u8WritePos;				/* 受信バッファのライト位置 */
    uhs_ubit8_t*				pu8TempBuff;			/* テンポラリィバッファの先頭ポインタ */
    uhs_ubit8_t					u8ReceiveSize;			/* 受信サイズ */
    uhs_boolean_t				isIntINUserFlag;		/* ユーザ指示の Bulk IN 転送状態フラグ */
} HID_INTIN_BUFF;

#endif  /* __USB_HID_TYPE_H__ */

