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

📄 prlmain.c

📁 104规约linux
💻 C
字号:
/*************************************************************************/
/***          [Version]:  1.  0.  2.  2[1.0D]                            */
/***          [Attach ]:  1.  0.  2.  7[1.0D]                            */
/***          [MatchID]:                   45                            */
/*************************************************************************/
//******************************************************************
//
//   结构定义文件:PrlMain.c
//       文件内容:104协议支持模块的实现主文件
//   结构定义规则:见文档《变量定义规范》
//         创建者:
//       创建时间:2007-7-19
//******************************************************************

//*************************头文件包含区*****************************
#include "PrlFuncDeclare.h"
#include "PrlImplItem.h"
#include "ShareMemOp.h"
#include "ShareMemDebugOut.h"
//******************************************************************

void ProcessFrame(TPrlFrame *PrlFrame, TNetMessage *NetMessage);

void OnHalt(void *Param)
{
    FILE *fHalt = fopen("/tmp/halt.go", "wb+");
    fclose(fHalt);
}
void main()
{
    TPrlFrame PrlFrame;
    TNetMessage NetMessage;
    VERSION_DEFINE;
    //创建监听端口

    NetMessage.Server = NetCreateServer();
    if (NetMessage.Server <= 0)
    {
        NqsDebugOut("Create Server Failed ", 0);
        exit(0);
    }
    //将模块状态置为运行
    SetModuleStatus(IX_M_NQS, MS_RUNNING);
    while(1)
    {
        //接受监控
        CheckModuleControl(IX_M_NQS, NULL, NULL, OnHalt, NULL, NULL, NULL);
        //收取消息
        if (NetReceiveMessage(NetMessage.Server, &NetMessage) > 0)
        {
            DebugOutMsg(IX_M_NQS, 0, "Message---Length:%d", NetMessage.Length);
            //分析消息     
            if (ResolveMessageToFrame(&NetMessage, &PrlFrame) == B_TRUE)
            {
                 //处理帧
                 ProcessFrame(&PrlFrame, &NetMessage);
                 //消息处理最多可3秒
            }	
            else
            {
                NqsDebugOut("Resolve Message to Frame Failed", 0);
            }
        } 
        usleep(100);
    }
}

void ProcessFrame(TPrlFrame *PrlFrame, TNetMessage *NetMessage)
{
    TLineParam LineParam;
    TGlobalParam GlobalParam;
    TLineDataStatis *LineDataStatis=NULL;
    TLineDataSecond *LineDataSecond=NULL;
    TLineDataMinute *LineMinuteData=NULL;
    unsigned int  RetVal = PRL_EXECUTE_FAILED;
    if (PrlFrame->HeadFlag == HEAD_UNFIXED_FRAME)
    {
        TPrlImplItem *PrlImplItem = FindPrlImplItem(PrlFrame->UserData.FrameType, PrlFrame->UserData.DataRecordType);
        
        DebugOutMsg(IX_M_NQS, 0, "FrameType:0x%0x RecordType:0x%0x ThreadID:%d DspID:%d"
            , PrlFrame->UserData.FrameType
            , PrlFrame->UserData.DataRecordType
            , PrlFrame->UserData.DeviceAddress.ThreadID
            , PrlFrame->UserData.DeviceAddress.DspID);
        if (PrlImplItem == NULL)
        {
            NqsDebugOut("Cannot Find Prl Implement Item", 0);
            return;
        }
        switch (PrlFrame->UserData.FrameType)
        {
        //获取/设置监测仪参数
        case FRAME_TYPE_GETSET_PARAM:
            if (PrlFrame->UserData.TransReason != TR_SEASON_REQUEST)
            {
                return;
            }
            GetMainGlobalParam(&GlobalParam);
            switch (PrlFrame->Control)
            {
            case FCTL_SET_MCU_PARAM:
                if (PrlImplItem->Func2(PrlFrame, &GlobalParam, NULL) == PRL_EXECUTE_OK)
                {
                    NqsDebugOut("Set Param OK", 0);
                    PrlFrame->HeadFlag = HEAD_FIXED_FRAME;
                    PrlFrame->Control = FCTL_PARAM_OP_RETURN;
                    PrlFrame->UserData.DataLen = 0;
                    SetIsParamModified(B_TRUE);
                }
                else
                {
                    NqsDebugOut("Set Param FAILED", 0);
                }
                break;
            case FCTL_GET_MCU_PARAM:
                if (PrlImplItem->Func1(PrlFrame, &GlobalParam, NULL) == PRL_EXECUTE_OK)
                {
                    PrlFrame->Control = FCTL_PARAM_OP_RETURN;
                    NqsDebugOut("Get Param OK", 0);
                }
                else
                {
                    PrlFrame->Control = FCTL_CONFIRM_NO;
                    PrlFrame->UserData.DataLen = 0;
                    NqsDebugOut("Get Param FAILED", 0);
                }
                break;
            }
            break;
        //或取实时(秒)数据
        case FRAME_TYPE_GET_SECD_DATA:
        	  if (PrlFrame->Control != FCTL_GET_DATA)
        	  {
        	      return;
        	  }
        	  if ((PrlFrame->UserData.DeviceAddress.ThreadID+1) > MAX_LINE_NUM)
        	  {
        	      return;
        	  }
        	  GetMainLineParam(PrlFrame->UserData.DeviceAddress.ThreadID+1, &LineParam);
            switch (PrlFrame->UserData.TransReason)
            {
            case TR_SEASON_REQUEST:
                LineDataSecond = smGetLineDataSecond(PrlFrame->UserData.DeviceAddress.ThreadID+1);
                RetVal = PrlImplItem->Func1(PrlFrame, LineDataSecond, (void *)&LineParam);
                break;
            case TR_SEASON_FOR_SECOND:
                LineDataSecond = smGetLineDataSecond(PrlFrame->UserData.DeviceAddress.ThreadID+1);
                RetVal = PrlImplItem->Func1(PrlFrame, LineDataSecond, (void *)SHOW_MR_IN_SECOND);
                break;
            case TR_SEASON_FOR_MINUTE:
                LineMinuteData = smGetLineDataMinute(PrlFrame->UserData.DeviceAddress.ThreadID+1);
                RetVal = PrlImplItem->Func1(PrlFrame, LineMinuteData, (void *)SHOW_MR_IN_MINUTE);
                break;
            } 
            if (RetVal == PRL_EXECUTE_OK)
            {
                PrlFrame->Control = FCTL_CONFIRM_YES;
                NqsDebugOut("Get Data OK", 0);
            }
            else
            {
                PrlFrame->Control = FCTL_CONFIRM_NO;
                PrlFrame->UserData.DataLen = 0;
                NqsDebugOut("Get Data FAILED", 0);
            }
            PrlFrame->UserData.FrameType = FRAME_TYPE_RET_SECD_DATA;
            break;
        //获取历史数据
        case FRAME_TYPE_GET_HIST_DATA:
        	  if (PrlFrame->Control != FCTL_GET_DATA)
        	  {
        	      return;
        	  }
        	  if ((PrlFrame->UserData.DeviceAddress.ThreadID+1) > MAX_LINE_NUM)
        	  {
        	      return;
        	  }
            switch (PrlFrame->UserData.TransReason)
            {
            case TR_SEASON_FOR_SECOND:
                LineDataSecond = smGetLineDataSecond(PrlFrame->UserData.DeviceAddress.ThreadID+1);
                RetVal = PrlImplItem->Func1(PrlFrame, LineDataSecond, (void *)SHOW_MR_IN_SECOND);
                break;
            case TR_SEASON_FOR_MINUTES:
        	      LineDataStatis = smGetLineDataMinutes(PrlFrame->UserData.DeviceAddress.ThreadID+1);
        	      RetVal = PrlImplItem->Func1(PrlFrame, LineDataStatis, (void *)SHOW_STAT_MINUTES);
                break;
            case TR_SEASON_FOR_HOUR:
        	      LineDataStatis = smGetLineDataHour(PrlFrame->UserData.DeviceAddress.ThreadID+1);
        	      RetVal = PrlImplItem->Func1(PrlFrame, LineDataStatis, (void *)SHOW_STAT_HOUR);
                break;
            case TR_SEASON_FOR_DAY:
        	      LineDataStatis = smGetLineDataDay(PrlFrame->UserData.DeviceAddress.ThreadID+1);
        	      RetVal = PrlImplItem->Func1(PrlFrame, LineDataStatis, (void *)SHOW_STAT_DAY);
                break;
            case TR_SEASON_FOR_MONTH:
        	      LineDataStatis = smGetLineDataMonth(PrlFrame->UserData.DeviceAddress.ThreadID+1);
        	      RetVal = PrlImplItem->Func1(PrlFrame, LineDataStatis, (void *)SHOW_STAT_MONTH);
                break; 
            } 
            if (RetVal == PRL_EXECUTE_OK)
            {
                PrlFrame->Control = FCTL_CONFIRM_YES;
                NqsDebugOut("Get HisData OK", 0);
            }
            else
            {
                PrlFrame->Control = FCTL_CONFIRM_NO;
                PrlFrame->UserData.DataLen = 0;
                NqsDebugOut("Get HisData FAILED", 0);
            }
            PrlFrame->UserData.FrameType = FRAME_TYPE_RET_HIST_DATA;
            break;
        //获取系统信息
        case FRAME_TYPE_GET_SYS_INFO:
            if (PrlFrame->Control != FCTL_GET_SYS_INFO)
            {
                return;
            }
            if (PrlImplItem->Func1(PrlFrame, &GlobalParam, NULL) == PRL_EXECUTE_OK)
            {
                PrlFrame->Control = FCTL_CONFIRM_YES;
                NqsDebugOut("Get Sys info OK", 0);
            }
            else
            {
                PrlFrame->Control = FCTL_CONFIRM_NO;
                PrlFrame->UserData.DataLen = 0;
                NqsDebugOut("Get Sys info FAILED", 0);
            }
            PrlFrame->UserData.FrameType = FRAME_TYPE_RET_SYS_INFO;
            break;
        }
        //将返回结果帧变成网络消息
        if (ToNetMessage(PrlFrame, NetMessage) == B_TRUE)
        {
            //发送网络消息
            NetSendMessage(NetMessage);
        }
    }
    else if (PrlFrame->HeadFlag == HEAD_FIXED_FRAME)
    {
        NqsDebugOut("Received unknown data frame", 0);
        return;
    }
    //收到未知数据包
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -