📄 packdata.cpp
字号:
#include "PackData.h"
#include "Global.h"
#include "GetCRC16.h"
#include <memory.h>
extern CDMA_PACK gRPackData, gReceivePackData; ;
extern INT8U *pt_Rev, *pt_Read;
extern INT32U glSiteNo;
extern INT8U guDeviceNo;
extern SMS_INDEX sms_index[LenSMS];
extern PTSMS_INDEX ptCur_index,ptRcv_index;
extern INT8U sms_rcv[32];
extern CDMA_MODEM mdm;
extern CPack *gp_SPack, *gp_RPack;
extern String gsModuleAdd;
CPack::CPack()
{
uPackId = 0;
}
CPack::~CPack()
{
}
INT16U CPack::GetPackId()
{
if(uPackId == 0)
{
uPackId = INT8Upt_2_INT16U(&mp_Pack_data->depack_data[PRTCL_POS_SN_LOW]);
Swap_INT16U(&uPackId);
}
return uPackId;
}
INT16U CPack::GetAddressId()
{
INT16U uAddId;
uAddId = INT8Upt_2_INT16U(&mp_Pack_data->depack_data[1]);
Swap_INT16U(&uAddId);
return uAddId;
}
INT8U CPack::CheckPack_CRC()
{
INT8U str_chk[DEPACK_LENGTH];
INT16U CRC_Val;
INT16U pack_len;
INT8U *ptSwap;
pack_len = mp_Pack_data->len_depack - 2;
str_cpy(str_chk,&mp_Pack_data->depack_data[1],pack_len);
ptSwap = str_chk + pack_len - 2;
SwapCRC(ptSwap);
CRC_Val = GetCRC16(&str_chk[0],pack_len);
if(CRC_Val != 0x0000)
{
return(ACK_CRC);
}
return(ACK_NORMAL);
}
void CPack::Generate_Pack_CRC()
{
INT16U CRC_Val;
INT8U *ptCRC_Val;
INT8U pack_len;
INT8U *ptSwap;
pack_len = mp_Pack_data->len_depack - 4;
CRC_Val = GetCRC16(&mp_Pack_data->depack_data[1],pack_len);
ptCRC_Val = &mp_Pack_data->depack_data[(pack_len + 1)];
INT16U_2_INT8Upt(ptCRC_Val,CRC_Val);
////////////////////////
ptSwap = &mp_Pack_data->depack_data[1] + pack_len;
SwapCRC(ptSwap);
}
void CPack::split(INT8U *ptChar1, INT8U *ptChar2)
{
INT8U ctmp;
ctmp = (*ptChar1)&0x0f;
if(ctmp <= 0x09)
{
*(ptChar2 + 1) = ctmp+0x30;
}
else if(ctmp<=0x0f)
{
*(ptChar2 + 1) = ctmp+0x37;
}
ctmp = (*ptChar1)>>4;
if(ctmp<=0x09)
{
*ptChar2 =ctmp+0x30;
}
else if(ctmp<=0x0f)
{
*ptChar2 =ctmp+0x37;
}
}
void CPack::merge(INT8U *ptChar1, INT8U *ptChar2)
{
INT8U ctmp;
//watch_run();
if((*(ptChar2 + 1) >= 0x30)&&(*(ptChar2 + 1) <= 0x39))
{
*ptChar1 = *(ptChar2 + 1) - 0x30;
}
else if((*(ptChar2 + 1) >= (0x37 + 0X0a))&&(*(ptChar2 + 1) <= (0x37 + 0X0f)))
{
*ptChar1 = *(ptChar2 + 1) - 0x37;
}
else
{
*ptChar1 = 0x00;
}
if((*ptChar2 >= 0x30)&&(*ptChar2 <= 0x39))
{
ctmp = *ptChar2 - 0x30;
}
else if((*ptChar2 >= (0x37 + 0X0a))&&(*ptChar2 <= (0x37 + 0X0f)))
{
ctmp = *ptChar2 - 0x37;
}
else
{
ctmp = 0x00;
}
ctmp = ctmp<<4;
*ptChar1 |= ctmp;
}
void CPack::snd_uart_b(UCHAR *ptSnd, INT8U sndLength)
{
if(sndLength > 0)
m_Port->WriteToPort((char*)ptSnd,sndLength);
}
void CPack::Build_Pack(PTCDMA_PACK pack_snd, INT8U posLen, INT8U uPlType)
{
Fill_PackData(pack_snd, uPlType);
pack_snd->len_depack = posLen + 17;
pack_snd->depack_data[pack_snd->len_depack - 1] = isBit;
SetPack(pack_snd);
Generate_Pack_CRC();
Pack_Data();
}
void CPack::Build_485Pack(PTCDMA_PACK pack_snd, INT8U posLen, INT8U uPlType)
{
Fill_PackData(pack_snd, uPlType);
pack_snd->len_depack = posLen + 9;
pack_snd->depack_data[pack_snd->len_depack - 1] = ieBit;
pack_snd->depack_data[5] = posLen;
SetPack(pack_snd);
Generate_Pack_CRC();
Pack_Data();
}
CPackLocal::CPackLocal()
{
isBit = 0x7E;
ieBit = 0x7F;
}
CPackLocal::~CPackLocal()
{
}
void CPackLocal::Pack_Data()
{
INT8U i;
INT8U *ptPacked,*ptDepack;
memset(mp_Pack_data->packed_data,NULL,sizeof(mp_Pack_data->packed_data));
ptPacked = mp_Pack_data->packed_data;
ptDepack = mp_Pack_data->depack_data;
*ptPacked = *ptDepack;
ptDepack++;
ptPacked++;
for(i=1;i<(mp_Pack_data->len_depack - 1);i++,ptDepack++,ptPacked++)
{
if((*ptDepack) == '^')
{
*ptPacked = '^';
ptPacked++;
*ptPacked = 0x5D;
}
else if((*ptDepack) == '~')
{
*ptPacked = '^';
ptPacked++;
*ptPacked = 0x7D;
}
else if((*ptDepack) == 0x7F)
{
*ptPacked = '^';
ptPacked++;
*ptPacked = 0x80;
}
else
{
*ptPacked = *ptDepack;
}
}
*ptPacked = *ptDepack;
}
INT8U CPackLocal::DePack_Data()
{
INT8U i;
INT8U *ptPacked,*ptDepack;
memset(mp_Pack_data->depack_data,NULL,sizeof(mp_Pack_data->depack_data));
ptPacked = mp_Pack_data->packed_data;
ptDepack = mp_Pack_data->depack_data;
*ptDepack = *ptPacked;
ptDepack++;
ptPacked++;
for(i=1;i<DEPACK_LENGTH;i++,ptDepack++,ptPacked++)
{
if((*ptPacked) == '^')
{
ptPacked++;
if((*ptPacked) == 0x5D)
{
*ptDepack = 0x5E;
}
else if((*ptPacked) == 0x7D)
{
*ptDepack = 0x7E;
}
else if((*ptPacked) == 0x80)
*ptDepack = 0x7F;
else
{
return(ACK_OTHER);
}
continue;
}
if((*ptPacked) == '~' || *ptPacked == 0x7F)
{
*ptDepack = *ptPacked;
break;
}
else
{
*ptDepack = *ptPacked;
}
}
mp_Pack_data->len_depack = i + 1;
mp_Pack_data->mSN = INT8Upt_2_INT16U(&mp_Pack_data->depack_data[PRTCL_POS_SN_LOW]);
return(CheckPack_CRC());
}
INT8U CPackLocal::Send_Data()
{
INT16U len;
INT8U *ptChar;
ptChar = (INT8U *)str_chr(&(mp_Pack_data->packed_data[1]), 0x7E);
if(ptChar != NULL)
{
len = ptChar - (&mp_Pack_data->packed_data[0]) + 1;
}
else
{
return false;
}
m_Port->WriteToPort((char*)&mp_Pack_data->packed_data[0],len);
return true;
}
void CPackLocal::Fill_PackData(PTCDMA_PACK pack_x_snd, INT8U uPlType)
{
INT8U Buf[100];
INT16U packId;
pt_Read = &gReceivePackData.packed_data[0]; //set local send pack
memset(pt_Read, 0, PACK_LENGTH);
pack_x_snd->depack_data[0] = isBit;
pack_x_snd->depack_data[1] = 0x01;
pack_x_snd->depack_data[2] = 0x01;
INT32U_2_INT8Upt(Buf, glSiteNo);
Reverse_INT8U(Buf, 4);
str_cpy(&pack_x_snd->depack_data[PRTCL_POS_SITE_NO], Buf, 4);
pack_x_snd->depack_data[PRTCL_POS_DEVICE_NO] = guDeviceNo;
packId = Generate_Pack_Identity();
SetPackId(packId);
Swap_INT16U(&packId);
INT16U_2_INT8Upt(Buf, packId);
str_cpy(&pack_x_snd->depack_data[PRTCL_POS_SN_LOW], Buf, 2);
pack_x_snd->depack_data[PRTCL_POS_NP] = DEAL_CMMD;
pack_x_snd->depack_data[PRTCL_POS_APID] = uPlType;
pack_x_snd->depack_data[PRTCL_POS_CMMD] = ACK_CMMD;
}
CPackSMS::CPackSMS()
{
isBit = 0x21;
}
CPackSMS::~CPackSMS()
{
}
void CPackSMS::Pack_Data()
{
INT8U i;
INT8U *ptPacked,*ptDepack;
memset(mp_Pack_data->packed_data,NULL,PACK_LENGTH);
ptPacked = mp_Pack_data->packed_data;
ptDepack = mp_Pack_data->depack_data;
*ptPacked = *ptDepack;
ptDepack++;
ptPacked++;
for(i=1;i<(mp_Pack_data->len_depack - 1);i++,ptDepack++,ptPacked++)
{
split(ptDepack, ptPacked++);
}
*ptPacked = *ptDepack;
}
INT8U CPackSMS::DePack_Data()
{
INT16U i;
INT8U *ptPacked,*ptDepack;
ptPacked = mp_Pack_data->packed_data;
ptDepack = mp_Pack_data->depack_data;
*ptDepack = *ptPacked;
ptDepack++;
ptPacked++;
for(i=1;i<PACK_LENGTH;i++,ptDepack++,ptPacked++)
{
if((*ptPacked) == '!')
{
*ptDepack = *ptPacked;
break;
}
else
{
merge(ptDepack,ptPacked++);
}
}
mp_Pack_data->len_depack = i + 1;
mp_Pack_data->mSN = INT8Upt_2_INT16U(&mp_Pack_data->depack_data[PRTCL_POS_SN_LOW]);
return(CheckPack_CRC());
}
INT8U CPackSMS::Send_Data()
{
INT16U len;
INT8U *ptChar;
ptChar = (INT8U *)str_chr(&(mp_Pack_data->packed_data[1]), '!');
if(ptChar != NULL)
{
len = ptChar - (&mp_Pack_data->packed_data[0]) + 1;
}
else
{
return false;
}
if(GetPackId()<0x8000)
return Send_SMS(len, false);
else
return Send_SMS(len, true);
}
INT8U CPackSMS::Send_SMS(INT16U len,UCHAR sndType)
{
HANDLE pevent;
static UCHAR m_lenth;
static UCHAR rslt;
UCHAR *pt_start,*pt_char;
static UCHAR at_snd[30] = {"AT+CMGS=\""};
static UCHAR at_sndOut[4] = {"\xd\xa\x1a\0"};
//static UCHAR at_end[4] = {"\xd\xa"};
static UCHAR at_ok[3] = {"OK"};
//UCHAR at_Buf[1024] = "";
UCHAR *ptOK1,*ptOK2;
rslt=FALSE;
if(sndType)
pt_char = (UCHAR *)mem_ccpy((INT8U *)&at_snd[9],(INT8U *)&mdm.FRMSite_No,' ',15);
else
pt_char = (UCHAR *)mem_ccpy((INT8U *)&at_snd[9],(INT8U *)&mdm.ToSite_No,' ',15);
*pt_char = '\"';
pt_start = &at_snd[0];
pt_char = (INT8U *)memchr(&at_snd[10],'\"',29);
++pt_char;
*pt_char = 0x0d;
++pt_char;
*pt_char = 0x0a;
m_lenth = pt_char - pt_start + 1;
pt_Rev=gRPackData.packed_data;
memset(pt_Rev,NULL,PACK_LENGTH-1); /////for debug
pt_Rev = gRPackData.packed_data;
Sleep(2500);
snd_uart_b(at_snd,m_lenth);
Sleep(500);
m_lenth=sms_length(mp_Pack_data);
snd_uart_b(mp_Pack_data->packed_data,m_lenth);
Sleep(500);
snd_uart_b(at_sndOut,3);
Sleep(500);
for(int i=0; i<100; i++)
{
Sleep(100);
ptOK1 = (UCHAR *)memchr(gRPackData.packed_data,at_ok[0],(PACK_LENGTH-1));
ptOK2 = (UCHAR *)memchr(gRPackData.packed_data,at_ok[1],(PACK_LENGTH-1));
if((ptOK2 - ptOK1)==1)
{
rslt=TRUE;
break;
}
}
return rslt;
}
void CPackSMS::Fill_PackData(PTCDMA_PACK pack_x_snd, INT8U uPlType)
{
INT8U Buf[100];
INT16U packId;
pack_x_snd->depack_data[0] = isBit;
pack_x_snd->depack_data[1] = 0x02;
pack_x_snd->depack_data[2] = 0x01;
INT32U_2_INT8Upt(Buf, glSiteNo);
Reverse_INT8U(Buf, 4);
str_cpy(&pack_x_snd->depack_data[PRTCL_POS_SITE_NO], Buf, 4);
pack_x_snd->depack_data[PRTCL_POS_DEVICE_NO] = guDeviceNo;
packId = Generate_Pack_Identity();
SetPackId(packId);
Swap_INT16U(&packId);
INT16U_2_INT8Upt(Buf, packId);
str_cpy(&pack_x_snd->depack_data[PRTCL_POS_SN_LOW], Buf, 2);
pack_x_snd->depack_data[PRTCL_POS_NP] = DEAL_CMMD;
pack_x_snd->depack_data[PRTCL_POS_APID] = uPlType;
pack_x_snd->depack_data[PRTCL_POS_CMMD] = ACK_CMMD;
}
bool CPackSMS::Send_ATCommand(UCHAR *pchar, INT8U uiCount)
{
UCHAR j;
SCHAR Srslt;
UCHAR at_ok[3] = {"OK"};
UCHAR *ptOK,*ptStr;
pt_Rev=gRPackData.packed_data;
memset(pt_Rev,NULL,PACK_LENGTH); /////for debug
pt_Rev=gRPackData.packed_data;
gp_SPack->snd_uart_b(pchar,uiCount);
Sleep(500);
ptStr= gRPackData.packed_data;
for(j=0;j<100;j++)
{
ptOK = (INT8U *)mem_chr(ptStr,at_ok[0],strlen((const char *)ptStr));
if(ptOK != NULL)
{
Srslt=memcmp(ptOK,at_ok,2);
if(Srslt == 0)
{
return true;
}
}
}
return false;
}
CPack485Local::CPack485Local()
{
ieBit = 0x7F;
isBit = 0x7E;
}
CPack485Local::~CPack485Local()
{
}
void CPack485Local::Pack_Data()
{
INT8U i;
INT8U *ptPacked,*ptDepack;
memset(mp_Pack_data->packed_data,NULL,sizeof(mp_Pack_data->packed_data));
ptPacked = mp_Pack_data->packed_data;
ptDepack = mp_Pack_data->depack_data;
*ptPacked = *ptDepack;
ptDepack++;
ptPacked++;
for(i=1;i<(mp_Pack_data->len_depack - 1);i++,ptDepack++,ptPacked++)
{
if((*ptDepack) == 0x7D)
{
*ptPacked = 0x7D;
ptPacked++;
*ptPacked = ~0x7D;
}
else if((*ptDepack) == 0x7E)
{
*ptPacked = 0x7D;
ptPacked++;
*ptPacked = ~0x7E;
}
else if((*ptDepack) == 0x7F)
{
*ptPacked = 0x7D;
ptPacked++;
*ptPacked = ~0x7F;
}
else
{
*ptPacked = *ptDepack;
}
}
*ptPacked = *ptDepack;
}
INT8U CPack485Local::DePack_Data()
{
INT8U i;
INT8U *ptPacked,*ptDepack;
memset(mp_Pack_data->depack_data,NULL,sizeof(mp_Pack_data->depack_data));
ptPacked = mp_Pack_data->packed_data;
ptDepack = mp_Pack_data->depack_data;
*ptDepack = *ptPacked;
ptDepack++;
ptPacked++;
for(i=1;i<DEPACK_LENGTH;i++,ptDepack++,ptPacked++)
{
if((*ptPacked) == 0x7D)
{
ptPacked++;
*ptDepack = 255 - *ptPacked;
continue;
}
if((*ptPacked) == '~' || *ptPacked == 0x7F)
{
*ptDepack = *ptPacked;
break;
}
else
{
*ptDepack = *ptPacked;
}
}
mp_Pack_data->len_depack = i + 1;
mp_Pack_data->mSN = INT8Upt_2_INT16U(&mp_Pack_data->depack_data[PRTCL_POS_SN_LOW]);
return(CheckPack_CRC());
}
INT8U CPack485Local::Send_Data()
{
INT16U len;
INT8U *ptChar;
ptChar = (INT8U *)str_chr(&(mp_Pack_data->packed_data[1]), 0x7F);
if(ptChar != NULL)
{
len = ptChar - (&mp_Pack_data->packed_data[0]) + 1;
}
else
{
return false;
}
m_Port->WriteToPort((char*)&mp_Pack_data->packed_data[0],len);
return true;
}
void CPack485Local::Fill_PackData(PTCDMA_PACK pack_x_snd, INT8U uPlType)
{
INT8U Buf[100];
pt_Read = &gReceivePackData.packed_data[0]; //set local send pack
memset(pt_Read, 0, PACK_LENGTH);
pack_x_snd->depack_data[0] = isBit;
Str_2_INT8U(gsModuleAdd.c_str(), Buf, 2);
Reverse_INT8U(Buf, 2);
str_cpy(&pack_x_snd->depack_data[1], Buf, 2);
pack_x_snd->depack_data[3] = uPlType; //命令编号
pack_x_snd->depack_data[4] = 0x0; //应答标志
//pack_x_snd->depack_data[5] = 0x00; //命令体长度
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -