#ifndef MISSION_SYSTEM_ACSBOARDASSEMBLY_H_ #define MISSION_SYSTEM_ACSBOARDASSEMBLY_H_ #include #include struct AcsBoardHelper { AcsBoardHelper(object_id_t mgm0Id, object_id_t mgm1Id, object_id_t mgm2Id, object_id_t mgm3Id, object_id_t gyro0Id, object_id_t gyro1Id, object_id_t gyro2Id, object_id_t gyro3Id, object_id_t gpsId) : mgm0Lis3IdSideA(mgm0Id), mgm1Rm3100IdSideA(mgm1Id), mgm2Lis3IdSideB(mgm2Id), mgm3Rm3100IdSideB(mgm3Id), gyro0AdisIdSideA(gyro0Id), gyro1L3gIdSideA(gyro1Id), gyro2AdisIdSideB(gyro2Id), gyro3L3gIdSideB(gyro3Id) {} object_id_t mgm0Lis3IdSideA = objects::NO_OBJECT; object_id_t mgm1Rm3100IdSideA = objects::NO_OBJECT; object_id_t mgm2Lis3IdSideB = objects::NO_OBJECT; object_id_t mgm3Rm3100IdSideB = objects::NO_OBJECT; object_id_t gyro0AdisIdSideA = objects::NO_OBJECT; object_id_t gyro1L3gIdSideA = objects::NO_OBJECT; object_id_t gyro2AdisIdSideB = objects::NO_OBJECT; object_id_t gyro3L3gIdSideB = objects::NO_OBJECT; object_id_t gpsId = objects::NO_OBJECT; Mode_t gyro0SideAMode = HasModesIF::MODE_OFF; Mode_t gyro1SideAMode = HasModesIF::MODE_OFF; Mode_t gyro2SideBMode = HasModesIF::MODE_OFF; Mode_t gyro3SideBMode = HasModesIF::MODE_OFF; Mode_t mgm0SideAMode = HasModesIF::MODE_OFF; Mode_t mgm1SideAMode = HasModesIF::MODE_OFF; Mode_t mgm2SideBMode = HasModesIF::MODE_OFF; Mode_t mgm3SideBMode = HasModesIF::MODE_OFF; Mode_t gpsMode = HasModesIF::MODE_OFF; }; enum ModeTableIdx : uint8_t { MGM_0_A = 0, MGM_1_A = 1, MGM_2_B = 2, MGM_3_B = 3, GYRO_0_A = 4, GYRO_1_A = 5, GYRO_2_B = 6, GYRO_3_B = 7, GPS = 8 }; static constexpr uint8_t NUMBER_DEVICES_MODE_TABLE = 9; class PowerSwitchIF; class AcsBoardAssembly : public AssemblyBase { public: AcsBoardAssembly(object_id_t objectId, object_id_t parentId, PowerSwitchIF* switcher, AcsBoardHelper helper); private: enum class States { IDLE, SWITCHING_POWER, MODE_COMMANDING }; States state = States::IDLE; Mode_t currentMode = MODE_OFF; Submode_t currentSubmode = A_SIDE; PowerSwitchIF* switcher = nullptr; AcsBoardHelper helper; void initModeTableEntry(object_id_t id, ModeListEntry& entry); ReturnValue_t initialize() override; FixedArrayList modeTable; static constexpr Submode_t A_SIDE = 0; static constexpr Submode_t B_SIDE = 1; static constexpr Submode_t DUAL_MODE = 2; // AssemblyBase overrides ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override; ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override; ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override; /** * 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); ReturnValue_t handleNormalModeCmd(Submode_t submode); void powerStateMachine(Submode_t submode); }; #endif /* MISSION_SYSTEM_ACSBOARDASSEMBLY_H_ */