Merge pull request 'new initializer list ctor' (#72) from KSat/fsfw:mueller_initializer_list into master
This commit is contained in:
commit
ce5a241f4f
@ -1,13 +1,34 @@
|
|||||||
#include <framework/datapool/PoolEntry.h>
|
#include <framework/datapool/PoolEntry.h>
|
||||||
#include <framework/serviceinterface/ServiceInterfaceStream.h>
|
#include <framework/serviceinterface/ServiceInterfaceStream.h>
|
||||||
|
#include <framework/globalfunctions/printer.h>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
PoolEntry<T>::PoolEntry( T* initValue, uint8_t set_length, uint8_t set_valid ) : length(set_length), valid(set_valid) {
|
PoolEntry<T>::PoolEntry(std::initializer_list<T> initValue, uint8_t setLength,
|
||||||
|
bool setValid ) : length(setLength), valid(setValid) {
|
||||||
this->address = new T[this->length];
|
this->address = new T[this->length];
|
||||||
if (initValue != NULL) {
|
if(initValue.size() == 0) {
|
||||||
memcpy(this->address, initValue, this->getByteSize() );
|
std::memset(this->address, 0, this->getByteSize());
|
||||||
|
}
|
||||||
|
else if (initValue.size() != setLength){
|
||||||
|
sif::warning << "PoolEntry: setLength is not equal to initializer list"
|
||||||
|
"length! Performing zero initialization with given setLength"
|
||||||
|
<< std::endl;
|
||||||
|
std::memset(this->address, 0, this->getByteSize());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::copy(initValue.begin(), initValue.end(), this->address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
PoolEntry<T>::PoolEntry( T* initValue, uint8_t setLength, bool setValid ) :
|
||||||
|
length(setLength), valid(setValid) {
|
||||||
|
this->address = new T[this->length];
|
||||||
|
if (initValue != nullptr) {
|
||||||
|
std::memcpy(this->address, initValue, this->getByteSize() );
|
||||||
} else {
|
} else {
|
||||||
memset(this->address, 0, this->getByteSize() );
|
std::memset(this->address, 0, this->getByteSize() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,21 +55,20 @@ void* PoolEntry<T>::getRawData() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void PoolEntry<T>::setValid( uint8_t isValid ) {
|
void PoolEntry<T>::setValid(bool isValid) {
|
||||||
this->valid = isValid;
|
this->valid = isValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
uint8_t PoolEntry<T>::getValid() {
|
bool PoolEntry<T>::getValid() {
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void PoolEntry<T>::print() {
|
void PoolEntry<T>::print() {
|
||||||
for (uint8_t size = 0; size < this->length; size++ ) {
|
sif::debug << "Pool Entry Validity: " <<
|
||||||
sif::debug << "| " << std::hex << (double)this->address[size]
|
(this->valid? " (valid) " : " (invalid) ") << std::endl;
|
||||||
<< (this->valid? " (valid) " : " (invalid) ");
|
printer::print(reinterpret_cast<uint8_t*>(address), length);
|
||||||
}
|
|
||||||
sif::debug << std::dec << std::endl;
|
sif::debug << std::dec << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,81 +1,126 @@
|
|||||||
#ifndef POOLENTRY_H_
|
#ifndef FRAMEWORK_DATAPOOL_POOLENTRY_H_
|
||||||
#define POOLENTRY_H_
|
#define FRAMEWORK_DATAPOOL_POOLENTRY_H_
|
||||||
|
|
||||||
|
|
||||||
#include <framework/datapool/PoolEntryIF.h>
|
#include <framework/datapool/PoolEntryIF.h>
|
||||||
#include <stddef.h>
|
|
||||||
#include <cstring>
|
#include <initializer_list>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This is a small helper class that defines a single data pool entry.
|
* @brief This is a small helper class that defines a single data pool entry.
|
||||||
|
* @details
|
||||||
|
* The helper is used to store all information together with the data as a
|
||||||
|
* single data pool entry. The content's type is defined by the template
|
||||||
|
* argument.
|
||||||
*
|
*
|
||||||
* \details The helper is used to store all information together with the data as a single data pool entry.
|
* It is prepared for use with plain old data types, but may be
|
||||||
* The content's type is defined by the template argument.
|
* extended to complex types if necessary. It can be initialized with a
|
||||||
* It is prepared for use with plain old data types,
|
* certain value, size and validity flag.
|
||||||
* but may be extended to complex types if necessary.
|
|
||||||
* It can be initialized with a certain value, size and validity flag.
|
|
||||||
* It holds a pointer to the real data and offers methods to access this data and to acquire
|
|
||||||
* additional information (such as validity and array/byte size).
|
|
||||||
* It is NOT intended to be used outside the DataPool class.
|
|
||||||
*
|
*
|
||||||
* \ingroup data_pool
|
* It holds a pointer to the real data and offers methods to access this data
|
||||||
|
* and to acquire additional information (such as validity and array/byte size).
|
||||||
|
* It is NOT intended to be used outside DataPool implementations as it performs
|
||||||
|
* dynamic memory allocation.
|
||||||
*
|
*
|
||||||
|
* @ingroup data_pool
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class PoolEntry : public PoolEntryIF {
|
class PoolEntry : public PoolEntryIF {
|
||||||
public:
|
public:
|
||||||
|
static_assert(not std::is_same<T, bool>::value,
|
||||||
|
"Do not use boolean for the PoolEntry type, use uint8_t "
|
||||||
|
"instead! The ECSS standard defines a boolean as a one bit "
|
||||||
|
"field. Therefore it is preferred to store a boolean as an "
|
||||||
|
"uint8_t");
|
||||||
/**
|
/**
|
||||||
* \brief In the classe's constructor, space is allocated on the heap and
|
* @brief In the classe's constructor, space is allocated on the heap and
|
||||||
* potential init values are copied to that space.
|
* potential init values are copied to that space.
|
||||||
* \param initValue A pointer to the single value or array that holds the init value.
|
* @details
|
||||||
* With the default value (NULL), the entry is initalized with all 0.
|
* Not passing any arguments will initialize an non-array pool entry
|
||||||
* \param set_length Defines the array length of this entry.
|
* (setLength = 1) with an initial invalid state.
|
||||||
* \param set_valid Sets the initialization flag. It is invalid (0) by default.
|
* Please note that if an initializer list is passed, the correct
|
||||||
|
* corresponding length should be passed too, otherwise a zero
|
||||||
|
* initialization will be performed with the given setLength.
|
||||||
|
* @param initValue
|
||||||
|
* Initializer list with values to initialize with, for example {0,0} to
|
||||||
|
* initialize the two entries to zero.
|
||||||
|
* @param setLength
|
||||||
|
* Defines the array length of this entry. Should be equal to the
|
||||||
|
* intializer list length.
|
||||||
|
* @param setValid
|
||||||
|
* Sets the initialization flag. It is invalid by default.
|
||||||
*/
|
*/
|
||||||
PoolEntry( T* initValue = NULL, uint8_t set_length = 1, uint8_t set_valid = 0 );
|
PoolEntry(std::initializer_list<T> initValue = {}, uint8_t setLength = 1,
|
||||||
|
bool setValid = false);
|
||||||
/**
|
/**
|
||||||
* \brief The allocated memory for the variable is freed in the destructor.
|
* @brief In the classe's constructor, space is allocated on the heap and
|
||||||
* \details As the data pool is global, this dtor is only called on program exit.
|
* potential init values are copied to that space.
|
||||||
* PoolEntries shall never be copied, as a copy might delete the variable on the heap.
|
* @param initValue
|
||||||
|
* A pointer to the single value or array that holds the init value.
|
||||||
|
* With the default value (nullptr), the entry is initalized with all 0.
|
||||||
|
* @param setLength
|
||||||
|
* Defines the array length of this entry.
|
||||||
|
* @param setValid
|
||||||
|
* Sets the initialization flag. It is invalid by default.
|
||||||
|
*/
|
||||||
|
PoolEntry(T* initValue, uint8_t setLength = 1, bool setValid = false);
|
||||||
|
|
||||||
|
//! Explicitely deleted copy ctor, copying is not allowed!
|
||||||
|
PoolEntry(const PoolEntry&) = delete;
|
||||||
|
//! Explicitely deleted copy assignment, copying is not allowed!
|
||||||
|
PoolEntry& operator=(const PoolEntry&) = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The allocated memory for the variable is freed
|
||||||
|
* in the destructor.
|
||||||
|
* @details
|
||||||
|
* As the data pool is global, this dtor is only called on program exit.
|
||||||
|
* PoolEntries shall never be copied, as a copy might delete the variable
|
||||||
|
* on the heap.
|
||||||
*/
|
*/
|
||||||
~PoolEntry();
|
~PoolEntry();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This is the address pointing to the allocated memory.
|
* @brief This is the address pointing to the allocated memory.
|
||||||
*/
|
*/
|
||||||
T* address;
|
T* address;
|
||||||
/**
|
/**
|
||||||
* \brief This attribute stores the length information.
|
* @brief This attribute stores the length information.
|
||||||
*/
|
*/
|
||||||
uint8_t length;
|
uint8_t length;
|
||||||
/**
|
/**
|
||||||
* \brief Here, the validity information for a variable is stored.
|
* @brief Here, the validity information for a variable is stored.
|
||||||
* Every entry (single variable or vector) has one valid flag.
|
* Every entry (single variable or vector) has one valid flag.
|
||||||
*/
|
*/
|
||||||
uint8_t valid;
|
uint8_t valid;
|
||||||
/**
|
/**
|
||||||
* \brief getSize returns the array size of the entry.
|
* @brief getSize returns the array size of the entry.
|
||||||
* \details A single parameter has size 1.
|
* @details A single parameter has size 1.
|
||||||
*/
|
*/
|
||||||
uint8_t getSize();
|
uint8_t getSize();
|
||||||
/**
|
/**
|
||||||
* \brief This operation returns the size in bytes.
|
* @brief This operation returns the size in bytes.
|
||||||
* \details The size is calculated by sizeof(type) * array_size.
|
* @details The size is calculated by sizeof(type) * array_size.
|
||||||
*/
|
*/
|
||||||
uint16_t getByteSize();
|
uint16_t getByteSize();
|
||||||
/**
|
/**
|
||||||
* \brief This operation returns a the address pointer casted to void*.
|
* @brief This operation returns a the address pointer casted to void*.
|
||||||
*/
|
*/
|
||||||
void* getRawData();
|
void* getRawData();
|
||||||
/**
|
/**
|
||||||
* \brief This method allows to set the valid information of the pool entry.
|
* @brief This method allows to set the valid information
|
||||||
|
* of the pool entry.
|
||||||
*/
|
*/
|
||||||
void setValid( uint8_t isValid );
|
void setValid( bool isValid );
|
||||||
/**
|
/**
|
||||||
* \brief This method allows to get the valid information of the pool entry.
|
* @brief This method allows to get the valid information
|
||||||
|
* of the pool entry.
|
||||||
*/
|
*/
|
||||||
uint8_t getValid();
|
bool getValid();
|
||||||
/**
|
/**
|
||||||
* \brief This is a debug method that prints all values and the valid information to the screen.
|
* @brief This is a debug method that prints all values and the valid
|
||||||
* It prints all array entries in a row.
|
* information to the screen. It prints all array entries in a row.
|
||||||
*/
|
*/
|
||||||
void print();
|
void print();
|
||||||
|
|
||||||
|
@ -1,62 +1,57 @@
|
|||||||
/**
|
#ifndef FRAMEWORK_DATAPOOL_POOLENTRYIF_H_
|
||||||
* \file PoolEntryIF.h
|
#define FRAMEWORK_DATAPOOL_POOLENTRYIF_H_
|
||||||
*
|
|
||||||
* \brief This file holds the class that defines the Interface for Pool Entry elements.
|
|
||||||
*
|
|
||||||
* \date 10/18/2012
|
|
||||||
*
|
|
||||||
* \author Bastian Baetz
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef POOLENTRYIF_H_
|
|
||||||
#define POOLENTRYIF_H_
|
|
||||||
|
|
||||||
#include <framework/globalfunctions/Type.h>
|
#include <framework/globalfunctions/Type.h>
|
||||||
#include <stdint.h>
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This interface defines the access possibilities to a single data pool entry.
|
* @brief This interface defines the access possibilities to a
|
||||||
|
* single data pool entry.
|
||||||
|
* @details
|
||||||
|
* The interface provides methods to determine the size and the validity
|
||||||
|
* information of a value. It also defines a method to receive a pointer to the
|
||||||
|
* raw data content. It is mainly used by DataPool itself, but also as a
|
||||||
|
* return pointer.
|
||||||
*
|
*
|
||||||
* \details The interface provides methods to determine the size and the validity information of a value.
|
* @author Bastian Baetz
|
||||||
* It also defines a method to receive a pointer to the raw data content.
|
* @ingroup data_pool
|
||||||
* It is mainly used by DataPool itself, but also as a return pointer.
|
|
||||||
*
|
|
||||||
* \ingroup data_pool
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class PoolEntryIF {
|
class PoolEntryIF {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* \brief This is an empty virtual destructor, as it is proposed for C++ interfaces.
|
* @brief This is an empty virtual destructor,
|
||||||
|
* as it is required for C++ interfaces.
|
||||||
*/
|
*/
|
||||||
virtual ~PoolEntryIF() {
|
virtual ~PoolEntryIF() {
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* \brief getSize returns the array size of the entry. A single variable parameter has size 1.
|
* @brief getSize returns the array size of the entry.
|
||||||
|
* A single variable parameter has size 1.
|
||||||
*/
|
*/
|
||||||
virtual uint8_t getSize() = 0;
|
virtual uint8_t getSize() = 0;
|
||||||
/**
|
/**
|
||||||
* \brief This operation returns the size in bytes, which is calculated by
|
* @brief This operation returns the size in bytes, which is calculated by
|
||||||
* sizeof(type) * array_size.
|
* sizeof(type) * array_size.
|
||||||
*/
|
*/
|
||||||
virtual uint16_t getByteSize() = 0;
|
virtual uint16_t getByteSize() = 0;
|
||||||
/**
|
/**
|
||||||
* \brief This operation returns a the address pointer casted to void*.
|
* @brief This operation returns a the address pointer casted to void*.
|
||||||
*/
|
*/
|
||||||
virtual void* getRawData() = 0;
|
virtual void* getRawData() = 0;
|
||||||
/**
|
/**
|
||||||
* \brief This method allows to set the valid information of the pool entry.
|
* @brief This method allows to set the valid information of the pool entry.
|
||||||
*/
|
*/
|
||||||
virtual void setValid(uint8_t isValid) = 0;
|
virtual void setValid(bool isValid) = 0;
|
||||||
/**
|
/**
|
||||||
* \brief This method allows to set the valid information of the pool entry.
|
* @brief This method allows to set the valid information of the pool entry.
|
||||||
*/
|
*/
|
||||||
virtual uint8_t getValid() = 0;
|
virtual bool getValid() = 0;
|
||||||
/**
|
/**
|
||||||
* \brief This is a debug method that prints all values and the valid information to the screen.
|
* @brief This is a debug method that prints all values and the valid
|
||||||
* It prints all array entries in a row.
|
* information to the screen. It prints all array entries in a row.
|
||||||
|
* @details
|
||||||
|
* Also displays whether the pool entry is valid or invalid.
|
||||||
*/
|
*/
|
||||||
virtual void print() = 0;
|
virtual void print() = 0;
|
||||||
/**
|
/**
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#include <framework/serviceinterface/ServiceInterfaceStream.h>
|
#include <framework/serviceinterface/ServiceInterfaceStream.h>
|
||||||
#include <framework/osal/Endiness.h>
|
#include <framework/osal/Endiness.h>
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
PoolRawAccess::PoolRawAccess(uint32_t set_id, uint8_t setArrayEntry,
|
PoolRawAccess::PoolRawAccess(uint32_t set_id, uint8_t setArrayEntry,
|
||||||
DataSetIF* data_set, ReadWriteMode_t setReadWriteMode) :
|
DataSetIF* data_set, ReadWriteMode_t setReadWriteMode) :
|
||||||
dataPoolId(set_id), arrayEntry(setArrayEntry), valid(false), type(Type::UNKNOWN_TYPE), typeSize(
|
dataPoolId(set_id), arrayEntry(setArrayEntry), valid(false), type(Type::UNKNOWN_TYPE), typeSize(
|
||||||
|
Loading…
Reference in New Issue
Block a user