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

📄 memwritelock.cpp

📁 mod_RSsim
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////
//
// FILE: MemWriteLock.cpp : implementation file
//
// See _README.CPP
// 
// Implementation of the CMemWriteLock 
//                       CControllerMemoryArea
//                       CControllerMemory classes.
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

/////////////////////////////////////////////////////////////////////////////
// implementation of the CMemWriteLock class.
//
/////////////////////////////////////////////////////////////////////////////

CMemWriteLock::CMemWriteLock(CMutex *pMutex) : CSingleLock(pMutex, FALSE)
{

   m_pMutex = pMutex;
   //m_pMutex->Lock(INFINITE);
   m_pMutex->Lock(20000);  // lock for 20 seconds
}

CMemWriteLock::~CMemWriteLock()
{
   // the base object destructor will call this anyway
   m_pMutex->Unlock();
}

/////////////////////////////////////////////////////////////////////////////
// implementation of the CControllerMemoryArea class.
//
/////////////////////////////////////////////////////////////////////////////

CControllerMemoryArea::CControllerMemoryArea()
{
   SetSize(MAX_MOD_MEMWORDS); // 65536
}

// --------------------------- SetSize ------------------------------
CControllerMemoryArea::SetSize(const DWORD numWords)
{
   CWordArray::SetSize(numWords);
   m_size = numWords;
   m_numberRegistersLimit = numWords;
}

// ---------------------------- GetAt -------------------------------
// read the array
WORD CControllerMemoryArea::GetAt(const DWORD index)
{  
   ASSERT(index <= m_size);
   if (index > m_numberRegistersLimit)
   {
      OutputDebugString("Attempt to read past PLC buffer end");
      return (0);
   }
   return (CWordArray::GetAt(index));
}

// -------------------------- operator [] ------------------------------
// read the array
WORD CControllerMemoryArea::operator [](const DWORD index)
{
   return (GetAt(index));
}

// ------------------------------ SetAt ---------------------------------
// Write to array, 
// requires the write interlock object
void CControllerMemoryArea::SetAt(const DWORD index, WORD data, CMutex *pMutex) 
{
CMemWriteLock  lock(pMutex);  // interlock all writes to us

   ASSERT(index < m_size);
   if (index >= m_numberRegistersLimit)
   {
      OutputDebugString("Attempt to write past PLC buffer end");
      return;  // do nothing when writting past the limit
   }
   CWordArray::SetAt(index, data);
}

// -------------------------------- IncrementAt --------------------------
// increment a specific word by X
void CControllerMemoryArea::IncrementAt(const DWORD index, WORD incValue, CMutex *pMutex)
{
WORD value = GetAt(index);
//CString d;
   SetAt(index, (WORD)(value+incValue), pMutex);
   //d.Format(" last= %d new = %d ", value, value+incValue);
   //OutputDebugString(d);
}

/////////////////////////////////////////////////////////////////////////////
// implementation of the CControllerMemory class.
//
/////////////////////////////////////////////////////////////////////////////

CControllerMemory::CControllerMemory()
{
   if (pGlobalDialog)
      SetSize(pGlobalDialog->GetNumMemoryAreas());//MAX_MOD_MEMTYPES);
}

CControllerMemory::~CControllerMemory()
{
   // delete ram used
   FreeOldMemory();
}

// --------------------------- SetSize -----------------------------
CControllerMemory::SetSize(const DWORD numAreas)
{

   FreeOldMemory();
   CObArray::SetSize(numAreas);
   // allocate new memory
   m_size = numAreas;
   AllocateNewMemory(numAreas);
}


// ---------------------------- GetAt ---------------------------------
CControllerMemoryArea& CControllerMemory::GetAt(const DWORD index)
{
CControllerMemoryArea* pWordArr;
   
   ASSERT(index < m_size);
   if (index > m_size)
      return(*(CControllerMemoryArea*)CObArray::GetAt(0)); //error
   pWordArr = (CControllerMemoryArea*)CObArray::GetAt(index);
   return (*pWordArr);
}

// -------------------------- operator [] ------------------------------
CControllerMemoryArea& CControllerMemory::operator [](const DWORD index)
{
   if (index >= m_size)
      return(GetAt(0));
   return (GetAt(index));
}

// ---------------------------- SetAt ----------------------------------
void CControllerMemory::SetAt(const DWORD index, const DWORD subIndex, WORD data)
{
CControllerMemoryArea* pWordArr;
   
   ASSERT(index < m_size);
   pWordArr = (CControllerMemoryArea*)CObArray::GetAt(index);
   pWordArr->SetAt(subIndex, data, &m_Mutex);
}

// ----------------------------- IncrementAt ---------------------------
// increment a specific word by X
void CControllerMemory::IncrementAt(const DWORD index, const DWORD subIndex,  WORD incValue)
{
   if (index > m_size)  // to stop animation messing up during PLC construction
      return;
   GetAt(index).IncrementAt(subIndex, incValue, &m_Mutex);
}

// ---------------------------- FreeOldMemory ---------------------------
// free all CControllerMemoryArea objects
CControllerMemory::FreeOldMemory()
{
LONG size;
CControllerMemoryArea *pWordArr;

   size = GetSize();
   while (size>0)
   {
      pWordArr = (CControllerMemoryArea *)CObArray::GetAt(size-1);
      if (NULL !=pWordArr)
         delete (pWordArr);
      size--;
   }
} // FreeOldMemory

// ---------------------------- AllocateNewMemory ------------------------
// allocates CControllerMemoryArea Objects the required # of memory areas
//
CControllerMemory::AllocateNewMemory(const DWORD areas)
{
LONG index;
CControllerMemoryArea *pWordArr;

   index = 0;
   while (index < (LONG)areas)
   {
      pWordArr = new CControllerMemoryArea;
      CObArray::SetAtGrow(index, pWordArr);
      index++;
   }
} // AllocateNewMemory

⌨️ 快捷键说明

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