/******************************************************************************* | |
* Copyright (c) 2012 AIT, fortiss GmbH | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License 2.0 which is available at | |
* http://www.eclipse.org/legal/epl-2.0. | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* Contributors: | |
* Filip Andren, Alois Zoitl - initial API and implementation and/or initial documentation | |
*******************************************************************************/ | |
#include "ProcessImageMatrix.h" | |
CProcessImageMatrix::CProcessImageMatrix(){ | |
m_nBitSize = 0; | |
m_nNumberOfEntries = 0; | |
} | |
CProcessImageMatrix::~CProcessImageMatrix(){ | |
clearAll(); | |
} | |
void CProcessImageMatrix::addEntry(unsigned int pa_nCN, unsigned int pa_nModule, unsigned int pa_nIoId, unsigned int pa_nDataSize, unsigned int pa_nPiOffset, unsigned int pa_nBitOffset){ | |
m_lMatrix.pushBack(new SChannelEntry(pa_nCN, pa_nModule, pa_nIoId, pa_nDataSize, pa_nPiOffset, pa_nBitOffset)); | |
// Check if 8, 16, 32 bit aligned | |
if((pa_nDataSize % 32 == 0) || (pa_nDataSize % 16 == 0) || (pa_nDataSize % 8 == 0)){ | |
if(m_nBitSize % pa_nDataSize != 0){ | |
unsigned long fillBits = pa_nDataSize - (m_nBitSize % pa_nDataSize); | |
m_nBitSize += fillBits; | |
} | |
} | |
m_nBitSize += pa_nDataSize; | |
m_nNumberOfEntries++; | |
} | |
// getEntry: Returns an array with [dataSize, PIOffset, BitOffset] | |
unsigned int* CProcessImageMatrix::getEntry(unsigned int pa_nCN, unsigned int pa_nModule, unsigned int pa_nIoId){ | |
static unsigned int data[3] = { 0, 0, 0 }; | |
TChannelList::Iterator itEnd = m_lMatrix.end(); | |
for(TChannelList::Iterator it = m_lMatrix.begin(); it != itEnd; ++it){ | |
if(it->m_nCN == pa_nCN && it->m_nModuleId == pa_nModule && it->m_nIOid == pa_nIoId){ | |
data[0] = it->m_nDataSize; | |
data[1] = it->m_nPIOffset; | |
data[2] = it->m_nBitOffset; | |
return data; | |
} | |
} | |
return NULL; | |
} | |
// getEntry: same as above but returns the values on row "index" | |
unsigned int* CProcessImageMatrix::getEntry(unsigned int pa_nIndex){ | |
if(pa_nIndex < m_nNumberOfEntries){ | |
static unsigned int data[3] = { 0, 0, 0 }; | |
TChannelList::Iterator it = m_lMatrix.begin(); | |
for(unsigned int i = 0; i < pa_nIndex; i++){ | |
++it; | |
} | |
data[0] = it->m_nDataSize; | |
data[1] = it->m_nPIOffset; | |
data[2] = it->m_nBitOffset; | |
return data; | |
} | |
return NULL; | |
} | |
unsigned int CProcessImageMatrix::getNrOfEntries() const { | |
return m_nNumberOfEntries; | |
} | |
CProcessImageMatrix* CProcessImageMatrix::getModuleEntries(unsigned int pa_nCN, unsigned int pa_nModule){ | |
CProcessImageMatrix* newMatrix = NULL; | |
TChannelList::Iterator itEnd = m_lMatrix.end(); | |
for(TChannelList::Iterator it(m_lMatrix.begin()); it != itEnd; ++it){ | |
if(it->m_nCN == pa_nCN && it->m_nModuleId == pa_nModule){ | |
if(newMatrix == NULL) { | |
newMatrix = new CProcessImageMatrix(); | |
} | |
newMatrix->addEntry(it->m_nCN, it->m_nModuleId, it->m_nIOid, it->m_nDataSize, it->m_nPIOffset, it->m_nBitOffset); | |
} | |
} | |
return newMatrix; | |
} | |
unsigned long CProcessImageMatrix::getProcessImageSize() const { | |
// Check if the whole matrix is 32 bit aligned | |
if(m_nBitSize % 32 != 0){ | |
int fillBits = 32 - (m_nBitSize % 32); | |
return (unsigned long) (m_nBitSize + fillBits) / 8; | |
} | |
return (unsigned long) m_nBitSize / 8; | |
} | |
void CProcessImageMatrix::clearAll(){ | |
while(!m_lMatrix.isEmpty()){ | |
delete *(TChannelList::Iterator) m_lMatrix.begin(); | |
m_lMatrix.popFront(); | |
} | |
} |