2022-03-10 10:54:27 +01:00
|
|
|
#ifndef MISSION_SYSTEM_DUALLANEASSEMBLYBASE_H_
|
|
|
|
#define MISSION_SYSTEM_DUALLANEASSEMBLYBASE_H_
|
|
|
|
|
|
|
|
#include <fsfw/devicehandlers/AssemblyBase.h>
|
|
|
|
#include <mission/system/DualLanePowerStateMachine.h>
|
|
|
|
|
2022-03-10 11:05:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Encapsulates assemblies which are also responsible for dual lane power switching
|
|
|
|
* @details
|
|
|
|
* This is the base class for both the ACS board and the SUS board. Both boards have redundant
|
|
|
|
* power lanes and are required for the majority of satellite modes. Therefore, there is a lot
|
|
|
|
* of common code, for example the power switching.
|
|
|
|
*/
|
2022-03-10 10:54:27 +01:00
|
|
|
class DualLaneAssemblyBase : public AssemblyBase {
|
|
|
|
public:
|
|
|
|
static constexpr uint8_t TRANSITION_OTHER_SIDE_FAILED_ID = 0;
|
|
|
|
static constexpr uint8_t NOT_ENOUGH_DEVICES_DUAL_MODE_ID = 1;
|
|
|
|
static constexpr uint8_t POWER_STATE_MACHINE_TIMEOUT_ID = 2;
|
|
|
|
|
|
|
|
DualLaneAssemblyBase(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher,
|
|
|
|
pcduSwitches::Switches switch1, pcduSwitches::Switches switch2,
|
|
|
|
Event pwrSwitchTimeoutEvent);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
// This helper object complete encapsulates power switching
|
|
|
|
DualLanePowerStateMachine pwrStateMachine;
|
|
|
|
Event pwrTimeoutEvent;
|
|
|
|
uint8_t powerRetryCounter = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check whether it makes sense to send mode commands to the device
|
|
|
|
* @param object
|
|
|
|
* @param mode
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
bool isUseable(object_id_t object, Mode_t mode);
|
|
|
|
/**
|
|
|
|
* Thin wrapper function which is required because the helper class
|
|
|
|
* can not access protected member functions.
|
|
|
|
* @param mode
|
|
|
|
* @param submode
|
|
|
|
*/
|
|
|
|
virtual ReturnValue_t pwrStateMachineWrapper();
|
2022-03-10 11:02:07 +01:00
|
|
|
virtual ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override;
|
|
|
|
virtual void performChildOperation() override;
|
|
|
|
virtual void startTransition(Mode_t mode, Submode_t submode) override;
|
2022-03-10 10:54:27 +01:00
|
|
|
virtual void handleModeReached();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implemented by user. Will be called if a full mode operation has finished.
|
|
|
|
* This includes both the regular mode state machine operations and the power state machine
|
|
|
|
* operations
|
|
|
|
*/
|
|
|
|
virtual void finishModeOp() = 0;
|
|
|
|
|
|
|
|
template <size_t MAX_SIZE>
|
|
|
|
void initModeTableEntry(object_id_t id, ModeListEntry& entry,
|
|
|
|
FixedArrayList<ModeListEntry, MAX_SIZE>& modeTable);
|
|
|
|
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
|
|
|
|
template <size_t MAX_SIZE>
|
|
|
|
inline void DualLaneAssemblyBase::initModeTableEntry(
|
|
|
|
object_id_t id, ModeListEntry& entry, FixedArrayList<ModeListEntry, MAX_SIZE>& modeTable) {
|
|
|
|
entry.setObject(id);
|
|
|
|
entry.setMode(MODE_OFF);
|
|
|
|
entry.setSubmode(SUBMODE_NONE);
|
|
|
|
entry.setInheritSubmode(false);
|
|
|
|
modeTable.insert(entry);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* MISSION_SYSTEM_DUALLANEASSEMBLYBASE_H_ */
|