/******************************************************************************
�� �� ����Communication_Over_CAN.h
��������������CAN���ߵ��ź��շ�������ͷ�ļ�
��    �ߣ�����
��    ����V1.3
��    �ڣ�2017.5.31
******************************************************************************/

#ifndef _COMMUNICATION_OVER_CAN_
#define _COMMUNICATION_OVER_CAN_

#include "API.h"
#ifdef _CAN_J1939_								//----hyq--20180717  ����J1939CAN
#include "MSCAN0_J1939.h"
#include "DoCAN_J1939.h"
#else
#include "MSCAN0.h"
#include "DoCAN_ISO15765.h"
#endif
//#include "MSCAN0.h"
#include "CAN_Communication_Matrix.h"

/******************************************************************************
CANͨ�Ų�������
******************************************************************************/
#define   CoCAN_RX_MSG_FIFO_MAX_DEPTH       16    //����FIFO���
#define   CoCAN_MSG_NUM_CHECK               0     //�����������(Debug��)

#define   CoCAN_TOTAL_MSG_NUM              (sizeof(CANMsgAttrTable) / sizeof(CANMsgAttrStruct))

/******************************************************************************
CANͨ���շ�ʹ��״̬
******************************************************************************/
#define   CoCAN_DISABLE                     0
#define   COCAN_PSEUDO_DISABLE              1
#define   CoCAN_ENABLE                      2

/******************************************************************************
CAN���ķ�������״̬
******************************************************************************/
#define   CoCAN_TX_IDLE                     0
#define   CoCAN_TX_REQ                      1
#define   CoCAN_TX_ON                       2

/******************************************************************************
CAN���ķ�������״̬
******************************************************************************/
#define   CoCAN_MODE_NORMAL                 0
#define   CoCAN_MODE_INIT                   1


/******************************************************************************
CAN���ķ���FIFO�ṹ
******************************************************************************/
typedef struct
{
  uint8_t  Index[CAN_TX_MSG_NUM];
  uint8_t  Iptr;
  uint8_t  Optr;
  uint8_t  Depth;
} CoCANTxMsgFIFOStruct;

/******************************************************************************
CAN���Ľ���FIFO�ṹ
******************************************************************************/
typedef struct
{
  uint16_t Identifier;
  uint8_t  Data[8];
  uint8_t  DLC;
} CoCANMsgStruct;

typedef struct
{
  CoCANMsgStruct  Msg[CoCAN_RX_MSG_FIFO_MAX_DEPTH];
  uint8_t         Iptr;
  uint8_t         Optr;
  uint8_t         Depth;
} CoCANRxMsgFIFOStruct;

/******************************************************************************
CAN���Ŀ��ٲ��ұ��ṹ
******************************************************************************/
/*** ���ͱ��IJ��ұ��ṹ ***/
typedef struct
{
  uint16_t           Identifier;   //����ID
  uint16_t           Offset;       //���ķ���ʱ��ƫ��
  uint16_t           Cycle;        //���ķ�������
  uint8_t            Rsvd;         //����
  uint8_t            Index;        //���ͱ��Ķ�Ӧ�������Ա��ı��е����,0xFF��ʾ�������Ա���
  uint8_t            TxReq;        //��������
  uint8_t            DLC;          //���ij���
  volatile uint8_t   *pMsg;        //���ļĴ���
  const    uint8_t   *pInit;       //���ij�ʼ��ֵ
  volatile uint8_t   *pStatus;     //״̬�Ĵ���
} CoCANTxMsgIDLookupStruct;

/*** ���ձ��IJ��ұ��ṹ ***/
typedef struct
{
  uint16_t           Identifier;   //����ID
  uint16_t           Cycle;        //���ij�ʱ����,���ڵ����ж�
  uint8_t            Rsvd;         //����
  uint8_t            Index;        //���ձ��Ķ�Ӧ�������Ա��ı��е����,0xFF��ʾ�������Ա���
  uint8_t            DLCMax;       //������󳤶�
  uint8_t            DLCMin;       //����������
  volatile uint8_t   *pMsg;        //���ļĴ���
  const    uint8_t   *pInit;       //���ij�ʼ��ֵ
  const    uint8_t   *pTimeOut;    //���ĵ���ֵ
  const    uint8_t   *pMask;       //��������λ(����ijһλ�ڵ���ʱ�Ƿ����Ϊ����ֵ)
  volatile uint8_t   *pStatus;     //״̬�Ĵ���
} CoCANRxMsgIDLookupStruct;

/******************************************************************************
CAN�����Ա��Ĺ����ṹ
******************************************************************************/
typedef struct
{
  uint8_t            TxNum;                       //�����Է��ͱ�������
  uint8_t            TxIndex[CAN_TX_MSG_NUM];     //���Ķ�Ӧ�ڷ��ͱ��IJ��ұ��е����
  uint16_t           TxTimer[CAN_TX_MSG_NUM];     //���ͱ��Ķ�ʱ��

  uint8_t            RxNum;                       //�����Է��ͱ�������
  uint8_t            RxIndex[CAN_RX_MSG_NUM];     //���Ķ�Ӧ�ڷ��ͱ��IJ��ұ��е����
  uint16_t           RxTimer[CAN_RX_MSG_NUM];     //���ձ��Ķ�ʱ��,���ڵ����ж�
} CoCANCycleMsgStruct;

/******************************************************************************
CANͨ�ſ��ƽṹ
******************************************************************************/
typedef struct
{
  uint8_t   Mode;
  uint8_t   TxEnable;
  uint8_t   RxEnable;
  uint8_t   Prescaler;
  uint16_t  Timer;
} CoCANCtrlStruct;

/******************************************************************************
��������
******************************************************************************/
void CoCAN_L_Data_Indication(uint16_t Identifier, uint8_t DLC, uint8_t *Data);      //��������һ�㺯������
void CoCAN_L_Data_Request(uint16_t Identifier, uint8_t DLC, uint8_t *Data);
void CoCAN_L_Data_Confirm(uint16_t Identifier, uint8_t TransferStatus);             //��������һ�㺯������

void CoCAN_Init(void);
void CoCAN_Reset(void);
void CoCAN_Set_Mode(uint8_t Mode);
void CoCAN_Rx_Enable(uint8_t En);
void CoCAN_Tx_Enable(uint8_t En);

uint8_t CoCAN_Search_Tx_Msg(uint16_t Identifier);
uint8_t CoCAN_Search_Rx_Msg(uint16_t Identifier);

void CoCAN_Signal_Update_Service(void);               //����ÿ1ms������һ��

void CoCAN_Transmit_Message(uint16_t Identifier);
void CoCAN_Modify_Tx_Msg_Cycle(uint16_t Identifier, uint16_t Cycle);

void CoCAN_Init_Mode_Tx_ISR(void);

#endif