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

📄 eventengineunit.cpp

📁 指纹门禁机管理系统
💻 CPP
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "EventEngineUnit.h"
#include "DBAccessUnit.h"
//---------------------------------------------------------------------------
TEventEngine::TEventEngine()
{
  LogEventQueue.clear();
  DeviceCount = 0;
  ActiveDeviceCount = 0;
  for(int i=0;i<MAX_DEVICE_COUNT;i++)
  {
    DeviceTimerList[i].DiviceTimer = NULL;
    DeviceTimerList[i].DeviceHandle = 0;
    DeviceTimerList[i].DeviceID = 0;
    DeviceTimerList[i].MaxLogID = 0;
  }

  pDevice = GetDeviceAccessInstance();
  ActiveStatus = false;

  ErrCount = 0;
  IntiEngine();

}
//---------------------------------------------------------------------------

TEventEngine::~TEventEngine()
{
  LogEventQueue.clear();
  ActiveStatus = false;
  UnintiEngine();
}
//---------------------------------------------------------------------------

int TEventEngine::GetDeviceList()
{
   //从数据库得到设备配置列表
   TDBAccess aDBAccess;
   int lRV = aDBAccess.GetDeviceList(DeviceInfoQueue);
   DeviceCount = DeviceInfoQueue.size();
   return lRV;
}
//---------------------------------------------------------------------------
void __fastcall TEventEngine::OnTimer(TObject *Sender)
{
   TTimer* pThisTimer = (TTimer*)Sender;
   int lDeviceIndex = pThisTimer->Tag;

   int lDeviceHandle = DeviceTimerList[lDeviceIndex].DeviceHandle;
   if (lDeviceHandle > 0)
   {
      LogInfoBase_T aLogInfo;
      int lLogID = DeviceTimerList[lDeviceIndex].MaxLogID;
      int lRV = pDevice->GetLogInfo(lDeviceHandle,lLogID,aLogInfo);
      if (lRV == OK)
      {
         //加入到 事件消息队列
         aLogInfo.DeviceID = DeviceTimerList[lDeviceIndex].DeviceID;
         aLogInfo.DeviceLogID = lLogID;
         LogEventQueue.push_back(aLogInfo);
         DeviceTimerList[lDeviceIndex].MaxLogID = lLogID+1;  //当前日志号逐加
      }
      else
      {
         if (lRV != DevNoExist) //设备异常
         {
            ErrCount++;
            if(ErrCount > 1 && ErrCount < 30)
               return;
            if(ErrCount >= 30)
            {
               ErrCount = 0;
               return;
            }

            aLogInfo.DeviceID = DeviceTimerList[lDeviceIndex].DeviceID;
            aLogInfo.DeviceLogID = lLogID;
            aLogInfo.OpType = etDeviceError;
            TDateTime lCurTime = Now();
            DateTimeToSystemTime(lCurTime,aLogInfo.EventTime);
            LogEventQueue.push_back(aLogInfo);
            DeviceTimerList[lDeviceIndex].MaxLogID = lLogID;  //当前日志号逐加
         }
      }
   }

}
//---------------------------------------------------------------------------

int  TEventEngine::PushEventLog(LogInfoBase_T iLogInfo)
{
   LogEventQueue.push_back(iLogInfo);
   return OK;
}
//---------------------------------------------------------------------------
int TEventEngine::IntiEngine()
{
   int lRV = GetDeviceList();
   if (lRV == OK)
   {
      IterDeviceInfo_T IterDevice;
      DeviceInfo_T aDeviceInfo;
      ActiveDeviceCount = 0;
      int lDeviceIndex = 0;
      int lDeviceHandle;  //设备句柄
      for(IterDevice = DeviceInfoQueue.begin();IterDevice != DeviceInfoQueue.end();++IterDevice)
      {
         aDeviceInfo = *IterDevice;
         if (aDeviceInfo.DeviceStatus == dsRightStatus)  //正常在用
         {
            lDeviceHandle = pDevice->OpenDevice(aDeviceInfo.DeviceID,aDeviceInfo.DeviceType,aDeviceInfo.DeviceParams);
            if (lDeviceHandle != 0) //打开设备成功
            {
               DeviceTimerList[lDeviceIndex].DiviceTimer = new TTimer(NULL);
               DeviceTimerList[lDeviceIndex].DiviceTimer->Enabled = false;
               DeviceTimerList[lDeviceIndex].DiviceTimer->OnTimer = OnTimer;
               DeviceTimerList[lDeviceIndex].DiviceTimer->Interval = 2000;

               //把设备Index 赋值于TTimer的Tag
               DeviceTimerList[lDeviceIndex].DiviceTimer->Tag = lDeviceIndex;
               DeviceTimerList[lDeviceIndex].DeviceHandle = lDeviceHandle;
               DeviceTimerList[lDeviceIndex].DeviceID = aDeviceInfo.DeviceID;

               //得到当前设备最大的日志号
               int lMaxLogID = 0;
               pDevice->GetLogCount(lDeviceHandle,lMaxLogID);
               DeviceTimerList[lDeviceIndex].MaxLogID = lMaxLogID;
               lDeviceIndex++;

               aDeviceInfo.DeviceStatus = dsOpened;
               *IterDevice = aDeviceInfo;
            }
            else   //打开设备失败
            {
               LogInfoBase_T aLogInfo;
               aLogInfo.DeviceLogID = 0;
               aLogInfo.DeviceID = aDeviceInfo.DeviceID;
               aLogInfo.OpType = etOperateEvent;
               //写日志
            }
         }
         *IterDevice = aDeviceInfo;
      }
      ActiveDeviceCount = lDeviceIndex;

   }
   return lRV;

}
//---------------------------------------------------------------------------
int TEventEngine::UnintiEngine()
{
  for(int i=0;i<DeviceCount;i++)
  {
     if (DeviceTimerList[i].DiviceTimer)
     {
        delete DeviceTimerList[i].DiviceTimer;
        DeviceTimerList[i].DiviceTimer = NULL;
     }
     if (DeviceTimerList[i].DeviceHandle != 0)
     {
        //关闭设备
        pDevice->CloseDevice(DeviceTimerList[i].DeviceHandle);
        DeviceTimerList[i].DeviceHandle = 0;
     }
  }
  DeviceCount = 0;
  return OK;
}
//---------------------------------------------------------------------------

int TEventEngine::StartEngine()
{
   //启动引擎
   for(int i=0;i<DeviceCount;i++)
   {
      try
      {
        if (DeviceTimerList[i].DeviceHandle != 0)
        {
          int lIndex = DeviceTimerList[i].DiviceTimer->Tag;
          DeviceTimerList[lIndex].DiviceTimer->Enabled = true;
        }
      }
      catch(...)
      {
        return DeviceThreadError_E;
      }
   }
   ActiveStatus = true;
   return OK;

}
//---------------------------------------------------------------------------

int TEventEngine::StopEngine()
{
   //结束引擎
   for(int i=0;i<DeviceCount;i++)
   {
      try
      {
        if (DeviceTimerList[i].DeviceHandle != 0)
          DeviceTimerList[i].DiviceTimer->Enabled = false;
      }
      catch(...)
      {
        return DeviceThreadError_E;
      }
   }
   ActiveDeviceCount = 0;
   ActiveStatus = false;
   return OK;

}
//---------------------------------------------------------------------------
int TEventEngine::RestartEngine()
{
    //重启引擎
    StopEngine();
    UnintiEngine();
    IntiEngine();
    return StartEngine();
}
//---------------------------------------------------------------------------

int TEventEngine::StopDevice(int iDeviceID)
{
   //停止设备
   for(int i=0;i<DeviceCount;i++)
   {
      if (DeviceTimerList[i].DeviceID == iDeviceID)
      {
         try
         {
           DeviceTimerList[iDeviceID].DiviceTimer->Enabled = false;
         }
         catch(...)
         {
           return DeviceThreadError_E;
         }
         return OK;
      }
   }
   return NoDevice_E;

}
//---------------------------------------------------------------------------
int TEventEngine::StartDevice(int iDeviceID)
{
   //启用设备
   for(int i=0;i<DeviceCount;i++)
   {
      if (DeviceTimerList[i].DeviceID == iDeviceID)
      {
         try
         {
           DeviceTimerList[iDeviceID].DiviceTimer->Enabled = true;
         }
         catch(...)
         {
           return DeviceThreadError_E;
         }
         return OK;
      }
   }
   return NoDevice_E;

}
//---------------------------------------------------------------------------

bool TEventEngine::GetDeviceCount(int &oSumCount,int& oActiveCount)
{
  //得到设备数量
  oSumCount = DeviceCount;
  oActiveCount = ActiveDeviceCount;
  return true;
}
//---------------------------------------------------------------------------
bool TEventEngine::GetDeviceInfo(int iDeviceID,DeviceInfo_T* oDeviceInfo)
{
   //得到当前设备信息
   IterDeviceInfo_T IterDevice;
   DeviceInfo_T aDeviceInfo;
   for(IterDevice = DeviceInfoQueue.begin();IterDevice != DeviceInfoQueue.end();++IterDevice)
   {
      aDeviceInfo = *IterDevice;
      if (aDeviceInfo.DeviceID == iDeviceID)
      {
        *oDeviceInfo = aDeviceInfo;
        return true;
      }
   }
   return false;
}
//---------------------------------------------------------------------------
int  TEventEngine::GetDeviceHandle(int iDeviceID)
{
   //得到当前设备句柄及设备信息

   IterDeviceInfo_T IterDevice;
   DeviceInfo_T aDeviceInfo;
   int lHandle = 0;
   for(IterDevice = DeviceInfoQueue.begin();IterDevice != DeviceInfoQueue.end();++IterDevice)
   {
      aDeviceInfo = *IterDevice;
      if (aDeviceInfo.DeviceID == iDeviceID)
      {
         if (aDeviceInfo.DeviceStatus == dsOutStatus)  //设备状态为停用
         {
            lHandle = pDevice->OpenDevice(iDeviceID,aDeviceInfo.DeviceType,aDeviceInfo.DeviceParams);
         }
         else
         {
            //得到已打开设备的句柄
            for(int i=0;i<DeviceCount;i++)
            {
               if (DeviceTimerList[i].DeviceID == iDeviceID)
               {
                  lHandle = DeviceTimerList[i].DeviceHandle;
                  DeviceTimerList[i].DiviceTimer->Enabled = false;
                  return lHandle;
               }
            }
         }
      }
   }
   return lHandle;

}
//---------------------------------------------------------------------------
bool  TEventEngine::ReleaseDeviceHandle(int iDeviceID,int iDeviceHandle)
{

   IterDeviceInfo_T IterDevice;
   DeviceInfo_T aDeviceInfo;
   for(IterDevice = DeviceInfoQueue.begin();IterDevice != DeviceInfoQueue.end();++IterDevice)
   {
      aDeviceInfo = *IterDevice;
      if (aDeviceInfo.DeviceID == iDeviceID)
      {
        if (aDeviceInfo.DeviceStatus == dsOutStatus)  //设备状态为停用
        {
           pDevice->CloseDevice(iDeviceHandle);
           return true;
        }
        else
        {
           for(int i=0;i<DeviceCount;i++)
           {
              if (DeviceTimerList[i].DeviceID == iDeviceID)
              {
                 DeviceTimerList[i].DiviceTimer->Enabled = true;
                 return true;
              }
           }
        }
      }
   }
   return false;
}
//---------------------------------------------------------------------------

bool TEventEngine::IsExistDeviceInfo(int iDeviceID)
{
   //判断设备是否存在
   IterDeviceInfo_T IterDevice;
   DeviceInfo_T aDeviceInfo;
   for(IterDevice = DeviceInfoQueue.begin();IterDevice != DeviceInfoQueue.end();++IterDevice)
   {
      aDeviceInfo = *IterDevice;
      if (aDeviceInfo.DeviceID == iDeviceID)
      {
        return true;
      }
   }
   return false;
}
//---------------------------------------------------------------------------

int TEventEngine::PopEventLog(LogInfoBase_T& oLogInfo)
{
   //日志消息出队列
   if (LogEventQueue.empty())
      return LogQueueEmpty_E;
   IterLogInfoBase_T lter = LogEventQueue.begin();
   oLogInfo = *lter;
   if (LogEventQueue.size() > 0)
   {
     LogEventQueue.pop_front();
     return OK;
   }
   return LogQueueEmpty_E;
}
//---------------------------------------------------------------------------
bool TEventEngine::IsActive()
{
    //引擎是否启用
   return ActiveStatus;

}
//---------------------------------------------------------------------------

static TEventEngine* pEventEngine = NULL;

TEventEngine* GetEventEngineInstance()
{
   if (pEventEngine == NULL)
   {
      pEventEngine = new  TEventEngine();
   }
   return  pEventEngine;
}
//---------------------------------------------------------------------------
#pragma package(smart_init)

⌨️ 快捷键说明

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