Merge branch 'master' into mueller/feature/windowsUdpBridge
This commit is contained in:
commit
565859a6f4
@ -1,15 +1,15 @@
|
|||||||
#ifndef ARRAYLIST_H_
|
#ifndef FSFW_CONTAINER_ARRAYLIST_H_
|
||||||
#define ARRAYLIST_H_
|
#define FSFW_CONTAINER_ARRAYLIST_H_
|
||||||
|
|
||||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||||
#include "../serialize/SerializeAdapter.h"
|
#include "../serialize/SerializeAdapter.h"
|
||||||
#include "../serialize/SerializeIF.h"
|
#include "../serialize/SerializeIF.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A List that stores its values in an array.
|
* @brief A List that stores its values in an array.
|
||||||
*
|
* @details
|
||||||
* The backend is an array that can be allocated by the class itself or supplied via ctor.
|
* The underlying storage is an array that can be allocated by the class
|
||||||
*
|
* itself or supplied via ctor.
|
||||||
*
|
*
|
||||||
* @ingroup container
|
* @ingroup container
|
||||||
*/
|
*/
|
||||||
@ -20,6 +20,53 @@ public:
|
|||||||
static const uint8_t INTERFACE_ID = CLASS_ID::ARRAY_LIST;
|
static const uint8_t INTERFACE_ID = CLASS_ID::ARRAY_LIST;
|
||||||
static const ReturnValue_t FULL = MAKE_RETURN_CODE(0x01);
|
static const ReturnValue_t FULL = MAKE_RETURN_CODE(0x01);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the allocating constructor.
|
||||||
|
* It allocates an array of the specified size.
|
||||||
|
* @param maxSize
|
||||||
|
*/
|
||||||
|
ArrayList(count_t maxSize) :
|
||||||
|
size(0), maxSize_(maxSize), allocated(true) {
|
||||||
|
entries = new T[maxSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the non-allocating constructor
|
||||||
|
*
|
||||||
|
* It expects a pointer to an array of a certain size and initializes
|
||||||
|
* itself to it.
|
||||||
|
*
|
||||||
|
* @param storage the array to use as backend
|
||||||
|
* @param maxSize size of storage
|
||||||
|
* @param size size of data already present in storage
|
||||||
|
*/
|
||||||
|
ArrayList(T *storage, count_t maxSize, count_t size = 0) :
|
||||||
|
size(size), entries(storage), maxSize_(maxSize), allocated(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copying is forbiden by declaring copy ctor and copy assignment deleted
|
||||||
|
* It is too ambigous in this case.
|
||||||
|
* (Allocate a new backend? Use the same? What to do in an modifying call?)
|
||||||
|
*/
|
||||||
|
ArrayList(const ArrayList& other) = delete;
|
||||||
|
const ArrayList& operator=(const ArrayList& other) = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of Elements stored in this List
|
||||||
|
*/
|
||||||
|
count_t size;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor, if the allocating constructor was used, it deletes the array.
|
||||||
|
*/
|
||||||
|
virtual ~ArrayList() {
|
||||||
|
if (allocated) {
|
||||||
|
delete[] entries;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Iterator to go trough an ArrayList
|
* An Iterator to go trough an ArrayList
|
||||||
*
|
*
|
||||||
@ -31,10 +78,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Empty ctor, points to NULL
|
* Empty ctor, points to NULL
|
||||||
*/
|
*/
|
||||||
Iterator() :
|
Iterator(): value(0) {}
|
||||||
value(0) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the Iterator to point to an element
|
* Initializes the Iterator to point to an element
|
||||||
@ -72,70 +116,31 @@ public:
|
|||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
T& operator*(){
|
T& operator*() {
|
||||||
return *value;
|
return *value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const T& operator*() const{
|
const T& operator*() const {
|
||||||
return *value;
|
return *value;
|
||||||
}
|
}
|
||||||
|
|
||||||
T *operator->(){
|
T *operator->() {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
const T *operator->() const{
|
const T *operator->() const {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
//SHOULDDO this should be implemented as non-member
|
|
||||||
bool operator==(const typename ArrayList<T, count_t>::Iterator& other) const{
|
|
||||||
return (value == other.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
//SHOULDDO this should be implemented as non-member
|
|
||||||
bool operator!=(const typename ArrayList<T, count_t>::Iterator& other) const {
|
|
||||||
return !(*this == other);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
friend bool operator==(const ArrayList::Iterator& lhs,
|
||||||
* Number of Elements stored in this List
|
const ArrayList::Iterator& rhs) {
|
||||||
*/
|
return (lhs.value == rhs.value);
|
||||||
count_t size;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the allocating constructor;
|
|
||||||
*
|
|
||||||
* It allocates an array of the specified size.
|
|
||||||
*
|
|
||||||
* @param maxSize
|
|
||||||
*/
|
|
||||||
ArrayList(count_t maxSize) :
|
|
||||||
size(0), maxSize_(maxSize), allocated(true) {
|
|
||||||
entries = new T[maxSize];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
friend bool operator!=(const ArrayList::Iterator& lhs,
|
||||||
* This is the non-allocating constructor
|
const ArrayList::Iterator& rhs) {
|
||||||
*
|
return not (lhs.value == rhs.value);
|
||||||
* It expects a pointer to an array of a certain size and initializes itself to it.
|
|
||||||
*
|
|
||||||
* @param storage the array to use as backend
|
|
||||||
* @param maxSize size of storage
|
|
||||||
* @param size size of data already present in storage
|
|
||||||
*/
|
|
||||||
ArrayList(T *storage, count_t maxSize, count_t size = 0) :
|
|
||||||
size(size), entries(storage), maxSize_(maxSize), allocated(false) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor, if the allocating constructor was used, it deletes the array.
|
|
||||||
*/
|
|
||||||
virtual ~ArrayList() {
|
|
||||||
if (allocated) {
|
|
||||||
delete[] entries;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -191,7 +196,7 @@ public:
|
|||||||
*
|
*
|
||||||
* @return maximum number of elements
|
* @return maximum number of elements
|
||||||
*/
|
*/
|
||||||
uint32_t maxSize() const {
|
size_t maxSize() const {
|
||||||
return this->maxSize_;
|
return this->maxSize_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,19 +231,7 @@ public:
|
|||||||
count_t remaining() {
|
count_t remaining() {
|
||||||
return (maxSize_ - size);
|
return (maxSize_ - size);
|
||||||
}
|
}
|
||||||
private:
|
|
||||||
/**
|
|
||||||
* This is the copy constructor
|
|
||||||
*
|
|
||||||
* It is private, as copying is too ambigous in this case. (Allocate a new backend? Use the same?
|
|
||||||
* What to do in an modifying call?)
|
|
||||||
*
|
|
||||||
* @param other
|
|
||||||
*/
|
|
||||||
ArrayList(const ArrayList& other) :
|
|
||||||
size(other.size), entries(other.entries), maxSize_(other.maxSize_), allocated(
|
|
||||||
false) {
|
|
||||||
}
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* pointer to the array in which the entries are stored
|
* pointer to the array in which the entries are stored
|
||||||
@ -247,12 +240,14 @@ protected:
|
|||||||
/**
|
/**
|
||||||
* remembering the maximum size
|
* remembering the maximum size
|
||||||
*/
|
*/
|
||||||
uint32_t maxSize_;
|
size_t maxSize_;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* true if the array was allocated and needs to be deleted in the destructor.
|
* true if the array was allocated and needs to be deleted in the destructor.
|
||||||
*/
|
*/
|
||||||
bool allocated;
|
bool allocated;
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif /* ARRAYLIST_H_ */
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* FSFW_CONTAINER_ARRAYLIST_H_ */
|
||||||
|
@ -19,32 +19,46 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Insert value into FIFO
|
* Insert value into FIFO
|
||||||
* @param value
|
* @param value
|
||||||
* @return
|
* @return RETURN_OK on success, FULL if full
|
||||||
*/
|
*/
|
||||||
ReturnValue_t insert(T value);
|
ReturnValue_t insert(T value);
|
||||||
/**
|
/**
|
||||||
* Retrieve item from FIFO. This removes the item from the FIFO.
|
* Retrieve item from FIFO. This removes the item from the FIFO.
|
||||||
* @param value
|
* @param value Must point to a valid T
|
||||||
* @return
|
* @return RETURN_OK on success, EMPTY if empty and FAILED if nullptr check failed
|
||||||
*/
|
*/
|
||||||
ReturnValue_t retrieve(T *value);
|
ReturnValue_t retrieve(T *value);
|
||||||
/**
|
/**
|
||||||
* Retrieve item from FIFO without removing it from FIFO.
|
* Retrieve item from FIFO without removing it from FIFO.
|
||||||
* @param value
|
* @param value Must point to a valid T
|
||||||
* @return
|
* @return RETURN_OK on success, EMPTY if empty and FAILED if nullptr check failed
|
||||||
*/
|
*/
|
||||||
ReturnValue_t peek(T * value);
|
ReturnValue_t peek(T * value);
|
||||||
/**
|
/**
|
||||||
* Remove item from FIFO.
|
* Remove item from FIFO.
|
||||||
* @return
|
* @return RETURN_OK on success, EMPTY if empty
|
||||||
*/
|
*/
|
||||||
ReturnValue_t pop();
|
ReturnValue_t pop();
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Check if FIFO is empty
|
||||||
|
* @return True if empty, False if not
|
||||||
|
*/
|
||||||
bool empty();
|
bool empty();
|
||||||
|
/***
|
||||||
|
* Check if FIFO is Full
|
||||||
|
* @return True if full, False if not
|
||||||
|
*/
|
||||||
bool full();
|
bool full();
|
||||||
|
/***
|
||||||
|
* Current used size (elements) used
|
||||||
|
* @return size_t in elements
|
||||||
|
*/
|
||||||
size_t size();
|
size_t size();
|
||||||
|
/***
|
||||||
|
* Get maximal capacity of fifo
|
||||||
|
* @return size_t with max capacity of this fifo
|
||||||
|
*/
|
||||||
size_t getMaxCapacity() const;
|
size_t getMaxCapacity() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -26,6 +26,9 @@ inline ReturnValue_t FIFOBase<T>::retrieve(T* value) {
|
|||||||
if (empty()) {
|
if (empty()) {
|
||||||
return EMPTY;
|
return EMPTY;
|
||||||
} else {
|
} else {
|
||||||
|
if (value == nullptr){
|
||||||
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
|
}
|
||||||
*value = values[readIndex];
|
*value = values[readIndex];
|
||||||
readIndex = next(readIndex);
|
readIndex = next(readIndex);
|
||||||
--currentSize;
|
--currentSize;
|
||||||
@ -38,6 +41,9 @@ inline ReturnValue_t FIFOBase<T>::peek(T* value) {
|
|||||||
if(empty()) {
|
if(empty()) {
|
||||||
return EMPTY;
|
return EMPTY;
|
||||||
} else {
|
} else {
|
||||||
|
if (value == nullptr){
|
||||||
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
|
}
|
||||||
*value = values[readIndex];
|
*value = values[readIndex];
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,13 @@
|
|||||||
#define FIXEDARRAYLIST_H_
|
#define FIXEDARRAYLIST_H_
|
||||||
|
|
||||||
#include "ArrayList.h"
|
#include "ArrayList.h"
|
||||||
|
#include <cmath>
|
||||||
/**
|
/**
|
||||||
* \ingroup container
|
* \ingroup container
|
||||||
*/
|
*/
|
||||||
template<typename T, uint32_t MAX_SIZE, typename count_t = uint8_t>
|
template<typename T, size_t MAX_SIZE, typename count_t = uint8_t>
|
||||||
class FixedArrayList: public ArrayList<T, count_t> {
|
class FixedArrayList: public ArrayList<T, count_t> {
|
||||||
|
static_assert(MAX_SIZE <= (pow(2,sizeof(count_t)*8)-1), "count_t is not large enough to hold MAX_SIZE");
|
||||||
private:
|
private:
|
||||||
T data[MAX_SIZE];
|
T data[MAX_SIZE];
|
||||||
public:
|
public:
|
||||||
@ -18,11 +20,13 @@ public:
|
|||||||
ArrayList<T, count_t>(data, MAX_SIZE) {
|
ArrayList<T, count_t>(data, MAX_SIZE) {
|
||||||
memcpy(this->data, other.data, sizeof(this->data));
|
memcpy(this->data, other.data, sizeof(this->data));
|
||||||
this->entries = data;
|
this->entries = data;
|
||||||
|
this->size = other.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
FixedArrayList& operator=(FixedArrayList other) {
|
FixedArrayList& operator=(FixedArrayList other) {
|
||||||
memcpy(this->data, other.data, sizeof(this->data));
|
memcpy(this->data, other.data, sizeof(this->data));
|
||||||
this->entries = data;
|
this->entries = data;
|
||||||
|
this->size = other.size;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,14 +7,21 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @brief Map implementation for maps with a pre-defined size.
|
||||||
|
* @details
|
||||||
|
* Can be initialized with desired maximum size.
|
||||||
|
* Iterator is used to access <key,value> pair and iterate through map entries.
|
||||||
|
* Complexity O(n).
|
||||||
* @warning Iterators return a non-const key_t in the pair.
|
* @warning Iterators return a non-const key_t in the pair.
|
||||||
* @warning A User is not allowed to change the key, otherwise the map is corrupted.
|
* @warning A User is not allowed to change the key, otherwise the map is corrupted.
|
||||||
* @ingroup container
|
* @ingroup container
|
||||||
*/
|
*/
|
||||||
template<typename key_t, typename T>
|
template<typename key_t, typename T>
|
||||||
class FixedMap: public SerializeIF {
|
class FixedMap: public SerializeIF {
|
||||||
static_assert (std::is_trivially_copyable<T>::value or std::is_base_of<SerializeIF, T>::value,
|
static_assert (std::is_trivially_copyable<T>::value or
|
||||||
"Types used in FixedMap must either be trivial copy-able or a derived Class from SerializeIF to be serialize-able");
|
std::is_base_of<SerializeIF, T>::value,
|
||||||
|
"Types used in FixedMap must either be trivial copy-able or a "
|
||||||
|
"derived class from SerializeIF to be serialize-able");
|
||||||
public:
|
public:
|
||||||
static const uint8_t INTERFACE_ID = CLASS_ID::FIXED_MAP;
|
static const uint8_t INTERFACE_ID = CLASS_ID::FIXED_MAP;
|
||||||
static const ReturnValue_t KEY_ALREADY_EXISTS = MAKE_RETURN_CODE(0x01);
|
static const ReturnValue_t KEY_ALREADY_EXISTS = MAKE_RETURN_CODE(0x01);
|
||||||
@ -54,6 +61,16 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
friend bool operator==(const typename FixedMap::Iterator& lhs,
|
||||||
|
const typename FixedMap::Iterator& rhs) {
|
||||||
|
return (lhs.value == rhs.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
friend bool operator!=(const typename FixedMap::Iterator& lhs,
|
||||||
|
const typename FixedMap::Iterator& rhs) {
|
||||||
|
return not (lhs.value == rhs.value);
|
||||||
|
}
|
||||||
|
|
||||||
Iterator begin() const {
|
Iterator begin() const {
|
||||||
return Iterator(&theMap[0]);
|
return Iterator(&theMap[0]);
|
||||||
}
|
}
|
||||||
@ -136,6 +153,24 @@ public:
|
|||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool empty() {
|
||||||
|
if(_size == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool full() {
|
||||||
|
if(_size >= theMap.maxSize()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
_size = 0;
|
_size = 0;
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t insert(std::pair<key_t, T> pair) {
|
ReturnValue_t insert(std::pair<key_t, T> pair) {
|
||||||
return insert(pair.fist, pair.second);
|
return insert(pair.first, pair.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t exists(key_t key) const {
|
ReturnValue_t exists(key_t key) const {
|
||||||
|
@ -3,26 +3,62 @@
|
|||||||
|
|
||||||
#include "../storagemanager/StorageManagerIF.h"
|
#include "../storagemanager/StorageManagerIF.h"
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
/**
|
||||||
|
* The Placement Factory is used to create objects at runtime in a specific pool.
|
||||||
|
* In general, this should be avoided and it should only be used if you know what you are doing.
|
||||||
|
* You are not allowed to use this container with a type that allocates memory internally like ArrayList.
|
||||||
|
*
|
||||||
|
* Also, you have to check the returned pointer in generate against nullptr!
|
||||||
|
*
|
||||||
|
* A backend of Type StorageManagerIF must be given as a place to store the new objects.
|
||||||
|
* Therefore ThreadSafety is only provided by your StorageManager Implementation.
|
||||||
|
*
|
||||||
|
* Objects must be destroyed by the user with "destroy"! Otherwise the pool will not be cleared.
|
||||||
|
*
|
||||||
|
* The concept is based on the placement new operator.
|
||||||
|
*
|
||||||
|
* @warning Do not use with any Type that allocates memory internally!
|
||||||
|
* @ingroup container
|
||||||
|
*/
|
||||||
class PlacementFactory {
|
class PlacementFactory {
|
||||||
public:
|
public:
|
||||||
PlacementFactory(StorageManagerIF* backend) :
|
PlacementFactory(StorageManagerIF* backend) :
|
||||||
dataBackend(backend) {
|
dataBackend(backend) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Generates an object of type T in the backend storage.
|
||||||
|
*
|
||||||
|
* @warning Do not use with any Type that allocates memory internally!
|
||||||
|
*
|
||||||
|
* @tparam T Type of Object
|
||||||
|
* @param args Constructor Arguments to be passed
|
||||||
|
* @return A pointer to the new object or a nullptr in case of failure
|
||||||
|
*/
|
||||||
template<typename T, typename ... Args>
|
template<typename T, typename ... Args>
|
||||||
T* generate(Args&&... args) {
|
T* generate(Args&&... args) {
|
||||||
store_address_t tempId;
|
store_address_t tempId;
|
||||||
uint8_t* pData = NULL;
|
uint8_t* pData = nullptr;
|
||||||
ReturnValue_t result = dataBackend->getFreeElement(&tempId, sizeof(T),
|
ReturnValue_t result = dataBackend->getFreeElement(&tempId, sizeof(T),
|
||||||
&pData);
|
&pData);
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
T* temp = new (pData) T(std::forward<Args>(args)...);
|
T* temp = new (pData) T(std::forward<Args>(args)...);
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
/***
|
||||||
|
* Function to destroy the object allocated with generate and free space in backend.
|
||||||
|
* This must be called by the user.
|
||||||
|
*
|
||||||
|
* @param thisElement Element to be destroyed
|
||||||
|
* @return RETURN_OK if the element was destroyed, different errors on failure
|
||||||
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ReturnValue_t destroy(T* thisElement) {
|
ReturnValue_t destroy(T* thisElement) {
|
||||||
|
if (thisElement == nullptr){
|
||||||
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
|
}
|
||||||
//Need to call destructor first, in case something was allocated by the object (shouldn't do that, however).
|
//Need to call destructor first, in case something was allocated by the object (shouldn't do that, however).
|
||||||
thisElement->~T();
|
thisElement->~T();
|
||||||
uint8_t* pointer = (uint8_t*) (thisElement);
|
uint8_t* pointer = (uint8_t*) (thisElement);
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include "SimpleRingBuffer.h"
|
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
using namespace std;
|
|
||||||
SimpleRingBuffer buffer(64, false);
|
|
||||||
uint8_t data[8] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
|
|
||||||
ReturnValue_t result = buffer.writeData(data, 8);
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "writeData failed." << endl;
|
|
||||||
}
|
|
||||||
result = buffer.writeData(data, 8);
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "writeData failed." << endl;
|
|
||||||
}
|
|
||||||
uint8_t buffer2[47] = {0};
|
|
||||||
for (uint8_t count = 0; count<sizeof(buffer2); count++) {
|
|
||||||
buffer2[count] = count;
|
|
||||||
}
|
|
||||||
result = buffer.writeData(buffer2, sizeof(buffer2));
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "writeData failed." << endl;
|
|
||||||
}
|
|
||||||
result = buffer.writeData(buffer2, sizeof(buffer2));
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "writeData failed." << endl;
|
|
||||||
}
|
|
||||||
uint8_t readBuffer[64] = {0};
|
|
||||||
uint32_t writtenData = 0;
|
|
||||||
result = buffer.readData(readBuffer, 12, true, &writtenData);
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "readData failed." << endl;
|
|
||||||
} else {
|
|
||||||
cout << "Read data: " << writtenData << endl;
|
|
||||||
for (uint32_t count = 0; count < writtenData; count++) {
|
|
||||||
cout << hex << (uint16_t)readBuffer[count] << " ";
|
|
||||||
}
|
|
||||||
cout << dec << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = buffer.readData(readBuffer, 60, true, &writtenData);
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "readData failed." << endl;
|
|
||||||
} else {
|
|
||||||
cout << "Read data: " << writtenData << endl;
|
|
||||||
for (uint32_t count = 0; count < writtenData; count++) {
|
|
||||||
cout << hex << (uint16_t)readBuffer[count] << " ";
|
|
||||||
}
|
|
||||||
cout << dec << endl;
|
|
||||||
}
|
|
||||||
result = buffer.writeData(data, sizeof(data));
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "writeData failed." << endl;
|
|
||||||
}
|
|
||||||
result = buffer.readData(readBuffer, 60, true, &writtenData);
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "readData failed." << endl;
|
|
||||||
} else {
|
|
||||||
cout << "Read data: " << writtenData << endl;
|
|
||||||
for (uint32_t count = 0; count < writtenData; count++) {
|
|
||||||
cout << hex << (uint16_t)readBuffer[count] << " ";
|
|
||||||
}
|
|
||||||
cout << dec << endl;
|
|
||||||
}
|
|
||||||
result = buffer.writeData(readBuffer, sizeof(readBuffer));
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "writeData failed." << endl;
|
|
||||||
}
|
|
||||||
result = buffer.writeData(readBuffer, sizeof(readBuffer)-1);
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
cout << "writeData failed." << endl;
|
|
||||||
} else {
|
|
||||||
cout << "write done." << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,365 +0,0 @@
|
|||||||
#include "FixedArrayList.h"
|
|
||||||
#include "SinglyLinkedList.h"
|
|
||||||
#include "HybridIterator.h"
|
|
||||||
|
|
||||||
#include "FixedMap.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
class Packet: public SinglyLinkedList {
|
|
||||||
public:
|
|
||||||
SinglyLinkedList::Element<uint32_t> element1;
|
|
||||||
SinglyLinkedList::Element<uint32_t> element2;
|
|
||||||
|
|
||||||
Packet() {
|
|
||||||
this->start = &element1;
|
|
||||||
element1.next = &element2;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class Packet2: public SinglyLinkedList {
|
|
||||||
public:
|
|
||||||
SinglyLinkedList::Element<uint32_t> element1;
|
|
||||||
SinglyLinkedList::Element<FixedArrayList<FixedArrayList<uint8_t, 5>, 2>> element2;
|
|
||||||
SinglyLinkedList::Element<uint32_t> element3;
|
|
||||||
|
|
||||||
Packet2() {
|
|
||||||
this->start = &element1;
|
|
||||||
element1.next = &element2;
|
|
||||||
element2.next = &element3;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class Packet3: public SinglyLinkedList {
|
|
||||||
public:
|
|
||||||
SinglyLinkedList::TypedElement<uint32_t> element1;
|
|
||||||
SinglyLinkedList::TypedElement<uint32_t> element2;
|
|
||||||
|
|
||||||
Packet3() {
|
|
||||||
this->start = &element1;
|
|
||||||
element1.next = &element2;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void arrayList() {
|
|
||||||
puts("** Array List **");
|
|
||||||
FixedArrayList<uint32_t, 10, uint32_t> list;
|
|
||||||
FixedArrayList<uint32_t, 10, uint32_t> list2;
|
|
||||||
|
|
||||||
list.size = 2;
|
|
||||||
|
|
||||||
list[0] = 0xcafecafe;
|
|
||||||
|
|
||||||
list[1] = 0x12345678;
|
|
||||||
|
|
||||||
uint8_t buffer[100];
|
|
||||||
uint8_t *pointer = buffer;
|
|
||||||
uint32_t size = 0;
|
|
||||||
uint32_t maxSize = 100;
|
|
||||||
uint32_t i;
|
|
||||||
int32_t size2;
|
|
||||||
|
|
||||||
printf("printsize: %i\n", list.getPrintSize());
|
|
||||||
|
|
||||||
list.print(&pointer, &size, 100, true);
|
|
||||||
|
|
||||||
printf("buffer(%i):", size);
|
|
||||||
for (i = 0; i < size; ++i) {
|
|
||||||
printf("%02x", buffer[i]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
pointer = buffer;
|
|
||||||
|
|
||||||
size2 = size;
|
|
||||||
|
|
||||||
printf("list2 read: %x\n", list2.read(&pointer, &size2, true));
|
|
||||||
|
|
||||||
printf("list2(%i):", list2.size);
|
|
||||||
for (ArrayList<uint32_t, uint32_t>::Iterator iter = list2.begin();
|
|
||||||
iter != list2.end(); iter++) {
|
|
||||||
printf("0x%04x ", *iter);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
HybridIterator<uint32_t, uint32_t> hiter(list.begin(),list.end());
|
|
||||||
|
|
||||||
printf("hybrid1: 0x%04x\n", *(hiter++));
|
|
||||||
printf("hybrid2: 0x%04x\n", *hiter);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void allocatingList() {
|
|
||||||
puts("** Allocating List **");
|
|
||||||
ArrayList<uint8_t> myList(3), myList2(2);
|
|
||||||
myList[0] = 0xab;
|
|
||||||
myList[1] = 0xcd;
|
|
||||||
myList.size = 2;
|
|
||||||
|
|
||||||
uint8_t buffer[100];
|
|
||||||
uint8_t *pointer = buffer;
|
|
||||||
uint32_t size = 0;
|
|
||||||
uint32_t maxSize = 100;
|
|
||||||
uint32_t i;
|
|
||||||
int32_t size2;
|
|
||||||
|
|
||||||
myList.print(&pointer, &size, 100, true);
|
|
||||||
|
|
||||||
pointer = buffer;
|
|
||||||
size2 = size;
|
|
||||||
|
|
||||||
printf("Read %x\n", myList2.read(&pointer, &size2, true));
|
|
||||||
|
|
||||||
printf("%x,%x\n", myList2[0], myList2[1]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void linkedList() {
|
|
||||||
puts("** Linked List **");
|
|
||||||
uint8_t buffer[100];
|
|
||||||
uint8_t *pointer = buffer;
|
|
||||||
uint32_t size = 0;
|
|
||||||
uint32_t maxSize = 100;
|
|
||||||
uint32_t i;
|
|
||||||
int32_t size2;
|
|
||||||
|
|
||||||
Packet myPacket;
|
|
||||||
myPacket.element1.entry = 0x12345678;
|
|
||||||
myPacket.element2.entry = 0x9abcdef0;
|
|
||||||
|
|
||||||
pointer = buffer;
|
|
||||||
size = 0;
|
|
||||||
ReturnValue_t result = myPacket.print(&pointer, &size, 100, true);
|
|
||||||
|
|
||||||
printf("result %02x\n", result);
|
|
||||||
|
|
||||||
printf("printsize: %i\n", myPacket.getPrintSize());
|
|
||||||
|
|
||||||
printf("buffer(%i):", size);
|
|
||||||
for (i = 0; i < size; ++i) {
|
|
||||||
printf("%02x", buffer[i]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
Packet3 myPacket3;
|
|
||||||
|
|
||||||
myPacket3.element1.entry = 0x12345678;
|
|
||||||
myPacket3.element2.entry = 0xabcdeff;
|
|
||||||
|
|
||||||
SinglyLinkedList::TypedIterator<uint32_t> titer(&myPacket3.element1);
|
|
||||||
|
|
||||||
printf("0x%04x\n", *titer);
|
|
||||||
|
|
||||||
HybridIterator<uint32_t, uint32_t> hiter(&myPacket3.element1);
|
|
||||||
|
|
||||||
printf("hybrid1: 0x%04x\n", *hiter);
|
|
||||||
hiter++;
|
|
||||||
printf("hybrid2: 0x%04x\n", *hiter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void complex() {
|
|
||||||
puts("** complex **");
|
|
||||||
uint8_t buffer[100];
|
|
||||||
uint8_t *pointer = buffer;
|
|
||||||
uint32_t size = 0;
|
|
||||||
uint32_t maxSize = 100;
|
|
||||||
uint32_t i;
|
|
||||||
int32_t size2 = size;
|
|
||||||
|
|
||||||
Packet myPacket2;
|
|
||||||
|
|
||||||
size2 = size;
|
|
||||||
pointer = buffer;
|
|
||||||
|
|
||||||
myPacket2.read(&pointer, &size2, true);
|
|
||||||
|
|
||||||
printf("packet: 0x%04x, 0x%04x\n", myPacket2.element1.entry,
|
|
||||||
myPacket2.element2.entry);
|
|
||||||
|
|
||||||
buffer[0] = 0x12;
|
|
||||||
buffer[1] = 0x34;
|
|
||||||
buffer[2] = 0x56;
|
|
||||||
buffer[3] = 0x78;
|
|
||||||
buffer[4] = 0x2;
|
|
||||||
buffer[5] = 0x3;
|
|
||||||
buffer[6] = 0xab;
|
|
||||||
buffer[7] = 0xcd;
|
|
||||||
buffer[8] = 0xef;
|
|
||||||
buffer[9] = 0x2;
|
|
||||||
buffer[10] = 0x11;
|
|
||||||
buffer[11] = 0x22;
|
|
||||||
buffer[12] = 0xca;
|
|
||||||
buffer[13] = 0xfe;
|
|
||||||
buffer[14] = 0x5a;
|
|
||||||
buffer[15] = 0xfe;
|
|
||||||
|
|
||||||
pointer = buffer;
|
|
||||||
size2 = 23;
|
|
||||||
|
|
||||||
Packet2 p2;
|
|
||||||
|
|
||||||
ReturnValue_t result = p2.read(&pointer, &size2, true);
|
|
||||||
printf("result is %02x\n", result);
|
|
||||||
|
|
||||||
printf("%04x; %i: %i: %x %x %x; %i: %x %x;; %04x\n", p2.element1.entry,
|
|
||||||
p2.element2.entry.size, p2.element2.entry[0].size,
|
|
||||||
p2.element2.entry[0][0], p2.element2.entry[0][1],
|
|
||||||
p2.element2.entry[0][2], p2.element2.entry[1].size,
|
|
||||||
p2.element2.entry[1][0], p2.element2.entry[1][1],
|
|
||||||
p2.element3.entry);
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
struct Test {
|
|
||||||
uint32_t a;
|
|
||||||
uint32_t b;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename key_t, typename T>
|
|
||||||
void printMap(FixedMap<key_t, T> *map) {
|
|
||||||
typename FixedMap<key_t, T>::Iterator iter;
|
|
||||||
printf("Map (%i): ", map->getSize());
|
|
||||||
for (iter = map->begin(); iter != map->end(); ++iter) {
|
|
||||||
printf("%x:%08x,%08x ", iter.value->first, (*iter).a, (*iter).b);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void map() {
|
|
||||||
puts("** Map **");
|
|
||||||
typename FixedMap<T, Test>::Iterator iter;
|
|
||||||
ReturnValue_t result;
|
|
||||||
FixedMap<T, Test> myMap(5);
|
|
||||||
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
Test a;
|
|
||||||
a.a = 0x01234567;
|
|
||||||
a.b = 0xabcdef89;
|
|
||||||
|
|
||||||
myMap.insert(1, a);
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
a.a = 0;
|
|
||||||
|
|
||||||
myMap.insert(2, a);
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
printf("2 exists: %x\n", myMap.exists(0x02));
|
|
||||||
|
|
||||||
printf("ff exists: %x\n", myMap.exists(0xff));
|
|
||||||
|
|
||||||
a.a = 1;
|
|
||||||
printf("insert 0x2: %x\n", myMap.insert(2, a));
|
|
||||||
|
|
||||||
result = myMap.insert(0xff, a);
|
|
||||||
a.a = 0x44;
|
|
||||||
result = myMap.insert(0xab, a);
|
|
||||||
result = myMap.insert(0xa, a);
|
|
||||||
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
printf("insert 0x5: %x\n", myMap.insert(5, a));
|
|
||||||
|
|
||||||
printf("erase 0xfe: %x\n", myMap.erase(0xfe));
|
|
||||||
|
|
||||||
printf("erase 0x2: %x\n", myMap.erase(0x2));
|
|
||||||
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
printf("erase 0xab: %x\n", myMap.erase(0xab));
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
printf("insert 0x5: %x\n", myMap.insert(5, a));
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
iter = myMap.begin();
|
|
||||||
++iter;
|
|
||||||
++iter;
|
|
||||||
++iter;
|
|
||||||
|
|
||||||
printf("iter: %i: %x,%x\n",iter.value->first, iter->a, iter->b);
|
|
||||||
|
|
||||||
myMap.erase(&iter);
|
|
||||||
|
|
||||||
printf("iter: %i: %x,%x\n",iter.value->first, iter->a, iter->b);
|
|
||||||
printMap<T, Test>(&myMap);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void mapPrint() {
|
|
||||||
puts("** Map Print **");
|
|
||||||
FixedMap<uint16_t, Packet2> myMap(5);
|
|
||||||
Packet2 myPacket;
|
|
||||||
myPacket.element1.entry = 0x12345678;
|
|
||||||
|
|
||||||
myPacket.element2.entry[0][0] = 0xab;
|
|
||||||
myPacket.element2.entry[0][1] = 0xcd;
|
|
||||||
myPacket.element2.entry[0].size = 2;
|
|
||||||
myPacket.element2.entry.size = 1;
|
|
||||||
|
|
||||||
myPacket.element3.entry = 0xabcdef90;
|
|
||||||
|
|
||||||
myMap.insert(0x1234, myPacket);
|
|
||||||
|
|
||||||
uint8_t buffer[100];
|
|
||||||
uint32_t size = 0, i;
|
|
||||||
uint8_t *pointer = buffer;
|
|
||||||
|
|
||||||
printf("printsize: %i\n", myMap.getPrintSize());
|
|
||||||
|
|
||||||
SerializeAdapter<FixedMap<uint16_t, Packet2>>::print(&myMap, &pointer,
|
|
||||||
&size, 100, false);
|
|
||||||
|
|
||||||
printf("buffer(%i):", size);
|
|
||||||
for (i = 0; i < size; ++i) {
|
|
||||||
printf("%02x", buffer[i]);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
int32_t size2 = size;
|
|
||||||
pointer = buffer;
|
|
||||||
|
|
||||||
FixedMap<uint16_t, Packet2> myMap2(5);
|
|
||||||
|
|
||||||
ReturnValue_t result = SerializeAdapter<FixedMap<uint16_t, Packet2>>::read(
|
|
||||||
&myMap2, &pointer, &size2, false);
|
|
||||||
|
|
||||||
Packet2 *myPacket2 = myMap2.find(0x1234);
|
|
||||||
|
|
||||||
printf("Map (%i): Packet2: %x, Array (%i): Array (%i): %x, %x; %x\n",
|
|
||||||
myMap2.getSize(), myPacket2->element1.entry,
|
|
||||||
myPacket2->element2.entry.size, myPacket2->element2.entry[0].size,
|
|
||||||
myPacket2->element2.entry[0][0], myPacket2->element2.entry[0][1],
|
|
||||||
myPacket2->element3.entry);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void empty() {
|
|
||||||
puts("** Empty **");
|
|
||||||
ArrayList<uint32_t> list(0);
|
|
||||||
printf("%p %p\n", list.front(), list.back());
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
|
|
||||||
// arrayList();
|
|
||||||
// linkedList();
|
|
||||||
// allocatingList();
|
|
||||||
// complex();
|
|
||||||
|
|
||||||
map<uint32_t>();
|
|
||||||
//
|
|
||||||
// mapPrint();
|
|
||||||
|
|
||||||
// empty();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,8 +1,8 @@
|
|||||||
#include "../../serviceinterface/ServiceInterfaceStream.h"
|
|
||||||
#include "MessageQueue.h"
|
#include "MessageQueue.h"
|
||||||
|
#include "../../serviceinterface/ServiceInterfaceStream.h"
|
||||||
|
#include "../../objectmanager/ObjectManagerIF.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
#include <fcntl.h> /* For O_* constants */
|
#include <fcntl.h> /* For O_* constants */
|
||||||
#include <sys/stat.h> /* For mode constants */
|
#include <sys/stat.h> /* For mode constants */
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
@ -107,13 +107,23 @@ ReturnValue_t CService200ModeCommanding::prepareWrongModeReply(
|
|||||||
const CommandMessage *reply, object_id_t objectId) {
|
const CommandMessage *reply, object_id_t objectId) {
|
||||||
ModePacket wrongModeReply(objectId, ModeMessage::getMode(reply),
|
ModePacket wrongModeReply(objectId, ModeMessage::getMode(reply),
|
||||||
ModeMessage::getSubmode(reply));
|
ModeMessage::getSubmode(reply));
|
||||||
return sendTmPacket(Subservice::REPLY_WRONG_MODE_REPLY, &wrongModeReply);
|
ReturnValue_t result = sendTmPacket(Subservice::REPLY_WRONG_MODE_REPLY, &wrongModeReply);
|
||||||
|
if(result == RETURN_OK){
|
||||||
|
// We want to produce an error here in any case because the mode was not correct
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t CService200ModeCommanding::prepareCantReachModeReply(
|
ReturnValue_t CService200ModeCommanding::prepareCantReachModeReply(
|
||||||
const CommandMessage *reply, object_id_t objectId) {
|
const CommandMessage *reply, object_id_t objectId) {
|
||||||
CantReachModePacket cantReachModePacket(objectId,
|
CantReachModePacket cantReachModePacket(objectId,
|
||||||
ModeMessage::getCantReachModeReason(reply));
|
ModeMessage::getCantReachModeReason(reply));
|
||||||
return sendTmPacket(Subservice::REPLY_CANT_REACH_MODE,
|
ReturnValue_t result = sendTmPacket(Subservice::REPLY_CANT_REACH_MODE,
|
||||||
&cantReachModePacket);
|
&cantReachModePacket);
|
||||||
|
if(result == RETURN_OK){
|
||||||
|
// We want to produce an error here in any case because the mode was not reached
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user