/*********************************************************************
** FILE PROLOGUE **
**********************************************************************
**********************************************************************
** File Name          : CalTest_UsrDefined_Protocol.c
** Author             : 
** Creation Date      : 
** Change Log         :
*********************************************************************/
/*********************************************************************
** FILE INCLUSION **
*********************************************************************/
#include "CAN_Hw.h"
#include "Platforms.h"
#include "CalTest_UsrDefined_Protocol.h"
#include "ECS.h"
#include "PWR.h"
#include "GENFCT.h"
#if 1
/*********************************************************************
** CONSTANT_DEFINITIONS **
*********************************************************************/
/*********************************************************************
** MACRO_DEFINITIONS **
*********************************************************************/
/*********************************************************************
** TYPE_DECLARATIONS **
*********************************************************************/
/*********************************************************************
** GLOBAL_VARIABLE_DEFINITIONS **
*********************************************************************/
/*********************************************************************
** LOCAL_VARIABLE_DEFINITIONS **
*********************************************************************/
static uint8_T CalTest_Init_flg;
/*********************************************************************
** LOCAL_FUNCTION_DECLARATIONS **
*********************************************************************/
/*********************************************************************
** FUNCTION_DEFINITIONS **
*********************************************************************/
void CalTest_UsrDefined_Protocol_Cal_FIFO_Handler(CAN_Msg_T* msg, uint8_T end_flag)
{
	uint32_T var_adr = 0;
	uint8_T* pVar;
	static uint8_T FIFO_Cnt = 0;
	static CAN_Msg_T msg_fifo[60];
	if(end_flag == 2)//clear
	{
		FIFO_Cnt = 0;
	}
	else if((FIFO_Cnt < 60)&&(end_flag == FALSE))//store
	{
		memcpy(&msg_fifo[FIFO_Cnt], msg, sizeof(CAN_Msg_T));
		FIFO_Cnt++;
	}
	else//execute
	{
		while(FIFO_Cnt)
		{
			FIFO_Cnt--;
			var_adr = *(uint32_T*)(&msg_fifo[FIFO_Cnt].ubData[0]);
			pVar = (uint8_T*)var_adr;
			for(uint8_T i = 0; i < (msg_fifo[FIFO_Cnt].ubLen - 4); i++)
			{
				pVar[i] = msg_fifo[FIFO_Cnt].ubData[4 + i];
				//pVar[msg->ubLen - 4 - i - 1] = msg->ubData[4 + i];
			}

		}
		if(end_flag == FALSE)
		{
			memcpy(&msg_fifo[FIFO_Cnt], msg, sizeof(CAN_Msg_T));
			FIFO_Cnt++;
		}
	}
}

void CalTest_UsrDefined_Protocol_Handler(CAN_Msg_T* msg, send_func_t send_func)
{
	static uint8_T Cal_FIFO_Flg = 0;
	static uint8_T Cal_Area_Flg = 0;
	static uint16_T Cal_Area_Size = 0;
	uint32_T var_adr = 0;
	uint8_T* pVar;
	if(msg->ulID.ulVal == 0x6A0)
	{
		if(Cal_FIFO_Flg == 0)
		{
			if(msg->ubLen > 4u)
			{
				var_adr = *(uint32_T*)(&msg->ubData[0]);
				pVar = (uint8_T*)var_adr;
				if(Cal_Area_Flg == 0)
				{
					for(uint8_T i = 0; i < (msg->ubLen - 4); i++)
					{
						pVar[i] = msg->ubData[4 + i];
						//pVar[msg->ubLen - 4 - i - 1] = msg->ubData[4 + i];
					}
				}
				else
				{
					for(uint16_T j = 0; j < Cal_Area_Size; j++)
					{
						for(uint8_T i = 0; i < (msg->ubLen - 4); i++)
						{
							pVar[j*(msg->ubLen - 4) + i] = msg->ubData[4 + i];
							//pVar[msg->ubLen - 4 - i - 1] = msg->ubData[4 + i];
						}
					}
					Cal_Area_Flg = 0;
					Cal_Area_Size = 0;
				}

			}
		}
		else
		{
			CalTest_UsrDefined_Protocol_Cal_FIFO_Handler(msg, 0);
		}
	}
	else if(msg->ulID.ulVal == 0x6B0)
	{
		if(msg->ubLen > 4u)
		{
			var_adr = *(uint32_T*)(&msg->ubData[0]);
			pVar = (uint8_T*)var_adr;
			for(uint8_T i = 0; i < (msg->ubLen - 4); i++)
			{
				msg->ubData[4 + i] = pVar[i];
				//msg->ubData[4 + i] = pVar[msg->ubLen - 4 - i - 1];
			}
			msg->ulID.ulVal = 0x6D0;
			send_func(msg);
		}
	}
	else if(msg->ulID.ulVal == 0x6C0)
	{
		if(msg->ubData[0] == 0x0)
		{
//			ECS_initialize();
			CalTest_Init_flg = 1;
		}
		else if (msg->ubData[0] == 0x1)
		{
			PWR_PerformReset();
		}
		else if (msg->ubData[0] == 0x2)
		{
			CalTest_UsrDefined_Protocol_Cal_FIFO_Handler(msg, 2);
			Cal_FIFO_Flg = 1;
		}
		else if (msg->ubData[0] == 0x3)
		{
			Cal_FIFO_Flg = 0;
			CalTest_UsrDefined_Protocol_Cal_FIFO_Handler(msg, 1);
		}
		else if(msg->ubData[0] == 0x4)
		{
			Cal_Area_Flg = 1;
			Cal_Area_Size = (msg->ubData[1] << 8) + msg->ubData[2];
		}
	}
	else if(msg->ulID.ulVal == 0x6E0)
	{
		if(msg->ubLen > 4u)
		{
			var_adr = *(uint32_T*)(&msg->ubData[0]);
			pVar = (uint8_T*)var_adr;
			for(uint8_T i = 0; i < (msg->ubLen - 4); i++)
			{
				msg->ubData[4 + i] = pVar[i];
				//msg->ubData[4 + i] = pVar[msg->ubLen - 4 - i - 1];
			}
			msg->ulID.ulVal = 0x6F0;
			send_func(msg);
		}
	}

}

void CalTest_Init_Task(void)
{
	if(CalTest_Init_flg == TRUE)
	{
		ECS_initialize();
//		GENFCT_Delayus(20000);
		CalTest_Init_flg = FALSE;
	}
}
#endif
