📄 prlsupport.c
字号:
//******************************************************************
//
// 结构定义文件:PrlSupportFunc.c
// 文件内容:104协议支持函数集
// 结构定义规则:见文档《变量定义规范》
// 创建者:
// 创建时间:2007-8-1
//******************************************************************
//*************************头文件包含区*****************************
#include "PrlFuncDeclare.h"
#include "ShareMemDebugOut.h"
#include "ShareMemOp.h"
//******************************************************************
BSTATUS ToNetMessage(TPrlFrame *PrlFrame, TNetMessage *Message)
{
unsigned short int CRC;
if (PrlFrame->HeadFlag == HEAD_UNFIXED_FRAME)
{
Message->Content[OFFS_HEAD] = HEAD_UNFIXED_FRAME;
Message->Content[OFFS_LEN_LOW] = (PrlFrame->UserData.DataLen+OFFS_USER_DATA_FRAME+OFFS_UD_DATA-OFFS_CTRL_FLAG) &0x00ff ;
Message->Content[OFFS_LEN_HIGH] = (PrlFrame->UserData.DataLen+OFFS_USER_DATA_FRAME+OFFS_UD_DATA-OFFS_CTRL_FLAG) >> 8;
Message->Content[OFFS_SUB_HEAD] = SUB_HEAD_FLAG;
Message->Content[OFFS_CTRL_FLAG] = PrlFrame->Control;
Message->Content[OFFS_LINK_ADDR] = PrlFrame->LinkAddress;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_FRAME_TYPE] = PrlFrame->UserData.FrameType;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_REC_NUM] = PrlFrame->UserData.RecordNum;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_REASON] = PrlFrame->UserData.TransReason;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_DEV_ADDR_THREADID] = PrlFrame->UserData.DeviceAddress.ThreadID;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_DEV_ADDR_DSPID] = PrlFrame->UserData.DeviceAddress.DspID;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_REC_TYPE] = PrlFrame->UserData.DataRecordType;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_FRAME_SUM] = PrlFrame->UserData.FrameSum;
Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_FRAME_ID] = PrlFrame->UserData.FrameID;
//IF判断是否存在用户数据
if (PrlFrame->UserData.DataLen > 0)
{
memcpy(&Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_DATA], PrlFrame->UserData.Data, PrlFrame->UserData.DataLen);
}
CRC = CheckCRC(Message->Content+OFFS_CTRL_FLAG, PrlFrame->UserData.DataLen+OFFS_USER_DATA_FRAME+OFFS_UD_DATA-OFFS_CTRL_FLAG);
Message->Content[PrlFrame->UserData.DataLen+OFFS_USER_DATA_FRAME+OFFS_UD_DATA] = CRC&0x00ff;
Message->Content[PrlFrame->UserData.DataLen+OFFS_USER_DATA_FRAME+OFFS_UD_DATA+1] = (CRC>>8);
Message->Content[PrlFrame->UserData.DataLen+OFFS_USER_DATA_FRAME+OFFS_UD_DATA+2] = TAIL_UNFIXED_FRAME;
Message->Length = PrlFrame->UserData.DataLen+OFFS_USER_DATA_FRAME+OFFS_UD_DATA+3;
return B_TRUE;
}
else if (PrlFrame->HeadFlag == HEAD_FIXED_FRAME)
{
Message->Content[OFFS_HEAD] = HEAD_FIXED_FRAME;
Message->Content[FIXED_OFFS_CONTROL] = PrlFrame->Control;
Message->Content[FIXED_OFFS_LINK_ADDR] = PrlFrame->LinkAddress;
CRC = CheckCRC(Message->Content+FIXED_OFFS_CONTROL, 2);
Message->Content[FIXED_OFFS_CRC_LOW] = (CRC&0x00ff);
Message->Content[FIXED_OFFS_CRC_HIGH] = (CRC>>8);
Message->Content[FIXED_OFFS_TAIL] = TAIL_FIXED_FRAME;
Message->Length = FIXED_OFFS_TAIL+1;
return B_TRUE;
}
return B_FALSE;
}
BSTATUS ToFixedFrame(TNetMessage *Message, TPrlFrame *PrlFrame)
{
PrlFrame->HeadFlag = Message->Content[OFFS_HEAD];
PrlFrame->Control = Message->Content[FIXED_OFFS_CONTROL];
PrlFrame->LinkAddress = Message->Content[FIXED_OFFS_LINK_ADDR];
PrlFrame->LowCRC = Message->Content[FIXED_OFFS_CRC_LOW];
PrlFrame->HighCRC = Message->Content[FIXED_OFFS_CRC_HIGH];
PrlFrame->TailFlag = Message->Content[FIXED_OFFS_TAIL];
PrlFrame->UserData.DataLen = 0;
//检查TailFlag
if (PrlFrame->TailFlag != TAIL_FIXED_FRAME)
{
return B_FALSE;
}
//检查CRC校验和
//按照通信规约无法检查
return B_TRUE;
}
BSTATUS ToUnfixedFrame(TNetMessage *Message, TPrlFrame *PrlFrame)
{
unsigned short int CRC;
unsigned short int Length;
PrlFrame->HeadFlag = Message->Content[OFFS_HEAD];
PrlFrame->LowLength = Message->Content[OFFS_LEN_LOW];
PrlFrame->HighLength = Message->Content[OFFS_LEN_HIGH];
PrlFrame->SubHeadFlag = Message->Content[OFFS_SUB_HEAD];
PrlFrame->Control = Message->Content[OFFS_CTRL_FLAG];
PrlFrame->LinkAddress = Message->Content[OFFS_LINK_ADDR];
PrlFrame->UserData.FrameType = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_FRAME_TYPE];
PrlFrame->UserData.RecordNum = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_REC_NUM];
PrlFrame->UserData.TransReason = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_REASON];
PrlFrame->UserData.DeviceAddress.ThreadID = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_DEV_ADDR_THREADID];
PrlFrame->UserData.DeviceAddress.DspID = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_DEV_ADDR_DSPID];
PrlFrame->UserData.DataRecordType = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_REC_TYPE];
PrlFrame->UserData.FrameSum = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_FRAME_SUM];
PrlFrame->UserData.FrameID = Message->Content[OFFS_USER_DATA_FRAME+OFFS_UD_FRAME_ID];
Length = PrlFrame->HighLength;
Length = (Length << 8) + PrlFrame->LowLength;
PrlFrame->LowCRC = Message->Content[Length+OFFS_CTRL_FLAG];
PrlFrame->HighCRC = Message->Content[Length+OFFS_CTRL_FLAG+1];
PrlFrame->TailFlag = Message->Content[Length+OFFS_CTRL_FLAG+2];
memcpy(PrlFrame->UserData.Data
, Message->Content+OFFS_USER_DATA_FRAME+OFFS_UD_DATA
, Length+OFFS_USER_DATA_FRAME+OFFS_UD_DATA-OFFS_CTRL_FLAG);
CRC = PrlFrame->HighCRC;
CRC = (CRC << 8) + PrlFrame->LowCRC;
NqsDebugOut("Leave ToUnfixedFrame", 0);
if(CheckCRC(&Message->Content[OFFS_CTRL_FLAG],Length)!=CRC)
{
NqsDebugOut("CheckCRC FAILED", 0);
return B_FALSE;
}
return B_TRUE;
}
void DspDeal(TNetMessage *Message) /* xiaobo */
{
int ret;
ret = sendto(Message->Server, Message->Content, Message->Length, 0,
(struct sockaddr *) &Message->FromAddr, Message->FromAddrLen);
if(ret != Message->Length)
return;
NqsDebugOut("enter dsp check...", 0);
close(Message->Server);
ActiveTimer(STATUS_REQ_CHECK_DSP, B_TRUE);
usleep(100);
while(GetTimerVal(STATUS_REQ_CHECK_DSP) != 0)
{
usleep(100);
CheckModuleControl(IX_M_NQS, NULL, NULL, NULL, NULL, NULL, NULL);
}
Message->Server = NetCreateServer();
if (Message->Server <= 0)
{
NqsDebugOut("Create Server after dsp Failed ", 0);
exit(0);
}
NqsDebugOut("exit dsp check...", 0);
}
BSTATUS ResolveMessageToFrame(TNetMessage *Message, TPrlFrame *PrlFrame)
{
PrlFrame->HeadFlag = Message->Content[OFFS_HEAD];
if (PrlFrame->HeadFlag == HEAD_FIXED_FRAME)
{
return ToFixedFrame(Message, PrlFrame);
}
if (PrlFrame->HeadFlag == HEAD_UNFIXED_FRAME)
{
return ToUnfixedFrame(Message, PrlFrame);
}
if (PrlFrame->HeadFlag == HEAD_REBOOT)
{
SetNeedReboot(B_TRUE);
}
if (PrlFrame->HeadFlag == HEAD_DSP) /* xiaobo */
{
DspDeal(Message);
}
return B_FALSE;
}
unsigned short int CheckCRC(char *data_p, unsigned short int length)
{
unsigned char i;
unsigned short int data;
unsigned short int crc = 0xffff;
if (length == 0)
return (~crc);
do
{
for (i=0, data=(unsigned short int)0xff & *data_p++;
i < 8;
i++, data >>= 1)
{
if ((crc & 0x0001) ^ (data & 0x0001))
crc = (crc >> 1) ^ 0x1021;
else crc >>= 1;
}
} while (--length);
crc = ~crc;
data = crc;
crc = (crc << 8) | (data >> 8 & 0xff);
return (crc);
}
//求两个时间相差分钟数
long GetMinOffset(TimeYS time1, TimeYS time2)
{
struct tm tm1, tm2;
time_t t1, t2;
long minoffset;
tm1.tm_year = time1.Year - 1900;
tm1.tm_mon = time1.Month - 1;
tm1.tm_mday = time1.Day;
tm1.tm_hour = time1.Hour;
tm1.tm_min = time1.Minute;
tm1.tm_sec = 0;
t1 = mktime(&tm1);
tm2.tm_year = time2.Year - 1900;
tm2.tm_mon = time2.Month - 1;
tm2.tm_mday = time2.Day;
tm2.tm_hour = time2.Hour;
tm2.tm_min = time2.Minute;
tm2.tm_sec = 0;
t2 = mktime(&tm2);
minoffset = (t2-t1)/60;
// if(minoffset < 0)minoffset = 0;
return minoffset;
}
//检查统计区时标是否与要显示的时标一致
//返回:0--不一致,1--一致
int CheckTimeMatch(int stat, TimeYS stattime, TimeYS curtime)
{
int timematch;
TimeYS tmpstattime, tmpcurtime;
unsigned int minsperiod;
unsigned long mins;
timematch = 0;
tmpstattime = stattime;
tmpcurtime = curtime;
GetGlobalParam(GPT_MINUTES_PERIOD, &minsperiod);
switch(stat)
{
case 0://分钟匹配
tmpstattime.Second = 0;
if(tmpstattime.Minute % minsperiod != 0)
{
tmpstattime.Minute -= tmpstattime.Minute%minsperiod;
}
mins = GetMinOffset(tmpstattime, tmpcurtime);
if(mins >= minsperiod &&
mins < minsperiod *2)
{
timematch = 1;
}
break;
case 1://小时匹配
tmpstattime.Minute = 0;
tmpstattime.Second = 0;
mins = GetMinOffset(tmpstattime, curtime);
if(mins >= 60 && mins < 60*2)
{
timematch = 1;
}
break;
case 2:
tmpstattime.Hour = 0;
tmpstattime.Minute = 0;
tmpstattime.Second = 0;
mins = GetMinOffset(tmpstattime, curtime);
if(mins >= 60*24 && mins < 60*24*2)
{
timematch = 1;
}
break;
case 4:
if((tmpstattime.Year == tmpcurtime.Year && tmpstattime.Month ==tmpcurtime.Month-1) ||
(tmpstattime.Year < tmpcurtime.Year && stattime.Month == 12 && tmpcurtime.Month == 1))
{
timematch = 1;
}
break;
}
return timematch;
}
void FillTime(Time_s *ObjectTime, TimeYS *SourceTime)
{
ObjectTime->Month = SourceTime->Month;
ObjectTime->Day= SourceTime->Day;
ObjectTime->Hour= SourceTime->Hour;
ObjectTime->Minute= SourceTime->Minute;
ObjectTime->Second= SourceTime->Second;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -