blob: 17f62b42e9c7ae7df3312a80698df01a1c3fd992 [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(){
mBitSize = 0;
mNumberOfEntries = 0;
}
CProcessImageMatrix::~CProcessImageMatrix(){
clearAll();
}
void CProcessImageMatrix::addEntry(unsigned int paCN, unsigned int paModule, unsigned int paIoId, unsigned int paDataSize, unsigned int paPiOffset, unsigned int paBitOffset){
mMatrix.pushBack(new SChannelEntry(paCN, paModule, paIoId, paDataSize, paPiOffset, paBitOffset));
// Check if 8, 16, 32 bit aligned
if((paDataSize % 32 == 0) || (paDataSize % 16 == 0) || (paDataSize % 8 == 0)){
if(mBitSize % paDataSize != 0){
unsigned long fillBits = paDataSize - (mBitSize % paDataSize);
mBitSize += fillBits;
}
}
mBitSize += paDataSize;
mNumberOfEntries++;
}
// getEntry: Returns an array with [dataSize, PIOffset, BitOffset]
unsigned int* CProcessImageMatrix::getEntry(unsigned int paCN, unsigned int paModule, unsigned int paIoId){
static unsigned int data[3] = { 0, 0, 0 };
TChannelList::Iterator itEnd = mMatrix.end();
for(TChannelList::Iterator it = mMatrix.begin(); it != itEnd; ++it){
if(it->mCN == paCN && it->mModuleId == paModule && it->mIOid == paIoId){
data[0] = it->mDataSize;
data[1] = it->mPIOffset;
data[2] = it->mBitOffset;
return data;
}
}
return nullptr;
}
// getEntry: same as above but returns the values on row "index"
unsigned int* CProcessImageMatrix::getEntry(unsigned int paIndex){
if(paIndex < mNumberOfEntries){
static unsigned int data[3] = { 0, 0, 0 };
TChannelList::Iterator it = mMatrix.begin();
for(unsigned int i = 0; i < paIndex; i++){
++it;
}
data[0] = it->mDataSize;
data[1] = it->mPIOffset;
data[2] = it->mBitOffset;
return data;
}
return nullptr;
}
unsigned int CProcessImageMatrix::getNrOfEntries() const {
return mNumberOfEntries;
}
CProcessImageMatrix* CProcessImageMatrix::getModuleEntries(unsigned int paCN, unsigned int paModule){
CProcessImageMatrix* newMatrix = nullptr;
TChannelList::Iterator itEnd = mMatrix.end();
for(TChannelList::Iterator it(mMatrix.begin()); it != itEnd; ++it){
if(it->mCN == paCN && it->mModuleId == paModule){
if(newMatrix == nullptr) {
newMatrix = new CProcessImageMatrix();
}
newMatrix->addEntry(it->mCN, it->mModuleId, it->mIOid, it->mDataSize, it->mPIOffset, it->mBitOffset);
}
}
return newMatrix;
}
unsigned long CProcessImageMatrix::getProcessImageSize() const {
// Check if the whole matrix is 32 bit aligned
if(mBitSize % 32 != 0){
int fillBits = 32 - (mBitSize % 32);
return (unsigned long) (mBitSize + fillBits) / 8;
}
return (unsigned long) mBitSize / 8;
}
void CProcessImageMatrix::clearAll(){
while(!mMatrix.isEmpty()){
delete *(TChannelList::Iterator) mMatrix.begin();
mMatrix.popFront();
}
}