Merge remote-tracking branch 'origin/develop' into add_heater_info_set
Some checks failed
EIVE/eive-obsw/pipeline/pr-develop There was a failure building this commit
Some checks failed
EIVE/eive-obsw/pipeline/pr-develop There was a failure building this commit
This commit is contained in:
@ -8,3 +8,5 @@ add_subdirectory(system)
|
||||
add_subdirectory(csp)
|
||||
add_subdirectory(cfdp)
|
||||
add_subdirectory(config)
|
||||
|
||||
target_sources(${LIB_EIVE_MISSION} PRIVATE acsDefs.cpp)
|
||||
|
40
mission/acsDefs.cpp
Normal file
40
mission/acsDefs.cpp
Normal file
@ -0,0 +1,40 @@
|
||||
#include "acsDefs.h"
|
||||
|
||||
const char* acs::getModeStr(AcsMode mode) {
|
||||
static const char* modeStr = "UNKNOWN";
|
||||
switch (mode) {
|
||||
case (acs::AcsMode::OFF): {
|
||||
modeStr = "OFF";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::SAFE): {
|
||||
modeStr = "SAFE";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::DETUMBLE): {
|
||||
modeStr = "DETUBMLE";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_NADIR): {
|
||||
modeStr = "POITNING NADIR";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_IDLE): {
|
||||
modeStr = "POINTING IDLE";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_INERTIAL): {
|
||||
modeStr = "POINTING INERTIAL";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_TARGET): {
|
||||
modeStr = "POINTING TARGET";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_TARGET_GS): {
|
||||
modeStr = "POINTING TARGET GS";
|
||||
break;
|
||||
}
|
||||
}
|
||||
return modeStr;
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
namespace acs {
|
||||
|
||||
// These modes are the submodes of the ACS controller and the modes of the ACS subsystem.
|
||||
enum AcsMode {
|
||||
enum AcsMode : Mode_t {
|
||||
OFF = HasModesIF::MODE_OFF,
|
||||
SAFE = 10,
|
||||
DETUMBLE = 11,
|
||||
@ -24,6 +24,8 @@ static const Event SAFE_RATE_VIOLATION = MAKE_EVENT(0, severity::MEDIUM);
|
||||
//!< The system has recovered from a safe rate rotation violation.
|
||||
static constexpr Event SAFE_RATE_RECOVERY = MAKE_EVENT(1, severity::MEDIUM);
|
||||
|
||||
extern const char* getModeStr(AcsMode mode);
|
||||
|
||||
} // namespace acs
|
||||
|
||||
#endif /* MISSION_ACSDEFS_H_ */
|
||||
|
@ -566,9 +566,24 @@ ReturnValue_t AcsController::checkModeCommand(Mode_t mode, Submode_t submode,
|
||||
return INVALID_MODE;
|
||||
}
|
||||
|
||||
void AcsController::modeChanged(Mode_t mode, Submode_t submode) {}
|
||||
void AcsController::modeChanged(Mode_t mode, Submode_t submode) {
|
||||
return ExtendedControllerBase::modeChanged(mode, submode);
|
||||
}
|
||||
|
||||
void AcsController::announceMode(bool recursive) {}
|
||||
void AcsController::announceMode(bool recursive) {
|
||||
const char *modeStr = "UNKNOWN";
|
||||
if (mode == HasModesIF::MODE_OFF) {
|
||||
modeStr = "OFF";
|
||||
} else if (mode == HasModesIF::MODE_ON) {
|
||||
modeStr = "ON";
|
||||
} else if (mode == DeviceHandlerIF::MODE_NORMAL) {
|
||||
modeStr = "NORMAL";
|
||||
}
|
||||
const char *submodeStr = acs::getModeStr(static_cast<acs::AcsMode>(submode));
|
||||
sif::info << "ACS controller is now in " << modeStr << " mode with " << submodeStr << " submode"
|
||||
<< std::endl;
|
||||
return ExtendedControllerBase::announceMode(recursive);
|
||||
}
|
||||
|
||||
void AcsController::copyMgmData() {
|
||||
ACS::SensorValues sensorValues;
|
||||
|
@ -122,30 +122,7 @@ void ThermalController::performControlOperation() {
|
||||
}
|
||||
}
|
||||
|
||||
ctrlCameraBody();
|
||||
ctrlAcsBoard();
|
||||
ctrlMgt();
|
||||
ctrlRw();
|
||||
ctrlStr();
|
||||
ctrlIfBoard();
|
||||
ctrlAcsBoard();
|
||||
ctrlObc();
|
||||
ctrlObcIfBoard();
|
||||
ctrlSBandTransceiver();
|
||||
ctrlPcduP60Board();
|
||||
ctrlPcduAcu();
|
||||
ctrlPcduPdu();
|
||||
ctrlPlPcduBoard();
|
||||
ctrlPlocMissionBoard();
|
||||
ctrlPlocProcessingBoard();
|
||||
ctrlDac();
|
||||
|
||||
ctrlDro();
|
||||
ctrlX8();
|
||||
ctrlHpa();
|
||||
ctrlTx();
|
||||
ctrlMpa();
|
||||
ctrlScexBoard();
|
||||
// performThermalModuleCtrl();
|
||||
}
|
||||
|
||||
ReturnValue_t ThermalController::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||
@ -1355,6 +1332,33 @@ void ThermalController::ctrlHpa() {
|
||||
}
|
||||
}
|
||||
|
||||
void ThermalController::performThermalModuleCtrl() {
|
||||
ctrlCameraBody();
|
||||
ctrlAcsBoard();
|
||||
ctrlMgt();
|
||||
ctrlRw();
|
||||
ctrlStr();
|
||||
ctrlIfBoard();
|
||||
ctrlAcsBoard();
|
||||
ctrlObc();
|
||||
ctrlObcIfBoard();
|
||||
ctrlSBandTransceiver();
|
||||
ctrlPcduP60Board();
|
||||
ctrlPcduAcu();
|
||||
ctrlPcduPdu();
|
||||
ctrlPlPcduBoard();
|
||||
ctrlPlocMissionBoard();
|
||||
ctrlPlocProcessingBoard();
|
||||
ctrlDac();
|
||||
|
||||
ctrlDro();
|
||||
ctrlX8();
|
||||
ctrlHpa();
|
||||
ctrlTx();
|
||||
ctrlMpa();
|
||||
ctrlScexBoard();
|
||||
}
|
||||
|
||||
void ThermalController::ctrlScexBoard() {
|
||||
sensors[0].first = sensorTemperatures.sensor_scex.isValid();
|
||||
sensors[0].second = sensorTemperatures.sensor_scex.value;
|
||||
@ -1440,7 +1444,7 @@ void ThermalController::ctrlComponentTemperature(heater::Switchers switchNr,
|
||||
}
|
||||
|
||||
void ThermalController::resetSensorsArray() {
|
||||
//TODO: müssen auch andere Variablen resettet werden? senstemp?
|
||||
// TODO: müssen auch andere Variablen resettet werden? senstemp?
|
||||
for (auto& validValuePair : sensors) {
|
||||
validValuePair.first = false;
|
||||
validValuePair.second = INVALID_TEMPERATURE;
|
||||
|
@ -44,6 +44,7 @@ class ThermalController : public ExtendedControllerBase {
|
||||
ReturnValue_t initialize() override;
|
||||
|
||||
protected:
|
||||
void performThermalModuleCtrl();
|
||||
ReturnValue_t handleCommandMessage(CommandMessage* message) override;
|
||||
void performControlOperation() override;
|
||||
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <fsfw/cfdp/handler/CfdpHandler.h>
|
||||
#include <fsfw/cfdp/handler/RemoteConfigTableIF.h>
|
||||
#include <fsfw/controller/ControllerBase.h>
|
||||
#include <fsfw/controller/ExtendedControllerBase.h>
|
||||
#include <fsfw/events/EventManager.h>
|
||||
#include <fsfw/health/HealthTable.h>
|
||||
#include <fsfw/internalerror/InternalErrorReporter.h>
|
||||
@ -26,6 +27,10 @@
|
||||
#include <mission/controller/ThermalController.h>
|
||||
#include <mission/devices/HeaterHandler.h>
|
||||
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
|
||||
#include <mission/system/objects/AcsBoardAssembly.h>
|
||||
#include <mission/system/objects/RwAssembly.h>
|
||||
#include <mission/system/objects/SusAssembly.h>
|
||||
#include <mission/system/objects/TcsBoardAssembly.h>
|
||||
#include <mission/tmtc/CfdpTmFunnel.h>
|
||||
#include <mission/tmtc/PusTmFunnel.h>
|
||||
#include <mission/tmtc/TmFunnelHandler.h>
|
||||
@ -35,6 +40,8 @@
|
||||
#include "eive/definitions.h"
|
||||
#include "fsfw/pus/Service11TelecommandScheduling.h"
|
||||
#include "mission/cfdp/Config.h"
|
||||
#include "mission/system/objects/RwAssembly.h"
|
||||
#include "mission/system/tree/acsModeTree.h"
|
||||
#include "mission/system/tree/tcsModeTree.h"
|
||||
#include "objects/systemObjectList.h"
|
||||
#include "tmtc/pusIds.h"
|
||||
@ -94,7 +101,7 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_, PusTmFun
|
||||
}
|
||||
|
||||
{
|
||||
PoolManager::LocalPoolConfig poolCfg = {{400, 32}, {350, 64}, {200, 128},
|
||||
PoolManager::LocalPoolConfig poolCfg = {{400, 32}, {400, 64}, {250, 128},
|
||||
{150, 512}, {150, 1024}, {150, 2048}};
|
||||
tmStore = new PoolManager(objects::TM_STORE, poolCfg);
|
||||
}
|
||||
@ -175,6 +182,7 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_, PusTmFun
|
||||
|
||||
#if OBSW_ADD_CFDP_COMPONENTS == 1
|
||||
using namespace cfdp;
|
||||
|
||||
MessageQueueIF* cfdpMsgQueue = QueueFactory::instance()->createMessageQueue(32);
|
||||
CfdpDistribCfg distribCfg(objects::CFDP_DISTRIBUTOR, *tcStore, cfdpMsgQueue);
|
||||
new CfdpDistributor(distribCfg);
|
||||
@ -217,3 +225,68 @@ void ObjectFactory::createThermalController(HeaterHandler& heaterHandler) {
|
||||
auto* tcsCtrl = new ThermalController(objects::THERMAL_CONTROLLER, heaterHandler);
|
||||
tcsCtrl->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||
}
|
||||
void ObjectFactory::createRwAssy(PowerSwitchIF& pwrSwitcher, power::Switch_t theSwitch,
|
||||
std::array<DeviceHandlerBase*, 4> rws,
|
||||
std::array<object_id_t, 4> rwIds) {
|
||||
RwHelper rwHelper(rwIds);
|
||||
auto* rwAss = new RwAssembly(objects::RW_ASS, &pwrSwitcher, theSwitch, rwHelper);
|
||||
for (uint8_t idx = 0; idx < rwIds.size(); idx++) {
|
||||
ReturnValue_t result = rws[idx]->connectModeTreeParent(*rwAss);
|
||||
if (result != returnvalue::OK) {
|
||||
sif::error << "Connecting RW " << static_cast<int>(idx) << " to RW assembly failed"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
rwAss->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||
}
|
||||
|
||||
void ObjectFactory::createSusAssy(PowerSwitchIF& pwrSwitcher,
|
||||
std::array<DeviceHandlerBase*, 12> suses) {
|
||||
std::array<object_id_t, 12> susIds = {
|
||||
objects::SUS_0_N_LOC_XFYFZM_PT_XF, objects::SUS_1_N_LOC_XBYFZM_PT_XB,
|
||||
objects::SUS_2_N_LOC_XFYBZB_PT_YB, objects::SUS_3_N_LOC_XFYBZF_PT_YF,
|
||||
objects::SUS_4_N_LOC_XMYFZF_PT_ZF, objects::SUS_5_N_LOC_XFYMZB_PT_ZB,
|
||||
objects::SUS_6_R_LOC_XFYBZM_PT_XF, objects::SUS_7_R_LOC_XBYBZM_PT_XB,
|
||||
objects::SUS_8_R_LOC_XBYBZB_PT_YB, objects::SUS_9_R_LOC_XBYBZB_PT_YF,
|
||||
objects::SUS_10_N_LOC_XMYBZF_PT_ZF, objects::SUS_11_R_LOC_XBYMZB_PT_ZB};
|
||||
SusAssHelper susAssHelper = SusAssHelper(susIds);
|
||||
auto susAss = new SusAssembly(objects::SUS_BOARD_ASS, &pwrSwitcher, susAssHelper);
|
||||
for (auto& sus : suses) {
|
||||
if (sus != nullptr) {
|
||||
ReturnValue_t result = sus->connectModeTreeParent(*susAss);
|
||||
if (result != returnvalue::OK) {
|
||||
sif::error << "Connecting SUS " << sus->getObjectId() << " to SUS assembly failed"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
susAss->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||
}
|
||||
|
||||
void ObjectFactory::createAcsBoardAssy(PowerSwitchIF& pwrSwitcher,
|
||||
std::array<DeviceHandlerBase*, 8> assemblyDhbs,
|
||||
ExtendedControllerBase* gpsCtrl, GpioIF* gpioComIF) {
|
||||
AcsBoardHelper acsBoardHelper = AcsBoardHelper(
|
||||
objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER,
|
||||
objects::MGM_3_RM3100_HANDLER, objects::GYRO_0_ADIS_HANDLER, objects::GYRO_1_L3G_HANDLER,
|
||||
objects::GYRO_2_ADIS_HANDLER, objects::GYRO_3_L3G_HANDLER, objects::GPS_CONTROLLER);
|
||||
auto acsAss =
|
||||
new AcsBoardAssembly(objects::ACS_BOARD_ASS, &pwrSwitcher, acsBoardHelper, gpioComIF);
|
||||
for (auto& assChild : assemblyDhbs) {
|
||||
ReturnValue_t result = assChild->connectModeTreeParent(*acsAss);
|
||||
if (result != returnvalue::OK) {
|
||||
sif::error << "Connecting assembly for ACS board component " << assChild->getObjectId()
|
||||
<< " failed" << std::endl;
|
||||
}
|
||||
}
|
||||
gpsCtrl->connectModeTreeParent(*acsAss);
|
||||
acsAss->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||
}
|
||||
|
||||
TcsBoardAssembly* ObjectFactory::createTcsBoardAssy(PowerSwitchIF& pwrSwitcher) {
|
||||
TcsBoardHelper helper(RTD_INFOS);
|
||||
TcsBoardAssembly* tcsBoardAss = new TcsBoardAssembly(
|
||||
objects::TCS_BOARD_ASS, &pwrSwitcher, pcdu::Switches::PDU1_CH0_TCS_BOARD_3V3, helper);
|
||||
tcsBoardAss->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||
return tcsBoardAss;
|
||||
}
|
||||
|
@ -1,13 +1,38 @@
|
||||
#ifndef MISSION_CORE_GENERICFACTORY_H_
|
||||
#define MISSION_CORE_GENERICFACTORY_H_
|
||||
|
||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||
|
||||
#include "fsfw/objectmanager/SystemObjectIF.h"
|
||||
#include "fsfw/power/PowerSwitchIF.h"
|
||||
#include "fsfw_hal/common/gpio/GpioIF.h"
|
||||
#include "mission/devices/devicedefinitions/Max31865Definitions.h"
|
||||
|
||||
class HeaterHandler;
|
||||
class HealthTableIF;
|
||||
class PusTmFunnel;
|
||||
class CfdpTmFunnel;
|
||||
class ExtendedControllerBase;
|
||||
class TcsBoardAssembly;
|
||||
|
||||
const std::array<std::pair<object_id_t, std::string>, EiveMax31855::NUM_RTDS> RTD_INFOS = {{
|
||||
{objects::RTD_0_IC3_PLOC_HEATSPREADER, "RTD_0_PLOC_HSPD"},
|
||||
{objects::RTD_1_IC4_PLOC_MISSIONBOARD, "RTD_1_PLOC_MISSIONBRD"},
|
||||
{objects::RTD_2_IC5_4K_CAMERA, "RTD_2_4K_CAMERA"},
|
||||
{objects::RTD_3_IC6_DAC_HEATSPREADER, "RTD_3_DAC_HSPD"},
|
||||
{objects::RTD_4_IC7_STARTRACKER, "RTD_4_STARTRACKER"},
|
||||
{objects::RTD_5_IC8_RW1_MX_MY, "RTD_5_RW1_MX_MY"},
|
||||
{objects::RTD_6_IC9_DRO, "RTD_6_DRO"},
|
||||
{objects::RTD_7_IC10_SCEX, "RTD_7_SCEX"},
|
||||
{objects::RTD_8_IC11_X8, "RTD_8_X8"},
|
||||
{objects::RTD_9_IC12_HPA, "RTD_9_HPA"},
|
||||
{objects::RTD_10_IC13_PL_TX, "RTD_10_PL_TX,"},
|
||||
{objects::RTD_11_IC14_MPA, "RTD_11_MPA"},
|
||||
{objects::RTD_12_IC15_ACU, "RTD_12_ACU"},
|
||||
{objects::RTD_13_IC16_PLPCDU_HEATSPREADER, "RTD_13_PLPCDU_HSPD"},
|
||||
{objects::RTD_14_IC17_TCS_BOARD, "RTD_14_TCS_BOARD"},
|
||||
{objects::RTD_15_IC18_IMTQ, "RTD_15_IMTQ"},
|
||||
}};
|
||||
|
||||
namespace ObjectFactory {
|
||||
|
||||
@ -17,6 +42,13 @@ void createGenericHeaterComponents(GpioIF& gpioIF, PowerSwitchIF& pwrSwitcher,
|
||||
HeaterHandler*& heaterHandler);
|
||||
|
||||
void createThermalController(HeaterHandler& heaterHandler);
|
||||
void createRwAssy(PowerSwitchIF& pwrSwitcher, power::Switch_t theSwitch,
|
||||
std::array<DeviceHandlerBase*, 4> rws, std::array<object_id_t, 4> rwIds);
|
||||
void createSusAssy(PowerSwitchIF& pwrSwitcher, std::array<DeviceHandlerBase*, 12> suses);
|
||||
void createAcsBoardAssy(PowerSwitchIF& pwrSwitcher, std::array<DeviceHandlerBase*, 8> assemblyDhbs,
|
||||
ExtendedControllerBase* gpsCtrl, GpioIF* gpioComIF);
|
||||
TcsBoardAssembly* createTcsBoardAssy(PowerSwitchIF& pwrSwitcher);
|
||||
|
||||
} // namespace ObjectFactory
|
||||
|
||||
#endif /* MISSION_CORE_GENERICFACTORY_H_ */
|
||||
|
@ -707,7 +707,7 @@ ReturnValue_t ImtqHandler::initializeLocalDataPool(localpool::DataPool& localDat
|
||||
subdp::DiagnosticsHkPeriodicParams(calMtmMeasurementSet.getSid(), false, 10.0));
|
||||
poolManager.subscribeForDiagPeriodicPacket(
|
||||
subdp::DiagnosticsHkPeriodicParams(rawMtmMeasurementSet.getSid(), false, 10.0));
|
||||
return returnvalue::OK;
|
||||
return DeviceHandlerBase::initializeLocalDataPool(localDataPoolMap, poolManager);
|
||||
}
|
||||
|
||||
ReturnValue_t ImtqHandler::getSelfTestCommandId(DeviceCommandId_t* id) {
|
||||
|
@ -457,22 +457,7 @@ void PCDUHandler::checkAndUpdatePduSwitch(GOMSPACE::Pdu pdu, pcdu::Switches swit
|
||||
uint8_t setValue) {
|
||||
using namespace pcdu;
|
||||
if (switchStates[switchIdx] != setValue) {
|
||||
#if OBSW_INITIALIZE_SWITCHES == 1
|
||||
// This code initializes the switches to the default init switch states on every reboot.
|
||||
// This is not done by the PCDU unless it is power-cycled.
|
||||
if (((pdu == GOMSPACE::Pdu::PDU1) and firstSwitchInfoPdu1) or
|
||||
((pdu == GOMSPACE::Pdu::PDU2) and firstSwitchInfoPdu2)) {
|
||||
ReturnValue_t state = PowerSwitchIF::SWITCH_OFF;
|
||||
if (INIT_SWITCH_STATES[switchIdx] == ON) {
|
||||
state = PowerSwitchIF::SWITCH_ON;
|
||||
}
|
||||
sendSwitchCommand(switchIdx, state);
|
||||
} else {
|
||||
triggerEvent(power::SWITCH_HAS_CHANGED, setValue, switchIdx);
|
||||
}
|
||||
#else
|
||||
triggerEvent(power::SWITCH_HAS_CHANGED, setValue, switchIdx);
|
||||
#endif
|
||||
}
|
||||
switchStates[switchIdx] = setValue;
|
||||
}
|
||||
|
@ -81,3 +81,9 @@ void AcsSubsystem::handleEventMessages() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AcsSubsystem::announceMode(bool recursive) {
|
||||
const char* modeStr = acs::getModeStr(static_cast<acs::AcsMode>(mode));
|
||||
sif::info << "ACS subsystem is now in " << modeStr << " mode" << std::endl;
|
||||
return Subsystem::announceMode(recursive);
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ class AcsSubsystem : public Subsystem {
|
||||
private:
|
||||
ReturnValue_t initialize() override;
|
||||
void performChildOperation() override;
|
||||
void announceMode(bool recursive) override;
|
||||
|
||||
void handleEventMessages();
|
||||
|
||||
|
@ -4,6 +4,7 @@ target_sources(
|
||||
CamSwitcher.cpp
|
||||
AcsSubsystem.cpp
|
||||
ComSubsystem.cpp
|
||||
TcsSubsystem.cpp
|
||||
PayloadSubsystem.cpp
|
||||
AcsBoardAssembly.cpp
|
||||
Stack5VHandler.cpp
|
||||
|
@ -1,5 +1,43 @@
|
||||
#include "EiveSystem.h"
|
||||
|
||||
#include <mission/acsDefs.h>
|
||||
|
||||
EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences,
|
||||
uint32_t maxNumberOfTables)
|
||||
: Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables) {}
|
||||
|
||||
void EiveSystem::announceMode(bool recursive) {
|
||||
const char* modeStr = "UNKNOWN";
|
||||
switch (mode) {
|
||||
case (acs::AcsMode::OFF): {
|
||||
modeStr = "OFF";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::SAFE): {
|
||||
modeStr = "SAFE";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::DETUMBLE): {
|
||||
modeStr = "DETUBMLE";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_IDLE): {
|
||||
modeStr = "POINTING IDLE";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_INERTIAL): {
|
||||
modeStr = "POINTING INERTIAL";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_TARGET): {
|
||||
modeStr = "POINTING TARGET";
|
||||
break;
|
||||
}
|
||||
case (acs::AcsMode::PTG_TARGET_GS): {
|
||||
modeStr = "POINTING TARGET GS";
|
||||
break;
|
||||
}
|
||||
}
|
||||
sif::info << "EIVE system is now in " << modeStr << " mode" << std::endl;
|
||||
return Subsystem::announceMode(recursive);
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ class EiveSystem : public Subsystem {
|
||||
EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables);
|
||||
|
||||
private:
|
||||
void announceMode(bool recursive) override;
|
||||
};
|
||||
|
||||
#endif /* MISSION_SYSTEM_EIVESYSTEM_H_ */
|
||||
|
27
mission/system/objects/TcsSubsystem.cpp
Normal file
27
mission/system/objects/TcsSubsystem.cpp
Normal file
@ -0,0 +1,27 @@
|
||||
#include "TcsSubsystem.h"
|
||||
|
||||
#include "fsfw/devicehandlers/DeviceHandlerIF.h"
|
||||
|
||||
TcsSubsystem::TcsSubsystem(object_id_t objectId, uint32_t maxNumberOfSequences,
|
||||
uint32_t maxNumberOfTables)
|
||||
: Subsystem(objectId, maxNumberOfSequences, maxNumberOfTables) {}
|
||||
|
||||
void TcsSubsystem::announceMode(bool recursive) {
|
||||
const char* modeStr = "UNKNOWN";
|
||||
switch (mode) {
|
||||
case (HasModesIF::MODE_OFF): {
|
||||
modeStr = "OFF";
|
||||
break;
|
||||
}
|
||||
case (HasModesIF::MODE_ON): {
|
||||
modeStr = "ON";
|
||||
break;
|
||||
}
|
||||
case (DeviceHandlerIF::MODE_NORMAL): {
|
||||
modeStr = "NORMAL";
|
||||
break;
|
||||
}
|
||||
}
|
||||
sif::info << "TCS subsystem is now in " << modeStr << " mode" << std::endl;
|
||||
return Subsystem::announceMode(recursive);
|
||||
}
|
13
mission/system/objects/TcsSubsystem.h
Normal file
13
mission/system/objects/TcsSubsystem.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef MISSION_SYSTEM_OBJECTS_TCSSUBSYSTEM_H_
|
||||
#define MISSION_SYSTEM_OBJECTS_TCSSUBSYSTEM_H_
|
||||
#include <fsfw/subsystem/Subsystem.h>
|
||||
|
||||
class TcsSubsystem : public Subsystem {
|
||||
public:
|
||||
TcsSubsystem(object_id_t objectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables);
|
||||
|
||||
private:
|
||||
void announceMode(bool recursive) override;
|
||||
};
|
||||
|
||||
#endif /* MISSION_SYSTEM_OBJECTS_TCSSUBSYSTEM_H_ */
|
@ -30,6 +30,8 @@ void buildTargetPtInertialSequence(Subsystem& ss, ModeListEntry& entryHelper);
|
||||
static const auto OFF = HasModesIF::MODE_OFF;
|
||||
static const auto NML = DeviceHandlerIF::MODE_NORMAL;
|
||||
|
||||
auto SUS_BOARD_NML_TRANS = std::make_pair(0x20, FixedArrayList<ModeListEntry, 1>());
|
||||
|
||||
auto ACS_SEQUENCE_OFF = std::make_pair(acs::AcsMode::OFF, FixedArrayList<ModeListEntry, 3>());
|
||||
auto ACS_TABLE_OFF_TGT =
|
||||
std::make_pair((acs::AcsMode::OFF << 24) | 1, FixedArrayList<ModeListEntry, 1>());
|
||||
@ -39,62 +41,62 @@ auto ACS_TABLE_OFF_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::OFF << 24) | 3, FixedArrayList<ModeListEntry, 6>());
|
||||
|
||||
auto ACS_SEQUENCE_DETUMBLE =
|
||||
std::make_pair(acs::AcsMode::DETUMBLE, FixedArrayList<ModeListEntry, 3>());
|
||||
std::make_pair(acs::AcsMode::DETUMBLE, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_DETUMBLE_TGT =
|
||||
std::make_pair((acs::AcsMode::DETUMBLE << 24) | 1, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_DETUMBLE_TRANS_0 =
|
||||
std::make_pair((acs::AcsMode::DETUMBLE << 24) | 2, FixedArrayList<ModeListEntry, 5>());
|
||||
auto ACS_TABLE_DETUMBLE_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::DETUMBLE << 24) | 3, FixedArrayList<ModeListEntry, 1>());
|
||||
std::make_pair((acs::AcsMode::DETUMBLE << 24) | 3, FixedArrayList<ModeListEntry, 5>());
|
||||
|
||||
auto ACS_SEQUENCE_SAFE = std::make_pair(acs::AcsMode::SAFE, FixedArrayList<ModeListEntry, 3>());
|
||||
auto ACS_SEQUENCE_SAFE = std::make_pair(acs::AcsMode::SAFE, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_SAFE_TGT =
|
||||
std::make_pair((acs::AcsMode::SAFE << 24) | 1, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_SAFE_TRANS_0 =
|
||||
std::make_pair((acs::AcsMode::SAFE << 24) | 2, FixedArrayList<ModeListEntry, 5>());
|
||||
auto ACS_TABLE_SAFE_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::SAFE << 24) | 3, FixedArrayList<ModeListEntry, 1>());
|
||||
std::make_pair((acs::AcsMode::SAFE << 24) | 3, FixedArrayList<ModeListEntry, 5>());
|
||||
|
||||
auto ACS_SEQUENCE_IDLE = std::make_pair(acs::AcsMode::PTG_IDLE, FixedArrayList<ModeListEntry, 3>());
|
||||
auto ACS_SEQUENCE_IDLE = std::make_pair(acs::AcsMode::PTG_IDLE, FixedArrayList<ModeListEntry, 5>());
|
||||
auto ACS_TABLE_IDLE_TGT =
|
||||
std::make_pair((acs::AcsMode::PTG_IDLE << 24) | 1, FixedArrayList<ModeListEntry, 6>());
|
||||
auto ACS_TABLE_IDLE_TRANS_0 =
|
||||
std::make_pair((acs::AcsMode::PTG_IDLE << 24) | 2, FixedArrayList<ModeListEntry, 6>());
|
||||
auto ACS_TABLE_IDLE_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::PTG_IDLE << 24) | 3, FixedArrayList<ModeListEntry, 2>());
|
||||
std::make_pair((acs::AcsMode::PTG_IDLE << 24) | 3, FixedArrayList<ModeListEntry, 3>());
|
||||
|
||||
auto ACS_TABLE_PTG_TRANS_0 =
|
||||
std::make_pair((acs::AcsMode::PTG_TARGET << 24) | 2, FixedArrayList<ModeListEntry, 5>());
|
||||
|
||||
auto ACS_SEQUENCE_PTG_TARGET =
|
||||
std::make_pair(acs::AcsMode::PTG_TARGET, FixedArrayList<ModeListEntry, 3>());
|
||||
std::make_pair(acs::AcsMode::PTG_TARGET, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_PTG_TARGET_TGT =
|
||||
std::make_pair((acs::AcsMode::PTG_TARGET << 24) | 1, FixedArrayList<ModeListEntry, 6>());
|
||||
auto ACS_TABLE_PTG_TARGET_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::PTG_TARGET << 24) | 3, FixedArrayList<ModeListEntry, 1>());
|
||||
|
||||
auto ACS_SEQUENCE_PTG_TARGET_GS =
|
||||
std::make_pair(acs::AcsMode::PTG_TARGET_GS, FixedArrayList<ModeListEntry, 3>());
|
||||
std::make_pair(acs::AcsMode::PTG_TARGET_GS, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_PTG_TARGET_GS_TGT =
|
||||
std::make_pair((acs::AcsMode::PTG_TARGET_GS << 24) | 1, FixedArrayList<ModeListEntry, 6>());
|
||||
auto ACS_TABLE_PTG_TARGET_GS_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::PTG_TARGET_GS << 24) | 3, FixedArrayList<ModeListEntry, 1>());
|
||||
|
||||
auto ACS_SEQUENCE_PTG_TARGET_NADIR =
|
||||
std::make_pair(acs::AcsMode::PTG_NADIR, FixedArrayList<ModeListEntry, 3>());
|
||||
std::make_pair(acs::AcsMode::PTG_NADIR, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_PTG_TARGET_NADIR_TGT =
|
||||
std::make_pair((acs::AcsMode::PTG_NADIR << 24) | 1, FixedArrayList<ModeListEntry, 6>());
|
||||
auto ACS_TABLE_PTG_TARGET_NADIR_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::PTG_NADIR << 24) | 3, FixedArrayList<ModeListEntry, 1>());
|
||||
|
||||
auto ACS_SEQUENCE_PTG_TARGET_INERTIAL =
|
||||
std::make_pair(acs::AcsMode::PTG_INERTIAL, FixedArrayList<ModeListEntry, 3>());
|
||||
std::make_pair(acs::AcsMode::PTG_INERTIAL, FixedArrayList<ModeListEntry, 4>());
|
||||
auto ACS_TABLE_PTG_TARGET_INERTIAL_TGT =
|
||||
std::make_pair((acs::AcsMode::PTG_INERTIAL << 24) | 1, FixedArrayList<ModeListEntry, 6>());
|
||||
auto ACS_TABLE_PTG_TARGET_INERTIAL_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::PTG_INERTIAL << 24) | 3, FixedArrayList<ModeListEntry, 1>());
|
||||
|
||||
void satsystem::acs::init() {
|
||||
Subsystem& satsystem::acs::init() {
|
||||
ModeListEntry entry;
|
||||
const char* ctxc = "satsystem::acs::init: generic target";
|
||||
// Insert Helper Table
|
||||
@ -114,6 +116,11 @@ void satsystem::acs::init() {
|
||||
TableEntry(ACS_TABLE_PTG_TRANS_0.first, &ACS_TABLE_PTG_TRANS_0.second)),
|
||||
ctxc);
|
||||
|
||||
// Build SUS board transition
|
||||
iht(objects::SUS_BOARD_ASS, NML, 0, SUS_BOARD_NML_TRANS.second);
|
||||
check(ACS_SUBSYSTEM.addTable(TableEntry(SUS_BOARD_NML_TRANS.first, &SUS_BOARD_NML_TRANS.second)),
|
||||
ctxc);
|
||||
|
||||
buildOffSequence(ACS_SUBSYSTEM, entry);
|
||||
buildSafeSequence(ACS_SUBSYSTEM, entry);
|
||||
buildDetumbleSequence(ACS_SUBSYSTEM, entry);
|
||||
@ -123,6 +130,7 @@ void satsystem::acs::init() {
|
||||
buildTargetPtNadirSequence(ACS_SUBSYSTEM, entry);
|
||||
buildTargetPtInertialSequence(ACS_SUBSYSTEM, entry);
|
||||
ACS_SUBSYSTEM.setInitialMode(::acs::AcsMode::SAFE);
|
||||
return ACS_SUBSYSTEM;
|
||||
}
|
||||
|
||||
namespace {
|
||||
@ -157,7 +165,6 @@ void buildOffSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
iht(objects::IMTQ_HANDLER, OFF, 0, ACS_TABLE_OFF_TRANS_1.second);
|
||||
iht(objects::STAR_TRACKER, OFF, 0, ACS_TABLE_OFF_TRANS_1.second);
|
||||
iht(objects::ACS_BOARD_ASS, OFF, 0, ACS_TABLE_OFF_TRANS_1.second);
|
||||
iht(objects::SUS_BOARD_ASS, OFF, 0, ACS_TABLE_OFF_TRANS_1.second);
|
||||
iht(objects::RW_ASS, OFF, 0, ACS_TABLE_OFF_TRANS_1.second);
|
||||
check(ss.addTable(TableEntry(ACS_TABLE_OFF_TRANS_1.first, &ACS_TABLE_OFF_TRANS_1.second)), ctxc);
|
||||
|
||||
@ -198,13 +205,14 @@ void buildSafeSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build SAFE transition 0
|
||||
iht(objects::IMTQ_HANDLER, NML, 0, ACS_TABLE_SAFE_TRANS_0.second);
|
||||
iht(objects::SUS_BOARD_ASS, NML, 0, ACS_TABLE_SAFE_TRANS_0.second);
|
||||
iht(objects::ACS_BOARD_ASS, NML, 0, ACS_TABLE_SAFE_TRANS_0.second);
|
||||
iht(objects::STAR_TRACKER, OFF, 0, ACS_TABLE_SAFE_TRANS_0.second);
|
||||
iht(objects::RW_ASS, OFF, 0, ACS_TABLE_SAFE_TRANS_0.second);
|
||||
check(ss.addTable(&ACS_TABLE_SAFE_TRANS_0.second, ACS_TABLE_SAFE_TRANS_0.first, false, true),
|
||||
ctxc);
|
||||
|
||||
// SUS board transition table is defined above
|
||||
|
||||
// Build SAFE transition 1
|
||||
iht(objects::ACS_CONTROLLER, NML, acs::AcsMode::SAFE, ACS_TABLE_SAFE_TRANS_1.second);
|
||||
check(ss.addTable(&ACS_TABLE_SAFE_TRANS_1.second, ACS_TABLE_SAFE_TRANS_1.first, false, true),
|
||||
@ -212,6 +220,7 @@ void buildSafeSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build SAFE sequence
|
||||
ihs(ACS_SEQUENCE_SAFE.second, ACS_TABLE_SAFE_TGT.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_SAFE.second, SUS_BOARD_NML_TRANS.first, 0, false);
|
||||
ihs(ACS_SEQUENCE_SAFE.second, ACS_TABLE_SAFE_TRANS_0.first, 0, false);
|
||||
ihs(ACS_SEQUENCE_SAFE.second, ACS_TABLE_SAFE_TRANS_1.first, 0, false);
|
||||
check(ss.addSequence(&ACS_SEQUENCE_SAFE.second, ACS_SEQUENCE_SAFE.first, ACS_SEQUENCE_SAFE.first,
|
||||
@ -246,6 +255,8 @@ void buildDetumbleSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
check(ss.addTable(&ACS_TABLE_DETUMBLE_TGT.second, ACS_TABLE_DETUMBLE_TGT.first, false, true),
|
||||
ctxc);
|
||||
|
||||
// SUS board transition table is defined above
|
||||
|
||||
// Build DETUMBLE transition 0
|
||||
iht(objects::IMTQ_HANDLER, NML, 0, ACS_TABLE_DETUMBLE_TRANS_0.second);
|
||||
iht(objects::ACS_BOARD_ASS, NML, 0, ACS_TABLE_DETUMBLE_TRANS_0.second);
|
||||
@ -264,6 +275,7 @@ void buildDetumbleSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build DETUMBLE sequence
|
||||
ihs(ACS_SEQUENCE_DETUMBLE.second, ACS_TABLE_DETUMBLE_TGT.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_DETUMBLE.second, SUS_BOARD_NML_TRANS.first, 0, false);
|
||||
ihs(ACS_SEQUENCE_DETUMBLE.second, ACS_TABLE_DETUMBLE_TRANS_0.first, 0, false);
|
||||
ihs(ACS_SEQUENCE_DETUMBLE.second, ACS_TABLE_DETUMBLE_TRANS_1.first, 0, false);
|
||||
check(ss.addSequence(&ACS_SEQUENCE_DETUMBLE.second, ACS_SEQUENCE_DETUMBLE.first,
|
||||
@ -298,6 +310,8 @@ void buildIdleSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
iht(objects::ACS_BOARD_ASS, NML, 0, ACS_TABLE_IDLE_TGT.second);
|
||||
ss.addTable(&ACS_TABLE_IDLE_TGT.second, ACS_TABLE_IDLE_TGT.first, false, true);
|
||||
|
||||
// SUS board transition table is built above
|
||||
|
||||
// Build IDLE transition 0
|
||||
iht(objects::IMTQ_HANDLER, NML, 0, ACS_TABLE_IDLE_TRANS_0.second);
|
||||
iht(objects::ACS_BOARD_ASS, NML, 0, ACS_TABLE_IDLE_TRANS_0.second);
|
||||
@ -312,6 +326,7 @@ void buildIdleSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build IDLE sequence
|
||||
ihs(ACS_SEQUENCE_IDLE.second, ACS_TABLE_IDLE_TGT.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_IDLE.second, SUS_BOARD_NML_TRANS.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_IDLE.second, ACS_TABLE_IDLE_TRANS_0.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_IDLE.second, ACS_TABLE_IDLE_TRANS_1.first, 0, true);
|
||||
ss.addSequence(&ACS_SEQUENCE_IDLE.second, ACS_SEQUENCE_IDLE.first, ACS_SEQUENCE_SAFE.first, false,
|
||||
@ -348,6 +363,7 @@ void buildTargetPtSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
check(ss.addTable(&ACS_TABLE_PTG_TARGET_TGT.second, ACS_TABLE_PTG_TARGET_TGT.first, false, true),
|
||||
ctxc);
|
||||
|
||||
// SUS board transition table is built above
|
||||
// Transition 0 already built
|
||||
// Build TARGET PT transition 1
|
||||
iht(objects::ACS_CONTROLLER, NML, acs::AcsMode::PTG_TARGET, ACS_TABLE_PTG_TARGET_TRANS_1.second);
|
||||
@ -357,6 +373,7 @@ void buildTargetPtSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build IDLE sequence
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET.second, ACS_TABLE_PTG_TARGET_TGT.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET.second, SUS_BOARD_NML_TRANS.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET.second, ACS_TABLE_PTG_TRANS_0.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET.second, ACS_TABLE_PTG_TARGET_TRANS_1.first, 0, true);
|
||||
check(ss.addSequence(&ACS_SEQUENCE_PTG_TARGET.second, ACS_SEQUENCE_PTG_TARGET.first,
|
||||
@ -406,6 +423,7 @@ void buildTargetPtNadirSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build IDLE sequence
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_NADIR.second, ACS_TABLE_PTG_TARGET_NADIR_TGT.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_NADIR.second, SUS_BOARD_NML_TRANS.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_NADIR.second, ACS_TABLE_PTG_TRANS_0.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_NADIR.second, ACS_TABLE_PTG_TARGET_NADIR_TRANS_1.first, 0, true);
|
||||
check(
|
||||
@ -456,6 +474,7 @@ void buildTargetPtGsSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build IDLE sequence
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_GS.second, ACS_TABLE_PTG_TARGET_GS_TGT.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_GS.second, SUS_BOARD_NML_TRANS.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_GS.second, ACS_TABLE_PTG_TRANS_0.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_GS.second, ACS_TABLE_PTG_TARGET_GS_TRANS_1.first, 0, true);
|
||||
check(ss.addSequence(SequenceEntry(ACS_SEQUENCE_PTG_TARGET_GS.first,
|
||||
@ -505,6 +524,7 @@ void buildTargetPtInertialSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
|
||||
// Build IDLE sequence
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_INERTIAL.second, ACS_TABLE_PTG_TARGET_INERTIAL_TGT.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_INERTIAL.second, SUS_BOARD_NML_TRANS.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_INERTIAL.second, ACS_TABLE_PTG_TRANS_0.first, 0, true);
|
||||
ihs(ACS_SEQUENCE_PTG_TARGET_INERTIAL.second, ACS_TABLE_PTG_TARGET_INERTIAL_TRANS_1.first, 0,
|
||||
true);
|
||||
|
@ -4,7 +4,7 @@ namespace satsystem {
|
||||
namespace acs {
|
||||
|
||||
extern AcsSubsystem ACS_SUBSYSTEM;
|
||||
void init();
|
||||
Subsystem& init();
|
||||
|
||||
} // namespace acs
|
||||
} // namespace satsystem
|
||||
|
@ -62,13 +62,14 @@ void buildTxAndRxDefaultRateSequence(Subsystem& ss, ModeListEntry& eh);
|
||||
|
||||
} // namespace
|
||||
|
||||
void satsystem::com::init() {
|
||||
Subsystem& satsystem::com::init() {
|
||||
ModeListEntry entry;
|
||||
buildRxOnlySequence(SUBSYSTEM, entry);
|
||||
buildTxAndRxLowRateSequence(SUBSYSTEM, entry);
|
||||
buildTxAndRxHighRateSequence(SUBSYSTEM, entry);
|
||||
buildTxAndRxDefaultRateSequence(SUBSYSTEM, entry);
|
||||
SUBSYSTEM.setInitialMode(NML, ::com::Submode::RX_ONLY);
|
||||
return SUBSYSTEM;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
@ -8,7 +8,7 @@ namespace satsystem {
|
||||
namespace com {
|
||||
extern ComSubsystem SUBSYSTEM;
|
||||
|
||||
void init();
|
||||
Subsystem& init();
|
||||
} // namespace com
|
||||
|
||||
} // namespace satsystem
|
||||
|
@ -20,7 +20,7 @@ void initEarthObsvSequence(Subsystem& ss, ModeListEntry& eh);
|
||||
void initScexSequence(Subsystem& ss, ModeListEntry& eh);
|
||||
} // namespace
|
||||
|
||||
Subsystem satsystem::pl::SUBSYSTEM = Subsystem(objects::PL_SUBSYSTEM, 12, 24);
|
||||
PayloadSubsystem satsystem::pl::SUBSYSTEM = PayloadSubsystem(objects::PL_SUBSYSTEM, 12, 24);
|
||||
|
||||
const auto check = subsystem::checkInsert;
|
||||
static const auto OFF = HasModesIF::MODE_OFF;
|
||||
@ -77,7 +77,7 @@ auto PL_TABLE_SCEX_TGT =
|
||||
auto PL_TABLE_SCEX_TRANS_0 =
|
||||
std::make_pair((payload::Mode::SCEX << 24) | 2, FixedArrayList<ModeListEntry, 1>());
|
||||
|
||||
void satsystem::pl::init() {
|
||||
Subsystem& satsystem::pl::init() {
|
||||
ModeListEntry entry;
|
||||
initOffSequence(SUBSYSTEM, entry);
|
||||
initPlMpsocStreamSequence(SUBSYSTEM, entry);
|
||||
@ -86,6 +86,7 @@ void satsystem::pl::init() {
|
||||
initEarthObsvSequence(SUBSYSTEM, entry);
|
||||
initScexSequence(SUBSYSTEM, entry);
|
||||
SUBSYSTEM.setInitialMode(OFF);
|
||||
return SUBSYSTEM;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
@ -1,15 +1,15 @@
|
||||
#ifndef MISSION_SYSTEM_TREE_PAYLOADMODETREE_H_
|
||||
#define MISSION_SYSTEM_TREE_PAYLOADMODETREE_H_
|
||||
|
||||
#include <fsfw/subsystem/Subsystem.h>
|
||||
#include <mission/system/objects/PayloadSubsystem.h>
|
||||
|
||||
namespace satsystem {
|
||||
|
||||
namespace pl {
|
||||
|
||||
extern Subsystem SUBSYSTEM;
|
||||
extern PayloadSubsystem SUBSYSTEM;
|
||||
|
||||
void init();
|
||||
Subsystem& init();
|
||||
} // namespace pl
|
||||
|
||||
} // namespace satsystem
|
||||
|
@ -1,13 +1,148 @@
|
||||
#include "system.h"
|
||||
|
||||
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
|
||||
#include <fsfw/subsystem/Subsystem.h>
|
||||
#include <mission/acsDefs.h>
|
||||
|
||||
#include "acsModeTree.h"
|
||||
#include "comModeTree.h"
|
||||
#include "eive/objects.h"
|
||||
#include "payloadModeTree.h"
|
||||
#include "tcsModeTree.h"
|
||||
#include "util.h"
|
||||
|
||||
namespace {
|
||||
// Alias for checker function
|
||||
const auto check = subsystem::checkInsert;
|
||||
|
||||
void buildSafeSequence(Subsystem& ss, ModeListEntry& eh);
|
||||
void buildIdleSequence(Subsystem& ss, ModeListEntry& eh);
|
||||
} // namespace
|
||||
|
||||
static const auto OFF = HasModesIF::MODE_OFF;
|
||||
static const auto NML = DeviceHandlerIF::MODE_NORMAL;
|
||||
|
||||
void satsystem::init() {
|
||||
acs::init();
|
||||
pl::init();
|
||||
tcs::init();
|
||||
com::init();
|
||||
auto& acsSubsystem = acs::init();
|
||||
acsSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||
auto& payloadSubsystem = pl::init();
|
||||
payloadSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||
auto& tcsSubsystem = tcs::init();
|
||||
tcsSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||
auto& comSubsystem = com::init();
|
||||
comSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||
ModeListEntry entry;
|
||||
buildSafeSequence(EIVE_SYSTEM, entry);
|
||||
buildIdleSequence(EIVE_SYSTEM, entry);
|
||||
}
|
||||
|
||||
EiveSystem satsystem::EIVE_SYSTEM = EiveSystem(objects::EIVE_SYSTEM, 12, 24);
|
||||
|
||||
auto EIVE_SEQUENCE_SAFE = std::make_pair(acs::AcsMode::SAFE, FixedArrayList<ModeListEntry, 5>());
|
||||
auto EIVE_TABLE_SAFE_TGT =
|
||||
std::make_pair((acs::AcsMode::SAFE << 24) | 1, FixedArrayList<ModeListEntry, 5>());
|
||||
auto EIVE_TABLE_SAFE_TRANS_0 =
|
||||
std::make_pair((acs::AcsMode::SAFE << 24) | 2, FixedArrayList<ModeListEntry, 5>());
|
||||
auto EIVE_TABLE_SAFE_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::SAFE << 24) | 3, FixedArrayList<ModeListEntry, 5>());
|
||||
|
||||
auto EIVE_SEQUENCE_IDLE =
|
||||
std::make_pair(acs::AcsMode::PTG_IDLE, FixedArrayList<ModeListEntry, 5>());
|
||||
auto EIVE_TABLE_IDLE_TGT =
|
||||
std::make_pair((acs::AcsMode::PTG_IDLE << 24) | 1, FixedArrayList<ModeListEntry, 5>());
|
||||
auto EIVE_TABLE_IDLE_TRANS_0 =
|
||||
std::make_pair((acs::AcsMode::PTG_IDLE << 24) | 2, FixedArrayList<ModeListEntry, 5>());
|
||||
auto EIVE_TABLE_IDLE_TRANS_1 =
|
||||
std::make_pair((acs::AcsMode::PTG_IDLE << 24) | 3, FixedArrayList<ModeListEntry, 5>());
|
||||
|
||||
namespace {
|
||||
|
||||
void buildSafeSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
std::string context = "satsystem::buildSafeSequence";
|
||||
auto ctxc = context.c_str();
|
||||
// Insert Helper Table
|
||||
auto iht = [&](object_id_t obj, Mode_t mode, Submode_t submode, ArrayList<ModeListEntry>& table) {
|
||||
eh.setObject(obj);
|
||||
eh.setMode(mode);
|
||||
eh.setSubmode(submode);
|
||||
check(table.insert(eh), ctxc);
|
||||
};
|
||||
// Insert Helper Sequence
|
||||
auto ihs = [&](ArrayList<ModeListEntry>& sequence, Mode_t tableId, uint32_t waitSeconds,
|
||||
bool checkSuccess) {
|
||||
eh.setTableId(tableId);
|
||||
eh.setWaitSeconds(waitSeconds);
|
||||
eh.setCheckSuccess(checkSuccess);
|
||||
check(sequence.insert(eh), ctxc);
|
||||
};
|
||||
|
||||
// Do no track ACS for now because it might jump to detumble mode and back to safe as part of
|
||||
// normal operations.
|
||||
// iht(objects::ACS_SUBSYSTEM, acs::AcsMode::SAFE, 0, EIVE_TABLE_SAFE_TGT.second);
|
||||
iht(objects::PL_SUBSYSTEM, OFF, 0, EIVE_TABLE_SAFE_TGT.second);
|
||||
check(ss.addTable(TableEntry(EIVE_TABLE_SAFE_TGT.first, &EIVE_TABLE_SAFE_TGT.second)), ctxc);
|
||||
|
||||
// Build SAFE transition 0. Two transitions to reduce number of consecutive events and because
|
||||
// consecutive commanding of TCS and ACS can lead to SPI issues.
|
||||
iht(objects::TCS_SUBSYSTEM, NML, 0, EIVE_TABLE_SAFE_TRANS_0.second);
|
||||
check(ss.addTable(TableEntry(EIVE_TABLE_SAFE_TRANS_0.first, &EIVE_TABLE_SAFE_TRANS_0.second)),
|
||||
ctxc);
|
||||
|
||||
// Build SAFE transition 1
|
||||
iht(objects::PL_SUBSYSTEM, OFF, 0, EIVE_TABLE_SAFE_TRANS_1.second);
|
||||
iht(objects::ACS_SUBSYSTEM, acs::AcsMode::SAFE, 0, EIVE_TABLE_SAFE_TRANS_1.second);
|
||||
check(ss.addTable(TableEntry(EIVE_TABLE_SAFE_TRANS_1.first, &EIVE_TABLE_SAFE_TRANS_1.second)),
|
||||
ctxc);
|
||||
|
||||
// Build Safe sequence
|
||||
ihs(EIVE_SEQUENCE_SAFE.second, EIVE_TABLE_SAFE_TGT.first, 0, false);
|
||||
ihs(EIVE_SEQUENCE_SAFE.second, EIVE_TABLE_SAFE_TRANS_0.first, 0, false);
|
||||
ihs(EIVE_SEQUENCE_SAFE.second, EIVE_TABLE_SAFE_TRANS_1.first, 0, false);
|
||||
check(ss.addSequence(SequenceEntry(EIVE_SEQUENCE_SAFE.first, &EIVE_SEQUENCE_SAFE.second,
|
||||
EIVE_SEQUENCE_SAFE.first)),
|
||||
ctxc);
|
||||
}
|
||||
|
||||
void buildIdleSequence(Subsystem& ss, ModeListEntry& eh) {
|
||||
std::string context = "satsystem::buildIdleSequence";
|
||||
auto ctxc = context.c_str();
|
||||
// Insert Helper Table
|
||||
auto iht = [&](object_id_t obj, Mode_t mode, Submode_t submode, ArrayList<ModeListEntry>& table) {
|
||||
eh.setObject(obj);
|
||||
eh.setMode(mode);
|
||||
eh.setSubmode(submode);
|
||||
check(table.insert(eh), ctxc);
|
||||
};
|
||||
// Insert Helper Sequence
|
||||
auto ihs = [&](ArrayList<ModeListEntry>& sequence, Mode_t tableId, uint32_t waitSeconds,
|
||||
bool checkSuccess) {
|
||||
eh.setTableId(tableId);
|
||||
eh.setWaitSeconds(waitSeconds);
|
||||
eh.setCheckSuccess(checkSuccess);
|
||||
check(sequence.insert(eh), ctxc);
|
||||
};
|
||||
|
||||
iht(objects::ACS_SUBSYSTEM, acs::AcsMode::PTG_IDLE, 0, EIVE_TABLE_IDLE_TGT.second);
|
||||
check(ss.addTable(TableEntry(EIVE_TABLE_IDLE_TGT.first, &EIVE_TABLE_IDLE_TGT.second)), ctxc);
|
||||
|
||||
// Build SAFE transition 0
|
||||
iht(objects::TCS_SUBSYSTEM, NML, 0, EIVE_TABLE_IDLE_TRANS_0.second);
|
||||
check(ss.addTable(TableEntry(EIVE_TABLE_IDLE_TRANS_0.first, &EIVE_TABLE_IDLE_TRANS_0.second)),
|
||||
ctxc);
|
||||
|
||||
// Build SAFE transition 1
|
||||
iht(objects::PL_SUBSYSTEM, OFF, 0, EIVE_TABLE_IDLE_TRANS_1.second);
|
||||
iht(objects::ACS_SUBSYSTEM, acs::AcsMode::PTG_IDLE, 0, EIVE_TABLE_IDLE_TRANS_1.second);
|
||||
check(ss.addTable(TableEntry(EIVE_TABLE_IDLE_TRANS_1.first, &EIVE_TABLE_IDLE_TRANS_1.second)),
|
||||
ctxc);
|
||||
|
||||
// Build Safe sequence
|
||||
ihs(EIVE_SEQUENCE_IDLE.second, EIVE_TABLE_IDLE_TGT.first, 0, false);
|
||||
ihs(EIVE_SEQUENCE_IDLE.second, EIVE_TABLE_IDLE_TRANS_0.first, 0, false);
|
||||
ihs(EIVE_SEQUENCE_IDLE.second, EIVE_TABLE_IDLE_TRANS_1.first, 0, false);
|
||||
check(ss.addSequence(SequenceEntry(EIVE_SEQUENCE_IDLE.first, &EIVE_SEQUENCE_IDLE.second,
|
||||
EIVE_SEQUENCE_SAFE.first)),
|
||||
ctxc);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
@ -1,10 +1,14 @@
|
||||
#ifndef MISSION_SYSTEM_TREE_SYSTEM_H_
|
||||
#define MISSION_SYSTEM_TREE_SYSTEM_H_
|
||||
|
||||
#include <mission/system/objects/EiveSystem.h>
|
||||
|
||||
namespace satsystem {
|
||||
|
||||
void init();
|
||||
|
||||
}
|
||||
extern EiveSystem EIVE_SYSTEM;
|
||||
|
||||
} // namespace satsystem
|
||||
|
||||
#endif /* MISSION_SYSTEM_TREE_SYSTEM_H_ */
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include "fsfw/subsystem/Subsystem.h"
|
||||
#include "mission/system/tree/util.h"
|
||||
|
||||
Subsystem satsystem::tcs::SUBSYSTEM(objects::TCS_SUBSYSTEM, 12, 24);
|
||||
TcsSubsystem satsystem::tcs::SUBSYSTEM(objects::TCS_SUBSYSTEM, 12, 24);
|
||||
|
||||
namespace {
|
||||
// Alias for checker function
|
||||
@ -27,11 +27,12 @@ auto TCS_TABLE_NORMAL_TGT = std::make_pair((NML << 24) | 1, FixedArrayList<ModeL
|
||||
auto TCS_TABLE_NORMAL_TRANS_0 = std::make_pair((NML << 24) | 2, FixedArrayList<ModeListEntry, 7>());
|
||||
auto TCS_TABLE_NORMAL_TRANS_1 = std::make_pair((NML << 24) | 3, FixedArrayList<ModeListEntry, 2>());
|
||||
|
||||
void satsystem::tcs::init() {
|
||||
Subsystem& satsystem::tcs::init() {
|
||||
ModeListEntry entry;
|
||||
buildOffSequence(SUBSYSTEM, entry);
|
||||
buildNormalSequence(SUBSYSTEM, entry);
|
||||
SUBSYSTEM.setInitialMode(OFF);
|
||||
return SUBSYSTEM;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
@ -1,12 +1,13 @@
|
||||
#ifndef MISSION_SYSTEM_TREE_TCSMODETREE_H_
|
||||
#define MISSION_SYSTEM_TREE_TCSMODETREE_H_
|
||||
#include <fsfw/subsystem/Subsystem.h>
|
||||
|
||||
#include <mission/system/objects/TcsSubsystem.h>
|
||||
|
||||
namespace satsystem {
|
||||
namespace tcs {
|
||||
|
||||
extern Subsystem SUBSYSTEM;
|
||||
void init();
|
||||
extern TcsSubsystem SUBSYSTEM;
|
||||
Subsystem& init();
|
||||
|
||||
} // namespace tcs
|
||||
} // namespace satsystem
|
||||
|
Reference in New Issue
Block a user