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.
PayloadAPP/Src/include/FrameRecieve.h

596 lines
15 KiB
C

#ifndef __FRAME_RECIEVE_H
#define __FRAME_RECIEVE_H
#include "framelib/basetype.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <math.h>
#define ROUND_INT8(v) ((INT8)((floor)(v+0.5)))
#define ROUND_UINT8(v) ((UINT8)((floor)(v+0.5)))
#define ROUND_INT16(v) ((INT16)((floor)(v+0.5)))
#define ROUND_UINT16(v) ((UINT16)((floor)(v+0.5)))
#define ROUND_INT32(v) ((INT32)((floor)(v+0.5)))
#define ROUND_UINT32(v) ((UINT32)((floor)(v+0.5)))
const BYTE FLAG_PLAT = 0xE0;
const BYTE PLAT_Manual = 0x00 << 5;
const BYTE PLAT_Auto = 0x01 << 5;
const BYTE PLAT_Locking = 0x02 << 5;
const BYTE PLAT_Leading = 0x03 << 5;
const BYTE PLAT_Scaning = 0x04 << 5;
const BYTE PLAT_Reseting = 0x05 << 5;
const BYTE PLAT_Init = 0x06 << 5;
const BYTE FLAG_TRACKER = 0x1C;
const BYTE TRACKER_Normal = 0x00 << 2;
const BYTE TRACKER_Error = 0x01 << 2;
const BYTE TRACKER_Lost = 0x02 << 2;
const BYTE TRACKER_Corr = 0x03 << 2;
const BYTE TRACKER_GBlack = 0x04 << 2;
const BYTE TRACKER_GWhite = 0x05 << 2;
const BYTE TRACKER_ShowFreeze = 0x06 << 2;
const BYTE TRACKER_Freeze = 0x07 << 2;
const BYTE FLAG_LIFTER = 0x03;
const BYTE LIFTER_Top = 0x00;
const BYTE LIFTER_Bottom = 0x01;
const BYTE LIFTER_Uping = 0x02;
const BYTE LIFTER_Downing = 0x03;
const BYTE FLAG_EO = 0xC0;
const BYTE EO_Working = 0x00 << 6;
const BYTE EO_Error = 0x01 << 6;
const BYTE EO_Heating = 0x02 << 6;
const BYTE EO_Heated = 0x03 << 6;
const BYTE FLAG_PAYLOAD = 0x20;
const BYTE PAYLOAD_EO = 0x00 << 5;
const BYTE PAYLOAD_HW = 0x01 << 5;
const BYTE FLAG_HW = 0x18;
const BYTE HW_Working = 0x00 << 3;
const BYTE HW_Error = 0x01 << 3;
const BYTE HW_Manual = 0x02 << 3;
const BYTE HW_Auto = 0x03 << 3;
const BYTE FLAG_LASER = 0x07;
const BYTE LASER_Normal = 0x00;
const BYTE LASER_Error = 0x01;
const BYTE LASER_Close = 0x02;
const BYTE LASER_Standby = 0x03;
const BYTE LASER_On = 0x04;
const BYTE LASER_Off = 0x05;
const double AngRatiode = 360.0 / 65535.0;
const double AngRatioen = 65535.0 / 360.0;
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);
// while (v < 0)
// v += vmax;
// while (v > vmax)
// v -= vmax;
// return v;
}
inline void ChangeFileNameExt(char *name, const char *ext)
{
char *p = strrchr(name, '.');
if(p) *(p+1) = 0;
strcat(name, ext);
}
//ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class CBufferLoop {
private:
int FSize; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
int FStart; //<2F><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ͷ
int FEnd; //<2F><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>β
int FLength; //<2F><>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
BYTE* FBuffer; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
protected:
INT16 Append(const unsigned char* Src, const UINT32 alen)
{
INT16 len = (alen > (UINT32) FSize) ? FSize : (INT16) alen;
assert(len > 0);
//<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<D5BC><E4B2BB>Length
if ((len + FLength) >= FSize)
len = FSize - FLength;
if ((len + FEnd) >= FSize) {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>󲿿ռ<D5BC><E4B2BB>Length<74><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
memcpy(FBuffer, FBuffer + FStart, FLength);
FStart = 0;
FEnd = FLength;
}
memcpy(FBuffer + FEnd, Src, len);
FEnd += len;
FLength += len;
return len;
}
void Drop(const UINT16 len)
{
assert(len > 0);
if (len > FLength) {
FStart = 0;
FEnd = 0;
FLength = 0;
} else {
FStart += len;
FLength -= len;
}
}
int Size(){return FSize;}
int Length(){return FLength;}
public:
CBufferLoop() : FSize(1000), FStart(0), FEnd(0), FLength(0), FBuffer(0)
{
FBuffer = new unsigned char[FSize];
memset(FBuffer, 0, FSize);
};
CBufferLoop(const CBufferLoop& abl)
: FSize(abl.FSize), FStart(abl.FStart), FEnd(abl.FEnd),
FLength(abl.FLength), FBuffer(0)
{
FBuffer = new unsigned char[FSize];
memcpy(FBuffer, abl.FBuffer, FSize);
}
virtual ~CBufferLoop(){
delete[] FBuffer;
FBuffer = 0;
}
CBufferLoop& operator=(const CBufferLoop& abl)
{
if (this == &abl)
return *this; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>17
if (FBuffer)
delete[] FBuffer;
FSize = abl.FSize;
FStart = abl.FStart;
FEnd = abl.FEnd;
FLength = abl.FLength;
FBuffer = new unsigned char[FSize];
memcpy(FBuffer, abl.FBuffer, FSize);
return *this;
}
BYTE* const Addr() {return FBuffer + FStart;}
void Reset()
{
memset(FBuffer, 0, FSize);
FStart = 0;
FEnd = 0;
FLength = 0;
}
};
class CSimpleCriticalSection {
private:
CRITICAL_SECTION FSection;
public:
CSimpleCriticalSection(){InitializeCriticalSection(&FSection);}
virtual ~CSimpleCriticalSection(){DeleteCriticalSection(&FSection);}
void Enter(){EnterCriticalSection(&FSection);}
void Leave(){LeaveCriticalSection(&FSection);}
};
//<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);
//<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),
cs(new CSimpleCriticalSection()),
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;
}
delete cs;
}
protected:
UINT16 FrameLength; //֡<><D6A1>
UINT16 HeadLength; //֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD>
UINT16 CheckLength; //֡<>ڱ<EFBFBD><DAB1><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ֽڵĸ<DAB5><C4B8><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[12];
TFrameType GetFrameType(){return FrameType;}
UINT16 GetFrameLength(){return FrameLength;}
UINT16 GetHeadLength(){return HeadLength;}
private:
BOOL bphrasing;
BOOL bFileOpen;
INT32 nFlushCount;
CSimpleCriticalSection* cs;
char strModuleName[1024];
char strAppPath[1024];
public:
char strDataPath[1024];
protected:
char strDataName[1024];
FILE * hFileOrg;
FILE * hFileCheck;
FILE * hFileNotCheck;
virtual BOOL FullFrame()
{
int HeaderPos, HeaderPos2;
HeaderPos = FindHead(0, Length() - HeadLength);
if (0 == HeaderPos){
//֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
if (OnCheck()){
DoCheck();
}
else //У<><D0A3>ûͨ<C3BB><CDA8>
{
HeaderPos2 = FindHead(HeadLength, Length() - HeadLength);
if ((HeaderPos2 >= 0) && (HeaderPos2 < FrameLength))
{
DoDropFrame((UINT16) HeaderPos2);
}
else if (HeaderPos2 < 0)
{
if (Length() <= FrameLength + (HeadLength - 1))
{
if (HeadLength == 1)
DoNotCheck();
else
{
BYTE* p = Addr();
if (p[FrameLength - (HeadLength - 1)] != Head[0])
DoNotCheck();
else
return TRUE;
}
} else
DoNotCheck();
}
else
{
DoNotCheck();
}
}
} else if (HeaderPos < 0) {
//û<>ҵ<EFBFBD>֡ͷ
DoDropBYTE((UINT16) (FrameLength - HeadLength));
} else {
//<2F><><EFBFBD><EFBFBD>֡ͷǰ<CDB7><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DoDropBYTE((UINT16) HeaderPos);
}
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 UINT16 Count)
{
assert(Count > 0);
++CountFrameAll;
CountBYTEDrop += Count;
++CountFrameDrop;
OnDataDropFrame(Count);
Drop(Count);
}
void DoDropBYTE(const UINT16 Count)
{
assert(Count > 0);
CountBYTEDrop += Count;
OnDataDropBYTE(Count);
Drop(Count);
}
int FindHead(int Start, const int Length)
{
assert((Start >= 0) && (Length > 0));
BYTE* p = Addr() + Start;
while (Start < Length) {
if (memcmp(p, Head, HeadLength) == 0)
return Start;
++p;
++Start;
}
return -1;
}
virtual BOOL OnCheck() //֡У<D6A1><EFBFBD><E9BAAF>
{
BYTE* p = Addr();
struCHECK ck=CheckCRC(p);
if (1 == CheckLength)
{
return (ck.C0== p[CheckPos]) ? TRUE : FALSE;
}
else if (2 == CheckLength)
{
return ((p[CheckPos]==ck.C0)&&(p[CheckPos+1]==ck.C1));
}
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 UINT16 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 UINT16 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);
Distribute();
Show();
if(bFileOpen) fwrite(Addr(), FrameLength, 1, hFileCheck);
}
public:
UINT32 funcDropBYTEParam;
UINT32 funcDropFrameParam;
UINT32 funcNotCheckParam;
UINT32 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, UINT32 Param = 0){ 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)
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 Decode(){}
virtual void Distribute(){}
virtual void Encode(){}
public:
virtual void Show(){}
};
#endif // !defined(AFX_FRAMERECIEVE_H__79D92644_4FC6_49FB_A28B_59EF7305C25A__INCLUDED_)