#include "StdAfx.h"
#include "FrameIMP_Down.h"

CFrameIMPDown_::CFrameIMPDown_(void)
{
	_tcscpy(Name, _T("IMP下行"));
	FrameLength = 6;
	HeadLength = 1;
	Head[0] = 0x55;
	memcpy(Addr(), Head, HeadLength);
	CheckLength = 1;
	CheckPos = FrameLength - 2;   

	memset(&Data,0,sizeof(DataIMPDown));
	memset(recvDataValue, 0, 6);
}


CFrameIMPDown_::~CFrameIMPDown_(void)
{
}

BOOL CFrameIMPDown_::FullFrame()
{
	int HeaderPos, HeaderPos2;
	HeaderPos = FindHead(0, Length() - HeadLength);    //找第一个帧头
	if (0 == HeaderPos) {
		//帧头在最前面
		if (OnCheck())     //CRC校验
			DoCheck();
		else {
			if (Length() < FrameLength)						//数据长度不足,未通过CRC校验
			{
				if (Size() < FrameLength)					//误码,未通过CRC校验
				{
					DoDropBYTE((UINT16)HeadLength);		//丢弃帧头
				}
				return TRUE;
			} 
			else										//误码,未通过CRC校验
			{
				HeaderPos2 = FindHead(HeadLength, Length() - HeadLength);
				if (HeaderPos2 >= 0)
				{
					Drop((UINT16) HeaderPos2);
					return FALSE;
				}
				else  
				{ 
					DoDropBYTE((UINT16) (Length()-(HeadLength-1))); 
					return TRUE;
				} 
			}	
		}
	} else if (HeaderPos < 0) {
		//没找到帧头
		DoDropBYTE((UINT16) (Length()-(HeadLength-1)));   
	} else {
		//丢弃帧头前的数据
		DoDropBYTE((UINT16) HeaderPos);
	}
	return FALSE;
}

BOOL CFrameIMPDown_::OnCheck()
{
	//数据帧校验
	BYTE* p = Addr();
	memcpy(recvDataValue, p, 5);
	if (Length() < FrameLength)
	{
		return false;
	}

	struCHECK ck1=CheckCRC(p);
	//if  (p[CheckPos] == ck1.C0 && p[CheckPos + 1] == ck1.C1)//CRC校验
	if  (p[CheckPos] == ck1.C0 )//和校验
	{
		memcpy(recvDataValue, p, 5);
		return true;
	}
	else
	{
		return false;
	}
}

void CFrameIMPDown_::DoCheck()
{
	CountFrameAll++;
	CountFrameCheck++;
	OnDataCheck();
	Drop(FrameLength);
}

struCHECK CFrameIMPDown_::CheckCRC(BYTE* const p)
{
	return MakeCheckSum(p+1, FrameLength - HeadLength - CheckLength - 1);//1为帧尾,IMP有一个字节的帧尾
}

void CFrameIMPDown_::Decode()
{
	ProtocalIMPDown* pBuffIMP = (ProtocalIMPDown*)Addr();
	Data.head = pBuffIMP->head;
	Data.Bytes = pBuffIMP->Bytes;
	Data.StatusWord = pBuffIMP->StatusWord;
	Data.FaultWord = pBuffIMP->FaultWord;
	Data.CHKSUM = pBuffIMP->CHKSUM;
	Data.EndFlag = pBuffIMP->EndFlag;
}