You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

412 lines
10 KiB
C

2 years ago
#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, //<2F><><EFBFBD>ɻ<EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftFJd, //<2F><><EFBFBD>ɻ<EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftEOu, //<2F><><EFBFBD>ȶ<EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftEOd, //<2F><><EFBFBD>ȶ<EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftCJu, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftCJd, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftQBu, //<2F><><EFBFBD><EFBFBD><E9B1A8><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftQBd, //<2F><><EFBFBD><EFBFBD><E9B1A8><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftCKd, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>У<EFBFBD><D0A3>
ftSFu, ftSFd, ftFKu, ftFKd, ftEOGCSu, ftEOSBu, ftTXd, ftTXd_8B, ftTXd_8B_SM, ftTXd_8B_SAR, //ͼ<>񸴽<EFBFBD><F1B8B4BD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
ftEOU_8B,
ftMIMUu, //MIMU<4D><55><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
ftMIMUd, //MIMU<4D><55><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
ftGPSu, //GPS<50><53><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
ftGPSd, //GPS<50><53><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
ftBDu, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
ftBDd, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
ftPOWERu, //<2F>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
ftPOWERd, //<2F><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
ftOILu, //<2F>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
ftOILd, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
ftMAGu, //<2F>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD>֡
ftMAGd, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD><CCB7>͵<EFBFBD><CDB5>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
ftGKu, //<2F>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5>߶<EFBFBD>/<2F><><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
ftGKd, //<2F>߶<EFBFBD>/<2F><><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5>ɿؼ<C9BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
ftNone //<2F>Զ<EFBFBD><D4B6><EFBFBD>У<EFBFBD><D0A3>
}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);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
//<2F><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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; //֡<><D6A1>
UINT16 HeadLength; //֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD>
UINT16 CheckLength; //֡<>ڱ<EFBFBD><DAB1><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ֽڵij<DAB5><C4B3><EFBFBD>
UINT16 CheckPos; //֡<>ڱ<EFBFBD><DAB1><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ֽڵ<D6BD>λ<EFBFBD><CEBB>
TFrameType FrameType; //֡<><D6A1>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
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() //<2F><>Ϊû<CEAA><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35><36>У<EFBFBD><EFBFBD>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
int HeaderPos, HeaderPos2;
HeaderPos = FindHead(0, Length() - HeadLength); //
if (0 == HeaderPos) {
//֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
if (OnCheck()) //<2F><>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)
{
//û<>ҵ<EFBFBD>֡ͷ
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
}
else
{
//<2F><><EFBFBD><EFBFBD>֡ͷǰ<CDB7><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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() //֡У<D6A1><EFBFBD><E9BAAF>
{
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; //<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
INT32 CountBYTEDrop; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
INT32 CountFrameAll; //ȫ<><C8AB>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
INT32 CountFrameCheck; //<2F><>Ч֡<D0A7><D6A1><EFBFBD><EFBFBD>
INT32 CountFrameNotCheck; //У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
INT32 CountFrameDrop; //<2F><>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
virtual void OnDataDropBYTE(const int Count) //<2F><>Ч<EFBFBD>ֽڶ<D6BD><DAB6>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>б<EFBFBD><D0B1>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (funcDropBYTE != NULL) funcDropBYTE(this, Count);
}
virtual void OnDataDropFrame(const int Count) //<2F><>֡<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>б<EFBFBD><D0B1>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (funcDropFrame != NULL) funcDropFrame(this, Count);
}
virtual void OnDataNotCheck() //֡У<D6A1><D0A3><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>б<EFBFBD><D0B1>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//Decode();
if (funcNotCheck != NULL) funcNotCheck(this);
//Distribute();
//Show();
if(bFileOpen) fwrite(Addr(), FrameLength, 1, hFileNotCheck);
}
virtual void OnDataCheck() //<2F><>Ч֡<D0A7>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>б<EFBFBD><D0B1>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
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( &ltime );
t = localtime( &ltime );
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()
{
//<2F><><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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_)