2021-07-13 20:22:54 +02:00
|
|
|
#include "fsfw/power/PowerSensor.h"
|
2020-12-03 18:29:28 +01:00
|
|
|
|
2021-07-13 20:22:54 +02:00
|
|
|
#include "fsfw/ipc/QueueFactory.h"
|
2018-07-12 16:29:32 +02:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
PowerSensor::PowerSensor(object_id_t objectId, sid_t setId, VariableIds ids, DefaultLimits limits,
|
|
|
|
SensorEvents events, uint16_t confirmationCount)
|
|
|
|
: SystemObject(objectId),
|
|
|
|
parameterHelper(this),
|
|
|
|
healthHelper(this, objectId),
|
|
|
|
powerSensorSet(setId),
|
|
|
|
current(ids.pidCurrent, &powerSensorSet),
|
|
|
|
voltage(ids.pidVoltage, &powerSensorSet),
|
|
|
|
power(ids.poolIdPower, &powerSensorSet, PoolVariableIF::VAR_WRITE),
|
|
|
|
currentLimit(objectId, MODULE_ID_CURRENT, ids.pidCurrent, confirmationCount,
|
|
|
|
limits.currentMin, limits.currentMax, events.currentLow, events.currentHigh),
|
|
|
|
voltageLimit(objectId, MODULE_ID_VOLTAGE, ids.pidVoltage, confirmationCount,
|
|
|
|
limits.voltageMin, limits.voltageMax, events.voltageLow, events.voltageHigh) {
|
2022-02-19 16:14:02 +01:00
|
|
|
auto mqArgs = MqArgs(objectId, static_cast<void*>(this));
|
|
|
|
commandQueue = QueueFactory::instance()->createMessageQueue(3, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs);
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
PowerSensor::~PowerSensor() { QueueFactory::instance()->deleteMessageQueue(commandQueue); }
|
2018-07-12 16:29:32 +02:00
|
|
|
|
|
|
|
ReturnValue_t PowerSensor::calculatePower() {
|
2022-02-02 10:29:30 +01:00
|
|
|
powerSensorSet.read();
|
|
|
|
ReturnValue_t result1 = HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
ReturnValue_t result2 = HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
if (healthHelper.healthTable->isHealthy(getObjectId()) && voltage.isValid() &&
|
|
|
|
current.isValid()) {
|
|
|
|
result1 = voltageLimit.doCheck(voltage.value);
|
|
|
|
result2 = currentLimit.doCheck(current.value);
|
|
|
|
} else {
|
|
|
|
voltageLimit.setToInvalid();
|
|
|
|
currentLimit.setToInvalid();
|
|
|
|
result1 = OBJECT_NOT_HEALTHY;
|
|
|
|
}
|
|
|
|
if (result1 != HasReturnvaluesIF::RETURN_OK || result2 != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
result1 = MonitoringIF::INVALID;
|
|
|
|
power.setValid(PoolVariableIF::INVALID);
|
|
|
|
} else {
|
|
|
|
power.setValid(PoolVariableIF::VALID);
|
|
|
|
power.value = current.value * voltage.value;
|
|
|
|
}
|
|
|
|
powerSensorSet.commit();
|
|
|
|
return result1;
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t PowerSensor::performOperation(uint8_t opCode) {
|
2022-02-02 10:29:30 +01:00
|
|
|
checkCommandQueue();
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
MessageQueueId_t PowerSensor::getCommandQueue() const { return commandQueue->getId(); }
|
2018-07-12 16:29:32 +02:00
|
|
|
|
|
|
|
ReturnValue_t PowerSensor::initialize() {
|
2022-02-02 10:29:30 +01:00
|
|
|
ReturnValue_t result = SystemObject::initialize();
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = healthHelper.initialize();
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = parameterHelper.initialize();
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
return result;
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void PowerSensor::setAllMonitorsToUnchecked() {
|
2022-02-02 10:29:30 +01:00
|
|
|
currentLimit.setToUnchecked();
|
|
|
|
voltageLimit.setToUnchecked();
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void PowerSensor::checkCommandQueue() {
|
2022-02-02 10:29:30 +01:00
|
|
|
CommandMessage command;
|
|
|
|
ReturnValue_t result = commandQueue->receiveMessage(&command);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
result = healthHelper.handleHealthCommand(&command);
|
|
|
|
if (result == HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
result = parameterHelper.handleParameterMessage(&command);
|
|
|
|
if (result == HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
command.setToUnknownCommand();
|
|
|
|
commandQueue->reply(&command);
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void PowerSensor::setDataPoolEntriesInvalid() {
|
2022-02-02 10:29:30 +01:00
|
|
|
powerSensorSet.read();
|
|
|
|
powerSensorSet.setValidity(false, true);
|
|
|
|
powerSensorSet.commit();
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
float PowerSensor::getPower() {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (power.isValid()) {
|
|
|
|
return power.value;
|
|
|
|
} else {
|
|
|
|
return 0.0;
|
|
|
|
}
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t PowerSensor::setHealth(HealthState health) {
|
2022-02-02 10:29:30 +01:00
|
|
|
healthHelper.setHealth(health);
|
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
HasHealthIF::HealthState PowerSensor::getHealth() { return healthHelper.getHealth(); }
|
2018-07-12 16:29:32 +02:00
|
|
|
|
2021-01-29 22:45:53 +01:00
|
|
|
ReturnValue_t PowerSensor::getParameter(uint8_t domainId, uint8_t uniqueId,
|
2022-02-02 10:29:30 +01:00
|
|
|
ParameterWrapper* parameterWrapper,
|
|
|
|
const ParameterWrapper* newValues, uint16_t startAtIndex) {
|
|
|
|
ReturnValue_t result =
|
|
|
|
currentLimit.getParameter(domainId, uniqueId, parameterWrapper, newValues, startAtIndex);
|
|
|
|
if (result != INVALID_DOMAIN_ID) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = voltageLimit.getParameter(domainId, uniqueId, parameterWrapper, newValues, startAtIndex);
|
|
|
|
return result;
|
2018-07-12 16:29:32 +02:00
|
|
|
}
|