pslamptask.cpp

来自「基于sipfoundy 公司开发的sipx协议API」· C++ 代码 · 共 391 行

CPP
391
字号
//// Copyright (C) 2004, 2005 Pingtel Corp.// //// $$//////////////////////////////////////////////////////////////////////////////// SYSTEM INCLUDES#include <assert.h>#include <ctype.h>// APPLICATION INCLUDES#include "os/OsReadLock.h"#include "os/OsWriteLock.h"#include "ps/PsLampInfo.h"#include "ps/PsLampTask.h"// EXTERNAL FUNCTIONS// EXTERNAL VARIABLES// CONSTANTS// STATIC VARIABLE INITIALIZATIONSPsLampTask* PsLampTask::spInstance = 0;OsBSem      PsLampTask::sLock(OsBSem::Q_PRIORITY, OsBSem::FULL);/* //////////////////////////// PUBLIC //////////////////////////////////// *//* ============================ CREATORS ================================== */// Return a pointer to the Lamp task, creating it if necessaryPsLampTask* PsLampTask::getLampTask(void){   UtlBoolean isStarted;   // If the task object already exists, and the corresponding low-level task   // has been started, then use it   if (spInstance != NULL && spInstance->isStarted())      return spInstance;   // If the task does not yet exist or hasn't been started, then acquire   // the lock to ensure that only one instance of the task is started   sLock.acquire();   if (spInstance == NULL)       spInstance = new PsLampTask();   isStarted = spInstance->isStarted();   if (!isStarted)   {      isStarted = spInstance->start();      assert(isStarted);   }   sLock.release();   return spInstance;}// DestructorPsLampTask::~PsLampTask(){   OsWriteLock lock(mMutex);       // acquire a write lock   doCleanup();   delete mpLampDev;   spInstance = NULL;}/* ============================ MANIPULATORS ============================== */// Cause the Lamp task to (re)initialize itself.// The task will allocate an array [0..maxLampIndex] of PsLampInfo// objects to hold lamp state.OsStatus PsLampTask::init(const int maxLampIndex){   OsWriteLock lock(mMutex);      // acquire a write lock   doCleanup();                   // release old dynamic storage (if any)   mMaxLampIdx = maxLampIndex;   mpLampInfo  = new PsLampInfo[maxLampIndex+1];   // calculate the common multiple for all of the lamp modes (in ticks)   //  this value will be used to determine when it is safe to reset the   //  mTickCnt value to zero.   mModeTickMultiple = (FLASH_ON_TICKS   + FLASH_OFF_TICKS) *                       (FLUTTER_ON_TICKS + FLUTTER_OFF_TICKS) *                       (WINK_ON_TICKS    + WINK_OFF_TICKS);   // initialize all lamps to OFF   mOnLamps                = 0x0;   mModeBrokenFlutterLamps = 0x0;   mModeFlashLamps         = 0x0;   mModeFlutterLamps       = 0x0;   mModeSteadyLamps        = 0x0;   mModeWinkLamps          = 0x0;   return OS_SUCCESS;}// Set the lamp information for the lamp designated by "index".// Returns OS_NOT_FOUND if the index is out of range.OsStatus PsLampTask::setLampInfo(int index,                                 int lampId,                                 const char* lampName,                                 PsLampInfo::LampMode lampMode){   OsWriteLock lock(mMutex);      // acquire a write lock   PsLampInfo  lampInfo(lampId, lampName, lampMode);   if ((index < 0) || (index > mMaxLampIdx))   {      assert(FALSE);      return OS_NOT_FOUND;   }   mpLampInfo[index] = lampInfo;   calculateLampModeAggregates();   return OS_SUCCESS;}// Set the mode for the lamp indicated by lampId.// Returns OS_NOT_FOUND if there is no lamp with that lampId.OsStatus PsLampTask::setMode(int lampId, PsLampInfo::LampMode lampMode){   int i;   PsLampInfo* pLampInfo;   OsWriteLock lock(mMutex);      // acquire a write lock   // assert(mpLampInfo != NULL);   if (mpLampInfo != NULL) {      for (i=0; i <= mMaxLampIdx; i++)          {         pLampInfo = &(mpLampInfo[i]);                 if (pLampInfo && (pLampInfo->getId() == lampId))                 {            pLampInfo->setMode(lampMode);                        calculateLampModeAggregates();                        return OS_SUCCESS;                 }          }   }   return OS_NOT_FOUND;}// Set the mode for the lamp indicated by pLampName// Returns OS_NOT_FOUND if there is no lamp with that name.OsStatus PsLampTask::setMode(const char* pLampName,                             PsLampInfo::LampMode lampMode){   int i;   PsLampInfo* pLampInfo;   OsWriteLock lock(mMutex);      // acquire a write lock   // assert(mpLampInfo != NULL);   if (mpLampInfo != NULL) {      for (i=0; i <= mMaxLampIdx; i++)          {         pLampInfo = &(mpLampInfo[i]);         if (pLampInfo && (strcmp(pLampInfo->getName(), pLampName) == 0))                 {            pLampInfo->setMode(lampMode);            calculateLampModeAggregates();            return OS_SUCCESS;                 }          }   }   return OS_NOT_FOUND;}/* ============================ ACCESSORS ================================= */// Return the lamp information for the lamp designated by "index".const PsLampInfo& PsLampTask::getLampInfo(const int index){   OsReadLock lock(mMutex);       // acquire a read lock   assert((mpLampInfo != NULL) && (index <= mMaxLampIdx));   return mpLampInfo[index];}// Returns the max index for the array of PsLampInfo objects.int PsLampTask::getMaxLampIndex(void) const{   return mMaxLampIdx;}// Get the current mode for the lamp designated by lampId.// The mode is returned in the "rMode" variable.// Returns OS_NOT_FOUND if there is no lamp with that lampId.OsStatus PsLampTask::getMode(int lampId, PsLampInfo::LampMode& rMode){   int i;   PsLampInfo* pLampInfo;   OsReadLock lock(mMutex);      // acquire a read lock   assert(mpLampInfo != NULL);   for (i=0; i <= mMaxLampIdx; i++)   {      pLampInfo = &(mpLampInfo[i]);      if (pLampInfo && (pLampInfo->getId() == lampId))      {         rMode = pLampInfo->getMode();         return OS_SUCCESS;      }   }   rMode = PsLampInfo::OFF;   return OS_NOT_FOUND;}// Get the current mode for the lamp designated by pLampName.// The mode is returned in the "rMode" variable.// Returns OS_NOT_FOUND if there is no lamp with that name.OsStatus PsLampTask::getMode(const char* pLampName,                             PsLampInfo::LampMode& rMode){   int i;   PsLampInfo* pLampInfo;   OsReadLock lock(mMutex);      // acquire a read lock   assert(mpLampInfo != NULL);   for (i=0; i <= mMaxLampIdx; i++)   {      pLampInfo = &(mpLampInfo[i]);      if (pLampInfo && (strcmp(pLampInfo->getName(), pLampName) == 0))      {         rMode = pLampInfo->getMode();         return OS_SUCCESS;      }   }   rMode = PsLampInfo::OFF;   return OS_NOT_FOUND;}// Returns the name for the lamp designated by lampId.// The name is returned in the "rpName" variable.// Returns OS_NOT_FOUND if there is no lamp with that lampId.OsStatus PsLampTask::getName(int lampId, const char*& rpName){   int i;   PsLampInfo* pLampInfo;   OsReadLock lock(mMutex);      // acquire a read lock   assert(mpLampInfo != NULL);   for (i=0; i <= mMaxLampIdx; i++)   {      pLampInfo = &(mpLampInfo[i]);      if (pLampInfo && (pLampInfo->getId() == lampId))      {         rpName = pLampInfo->getName();         return OS_SUCCESS;      }   }   rpName = "";   return OS_NOT_FOUND;}/* ============================ INQUIRY =================================== *//* //////////////////////////// PROTECTED ///////////////////////////////// */// Default constructor (called only indirectly via getLampTask())PsLampTask::PsLampTask():  OsTask("PsLamp"),   mMaxLampIdx(-1),                // not yet initialized   mMutex(OsRWMutex::Q_PRIORITY),  // create mutex for protecting data   mTickCnt(0),   mpLampInfo(NULL)                // not yet initialized{   mpLampDev = PsLampDev::getLampDev(this);}// The body of the task -- responsible for updating the lamps as needed.int PsLampTask::run(void* pArg){   UtlBoolean     doShutdown;   UtlBoolean     isFlashOn;   UtlBoolean     isFlutterOn;   UtlBoolean     isWinkOn;   unsigned long onLamps;   do   {      doShutdown = isShuttingDown();      if (!doShutdown && mpLampInfo)      {         OsReadLock lock(mMutex);   // acquire a read lock         mTickCnt++;                        // to avoid problems with         if (mTickCnt == mModeTickMultiple) //  wrapping reset the tick            mTickCnt = 0;                   //  count to zero when it                                            //  reaches mModeTickMultiple         // determine which lamp modes are in effect for this tick         isWinkOn    = ((mTickCnt % (WINK_ON_TICKS + WINK_OFF_TICKS))                       < WINK_ON_TICKS);         isFlashOn   = ((mTickCnt % (FLASH_ON_TICKS + FLASH_OFF_TICKS))                       < FLASH_ON_TICKS);         isFlutterOn = ((mTickCnt % (FLUTTER_ON_TICKS + FLUTTER_OFF_TICKS))                       < FLUTTER_ON_TICKS);         // determine which lamps should be on for this tick         onLamps = mModeSteadyLamps;         if (isFlashOn)                onLamps |= mModeFlashLamps;         if (isFlutterOn)              onLamps |= mModeFlutterLamps;         if (isFlashOn && isFlutterOn) onLamps |= mModeBrokenFlutterLamps;         if (isWinkOn)                 onLamps |= mModeWinkLamps;         // if the lamp settings have changed, then tell the lamp device         //  manager which lamps to turn on         if (onLamps != mOnLamps)         {            mpLampDev->lightLamps(onLamps);            // osPrintf("PsLampDev::lightLamps(0x%x), tickCnt=%d\n",            //          onLamps, mTickCnt);            mOnLamps = onLamps;         }      }      delay(TICK_PERIOD_MSECS);   }   while (!doShutdown);   ackShutdown();           // acknowledge the task shutdown request   return 0;                // and then exit}/* //////////////////////////// PRIVATE /////////////////////////////////// */// Calculate the lamp mode aggregates (the lamp IDs that are turned on for// each mode)void PsLampTask::calculateLampModeAggregates(void){   int         i;   PsLampInfo* pLampInfo;   mModeBrokenFlutterLamps = 0x0;   mModeFlashLamps         = 0x0;   mModeFlutterLamps       = 0x0;   mModeSteadyLamps        = 0x0;   mModeWinkLamps          = 0x0;   assert(mpLampInfo != NULL);   for (i=0; i <= mMaxLampIdx; i++)   {      pLampInfo = &(mpLampInfo[i]);      switch (pLampInfo->getMode())      {      case PsLampInfo::BROKEN_FLUTTER:         mModeBrokenFlutterLamps |= (unsigned long) pLampInfo->getId();;         break;      case PsLampInfo::FLASH:         mModeFlashLamps |= (unsigned long) pLampInfo->getId();;         break;      case PsLampInfo::FLUTTER:         mModeFlutterLamps |= (unsigned long) pLampInfo->getId();;         break;      case PsLampInfo::OFF:         // do nothing         break;      case PsLampInfo::STEADY:         mModeSteadyLamps |= (unsigned long) pLampInfo->getId();;         break;      case PsLampInfo::WINK:         mModeWinkLamps |= (unsigned long) pLampInfo->getId();;         break;      default:         assert(FALSE);         break;      }   }}// Release dynamically allocated storage.// A write lock should be acquired before calling this method.void PsLampTask::doCleanup(void){   // destroy the array of lamp info objects   if (mpLampInfo != NULL)   {      delete[] mpLampInfo;      mpLampInfo = NULL;   }}/* ============================ FUNCTIONS ================================= */

⌨️ 快捷键说明

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