Merge pull request 'add power switcher component' (#52) from mueller/power-switcher-component into eive/develop
Reviewed-on: eive/fsfw#52
This commit is contained in:
commit
7df51f7202
@ -4,4 +4,5 @@ target_sources(${LIB_FSFW_NAME} PRIVATE
|
|||||||
PowerSensor.cpp
|
PowerSensor.cpp
|
||||||
PowerSwitcher.cpp
|
PowerSwitcher.cpp
|
||||||
DummyPowerSwitcher.cpp
|
DummyPowerSwitcher.cpp
|
||||||
|
PowerSwitcherComponent.cpp
|
||||||
)
|
)
|
108
src/fsfw/power/PowerSwitcherComponent.cpp
Normal file
108
src/fsfw/power/PowerSwitcherComponent.cpp
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
#include "PowerSwitcherComponent.h"
|
||||||
|
|
||||||
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
|
#include <fsfw/power/PowerSwitchIF.h>
|
||||||
|
|
||||||
|
PowerSwitcherComponent::PowerSwitcherComponent(object_id_t objectId, PowerSwitchIF* pwrSwitcher, power::Switch_t pwrSwitch)
|
||||||
|
: SystemObject(objectId), switcher(pwrSwitcher, pwrSwitch), modeHelper(this),
|
||||||
|
healthHelper(this, objectId) {
|
||||||
|
queue = QueueFactory::instance()->createMessageQueue();
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PowerSwitcherComponent::performOperation(uint8_t opCode) {
|
||||||
|
ReturnValue_t result;
|
||||||
|
CommandMessage command;
|
||||||
|
|
||||||
|
for (result = queue->receiveMessage(&command); result == RETURN_OK;
|
||||||
|
result = queue->receiveMessage(&command)) {
|
||||||
|
result = healthHelper.handleHealthCommand(&command);
|
||||||
|
if (result == RETURN_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = modeHelper.handleModeCommand(&command);
|
||||||
|
if (result == RETURN_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(switcher.active()) {
|
||||||
|
switcher.doStateMachine();
|
||||||
|
auto currState = switcher.getState();
|
||||||
|
if (currState == PowerSwitcher::SWITCH_IS_OFF) {
|
||||||
|
setMode(MODE_OFF, 0);
|
||||||
|
} else if(currState == PowerSwitcher::SWITCH_IS_ON) {
|
||||||
|
setMode(MODE_ON, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PowerSwitcherComponent::initialize() {
|
||||||
|
ReturnValue_t result = modeHelper.initialize();
|
||||||
|
if(result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = healthHelper.initialize();
|
||||||
|
if(result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return SystemObject::initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageQueueId_t PowerSwitcherComponent::getCommandQueue() const {
|
||||||
|
return queue->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerSwitcherComponent::getMode(Mode_t *mode, Submode_t *submode) {
|
||||||
|
*mode = this->mode;
|
||||||
|
*submode = this->submode;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PowerSwitcherComponent::setHealth(HealthState health) {
|
||||||
|
healthHelper.setHealth(health);
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t PowerSwitcherComponent::checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
|
uint32_t *msToReachTheMode) {
|
||||||
|
*msToReachTheMode = 5000;
|
||||||
|
if(mode != MODE_ON and mode != MODE_OFF) {
|
||||||
|
return TRANS_NOT_ALLOWED;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerSwitcherComponent::startTransition(Mode_t mode, Submode_t submode) {
|
||||||
|
if(mode == MODE_OFF) {
|
||||||
|
switcher.turnOff(true);
|
||||||
|
switcher.doStateMachine();
|
||||||
|
if(switcher.getState() == PowerSwitcher::SWITCH_IS_OFF) {
|
||||||
|
setMode(MODE_OFF, 0);
|
||||||
|
}
|
||||||
|
} else if (mode == MODE_ON) {
|
||||||
|
switcher.turnOn(true);
|
||||||
|
switcher.doStateMachine();
|
||||||
|
if(switcher.getState() == PowerSwitcher::SWITCH_IS_ON) {
|
||||||
|
setMode(MODE_ON, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerSwitcherComponent::setToExternalControl() {
|
||||||
|
healthHelper.setHealth(HasHealthIF::EXTERNAL_CONTROL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerSwitcherComponent::announceMode(bool recursive) {
|
||||||
|
triggerEvent(MODE_INFO, mode, submode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerSwitcherComponent::setMode(Mode_t newMode, Submode_t newSubmode) {
|
||||||
|
this->mode = newMode;
|
||||||
|
this->submode = newSubmode;
|
||||||
|
modeHelper.modeChanged(mode, submode);
|
||||||
|
announceMode(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
HasHealthIF::HealthState PowerSwitcherComponent::getHealth() {
|
||||||
|
return healthHelper.getHealth();
|
||||||
|
}
|
64
src/fsfw/power/PowerSwitcherComponent.h
Normal file
64
src/fsfw/power/PowerSwitcherComponent.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#ifndef _FSFW_POWER_POWERSWITCHERCOMPONENT_H_
|
||||||
|
#define _FSFW_POWER_POWERSWITCHERCOMPONENT_H_
|
||||||
|
|
||||||
|
#include <fsfw/health/HasHealthIF.h>
|
||||||
|
#include <fsfw/health/HealthHelper.h>
|
||||||
|
#include <fsfw/modes/HasModesIF.h>
|
||||||
|
#include <fsfw/modes/ModeHelper.h>
|
||||||
|
#include <fsfw/objectmanager/SystemObject.h>
|
||||||
|
#include <fsfw/power/definitions.h>
|
||||||
|
#include <fsfw/power/PowerSwitcher.h>
|
||||||
|
#include <fsfw/tasks/ExecutableObjectIF.h>
|
||||||
|
|
||||||
|
class PowerSwitchIF;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allows to create an power switch object with its own mode and health
|
||||||
|
* @details
|
||||||
|
* This basic component allows to create an object which is solely responsible for managing a
|
||||||
|
* switch. It also has a mode and a health by implementing the respective interface components
|
||||||
|
* which allows integrating this component into a system mode tree.
|
||||||
|
*
|
||||||
|
* Commanding this component to MODE_OFF will cause the switcher to turn the switch off while
|
||||||
|
* commanding in to MODE_ON will cause the switcher to turn the switch on.
|
||||||
|
*/
|
||||||
|
class PowerSwitcherComponent:
|
||||||
|
public SystemObject,
|
||||||
|
public HasReturnvaluesIF,
|
||||||
|
public ExecutableObjectIF,
|
||||||
|
public HasModesIF,
|
||||||
|
public HasHealthIF {
|
||||||
|
public:
|
||||||
|
PowerSwitcherComponent(object_id_t objectId, PowerSwitchIF* pwrSwitcher,
|
||||||
|
power::Switch_t pwrSwitch);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
MessageQueueIF* queue = nullptr;
|
||||||
|
PowerSwitcher switcher;
|
||||||
|
|
||||||
|
Mode_t mode = MODE_OFF;
|
||||||
|
Submode_t submode = 0;
|
||||||
|
|
||||||
|
ModeHelper modeHelper;
|
||||||
|
HealthHelper healthHelper;
|
||||||
|
|
||||||
|
void setMode(Mode_t newMode, Submode_t newSubmode);
|
||||||
|
|
||||||
|
virtual ReturnValue_t performOperation(uint8_t opCode) override;
|
||||||
|
|
||||||
|
ReturnValue_t initialize() override;
|
||||||
|
|
||||||
|
MessageQueueId_t getCommandQueue() const override;
|
||||||
|
void getMode(Mode_t *mode, Submode_t *submode) override;
|
||||||
|
ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
|
uint32_t *msToReachTheMode) override;
|
||||||
|
void startTransition(Mode_t mode, Submode_t submode) override;
|
||||||
|
void setToExternalControl() override;
|
||||||
|
void announceMode(bool recursive) override;
|
||||||
|
|
||||||
|
ReturnValue_t setHealth(HealthState health) override;
|
||||||
|
HasHealthIF::HealthState getHealth() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _FSFW_POWER_POWERSWITCHERCOMPONENT_H_ */
|
Loading…
Reference in New Issue
Block a user