⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packdata.cpp

📁 符合移动协议的见空系统,很有使用简直,希望多下载
💻 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 + -