
#ifndef J1939_C_
#define J1939_C_

#include"j1939.h"
#include"j1939_queue.h"
#include"j1939_tp.h"
#include "j1939_tools.h"


/*****************************************************************************
 *函数名称:J1939_Init
 *函数功能:J1939初始化硬件初始化,信息清除
 *参    数:J1939Context* J1939_PAGED context  J1939内容
 *         J1939CanDevInfo* J1939_PAGED can_dev设备信息,用于初始化CAN硬件
 *返 回 值:J1939_OK 成功,其他失败
 *作    者:Admin
 *修订信息:
 ******************************************************************************/
J1939Result J1939_Init(J1939Context* J1939_PAGED context, J1939CanDeviceParam* J1939_PAGED can_dev)
{
	uint8_T result = J1939_OK;

	if ((context == NULL) || (can_dev == NULL))
	{
		return J1939_PTR_NULL;
	}

	J1939_BufferCopy (&context->device_param,  can_dev, sizeof(J1939CanDeviceParam));
	
	return  result;
}
/*****************************************************************************
 *函数名称:J1939_TxMsg
 *函数功能:J1939发送消息函数
 *参    数:J1939Context* J1939_PAGED context 1939内容
 *         J1939TxMsg* J1939_PAGED msg要发送的信息
 *返 回 值:J1939_OK 成功,其他失败
 *作    者:Admin
 *修订信息:
 ******************************************************************************/
 
J1939Result J1939_TxMsg(J1939Context* J1939_PAGED context, J1939Msg* J1939_PAGED msg)
{
	ComIfData frame;
        ComIf_Handle_Type  Can_Handle;
	if ((context == NULL) || (msg == NULL))
	{
		return J1939_PTR_NULL;
	}

	if ((msg->msg_len > msg->msg_max_len)||(msg->msg_len == 0))
	{
		return J1939_MSG_LEN_TO_LONG;
	}

	if (msg->msg_len <= J1939_CAN_FRAME_DATA_LEN)
	{
		frame.infor.id = msg->id.value;
		frame.bufSize= (uint8_T) msg->msg_len;
		frame.infor.ide = CAN_ID_EXT;
                frame.buffer=(uint8_T *)(&msg->data[0]);
                Can_Handle=context->device_param.handleid;
                Rte_Comm_Write(Can_Handle,&frame);
		return J1939_OK;
	}
	else
	{
		return J1939_TpTxSessionCreate(context, msg);
	}
}
/*****************************************************************************
 *函数名称:J1939_RxMsg
 *函数功能:J1939接收消息函数
 *参    数:J1939Context* J1939_PAGED context J1939内容指针
 *         J1939RxMsg* J1939_PAGED msg接收的消息的指针
 *返 回 值:成功则返回J1939_OK，否则返回其他
 *作    者:Admin
 *修订信息:
 ******************************************************************************/
J1939Result J1939_RxMsg(J1939Context* J1939_PAGED context, J1939Msg* J1939_PAGED msg)
{
	J1939CanFrame frame;

	if ((context == NULL) || (msg == NULL))
	{
		return J1939_PTR_NULL;
	}
	//非单帧信息
	if (J1939_PopRxMsgFromQueue(&context->rx_msg_queue, msg) == J1939_OK)
	{
		return J1939_OK;
	}
	//单帧信息
	if (J1939_PopCanFrameFromQueue(&context->rx_frame_queue, &frame) == J1939_OK)
	{
		if (frame.data_len > J1939_CAN_FRAME_DATA_LEN)
		{
			msg->msg_len = J1939_CAN_FRAME_DATA_LEN;
		}
		else
		{
			msg->msg_len = frame.data_len;
		}

		J1939_BufferCopy( msg->data,  frame.data, msg->msg_len);

		msg->id.value = frame.id.value;

		msg->pgn = ((uint16_T) frame.id.Bits.PF << 8);
        
        msg->dest_addr = frame.id.Bits.PS; //目标地址
	    msg->source_addr = frame.id.Bits.SA;//原地址
        
        
		if (frame.id.Bits.PF > 239)
		{
			msg->pgn += frame.id.Bits.PS;
		}

		return J1939_OK;
	}
	//没有信息
	return J1939_MSG_EMPTY;
}
/*****************************************************************************
 *函数名称:J1939_TxCanFrame
 *函数功能:J1939发送CAN数据帧,调用频率1ms/次,最长调用时间最好不要超过5ms/次。
 *参    数:J1939Context* J1939_PAGED context   J1939内容指针
 *返 回 值:成功则返回J1939_OK，否则返回其他
 *作    者:Admin
 *修订信息:
 ******************************************************************************/
J1939Result J1939_TxCanFrame(J1939Context* J1939_PAGED context)
{
    J1939CanFrame msg;
    ComIfData frame;
    ComIf_Handle_Type  Can_Handle;
    
	if (context == NULL)
	{
		return J1939_PTR_NULL;
	}

	if(J1939_PopCanFrameFromQueue(&context->tx_frame_tmp_queue, &msg) == J1939_OK)
	{
        frame.infor.id=msg.id.value;
        frame.bufSize=msg.data_len;
        frame.infor.ide=CAN_ID_EXT;
        
    	frame.buffer=(uint8_T *)(msg.data);
        
        Can_Handle=context->device_param.handleid;
        Rte_Comm_Write(Can_Handle,&frame);
	}
	return J1939_OK;
}
/*****************************************************************************
 *函数名称:J1939_TpSession
 *函数功能:J1939发送接收TP,调用频率as fast as you can.
 *参    数:J1939Context* J1939_PAGED context   J1939内容指针
 *返 回 值:无
 *作    者:Admin
 *修订信息:
 ******************************************************************************/
void J1939_TpSession(J1939Context* J1939_PAGED context)
{
	if (context == NULL)
	{
		return;
	}

  (void) J1939_TPTxMsg(context);
  (void) J1939_TPRxMsg(context);
  (void)J1939_TxCanFrame(context);
}





#endif
