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

📄 prlimplgetevent.c

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