I am happy with this version
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
This commit is contained in:
parent
c5a4fcd674
commit
3759b5d34a
36
CHANGELOG.md
36
CHANGELOG.md
@ -17,6 +17,42 @@ change warranting a new major release:
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
# [v1.27.0] 2023-02-13
|
||||||
|
|
||||||
|
Added EIVE system top mode component. Currently, only SAFE and IDLE mode are
|
||||||
|
implemented, and the system does not do more than commanding TCS and ACS
|
||||||
|
into the correct modes. It does not have a lot of mode tracking capabilities
|
||||||
|
yet because the ACS controller might alternate between SAFE and DETUMBLE.
|
||||||
|
It takes around 5-10 seconds for the EIVE system to reach the SAFE mode.
|
||||||
|
|
||||||
|
The new system is used at software boot to command the satellite into safe mode
|
||||||
|
on each reboot. This behaviour can be disabled with the
|
||||||
|
`OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP` flag.
|
||||||
|
|
||||||
|
## Added
|
||||||
|
|
||||||
|
- New EIVE system component like explained above.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- The satellite now commands itself into SAFE mode on each reboot, which
|
||||||
|
triggers a lot of events on each SW reboot. The TCS subsystem will commanded
|
||||||
|
to NORMAL mode immediately while the ACS subsystem will be commanded to
|
||||||
|
SAFE mode. The payload subsystem will be commanded OFF.
|
||||||
|
- `RELEASE_BUILD` flag moved to `commonConfig.h`
|
||||||
|
- The ACS subsystem transitions are now staggered: The SUS board assembly
|
||||||
|
is commanded as a separate transition. This reduces the risk of long bus lockups.
|
||||||
|
- No INFO mode event translations for release builds to reduce number of
|
||||||
|
printouts.
|
||||||
|
- More granular locking inside the MAX31865 low level read handler.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- More DHB thermal module fixes.
|
||||||
|
- ACS PST frequency extended to 0.8 seconds in debug builds to avoid SPI
|
||||||
|
bus lockups.
|
||||||
|
- Local datapool fixes for the `PlocSupervisorHandler`
|
||||||
|
|
||||||
# [v1.26.4] 2023-02-10
|
# [v1.26.4] 2023-02-10
|
||||||
|
|
||||||
eive-tmtc: v2.12.3
|
eive-tmtc: v2.12.3
|
||||||
|
@ -307,6 +307,11 @@ endif()
|
|||||||
include(BuildType)
|
include(BuildType)
|
||||||
set_build_type()
|
set_build_type()
|
||||||
|
|
||||||
|
set(FSFW_DEBUG_INFO 0)
|
||||||
|
if(RELEASE_BUILD MATCHES 0)
|
||||||
|
set(FSFW_DEBUG_INFO 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Configuration files
|
# Configuration files
|
||||||
configure_file(${COMMON_CONFIG_PATH}/commonConfig.h.in commonConfig.h)
|
configure_file(${COMMON_CONFIG_PATH}/commonConfig.h.in commonConfig.h)
|
||||||
configure_file(${FSFW_CONFIG_PATH}/FSFWConfig.h.in FSFWConfig.h)
|
configure_file(${FSFW_CONFIG_PATH}/FSFWConfig.h.in FSFWConfig.h)
|
||||||
|
@ -390,7 +390,7 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
#ifdef RELEASE_BUILD
|
#ifdef RELEASE_BUILD
|
||||||
static constexpr float acsPstPeriod = 0.4;
|
static constexpr float acsPstPeriod = 0.4;
|
||||||
#else
|
#else
|
||||||
static constexpr float acsPstPeriod = 0.6;
|
static constexpr float acsPstPeriod = 0.8;
|
||||||
#endif
|
#endif
|
||||||
FixedTimeslotTaskIF* acsPst = factory.createFixedTimeslotTask(
|
FixedTimeslotTaskIF* acsPst = factory.createFixedTimeslotTask(
|
||||||
"ACS_PST", 85, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, acsPstPeriod, missedDeadlineFunc);
|
"ACS_PST", 85, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, acsPstPeriod, missedDeadlineFunc);
|
||||||
|
@ -53,7 +53,7 @@ static constexpr uint8_t VC3_QUEUE_SIZE = 50;
|
|||||||
static constexpr uint32_t MAX_PUS_FUNNEL_QUEUE_DEPTH = 100;
|
static constexpr uint32_t MAX_PUS_FUNNEL_QUEUE_DEPTH = 100;
|
||||||
|
|
||||||
static constexpr uint32_t MAX_STORED_CMDS_UDP = 120;
|
static constexpr uint32_t MAX_STORED_CMDS_UDP = 120;
|
||||||
static constexpr uint32_t MAX_STORED_CMDS_TCP = 120;
|
static constexpr uint32_t MAX_STORED_CMDS_TCP = 150;
|
||||||
|
|
||||||
namespace acs {
|
namespace acs {
|
||||||
|
|
||||||
|
2
fsfw
2
fsfw
@ -1 +1 @@
|
|||||||
Subproject commit 8b4f73a97b15f27e314932538d468707c57f965a
|
Subproject commit dac2d210b597adfaf45bd5ae6a4c027599927601
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
#if FSFW_OBJ_EVENT_TRANSLATION == 1
|
#if FSFW_OBJ_EVENT_TRANSLATION == 1
|
||||||
//! Specify whether info events are printed too.
|
//! Specify whether info events are printed too.
|
||||||
#define FSFW_DEBUG_INFO 1
|
#define FSFW_DEBUG_INFO @FSFW_DEBUG_INFO@
|
||||||
#include "objects/translateObjects.h"
|
#include "objects/translateObjects.h"
|
||||||
#include "events/translateEvents.h"
|
#include "events/translateEvents.h"
|
||||||
#else
|
#else
|
||||||
|
@ -8,3 +8,5 @@ add_subdirectory(system)
|
|||||||
add_subdirectory(csp)
|
add_subdirectory(csp)
|
||||||
add_subdirectory(cfdp)
|
add_subdirectory(cfdp)
|
||||||
add_subdirectory(config)
|
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 {
|
namespace acs {
|
||||||
|
|
||||||
// These modes are the submodes of the ACS controller and the modes of the ACS subsystem.
|
// 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,
|
OFF = HasModesIF::MODE_OFF,
|
||||||
SAFE = 10,
|
SAFE = 10,
|
||||||
DETUMBLE = 11,
|
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.
|
//!< The system has recovered from a safe rate rotation violation.
|
||||||
static constexpr Event SAFE_RATE_RECOVERY = MAKE_EVENT(1, severity::MEDIUM);
|
static constexpr Event SAFE_RATE_RECOVERY = MAKE_EVENT(1, severity::MEDIUM);
|
||||||
|
|
||||||
|
extern const char* getModeStr(AcsMode mode);
|
||||||
|
|
||||||
} // namespace acs
|
} // namespace acs
|
||||||
|
|
||||||
#endif /* MISSION_ACSDEFS_H_ */
|
#endif /* MISSION_ACSDEFS_H_ */
|
||||||
|
@ -566,9 +566,15 @@ ReturnValue_t AcsController::checkModeCommand(Mode_t mode, Submode_t submode,
|
|||||||
return INVALID_MODE;
|
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 = acs::getModeStr(static_cast<acs::AcsMode>(mode));
|
||||||
|
sif::info << "ACS controller is now in " << modeStr << " mode" << std::endl;
|
||||||
|
return ExtendedControllerBase::announceMode(recursive);
|
||||||
|
}
|
||||||
|
|
||||||
void AcsController::copyMgmData() {
|
void AcsController::copyMgmData() {
|
||||||
ACS::SensorValues sensorValues;
|
ACS::SensorValues sensorValues;
|
||||||
|
@ -94,7 +94,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}};
|
{150, 512}, {150, 1024}, {150, 2048}};
|
||||||
tmStore = new PoolManager(objects::TM_STORE, poolCfg);
|
tmStore = new PoolManager(objects::TM_STORE, poolCfg);
|
||||||
}
|
}
|
||||||
|
@ -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:
|
private:
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
void performChildOperation() override;
|
void performChildOperation() override;
|
||||||
|
void announceMode(bool recursive) override;
|
||||||
|
|
||||||
void handleEventMessages();
|
void handleEventMessages();
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ target_sources(
|
|||||||
CamSwitcher.cpp
|
CamSwitcher.cpp
|
||||||
AcsSubsystem.cpp
|
AcsSubsystem.cpp
|
||||||
ComSubsystem.cpp
|
ComSubsystem.cpp
|
||||||
|
TcsSubsystem.cpp
|
||||||
PayloadSubsystem.cpp
|
PayloadSubsystem.cpp
|
||||||
AcsBoardAssembly.cpp
|
AcsBoardAssembly.cpp
|
||||||
Stack5VHandler.cpp
|
Stack5VHandler.cpp
|
||||||
|
@ -1,5 +1,43 @@
|
|||||||
#include "EiveSystem.h"
|
#include "EiveSystem.h"
|
||||||
|
|
||||||
|
#include <mission/acsDefs.h>
|
||||||
|
|
||||||
EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences,
|
EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences,
|
||||||
uint32_t maxNumberOfTables)
|
uint32_t maxNumberOfTables)
|
||||||
: Subsystem(setObjectId, maxNumberOfSequences, 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);
|
EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void announceMode(bool recursive) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* MISSION_SYSTEM_EIVESYSTEM_H_ */
|
#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_ */
|
@ -76,7 +76,9 @@ void buildSafeSequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
check(sequence.insert(eh), ctxc);
|
check(sequence.insert(eh), ctxc);
|
||||||
};
|
};
|
||||||
|
|
||||||
iht(objects::ACS_SUBSYSTEM, acs::AcsMode::SAFE, 0, EIVE_TABLE_SAFE_TGT.second);
|
// 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);
|
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);
|
check(ss.addTable(TableEntry(EIVE_TABLE_SAFE_TGT.first, &EIVE_TABLE_SAFE_TGT.second)), ctxc);
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "fsfw/subsystem/Subsystem.h"
|
#include "fsfw/subsystem/Subsystem.h"
|
||||||
#include "mission/system/tree/util.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 {
|
namespace {
|
||||||
// Alias for checker function
|
// Alias for checker function
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
#ifndef MISSION_SYSTEM_TREE_TCSMODETREE_H_
|
#ifndef MISSION_SYSTEM_TREE_TCSMODETREE_H_
|
||||||
#define 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 satsystem {
|
||||||
namespace tcs {
|
namespace tcs {
|
||||||
|
|
||||||
extern Subsystem SUBSYSTEM;
|
extern TcsSubsystem SUBSYSTEM;
|
||||||
Subsystem& init();
|
Subsystem& init();
|
||||||
|
|
||||||
} // namespace tcs
|
} // namespace tcs
|
||||||
|
Loading…
Reference in New Issue
Block a user