#ifndef COMM_HWABSTRACTION_H__
#define COMM_HWABSTRACTION_H__

#include "platmacro.h"

typedef struct _tag_ComIfOps ComIfOps;


/*
    **不同类型的COM对应的操作
*/
struct _tag_ComIfOps
{
    uint32_t hwInstance;
    uint32_t comType;
    Std_Ret_Type (*Init)(void);
    void (*Deinit)(void);
    Std_Ret_Type (*Read)(Std_Base_Type instance,ComIfData *rxPdu);
    Std_Ret_Type (*TryToRead)(Std_Base_Type instance,ComIfData *rxPdu);
    Std_Ret_Type (*Write)(Std_Base_Type instance,ComIfData *txPdu);
    Std_Ret_Type (*IsWritten)(Std_Base_Type instance);

    /*用于设置各个设备的特性: 如串口、CAN口的波特率等信息、
      具体不同的COM类型对应不同的属性
    */
    void *attr;
    Std_Ret_Type (*MakeAttrValFunc)(Std_Base_Type instance,void *attr);
};

struct _tag_ComOpsList
{
    Std_Base_Type comNum;
    const struct _tag_ComIfOps *opsMember;
};

struct _tag_ComIfHandleCfg
{
    uint8_t status;
    uint8_t type;
    /*为了将外界使用者隔离，需要对同一个硬件口的消息的Id
    进行区分 如此将应用之间隔离*/
    uint32_t startId;
    uint32_t endId;
    uint32_t instance;
    ComIf_Handle_Type handle;
};

struct _tag_ComIfHandleCfgList
{
    Std_Base_Type handleNum;
    const struct _tag_ComIfHandleCfg *handleCfg;
};

typedef Std_Ret_Type (*ComIfRecvCallback)(ComIf_Handle_Type handle, ComIfData *pComIfData);
/*-----------------------------------------------------------------------------------------
 Discription:  Com 初始化
 Param:        无
 Return:       Std_Ret_Ok:成功
               Std_Ret_Err:失败
 Modify:
*-----------------------------------------------------------------------------------------*/
extern Std_Ret_Type ComIf_Init(void);

/*-----------------------------------------------------------------------------------------
 Discription:  Com 写入数据
 Param:        @Para1:操作的虚拟HandleId
               @Para2:操作数据的数据指针
 Return:       Std_Ret_Ok:成功
               Std_Ret_Err:失败
 Modify:
*-----------------------------------------------------------------------------------------*/
extern Std_Ret_Type ComIf_Write(ComIf_Handle_Type handle, ComIfData *pComIfData);

/*-----------------------------------------------------------------------------------------
 Discription:  Com读取数据(阻塞式等待读取结果)
 Param:        @Para1:操作的虚拟HandleId
               @Para2:操作数据的数据指针
 Return:       Std_Ret_Ok:成功
               Std_Ret_Err:失败
 Modify:
*-----------------------------------------------------------------------------------------*/
extern Std_Ret_Type ComIf_Read(ComIf_Handle_Type handle, ComIfData *pComIfData);

/*-----------------------------------------------------------------------------------------
 Discription:  Com读取数据
 Param:        @Para1:操作的虚拟HandleId
               @Para2:操作数据的数据指针
 Return:       Std_Ret_Ok:成功
               Std_Ret_Err:失败
 Modify:
*-----------------------------------------------------------------------------------------*/
extern Std_Ret_Type ComIf_TryToRead(ComIf_Handle_Type handle, ComIfData *pComIfData);

/*-----------------------------------------------------------------------------------------
 Discription:  Com设置读取数据回调
               系统会自动根据当前handle设置的Id查找当前的回调处理
 Param:        @Para1:操作的虚拟HandleId
               @Para2:回调函数指针
 Return:       Std_Ret_Ok:成功
               Std_Ret_Err:失败
 Modify:
*-----------------------------------------------------------------------------------------*/
extern Std_Ret_Type ComIf_InstalRecvCallBack(ComIf_Handle_Type handle, ComIfRecvCallback pfRecvCallBack);

/*-----------------------------------------------------------------------------------------
 Discription:  Com实时处理功能
               该函数调用周期决定了CAN的吞吐量，每次调用时读取全部
               接收消息处理 (目前按照1ms)
               1)此处全部消息均采用非阻塞式读取
                 该处的速度决定了底层的驱动的吞吐量;
               2)暂时未使用底层Q回调的方式
 Param:        无
 Return:       无
 Modify:
*-----------------------------------------------------------------------------------------*/
extern void ComIf_RxRunnable(void);

/*just for test*/
extern void ComIf_TxTest(void);


#endif

