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

📄 prlsupport.c

📁 104规约linux
💻 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 + -