/**
 * @brief           USBH CDC type Header
 * @author          AXELL CORPORATION
 * @description     USBH CDC 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_CDC_TYPE_H__
#define __USB_CDC_TYPE_H__
/* DOM-IGNORE-END */

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

/*****************************************************************************/
/*     define value                                                          */
/*****************************************************************************/
/** CDCデバイスを接続可能な数 */
#define CDC_SUPPORT_DEVICE_NUM	USBH_MAX_CLS_CDC_NUM

/*****************************************************************************/
/*     enum data                                                             */
/*****************************************************************************/
/* ========================================================================= */
/* コミュニケーションデバイスの状態 */
/* ========================================================================= */
typedef enum {
    CDC_DEVICE_STAT_CONNECTING,						/* デバイス接続中状態 */
    CDC_DEVICE_STAT_REGIST,							/* デバイス登録中状態 */
    CDC_DEVICE_STAT_NO_SUPPORT,						/* 使用不可(非対応)デバイス */
    CDC_DEVICE_STAT_CLOSE,							/* クローズ状態 */
    CDC_DEVICE_STAT_OPEN							/* オープン状態 */
} CDC_DEVICE_STAT;

/* ========================================================================= */
/* 内部関数の戻り値 */
/* ========================================================================= */
typedef enum {
	CDC_FUNC_STATUS_SUCCESS,						/* 成功 */
	CDC_FUNC_STATUS_BASE = 0x200,					/* エラーコードの基準値 */
	CDC_FUNC_STATUS_HALT_PIPE						/* PipeがHALTしている */,
	CDC_FUNC_STATUS_NOT_INIT,						/* ドライバ未初期化 */
	CDC_FUNC_STATUS_NO_DEVICE,						/* デバイス未接続 */
	CDC_FUNC_STATUS_NOT_USE,						/* デバイス未初期化 */
    CDC_FUNC_STATUS_FAILED_CBI_INIT,				/* Control Bulk Interrupt 層の初期化に失敗 */
    CDC_FUNC_STATUS_FAILED_CBI_EXIT,				/* Control Bulk Interrupt 層の終了処理に失敗 */
    CDC_FUNC_STATUS_FAILED_CRE_CDCD,				/* CommunicationDeviceClassDriverの作成に失敗 */
    CDC_FUNC_STATUS_FAILED_DEL_CDCD,				/* CommunicationDeviceClassDriverの削除に失敗 */
    CDC_FUNC_STATUS_FAILED_BULK,					/* バルク転送に失敗 */
    CDC_FUNC_STATUS_FAILED_CTRL,					/* コントロール転送に失敗 */
    CDC_FUNC_STATUS_FAILED_INTERRUPT,				/* インターラプト転送に失敗 */
    CDC_FUNC_STATUS_FAILED_STDREQ,					/* 標準リクエストに失敗 */
    CDC_FUNC_STATUS_FAILED_CLSREQ,					/* クラスリクエストに失敗 */
	CDC_FUNC_STATUS_FAILED_CRE_CDD,					/* CommunicationDeviceの作成に失敗 */
	CDC_FUNC_STATUS_FAILED_ADD_CDD,					/* CommunicationDeviceの追加に失敗 */
    CDC_FUNC_STATUS_FAILED_REMOVE_CDD,				/* CommunicationDeviceの開放に失敗 */
	CDC_FUNC_STATUS_FAILED_CRE_CPIPE,				/* ControlPIPEの作成に失敗 */
	CDC_FUNC_STATUS_FAILED_OPEN_CPIPE,				/* ControlPIPEのOpenに失敗 */
	CDC_FUNC_STATUS_FAILED_CRE_BPIPE,				/* BulkPIPEの作成に失敗 */
	CDC_FUNC_STATUS_FAILED_OPEN_BPIPE,				/* BulkPIPEのOpenに失敗 */
	CDC_FUNC_STATUS_FAILED_CRE_IPIPE,				/* InterruptPIPEの作成に失敗 */
	CDC_FUNC_STATUS_FAILED_OPEN_IPIPE,				/* InterruptPIPEのOpenに失敗 */
    CDC_FUNC_STATUS_INTERNAL_FAILED_CORE,			/* コアからエラーが報告された */
    CDC_FUNC_STATUS_INTERNAL_FAILED_CDC,			/* ドライバ内部エラーが発生した */
    CDC_FUNC_STATUS_SYS_SYSTEM_ERROR,				/* システムエラーが発生した */
    CDC_FUNC_STATUS_SYS_OUT_OF_RESOURCE,			/* システムリソース(セマフォ、フラグ、メモリ)のアクセスでエラーが発生した */
    CDC_FUNC_STATUS_SYS_PARAM_ERROR					/* パラメータ指定に誤りがあった */
} CDC_FUNC_STATUS;

/* ========================================================================= */
/* コールバック通知種別 */
/* ========================================================================= */
typedef enum {
    CDC_NOTIFY_TYPE_INTERRUPT_IN,					/* インタラプト IN 転送コールバック通知 */
    CDC_NOTIFY_TYPE_BULK_IN							/* バルク IN 転送コールバック通知 */
} CDC_NOTIFY_TYPE;

/* ========================================================================= */
/* コミュニケーションクラス特有通知コード */
/* ========================================================================= */
typedef enum {
    CDC_NOTIFY_CODE_NETWORK_CONNECTION = 0x00,
    CDC_NOTIFY_CODE_RESPONSE_AVAILABLE,
    CDC_NOTIFY_CODE_AUX_JACK_HOOK_STATE = 0x08,
    CDC_NOTIFY_CODE_RING_DETECT,
    CDC_NOTIFY_CODE_SERIAL_STATE = 0x20,
    CDC_NOTIFY_CODE_CALL_STATE_CHANGE = 0x28,
    CDC_NOTIFY_CODE_LINE_STATE_CHANGE,
    CDC_NOTIFY_CODE_CONNECTION_SPEED_CHANGE
} CDC_NOTIFY_CODE;

/** 送受信データ情報へのポインタ */
typedef struct CdcBuffInfo* PCDC_BUFF_INFO;
/** ユーザアプリケーション層への通知情報へのポインタ */
typedef struct CdcNotifyInfo* PCDC_NOTIFY_INFO;
/** コミュニケーションデバイスクラスドライバ情報へのポインタ */
typedef struct CdcDriver* PCDC_DRIVER;
/** コミュニケーションデバイス情報へのポインタ */
typedef struct CdcDevice* PCDC_DEVICE;
/** コミュニケーションデバイスパイプ情報へのポインタ */
typedef struct CdcPipe* PCDC_PIPE;
/** コミュニケーションデバイス Bulk IN 用受信バッファ情報へのポインタ */
typedef struct CdcBulkInBuff* PCDC_BULKIN_BUFF;
/** コミュニケーションデバイス Interrupt IN 用受信バッファ情報へのポインタ */
typedef struct CdcIntInBuff* PCDC_INTIN_BUFF;

/** ユーザアプリケーション層 通知 Callback 関数型定義<p>
    uhs_status_t型で返却されるRetValには、処理結果が格納されます。 */
typedef void (*cdc_callback_t)( PCDC_NOTIFY_INFO pNotifyInfo, uhs_status_t RetVal );

/** 送受信のデータを格納するバッファ情報<p>
    生成タイミング ： データ送受信処理前<p>
    削除タイミング ： データ送受信処理後 */
typedef struct CdcBuffInfo {
    uhs_ubit32_t		u32ActualLength;				/** 転送済データサイズ(送信時：送信済サイズ、受信時：デバイスから返されたデータのサイズ) */
    uhs_ubit32_t		u32RequestLength;				/** リクエストデータのレングス長 */
    uhs_ubit8_t*		pu8Buff;						/** バッファのポインタ(非キャッシュ領域) */
} CDC_BUFF_INFO;

/** ユーザアプリケーション層への通知情報を保持するデータ<p>
    CallbackNotifyType によって各メンバの有効／無効が変わります。<p>
    【CallbackNotifyType = CDC_NOTIFY_TYPE_INTERRUPT_IN】<p>
      ・pContext ： 有効<p>
      ・ClassNotifyCode ： 有効<p>
      ・u16wValue ： 有効 (格納されたデータの詳細については「Universal Serial Bus Communications Class Subclass Specification for PSTN Devices」を参照。)<p>
      ・u32RemainBuffSize ： 無効<p>
      ・u32Length ： 有効<p>
      ・pu8Buff ： 有効 (受信データの詳細については「Universal Serial Bus Communications Class Subclass Specification for PSTN Devices」を参照。)<p>
        受信データが存在する場合は、コールバック通知関数内で必ず受信データを引き取って下さい。<p>
    【CallbackNotifyType = CDC_NOTIFY_TYPE_BULK_IN】<p>
      ・pContext ： 有効<p>
      ・ClassNotifyCode ： 無効<p>
      ・u16wValue ： 無効<p>
      ・u32RemainBuffSize ： 有効 (サイズはバイト単位。。残サイズが 1KB 未満の場合は、受信バッファフル状態として「0」を格納)<p>
      ・u32Length ： 有効<p>
      ・pu8Buff ： 無効<p>
    生成タイミング ： ユーザアプリケーションへの通知前<p>
    削除タイミング ： ユーザアプリケーションへの通知後 */
typedef struct CdcNotifyInfo {
    void*				pContext;						/** デバイス識別子 */
    CDC_NOTIFY_TYPE		CallbackNotifyType;				/** コールバック通知種別 */
    CDC_NOTIFY_CODE		ClassNotifyCode;				/** コミュニケーションクラス特有通知コード */
    uhs_ubit16_t		u16wValue;						/** コミュニケーションクラス通知値 */
    uhs_ubit16_t		dummy;							/** 不定 (無視して下さい) */
    uhs_ubit32_t		u32RemainBuffSize;				/** 受信バッファ残サイズ */
    uhs_ubit32_t		u32Length;						/** データのレングス長 */
    uhs_ubit8_t*		pu8Buff;						/** バッファのポインタ */
} CDC_NOTIFY_INFO;

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

/* ========================================================================= */
/* コミュニケーションデバイス情報 型の定義 */
/* ========================================================================= */
typedef struct CdcDevice {
    /* -- プロパティを表すメンバー ----------------------------------------- */
    struct usbd_usb_deviceinfo*	pUsbCore_Dev;				/* USB Core が保持するデバイス情報 */
    PCDC_PIPE					pCtrlPipe_I;				/* 本デバイスが持つ Default Ctrl In Pipe */
    PCDC_PIPE					pCtrlPipe_O;				/* 本デバイスが持つ Default Ctrl Out Pipe */
    PCDC_PIPE					pIntInPipe;					/* 本デバイスが持つ Interrupt In Pipe */
    PCDC_PIPE					pBulkInPipe;				/* 本デバイスが持つ Bulk In Pipe */
    PCDC_PIPE					pBulkOutPipe;				/* 本デバイスが持つ Bulk Out Pipe */
    PCDC_INTIN_BUFF				pIntInBuff;					/* Interrupt IN 転送用受信バッファ情報 */
    PCDC_BULKIN_BUFF			pBulkInBuff;				/* Bulk IN 転送用受信バッファ情報 */
    CDC_DEVICE_STAT				nDeviceStat;				/* デバイスの状態 */
    cdc_callback_t				pUserNotifyCallback;		/* ユーザアプリケーション層 通知 Callback 関数 */
    /* -- 制御のためのメンバー --------------------------------------------- */
    kernel_context_t			oCommExecuteLockObj;		/* コミュニケーションクラス用ロックオブジェクトの実体(Control転送IN/OUTに使用) */
    kernel_context_t*			pCommExecuteLock;			/* コミュニケーションクラス用実行ロックへのポインタ */
    kernel_context_t			oIntInExecuteLockObj;		/* インタラプト転送用ロックオブジェクトの実体(Interrupt転送INに使用) */
    kernel_context_t*			pIntInExecuteLock;			/* インタラプト転送用実行ロックへのポインタ */
    kernel_context_t			oDataInExecuteLockObj;		/* データクラス用ロックオブジェクトの実体(Bulk転送INに使用) */
    kernel_context_t*			pDataInExecuteLock;			/* データクラス用実行ロックへのポインタ */
    kernel_context_t			oDataOutExecuteLockObj;		/* データクラス用ロックオブジェクトの実体(Bulk転送OUTに使用) */
    kernel_context_t*			pDataOutExecuteLock;		/* データクラス用実行ロックへのポインタ */
    kernel_context_t			oRegistExecuteLockObj;		/* コールバック登録用ロックオブジェクトの実体(Usbh_Cdc_RegistCallBack API に使用) */
    kernel_context_t*			pRegistExecuteLock;			/* コールバック登録用実行ロックへのポインタ */
    kernel_context_t			oBulkINBuffAccessLockObj;	/* Bulk IN 転送受信バッファ用ロックオブジェクトの実体(Bulk IN 転送受信バッファに使用) */
    kernel_context_t*			pBulkINBuffAccessLock;		/* Bulk IN 転送受信バッファ用アクセスロックへのポインタ */
    /* -- 構造を表すメンバー ----------------------------------------------- */
    PCDC_DEVICE					pNext;						/* 次のコミュニケーションデバイス */
    PCDC_DRIVER					pParent;					/* 本コミュニケーションデバイスを管理する親ドライバ */
    uhs_boolean_t				(*Delete)(PCDC_DEVICE);		/* 自デバイスの削除関数 */
} CDC_DEVICE;

/* ========================================================================= */
/* コミュニケーションデバイスパイプ情報 型の定義 */
/* ========================================================================= */
typedef struct CdcPipe {
    /* -- プロパティを表すメンバー ----------------------------------------- */
    uhs_ubit32_t				u32PipeInfo;			/* 本 Pipe 情報の Core 表現キャッシュ */
    struct usb_control_block*	pUcb;					/* 本 Pipe が使用する UCB 情報 */
    struct usb_control_block*	pClearFeatureUcb;		/* 本 Pipe が使用する ClearFeature用 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, BulkOutに使用)へのポインタ */
    /* -- 構造を表すメンバー ----------------------------------------------- */
    struct usbd_usb_deviceinfo*	pParentDev;				/* 本 Pipe が属する親デバイス */
} CDC_PIPE;

/* ========================================================================= */
/* コミュニケーションデバイス Bulk IN 用受信バッファ情報 型の定義 */
/* ========================================================================= */
typedef struct CdcBulkInBuff {
    uhs_ubit8_t*				pu8StartBuff;			/* 受信バッファの先頭ポインタ */
    uhs_ubit8_t*				pu8EndBuff;				/* 受信バッファの終了ポインタ */
    uhs_ubit8_t*				pu8ReadPos;				/* 受信バッファのリードポインタ */
    uhs_ubit8_t*				pu8WritePos;			/* 受信バッファのライトポインタ */
    uhs_ubit8_t*				pu8TempBuff;			/* テンポラリィバッファの先頭ポインタ */
    uhs_ubit8_t					u8TotalBuffSize;		/* 受信バッファ総サイズ(1KB 単位) */
    uhs_ubit32_t				u32RemainBuffSize;		/* 受信バッファ残サイズ(1BYTE 単位) */
    uhs_boolean_t				isBulkINFlag;			/* Bulk IN 転送状態フラグ */
    uhs_boolean_t				isBulkINUserFlag;		/* ユーザ指示の Bulk IN 転送状態フラグ */
} CDC_BULKIN_BUFF;

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

#endif  /* __USB_CDC_TYPE_H__ */

