|
|
#ifndef _FRAME_RECIEVE_H
|
|
|
#define _FRAME_RECIEVE_H
|
|
|
|
|
|
#include "basetype.h"
|
|
|
#include "bufferloop.h"
|
|
|
#if _MSC_VER > 1000
|
|
|
#pragma once
|
|
|
#endif // _MSC_VER > 1000
|
|
|
|
|
|
typedef enum {
|
|
|
ftFJu, //按飞机平台上行协议校验
|
|
|
ftFJd, //按飞机平台下行协议校验
|
|
|
ftEOu, //按稳定平台上行协议校验
|
|
|
ftEOd, //按稳定平台下行协议校验
|
|
|
ftCJu, //按测距测角上行协议校验
|
|
|
ftCJd, //按测距测角下行协议校验
|
|
|
ftQBu, //按情报上行协议校验
|
|
|
ftQBd, //按情报下行协议校验
|
|
|
ftCKd, //按测控下行协议校验
|
|
|
ftSFu, ftSFd, ftFKu, ftFKd, ftEOGCSu, ftEOSBu, ftTXd, ftTXd_8B, ftTXd_8B_SM, ftTXd_8B_SAR, //图像复接数据协议
|
|
|
ftEOU_8B,
|
|
|
ftMIMUu, //MIMU上行协议数据协议
|
|
|
ftMIMUd, //MIMU下行协议数据协议
|
|
|
ftGPSu, //GPS上行协议数据协议
|
|
|
ftGPSd, //GPS下行协议数据协议
|
|
|
ftBDu, //北斗上行协议数据协议
|
|
|
ftBDd, //北斗下行协议数据协议
|
|
|
ftPOWERu, //飞控计算机发送到电源管理器的数据帧
|
|
|
ftPOWERd, //电源管理器发送到飞控计算机的数据帧
|
|
|
ftOILu, //飞控计算机发送到油量传感器的数据帧
|
|
|
ftOILd, //油量传感器发送到飞控计算机的数据帧
|
|
|
ftMAGu, //飞控计算机发送到电子罗盘的数据帧
|
|
|
ftMAGd, //电子罗盘发送到飞控计算机的数据帧
|
|
|
ftGKu, //飞控计算机发送到高度/空速传感器的数据帧
|
|
|
ftGKd, //高度/空速传感器发送到飞控计算机的数据帧
|
|
|
ftNone //自定义校验
|
|
|
}TFrameType;
|
|
|
|
|
|
inline double RoundMax(double v, double vmax)
|
|
|
{
|
|
|
return fmod(v, vmax);
|
|
|
}
|
|
|
|
|
|
inline void ChangeFileNameExt(char *name, const char *ext)
|
|
|
{
|
|
|
char *p = strrchr(name, '.');
|
|
|
if(p) *(p+1) = 0;
|
|
|
strcat(name, ext);
|
|
|
}
|
|
|
|
|
|
//解析事件回调函数类型
|
|
|
class CFrameAbstract;
|
|
|
typedef void (CALLBACK *FLDropBYTECALLBACK)(CFrameAbstract* frm, UINT16 Count);
|
|
|
typedef void (CALLBACK *FLDropFrameCALLBACK)(CFrameAbstract* frm, UINT16 Count);
|
|
|
typedef void (CALLBACK *FLNotCheckCALLBACK)(CFrameAbstract* frm);
|
|
|
typedef void (CALLBACK *FLCheckCALLBACK)(CFrameAbstract* frm,LPVOID lp);
|
|
|
//数据帧编帧、解析抽象类
|
|
|
class CFrameAbstract : public CBufferLoop {
|
|
|
public:
|
|
|
CFrameAbstract() :
|
|
|
FrameLength(32), HeadLength(2), CheckLength(1), CheckPos(31), FrameType(ftNone),
|
|
|
bphrasing(FALSE), bFileOpen(FALSE), nFlushCount(0),
|
|
|
hFileOrg(NULL), hFileCheck(NULL), hFileNotCheck(NULL),
|
|
|
funcDropBYTE(NULL), funcDropFrame(NULL), funcNotCheck(NULL), funcCheck(NULL),
|
|
|
CountBYTEAll(0), CountBYTEDrop(0), CountFrameAll(0), CountFrameCheck(0), CountFrameNotCheck(0), CountFrameDrop(0),
|
|
|
funcDropBYTEParam(NULL), funcDropFrameParam(NULL), funcNotCheckParam(NULL), funcCheckParam(NULL)
|
|
|
{};
|
|
|
virtual ~CFrameAbstract(){
|
|
|
funcDropBYTE = NULL;
|
|
|
funcDropFrame = NULL;
|
|
|
funcNotCheck = NULL;
|
|
|
funcCheck = NULL;
|
|
|
funcDropBYTEParam = NULL;
|
|
|
funcDropFrameParam = NULL;
|
|
|
funcNotCheckParam = NULL;
|
|
|
funcCheckParam = NULL;
|
|
|
while (TRUE == bphrasing){
|
|
|
Sleep(100);
|
|
|
}
|
|
|
if(bFileOpen){
|
|
|
fclose(hFileOrg);
|
|
|
fclose(hFileCheck);
|
|
|
fclose(hFileNotCheck);
|
|
|
bFileOpen = FALSE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
protected:
|
|
|
UINT16 FrameLength; //帧长
|
|
|
UINT16 HeadLength; //帧头长度
|
|
|
UINT16 CheckLength; //帧内保存校验字节的长度
|
|
|
UINT16 CheckPos; //帧内保存校验字节的位置
|
|
|
TFrameType FrameType; //帧格式类型
|
|
|
public:
|
|
|
char Name[20];
|
|
|
BYTE Head[13];
|
|
|
BOOL bphrasing;
|
|
|
TFrameType GetFrameType(){return FrameType;}
|
|
|
UINT16 GetFrameLength(){return FrameLength;}
|
|
|
UINT16 GetHeadLength(){return HeadLength;}
|
|
|
private:
|
|
|
BOOL bFileOpen;
|
|
|
INT32 nFlushCount;
|
|
|
char strModuleName[1024];
|
|
|
char strAppPath[1024];
|
|
|
public:
|
|
|
char strDataPath[1024];
|
|
|
protected:
|
|
|
char strDataName[1024];
|
|
|
FILE * hFileOrg;
|
|
|
FILE * hFileCheck;
|
|
|
FILE * hFileNotCheck;
|
|
|
|
|
|
BOOL FullFrame() //因为没有整个256做校验,排除长短帧,进行查找两个
|
|
|
{
|
|
|
int HeaderPos, HeaderPos2;
|
|
|
HeaderPos = FindHead(0, Length() - HeadLength); //
|
|
|
if (0 == HeaderPos) {
|
|
|
//帧头在最前面
|
|
|
if (OnCheck()) //用256 257
|
|
|
DoCheck();
|
|
|
else {
|
|
|
HeaderPos2 = FindHead(HeadLength, Length() - HeadLength);
|
|
|
if (HeaderPos2 >= 0)
|
|
|
{
|
|
|
Drop((UINT16) HeaderPos2);
|
|
|
TRACE("Diu >= 0\n");
|
|
|
return FALSE;
|
|
|
}
|
|
|
else
|
|
|
{ TRACE("Diu < 0\n");
|
|
|
|
|
|
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
|
|
|
return TRUE;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else if (HeaderPos < 0)
|
|
|
{
|
|
|
//没找到帧头
|
|
|
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//丢弃帧头前的数据
|
|
|
DoDropBYTE((UINT16) HeaderPos);
|
|
|
TRACE("Diu < 0\n");
|
|
|
}
|
|
|
return FALSE;
|
|
|
}
|
|
|
void DoCheck()
|
|
|
{
|
|
|
assert(FrameLength > 0);
|
|
|
CountFrameAll++;
|
|
|
CountFrameCheck++;
|
|
|
OnDataCheck();
|
|
|
Drop(FrameLength);
|
|
|
}
|
|
|
void DoNotCheck()
|
|
|
{
|
|
|
assert(FrameLength > 0);
|
|
|
CountFrameAll++;
|
|
|
CountBYTEDrop += FrameLength;
|
|
|
CountFrameNotCheck++;
|
|
|
OnDataNotCheck();
|
|
|
Drop(FrameLength);
|
|
|
}
|
|
|
void DoDropFrame(const int Count)
|
|
|
{
|
|
|
assert(Count > 0);
|
|
|
CountFrameAll++;
|
|
|
CountBYTEDrop += Count;
|
|
|
CountFrameDrop++;
|
|
|
OnDataDropFrame(Count);
|
|
|
Drop(Count);
|
|
|
}
|
|
|
void DoDropBYTE(const int Count)
|
|
|
{
|
|
|
|
|
|
if(Count <= 0) return;
|
|
|
|
|
|
assert(Count > 0);
|
|
|
|
|
|
CountBYTEDrop += Count;
|
|
|
OnDataDropBYTE(Count);
|
|
|
Drop(Count);
|
|
|
}
|
|
|
int FindHead(int Start, const int Length)
|
|
|
{
|
|
|
if((Start < 0) || (Length <=0 )) return -1;
|
|
|
assert((Start >= 0) && (Length > 0));
|
|
|
BYTE* p = Addr() + Start;
|
|
|
while (Start < (Length-HeadLength+1))
|
|
|
{
|
|
|
if (memcmp(p, Head, HeadLength) == 0)
|
|
|
return Start;
|
|
|
p++;
|
|
|
Start++;
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
virtual BOOL OnCheck() //帧校验函数
|
|
|
{
|
|
|
|
|
|
return 1;
|
|
|
BYTE* p = Addr();
|
|
|
struCHECK ck=CheckCRC(p+2);
|
|
|
if (1 == CheckLength)
|
|
|
{
|
|
|
return (ck.C0== p[CheckPos]) ? TRUE : FALSE;
|
|
|
}
|
|
|
else if (2 == CheckLength)
|
|
|
{
|
|
|
return ((p[CheckPos]==ck.C1)&&(p[CheckPos+1]==ck.C0));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
protected:
|
|
|
FLDropBYTECALLBACK funcDropBYTE;
|
|
|
FLDropFrameCALLBACK funcDropFrame;
|
|
|
FLNotCheckCALLBACK funcNotCheck;
|
|
|
FLCheckCALLBACK funcCheck;
|
|
|
|
|
|
INT32 CountBYTEAll; //接收到的全部字节数
|
|
|
INT32 CountBYTEDrop; //丢弃的字节数
|
|
|
INT32 CountFrameAll; //全部帧计数
|
|
|
INT32 CountFrameCheck; //有效帧计数
|
|
|
INT32 CountFrameNotCheck; //校验错的帧计数
|
|
|
INT32 CountFrameDrop; //短帧计数
|
|
|
virtual void OnDataDropBYTE(const int Count) //无效字节段事件函数,需用户自行编制处理函数
|
|
|
{
|
|
|
if (funcDropBYTE != NULL) funcDropBYTE(this, Count);
|
|
|
}
|
|
|
virtual void OnDataDropFrame(const int Count) //短帧事件函数,需用户自行编制处理函数
|
|
|
{
|
|
|
if (funcDropFrame != NULL) funcDropFrame(this, Count);
|
|
|
}
|
|
|
virtual void OnDataNotCheck() //帧校验错事件函数,需用户自行编制处理函数
|
|
|
{
|
|
|
//Decode();
|
|
|
if (funcNotCheck != NULL) funcNotCheck(this);
|
|
|
//Distribute();
|
|
|
//Show();
|
|
|
if(bFileOpen) fwrite(Addr(), FrameLength, 1, hFileNotCheck);
|
|
|
}
|
|
|
virtual void OnDataCheck() //有效帧事件函数,需用户自行编制处理函数
|
|
|
{
|
|
|
Decode();
|
|
|
if (funcCheck != NULL) funcCheck(this,funcCheckParam);
|
|
|
Distribute();
|
|
|
Show();
|
|
|
if(bFileOpen) fwrite(Addr(), FrameLength, 1, hFileCheck);
|
|
|
}
|
|
|
|
|
|
public:
|
|
|
UINT32 funcDropBYTEParam;
|
|
|
UINT32 funcDropFrameParam;
|
|
|
UINT32 funcNotCheckParam;
|
|
|
LPVOID funcCheckParam;
|
|
|
void SetDropBYTECallback(FLDropBYTECALLBACK fun, UINT32 Param = 0){ funcDropBYTE = fun; funcDropBYTEParam = Param;}
|
|
|
void SetDropFrameCallback(FLDropFrameCALLBACK fun, UINT32 Param = 0){ funcDropFrame = fun; funcDropFrameParam = Param;}
|
|
|
void SetNotCheckCallback(FLNotCheckCALLBACK fun, UINT32 Param = 0){ funcNotCheck = fun; funcNotCheckParam = Param;}
|
|
|
void SetCheckCallback(FLCheckCALLBACK fun,LPVOID Param = NULL){funcCheck = fun; funcCheckParam = Param;}
|
|
|
void SetSaveStatus(BOOL IsSave, const char *name = NULL)
|
|
|
{
|
|
|
if(IsSave){
|
|
|
GetModuleFileName(GetModuleHandle(NULL), strModuleName, 1024);
|
|
|
char *p = strrchr(strModuleName, '\\');
|
|
|
if(p) strncpy(strAppPath, strModuleName, p - strModuleName);
|
|
|
else strcpy(strAppPath, strModuleName);
|
|
|
|
|
|
time_t ltime;
|
|
|
struct tm *t;
|
|
|
time( <ime );
|
|
|
t = localtime( <ime );
|
|
|
|
|
|
sprintf(strDataPath, "%s\\RecordOrg-%04d%02d%02d", strAppPath, t->tm_year, t->tm_mon, t->tm_mday);
|
|
|
char temp[1024];
|
|
|
sprintf(temp, "%04d%02d%02d %02d%02d%02d", t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
|
|
|
CreateDirectory((LPCSTR)strDataPath, NULL);
|
|
|
|
|
|
if(name == NULL){
|
|
|
sprintf(strDataName, "%s\\%s-%s.dat", strDataPath, temp, Name);
|
|
|
}
|
|
|
else{
|
|
|
sprintf(strDataName, "%s\\%s-%s.dat", strDataPath, temp, name);
|
|
|
}
|
|
|
|
|
|
if((hFileOrg = fopen(strDataName, "wb")) != NULL){
|
|
|
strcpy(temp, strDataName);
|
|
|
ChangeFileNameExt(temp,"chk");
|
|
|
if((hFileCheck = fopen(temp, "wb")) != NULL){
|
|
|
strcpy(temp, strDataName);
|
|
|
ChangeFileNameExt(temp,"err");
|
|
|
if((hFileNotCheck = fopen(temp, "wb")) != NULL){
|
|
|
bFileOpen = TRUE;
|
|
|
}
|
|
|
else{
|
|
|
fclose(hFileCheck);
|
|
|
fclose(hFileOrg);
|
|
|
}
|
|
|
bFileOpen = TRUE;
|
|
|
}
|
|
|
else{
|
|
|
fclose(hFileOrg);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else{
|
|
|
if(bFileOpen){
|
|
|
fclose(hFileOrg);
|
|
|
fclose(hFileCheck);
|
|
|
fclose(hFileNotCheck);
|
|
|
bFileOpen = FALSE;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ResetCount()
|
|
|
{
|
|
|
//用于计数清零
|
|
|
CountBYTEAll = 0L;
|
|
|
CountBYTEDrop = 0L;
|
|
|
CountFrameAll = 0L;
|
|
|
CountFrameCheck = 0L;
|
|
|
CountFrameNotCheck = 0L;
|
|
|
CountFrameDrop = 0L;
|
|
|
}
|
|
|
void Phrase(const BYTE* Src, const UINT32 Count)
|
|
|
{
|
|
|
cs->Enter();
|
|
|
int ReadCount;
|
|
|
UINT32 LeftCount = Count;
|
|
|
const BYTE* psrc = Src;
|
|
|
bphrasing = TRUE;
|
|
|
while (LeftCount > 0)
|
|
|
{
|
|
|
ReadCount = Append(psrc, LeftCount);//
|
|
|
psrc += ReadCount;
|
|
|
LeftCount -= ReadCount;
|
|
|
CountBYTEAll += ReadCount;
|
|
|
while (Length() >= (FrameLength+HeadLength)) //
|
|
|
if (FullFrame())
|
|
|
break;
|
|
|
}
|
|
|
try{
|
|
|
if(bFileOpen)
|
|
|
{
|
|
|
fwrite(Src, Count, 1, hFileOrg);
|
|
|
if((CountBYTEAll - nFlushCount) > 40960)
|
|
|
{
|
|
|
fflush(hFileOrg);
|
|
|
fflush(hFileCheck);
|
|
|
fflush(hFileNotCheck);
|
|
|
nFlushCount = CountBYTEAll;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
catch (...)
|
|
|
{
|
|
|
cs->Leave();
|
|
|
bphrasing = FALSE;
|
|
|
}
|
|
|
cs->Leave();
|
|
|
bphrasing = FALSE;
|
|
|
}
|
|
|
INT32 GetCountBYTEAll(){return CountBYTEAll;}
|
|
|
INT32 GetCountBYTEDrop(){return CountBYTEDrop;}
|
|
|
INT32 GetCountFrameAll(){return CountFrameAll;}
|
|
|
INT32 GetCountFrameCheck(){return CountFrameCheck;}
|
|
|
INT32 GetCountFrameNotCheck(){return CountFrameNotCheck;}
|
|
|
INT32 GetCountFrameDrop(){return CountFrameDrop;}
|
|
|
//output
|
|
|
protected:
|
|
|
virtual void FrameCrc(BYTE* p)
|
|
|
{
|
|
|
struCHECK ck=CheckCRC(p);
|
|
|
if (CheckLength==1)
|
|
|
{
|
|
|
p[CheckPos]=ck.C0;
|
|
|
}
|
|
|
if (CheckLength==2)
|
|
|
{
|
|
|
p[CheckPos] = ck.C0;
|
|
|
p[CheckPos+1]=ck.C1;
|
|
|
}
|
|
|
}
|
|
|
public:
|
|
|
virtual BYTE* SendPrepare()
|
|
|
{
|
|
|
BYTE* po;
|
|
|
po = Addr();
|
|
|
Encode();
|
|
|
FrameCrc(po);
|
|
|
return(po);
|
|
|
}
|
|
|
virtual struCHECK CheckCRC(BYTE* const p) = 0;
|
|
|
protected:
|
|
|
virtual void Encode(){}
|
|
|
virtual void Decode(){}
|
|
|
virtual void Distribute(){}
|
|
|
public:
|
|
|
virtual void Show(){}
|
|
|
};
|
|
|
|
|
|
#endif // !defined(AFX_FRAMERECIEVE_H__79D92644_4FC6_49FB_A28B_59EF7305C25A__INCLUDED_)
|