#ifndef FSFW_DATAPOOLGLOB_GLOBALPOOLVECTOR_TPP_ #define FSFW_DATAPOOLGLOB_GLOBALPOOLVECTOR_TPP_ template inline GlobPoolVector::GlobPoolVector(uint32_t set_id, DataSetIF* set, ReadWriteMode_t setReadWriteMode) : dataPoolId(set_id), valid(false), readWriteMode(setReadWriteMode) { memset(this->value, 0, vectorSize * sizeof(T)); if (set != nullptr) { set->registerVariable(this); } } template inline ReturnValue_t GlobPoolVector::read(uint32_t lockTimeout) { ReturnValue_t result = glob::dataPool.lockDataPool(lockTimeout); if(result != HasReturnvaluesIF::RETURN_OK) { return result; } result = readWithoutLock(); ReturnValue_t unlockResult = glob::dataPool.unlockDataPool(); if(unlockResult != HasReturnvaluesIF::RETURN_OK) { sif::error << "GlobPoolVar::read: Could not unlock global data pool" << std::endl; } return result; } template inline ReturnValue_t GlobPoolVector::commit( uint32_t lockTimeout) { ReturnValue_t result = glob::dataPool.lockDataPool(lockTimeout); if(result != HasReturnvaluesIF::RETURN_OK) { return result; } result = commitWithoutLock(); ReturnValue_t unlockResult = glob::dataPool.unlockDataPool(); if(unlockResult != HasReturnvaluesIF::RETURN_OK) { sif::error << "GlobPoolVar::read: Could not unlock global data pool" << std::endl; } return result; } template inline ReturnValue_t GlobPoolVector::readWithoutLock() { PoolEntry* read_out = glob::dataPool.getData(this->dataPoolId, vectorSize); if (read_out != nullptr) { this->valid = read_out->valid; memcpy(this->value, read_out->address, read_out->getByteSize()); return HasReturnvaluesIF::RETURN_OK; } else { memset(this->value, 0, vectorSize * sizeof(T)); sif::error << "PoolVector: Read of DP Variable 0x" << std::hex << std::setw(8) << std::setfill('0') << dataPoolId << std::dec << " failed." << std::endl; this->valid = INVALID; return HasReturnvaluesIF::RETURN_FAILED; } } template inline ReturnValue_t GlobPoolVector::commitWithoutLock() { PoolEntry* writeBack = glob::dataPool.getData(this->dataPoolId, vectorSize); if ((writeBack != nullptr) && (this->readWriteMode != VAR_READ)) { writeBack->valid = valid; memcpy(writeBack->address, this->value, writeBack->getByteSize()); return HasReturnvaluesIF::RETURN_OK; } else { return HasReturnvaluesIF::RETURN_FAILED; } } template inline ReturnValue_t GlobPoolVector::serialize(uint8_t** buffer, size_t* size, size_t max_size, SerializeIF::Endianness streamEndianness) const { uint16_t i; ReturnValue_t result; for (i = 0; i < vectorSize; i++) { result = SerializeAdapter::serialize(&(value[i]), buffer, size, max_size, streamEndianness); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } } return result; } template inline size_t GlobPoolVector::getSerializedSize() const { return vectorSize * SerializeAdapter::getSerializedSize(value); } template inline ReturnValue_t GlobPoolVector::deSerialize( const uint8_t** buffer, size_t* size, SerializeIF::Endianness streamEndianness) { uint16_t i; ReturnValue_t result; for (i = 0; i < vectorSize; i++) { result = SerializeAdapter::deSerialize(&(value[i]), buffer, size, streamEndianness); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } } return result; } #endif