📄 prlmain.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 + -