/** 
 * @brief           Communication Device Class Driver API Header
 * @author          AXELL CORPORATION
 * @description     Communication Device Class Driver提供ヘッダ<p>
 *                  アプリケーション向け（Data Class Interface以外）
 * @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_CDC_COMMIF_API_H__
#define __USB_CDC_COMMIF_API_H__
/* DOM-IGNORE-END */

#include "usb_cdc_type.h"
#include "usb_cdc_log.h"

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

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


/** コミュニケーションクラス特有通知コード */
typedef enum {
	COMM_FEATURE_SELECTOR_ABSTRACT_STATE = 1,	/** Abstruct Control Model 通信機能 */
	COMM_FEATURE_SELECTOR_COUNTRY_SETTING		/** 国コード機能 */
} COMM_FEATURE_SELECTOR;

/** 非同期シリアル通信設定情報 ストップビット */
typedef enum {
	LINE_CODING_STOPBIT_1,						/** 1 Stop Bit */
	LINE_CODING_STOPBIT_15,						/** 1.5 Stop Bit */
	LINE_CODING_STOPBIT_2						/** 2 Stop Bit */
} LINE_CODING_STOPBIT;

/** 非同期シリアル通信設定情報 パリティ */
typedef enum {
	LINE_CODING_PARITY_NONE,					/** パリティなし */
	LINE_CODING_PARITY_ODD,						/** 奇数 */
	LINE_CODING_PARITY_EVEN,					/** 偶数 */
	LINE_CODING_PARITY_MARK,					/** マーク */
	LINE_CODING_PARITY_SPACE					/** スペース */
} LINE_CODING_PARITY;

/** 非同期シリアル通信設定情報 データビット */
typedef enum {
	LINE_CODING_DATABIT_5 = 5,					/** 5 Data Bit */
	LINE_CODING_DATABIT_6,						/** 6 Data Bit */
	LINE_CODING_DATABIT_7,						/** 7 Data Bit */
	LINE_CODING_DATABIT_8,						/** 8 Data Bit */
	LINE_CODING_DATABIT_16 = 16					/** 16 Data Bit */
} LINE_CODING_DATABIT;


typedef struct CdcCommFeature* PCDC_COMM_FEATURE;	/** 通信機能情報へのポインタ */
typedef struct CdcLineCoding* PCDC_LINE_CODING;		/** 非同期シリアル通信設定情報へのポインタ */
typedef struct CdcControlLineState* PCDC_CONTROL_LINE_STATE;	/** RS232 制御信号線設定情報へのポインタ */
typedef struct CdcSendBreak* PCDC_SEND_BREAK;		/** ブレーク信号送出情報へのポインタ */

/** 通信機能情報<p>
    設定または取得したデータの詳細については、「Universal Serial Bus Communications Class Subclass 
    Specification for PSTN Devices」を参照して下さい。<p>
    生成タイミング ： 通信機能情報の設定および取得前<p>
    削除タイミング ： 通信機能情報の設定および取得後 */
typedef struct CdcCommFeature {
	COMM_FEATURE_SELECTOR	FeatureSelector;	/** 機能選択 */
	uhs_ubit16_t			u16Data;			/** 通信機能情報データ */
} CDC_COMM_FEATURE;

/** 非同期シリアル通信設定情報<p>
    生成タイミング ： 非同期シリアル通信の設定および取得前<p>
    削除タイミング ： 非同期シリアル通信の設定および取得後 */
typedef struct CdcLineCoding {
    uhs_ubit32_t			u32BaudRate;		/** 通信速度 */
    LINE_CODING_STOPBIT		StopBit;			/** ストップビット */
    LINE_CODING_PARITY		Parity;				/** パリティ */
    LINE_CODING_DATABIT		DataBit;			/** データビット */
} CDC_LINE_CODING;

/** RS232 制御信号線設定情報<p>
    設定するデータの詳細については、「Universal Serial Bus Communications Class Subclass 
    Specification for PSTN Devices」を参照して下さい。<p>
    生成タイミング ： RS232 制御信号線設定前<p>
    削除タイミング ： RS232 制御信号線設定後 */
typedef struct CdcControlLineState {
	uhs_ubit16_t	u16Data;					/** RS232 制御信号線設定情報データ */
} CDC_CONTROL_LINE_STATE;

/** ブレーク信号送出情報型<p>
    設定するデータの詳細については、「Universal Serial Bus Communications Class Subclass 
    Specification for PSTN Devices」を参照して下さい。<p>
    生成タイミング ： ブレーク信号送出前<p>
    削除タイミング ： ブレーク信号送出後 */
typedef struct CdcSendBreak {
	uhs_ubit16_t	u16Data;					/** ブレーク信号送出情報データ */
} CDC_SEND_BREAK;


extern uhs_status_t Usbh_Cdc_GetVersion(uhs_ubit8_t*  pu8MajorVersion, uhs_ubit8_t*  pu8MinorVersion);
extern uhs_status_t Usbh_Cdc_RegistCallBack(void* pContext, cdc_callback_t pUserNotifyCallback, uhs_ubit8_t u8TotalBuffSize);
extern uhs_status_t Usbh_Cdc_SendEncapsulatedCommand(void* pContext, PCDC_BUFF_INFO pstData);
extern uhs_status_t Usbh_Cdc_GetEncapsulatedResponse(void* pContext, PCDC_BUFF_INFO pstData);
extern uhs_status_t Usbh_Cdc_SetCommFeature(void* pContext, PCDC_COMM_FEATURE pstData);
extern uhs_status_t Usbh_Cdc_GetCommFeature(void* pContext, PCDC_COMM_FEATURE pstData);
extern uhs_status_t Usbh_Cdc_ClearCommFeature(void* pContext, PCDC_COMM_FEATURE pstData);
extern uhs_status_t Usbh_Cdc_SetLineCoding(void* pContext, PCDC_LINE_CODING pstData);
extern uhs_status_t Usbh_Cdc_GetLineCoding(void* pContext, PCDC_LINE_CODING pstData);
extern uhs_status_t Usbh_Cdc_SetControlLineState(void* pContext, PCDC_CONTROL_LINE_STATE pstData);
extern uhs_status_t Usbh_Cdc_SendBreak(void* pContext, PCDC_SEND_BREAK pstData);

/*****************************************************************************/
/*     extern variable                                                       */
/*****************************************************************************/

/*****************************************************************************/
/*     define macro                                                          */
/*****************************************************************************/
#ifdef USBH_STACK_DEBUG_BUILD
#define CIAPI_CDC_REPORT_SUMMARY(err) Usbh_Cdc_Log_ReportError( g_filename, __LINE__, (err), (uhs_ubit8_t*)"1", 0 )
#define CIAPI_CDC_REPORT_DETAIL(err, mesg, len) Usbh_Cdc_Log_ReportError( g_filename, __LINE__, (err), (mesg), (len) )
#define CIAPI_CDC_REPORT_MILESTONE(num) Usbh_Cdc_Log_ReportMilestone((num))
#else
#define CIAPI_CDC_REPORT_SUMMARY(err) Usbh_Cdc_Log_ReportDummy(err)
#define CIAPI_CDC_REPORT_DETAIL(err, mesg, len) Usbh_Cdc_Log_ReportDummy(err)
#define CIAPI_CDC_REPORT_MILESTONE(num) Usbh_Cdc_Log_ReportMilestone((num))
#endif

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

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

#endif /* __USB_CDC_COMMIF_API_H__ */
