📄 prlimplgetevent.c
字号:
//******************************************************************
//
// 结构定义文件:PrlImplGetEvent.c
// 文件内容:104协议项--事件获取实现文件
// 结构定义规则:见文档《变量定义规范》
// 创建者:
// 创建时间:2007-8-1
//******************************************************************
//*************************头文件包含区*****************************
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include "DefPrl.h"
#include "DefDispData.h"
#include "ShareMemDebugOut.h"
#include "ShareMemOp.h"
//******************************************************************
#define MAX_EVENT_NM_ONE_DAY 2048
#define MAX_CUR_EVENT_NR 1000
#define MAX_RECORD_NUM 64
//记录按发生时间排序
void EventSort(TCommEvent *EventBuf, unsigned int Count)
{
TCommEvent ev;
unsigned long i, j, m;
i = 0;
m = Count - 1;;
for(; i < m; )
{
for(j = i; j <= m; j ++)
{
if(memcmp(&(EventBuf+j)->StartTime, &(EventBuf+j+1)->StartTime, sizeof(TimeYU)) < 0)
{
memcpy(&ev, EventBuf+j, sizeof(TCommEvent));
memcpy(EventBuf+j, EventBuf+j+1, sizeof(TCommEvent));
memcpy(EventBuf+j+1, &ev, sizeof(TCommEvent));
}
}
m --;
}
}
int Page(Transient_LCD *Data, unsigned char FrameID,
TCommEvent *EventBuf, unsigned int EventCount)
{
unsigned int i;
unsigned int LastFrame;
unsigned int TotalPage;
if(EventCount == 0)
{
return 0;
}
EventSort(EventBuf, EventCount);
if(EventCount<MAX_RECORD_NUM) //不存在分页
{
for(i=0; i<EventCount; i++)
{
memcpy(&((Data+i)->Data), &EventBuf[i], sizeof(TCommEvent));
(Data+i)->RecordNum =EventCount;
}
return EventCount;
}
else //需要分页
{
if(EventCount%MAX_RECORD_NUM != 0)
{
TotalPage = EventCount/MAX_RECORD_NUM+1;
LastFrame = EventCount%MAX_RECORD_NUM;
}
else
{
TotalPage = EventCount/MAX_RECORD_NUM;
LastFrame = MAX_RECORD_NUM;
}
if(FrameID < TotalPage) //不是最后一页
{
for(i=0; i<MAX_RECORD_NUM; i++)
{
memcpy(&((Data+i)->Data), &EventBuf[i+(FrameID-1)*MAX_RECORD_NUM], sizeof(TCommEvent));
(Data+i)->RecordNum =MAX_RECORD_NUM;
}
return MAX_RECORD_NUM;
}
else //是最后一页
{
for(i=0; i<LastFrame; i++)
{
memcpy(&((Data+i)->Data), &EventBuf[i+(TotalPage-1)*MAX_RECORD_NUM], sizeof(TCommEvent));
(Data+i)->RecordNum =LastFrame;
}
return LastFrame;
}
return 0;
}
}
int GetRealtimeEvent(TPrlFrame *PrlFrame, void *Param1, void *Param2)
{
TCommEvent CurEvents[MAX_CUR_EVENT_NR];
Transient_LCD *Data = (Transient_LCD *)PrlFrame->UserData.Data;
int LotalCount = 0, GotCount = 0;
int LineID = PrlFrame->UserData.DeviceAddress.ThreadID+1;
Data->Stat = SHOW_STAT_MINUTES;
GotCount = GetCurEvent(LineID, MAX_CUR_EVENT_NR, &CurEvents[0], &LotalCount);
if (GotCount <= 0)
{
return PRL_EXECUTE_FAILED;
}
GotCount = Page(Data, PrlFrame->UserData.FrameID, CurEvents, GotCount);
if (GotCount == 0)
{
return PRL_EXECUTE_FAILED;
}
PrlFrame->UserData.DataLen = sizeof(Transient_LCD)*GotCount;
PrlFrame->UserData.RecordNum = GotCount;
return PRL_EXECUTE_OK;
}
void FillEventsToFrame(TCommEvent *GotEventData, int GotCount, Transient_LCD*Data, unsigned char StatisType)
{
int Loop = 0;
for (Loop=0; Loop<GotCount; Loop++)
{
memcpy(&Data[Loop].Data, &GotEventData[Loop], sizeof(TCommEvent));
Data[Loop].Stat = StatisType;
}
}
int GetDayEventCount(char *DayEventFile)
{
struct stat stBuf;
if (stat(DayEventFile, &stBuf) ==0 )
{
return stBuf.st_size/sizeof(TCommEvent);
}
return 0;
}
BSTATUS ReadEventFile(char *DayEventFile, TCommEvent *EventBuf, int EventCount)
{
int FileDayEvent = 0;
if (EventCount <=0)
{
NqsDebugOut("EventCount Inparam error", 0);
return B_FALSE;
}
FileDayEvent = open(DayEventFile, O_RDONLY);
if (FileDayEvent <=0 )
{
NqsDebugOut("Open File Error", 0);
return B_FALSE;
}
if (EventCount != read(FileDayEvent, EventBuf, MAX_EVENT_NM_ONE_DAY*sizeof(TCommEvent))/sizeof(TCommEvent))
{
close(FileDayEvent);
NqsDebugOut("EventCount Error", 0);
return B_FALSE;
}
close(FileDayEvent);
return B_TRUE;
}
int GetHourEvent(TPrlFrame *PrlFrame, char *DayEventFile, int Hour, int FrameID)
{
TCommEvent EventBuf[MAX_EVENT_NM_ONE_DAY];
TCommEvent NeedGotEventBuf[MAX_RECORD_NUM];
int EventCount = GetDayEventCount(DayEventFile);
int Loop = 0;
int BeginPos = 0, EndPos=0;
int GotCount = 0;
if (ReadEventFile(DayEventFile, EventBuf, EventCount) != B_TRUE)
{
return PRL_EXECUTE_FAILED;
}
for (Loop=0; Loop<EventCount; Loop++)
{
if (EventBuf[Loop].StartTime.Hour == Hour)
{
break;
}
}
if (Loop >= EventCount)
{
NqsDebugOut("Cannot Find THis hour event", 0);
return PRL_EXECUTE_FAILED;
}
BeginPos = Loop+(FrameID-1)*MAX_RECORD_NUM;
EndPos=EventCount-1;
for (Loop=BeginPos; Loop<EventCount; Loop++)
{
if (EventBuf[Loop].StartTime.Hour != Hour)
{
DebugOutMsg(IX_M_NQS, 0, "On %d Find EndPos", EndPos);
EndPos = Loop-1;
break;
}
}
if (EndPos < BeginPos)
{
return PRL_EXECUTE_FAILED;
}
for (Loop=BeginPos; Loop<=EndPos; Loop++)
{
memcpy(&NeedGotEventBuf[GotCount], &EventBuf[Loop], sizeof(TCommEvent));
GotCount++;
if (GotCount == MAX_RECORD_NUM)
{
break;
}
}
DebugOutMsg(IX_M_NQS, 0, "GotCount:%d EventCount:%d FrameID:%d BP:%d EP:%d"
, GotCount, EventCount, FrameID, BeginPos, EndPos);
//获取事件
FillEventsToFrame(NeedGotEventBuf, GotCount, (Transient_LCD*)PrlFrame->UserData.Data, SHOW_STAT_HOUR);
PrlFrame->UserData.RecordNum = GotCount;
PrlFrame->UserData.DataLen = sizeof(Transient_LCD)*GotCount;
PrlFrame->UserData.FrameSum = (EndPos-BeginPos)%MAX_RECORD_NUM?(EndPos-BeginPos)/MAX_RECORD_NUM+1:(EndPos-BeginPos)/MAX_RECORD_NUM;
return PRL_EXECUTE_OK;
}
int GetDayEvent(TPrlFrame *PrlFrame, char *DayEventFile, int FrameID)
{
TCommEvent EventBuf[MAX_EVENT_NM_ONE_DAY];
TCommEvent NeedGotEventBuf[MAX_RECORD_NUM];
int EventCount = GetDayEventCount(DayEventFile);
int Loop = 0;
int BeginPos = 0;
int GotCount = 0;
if (ReadEventFile(DayEventFile, EventBuf, EventCount) != B_TRUE)
{
return PRL_EXECUTE_FAILED;
}
BeginPos = (FrameID-1)*MAX_RECORD_NUM;
for (Loop=BeginPos; Loop<EventCount; Loop++)
{
memcpy(&NeedGotEventBuf[GotCount], &EventBuf[Loop], sizeof(TCommEvent));
GotCount++;
if (GotCount == MAX_RECORD_NUM)
{
break;
}
}
//获取事件
FillEventsToFrame(NeedGotEventBuf, GotCount, (Transient_LCD*)PrlFrame->UserData.Data, SHOW_STAT_DAY);
PrlFrame->UserData.RecordNum = GotCount;
PrlFrame->UserData.DataLen = sizeof(Transient_LCD)*GotCount;
PrlFrame->UserData.FrameSum = EventCount%MAX_RECORD_NUM?EventCount/MAX_RECORD_NUM+1:EventCount/MAX_RECORD_NUM;
return PRL_EXECUTE_OK;
}
int GetMonthEvent(TPrlFrame *PrlFrame, TimeYS *TimeNow, int FrameID)
{
TCommEvent NeedGotEventBuf[MAX_RECORD_NUM];
int GotCount = 0;
int Day = 31;
int LineID = PrlFrame->UserData.DeviceAddress.ThreadID+1;
int DisplayedCount = (FrameID-1)*MAX_RECORD_NUM;
int DayEventCounts[31] = {0};
char DayEventFile[50] = {0};
int MonthEventCount =0;
for (Day=TimeNow->Day; Day>0; Day--)
{
sprintf(DayEventFile, "/data/line%1d/%02d/%02d/WS%02d%02d88.e01"
, LineID
, TimeNow->Year%100
, TimeNow->Month
, TimeNow->Month
, Day);
DayEventCounts[Day-1] = GetDayEventCount(DayEventFile);
MonthEventCount += DayEventCounts[Day-1];
}
for (Day=TimeNow->Day; Day>0; Day--)
{
int EventCount = DayEventCounts[Day-1];
TCommEvent EventBuf[MAX_EVENT_NM_ONE_DAY];
sprintf(DayEventFile, "/data/line%1d/%02d/%02d/WS%02d%02d88.e01"
, LineID
, TimeNow->Year%100
, TimeNow->Month
, TimeNow->Month
, Day);
DebugOutMsg(IX_M_NQS, 0, "Displayed:%d GotCount:%d Now %s Events:%d "
, DisplayedCount, GotCount, DayEventFile, EventCount);
if (EventCount <=0)
{
continue;
}
if (DisplayedCount >EventCount)
{
DisplayedCount = DisplayedCount-EventCount;
}
else
{
int Loop = 0;
if (ReadEventFile(DayEventFile, EventBuf, EventCount) != B_TRUE)
{
return PRL_EXECUTE_FAILED;
}
for (Loop = DisplayedCount; Loop<EventCount; Loop++)
{
memcpy(&NeedGotEventBuf[GotCount], &EventBuf[Loop], sizeof(TCommEvent));
GotCount++;
if (GotCount == MAX_RECORD_NUM)
{
break;
}
}
if (GotCount == MAX_RECORD_NUM)
{
break;
}
else
{
DisplayedCount = 0;
continue;
}
}
}
if (GotCount <= 0)
{
return PRL_EXECUTE_FAILED;
}
//获取事件
FillEventsToFrame(NeedGotEventBuf, GotCount, (Transient_LCD*)PrlFrame->UserData.Data, SHOW_STAT_MONTH);
PrlFrame->UserData.RecordNum = GotCount;
PrlFrame->UserData.DataLen = sizeof(Transient_LCD)*GotCount;
PrlFrame->UserData.FrameSum = MonthEventCount%MAX_RECORD_NUM?MonthEventCount/MAX_RECORD_NUM+1:MonthEventCount/MAX_RECORD_NUM;
return PRL_EXECUTE_OK;
}
int GetEvent(TPrlFrame *PrlFrame, void *Param1, void *Param2)
{
TimeYS TimeNow;
int LineID = PrlFrame->UserData.DeviceAddress.ThreadID+1;
char DayEventFile[50] = {0};
GetTimeYS(&TimeNow);
sprintf(DayEventFile, "/data/line%1d/%02d/%02d/WS%02d%02d88.e01"
, LineID
, TimeNow.Year%100
, TimeNow.Month
, TimeNow.Month
, TimeNow.Day);
switch(PrlFrame->UserData.TransReason)
{
case TR_SEASON_FOR_MINUTES:
return GetRealtimeEvent(PrlFrame, Param1, Param2);
case TR_SEASON_FOR_HOUR:
return GetHourEvent(PrlFrame, DayEventFile, TimeNow.Hour, PrlFrame->UserData.FrameID);
case TR_SEASON_FOR_DAY:
return GetDayEvent(PrlFrame, DayEventFile, PrlFrame->UserData.FrameID);
case TR_SEASON_FOR_MONTH:
return GetMonthEvent(PrlFrame, &TimeNow, PrlFrame->UserData.FrameID);
}
return PRL_EXECUTE_FAILED;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -