?? wmsgpacket.h
字號:
// WMsgFrame.h: interface for the CWMsgPacket class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_WMSGFRAME_H__A49013A0_E397_45F7_BAC4_2D1B7FE06678__INCLUDED_)
#define AFX_WMSGFRAME_H__A49013A0_E397_45F7_BAC4_2D1B7FE06678__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
const int MAX_PHONE_NUMBER_LEN = 15; // may has +86
const int MAX_SHORT_MSG_LEN = 160; // 160 ASCII
const int MAX_ASCII_MSG_LEN_PER_PACKET = MAX_SHORT_MSG_LEN - 7; // cf protocol
const int MAX_ASCII_MSG_LEN_OF_LASTPACKET = MAX_ASCII_MSG_LEN_PER_PACKET - 1; // last packet will use one more byte than other packets
const int MAX_BIN_MSG_BODY_LEN_PER_PACKET = MAX_ASCII_MSG_LEN_PER_PACKET / 2;
const int MAX_BIN_MSG_BODY_LEN_OF_LASTPACKET = MAX_ASCII_MSG_LEN_OF_LASTPACKET / 2;
const BYTE MIN_FRAME_NO = 0x20;
const BYTE MAX_FRAME_NO = 0x7B;
const BYTE MIN_PACKET_NO = MIN_FRAME_NO;
const BYTE MAX_PACKET_NO = MAX_FRAME_NO;
const BYTE MAX_PACKETS_PER_FRAME = MAX_PACKET_NO - MIN_PACKET_NO + 1;
const BYTE MAX_FRAMES_PER_PHONE_NO = MAX_FRAME_NO - MIN_FRAME_NO + 1;
const int MAX_ASCII_MSG_LEN_PER_FRAME = MAX_ASCII_MSG_LEN_PER_PACKET * (MAX_PACKETS_PER_FRAME - 1) +
MAX_ASCII_MSG_LEN_OF_LASTPACKET;
const int MAX_BIN_MSG_LEN_PER_FRAME = MAX_BIN_MSG_BODY_LEN_PER_PACKET * (MAX_PACKETS_PER_FRAME - 1) +
MAX_BIN_MSG_BODY_LEN_OF_LASTPACKET;
const BYTE FRAME_BEGIN_ID = 0x7D;
const BYTE FRAME_END_ID = 0X7E;
const BYTE LAST_PACKET_ID = 0X7C;
const BYTE PHONE_NUMBER_BEGIN = '\"';
const BYTE PHONE_NUMBER_END = PHONE_NUMBER_BEGIN;
class CWMsgPacket
{
public:
// 參見:協議修改建議.txt
enum MessageType
{
// 以下命令類型由發送時指定
DASHI_MSG = '^', // 0x5E : 達示數據命令;正文為達示數據;
DIAODU_MSG_NEED_ANSWER =':', // 0X3A: 調度命令,此條命令要求由司機確認;正文;
DIAODU_MSG_NEEDNOT_ANSWER = ';', // 0X3B: 調度命令,此條命令不要求由司機確認;正文;
// 以下命令類型由發送程序處理,wParam調度信息ID, lParam為指向對應電話號碼的指針
ANSWER_FRAME_MSG = '\\', // 0X5C: 此調度信息已經司機確認、由車載機回復。此時包號、幀號均為0X20,正文為四個字節的調度信息編號(見調度信息組織);
// 以下命令類型全部由收發程序處理,與主界面無關
SEND_PACKET_AGAIN_MSG = '?', // 0X3F: 車載機包數據接收錯誤,請求重發。此時幀號、包號為所接收錯誤幀的包號、幀號;正文無
SEND_FRAME_AGAIN_MSG = '[' // 0X5B: 車載機幀數據接收錯誤,請求重發。此時幀號為出錯的幀,包號為0X20,正文無;
};
CWMsgPacket();
~CWMsgPacket();
// for parser
BOOL SetPhoneNumberBegin(BYTE toSet);
BOOL SetPhoneNumberDigit(BYTE toSet);
BOOL SetPhoneNumberEnd(BYTE toSet);
BOOL SetFrameBegin(BYTE toSet);
BOOL SetFrameNo(BYTE toSet);
BOOL SetPacketNo(BYTE toSet); // packet no or last packet flag
BOOL SetLastPacketFlag(BYTE toSet);
BOOL SetMessageType(BYTE toSet);
BOOL AppendMsgTextOrCheckSum(BYTE toSet);
BOOL SetFrameEnd(BYTE toSet);
BOOL CheckCheckSum();
void Reset();
// for sender
void GenerateMsgPacket(LPCSTR lpszPhoneNumber, BYTE msgType, BYTE frameNo, BYTE packetNo, const BYTE* lpBinData, DWORD dwDataSize, BOOL bLastPacket);
const BYTE* GetDataAndSize(int& dataSize) const; // data is in text format
static BYTE PacketIndex2PacketNo(int idx);
static int PacketNo2PacketIndex(BYTE byNo);
static BOOL IsValidPacketNo(BYTE byNo);
static BOOL IsValidFrameNo(BYTE byNo);
static BOOL IsValidMsgType(BYTE byType);
static BOOL IsValidTextOrCheckSumByte(BYTE byData);
static BOOL IsValidPhoneNumberDigit(BYTE byDigit);
//
LPCSTR GetPhoneNumber() const;
BYTE GetMessageType() const;
int GetMsgBinaryData(LPBYTE lpDest) const; // return size of binary data
BYTE GetFrameNo() const;
BYTE GetPacketNo() const;
BOOL IsLastPacket() const;
private:
void AppendPhoneNumberDigit(BYTE byDigit);
void AppendPacketByte(BYTE byData);
void AppendCheckSum(); // for sender
void ConvertAndAppend(const BYTE* lpBinData, int binDataSize);
BYTE CalculateSum(int nBytes) const;
char m_szPhoneNumber[MAX_PHONE_NUMBER_LEN+1]; // to where
int m_numberDigitReceived;
// ready for sent or received
BYTE m_msgFrameData[MAX_SHORT_MSG_LEN];
// for sender
int m_dataReceived;
BOOL m_bLastPacket;
};
#endif // !defined(AFX_WMSGFRAME_H__A49013A0_E397_45F7_BAC4_2D1B7FE06678__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -