blob: 2074b6076f22c6be278ff78b64251d1ec9283758 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}