Merge remote-tracking branch 'origin/development' into mueller/mutex-fixes
This commit is contained in:
commit
66a09b94ac
@ -8,7 +8,9 @@
|
|||||||
*/
|
*/
|
||||||
template<typename T, size_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");
|
#if !defined(_MSC_VER)
|
||||||
|
static_assert(MAX_SIZE <= (std::pow(2,sizeof(count_t)*8)-1), "count_t is not large enough to hold MAX_SIZE");
|
||||||
|
#endif
|
||||||
private:
|
private:
|
||||||
T data[MAX_SIZE];
|
T data[MAX_SIZE];
|
||||||
public:
|
public:
|
||||||
|
@ -17,14 +17,6 @@ ReturnValue_t ExtendedControllerBase::executeAction(ActionId_t actionId,
|
|||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ReturnValue_t ExtendedControllerBase::initializeLocalDataPool(
|
|
||||||
localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
|
|
||||||
/* Needs to be overriden and implemented by child class. */
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
object_id_t ExtendedControllerBase::getObjectId() const {
|
object_id_t ExtendedControllerBase::getObjectId() const {
|
||||||
return SystemObject::getObjectId();
|
return SystemObject::getObjectId();
|
||||||
}
|
}
|
||||||
@ -107,14 +99,6 @@ MessageQueueId_t ExtendedControllerBase::getCommandQueue() const {
|
|||||||
return commandQueue->getId();
|
return commandQueue->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalPoolDataSetBase* ExtendedControllerBase::getDataSetHandle(sid_t sid) {
|
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
||||||
sif::warning << "ExtendedControllerBase::getDataSetHandle: No child "
|
|
||||||
<< " implementation provided, returning nullptr!" << std::endl;
|
|
||||||
#endif
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
LocalDataPoolManager* ExtendedControllerBase::getHkManagerHandle() {
|
LocalDataPoolManager* ExtendedControllerBase::getHkManagerHandle() {
|
||||||
return &poolManager;
|
return &poolManager;
|
||||||
}
|
}
|
||||||
|
@ -61,11 +61,11 @@ protected:
|
|||||||
/* HasLocalDatapoolIF overrides */
|
/* HasLocalDatapoolIF overrides */
|
||||||
virtual LocalDataPoolManager* getHkManagerHandle() override;
|
virtual LocalDataPoolManager* getHkManagerHandle() override;
|
||||||
virtual object_id_t getObjectId() const override;
|
virtual object_id_t getObjectId() const override;
|
||||||
virtual ReturnValue_t initializeLocalDataPool(
|
|
||||||
localpool::DataPool& localDataPoolMap,
|
|
||||||
LocalDataPoolManager& poolManager) override;
|
|
||||||
virtual uint32_t getPeriodicOperationFrequency() const override;
|
virtual uint32_t getPeriodicOperationFrequency() const override;
|
||||||
virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
|
|
||||||
|
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
LocalDataPoolManager& poolManager) override = 0;
|
||||||
|
virtual LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
PoolEntry<T>::PoolEntry(std::initializer_list<T> initValue, bool setValid ):
|
PoolEntry<T>::PoolEntry(std::initializer_list<T> initValue, bool setValid ):
|
||||||
length(initValue.size()), valid(setValid) {
|
length(static_cast<uint8_t>(initValue.size())), valid(setValid) {
|
||||||
this->address = new T[this->length];
|
this->address = new T[this->length];
|
||||||
if(initValue.size() == 0) {
|
if(initValue.size() == 0) {
|
||||||
std::memset(this->address, 0, this->getByteSize());
|
std::memset(this->address, 0, this->getByteSize());
|
||||||
|
@ -44,7 +44,7 @@ LocalPoolDataSetBase::LocalPoolDataSetBase(HasLocalDataPoolIF *hkOwner,
|
|||||||
|
|
||||||
LocalPoolDataSetBase::LocalPoolDataSetBase(sid_t sid, PoolVariableIF** registeredVariablesArray,
|
LocalPoolDataSetBase::LocalPoolDataSetBase(sid_t sid, PoolVariableIF** registeredVariablesArray,
|
||||||
const size_t maxNumberOfVariables):
|
const size_t maxNumberOfVariables):
|
||||||
PoolDataSetBase(registeredVariablesArray, maxNumberOfVariables) {
|
PoolDataSetBase(registeredVariablesArray, maxNumberOfVariables) {
|
||||||
HasLocalDataPoolIF* hkOwner = objectManager->get<HasLocalDataPoolIF>(
|
HasLocalDataPoolIF* hkOwner = objectManager->get<HasLocalDataPoolIF>(
|
||||||
sid.objectId);
|
sid.objectId);
|
||||||
if(hkOwner != nullptr) {
|
if(hkOwner != nullptr) {
|
||||||
@ -95,8 +95,17 @@ ReturnValue_t LocalPoolDataSetBase::serializeWithValidityBuffer(uint8_t **buffer
|
|||||||
size_t *size, size_t maxSize,
|
size_t *size, size_t maxSize,
|
||||||
SerializeIF::Endianness streamEndianness) const {
|
SerializeIF::Endianness streamEndianness) const {
|
||||||
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
|
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
|
||||||
uint8_t validityMaskSize = std::ceil(static_cast<float>(fillCount)/8.0);
|
const uint8_t validityMaskSize = std::ceil(static_cast<float>(fillCount)/8.0);
|
||||||
uint8_t validityMask[validityMaskSize] = {};
|
uint8_t* validityPtr = nullptr;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
/* Use a std::vector here because MSVC will (rightly) not create a fixed size array
|
||||||
|
with a non constant size specifier */
|
||||||
|
std::vector<uint8_t> validityMask(validityMaskSize);
|
||||||
|
validityPtr = validityMask.data();
|
||||||
|
#else
|
||||||
|
uint8_t validityMask[validityMaskSize];
|
||||||
|
validityPtr = validityMask;
|
||||||
|
#endif
|
||||||
uint8_t validBufferIndex = 0;
|
uint8_t validBufferIndex = 0;
|
||||||
uint8_t validBufferIndexBit = 0;
|
uint8_t validBufferIndexBit = 0;
|
||||||
for (uint16_t count = 0; count < fillCount; count++) {
|
for (uint16_t count = 0; count < fillCount; count++) {
|
||||||
@ -123,7 +132,7 @@ ReturnValue_t LocalPoolDataSetBase::serializeWithValidityBuffer(uint8_t **buffer
|
|||||||
return SerializeIF::BUFFER_TOO_SHORT;
|
return SerializeIF::BUFFER_TOO_SHORT;
|
||||||
}
|
}
|
||||||
// copy validity buffer to end
|
// copy validity buffer to end
|
||||||
std::memcpy(*buffer, validityMask, validityMaskSize);
|
std::memcpy(*buffer, validityPtr, validityMaskSize);
|
||||||
*size += validityMaskSize;
|
*size += validityMaskSize;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -262,11 +271,9 @@ bool LocalPoolDataSetBase::getReportingEnabled() const {
|
|||||||
return reportingEnabled;
|
return reportingEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalPoolDataSetBase::initializePeriodicHelper(
|
void LocalPoolDataSetBase::initializePeriodicHelper(float collectionInterval,
|
||||||
float collectionInterval, dur_millis_t minimumPeriodicInterval,
|
dur_millis_t minimumPeriodicInterval, uint8_t nonDiagIntervalFactor) {
|
||||||
bool isDiagnostics, uint8_t nonDiagIntervalFactor) {
|
periodicHelper->initialize(collectionInterval, minimumPeriodicInterval, nonDiagIntervalFactor);
|
||||||
periodicHelper->initialize(collectionInterval, minimumPeriodicInterval,
|
|
||||||
isDiagnostics, nonDiagIntervalFactor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalPoolDataSetBase::setChanged(bool changed) {
|
void LocalPoolDataSetBase::setChanged(bool changed) {
|
||||||
@ -306,3 +313,12 @@ void LocalPoolDataSetBase::setAllVariablesReadOnly() {
|
|||||||
registeredVariables[idx]->setReadWriteMode(pool_rwm_t::VAR_READ);
|
registeredVariables[idx]->setReadWriteMode(pool_rwm_t::VAR_READ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float LocalPoolDataSetBase::getCollectionInterval() const {
|
||||||
|
if(periodicHelper != nullptr) {
|
||||||
|
return periodicHelper->getCollectionIntervalInSeconds();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -166,6 +166,16 @@ public:
|
|||||||
|
|
||||||
object_id_t getCreatorObjectId();
|
object_id_t getCreatorObjectId();
|
||||||
|
|
||||||
|
bool getReportingEnabled() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current periodic HK generation interval this set
|
||||||
|
* belongs to a HK manager and the interval is not 0. Otherwise,
|
||||||
|
* returns 0.0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
float getCollectionInterval() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
sid_t sid;
|
sid_t sid;
|
||||||
//! This mutex is used if the data is created by one object only.
|
//! This mutex is used if the data is created by one object only.
|
||||||
@ -180,11 +190,9 @@ protected:
|
|||||||
*/
|
*/
|
||||||
bool reportingEnabled = false;
|
bool reportingEnabled = false;
|
||||||
void setReportingEnabled(bool enabled);
|
void setReportingEnabled(bool enabled);
|
||||||
bool getReportingEnabled() const;
|
|
||||||
|
|
||||||
void initializePeriodicHelper(float collectionInterval,
|
void initializePeriodicHelper(float collectionInterval, dur_millis_t minimumPeriodicInterval,
|
||||||
dur_millis_t minimumPeriodicInterval,
|
uint8_t nonDiagIntervalFactor = 5);
|
||||||
bool isDiagnostics, uint8_t nonDiagIntervalFactor = 5);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the valid state of a dataset is always relevant to the whole
|
* If the valid state of a dataset is always relevant to the whole
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#include "../../tasks/SemaphoreFactory.h"
|
#include "../../tasks/SemaphoreFactory.h"
|
||||||
#include "../../osal/linux/BinarySemaphore.h"
|
#include "../../serviceinterface/ServiceInterface.h"
|
||||||
#include "../../osal/linux/CountingSemaphore.h"
|
|
||||||
#include "../../serviceinterface/ServiceInterfaceStream.h"
|
|
||||||
|
|
||||||
SemaphoreFactory* SemaphoreFactory::factoryInstance = nullptr;
|
SemaphoreFactory* SemaphoreFactory::factoryInstance = nullptr;
|
||||||
|
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
|
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#include <BaseTsd.h>
|
||||||
|
typedef SSIZE_T ssize_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
TcWinUdpPollingTask::TcWinUdpPollingTask(object_id_t objectId,
|
TcWinUdpPollingTask::TcWinUdpPollingTask(object_id_t objectId,
|
||||||
object_id_t tmtcUnixUdpBridge, size_t frameSize,
|
object_id_t tmtcUnixUdpBridge, size_t frameSize,
|
||||||
|
@ -23,7 +23,7 @@ class TcWinUdpPollingTask: public SystemObject,
|
|||||||
public:
|
public:
|
||||||
static constexpr size_t DEFAULT_MAX_FRAME_SIZE = 2048;
|
static constexpr size_t DEFAULT_MAX_FRAME_SIZE = 2048;
|
||||||
//! 0.5 default milliseconds timeout for now.
|
//! 0.5 default milliseconds timeout for now.
|
||||||
static constexpr timeval DEFAULT_TIMEOUT = {.tv_sec = 0, .tv_usec = 500};
|
static constexpr timeval DEFAULT_TIMEOUT = {0, 500};
|
||||||
|
|
||||||
TcWinUdpPollingTask(object_id_t objectId, object_id_t tmtcUnixUdpBridge,
|
TcWinUdpPollingTask(object_id_t objectId, object_id_t tmtcUnixUdpBridge,
|
||||||
size_t frameSize = 0, double timeoutSeconds = -1);
|
size_t frameSize = 0, double timeoutSeconds = -1);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "PowerComponent.h"
|
#include "PowerComponent.h"
|
||||||
#include "../serialize/SerializeAdapter.h"
|
#include "../serialize/SerializeAdapter.h"
|
||||||
|
|
||||||
|
|
||||||
PowerComponent::PowerComponent(): switchId1(0xFF), switchId2(0xFF),
|
PowerComponent::PowerComponent(): switchId1(0xFF), switchId2(0xFF),
|
||||||
doIHaveTwoSwitches(false) {
|
doIHaveTwoSwitches(false) {
|
||||||
}
|
}
|
||||||
@ -8,23 +9,23 @@ PowerComponent::PowerComponent(): switchId1(0xFF), switchId2(0xFF),
|
|||||||
PowerComponent::PowerComponent(object_id_t setId, uint8_t moduleId, float min,
|
PowerComponent::PowerComponent(object_id_t setId, uint8_t moduleId, float min,
|
||||||
float max, uint8_t switchId1, bool twoSwitches, uint8_t switchId2) :
|
float max, uint8_t switchId1, bool twoSwitches, uint8_t switchId2) :
|
||||||
deviceObjectId(setId), switchId1(switchId1), switchId2(switchId2),
|
deviceObjectId(setId), switchId1(switchId1), switchId2(switchId2),
|
||||||
doIHaveTwoSwitches(twoSwitches), min(min), max(max),
|
doIHaveTwoSwitches(twoSwitches), minPower(min), maxPower(max),
|
||||||
moduleId(moduleId) {
|
moduleId(moduleId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t PowerComponent::serialize(uint8_t** buffer, size_t* size,
|
ReturnValue_t PowerComponent::serialize(uint8_t** buffer, size_t* size,
|
||||||
size_t maxSize, Endianness streamEndianness) const {
|
size_t maxSize, Endianness streamEndianness) const {
|
||||||
ReturnValue_t result = SerializeAdapter::serialize(&min, buffer,
|
ReturnValue_t result = SerializeAdapter::serialize(&minPower, buffer,
|
||||||
size, maxSize, streamEndianness);
|
size, maxSize, streamEndianness);
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return SerializeAdapter::serialize(&max, buffer, size, maxSize,
|
return SerializeAdapter::serialize(&maxPower, buffer, size, maxSize,
|
||||||
streamEndianness);
|
streamEndianness);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t PowerComponent::getSerializedSize() const {
|
size_t PowerComponent::getSerializedSize() const {
|
||||||
return sizeof(min) + sizeof(max);
|
return sizeof(minPower) + sizeof(maxPower);
|
||||||
}
|
}
|
||||||
|
|
||||||
object_id_t PowerComponent::getDeviceObjectId() {
|
object_id_t PowerComponent::getDeviceObjectId() {
|
||||||
@ -44,21 +45,21 @@ bool PowerComponent::hasTwoSwitches() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float PowerComponent::getMin() {
|
float PowerComponent::getMin() {
|
||||||
return min;
|
return minPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
float PowerComponent::getMax() {
|
float PowerComponent::getMax() {
|
||||||
return max;
|
return maxPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t PowerComponent::deSerialize(const uint8_t** buffer, size_t* size,
|
ReturnValue_t PowerComponent::deSerialize(const uint8_t** buffer, size_t* size,
|
||||||
Endianness streamEndianness) {
|
Endianness streamEndianness) {
|
||||||
ReturnValue_t result = SerializeAdapter::deSerialize(&min, buffer,
|
ReturnValue_t result = SerializeAdapter::deSerialize(&minPower, buffer,
|
||||||
size, streamEndianness);
|
size, streamEndianness);
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
return SerializeAdapter::deSerialize(&max, buffer, size, streamEndianness);
|
return SerializeAdapter::deSerialize(&maxPower, buffer, size, streamEndianness);
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t PowerComponent::getParameter(uint8_t domainId, uint8_t uniqueId,
|
ReturnValue_t PowerComponent::getParameter(uint8_t domainId, uint8_t uniqueId,
|
||||||
@ -69,10 +70,10 @@ ReturnValue_t PowerComponent::getParameter(uint8_t domainId, uint8_t uniqueId,
|
|||||||
}
|
}
|
||||||
switch (uniqueId) {
|
switch (uniqueId) {
|
||||||
case 0:
|
case 0:
|
||||||
parameterWrapper->set<>(min);
|
parameterWrapper->set<>(minPower);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
parameterWrapper->set<>(max);
|
parameterWrapper->set<>(maxPower);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return INVALID_IDENTIFIER_ID;
|
return INVALID_IDENTIFIER_ID;
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
class PowerComponent: public PowerComponentIF {
|
class PowerComponent: public PowerComponentIF {
|
||||||
public:
|
public:
|
||||||
PowerComponent(object_id_t setId, uint8_t moduleId, float min, float max,
|
PowerComponent(object_id_t setId, uint8_t moduleId, float minPower, float maxPower,
|
||||||
uint8_t switchId1, bool twoSwitches = false,
|
uint8_t switchId1, bool twoSwitches = false,
|
||||||
uint8_t switchId2 = 0xFF);
|
uint8_t switchId2 = 0xFF);
|
||||||
|
|
||||||
@ -41,8 +41,8 @@ private:
|
|||||||
|
|
||||||
const bool doIHaveTwoSwitches;
|
const bool doIHaveTwoSwitches;
|
||||||
|
|
||||||
float min = 0.0;
|
float minPower = 0.0;
|
||||||
float max = 0.0;
|
float maxPower = 0.0;
|
||||||
|
|
||||||
uint8_t moduleId = 0;
|
uint8_t moduleId = 0;
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ ReturnValue_t Service3Housekeeping::prepareCollectionIntervalModificationCommand
|
|||||||
CommandMessage *command, object_id_t objectId, bool isDiagnostics,
|
CommandMessage *command, object_id_t objectId, bool isDiagnostics,
|
||||||
const uint8_t *tcData, size_t tcDataLen) {
|
const uint8_t *tcData, size_t tcDataLen) {
|
||||||
if(tcDataLen < sizeof(sid_t) + sizeof(float)) {
|
if(tcDataLen < sizeof(sid_t) + sizeof(float)) {
|
||||||
// SID plus the size of the new collection intervL.
|
/* SID plus the size of the new collection interval. */
|
||||||
return CommandingServiceBase::INVALID_TC;
|
return CommandingServiceBase::INVALID_TC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user