fixed conflicts
Some checks failed
EIVE/eive-obsw/pipeline/head There was a failure building this commit
Some checks failed
EIVE/eive-obsw/pipeline/head There was a failure building this commit
This commit is contained in:
commit
47a3804145
@ -8,13 +8,13 @@ using gpioId_t = uint16_t;
|
|||||||
|
|
||||||
namespace gpio {
|
namespace gpio {
|
||||||
|
|
||||||
enum Levels { LOW = 0, HIGH = 1 };
|
enum class Levels : uint8_t { LOW = 0, HIGH = 1 };
|
||||||
|
|
||||||
enum Direction { IN = 0, OUT = 1 };
|
enum class Direction : uint8_t { IN = 0, OUT = 1 };
|
||||||
|
|
||||||
enum GpioOperation { READ, WRITE };
|
enum class GpioOperation { READ, WRITE };
|
||||||
|
|
||||||
enum GpioTypes { NONE, GPIOD_REGULAR, CALLBACK };
|
enum class GpioTypes { NONE, GPIOD_REGULAR, CALLBACK };
|
||||||
|
|
||||||
static constexpr gpioId_t NO_GPIO = -1;
|
static constexpr gpioId_t NO_GPIO = -1;
|
||||||
} // namespace gpio
|
} // namespace gpio
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "InitMission.h"
|
#include "InitMission.h"
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "OBSWVersion.h"
|
#include "OBSWVersion.h"
|
||||||
#include "fsfw/FSFWVersion.h"
|
#include "fsfw/version.h"
|
||||||
#include "fsfw/tasks/TaskFactory.h"
|
#include "fsfw/tasks/TaskFactory.h"
|
||||||
|
|
||||||
#ifdef RASPBERRY_PI
|
#ifdef RASPBERRY_PI
|
||||||
@ -22,7 +22,7 @@ int main(void) {
|
|||||||
std::cout << "-- EIVE OBSW --" << std::endl;
|
std::cout << "-- EIVE OBSW --" << std::endl;
|
||||||
std::cout << "-- Compiled for Linux board " << BOARD_NAME << " --" << std::endl;
|
std::cout << "-- Compiled for Linux board " << BOARD_NAME << " --" << std::endl;
|
||||||
std::cout << "-- OBSW " << SW_NAME << " v" << SW_VERSION << "." << SW_SUBVERSION << "."
|
std::cout << "-- OBSW " << SW_NAME << " v" << SW_VERSION << "." << SW_SUBVERSION << "."
|
||||||
<< SW_REVISION << ", FSFW v" << FSFW_VERSION << "." << FSFW_SUBVERSION << FSFW_REVISION
|
<< SW_REVISION << ", FSFW v" << fsfw::FSFW_VERSION
|
||||||
<< "--" << std::endl;
|
<< "--" << std::endl;
|
||||||
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
|
std::cout << "-- " << __DATE__ << " " << __TIME__ << " --" << std::endl;
|
||||||
|
|
||||||
|
@ -116,14 +116,30 @@ void initmission::initTasks() {
|
|||||||
#endif /* OBSW_USE_CCSDS_IP_CORE == 1 */
|
#endif /* OBSW_USE_CCSDS_IP_CORE == 1 */
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_HANDLERS == 1
|
#if OBSW_ADD_ACS_HANDLERS == 1
|
||||||
PeriodicTaskIF* acsCtrl = factory->createPeriodicTask(
|
PeriodicTaskIF* acsTask = factory->createPeriodicTask(
|
||||||
"ACS_CTRL", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
|
"ACS_CTRL", 45, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
|
||||||
result = acsCtrl->addComponent(objects::GPS_CONTROLLER);
|
result = acsTask->addComponent(objects::GPS_CONTROLLER);
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
initmission::printAddObjectError("ACS_CTRL", objects::GPS_CONTROLLER);
|
initmission::printAddObjectError("GPS_CTRL", objects::GPS_CONTROLLER);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* OBSW_ADD_ACS_HANDLERS */
|
#endif /* OBSW_ADD_ACS_HANDLERS */
|
||||||
|
|
||||||
|
PeriodicTaskIF* sysTask = factory->createPeriodicTask(
|
||||||
|
"SYS_TASK", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
|
||||||
|
result = sysTask->addComponent(objects::ACS_BOARD_ASS);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
initmission::printAddObjectError("ACS_ASS", objects::ACS_BOARD_ASS);
|
||||||
|
}
|
||||||
|
result = sysTask->addComponent(objects::SUS_BOARD_ASS);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
initmission::printAddObjectError("SUS_ASS", objects::SUS_BOARD_ASS);
|
||||||
|
}
|
||||||
|
result = sysTask->addComponent(objects::TCS_BOARD_ASS);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
initmission::printAddObjectError("TCS_BOARD_ASS", objects::TCS_BOARD_ASS);
|
||||||
|
}
|
||||||
|
|
||||||
#if BOARD_TE0720 == 0
|
#if BOARD_TE0720 == 0
|
||||||
// FS task, task interval does not matter because it runs in permanent loop, priority low
|
// FS task, task interval does not matter because it runs in permanent loop, priority low
|
||||||
// because it is a non-essential background task
|
// because it is a non-essential background task
|
||||||
@ -218,8 +234,9 @@ void initmission::initTasks() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_HANDLERS == 1
|
#if OBSW_ADD_ACS_HANDLERS == 1
|
||||||
acsCtrl->startTask();
|
acsTask->startTask();
|
||||||
#endif
|
#endif
|
||||||
|
sysTask->startTask();
|
||||||
|
|
||||||
sif::info << "Tasks started.." << std::endl;
|
sif::info << "Tasks started.." << std::endl;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
#include "ObjectFactory.h"
|
#include "ObjectFactory.h"
|
||||||
|
|
||||||
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
#include <linux/obc/AxiPtmeConfig.h>
|
#include <linux/obc/AxiPtmeConfig.h>
|
||||||
#include <linux/obc/PapbVcInterface.h>
|
#include <linux/obc/PapbVcInterface.h>
|
||||||
#include <linux/obc/PdecHandler.h>
|
#include <linux/obc/PdecHandler.h>
|
||||||
#include <linux/obc/Ptme.h>
|
#include <linux/obc/Ptme.h>
|
||||||
#include <linux/obc/PtmeConfig.h>
|
#include <linux/obc/PtmeConfig.h>
|
||||||
|
#include <mission/system/AcsBoardFdir.h>
|
||||||
|
#include <mission/system/RtdFdir.h>
|
||||||
|
#include <mission/system/SusAssembly.h>
|
||||||
|
#include <mission/system/SusFdir.h>
|
||||||
|
#include <mission/system/TcsBoardAssembly.h>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
||||||
@ -84,6 +90,7 @@
|
|||||||
#include "mission/devices/devicedefinitions/SusDefinitions.h"
|
#include "mission/devices/devicedefinitions/SusDefinitions.h"
|
||||||
#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h"
|
#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h"
|
||||||
#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h"
|
#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h"
|
||||||
|
#include "mission/system/AcsBoardAssembly.h"
|
||||||
#include "mission/tmtc/CCSDSHandler.h"
|
#include "mission/tmtc/CCSDSHandler.h"
|
||||||
#include "mission/tmtc/VirtualChannel.h"
|
#include "mission/tmtc/VirtualChannel.h"
|
||||||
#include "mission/utility/TmFunnel.h"
|
#include "mission/utility/TmFunnel.h"
|
||||||
@ -125,18 +132,19 @@ void ObjectFactory::produce(void* args) {
|
|||||||
UartComIF* uartComIF = nullptr;
|
UartComIF* uartComIF = nullptr;
|
||||||
SpiComIF* spiComIF = nullptr;
|
SpiComIF* spiComIF = nullptr;
|
||||||
I2cComIF* i2cComIF = nullptr;
|
I2cComIF* i2cComIF = nullptr;
|
||||||
|
PowerSwitchIF* pwrSwitcher = nullptr;
|
||||||
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiComIF, &i2cComIF);
|
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiComIF, &i2cComIF);
|
||||||
createTmpComponents();
|
createTmpComponents();
|
||||||
#if BOARD_TE0720 == 0
|
#if BOARD_TE0720 == 0
|
||||||
new CoreController(objects::CORE_CONTROLLER);
|
new CoreController(objects::CORE_CONTROLLER);
|
||||||
|
|
||||||
gpioCallbacks::disableAllDecoder();
|
gpioCallbacks::disableAllDecoder();
|
||||||
createPcduComponents(gpioComIF);
|
createPcduComponents(gpioComIF, &pwrSwitcher);
|
||||||
createRadSensorComponent(gpioComIF);
|
createRadSensorComponent(gpioComIF);
|
||||||
createSunSensorComponents(gpioComIF, spiComIF);
|
createSunSensorComponents(gpioComIF, spiComIF, pwrSwitcher);
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_BOARD == 1
|
#if OBSW_ADD_ACS_BOARD == 1
|
||||||
createAcsBoardComponents(gpioComIF, uartComIF);
|
createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
createHeaterComponents();
|
createHeaterComponents();
|
||||||
@ -145,7 +153,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#if OBSW_ADD_SYRLINKS == 1
|
#if OBSW_ADD_SYRLINKS == 1
|
||||||
createSyrlinksComponents();
|
createSyrlinksComponents();
|
||||||
#endif /* OBSW_ADD_SYRLINKS == 1 */
|
#endif /* OBSW_ADD_SYRLINKS == 1 */
|
||||||
createRtdComponents(gpioComIF);
|
createRtdComponents(gpioComIF, pwrSwitcher);
|
||||||
|
|
||||||
#if OBSW_ADD_MGT == 1
|
#if OBSW_ADD_MGT == 1
|
||||||
I2cCookie* imtqI2cCookie =
|
I2cCookie* imtqI2cCookie =
|
||||||
@ -264,7 +272,7 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, Ua
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher) {
|
||||||
CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_LENGTH, addresses::P60DOCK);
|
CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_LENGTH, addresses::P60DOCK);
|
||||||
CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU1);
|
CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU1);
|
||||||
CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU2);
|
CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU2);
|
||||||
@ -279,7 +287,7 @@ void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF) {
|
|||||||
new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie);
|
new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie);
|
||||||
pdu2handler->assignChannelHookFunction(&pcdu::switchCallback, gpioComIF);
|
pdu2handler->assignChannelHookFunction(&pcdu::switchCallback, gpioComIF);
|
||||||
ACUHandler* acuhandler = new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie);
|
ACUHandler* acuhandler = new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie);
|
||||||
new PCDUHandler(objects::PCDU_HANDLER, 50);
|
auto pcduHandler = new PCDUHandler(objects::PCDU_HANDLER, 50);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setting PCDU devices to mode normal immediately after start up because PCDU is always
|
* Setting PCDU devices to mode normal immediately after start up because PCDU is always
|
||||||
@ -289,6 +297,9 @@ void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF) {
|
|||||||
pdu1handler->setModeNormal();
|
pdu1handler->setModeNormal();
|
||||||
pdu2handler->setModeNormal();
|
pdu2handler->setModeNormal();
|
||||||
acuhandler->setModeNormal();
|
acuhandler->setModeNormal();
|
||||||
|
if (pwrSwitcher != nullptr) {
|
||||||
|
*pwrSwitcher = pcduHandler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
|
||||||
@ -310,13 +321,17 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
|
|||||||
auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF,
|
auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF,
|
||||||
spiCookieRadSensor, gpioComIF);
|
spiCookieRadSensor, gpioComIF);
|
||||||
static_cast<void>(radSensor);
|
static_cast<void>(radSensor);
|
||||||
#if OBSW_TEST_RAD_SENSOR == 1
|
// The radiation sensor ADC is powered by the 5V stack connector which should always be on
|
||||||
radSensor->setStartUpImmediately();
|
radSensor->setStartUpImmediately();
|
||||||
|
// It's a simple sensor, so just to to normal mode immediately
|
||||||
radSensor->setToGoToNormalModeImmediately();
|
radSensor->setToGoToNormalModeImmediately();
|
||||||
|
#if OBSW_DEBUG_RAD_SENSOR == 1
|
||||||
|
radSensor->enablePeriodicDataPrint(true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF) {
|
void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
|
||||||
|
PowerSwitchIF* pwrSwitcher) {
|
||||||
using namespace gpio;
|
using namespace gpio;
|
||||||
GpioCookie* gpioCookieSus = new GpioCookie();
|
GpioCookie* gpioCookieSus = new GpioCookie();
|
||||||
GpioCallback* susgpio = nullptr;
|
GpioCallback* susgpio = nullptr;
|
||||||
@ -360,123 +375,118 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI
|
|||||||
|
|
||||||
gpioComIF->addGpios(gpioCookieSus);
|
gpioComIF->addGpios(gpioCookieSus);
|
||||||
|
|
||||||
|
SusFdir* fdir = nullptr;
|
||||||
|
std::array<SusHandler*, 12> susHandlers = {};
|
||||||
#if OBSW_ADD_SUN_SENSORS == 1
|
#if OBSW_ADD_SUN_SENSORS == 1
|
||||||
SpiCookie* spiCookie =
|
SpiCookie* spiCookie =
|
||||||
new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
SusHandler* susHandler0 = new SusHandler(objects::SUS_0, 0, objects::SPI_COM_IF, spiCookie);
|
susHandlers[0] = new SusHandler(objects::SUS_0, 0, objects::SPI_COM_IF, spiCookie);
|
||||||
|
fdir = new SusFdir(objects::SUS_0);
|
||||||
|
susHandlers[0]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[0]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[1] = new SusHandler(objects::SUS_1, 1, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler1 = new SusHandler(objects::SUS_1, 1, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_1);
|
||||||
|
susHandlers[1]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[1]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[2] = new SusHandler(objects::SUS_2, 2, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler2 = new SusHandler(objects::SUS_2, 2, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_2);
|
||||||
|
susHandlers[2]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[2]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV),
|
||||||
new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV),
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[3] = new SusHandler(objects::SUS_3, 3, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler3 = new SusHandler(objects::SUS_3, 3, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_3);
|
||||||
|
susHandlers[3]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[3]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV),
|
||||||
new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV),
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[4] = new SusHandler(objects::SUS_4, 4, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler4 = new SusHandler(objects::SUS_4, 4, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_4);
|
||||||
|
susHandlers[4]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[4]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV),
|
||||||
new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV),
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[5] = new SusHandler(objects::SUS_5, 5, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler5 = new SusHandler(objects::SUS_5, 5, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_5);
|
||||||
|
susHandlers[5]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[5]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[6] = new SusHandler(objects::SUS_6, 6, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler6 = new SusHandler(objects::SUS_6, 6, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_6);
|
||||||
|
susHandlers[6]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[6]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[7] = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler7 = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_7);
|
||||||
|
susHandlers[7]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[7]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[8] = new SusHandler(objects::SUS_8, 8, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler8 = new SusHandler(objects::SUS_8, 8, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_8);
|
||||||
|
susHandlers[8]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[8]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[9] = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler9 = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_9);
|
||||||
|
susHandlers[9]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[9]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[10] = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler10 = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_10);
|
||||||
|
susHandlers[10]->setParent(objects::SUS_BOARD_ASS);
|
||||||
|
susHandlers[10]->setCustomFdir(fdir);
|
||||||
|
|
||||||
spiCookie =
|
spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV,
|
||||||
new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE,
|
SUS::MAX_CMD_SIZE, spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
||||||
spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
|
susHandlers[11] = new SusHandler(objects::SUS_11, 11, objects::SPI_COM_IF, spiCookie);
|
||||||
SusHandler* susHandler11 = new SusHandler(objects::SUS_11, 11, objects::SPI_COM_IF, spiCookie);
|
fdir = new SusFdir(objects::SUS_11);
|
||||||
static_cast<void>(susHandler0);
|
susHandlers[11]->setParent(objects::SUS_BOARD_ASS);
|
||||||
static_cast<void>(susHandler1);
|
susHandlers[11]->setCustomFdir(fdir);
|
||||||
static_cast<void>(susHandler2);
|
|
||||||
static_cast<void>(susHandler3);
|
for (auto& sus : susHandlers) {
|
||||||
static_cast<void>(susHandler4);
|
if (sus != nullptr) {
|
||||||
static_cast<void>(susHandler5);
|
|
||||||
static_cast<void>(susHandler6);
|
|
||||||
static_cast<void>(susHandler7);
|
|
||||||
static_cast<void>(susHandler8);
|
|
||||||
static_cast<void>(susHandler9);
|
|
||||||
static_cast<void>(susHandler10);
|
|
||||||
static_cast<void>(susHandler11);
|
|
||||||
#if OBSW_TEST_SUS == 1
|
#if OBSW_TEST_SUS == 1
|
||||||
susHandler0->setStartUpImmediately();
|
sus->setStartUpImmediately();
|
||||||
susHandler1->setStartUpImmediately();
|
sus->setToGoToNormalMode(true);
|
||||||
susHandler2->setStartUpImmediately();
|
#endif
|
||||||
susHandler3->setStartUpImmediately();
|
|
||||||
susHandler4->setStartUpImmediately();
|
|
||||||
susHandler5->setStartUpImmediately();
|
|
||||||
susHandler6->setStartUpImmediately();
|
|
||||||
susHandler7->setStartUpImmediately();
|
|
||||||
susHandler8->setStartUpImmediately();
|
|
||||||
susHandler9->setStartUpImmediately();
|
|
||||||
susHandler10->setStartUpImmediately();
|
|
||||||
susHandler11->setStartUpImmediately();
|
|
||||||
susHandler0->setToGoToNormalMode(true);
|
|
||||||
susHandler1->setToGoToNormalMode(true);
|
|
||||||
susHandler2->setToGoToNormalMode(true);
|
|
||||||
susHandler3->setToGoToNormalMode(true);
|
|
||||||
susHandler4->setToGoToNormalMode(true);
|
|
||||||
susHandler5->setToGoToNormalMode(true);
|
|
||||||
susHandler6->setToGoToNormalMode(true);
|
|
||||||
susHandler7->setToGoToNormalMode(true);
|
|
||||||
susHandler8->setToGoToNormalMode(true);
|
|
||||||
susHandler9->setToGoToNormalMode(true);
|
|
||||||
susHandler10->setToGoToNormalMode(true);
|
|
||||||
susHandler11->setToGoToNormalMode(true);
|
|
||||||
#if OBSW_DEBUG_SUS == 1
|
#if OBSW_DEBUG_SUS == 1
|
||||||
susHandler0->enablePeriodicPrintout(true, 3);
|
sus->enablePeriodicPrintout(true, 3);
|
||||||
susHandler1->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler2->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler3->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler4->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler5->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler6->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler7->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler8->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler9->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler10->enablePeriodicPrintout(true, 3);
|
|
||||||
susHandler11->enablePeriodicPrintout(true, 3);
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
}
|
||||||
|
}
|
||||||
|
std::array<object_id_t, 12> susIds = {objects::SUS_0, objects::SUS_1, objects::SUS_2,
|
||||||
|
objects::SUS_3, objects::SUS_4, objects::SUS_5,
|
||||||
|
objects::SUS_6, objects::SUS_7, objects::SUS_8,
|
||||||
|
objects::SUS_9, objects::SUS_10, objects::SUS_11};
|
||||||
|
SusAssHelper susAssHelper = SusAssHelper(susIds);
|
||||||
|
auto susAss =
|
||||||
|
new SusAssembly(objects::SUS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher, susAssHelper);
|
||||||
|
static_cast<void>(susAss);
|
||||||
#endif /* OBSW_ADD_SUN_SENSORS == 1 */
|
#endif /* OBSW_ADD_SUN_SENSORS == 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF) {
|
void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF,
|
||||||
|
PowerSwitchIF* pwrSwitcher) {
|
||||||
using namespace gpio;
|
using namespace gpio;
|
||||||
GpioCookie* gpioCookieAcsBoard = new GpioCookie();
|
GpioCookie* gpioCookieAcsBoard = new GpioCookie();
|
||||||
|
|
||||||
@ -575,6 +585,8 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
Levels::LOW);
|
Levels::LOW);
|
||||||
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio);
|
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio);
|
||||||
gpioComIF->addGpios(gpioCookieAcsBoard);
|
gpioComIF->addGpios(gpioCookieAcsBoard);
|
||||||
|
AcsBoardFdir* fdir = nullptr;
|
||||||
|
static_cast<void>(fdir);
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_HANDLERS == 1
|
#if OBSW_ADD_ACS_HANDLERS == 1
|
||||||
std::string spiDev = q7s::SPI_DEFAULT_DEV;
|
std::string spiDev = q7s::SPI_DEFAULT_DEV;
|
||||||
@ -583,6 +595,8 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
||||||
auto mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_0_LIS3_HANDLER, objects::SPI_COM_IF,
|
auto mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_0_LIS3_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, spi::LIS3_TRANSITION_DELAY);
|
spiCookie, spi::LIS3_TRANSITION_DELAY);
|
||||||
|
fdir = new AcsBoardFdir(objects::MGM_0_LIS3_HANDLER);
|
||||||
|
mgmLis3Handler->setCustomFdir(fdir);
|
||||||
static_cast<void>(mgmLis3Handler);
|
static_cast<void>(mgmLis3Handler);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmLis3Handler->setStartUpImmediately();
|
mgmLis3Handler->setStartUpImmediately();
|
||||||
@ -597,6 +611,9 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
||||||
auto mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_COM_IF,
|
auto mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, spi::RM3100_TRANSITION_DELAY);
|
spiCookie, spi::RM3100_TRANSITION_DELAY);
|
||||||
|
fdir = new AcsBoardFdir(objects::MGM_1_RM3100_HANDLER);
|
||||||
|
mgmRm3100Handler->setCustomFdir(fdir);
|
||||||
|
mgmRm3100Handler->setParent(objects::ACS_BOARD_ASS);
|
||||||
static_cast<void>(mgmRm3100Handler);
|
static_cast<void>(mgmRm3100Handler);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmRm3100Handler->setStartUpImmediately();
|
mgmRm3100Handler->setStartUpImmediately();
|
||||||
@ -611,6 +628,10 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
|
||||||
mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_COM_IF,
|
mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, spi::LIS3_TRANSITION_DELAY);
|
spiCookie, spi::LIS3_TRANSITION_DELAY);
|
||||||
|
fdir = new AcsBoardFdir(objects::MGM_2_LIS3_HANDLER);
|
||||||
|
mgmLis3Handler->setCustomFdir(fdir);
|
||||||
|
mgmLis3Handler->setParent(objects::ACS_BOARD_ASS);
|
||||||
|
static_cast<void>(mgmLis3Handler);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmLis3Handler->setStartUpImmediately();
|
mgmLis3Handler->setStartUpImmediately();
|
||||||
mgmLis3Handler->setToGoToNormalMode(true);
|
mgmLis3Handler->setToGoToNormalMode(true);
|
||||||
@ -618,12 +639,14 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
#if OBSW_DEBUG_ACS == 1
|
#if OBSW_DEBUG_ACS == 1
|
||||||
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
|
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spiCookie =
|
spiCookie =
|
||||||
new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, spiDev,
|
new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, spiDev,
|
||||||
RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
|
||||||
mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_COM_IF,
|
mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, spi::RM3100_TRANSITION_DELAY);
|
spiCookie, spi::RM3100_TRANSITION_DELAY);
|
||||||
|
fdir = new AcsBoardFdir(objects::MGM_3_RM3100_HANDLER);
|
||||||
|
mgmRm3100Handler->setCustomFdir(fdir);
|
||||||
|
mgmRm3100Handler->setParent(objects::ACS_BOARD_ASS);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
mgmRm3100Handler->setStartUpImmediately();
|
mgmRm3100Handler->setStartUpImmediately();
|
||||||
mgmRm3100Handler->setToGoToNormalMode(true);
|
mgmRm3100Handler->setToGoToNormalMode(true);
|
||||||
@ -639,6 +662,9 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
spi::DEFAULT_ADIS16507_SPEED);
|
spi::DEFAULT_ADIS16507_SPEED);
|
||||||
auto adisHandler = new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF,
|
auto adisHandler = new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, ADIS1650X::Type::ADIS16505);
|
spiCookie, ADIS1650X::Type::ADIS16505);
|
||||||
|
fdir = new AcsBoardFdir(objects::GYRO_0_ADIS_HANDLER);
|
||||||
|
adisHandler->setCustomFdir(fdir);
|
||||||
|
adisHandler->setParent(objects::ACS_BOARD_ASS);
|
||||||
static_cast<void>(adisHandler);
|
static_cast<void>(adisHandler);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
adisHandler->setStartUpImmediately();
|
adisHandler->setStartUpImmediately();
|
||||||
@ -654,6 +680,9 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
||||||
auto gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_1_L3G_HANDLER, objects::SPI_COM_IF,
|
auto gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_1_L3G_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, spi::L3G_TRANSITION_DELAY);
|
spiCookie, spi::L3G_TRANSITION_DELAY);
|
||||||
|
fdir = new AcsBoardFdir(objects::GYRO_1_L3G_HANDLER);
|
||||||
|
gyroL3gHandler->setCustomFdir(fdir);
|
||||||
|
gyroL3gHandler->setParent(objects::ACS_BOARD_ASS);
|
||||||
static_cast<void>(gyroL3gHandler);
|
static_cast<void>(gyroL3gHandler);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
gyroL3gHandler->setStartUpImmediately();
|
gyroL3gHandler->setStartUpImmediately();
|
||||||
@ -669,6 +698,9 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
spi::DEFAULT_ADIS16507_SPEED);
|
spi::DEFAULT_ADIS16507_SPEED);
|
||||||
adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF,
|
adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, ADIS1650X::Type::ADIS16505);
|
spiCookie, ADIS1650X::Type::ADIS16505);
|
||||||
|
fdir = new AcsBoardFdir(objects::GYRO_2_ADIS_HANDLER);
|
||||||
|
adisHandler->setCustomFdir(fdir);
|
||||||
|
adisHandler->setParent(objects::ACS_BOARD_ASS);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
adisHandler->setStartUpImmediately();
|
adisHandler->setStartUpImmediately();
|
||||||
adisHandler->setToGoToNormalModeImmediately();
|
adisHandler->setToGoToNormalModeImmediately();
|
||||||
@ -679,12 +711,15 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
|
||||||
gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_3_L3G_HANDLER, objects::SPI_COM_IF,
|
gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_3_L3G_HANDLER, objects::SPI_COM_IF,
|
||||||
spiCookie, spi::L3G_TRANSITION_DELAY);
|
spiCookie, spi::L3G_TRANSITION_DELAY);
|
||||||
|
fdir = new AcsBoardFdir(objects::GYRO_3_L3G_HANDLER);
|
||||||
|
gyroL3gHandler->setCustomFdir(fdir);
|
||||||
|
gyroL3gHandler->setParent(objects::ACS_BOARD_ASS);
|
||||||
#if OBSW_TEST_ACS == 1
|
#if OBSW_TEST_ACS == 1
|
||||||
gyroL3gHandler->setStartUpImmediately();
|
gyroL3gHandler->setStartUpImmediately();
|
||||||
gyroL3gHandler->setToGoToNormalMode(true);
|
gyroL3gHandler->setToGoToNormalMode(true);
|
||||||
|
#endif
|
||||||
#if OBSW_DEBUG_ACS == 1
|
#if OBSW_DEBUG_ACS == 1
|
||||||
gyroL3gHandler->enablePeriodicPrintouts(true, 10);
|
gyroL3gHandler->enablePeriodicPrintouts(true, 10);
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool debugGps = false;
|
bool debugGps = false;
|
||||||
@ -700,6 +735,23 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
|
|||||||
auto gpsHandler0 =
|
auto gpsHandler0 =
|
||||||
new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps);
|
new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps);
|
||||||
gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0);
|
gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0);
|
||||||
|
|
||||||
|
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, objects::NO_OBJECT, pwrSwitcher,
|
||||||
|
acsBoardHelper, gpioComIF);
|
||||||
|
static_cast<void>(acsAss);
|
||||||
|
#if OBSW_TEST_ACS_BOARD_ASS == 1
|
||||||
|
CommandMessage msg;
|
||||||
|
ModeMessage::setModeMessage(&msg, ModeMessage::CMD_MODE_COMMAND, DeviceHandlerIF::MODE_NORMAL,
|
||||||
|
duallane::A_SIDE);
|
||||||
|
ReturnValue_t result = MessageQueueSenderIF::sendMessage(acsAss->getCommandQueue(), &msg);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
sif::warning << "Sending mode command failed" << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* OBSW_ADD_ACS_HANDLERS == 1 */
|
#endif /* OBSW_ADD_ACS_HANDLERS == 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -778,7 +830,7 @@ void ObjectFactory::createSyrlinksComponents() {
|
|||||||
new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF, syrlinksUartCookie);
|
new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF, syrlinksUartCookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher) {
|
||||||
using namespace gpio;
|
using namespace gpio;
|
||||||
GpioCookie* rtdGpioCookie = new GpioCookie;
|
GpioCookie* rtdGpioCookie = new GpioCookie;
|
||||||
|
|
||||||
@ -833,142 +885,58 @@ void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) {
|
|||||||
|
|
||||||
gpioComIF->addGpios(rtdGpioCookie);
|
gpioComIF->addGpios(rtdGpioCookie);
|
||||||
|
|
||||||
|
static constexpr uint8_t NUMBER_RTDS = 16;
|
||||||
#if OBSW_ADD_RTD_DEVICES == 1
|
#if OBSW_ADD_RTD_DEVICES == 1
|
||||||
SpiCookie* spiRtdIc0 =
|
std::array<std::pair<address_t, gpioId_t>, NUMBER_RTDS> cookieArgs = {{
|
||||||
new SpiCookie(addresses::RTD_IC_3, gpioIds::RTD_IC_3, q7s::SPI_DEFAULT_DEV,
|
{addresses::RTD_IC_3, gpioIds::RTD_IC_3},
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
{addresses::RTD_IC_4, gpioIds::RTD_IC_4},
|
||||||
SpiCookie* spiRtdIc1 =
|
{addresses::RTD_IC_5, gpioIds::RTD_IC_5},
|
||||||
new SpiCookie(addresses::RTD_IC_4, gpioIds::RTD_IC_4, q7s::SPI_DEFAULT_DEV,
|
{addresses::RTD_IC_6, gpioIds::RTD_IC_6},
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
{addresses::RTD_IC_7, gpioIds::RTD_IC_7},
|
||||||
SpiCookie* spiRtdIc2 =
|
{addresses::RTD_IC_8, gpioIds::RTD_IC_8},
|
||||||
new SpiCookie(addresses::RTD_IC_5, gpioIds::RTD_IC_5, q7s::SPI_DEFAULT_DEV,
|
{addresses::RTD_IC_9, gpioIds::RTD_IC_9},
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
{addresses::RTD_IC_10, gpioIds::RTD_IC_10},
|
||||||
SpiCookie* spiRtdIc3 =
|
{addresses::RTD_IC_11, gpioIds::RTD_IC_11},
|
||||||
new SpiCookie(addresses::RTD_IC_6, gpioIds::RTD_IC_6, q7s::SPI_DEFAULT_DEV,
|
{addresses::RTD_IC_12, gpioIds::RTD_IC_12},
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
{addresses::RTD_IC_13, gpioIds::RTD_IC_13},
|
||||||
SpiCookie* spiRtdIc4 =
|
{addresses::RTD_IC_14, gpioIds::RTD_IC_14},
|
||||||
new SpiCookie(addresses::RTD_IC_7, gpioIds::RTD_IC_7, q7s::SPI_DEFAULT_DEV,
|
{addresses::RTD_IC_15, gpioIds::RTD_IC_15},
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
{addresses::RTD_IC_16, gpioIds::RTD_IC_16},
|
||||||
SpiCookie* spiRtdIc5 =
|
{addresses::RTD_IC_17, gpioIds::RTD_IC_17},
|
||||||
new SpiCookie(addresses::RTD_IC_8, gpioIds::RTD_IC_8, q7s::SPI_DEFAULT_DEV,
|
{addresses::RTD_IC_18, gpioIds::RTD_IC_18},
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
}};
|
||||||
SpiCookie* spiRtdIc6 =
|
std::array<object_id_t, NUMBER_RTDS> rtdIds = {
|
||||||
new SpiCookie(addresses::RTD_IC_9, gpioIds::RTD_IC_9, q7s::SPI_DEFAULT_DEV,
|
objects::RTD_IC_3, objects::RTD_IC_4, objects::RTD_IC_5, objects::RTD_IC_6,
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
objects::RTD_IC_7, objects::RTD_IC_8, objects::RTD_IC_9, objects::RTD_IC_10,
|
||||||
SpiCookie* spiRtdIc7 =
|
objects::RTD_IC_11, objects::RTD_IC_12, objects::RTD_IC_13, objects::RTD_IC_14,
|
||||||
new SpiCookie(addresses::RTD_IC_10, gpioIds::RTD_IC_10, q7s::SPI_DEFAULT_DEV,
|
objects::RTD_IC_15, objects::RTD_IC_16, objects::RTD_IC_17, objects::RTD_IC_18};
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
std::array<SpiCookie*, NUMBER_RTDS> rtdCookies = {};
|
||||||
SpiCookie* spiRtdIc8 =
|
std::array<Max31865PT1000Handler*, NUMBER_RTDS> rtds = {};
|
||||||
new SpiCookie(addresses::RTD_IC_11, gpioIds::RTD_IC_11, q7s::SPI_DEFAULT_DEV,
|
RtdFdir* rtdFdir = nullptr;
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) {
|
||||||
SpiCookie* spiRtdIc9 =
|
rtdCookies[idx] =
|
||||||
new SpiCookie(addresses::RTD_IC_12, gpioIds::RTD_IC_12, q7s::SPI_DEFAULT_DEV,
|
new SpiCookie(cookieArgs[idx].first, cookieArgs[idx].second, q7s::SPI_DEFAULT_DEV,
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
||||||
SpiCookie* spiRtdIc10 =
|
rtds[idx] = new Max31865PT1000Handler(rtdIds[idx], objects::SPI_COM_IF, rtdCookies[idx]);
|
||||||
new SpiCookie(addresses::RTD_IC_13, gpioIds::RTD_IC_13, q7s::SPI_DEFAULT_DEV,
|
rtds[idx]->setParent(objects::TCS_BOARD_ASS);
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
rtdFdir = new RtdFdir(rtdIds[idx]);
|
||||||
SpiCookie* spiRtdIc11 =
|
rtds[idx]->setCustomFdir(rtdFdir);
|
||||||
new SpiCookie(addresses::RTD_IC_14, gpioIds::RTD_IC_14, q7s::SPI_DEFAULT_DEV,
|
}
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
|
||||||
SpiCookie* spiRtdIc12 =
|
|
||||||
new SpiCookie(addresses::RTD_IC_15, gpioIds::RTD_IC_15, q7s::SPI_DEFAULT_DEV,
|
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
|
||||||
SpiCookie* spiRtdIc13 =
|
|
||||||
new SpiCookie(addresses::RTD_IC_16, gpioIds::RTD_IC_16, std::string(q7s::SPI_DEFAULT_DEV),
|
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
|
||||||
SpiCookie* spiRtdIc14 =
|
|
||||||
new SpiCookie(addresses::RTD_IC_17, gpioIds::RTD_IC_17, q7s::SPI_DEFAULT_DEV,
|
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
|
||||||
SpiCookie* spiRtdIc15 =
|
|
||||||
new SpiCookie(addresses::RTD_IC_18, gpioIds::RTD_IC_18, q7s::SPI_DEFAULT_DEV,
|
|
||||||
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
|
|
||||||
|
|
||||||
Max31865PT1000Handler* rtdIc0 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_3, objects::SPI_COM_IF, spiRtdIc0);
|
|
||||||
Max31865PT1000Handler* rtdIc1 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_4, objects::SPI_COM_IF, spiRtdIc1);
|
|
||||||
Max31865PT1000Handler* rtdIc2 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_5, objects::SPI_COM_IF, spiRtdIc2);
|
|
||||||
Max31865PT1000Handler* rtdIc3 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_6, objects::SPI_COM_IF, spiRtdIc3);
|
|
||||||
Max31865PT1000Handler* rtdIc4 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_7, objects::SPI_COM_IF, spiRtdIc4);
|
|
||||||
Max31865PT1000Handler* rtdIc5 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_8, objects::SPI_COM_IF, spiRtdIc5);
|
|
||||||
Max31865PT1000Handler* rtdIc6 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_9, objects::SPI_COM_IF, spiRtdIc6);
|
|
||||||
Max31865PT1000Handler* rtdIc7 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_10, objects::SPI_COM_IF, spiRtdIc7);
|
|
||||||
Max31865PT1000Handler* rtdIc8 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_11, objects::SPI_COM_IF, spiRtdIc8);
|
|
||||||
Max31865PT1000Handler* rtdIc9 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_12, objects::SPI_COM_IF, spiRtdIc9);
|
|
||||||
Max31865PT1000Handler* rtdIc10 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_13, objects::SPI_COM_IF, spiRtdIc10);
|
|
||||||
Max31865PT1000Handler* rtdIc11 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_14, objects::SPI_COM_IF, spiRtdIc11);
|
|
||||||
Max31865PT1000Handler* rtdIc12 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_15, objects::SPI_COM_IF, spiRtdIc12);
|
|
||||||
Max31865PT1000Handler* rtdIc13 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_16, objects::SPI_COM_IF, spiRtdIc13);
|
|
||||||
Max31865PT1000Handler* rtdIc14 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_17, objects::SPI_COM_IF, spiRtdIc14);
|
|
||||||
Max31865PT1000Handler* rtdIc15 =
|
|
||||||
new Max31865PT1000Handler(objects::RTD_IC_18, objects::SPI_COM_IF, spiRtdIc15);
|
|
||||||
|
|
||||||
#if OBSW_TEST_RTD == 1
|
#if OBSW_TEST_RTD == 1
|
||||||
rtdIc0->setStartUpImmediately();
|
for (auto& rtd : rtds) {
|
||||||
rtdIc1->setStartUpImmediately();
|
if (rtd != nullptr) {
|
||||||
rtdIc2->setStartUpImmediately();
|
rtd->setStartUpImmediately();
|
||||||
rtdIc3->setStartUpImmediately();
|
rtd->setInstantNormal(true);
|
||||||
rtdIc4->setStartUpImmediately();
|
}
|
||||||
rtdIc5->setStartUpImmediately();
|
}
|
||||||
rtdIc6->setStartUpImmediately();
|
#endif // OBSW_TEST_RTD == 1
|
||||||
rtdIc7->setStartUpImmediately();
|
TcsBoardHelper helper(rtdIds);
|
||||||
rtdIc8->setStartUpImmediately();
|
TcsBoardAssembly* tcsBoardAss =
|
||||||
rtdIc9->setStartUpImmediately();
|
new TcsBoardAssembly(objects::TCS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher,
|
||||||
rtdIc10->setStartUpImmediately();
|
pcduSwitches::Switches::PDU1_CH0_TCS_BOARD_3V3, helper);
|
||||||
rtdIc11->setStartUpImmediately();
|
static_cast<void>(tcsBoardAss);
|
||||||
rtdIc12->setStartUpImmediately();
|
#endif // OBSW_ADD_RTD_DEVICES == 1
|
||||||
rtdIc13->setStartUpImmediately();
|
|
||||||
rtdIc14->setStartUpImmediately();
|
|
||||||
rtdIc15->setStartUpImmediately();
|
|
||||||
|
|
||||||
rtdIc0->setInstantNormal(true);
|
|
||||||
rtdIc1->setInstantNormal(true);
|
|
||||||
rtdIc2->setInstantNormal(true);
|
|
||||||
rtdIc3->setInstantNormal(true);
|
|
||||||
rtdIc4->setInstantNormal(true);
|
|
||||||
rtdIc5->setInstantNormal(true);
|
|
||||||
rtdIc6->setInstantNormal(true);
|
|
||||||
rtdIc7->setInstantNormal(true);
|
|
||||||
rtdIc8->setInstantNormal(true);
|
|
||||||
rtdIc9->setInstantNormal(true);
|
|
||||||
rtdIc10->setInstantNormal(true);
|
|
||||||
rtdIc11->setInstantNormal(true);
|
|
||||||
rtdIc12->setInstantNormal(true);
|
|
||||||
rtdIc13->setInstantNormal(true);
|
|
||||||
rtdIc14->setInstantNormal(true);
|
|
||||||
rtdIc15->setInstantNormal(true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static_cast<void>(rtdIc0);
|
|
||||||
static_cast<void>(rtdIc1);
|
|
||||||
static_cast<void>(rtdIc2);
|
|
||||||
static_cast<void>(rtdIc3);
|
|
||||||
static_cast<void>(rtdIc4);
|
|
||||||
static_cast<void>(rtdIc5);
|
|
||||||
static_cast<void>(rtdIc6);
|
|
||||||
static_cast<void>(rtdIc7);
|
|
||||||
static_cast<void>(rtdIc8);
|
|
||||||
static_cast<void>(rtdIc9);
|
|
||||||
static_cast<void>(rtdIc10);
|
|
||||||
static_cast<void>(rtdIc11);
|
|
||||||
static_cast<void>(rtdIc12);
|
|
||||||
static_cast<void>(rtdIc13);
|
|
||||||
static_cast<void>(rtdIc14);
|
|
||||||
static_cast<void>(rtdIc15);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) {
|
||||||
@ -1224,11 +1192,11 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF*
|
|||||||
// static_cast<void>(plPcduHandler);
|
// static_cast<void>(plPcduHandler);
|
||||||
#if OBSW_TEST_PL_PCDU == 1
|
#if OBSW_TEST_PL_PCDU == 1
|
||||||
plPcduHandler->setStartUpImmediately();
|
plPcduHandler->setStartUpImmediately();
|
||||||
|
#endif
|
||||||
#if OBSW_DEBUG_PL_PCDU == 1
|
#if OBSW_DEBUG_PL_PCDU == 1
|
||||||
plPcduHandler->setToGoToNormalModeImmediately(true);
|
plPcduHandler->setToGoToNormalModeImmediately(true);
|
||||||
plPcduHandler->enablePeriodicPrintout(true, 10);
|
plPcduHandler->enablePeriodicPrintout(true, 10);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
|
void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
|
||||||
|
@ -5,6 +5,7 @@ class LinuxLibgpioIF;
|
|||||||
class UartComIF;
|
class UartComIF;
|
||||||
class SpiComIF;
|
class SpiComIF;
|
||||||
class I2cComIF;
|
class I2cComIF;
|
||||||
|
class PowerSwitchIF;
|
||||||
|
|
||||||
namespace ObjectFactory {
|
namespace ObjectFactory {
|
||||||
|
|
||||||
@ -13,17 +14,18 @@ void produce(void* args);
|
|||||||
|
|
||||||
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
|
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
|
||||||
SpiComIF** spiComIF, I2cComIF** i2cComIF);
|
SpiComIF** spiComIF, I2cComIF** i2cComIF);
|
||||||
|
void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher);
|
||||||
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF);
|
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF);
|
||||||
void createTmpComponents();
|
void createTmpComponents();
|
||||||
void createPcduComponents(LinuxLibgpioIF* gpioComIF);
|
|
||||||
void createRadSensorComponent(LinuxLibgpioIF* gpioComIF);
|
void createRadSensorComponent(LinuxLibgpioIF* gpioComIF);
|
||||||
void createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF);
|
void createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
|
||||||
void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF);
|
PowerSwitchIF* pwrSwitcher);
|
||||||
|
void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF,
|
||||||
|
PowerSwitchIF* pwrSwitcher);
|
||||||
void createHeaterComponents();
|
void createHeaterComponents();
|
||||||
void createSolarArrayDeploymentComponents();
|
void createSolarArrayDeploymentComponents();
|
||||||
void createSyrlinksComponents();
|
void createSyrlinksComponents();
|
||||||
void createRtdComponents(LinuxLibgpioIF* gpioComIF);
|
void createRtdComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
|
||||||
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF);
|
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF);
|
||||||
void createCcsdsComponents(LinuxLibgpioIF* gpioComIF);
|
void createCcsdsComponents(LinuxLibgpioIF* gpioComIF);
|
||||||
void createTestComponents(LinuxLibgpioIF* gpioComIF);
|
void createTestComponents(LinuxLibgpioIF* gpioComIF);
|
||||||
|
@ -93,6 +93,11 @@ enum commonObjects: uint32_t {
|
|||||||
PLOC_MPSOC_HELPER = 0x44330003,
|
PLOC_MPSOC_HELPER = 0x44330003,
|
||||||
AXI_PTME_CONFIG = 44330004,
|
AXI_PTME_CONFIG = 44330004,
|
||||||
PTME_CONFIG = 44330005,
|
PTME_CONFIG = 44330005,
|
||||||
|
|
||||||
|
// 0x73 ('s') for assemblies and system/subsystem components
|
||||||
|
ACS_BOARD_ASS = 0x73000001,
|
||||||
|
SUS_BOARD_ASS = 0x73000002,
|
||||||
|
TCS_BOARD_ASS = 0x73000003
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,9 @@ enum: uint8_t {
|
|||||||
STR_HELPER = 120,
|
STR_HELPER = 120,
|
||||||
PLOC_MPSOC_HELPER = 121,
|
PLOC_MPSOC_HELPER = 121,
|
||||||
PL_PCDU_HANDLER = 121,
|
PL_PCDU_HANDLER = 121,
|
||||||
|
ACS_BOARD_ASS = 122,
|
||||||
|
SUS_BOARD_ASS = 123,
|
||||||
|
TCS_BOARD_ASS = 124,
|
||||||
COMMON_SUBSYSTEM_ID_END
|
COMMON_SUBSYSTEM_ID_END
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3;
|
|||||||
* the decoder and buffer circuits. Thus frequency is here defined to 1 MHz.
|
* the decoder and buffer circuits. Thus frequency is here defined to 1 MHz.
|
||||||
*/
|
*/
|
||||||
static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000;
|
static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000;
|
||||||
|
static constexpr spi::SpiModes SUS_MAX_1227_MODE = spi::SpiModes::MODE_3;
|
||||||
|
|
||||||
static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000;
|
static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000;
|
||||||
static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3;
|
static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3;
|
||||||
|
2
fsfw
2
fsfw
@ -1 +1 @@
|
|||||||
Subproject commit bac8b4088009a71afbb0225e634dabcbff0d9ec1
|
Subproject commit 79615e47e427a42435ca0c25ded27418850d5022
|
1
generators/.gitignore
vendored
1
generators/.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
.~lock*
|
.~lock*
|
||||||
|
/venv
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/fsfwgen.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/gen.py" />
|
||||||
<option name="PARAMETERS" value="events" />
|
<option name="PARAMETERS" value="events" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="false" />
|
<option name="EMULATE_TERMINAL" value="false" />
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/fsfwgen.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/gen.py" />
|
||||||
<option name="PARAMETERS" value="objects" />
|
<option name="PARAMETERS" value="objects" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="false" />
|
<option name="EMULATE_TERMINAL" value="false" />
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/fsfwgen.py" />
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/gen.py" />
|
||||||
<option name="PARAMETERS" value="returnvalues" />
|
<option name="PARAMETERS" value="returnvalues" />
|
||||||
<option name="SHOW_COMMAND_LINE" value="false" />
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
<option name="EMULATE_TERMINAL" value="false" />
|
<option name="EMULATE_TERMINAL" value="false" />
|
||||||
|
@ -1,158 +1,169 @@
|
|||||||
2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2200;0x0898;STORE_SEND_WRITE_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2201;0x0899;STORE_WRITE_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2201;0x0899;STORE_WRITE_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2202;0x089a;STORE_SEND_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2202;0x089a;STORE_SEND_READ_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2203;0x089b;STORE_READ_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2203;0x089b;STORE_READ_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2204;0x089c;UNEXPECTED_MSG;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2204;0x089c;UNEXPECTED_MSG;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2205;0x089d;STORING_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2205;0x089d;STORING_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2206;0x089e;TM_DUMP_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2206;0x089e;TM_DUMP_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2207;0x089f;STORE_INIT_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2207;0x089f;STORE_INIT_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2208;0x08a0;STORE_INIT_EMPTY;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2208;0x08a0;STORE_INIT_EMPTY;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2209;0x08a1;STORE_CONTENT_CORRUPTED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2210;0x08a2;STORE_INITIALIZE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2210;0x08a2;STORE_INITIALIZE;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2211;0x08a3;INIT_DONE;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2211;0x08a3;INIT_DONE;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2212;0x08a4;DUMP_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2212;0x08a4;DUMP_FINISHED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2213;0x08a5;DELETION_FINISHED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2213;0x08a5;DELETION_FINISHED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2214;0x08a6;DELETION_FAILED;LOW;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2214;0x08a6;DELETION_FAILED;LOW;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;;fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h
|
2215;0x08a7;AUTO_CATALOGS_SENDING_FAILED;INFO;;fsfw\src\fsfw\tmstorage\TmStoreBackendIF.h
|
||||||
2600;0x0a28;GET_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
|
2600;0x0a28;GET_DATA_FAILED;LOW;;fsfw\src\fsfw\storagemanager\StorageManagerIF.h
|
||||||
2601;0x0a29;STORE_DATA_FAILED;LOW;;fsfw/src/fsfw/storagemanager/StorageManagerIF.h
|
2601;0x0a29;STORE_DATA_FAILED;LOW;;fsfw\src\fsfw\storagemanager\StorageManagerIF.h
|
||||||
2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2800;0x0af0;DEVICE_BUILDING_COMMAND_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2801;0x0af1;DEVICE_SENDING_COMMAND_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2802;0x0af2;DEVICE_REQUESTING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2803;0x0af3;DEVICE_READING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2804;0x0af4;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2805;0x0af5;DEVICE_MISSED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2805;0x0af5;DEVICE_MISSED_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2806;0x0af6;DEVICE_UNKNOWN_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2807;0x0af7;DEVICE_UNREQUESTED_REPLY;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2808;0x0af8;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2808;0x0af8;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2809;0x0af9;MONITORING_LIMIT_EXCEEDED;LOW;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2810;0x0afa;MONITORING_AMBIGUOUS;HIGH;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;;fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h
|
2811;0x0afb;DEVICE_WANTS_HARD_REBOOT;HIGH;;fsfw\src\fsfw\devicehandlers\DeviceHandlerIF.h
|
||||||
4201;0x1069;FUSE_CURRENT_HIGH;LOW;;fsfw/src/fsfw/power/Fuse.h
|
4201;0x1069;FUSE_CURRENT_HIGH;LOW;;fsfw\src\fsfw\power\Fuse.h
|
||||||
4202;0x106a;FUSE_WENT_OFF;LOW;;fsfw/src/fsfw/power/Fuse.h
|
4202;0x106a;FUSE_WENT_OFF;LOW;;fsfw\src\fsfw\power\Fuse.h
|
||||||
4204;0x106c;POWER_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h
|
4204;0x106c;POWER_ABOVE_HIGH_LIMIT;LOW;;fsfw\src\fsfw\power\Fuse.h
|
||||||
4205;0x106d;POWER_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/power/Fuse.h
|
4205;0x106d;POWER_BELOW_LOW_LIMIT;LOW;;fsfw\src\fsfw\power\Fuse.h
|
||||||
4300;0x10cc;SWITCH_WENT_OFF;LOW;;fsfw/src/fsfw/power/PowerSwitchIF.h
|
4300;0x10cc;SWITCH_WENT_OFF;LOW;;fsfw\src\fsfw\power\PowerSwitchIF.h
|
||||||
5000;0x1388;HEATER_ON;INFO;;fsfw/src/fsfw/thermal/Heater.h
|
5000;0x1388;HEATER_ON;INFO;;fsfw\src\fsfw\thermal\Heater.h
|
||||||
5001;0x1389;HEATER_OFF;INFO;;fsfw/src/fsfw/thermal/Heater.h
|
5001;0x1389;HEATER_OFF;INFO;;fsfw\src\fsfw\thermal\Heater.h
|
||||||
5002;0x138a;HEATER_TIMEOUT;LOW;;fsfw/src/fsfw/thermal/Heater.h
|
5002;0x138a;HEATER_TIMEOUT;LOW;;fsfw\src\fsfw\thermal\Heater.h
|
||||||
5003;0x138b;HEATER_STAYED_ON;LOW;;fsfw/src/fsfw/thermal/Heater.h
|
5003;0x138b;HEATER_STAYED_ON;LOW;;fsfw\src\fsfw\thermal\Heater.h
|
||||||
5004;0x138c;HEATER_STAYED_OFF;LOW;;fsfw/src/fsfw/thermal/Heater.h
|
5004;0x138c;HEATER_STAYED_OFF;LOW;;fsfw\src\fsfw\thermal\Heater.h
|
||||||
5200;0x1450;TEMP_SENSOR_HIGH;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
5200;0x1450;TEMP_SENSOR_HIGH;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h
|
||||||
5201;0x1451;TEMP_SENSOR_LOW;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
5201;0x1451;TEMP_SENSOR_LOW;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h
|
||||||
5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;;fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h
|
5202;0x1452;TEMP_SENSOR_GRADIENT;LOW;;fsfw\src\fsfw\thermal\AbstractTemperatureSensor.h
|
||||||
5901;0x170d;COMPONENT_TEMP_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
5901;0x170d;COMPONENT_TEMP_LOW;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
|
||||||
5902;0x170e;COMPONENT_TEMP_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
5902;0x170e;COMPONENT_TEMP_HIGH;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
|
||||||
5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
5903;0x170f;COMPONENT_TEMP_OOL_LOW;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
|
||||||
5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
5904;0x1710;COMPONENT_TEMP_OOL_HIGH;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
|
||||||
5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;;fsfw/src/fsfw/thermal/ThermalComponentIF.h
|
5905;0x1711;TEMP_NOT_IN_OP_RANGE;LOW;;fsfw\src\fsfw\thermal\ThermalComponentIF.h
|
||||||
7101;0x1bbd;FDIR_CHANGED_STATE;INFO;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
7101;0x1bbd;FDIR_CHANGED_STATE;INFO;;fsfw\src\fsfw\fdir\FailureIsolationBase.h
|
||||||
7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
7102;0x1bbe;FDIR_STARTS_RECOVERY;MEDIUM;;fsfw\src\fsfw\fdir\FailureIsolationBase.h
|
||||||
7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;;fsfw/src/fsfw/fdir/FailureIsolationBase.h
|
7103;0x1bbf;FDIR_TURNS_OFF_DEVICE;MEDIUM;;fsfw\src\fsfw\fdir\FailureIsolationBase.h
|
||||||
7201;0x1c21;MONITOR_CHANGED_STATE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
7201;0x1c21;MONITOR_CHANGED_STATE;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
|
||||||
7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
7202;0x1c22;VALUE_BELOW_LOW_LIMIT;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
|
||||||
7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
7203;0x1c23;VALUE_ABOVE_HIGH_LIMIT;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
|
||||||
7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;;fsfw/src/fsfw/monitoring/MonitoringIF.h
|
7204;0x1c24;VALUE_OUT_OF_RANGE;LOW;;fsfw\src\fsfw\monitoring\MonitoringIF.h
|
||||||
7400;0x1ce8;CHANGING_MODE;INFO;;fsfw/src/fsfw/modes/HasModesIF.h
|
7400;0x1ce8;CHANGING_MODE;INFO;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7401;0x1ce9;MODE_INFO;INFO;;fsfw/src/fsfw/modes/HasModesIF.h
|
7401;0x1ce9;MODE_INFO;INFO;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7402;0x1cea;FALLBACK_FAILED;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h
|
7402;0x1cea;FALLBACK_FAILED;HIGH;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
|
7403;0x1ceb;MODE_TRANSITION_FAILED;LOW;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7404;0x1cec;CANT_KEEP_MODE;HIGH;;fsfw/src/fsfw/modes/HasModesIF.h
|
7404;0x1cec;CANT_KEEP_MODE;HIGH;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
|
7405;0x1ced;OBJECT_IN_INVALID_MODE;LOW;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7406;0x1cee;FORCING_MODE;MEDIUM;;fsfw/src/fsfw/modes/HasModesIF.h
|
7406;0x1cee;FORCING_MODE;MEDIUM;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7407;0x1cef;MODE_CMD_REJECTED;LOW;;fsfw/src/fsfw/modes/HasModesIF.h
|
7407;0x1cef;MODE_CMD_REJECTED;LOW;;fsfw\src\fsfw\modes\HasModesIF.h
|
||||||
7506;0x1d52;HEALTH_INFO;INFO;;fsfw/src/fsfw/health/HasHealthIF.h
|
7506;0x1d52;HEALTH_INFO;INFO;;fsfw\src\fsfw\health\HasHealthIF.h
|
||||||
7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;;fsfw/src/fsfw/health/HasHealthIF.h
|
7507;0x1d53;CHILD_CHANGED_HEALTH;INFO;;fsfw\src\fsfw\health\HasHealthIF.h
|
||||||
7508;0x1d54;CHILD_PROBLEMS;LOW;;fsfw/src/fsfw/health/HasHealthIF.h
|
7508;0x1d54;CHILD_PROBLEMS;LOW;;fsfw\src\fsfw\health\HasHealthIF.h
|
||||||
7509;0x1d55;OVERWRITING_HEALTH;LOW;;fsfw/src/fsfw/health/HasHealthIF.h
|
7509;0x1d55;OVERWRITING_HEALTH;LOW;;fsfw\src\fsfw\health\HasHealthIF.h
|
||||||
7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
|
7510;0x1d56;TRYING_RECOVERY;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h
|
||||||
7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
|
7511;0x1d57;RECOVERY_STEP;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h
|
||||||
7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw/src/fsfw/health/HasHealthIF.h
|
7512;0x1d58;RECOVERY_DONE;MEDIUM;;fsfw\src\fsfw\health\HasHealthIF.h
|
||||||
7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7900;0x1edc;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
|
||||||
7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7901;0x1edd;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
|
||||||
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7902;0x1ede;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
|
||||||
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7903;0x1edf;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
|
||||||
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw/src/fsfw/datalinklayer/DataLinkLayer.h
|
7905;0x1ee1;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;fsfw\src\fsfw\datalinklayer\DataLinkLayer.h
|
||||||
8900;0x22c4;CLOCK_SET;INFO;;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
8900;0x22c4;CLOCK_SET;INFO;;fsfw\src\fsfw\pus\Service9TimeManagement.h
|
||||||
8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw/src/fsfw/pus/Service9TimeManagement.h
|
8901;0x22c5;CLOCK_SET_FAILURE;LOW;;fsfw\src\fsfw\pus\Service9TimeManagement.h
|
||||||
9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h
|
9700;0x25e4;TEST;INFO;;fsfw\src\fsfw\pus\Service17Test.h
|
||||||
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
|
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw\hal\src\fsfw_hal\devicehandlers\MgmLIS3MDLHandler.h
|
||||||
10800;0x2a30;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
|
10800;0x2a30;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission\devices\devicedefinitions\powerDefinitions.h
|
||||||
10801;0x2a31;SWITCH_HAS_CHANGED;INFO;Indicated that a swithc state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
|
10801;0x2a31;SWITCH_HAS_CHANGED;INFO;Indicated that a swithc state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission\devices\devicedefinitions\powerDefinitions.h
|
||||||
10802;0x2a32;SWITCHING_Q7S_DENIED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
|
10802;0x2a32;SWITCHING_Q7S_DENIED;MEDIUM;;mission\devices\devicedefinitions\powerDefinitions.h
|
||||||
10900;0x2a94;GPIO_PULL_HIGH_FAILED;LOW;;mission/devices/HeaterHandler.h
|
10900;0x2a94;GPIO_PULL_HIGH_FAILED;LOW;;mission\devices\HeaterHandler.h
|
||||||
10901;0x2a95;GPIO_PULL_LOW_FAILED;LOW;;mission/devices/HeaterHandler.h
|
10901;0x2a95;GPIO_PULL_LOW_FAILED;LOW;;mission\devices\HeaterHandler.h
|
||||||
10902;0x2a96;SWITCH_ALREADY_ON;LOW;;mission/devices/HeaterHandler.h
|
10902;0x2a96;SWITCH_ALREADY_ON;LOW;;mission\devices\HeaterHandler.h
|
||||||
10903;0x2a97;SWITCH_ALREADY_OFF;LOW;;mission/devices/HeaterHandler.h
|
10903;0x2a97;SWITCH_ALREADY_OFF;LOW;;mission\devices\HeaterHandler.h
|
||||||
10904;0x2a98;MAIN_SWITCH_TIMEOUT;LOW;;mission/devices/HeaterHandler.h
|
10904;0x2a98;MAIN_SWITCH_TIMEOUT;LOW;;mission\devices\HeaterHandler.h
|
||||||
11000;0x2af8;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
|
11000;0x2af8;MAIN_SWITCH_ON_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h
|
||||||
11001;0x2af9;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission/devices/SolarArrayDeploymentHandler.h
|
11001;0x2af9;MAIN_SWITCH_OFF_TIMEOUT;LOW;;mission\devices\SolarArrayDeploymentHandler.h
|
||||||
11002;0x2afa;DEPLOYMENT_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
|
11002;0x2afa;DEPLOYMENT_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
|
||||||
11003;0x2afb;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
|
11003;0x2afb;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
|
||||||
11004;0x2afc;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission/devices/SolarArrayDeploymentHandler.h
|
11004;0x2afc;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;mission\devices\SolarArrayDeploymentHandler.h
|
||||||
11101;0x2b5d;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h
|
11101;0x2b5d;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux\devices\ploc\PlocMPSoCHandler.h
|
||||||
11102;0x2b5e;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
|
11102;0x2b5e;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux\devices\ploc\PlocMPSoCHandler.h
|
||||||
11103;0x2b5f;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h
|
11103;0x2b5f;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux\devices\ploc\PlocMPSoCHandler.h
|
||||||
11104;0x2b60;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/devices/ploc/PlocMPSoCHandler.h
|
11104;0x2b60;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux\devices\ploc\PlocMPSoCHandler.h
|
||||||
11105;0x2b61;MPSOC_HANDLER_SEQ_CNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHandler.h
|
11105;0x2b61;MPSOC_HANDLER_SEQ_CNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux\devices\ploc\PlocMPSoCHandler.h
|
||||||
11201;0x2bc1;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
|
11201;0x2bc1;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
|
||||||
11202;0x2bc2;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
|
11202;0x2bc2;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
|
||||||
11203;0x2bc3;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
|
11203;0x2bc3;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
|
||||||
11204;0x2bc4;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
|
11204;0x2bc4;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
|
||||||
11205;0x2bc5;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
|
11205;0x2bc5;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
|
||||||
11206;0x2bc6;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
|
11206;0x2bc6;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
|
||||||
11207;0x2bc7;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
|
11207;0x2bc7;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission\devices\IMTQHandler.h
|
||||||
11208;0x2bc8;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/IMTQHandler.h
|
11208;0x2bc8;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission\devices\IMTQHandler.h
|
||||||
11301;0x2c25;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/RwHandler.h
|
11301;0x2c25;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission\devices\RwHandler.h
|
||||||
11401;0x2c89;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
|
11401;0x2c89;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux\devices\startracker\StarTrackerHandler.h
|
||||||
11402;0x2c8a;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
|
11402;0x2c8a;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux\devices\startracker\StarTrackerHandler.h
|
||||||
11501;0x2ced;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h
|
11501;0x2ced;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux\devices\ploc\PlocSupervisorHandler.h
|
||||||
11502;0x2cee;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/devices/ploc/PlocSupervisorHandler.h
|
11502;0x2cee;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux\devices\ploc\PlocSupervisorHandler.h
|
||||||
11503;0x2cef;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;linux/devices/ploc/PlocSupervisorHandler.h
|
11503;0x2cef;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;linux\devices\ploc\PlocSupervisorHandler.h
|
||||||
11504;0x2cf0;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h
|
11504;0x2cf0;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux\devices\ploc\PlocSupervisorHandler.h
|
||||||
11600;0x2d50;SANITIZATION_FAILED;LOW;;bsp_q7s/memory/SdCardManager.h
|
11600;0x2d50;SANITIZATION_FAILED;LOW;;bsp_q7s\memory\SdCardManager.h
|
||||||
11601;0x2d51;MOUNTED_SD_CARD;INFO;;bsp_q7s/memory/SdCardManager.h
|
11601;0x2d51;MOUNTED_SD_CARD;INFO;;bsp_q7s\memory\SdCardManager.h
|
||||||
11602;0x2d52;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h
|
11700;0x2db4;UPDATE_FILE_NOT_EXISTS;LOW;;linux\devices\ploc\PlocUpdater.h
|
||||||
11603;0x2d53;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h
|
11701;0x2db5;ACTION_COMMANDING_FAILED;LOW;Failed to send command to supervisor handler P1: Return value of CommandActionHelper::commandAction P2: Action ID of command to send;linux\devices\ploc\PlocUpdater.h
|
||||||
11700;0x2db4;UPDATE_FILE_NOT_EXISTS;LOW;;linux/devices/ploc/PlocUpdater.h
|
11702;0x2db6;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;linux\devices\ploc\PlocUpdater.h
|
||||||
11701;0x2db5;ACTION_COMMANDING_FAILED;LOW;Failed to send command to supervisor handler P1: Return value of CommandActionHelper::commandAction P2: Action ID of command to send;linux/devices/ploc/PlocUpdater.h
|
11703;0x2db7;UPDATE_TRANSFER_FAILED;LOW;Supervisor handler failed to transfer an update space packet. P1: Parameter holds the number of update packets already sent (inclusive the failed packet);linux\devices\ploc\PlocUpdater.h
|
||||||
11702;0x2db6;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;linux/devices/ploc/PlocUpdater.h
|
11704;0x2db8;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;linux\devices\ploc\PlocUpdater.h
|
||||||
11703;0x2db7;UPDATE_TRANSFER_FAILED;LOW;Supervisor handler failed to transfer an update space packet. P1: Parameter holds the number of update packets already sent (inclusive the failed packet);linux/devices/ploc/PlocUpdater.h
|
11705;0x2db9;UPDATE_FINISHED;INFO;MPSoC update successful completed;linux\devices\ploc\PlocUpdater.h
|
||||||
11704;0x2db8;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;linux/devices/ploc/PlocUpdater.h
|
11800;0x2e18;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux\devices\ploc\PlocMemoryDumper.h
|
||||||
11705;0x2db9;UPDATE_FINISHED;INFO;MPSoC update successful completed;linux/devices/ploc/PlocUpdater.h
|
11801;0x2e19;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux\devices\ploc\PlocMemoryDumper.h
|
||||||
11800;0x2e18;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/devices/ploc/PlocMemoryDumper.h
|
11802;0x2e1a;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux\devices\ploc\PlocMemoryDumper.h
|
||||||
11801;0x2e19;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/devices/ploc/PlocMemoryDumper.h
|
11901;0x2e7d;INVALID_TC_FRAME;HIGH;;linux\obc\PdecHandler.h
|
||||||
11802;0x2e1a;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h
|
11902;0x2e7e;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux\obc\PdecHandler.h
|
||||||
11901;0x2e7d;INVALID_TC_FRAME;HIGH;;linux/obc/PdecHandler.h
|
11903;0x2e7f;CARRIER_LOCK;INFO;Carrier lock detected;linux\obc\PdecHandler.h
|
||||||
11902;0x2e7e;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/obc/PdecHandler.h
|
11904;0x2e80;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux\obc\PdecHandler.h
|
||||||
11903;0x2e7f;CARRIER_LOCK;INFO;Carrier lock detected;linux/obc/PdecHandler.h
|
12000;0x2ee0;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux\devices\startracker\StrHelper.h
|
||||||
11904;0x2e80;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);linux/obc/PdecHandler.h
|
12001;0x2ee1;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux\devices\startracker\StrHelper.h
|
||||||
12000;0x2ee0;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrHelper.h
|
12002;0x2ee2;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux\devices\startracker\StrHelper.h
|
||||||
12001;0x2ee1;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrHelper.h
|
12003;0x2ee3;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux\devices\startracker\StrHelper.h
|
||||||
12002;0x2ee2;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrHelper.h
|
12004;0x2ee4;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux\devices\startracker\StrHelper.h
|
||||||
12003;0x2ee3;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrHelper.h
|
12005;0x2ee5;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux\devices\startracker\StrHelper.h
|
||||||
12004;0x2ee4;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrHelper.h
|
12006;0x2ee6;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux\devices\startracker\StrHelper.h
|
||||||
12005;0x2ee5;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrHelper.h
|
12007;0x2ee7;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux\devices\startracker\StrHelper.h
|
||||||
12006;0x2ee6;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrHelper.h
|
12008;0x2ee8;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux\devices\startracker\StrHelper.h
|
||||||
12007;0x2ee7;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrHelper.h
|
12009;0x2ee9;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux\devices\startracker\StrHelper.h
|
||||||
12008;0x2ee8;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrHelper.h
|
12010;0x2eea;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux\devices\startracker\StrHelper.h
|
||||||
12009;0x2ee9;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
|
12011;0x2eeb;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux\devices\startracker\StrHelper.h
|
||||||
12010;0x2eea;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrHelper.h
|
12012;0x2eec;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux\devices\startracker\StrHelper.h
|
||||||
12011;0x2eeb;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off) P1: Position of upload or download packet for which no reply was sent;linux/devices/startracker/StrHelper.h
|
12013;0x2eed;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux\devices\startracker\StrHelper.h
|
||||||
12012;0x2eec;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrHelper.h
|
12014;0x2eee;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux\devices\startracker\StrHelper.h
|
||||||
12013;0x2eed;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrHelper.h
|
12015;0x2eef;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux\devices\startracker\StrHelper.h
|
||||||
12014;0x2eee;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrHelper.h
|
12016;0x2ef0;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux\devices\startracker\StrHelper.h
|
||||||
12015;0x2eef;STR_HELPER_SENDING_PACKET_FAILED;LOW;;linux/devices/startracker/StrHelper.h
|
12100;0x2f44;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12016;0x2ef0;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;linux/devices/startracker/StrHelper.h
|
12101;0x2f45;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12100;0x2f44;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/devices/ploc/PlocMPSoCHelper.h
|
12102;0x2f46;SENDING_COMMAND_FAILED;LOW;Communication interface returned failure when trying to send the command ot the PLOCP1: Return value returned by the communication interface sendMessage functionP2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12101;0x2f45;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/devices/ploc/PlocMPSoCHelper.h
|
12103;0x2f47;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failedP1: Return value returned by the communication interface requestReceiveMessage functionP2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12102;0x2f46;SENDING_COMMAND_FAILED;LOW;Communication interface returned failure when trying to send the command ot the PLOCP1: Return value returned by the communication interface sendMessage functionP2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
|
12104;0x2f48;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failedP1: Return value returned by the communication interface readingReceivedMessage functionP2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12103;0x2f47;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failedP1: Return value returned by the communication interface requestReceiveMessage functionP2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
|
12105;0x2f49;MISSING_ACK;LOW;Did not receive acknowledgement reportP1: Number of bytes missingP2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12104;0x2f48;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failedP1: Return value returned by the communication interface readingReceivedMessage functionP2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
|
12106;0x2f4a;MISSING_EXE;LOW;Did not receive execution reportP1: Number of bytes missingP2: Internal state of MPSoC helper;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12105;0x2f49;MISSING_ACK;LOW;Did not receive acknowledgement reportP1: Number of bytes missingP2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
|
12107;0x2f4b;ACK_FAILURE_REPORT;LOW;Received acknowledgement failure reportP1: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12106;0x2f4a;MISSING_EXE;LOW;Did not receive execution reportP1: Number of bytes missingP2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h
|
12108;0x2f4c;EXE_FAILURE_REPORT;LOW;Received execution failure reportP1: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12107;0x2f4b;ACK_FAILURE_REPORT;LOW;Received acknowledgement failure reportP1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
|
12109;0x2f4d;ACK_INVALID_APID;LOW;Expected acknowledgement report but received space packet with other apidP1: Apid of received space packetP2: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12108;0x2f4c;EXE_FAILURE_REPORT;LOW;Received execution failure reportP1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
|
12110;0x2f4e;EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apidP1: Apid of received space packetP2: Internal state of MPSoC;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12109;0x2f4d;ACK_INVALID_APID;LOW;Expected acknowledgement report but received space packet with other apidP1: Apid of received space packetP2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
|
12111;0x2f4f;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence countP1: Expected sequence countP2: Received sequence count;linux\devices\ploc\PlocMPSoCHelper.h
|
||||||
12110;0x2f4e;EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apidP1: Apid of received space packetP2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h
|
12200;0x2fa8;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\AcsBoardAssembly.h
|
||||||
12111;0x2f4f;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence countP1: Expected sequence countP2: Received sequence count;linux/devices/ploc/PlocMPSoCHelper.h
|
12201;0x2fa9;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\AcsBoardAssembly.h
|
||||||
|
12202;0x2faa;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\AcsBoardAssembly.h
|
||||||
|
12203;0x2fab;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission\system\AcsBoardAssembly.h
|
||||||
|
12300;0x300c;TRANSITION_OTHER_SIDE_FAILED;HIGH;;mission\system\SusAssembly.h
|
||||||
|
12301;0x300d;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;;mission\system\SusAssembly.h
|
||||||
|
12302;0x300e;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;;mission\system\SusAssembly.h
|
||||||
|
12303;0x300f;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission\system\SusAssembly.h
|
||||||
|
12400;0x3070;CHILDREN_LOST_MODE;MEDIUM;;mission\system\TcsBoardAssembly.h
|
||||||
|
13600;0x3520;ALLOC_FAILURE;MEDIUM;;bsp_q7s\core\CoreController.h
|
||||||
|
13601;0x3521;REBOOT_SW;MEDIUM; Software reboot occured. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s\core\CoreController.h
|
||||||
|
13602;0x3522;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s\core\CoreController.h
|
||||||
|
13603;0x3523;REBOOT_HW;MEDIUM;;bsp_q7s\core\CoreController.h
|
||||||
|
|
@ -109,6 +109,9 @@
|
|||||||
0x5400CAFE;DUMMY_INTERFACE
|
0x5400CAFE;DUMMY_INTERFACE
|
||||||
0x54123456;LIBGPIOD_TEST
|
0x54123456;LIBGPIOD_TEST
|
||||||
0x54694269;TEST_TASK
|
0x54694269;TEST_TASK
|
||||||
|
0x73000001;ACS_BOARD_ASS
|
||||||
|
0x73000002;SUS_BOARD_ASS
|
||||||
|
0x73000003;TCS_BOARD_ASS
|
||||||
0x73000100;TM_FUNNEL
|
0x73000100;TM_FUNNEL
|
||||||
0x73500000;CCSDS_IP_CORE_BRIDGE
|
0x73500000;CCSDS_IP_CORE_BRIDGE
|
||||||
0xFFFFFFFF;NO_OBJECT
|
0xFFFFFFFF;NO_OBJECT
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -82,7 +82,10 @@ def parse_events(
|
|||||||
handle_csv_export(
|
handle_csv_export(
|
||||||
file_name=CSV_FILENAME, event_list=event_list, file_separator=FILE_SEPARATOR
|
file_name=CSV_FILENAME, event_list=event_list, file_separator=FILE_SEPARATOR
|
||||||
)
|
)
|
||||||
copy_file(filename=CSV_FILENAME, destination=CSV_COPY_DEST, delete_existing_file=True)
|
LOGGER.info(f"Copying CSV file to {CSV_COPY_DEST}")
|
||||||
|
copy_file(
|
||||||
|
filename=CSV_FILENAME, destination=CSV_COPY_DEST, delete_existing_file=True
|
||||||
|
)
|
||||||
|
|
||||||
if generate_cpp:
|
if generate_cpp:
|
||||||
handle_cpp_export(
|
handle_cpp_export(
|
||||||
@ -93,7 +96,7 @@ def parse_events(
|
|||||||
header_file_name=CPP_H_FILENAME,
|
header_file_name=CPP_H_FILENAME,
|
||||||
)
|
)
|
||||||
if COPY_CPP_FILE:
|
if COPY_CPP_FILE:
|
||||||
LOGGER.info(f"EventParser: Copying file to {CPP_COPY_DESTINATION}")
|
LOGGER.info(f"EventParser: Copying CPP translation file to {CPP_COPY_DESTINATION}")
|
||||||
copy_file(CPP_FILENAME, CPP_COPY_DESTINATION)
|
copy_file(CPP_FILENAME, CPP_COPY_DESTINATION)
|
||||||
copy_file(CPP_H_FILENAME, CPP_COPY_DESTINATION)
|
copy_file(CPP_H_FILENAME, CPP_COPY_DESTINATION)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 158 translations.
|
* @brief Auto-generated event translation file. Contains 169 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2022-03-25 11:09:03
|
* Generated on: 2022-03-26 10:39:24
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -119,8 +119,6 @@ const char *SUPV_EXE_FAILURE_STRING = "SUPV_EXE_FAILURE";
|
|||||||
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
|
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
|
||||||
const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
|
const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
|
||||||
const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
|
const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
|
||||||
const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED";
|
|
||||||
const char *REBOOT_HW_STRING = "REBOOT_HW";
|
|
||||||
const char *UPDATE_FILE_NOT_EXISTS_STRING = "UPDATE_FILE_NOT_EXISTS";
|
const char *UPDATE_FILE_NOT_EXISTS_STRING = "UPDATE_FILE_NOT_EXISTS";
|
||||||
const char *ACTION_COMMANDING_FAILED_STRING = "ACTION_COMMANDING_FAILED";
|
const char *ACTION_COMMANDING_FAILED_STRING = "ACTION_COMMANDING_FAILED";
|
||||||
const char *UPDATE_AVAILABLE_FAILED_STRING = "UPDATE_AVAILABLE_FAILED";
|
const char *UPDATE_AVAILABLE_FAILED_STRING = "UPDATE_AVAILABLE_FAILED";
|
||||||
@ -163,6 +161,15 @@ const char *EXE_FAILURE_REPORT_STRING = "EXE_FAILURE_REPORT";
|
|||||||
const char *ACK_INVALID_APID_STRING = "ACK_INVALID_APID";
|
const char *ACK_INVALID_APID_STRING = "ACK_INVALID_APID";
|
||||||
const char *EXE_INVALID_APID_STRING = "EXE_INVALID_APID";
|
const char *EXE_INVALID_APID_STRING = "EXE_INVALID_APID";
|
||||||
const char *MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HELPER_SEQ_CNT_MISMATCH";
|
const char *MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HELPER_SEQ_CNT_MISMATCH";
|
||||||
|
const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED";
|
||||||
|
const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE";
|
||||||
|
const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT";
|
||||||
|
const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED";
|
||||||
|
const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
|
||||||
|
const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE";
|
||||||
|
const char *REBOOT_SW_STRING = "REBOOT_SW";
|
||||||
|
const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED";
|
||||||
|
const char *REBOOT_HW_STRING = "REBOOT_HW";
|
||||||
|
|
||||||
const char *translateEvents(Event event) {
|
const char *translateEvents(Event event) {
|
||||||
switch ((event & 0xFFFF)) {
|
switch ((event & 0xFFFF)) {
|
||||||
@ -394,10 +401,6 @@ const char *translateEvents(Event event) {
|
|||||||
return SANITIZATION_FAILED_STRING;
|
return SANITIZATION_FAILED_STRING;
|
||||||
case (11601):
|
case (11601):
|
||||||
return MOUNTED_SD_CARD_STRING;
|
return MOUNTED_SD_CARD_STRING;
|
||||||
case (11602):
|
|
||||||
return REBOOT_MECHANISM_TRIGGERED_STRING;
|
|
||||||
case (11603):
|
|
||||||
return REBOOT_HW_STRING;
|
|
||||||
case (11700):
|
case (11700):
|
||||||
return UPDATE_FILE_NOT_EXISTS_STRING;
|
return UPDATE_FILE_NOT_EXISTS_STRING;
|
||||||
case (11701):
|
case (11701):
|
||||||
@ -482,6 +485,24 @@ const char *translateEvents(Event event) {
|
|||||||
return EXE_INVALID_APID_STRING;
|
return EXE_INVALID_APID_STRING;
|
||||||
case (12111):
|
case (12111):
|
||||||
return MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING;
|
return MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING;
|
||||||
|
case (12200):
|
||||||
|
return TRANSITION_OTHER_SIDE_FAILED_STRING;
|
||||||
|
case (12201):
|
||||||
|
return NOT_ENOUGH_DEVICES_DUAL_MODE_STRING;
|
||||||
|
case (12202):
|
||||||
|
return POWER_STATE_MACHINE_TIMEOUT_STRING;
|
||||||
|
case (12203):
|
||||||
|
return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING;
|
||||||
|
case (12400):
|
||||||
|
return CHILDREN_LOST_MODE_STRING;
|
||||||
|
case (13600):
|
||||||
|
return ALLOC_FAILURE_STRING;
|
||||||
|
case (13601):
|
||||||
|
return REBOOT_SW_STRING;
|
||||||
|
case (13602):
|
||||||
|
return REBOOT_MECHANISM_TRIGGERED_STRING;
|
||||||
|
case (13603):
|
||||||
|
return REBOOT_HW_STRING;
|
||||||
default:
|
default:
|
||||||
return "UNKNOWN_EVENT";
|
return "UNKNOWN_EVENT";
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit c5ef1783a3b082c0e88561bd91bc3ee0f459fafc
|
Subproject commit a3ea5dd2e7223c52e4f494e170850609b7b3a572
|
@ -31,7 +31,11 @@ def main():
|
|||||||
LOGGER.info("Generating returnvalue data")
|
LOGGER.info("Generating returnvalue data")
|
||||||
time.sleep(0.05)
|
time.sleep(0.05)
|
||||||
parse_returnvalues()
|
parse_returnvalues()
|
||||||
pass
|
elif args.type == "all":
|
||||||
|
LOGGER.info("Generating all data")
|
||||||
|
parse_objects()
|
||||||
|
parse_events()
|
||||||
|
parse_returnvalues()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
@ -118,5 +118,5 @@ def handle_file_export(list_items):
|
|||||||
copy_file(
|
copy_file(
|
||||||
filename=CSV_OBJECT_FILENAME,
|
filename=CSV_OBJECT_FILENAME,
|
||||||
destination=CSV_COPY_DEST,
|
destination=CSV_COPY_DEST,
|
||||||
delete_existing_file=True
|
delete_existing_file=True,
|
||||||
)
|
)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 114 translations.
|
* Contains 117 translations.
|
||||||
* Generated on: 2022-03-25 09:54:13
|
* Generated on: 2022-03-26 10:39:15
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
@ -117,6 +117,9 @@ const char *DUMMY_HANDLER_STRING = "DUMMY_HANDLER";
|
|||||||
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
|
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
|
||||||
const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST";
|
const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST";
|
||||||
const char *TEST_TASK_STRING = "TEST_TASK";
|
const char *TEST_TASK_STRING = "TEST_TASK";
|
||||||
|
const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS";
|
||||||
|
const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS";
|
||||||
|
const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS";
|
||||||
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
|
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
|
||||||
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
|
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
|
||||||
const char *NO_OBJECT_STRING = "NO_OBJECT";
|
const char *NO_OBJECT_STRING = "NO_OBJECT";
|
||||||
@ -345,6 +348,12 @@ const char *translateObject(object_id_t object) {
|
|||||||
return LIBGPIOD_TEST_STRING;
|
return LIBGPIOD_TEST_STRING;
|
||||||
case 0x54694269:
|
case 0x54694269:
|
||||||
return TEST_TASK_STRING;
|
return TEST_TASK_STRING;
|
||||||
|
case 0x73000001:
|
||||||
|
return ACS_BOARD_ASS_STRING;
|
||||||
|
case 0x73000002:
|
||||||
|
return SUS_BOARD_ASS_STRING;
|
||||||
|
case 0x73000003:
|
||||||
|
return TCS_BOARD_ASS_STRING;
|
||||||
case 0x73000100:
|
case 0x73000100:
|
||||||
return TM_FUNNEL_STRING;
|
return TM_FUNNEL_STRING;
|
||||||
case 0x73500000:
|
case 0x73500000:
|
||||||
|
@ -1,14 +1,7 @@
|
|||||||
#! /usr/bin/python3
|
#! /usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""Part of the MIB export tools for the EIVE project by.
|
||||||
:file: returnvalues_parser.py
|
Returnvalue exporter.
|
||||||
:brief: Part of the MOD export tools for the SOURCE project by KSat.
|
|
||||||
TODO: Integrate into Parser Structure instead of calling this file (no cpp file generated yet)
|
|
||||||
:details:
|
|
||||||
Return Value exporter.
|
|
||||||
To use MySQLdb, run pip install mysqlclient or install in IDE. On Windows, Build Tools
|
|
||||||
installation might be necessary.
|
|
||||||
:data: 21.11.2019
|
|
||||||
"""
|
"""
|
||||||
from fsfwgen.core import get_console_logger
|
from fsfwgen.core import get_console_logger
|
||||||
from fsfwgen.utility.file_management import copy_file
|
from fsfwgen.utility.file_management import copy_file
|
||||||
@ -87,7 +80,7 @@ def parse_returnvalues():
|
|||||||
copy_file(
|
copy_file(
|
||||||
filename=CSV_RETVAL_FILENAME,
|
filename=CSV_RETVAL_FILENAME,
|
||||||
destination=CSV_COPY_DEST,
|
destination=CSV_COPY_DEST,
|
||||||
delete_existing_file=True
|
delete_existing_file=True,
|
||||||
)
|
)
|
||||||
if EXPORT_TO_SQL:
|
if EXPORT_TO_SQL:
|
||||||
LOGGER.info("ReturnvalueParser: Exporting to SQL")
|
LOGGER.info("ReturnvalueParser: Exporting to SQL")
|
||||||
|
@ -29,6 +29,16 @@ LocalPoolDataSetBase *GPSHyperionLinuxController::getDataSetHandle(sid_t sid) {
|
|||||||
|
|
||||||
ReturnValue_t GPSHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
|
ReturnValue_t GPSHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
uint32_t *msToReachTheMode) {
|
uint32_t *msToReachTheMode) {
|
||||||
|
if (not modeCommanded) {
|
||||||
|
if (mode == MODE_ON or mode == MODE_OFF) {
|
||||||
|
// 5h time to reach fix
|
||||||
|
*msToReachTheMode = MAX_SECONDS_TO_REACH_FIX;
|
||||||
|
maxTimeToReachFix.resetTimer();
|
||||||
|
modeCommanded = true;
|
||||||
|
} else if (mode == MODE_NORMAL) {
|
||||||
|
return HasModesIF::INVALID_MODE;
|
||||||
|
}
|
||||||
|
}
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,17 +114,26 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
|
|||||||
gps = myGpsmm.read();
|
gps = myGpsmm.read();
|
||||||
if (gps == nullptr) {
|
if (gps == nullptr) {
|
||||||
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading GPS data failed" << std::endl;
|
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading GPS data failed" << std::endl;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
PoolReadGuard pg(&gpsSet);
|
PoolReadGuard pg(&gpsSet);
|
||||||
if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) {
|
if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) {
|
||||||
#if FSFW_VERBOSE_LEVEL >= 1
|
#if FSFW_VERBOSE_LEVEL >= 1
|
||||||
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading dataset failed" << std::endl;
|
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading dataset failed" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0: Not seen, 1: No fix, 2: 2D-Fix, 3: 3D-Fix
|
// 0: Not seen, 1: No fix, 2: 2D-Fix, 3: 3D-Fix
|
||||||
gpsSet.fixMode.value = gps->fix.mode;
|
gpsSet.fixMode.value = gps->fix.mode;
|
||||||
if (gps->fix.mode == 0 or gps->fix.mode == 1) {
|
if (gps->fix.mode == 0 or gps->fix.mode == 1) {
|
||||||
|
if (modeCommanded and maxTimeToReachFix.hasTimedOut()) {
|
||||||
|
// We are supposed to be on and functioning, but not fix was found
|
||||||
|
if (mode == MODE_ON or mode == MODE_NORMAL) {
|
||||||
|
mode = MODE_OFF;
|
||||||
|
}
|
||||||
|
modeCommanded = false;
|
||||||
|
}
|
||||||
gpsSet.setValidity(false, true);
|
gpsSet.setValidity(false, true);
|
||||||
} else if (gps->satellites_used > 0) {
|
} else if (gps->satellites_used > 0) {
|
||||||
gpsSet.setValidity(true, true);
|
gpsSet.setValidity(true, true);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
class GPSHyperionLinuxController : public ExtendedControllerBase {
|
class GPSHyperionLinuxController : public ExtendedControllerBase {
|
||||||
public:
|
public:
|
||||||
|
static constexpr uint32_t MAX_SECONDS_TO_REACH_FIX = 60 * 60 * 5;
|
||||||
GPSHyperionLinuxController(object_id_t objectId, object_id_t parentId,
|
GPSHyperionLinuxController(object_id_t objectId, object_id_t parentId,
|
||||||
bool debugHyperionGps = false);
|
bool debugHyperionGps = false);
|
||||||
virtual ~GPSHyperionLinuxController();
|
virtual ~GPSHyperionLinuxController();
|
||||||
@ -46,6 +47,8 @@ class GPSHyperionLinuxController : public ExtendedControllerBase {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
GpsPrimaryDataset gpsSet;
|
GpsPrimaryDataset gpsSet;
|
||||||
|
Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000);
|
||||||
|
bool modeCommanded = true;
|
||||||
gpsmm myGpsmm;
|
gpsmm myGpsmm;
|
||||||
bool debugHyperionGps = false;
|
bool debugHyperionGps = false;
|
||||||
|
|
||||||
|
@ -49,13 +49,13 @@ debugging. */
|
|||||||
#define OBSW_ADD_STAR_TRACKER 0
|
#define OBSW_ADD_STAR_TRACKER 0
|
||||||
#define OBSW_ADD_PLOC_SUPERVISOR 0
|
#define OBSW_ADD_PLOC_SUPERVISOR 0
|
||||||
#define OBSW_ADD_PLOC_MPSOC 0
|
#define OBSW_ADD_PLOC_MPSOC 0
|
||||||
#define OBSW_ADD_SUN_SENSORS 0
|
#define OBSW_ADD_SUN_SENSORS 1
|
||||||
#define OBSW_ADD_ACS_BOARD 1
|
#define OBSW_ADD_ACS_BOARD 1
|
||||||
#define OBSW_ADD_ACS_HANDLERS 1
|
#define OBSW_ADD_ACS_HANDLERS 1
|
||||||
#define OBSW_ADD_RW 0
|
#define OBSW_ADD_RW 0
|
||||||
#define OBSW_ADD_RTD_DEVICES 1
|
#define OBSW_ADD_RTD_DEVICES 1
|
||||||
#define OBSW_ADD_TMP_DEVICES 0
|
#define OBSW_ADD_TMP_DEVICES 0
|
||||||
#define OBSW_ADD_RAD_SENSORS 0
|
#define OBSW_ADD_RAD_SENSORS 1
|
||||||
#define OBSW_ADD_PL_PCDU 0
|
#define OBSW_ADD_PL_PCDU 0
|
||||||
#define OBSW_ADD_SYRLINKS 0
|
#define OBSW_ADD_SYRLINKS 0
|
||||||
#define OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT 0
|
#define OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT 0
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
namespace SUBSYSTEM_ID {
|
namespace SUBSYSTEM_ID {
|
||||||
enum : uint8_t {
|
enum : uint8_t {
|
||||||
SUBSYSTEM_ID_START = COMMON_SUBSYSTEM_ID_END,
|
SUBSYSTEM_ID_START = COMMON_SUBSYSTEM_ID_END,
|
||||||
CORE = 116,
|
CORE = 136,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 158 translations.
|
* @brief Auto-generated event translation file. Contains 169 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2022-03-25 11:09:03
|
* Generated on: 2022-03-26 10:39:24
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -119,8 +119,6 @@ const char *SUPV_EXE_FAILURE_STRING = "SUPV_EXE_FAILURE";
|
|||||||
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
|
const char *SUPV_CRC_FAILURE_EVENT_STRING = "SUPV_CRC_FAILURE_EVENT";
|
||||||
const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
|
const char *SANITIZATION_FAILED_STRING = "SANITIZATION_FAILED";
|
||||||
const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
|
const char *MOUNTED_SD_CARD_STRING = "MOUNTED_SD_CARD";
|
||||||
const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED";
|
|
||||||
const char *REBOOT_HW_STRING = "REBOOT_HW";
|
|
||||||
const char *UPDATE_FILE_NOT_EXISTS_STRING = "UPDATE_FILE_NOT_EXISTS";
|
const char *UPDATE_FILE_NOT_EXISTS_STRING = "UPDATE_FILE_NOT_EXISTS";
|
||||||
const char *ACTION_COMMANDING_FAILED_STRING = "ACTION_COMMANDING_FAILED";
|
const char *ACTION_COMMANDING_FAILED_STRING = "ACTION_COMMANDING_FAILED";
|
||||||
const char *UPDATE_AVAILABLE_FAILED_STRING = "UPDATE_AVAILABLE_FAILED";
|
const char *UPDATE_AVAILABLE_FAILED_STRING = "UPDATE_AVAILABLE_FAILED";
|
||||||
@ -163,6 +161,15 @@ const char *EXE_FAILURE_REPORT_STRING = "EXE_FAILURE_REPORT";
|
|||||||
const char *ACK_INVALID_APID_STRING = "ACK_INVALID_APID";
|
const char *ACK_INVALID_APID_STRING = "ACK_INVALID_APID";
|
||||||
const char *EXE_INVALID_APID_STRING = "EXE_INVALID_APID";
|
const char *EXE_INVALID_APID_STRING = "EXE_INVALID_APID";
|
||||||
const char *MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HELPER_SEQ_CNT_MISMATCH";
|
const char *MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HELPER_SEQ_CNT_MISMATCH";
|
||||||
|
const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED";
|
||||||
|
const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE";
|
||||||
|
const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT";
|
||||||
|
const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED";
|
||||||
|
const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE";
|
||||||
|
const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE";
|
||||||
|
const char *REBOOT_SW_STRING = "REBOOT_SW";
|
||||||
|
const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED";
|
||||||
|
const char *REBOOT_HW_STRING = "REBOOT_HW";
|
||||||
|
|
||||||
const char *translateEvents(Event event) {
|
const char *translateEvents(Event event) {
|
||||||
switch ((event & 0xFFFF)) {
|
switch ((event & 0xFFFF)) {
|
||||||
@ -394,10 +401,6 @@ const char *translateEvents(Event event) {
|
|||||||
return SANITIZATION_FAILED_STRING;
|
return SANITIZATION_FAILED_STRING;
|
||||||
case (11601):
|
case (11601):
|
||||||
return MOUNTED_SD_CARD_STRING;
|
return MOUNTED_SD_CARD_STRING;
|
||||||
case (11602):
|
|
||||||
return REBOOT_MECHANISM_TRIGGERED_STRING;
|
|
||||||
case (11603):
|
|
||||||
return REBOOT_HW_STRING;
|
|
||||||
case (11700):
|
case (11700):
|
||||||
return UPDATE_FILE_NOT_EXISTS_STRING;
|
return UPDATE_FILE_NOT_EXISTS_STRING;
|
||||||
case (11701):
|
case (11701):
|
||||||
@ -482,6 +485,24 @@ const char *translateEvents(Event event) {
|
|||||||
return EXE_INVALID_APID_STRING;
|
return EXE_INVALID_APID_STRING;
|
||||||
case (12111):
|
case (12111):
|
||||||
return MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING;
|
return MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING;
|
||||||
|
case (12200):
|
||||||
|
return TRANSITION_OTHER_SIDE_FAILED_STRING;
|
||||||
|
case (12201):
|
||||||
|
return NOT_ENOUGH_DEVICES_DUAL_MODE_STRING;
|
||||||
|
case (12202):
|
||||||
|
return POWER_STATE_MACHINE_TIMEOUT_STRING;
|
||||||
|
case (12203):
|
||||||
|
return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING;
|
||||||
|
case (12400):
|
||||||
|
return CHILDREN_LOST_MODE_STRING;
|
||||||
|
case (13600):
|
||||||
|
return ALLOC_FAILURE_STRING;
|
||||||
|
case (13601):
|
||||||
|
return REBOOT_SW_STRING;
|
||||||
|
case (13602):
|
||||||
|
return REBOOT_MECHANISM_TRIGGERED_STRING;
|
||||||
|
case (13603):
|
||||||
|
return REBOOT_HW_STRING;
|
||||||
default:
|
default:
|
||||||
return "UNKNOWN_EVENT";
|
return "UNKNOWN_EVENT";
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 114 translations.
|
* Contains 117 translations.
|
||||||
* Generated on: 2022-03-25 09:54:13
|
* Generated on: 2022-03-26 10:39:15
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
@ -117,6 +117,9 @@ const char *DUMMY_HANDLER_STRING = "DUMMY_HANDLER";
|
|||||||
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
|
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
|
||||||
const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST";
|
const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST";
|
||||||
const char *TEST_TASK_STRING = "TEST_TASK";
|
const char *TEST_TASK_STRING = "TEST_TASK";
|
||||||
|
const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS";
|
||||||
|
const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS";
|
||||||
|
const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS";
|
||||||
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
|
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
|
||||||
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
|
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
|
||||||
const char *NO_OBJECT_STRING = "NO_OBJECT";
|
const char *NO_OBJECT_STRING = "NO_OBJECT";
|
||||||
@ -345,6 +348,12 @@ const char *translateObject(object_id_t object) {
|
|||||||
return LIBGPIOD_TEST_STRING;
|
return LIBGPIOD_TEST_STRING;
|
||||||
case 0x54694269:
|
case 0x54694269:
|
||||||
return TEST_TASK_STRING;
|
return TEST_TASK_STRING;
|
||||||
|
case 0x73000001:
|
||||||
|
return ACS_BOARD_ASS_STRING;
|
||||||
|
case 0x73000002:
|
||||||
|
return SUS_BOARD_ASS_STRING;
|
||||||
|
case 0x73000003:
|
||||||
|
return TCS_BOARD_ASS_STRING;
|
||||||
case 0x73000100:
|
case 0x73000100:
|
||||||
return TM_FUNNEL_STRING;
|
return TM_FUNNEL_STRING;
|
||||||
case 0x73500000:
|
case 0x73500000:
|
||||||
|
@ -24,7 +24,9 @@ PdecHandler::PdecHandler(object_id_t objectId, object_id_t tcDestinationId,
|
|||||||
uioRamMemory(uioRamMemory),
|
uioRamMemory(uioRamMemory),
|
||||||
uioRegisters(uioRegisters),
|
uioRegisters(uioRegisters),
|
||||||
actionHelper(this, nullptr) {
|
actionHelper(this, nullptr) {
|
||||||
commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE);
|
auto mqArgs = MqArgs(objectId, static_cast<void*>(this));
|
||||||
|
commandQueue = QueueFactory::instance()->createMessageQueue(
|
||||||
|
QUEUE_SIZE, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
PdecHandler::~PdecHandler() {}
|
PdecHandler::~PdecHandler() {}
|
||||||
|
@ -4,5 +4,4 @@ add_subdirectory(devices)
|
|||||||
add_subdirectory(utility)
|
add_subdirectory(utility)
|
||||||
add_subdirectory(memory)
|
add_subdirectory(memory)
|
||||||
add_subdirectory(tmtc)
|
add_subdirectory(tmtc)
|
||||||
|
add_subdirectory(system)
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ void Max31865PT1000Handler::doStartUp() {
|
|||||||
|
|
||||||
void Max31865PT1000Handler::doShutDown() {
|
void Max31865PT1000Handler::doShutDown() {
|
||||||
commandExecuted = false;
|
commandExecuted = false;
|
||||||
|
warningSwitch = true;
|
||||||
setMode(_MODE_POWER_DOWN);
|
setMode(_MODE_POWER_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,14 +320,17 @@ ReturnValue_t Max31865PT1000Handler::interpretDeviceReply(DeviceCommandId_t id,
|
|||||||
switch (id) {
|
switch (id) {
|
||||||
case (Max31865Definitions::REQUEST_CONFIG): {
|
case (Max31865Definitions::REQUEST_CONFIG): {
|
||||||
if (packet[1] != DEFAULT_CONFIG) {
|
if (packet[1] != DEFAULT_CONFIG) {
|
||||||
|
if (warningSwitch) {
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
// it propably would be better if we at least try one restart..
|
// it propably would be better if we at least try one restart..
|
||||||
sif::error << "Max31865PT1000Handler: 0x" << std::hex << this->getObjectId()
|
sif::warning << "Max31865PT1000Handler: 0x" << std::hex << this->getObjectId()
|
||||||
<< ": Invalid configuration reply" << std::endl;
|
<< ": Invalid configuration reply" << std::endl;
|
||||||
#else
|
#else
|
||||||
sif::printError("Max31865PT1000Handler: %04x: Invalid configuration reply!\n",
|
sif::printWarning("Max31865PT1000Handler: %04x: Invalid configuration reply!\n",
|
||||||
this->getObjectId());
|
this->getObjectId());
|
||||||
#endif
|
#endif
|
||||||
|
warningSwitch = false;
|
||||||
|
}
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
// set to true for invalid configs too for now.
|
// set to true for invalid configs too for now.
|
||||||
@ -505,10 +509,6 @@ ReturnValue_t Max31865PT1000Handler::getSwitches(const uint8_t **switches,
|
|||||||
return DeviceHandlerBase::NO_SWITCH;
|
return DeviceHandlerBase::NO_SWITCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Max31865PT1000Handler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) {
|
|
||||||
DeviceHandlerBase::doTransition(modeFrom, subModeFrom);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t Max31865PT1000Handler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t Max31865PT1000Handler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(Max31865Definitions::PoolIds::RTD_VALUE, new PoolEntry<float>({0}));
|
localDataPoolMap.emplace(Max31865Definitions::PoolIds::RTD_VALUE, new PoolEntry<float>({0}));
|
||||||
|
@ -74,8 +74,6 @@ class Max31865PT1000Handler : public DeviceHandlerBase {
|
|||||||
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
||||||
ReturnValue_t getSwitches(const uint8_t **switches, uint8_t *numberOfSwitches) override;
|
ReturnValue_t getSwitches(const uint8_t **switches, uint8_t *numberOfSwitches) override;
|
||||||
|
|
||||||
void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override;
|
|
||||||
|
|
||||||
void debugInterface(uint8_t positionTracker = 0, object_id_t objectId = 0,
|
void debugInterface(uint8_t positionTracker = 0, object_id_t objectId = 0,
|
||||||
uint32_t parameter = 0) override;
|
uint32_t parameter = 0) override;
|
||||||
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
@ -84,7 +82,8 @@ class Max31865PT1000Handler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t switchId = 0;
|
uint8_t switchId = 0;
|
||||||
bool instantNormal = true;
|
bool instantNormal = false;
|
||||||
|
bool warningSwitch = true;
|
||||||
|
|
||||||
enum class InternalState {
|
enum class InternalState {
|
||||||
NONE,
|
NONE,
|
||||||
|
@ -334,7 +334,7 @@ ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id,
|
|||||||
|
|
||||||
uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) {
|
uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) {
|
||||||
// 20 minutes transition delay is allowed
|
// 20 minutes transition delay is allowed
|
||||||
return 20 * 60 * 60 * 1000;
|
return 20 * 60 * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
|
@ -153,17 +153,16 @@ ReturnValue_t RadiationSensorHandler::interpretDeviceReply(DeviceCommandId_t id,
|
|||||||
offset += 2;
|
offset += 2;
|
||||||
dataset.ain7 = (*(packet + offset) << 8 | *(packet + offset + 1));
|
dataset.ain7 = (*(packet + offset) << 8 | *(packet + offset + 1));
|
||||||
|
|
||||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_RAD_SENSOR == 1
|
if (printPeriodicData) {
|
||||||
sif::info << "Radiation sensor temperature: " << dataset.temperatureCelcius << " °C"
|
sif::info << "Radiation sensor temperature: " << dataset.temperatureCelcius << " °C"
|
||||||
<< std::endl;
|
<< std::dec << std::endl;
|
||||||
sif::info << std::dec;
|
sif::info << "Radiation sensor ADC value channel 0: " << dataset.ain0 << std::endl;
|
||||||
sif::info << "Radiation sensor ADC value channel 0: " << dataset.ain0 << std::endl;
|
sif::info << "Radiation sensor ADC value channel 1: " << dataset.ain1 << std::endl;
|
||||||
sif::info << "Radiation sensor ADC value channel 1: " << dataset.ain1 << std::endl;
|
sif::info << "Radiation sensor ADC value channel 4: " << dataset.ain4 << std::endl;
|
||||||
sif::info << "Radiation sensor ADC value channel 4: " << dataset.ain4 << std::endl;
|
sif::info << "Radiation sensor ADC value channel 5: " << dataset.ain5 << std::endl;
|
||||||
sif::info << "Radiation sensor ADC value channel 5: " << dataset.ain5 << std::endl;
|
sif::info << "Radiation sensor ADC value channel 6: " << dataset.ain6 << std::endl;
|
||||||
sif::info << "Radiation sensor ADC value channel 6: " << dataset.ain6 << std::endl;
|
sif::info << "Radiation sensor ADC value channel 7: " << dataset.ain7 << std::endl;
|
||||||
sif::info << "Radiation sensor ADC value channel 7: " << dataset.ain7 << std::endl;
|
}
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
@ -191,3 +190,7 @@ ReturnValue_t RadiationSensorHandler::initializeLocalDataPool(localpool::DataPoo
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RadiationSensorHandler::setToGoToNormalModeImmediately() { this->goToNormalMode = true; }
|
void RadiationSensorHandler::setToGoToNormalModeImmediately() { this->goToNormalMode = true; }
|
||||||
|
|
||||||
|
void RadiationSensorHandler::enablePeriodicDataPrint(bool enable) {
|
||||||
|
this->printPeriodicData = enable;
|
||||||
|
}
|
||||||
|
@ -19,6 +19,7 @@ class RadiationSensorHandler : public DeviceHandlerBase {
|
|||||||
GpioIF *gpioIF);
|
GpioIF *gpioIF);
|
||||||
virtual ~RadiationSensorHandler();
|
virtual ~RadiationSensorHandler();
|
||||||
void setToGoToNormalModeImmediately();
|
void setToGoToNormalModeImmediately();
|
||||||
|
void enablePeriodicDataPrint(bool enable);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
@ -40,6 +41,7 @@ class RadiationSensorHandler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
enum class InternalState { SETUP, CONFIGURED };
|
enum class InternalState { SETUP, CONFIGURED };
|
||||||
|
|
||||||
|
bool printPeriodicData = false;
|
||||||
RAD_SENSOR::RadSensorDataset dataset;
|
RAD_SENSOR::RadSensorDataset dataset;
|
||||||
static const uint8_t MAX_CMD_LEN = RAD_SENSOR::READ_SIZE;
|
static const uint8_t MAX_CMD_LEN = RAD_SENSOR::READ_SIZE;
|
||||||
GpioIF *gpioIF = nullptr;
|
GpioIF *gpioIF = nullptr;
|
||||||
|
@ -10,15 +10,6 @@ SusHandler::SusHandler(object_id_t objectId, uint8_t susIdx, object_id_t comIF,
|
|||||||
|
|
||||||
SusHandler::~SusHandler() {}
|
SusHandler::~SusHandler() {}
|
||||||
|
|
||||||
ReturnValue_t SusHandler::initialize() {
|
|
||||||
ReturnValue_t result = RETURN_OK;
|
|
||||||
result = DeviceHandlerBase::initialize();
|
|
||||||
if (result != RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return RETURN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SusHandler::doStartUp() {
|
void SusHandler::doStartUp() {
|
||||||
if (comState == ComStates::IDLE) {
|
if (comState == ComStates::IDLE) {
|
||||||
comState = ComStates::WRITE_SETUP;
|
comState = ComStates::WRITE_SETUP;
|
||||||
@ -79,7 +70,7 @@ ReturnValue_t SusHandler::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
|||||||
*id = SUS::WRITE_SETUP;
|
*id = SUS::WRITE_SETUP;
|
||||||
return buildCommandFromCommand(*id, nullptr, 0);
|
return buildCommandFromCommand(*id, nullptr, 0);
|
||||||
}
|
}
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
|
@ -32,7 +32,6 @@ class SusHandler : public DeviceHandlerBase {
|
|||||||
|
|
||||||
void enablePeriodicPrintout(bool enable, uint8_t divider);
|
void enablePeriodicPrintout(bool enable, uint8_t divider);
|
||||||
|
|
||||||
virtual ReturnValue_t initialize() override;
|
|
||||||
void setToGoToNormalMode(bool enable);
|
void setToGoToNormalMode(bool enable);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
290
mission/system/AcsBoardAssembly.cpp
Normal file
290
mission/system/AcsBoardAssembly.cpp
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
#include "AcsBoardAssembly.h"
|
||||||
|
|
||||||
|
#include <devices/gpioIds.h>
|
||||||
|
#include <fsfw/power/PowerSwitchIF.h>
|
||||||
|
#include <fsfw/serviceinterface.h>
|
||||||
|
|
||||||
|
AcsBoardAssembly::AcsBoardAssembly(object_id_t objectId, object_id_t parentId,
|
||||||
|
PowerSwitchIF* switcher, AcsBoardHelper helper, GpioIF* gpioIF)
|
||||||
|
: DualLaneAssemblyBase(objectId, parentId, switcher, SWITCH_A, SWITCH_B,
|
||||||
|
POWER_STATE_MACHINE_TIMEOUT, SIDE_SWITCH_TRANSITION_NOT_ALLOWED,
|
||||||
|
TRANSITION_OTHER_SIDE_FAILED),
|
||||||
|
helper(helper),
|
||||||
|
gpioIF(gpioIF) {
|
||||||
|
if (switcher == nullptr) {
|
||||||
|
sif::error << "AcsBoardAssembly::AcsBoardAssembly: Invalid Power Switcher "
|
||||||
|
"IF passed"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
if (gpioIF == nullptr) {
|
||||||
|
sif::error << "AcsBoardAssembly::AcsBoardAssembly: Invalid GPIO IF passed" << std::endl;
|
||||||
|
}
|
||||||
|
ModeListEntry entry;
|
||||||
|
initModeTableEntry(helper.mgm0Lis3IdSideA, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.mgm1Rm3100IdSideA, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.mgm2Lis3IdSideB, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.mgm3Rm3100IdSideB, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.gyro0AdisIdSideA, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.gyro1L3gIdSideA, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.gyro2AdisIdSideB, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.gyro3L3gIdSideB, entry, modeTable);
|
||||||
|
initModeTableEntry(helper.gpsId, entry, modeTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t AcsBoardAssembly::commandChildren(Mode_t mode, Submode_t submode) {
|
||||||
|
using namespace duallane;
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
refreshHelperModes();
|
||||||
|
// Initialize the mode table to ensure all devices are in a defined state
|
||||||
|
modeTable[ModeTableIdx::GYRO_0_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_0_A].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::GYRO_1_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_1_A].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::GYRO_2_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_2_B].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::GYRO_3_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_3_B].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_0_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_0_A].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_1_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_1_A].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_2_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_2_B].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_3_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_3_B].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::GPS].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GPS].setSubmode(SUBMODE_NONE);
|
||||||
|
if (recoveryState != RecoveryState::RECOVERY_STARTED) {
|
||||||
|
if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) {
|
||||||
|
result = handleNormalOrOnModeCmd(mode, submode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HybridIterator<ModeListEntry> tableIter(modeTable.begin(), modeTable.end());
|
||||||
|
executeTable(tableIter);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t AcsBoardAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) {
|
||||||
|
using namespace duallane;
|
||||||
|
refreshHelperModes();
|
||||||
|
if (wantedSubmode == A_SIDE) {
|
||||||
|
if ((helper.gyro0SideAMode != wantedMode and helper.gyro1SideAMode != wantedMode) or
|
||||||
|
(helper.mgm0SideAMode != wantedMode and helper.mgm1SideAMode != wantedMode) or
|
||||||
|
helper.gpsMode != MODE_ON) {
|
||||||
|
return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
} else if (wantedSubmode == B_SIDE) {
|
||||||
|
if ((helper.gyro2SideBMode != wantedMode and helper.gyro3SideBMode != wantedMode) or
|
||||||
|
(helper.mgm2SideBMode != wantedMode and helper.mgm3SideBMode != wantedMode) or
|
||||||
|
helper.gpsMode != MODE_ON) {
|
||||||
|
return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
} else if (wantedSubmode == DUAL_MODE) {
|
||||||
|
if ((helper.gyro0SideAMode != wantedMode and helper.gyro1SideAMode != wantedMode and
|
||||||
|
helper.gyro2AdisIdSideB != wantedMode and helper.gyro3SideBMode != wantedMode) or
|
||||||
|
(helper.mgm0SideAMode != wantedMode and helper.mgm1SideAMode != wantedMode and
|
||||||
|
helper.mgm2SideBMode != wantedMode and helper.mgm3SideBMode != wantedMode) or
|
||||||
|
helper.gpsMode != MODE_ON) {
|
||||||
|
// Trigger event, but don't start any other transitions. This is the last fallback mode.
|
||||||
|
if (dualModeErrorSwitch) {
|
||||||
|
triggerEvent(NOT_ENOUGH_DEVICES_DUAL_MODE, 0, 0);
|
||||||
|
dualModeErrorSwitch = false;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t AcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode) {
|
||||||
|
using namespace duallane;
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
bool needsSecondStep = false;
|
||||||
|
auto cmdSeq = [&](object_id_t objectId, Mode_t devMode, ModeTableIdx tableIdx) {
|
||||||
|
if (mode == devMode) {
|
||||||
|
modeTable[tableIdx].setMode(mode);
|
||||||
|
} else if (mode == DeviceHandlerIF::MODE_NORMAL) {
|
||||||
|
if (isUseable(objectId, devMode)) {
|
||||||
|
if (devMode == MODE_ON) {
|
||||||
|
modeTable[tableIdx].setMode(mode);
|
||||||
|
modeTable[tableIdx].setSubmode(SUBMODE_NONE);
|
||||||
|
} else {
|
||||||
|
modeTable[tableIdx].setMode(MODE_ON);
|
||||||
|
modeTable[tableIdx].setSubmode(SUBMODE_NONE);
|
||||||
|
if (internalState != STATE_SECOND_STEP) {
|
||||||
|
needsSecondStep = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (mode == MODE_ON) {
|
||||||
|
if (isUseable(objectId, devMode)) {
|
||||||
|
modeTable[tableIdx].setMode(MODE_ON);
|
||||||
|
modeTable[tableIdx].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
bool gpsUsable = isUseable(helper.gpsId, helper.gpsMode);
|
||||||
|
switch (submode) {
|
||||||
|
case (A_SIDE): {
|
||||||
|
modeTable[ModeTableIdx::GYRO_2_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_2_B].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::GYRO_3_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_3_B].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_2_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_2_B].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_3_B].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_3_B].setSubmode(SUBMODE_NONE);
|
||||||
|
cmdSeq(helper.gyro0AdisIdSideA, helper.gyro0SideAMode, ModeTableIdx::GYRO_0_A);
|
||||||
|
cmdSeq(helper.gyro1L3gIdSideA, helper.gyro1SideAMode, ModeTableIdx::GYRO_1_A);
|
||||||
|
cmdSeq(helper.mgm0Lis3IdSideA, helper.mgm0SideAMode, ModeTableIdx::MGM_0_A);
|
||||||
|
cmdSeq(helper.mgm1Rm3100IdSideA, helper.mgm1SideAMode, ModeTableIdx::MGM_1_A);
|
||||||
|
if (gpsUsable) {
|
||||||
|
if (gpioIF->pullLow(gpioIds::GNSS_SELECT) != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
|
sif::error << "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull GNSS select low"
|
||||||
|
<< std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (B_SIDE): {
|
||||||
|
modeTable[ModeTableIdx::GYRO_0_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_0_A].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::GYRO_1_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::GYRO_1_A].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_0_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_0_A].setSubmode(SUBMODE_NONE);
|
||||||
|
modeTable[ModeTableIdx::MGM_1_A].setMode(MODE_OFF);
|
||||||
|
modeTable[ModeTableIdx::MGM_1_A].setSubmode(SUBMODE_NONE);
|
||||||
|
cmdSeq(helper.gyro2AdisIdSideB, helper.gyro2SideBMode, ModeTableIdx::GYRO_2_B);
|
||||||
|
cmdSeq(helper.gyro3L3gIdSideB, helper.gyro3SideBMode, ModeTableIdx::GYRO_3_B);
|
||||||
|
cmdSeq(helper.mgm2Lis3IdSideB, helper.mgm2SideBMode, ModeTableIdx::MGM_2_B);
|
||||||
|
cmdSeq(helper.mgm3Rm3100IdSideB, helper.mgm3SideBMode, ModeTableIdx::MGM_3_B);
|
||||||
|
if (gpsUsable) {
|
||||||
|
if (gpioIF->pullHigh(gpioIds::GNSS_SELECT) != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
|
sif::error << "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull GNSS select high"
|
||||||
|
<< std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (DUAL_MODE): {
|
||||||
|
cmdSeq(helper.gpsId, helper.gpsMode, ModeTableIdx::GPS);
|
||||||
|
cmdSeq(helper.gyro0AdisIdSideA, helper.gyro0SideAMode, ModeTableIdx::GYRO_0_A);
|
||||||
|
cmdSeq(helper.gyro1L3gIdSideA, helper.gyro1SideAMode, ModeTableIdx::GYRO_1_A);
|
||||||
|
cmdSeq(helper.mgm0Lis3IdSideA, helper.mgm0SideAMode, ModeTableIdx::MGM_0_A);
|
||||||
|
cmdSeq(helper.mgm1Rm3100IdSideA, helper.mgm1SideAMode, ModeTableIdx::MGM_1_A);
|
||||||
|
cmdSeq(helper.gyro2AdisIdSideB, helper.gyro2SideBMode, ModeTableIdx::GYRO_2_B);
|
||||||
|
cmdSeq(helper.gyro3L3gIdSideB, helper.gyro3SideBMode, ModeTableIdx::GYRO_3_B);
|
||||||
|
cmdSeq(helper.mgm2Lis3IdSideB, helper.mgm2SideBMode, ModeTableIdx::MGM_2_B);
|
||||||
|
cmdSeq(helper.mgm3Rm3100IdSideB, helper.mgm3SideBMode, ModeTableIdx::MGM_3_B);
|
||||||
|
ReturnValue_t status = RETURN_OK;
|
||||||
|
if (gpsUsable) {
|
||||||
|
if (defaultSubmode == Submodes::A_SIDE) {
|
||||||
|
status = gpioIF->pullLow(gpioIds::GNSS_SELECT);
|
||||||
|
} else {
|
||||||
|
status = gpioIF->pullHigh(gpioIds::GNSS_SELECT);
|
||||||
|
}
|
||||||
|
if (status != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
|
sif::error << "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull GNSS select to"
|
||||||
|
"default side for dual mode"
|
||||||
|
<< std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
sif::error << "AcsBoardAssembly::handleNormalModeCmd: Unknown submode" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (gpsUsable) {
|
||||||
|
modeTable[ModeTableIdx::GPS].setMode(MODE_ON);
|
||||||
|
modeTable[ModeTableIdx::GPS].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
if (needsSecondStep) {
|
||||||
|
result = NEED_SECOND_STEP;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AcsBoardAssembly::selectGpsInDualMode(duallane::Submodes side) {
|
||||||
|
using namespace duallane;
|
||||||
|
if (submode != Submodes::DUAL_MODE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
if (side == Submodes::A_SIDE) {
|
||||||
|
result = gpioIF->pullLow(gpioIds::GNSS_SELECT);
|
||||||
|
} else {
|
||||||
|
result = gpioIF->pullHigh(gpioIds::GNSS_SELECT);
|
||||||
|
}
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
|
sif::error << "AcsBoardAssembly::switchGpsInDualMode: Switching GPS failed" << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AcsBoardAssembly::refreshHelperModes() {
|
||||||
|
try {
|
||||||
|
helper.gyro0SideAMode = childrenMap.at(helper.gyro0AdisIdSideA).mode;
|
||||||
|
helper.gyro1SideAMode = childrenMap.at(helper.gyro1L3gIdSideA).mode;
|
||||||
|
helper.gyro2SideBMode = childrenMap.at(helper.gyro2AdisIdSideB).mode;
|
||||||
|
helper.gyro3SideBMode = childrenMap.at(helper.gyro2AdisIdSideB).mode;
|
||||||
|
helper.mgm0SideAMode = childrenMap.at(helper.mgm0Lis3IdSideA).mode;
|
||||||
|
helper.mgm1SideAMode = childrenMap.at(helper.mgm1Rm3100IdSideA).mode;
|
||||||
|
helper.mgm2SideBMode = childrenMap.at(helper.mgm2Lis3IdSideB).mode;
|
||||||
|
helper.mgm3SideBMode = childrenMap.at(helper.mgm3Rm3100IdSideB).mode;
|
||||||
|
helper.gpsMode = childrenMap.at(helper.gpsId).mode;
|
||||||
|
} catch (const std::out_of_range& e) {
|
||||||
|
sif::error << "AcsBoardAssembly::refreshHelperModes: Invalid map: " << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t AcsBoardAssembly::initialize() {
|
||||||
|
ReturnValue_t result = registerChild(helper.gyro0AdisIdSideA);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.gyro1L3gIdSideA);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.gyro2AdisIdSideB);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.gyro3L3gIdSideB);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.mgm0Lis3IdSideA);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.mgm1Rm3100IdSideA);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.mgm2Lis3IdSideB);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.mgm3Rm3100IdSideB);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = registerChild(helper.gpsId);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return AssemblyBase::initialize();
|
||||||
|
}
|
129
mission/system/AcsBoardAssembly.h
Normal file
129
mission/system/AcsBoardAssembly.h
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_ACSBOARDASSEMBLY_H_
|
||||||
|
#define MISSION_SYSTEM_ACSBOARDASSEMBLY_H_
|
||||||
|
|
||||||
|
#include <common/config/commonSubsystemIds.h>
|
||||||
|
#include <devices/powerSwitcherList.h>
|
||||||
|
#include <fsfw/objectmanager/frameworkObjects.h>
|
||||||
|
|
||||||
|
#include "DualLaneAssemblyBase.h"
|
||||||
|
#include "DualLanePowerStateMachine.h"
|
||||||
|
|
||||||
|
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),
|
||||||
|
gpsId(gpsId) {}
|
||||||
|
|
||||||
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
class PowerSwitchIF;
|
||||||
|
class GpioIF;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Assembly class which manages redundant ACS board sides
|
||||||
|
* @details
|
||||||
|
* This class takes care of ensuring that enough devices on the ACS board are available at all
|
||||||
|
* times. It does so by doing autonomous transitions to the redundant side or activating both sides
|
||||||
|
* if not enough devices are available.
|
||||||
|
*
|
||||||
|
* This class also takes care of switching on the A side and/or B side power lanes. Normally,
|
||||||
|
* doing this task would be performed by the device handlers, but this is not possible for the
|
||||||
|
* ACS board where multiple sensors share the same power supply.
|
||||||
|
*/
|
||||||
|
class AcsBoardAssembly : public DualLaneAssemblyBase {
|
||||||
|
public:
|
||||||
|
// Use these variables instead of magic numbers when generator was updated
|
||||||
|
// TRANSITION_OTHER_SIDE_FAILED_ID
|
||||||
|
// NOT_ENOUGH_DEVICES_DUAL_MODE_ID
|
||||||
|
// POWER_STATE_MACHINE_TIMEOUT_ID
|
||||||
|
// SIDE_SWITCH_TRANSITION_NOT_ALLOWED_ID
|
||||||
|
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::ACS_BOARD_ASS;
|
||||||
|
static constexpr Event TRANSITION_OTHER_SIDE_FAILED =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 0, severity::HIGH);
|
||||||
|
static constexpr Event NOT_ENOUGH_DEVICES_DUAL_MODE =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 1, severity::HIGH);
|
||||||
|
static constexpr Event POWER_STATE_MACHINE_TIMEOUT =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
||||||
|
//! [EXPORT] : [COMMENT] Not implemented, would increase already high complexity. Operator
|
||||||
|
//! should instead command the assembly off first and then command the assembly on into the
|
||||||
|
//! desired mode/submode combination
|
||||||
|
static constexpr Event SIDE_SWITCH_TRANSITION_NOT_ALLOWED =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 3, severity::LOW);
|
||||||
|
|
||||||
|
static constexpr uint8_t NUMBER_DEVICES_MODE_TABLE = 9;
|
||||||
|
|
||||||
|
AcsBoardAssembly(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher,
|
||||||
|
AcsBoardHelper helper, GpioIF* gpioIF);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In dual mode, the A side or the B side GPS device can be used, but not both.
|
||||||
|
* This function can be used to switch the used GPS device.
|
||||||
|
* @param side
|
||||||
|
*/
|
||||||
|
void selectGpsInDualMode(duallane::Submodes side);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr pcduSwitches::Switches SWITCH_A =
|
||||||
|
pcduSwitches::Switches::PDU1_CH7_ACS_A_SIDE_3V3;
|
||||||
|
static constexpr pcduSwitches::Switches SWITCH_B =
|
||||||
|
pcduSwitches::Switches::PDU2_CH7_ACS_BOARD_SIDE_B_3V3;
|
||||||
|
|
||||||
|
bool tryingOtherSide = false;
|
||||||
|
bool dualModeErrorSwitch = true;
|
||||||
|
AcsBoardHelper helper;
|
||||||
|
GpioIF* gpioIF = nullptr;
|
||||||
|
|
||||||
|
FixedArrayList<ModeListEntry, NUMBER_DEVICES_MODE_TABLE> modeTable;
|
||||||
|
|
||||||
|
ReturnValue_t initialize() override;
|
||||||
|
|
||||||
|
// AssemblyBase overrides
|
||||||
|
ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override;
|
||||||
|
ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override;
|
||||||
|
|
||||||
|
ReturnValue_t handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode);
|
||||||
|
void refreshHelperModes();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_ACSBOARDASSEMBLY_H_ */
|
6
mission/system/AcsBoardFdir.cpp
Normal file
6
mission/system/AcsBoardFdir.cpp
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include "AcsBoardFdir.h"
|
||||||
|
|
||||||
|
#include <common/config/commonObjects.h>
|
||||||
|
|
||||||
|
AcsBoardFdir::AcsBoardFdir(object_id_t sensorId)
|
||||||
|
: DeviceHandlerFailureIsolation(sensorId, objects::ACS_BOARD_ASS) {}
|
11
mission/system/AcsBoardFdir.h
Normal file
11
mission/system/AcsBoardFdir.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_ACSBOARDFDIR_H_
|
||||||
|
#define MISSION_SYSTEM_ACSBOARDFDIR_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerFailureIsolation.h>
|
||||||
|
|
||||||
|
class AcsBoardFdir : public DeviceHandlerFailureIsolation {
|
||||||
|
public:
|
||||||
|
AcsBoardFdir(object_id_t sensorId);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_ACSBOARDFDIR_H_ */
|
1
mission/system/AcsSubsystem.cpp
Normal file
1
mission/system/AcsSubsystem.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "AcsSubsystem.h"
|
4
mission/system/AcsSubsystem.h
Normal file
4
mission/system/AcsSubsystem.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_ACSSUBSYSTEM_H_
|
||||||
|
#define MISSION_SYSTEM_ACSSUBSYSTEM_H_
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_ACSSUBSYSTEM_H_ */
|
15
mission/system/CMakeLists.txt
Normal file
15
mission/system/CMakeLists.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
target_sources(${LIB_EIVE_MISSION} PRIVATE
|
||||||
|
AcsBoardAssembly.cpp
|
||||||
|
SusAssembly.cpp
|
||||||
|
AcsSubsystem.cpp
|
||||||
|
EiveSystem.cpp
|
||||||
|
ComSubsystem.cpp
|
||||||
|
DualLanePowerStateMachine.cpp
|
||||||
|
PowerStateMachineBase.cpp
|
||||||
|
DualLaneAssemblyBase.cpp
|
||||||
|
TcsBoardAssembly.cpp
|
||||||
|
|
||||||
|
AcsBoardFdir.cpp
|
||||||
|
SusFdir.cpp
|
||||||
|
RtdFdir.cpp
|
||||||
|
)
|
1
mission/system/ComSubsystem.cpp
Normal file
1
mission/system/ComSubsystem.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "ComSubsystem.h"
|
4
mission/system/ComSubsystem.h
Normal file
4
mission/system/ComSubsystem.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_COMSUBSYSTEM_H_
|
||||||
|
#define MISSION_SYSTEM_COMSUBSYSTEM_H_
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_COMSUBSYSTEM_H_ */
|
237
mission/system/DualLaneAssemblyBase.cpp
Normal file
237
mission/system/DualLaneAssemblyBase.cpp
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
#include "DualLaneAssemblyBase.h"
|
||||||
|
|
||||||
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
|
|
||||||
|
DualLaneAssemblyBase::DualLaneAssemblyBase(object_id_t objectId, object_id_t parentId,
|
||||||
|
PowerSwitchIF* pwrSwitcher,
|
||||||
|
pcduSwitches::Switches switch1,
|
||||||
|
pcduSwitches::Switches switch2, Event pwrTimeoutEvent,
|
||||||
|
Event sideSwitchNotAllowedEvent,
|
||||||
|
Event transitionOtherSideFailedEvent)
|
||||||
|
: AssemblyBase(objectId, parentId, 20),
|
||||||
|
pwrStateMachine(switch1, switch2, pwrSwitcher),
|
||||||
|
pwrTimeoutEvent(pwrTimeoutEvent),
|
||||||
|
sideSwitchNotAllowedEvent(sideSwitchNotAllowedEvent),
|
||||||
|
transitionOtherSideFailedEvent(transitionOtherSideFailedEvent) {
|
||||||
|
eventQueue = QueueFactory::instance()->createMessageQueue(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DualLaneAssemblyBase::performChildOperation() {
|
||||||
|
using namespace duallane;
|
||||||
|
if (pwrStateMachine.active()) {
|
||||||
|
pwrStateMachineWrapper();
|
||||||
|
}
|
||||||
|
// Only perform the regular child operation if the power state machine is not active.
|
||||||
|
// It does not make any sense to command device modes while the power switcher is busy
|
||||||
|
// switching off or on devices.
|
||||||
|
if (not pwrStateMachine.active()) {
|
||||||
|
AssemblyBase::performChildOperation();
|
||||||
|
// TODO: Handle Event Queue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DualLaneAssemblyBase::startTransition(Mode_t mode, Submode_t submode) {
|
||||||
|
// doStartTransition(mode, submode);
|
||||||
|
using namespace duallane;
|
||||||
|
pwrStateMachine.reset();
|
||||||
|
if (mode != MODE_OFF) {
|
||||||
|
// If anything other than MODE_OFF is commanded, perform power state machine first
|
||||||
|
// Cache the target modes, required by power state machine
|
||||||
|
pwrStateMachine.start(mode, submode);
|
||||||
|
// Cache these for later after the power state machine has finished
|
||||||
|
targetMode = mode;
|
||||||
|
targetSubmode = submode;
|
||||||
|
} else {
|
||||||
|
AssemblyBase::startTransition(mode, submode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DualLaneAssemblyBase::isUseable(object_id_t object, Mode_t mode) {
|
||||||
|
if (healthHelper.healthTable->isFaulty(object)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if device is already in target mode
|
||||||
|
if (childrenMap[object].mode == mode) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (healthHelper.healthTable->isCommandable(object)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t DualLaneAssemblyBase::pwrStateMachineWrapper() {
|
||||||
|
using namespace power;
|
||||||
|
OpCodes opCode = pwrStateMachine.fsm();
|
||||||
|
if (customRecoveryStates == RecoveryCustomStates::IDLE) {
|
||||||
|
if (opCode == OpCodes::NONE) {
|
||||||
|
return RETURN_OK;
|
||||||
|
} else if (opCode == OpCodes::TO_OFF_DONE) {
|
||||||
|
// Will be called for transitions to MODE_OFF, where everything is done after power switching
|
||||||
|
finishModeOp();
|
||||||
|
} else if (opCode == OpCodes::TO_NOT_OFF_DONE) {
|
||||||
|
// Will be called for transitions from MODE_OFF to anything else, where the mode still has
|
||||||
|
// to be commanded after power switching
|
||||||
|
AssemblyBase::startTransition(targetMode, targetSubmode);
|
||||||
|
} else if (opCode == OpCodes::TIMEOUT_OCCURED) {
|
||||||
|
if (powerRetryCounter == 0) {
|
||||||
|
powerRetryCounter++;
|
||||||
|
pwrStateMachine.reset();
|
||||||
|
} else {
|
||||||
|
#if OBSW_VERBOSE_LEVEL >= 1
|
||||||
|
sif::warning << "Timeout occured in power state machine" << std::endl;
|
||||||
|
#endif
|
||||||
|
triggerEvent(pwrTimeoutEvent, 0, 0);
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t DualLaneAssemblyBase::isModeCombinationValid(Mode_t mode, Submode_t submode) {
|
||||||
|
using namespace duallane;
|
||||||
|
if (submode != A_SIDE and submode != B_SIDE and submode != DUAL_MODE) {
|
||||||
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
|
}
|
||||||
|
if (sideSwitchTransition(mode, submode)) {
|
||||||
|
// I could implement this but this would increase the already high complexity. This is not
|
||||||
|
// necessary. The operator should can send a command to switch the assembly off first and
|
||||||
|
// then send a command to turn on the other side, either to ON or to NORMAL
|
||||||
|
triggerEvent(SIDE_SWITCH_TRANSITION_NOT_ALLOWED_ID, 0, 0);
|
||||||
|
return TRANS_NOT_ALLOWED;
|
||||||
|
}
|
||||||
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DualLaneAssemblyBase::handleModeReached() {
|
||||||
|
using namespace duallane;
|
||||||
|
if (targetMode == MODE_OFF) {
|
||||||
|
pwrStateMachine.start(targetMode, targetSubmode);
|
||||||
|
// Now we can switch off the power. After that, the AssemblyBase::handleModeReached function
|
||||||
|
// will be called
|
||||||
|
pwrStateMachineWrapper();
|
||||||
|
} else {
|
||||||
|
finishModeOp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageQueueId_t DualLaneAssemblyBase::getEventReceptionQueue() { return eventQueue->getId(); }
|
||||||
|
|
||||||
|
void DualLaneAssemblyBase::handleChildrenLostMode(ReturnValue_t result) {
|
||||||
|
using namespace duallane;
|
||||||
|
// Some ACS board components are required for Safe-Mode. It would be good if the software
|
||||||
|
// transitions from A side to B side and from B side to dual mode autonomously
|
||||||
|
// to ensure that that enough sensors are available without an operators intervention.
|
||||||
|
// Therefore, the lost mode handler was overwritten to start these transitions
|
||||||
|
Submode_t nextSubmode = Submodes::A_SIDE;
|
||||||
|
if (submode == Submodes::A_SIDE) {
|
||||||
|
nextSubmode = Submodes::B_SIDE;
|
||||||
|
}
|
||||||
|
if (not tryingOtherSide) {
|
||||||
|
triggerEvent(CANT_KEEP_MODE, mode, submode);
|
||||||
|
startTransition(mode, nextSubmode);
|
||||||
|
tryingOtherSide = true;
|
||||||
|
} else {
|
||||||
|
// Not sure when this would happen. This flag is reset if the mode was reached. If it
|
||||||
|
// was not reached, the transition failure handler should be called.
|
||||||
|
sif::error << "DualLaneAssemblyBase::handleChildrenLostMode: Wrong handler called" << std::endl;
|
||||||
|
triggerEvent(transitionOtherSideFailedEvent, mode, targetSubmode);
|
||||||
|
startTransition(mode, Submodes::DUAL_MODE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DualLaneAssemblyBase::handleModeTransitionFailed(ReturnValue_t result) {
|
||||||
|
using namespace duallane;
|
||||||
|
Submode_t nextSubmode = Submodes::A_SIDE;
|
||||||
|
if (submode == Submodes::A_SIDE) {
|
||||||
|
nextSubmode = Submodes::B_SIDE;
|
||||||
|
}
|
||||||
|
// Check whether the transition was started because the mode could not be kept (not commanded).
|
||||||
|
// If this is not the case, start transition to other side. If it is the case, start
|
||||||
|
// transition to dual mode.
|
||||||
|
if (not tryingOtherSide) {
|
||||||
|
triggerEvent(CANT_KEEP_MODE, mode, submode);
|
||||||
|
startTransition(mode, nextSubmode);
|
||||||
|
tryingOtherSide = true;
|
||||||
|
} else {
|
||||||
|
triggerEvent(transitionOtherSideFailedEvent, mode, targetSubmode);
|
||||||
|
startTransition(mode, Submodes::DUAL_MODE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DualLaneAssemblyBase::checkAndHandleRecovery() {
|
||||||
|
using namespace power;
|
||||||
|
OpCodes opCode = OpCodes::NONE;
|
||||||
|
if (recoveryState == RECOVERY_IDLE) {
|
||||||
|
return AssemblyBase::checkAndHandleRecovery();
|
||||||
|
}
|
||||||
|
if (customRecoveryStates == IDLE) {
|
||||||
|
pwrStateMachine.start(MODE_OFF, 0);
|
||||||
|
customRecoveryStates = RecoveryCustomStates::POWER_SWITCHING_OFF;
|
||||||
|
}
|
||||||
|
if (customRecoveryStates == POWER_SWITCHING_OFF) {
|
||||||
|
opCode = pwrStateMachine.fsm();
|
||||||
|
if (opCode == OpCodes::TO_OFF_DONE or opCode == OpCodes::TIMEOUT_OCCURED) {
|
||||||
|
customRecoveryStates = RecoveryCustomStates::POWER_SWITCHING_ON;
|
||||||
|
pwrStateMachine.start(targetMode, targetSubmode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (customRecoveryStates == POWER_SWITCHING_ON) {
|
||||||
|
opCode = pwrStateMachine.fsm();
|
||||||
|
if (opCode == OpCodes::TO_NOT_OFF_DONE or opCode == OpCodes::TIMEOUT_OCCURED) {
|
||||||
|
customRecoveryStates = RecoveryCustomStates::DONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (customRecoveryStates == DONE) {
|
||||||
|
bool pendingRecovery = AssemblyBase::checkAndHandleRecovery();
|
||||||
|
if (not pendingRecovery) {
|
||||||
|
pwrStateMachine.reset();
|
||||||
|
customRecoveryStates = RecoveryCustomStates::IDLE;
|
||||||
|
}
|
||||||
|
// For a recovery on one side, only do the recovery once
|
||||||
|
for (auto& child : childrenMap) {
|
||||||
|
if (healthHelper.healthTable->getHealth(child.first) == HasHealthIF::NEEDS_RECOVERY) {
|
||||||
|
sendHealthCommand(child.second.commandQueue, HEALTHY);
|
||||||
|
child.second.healthChanged = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pendingRecovery;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DualLaneAssemblyBase::sideSwitchTransition(Mode_t mode, Submode_t submode) {
|
||||||
|
using namespace duallane;
|
||||||
|
if (this->mode == MODE_OFF) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (this->mode == MODE_ON or this->mode == DeviceHandlerIF::MODE_NORMAL) {
|
||||||
|
if (this->submode == Submodes::A_SIDE and submode == Submodes::B_SIDE) {
|
||||||
|
return true;
|
||||||
|
} else if (this->submode == Submodes::B_SIDE and submode == Submodes::A_SIDE) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DualLaneAssemblyBase::finishModeOp() {
|
||||||
|
using namespace duallane;
|
||||||
|
AssemblyBase::handleModeReached();
|
||||||
|
pwrStateMachine.reset();
|
||||||
|
powerRetryCounter = 0;
|
||||||
|
tryingOtherSide = false;
|
||||||
|
dualModeErrorSwitch = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DualLaneAssemblyBase::setPreferredSide(duallane::Submodes submode) {
|
||||||
|
using namespace duallane;
|
||||||
|
if (submode != Submodes::A_SIDE and submode != Submodes::B_SIDE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->defaultSubmode = submode;
|
||||||
|
}
|
102
mission/system/DualLaneAssemblyBase.h
Normal file
102
mission/system/DualLaneAssemblyBase.h
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_DUALLANEASSEMBLYBASE_H_
|
||||||
|
#define MISSION_SYSTEM_DUALLANEASSEMBLYBASE_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/AssemblyBase.h>
|
||||||
|
#include <mission/system/DualLanePowerStateMachine.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
class DualLaneAssemblyBase : public AssemblyBase, public ConfirmsFailuresIF {
|
||||||
|
public:
|
||||||
|
static constexpr UniqueEventId_t TRANSITION_OTHER_SIDE_FAILED_ID = 0;
|
||||||
|
static constexpr UniqueEventId_t NOT_ENOUGH_DEVICES_DUAL_MODE_ID = 1;
|
||||||
|
static constexpr UniqueEventId_t POWER_STATE_MACHINE_TIMEOUT_ID = 2;
|
||||||
|
static constexpr UniqueEventId_t SIDE_SWITCH_TRANSITION_NOT_ALLOWED_ID = 3;
|
||||||
|
|
||||||
|
DualLaneAssemblyBase(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher,
|
||||||
|
pcduSwitches::Switches switch1, pcduSwitches::Switches switch2,
|
||||||
|
Event pwrSwitchTimeoutEvent, Event sideSwitchNotAllowedEvent,
|
||||||
|
Event transitionOtherSideFailedEvent);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// This helper object complete encapsulates power switching
|
||||||
|
DualLanePowerStateMachine pwrStateMachine;
|
||||||
|
Event pwrTimeoutEvent;
|
||||||
|
Event sideSwitchNotAllowedEvent;
|
||||||
|
Event transitionOtherSideFailedEvent;
|
||||||
|
uint8_t powerRetryCounter = 0;
|
||||||
|
bool tryingOtherSide = false;
|
||||||
|
bool dualModeErrorSwitch = true;
|
||||||
|
duallane::Submodes defaultSubmode = duallane::Submodes::A_SIDE;
|
||||||
|
|
||||||
|
enum RecoveryCustomStates {
|
||||||
|
IDLE,
|
||||||
|
POWER_SWITCHING_OFF,
|
||||||
|
POWER_SWITCHING_ON,
|
||||||
|
DONE
|
||||||
|
} customRecoveryStates = RecoveryCustomStates::IDLE;
|
||||||
|
|
||||||
|
MessageQueueIF* eventQueue = nullptr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
virtual ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override;
|
||||||
|
/**
|
||||||
|
* Custom recovery implementation to ensure that the power lines are commanded off for a
|
||||||
|
* recovery.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
virtual bool checkAndHandleRecovery() override;
|
||||||
|
void setPreferredSide(duallane::Submodes submode);
|
||||||
|
virtual void performChildOperation() override;
|
||||||
|
virtual void startTransition(Mode_t mode, Submode_t submode) override;
|
||||||
|
virtual void handleChildrenLostMode(ReturnValue_t result) override;
|
||||||
|
virtual void handleModeTransitionFailed(ReturnValue_t result) override;
|
||||||
|
virtual void handleModeReached() override;
|
||||||
|
|
||||||
|
MessageQueueId_t getEventReceptionQueue() override;
|
||||||
|
|
||||||
|
bool sideSwitchTransition(Mode_t mode, Submode_t submode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
|
||||||
|
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_ */
|
111
mission/system/DualLanePowerStateMachine.cpp
Normal file
111
mission/system/DualLanePowerStateMachine.cpp
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#include "DualLanePowerStateMachine.h"
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/AssemblyBase.h>
|
||||||
|
#include <fsfw/power/PowerSwitchIF.h>
|
||||||
|
|
||||||
|
DualLanePowerStateMachine::DualLanePowerStateMachine(pcduSwitches::Switches switchA,
|
||||||
|
pcduSwitches::Switches switchB,
|
||||||
|
PowerSwitchIF* pwrSwitcher,
|
||||||
|
dur_millis_t checkTimeout)
|
||||||
|
: PowerStateMachineBase(pwrSwitcher, checkTimeout), SWITCH_A(switchA), SWITCH_B(switchB) {}
|
||||||
|
|
||||||
|
power::OpCodes DualLanePowerStateMachine::fsm() {
|
||||||
|
using namespace duallane;
|
||||||
|
ReturnValue_t switchStateA = RETURN_OK;
|
||||||
|
ReturnValue_t switchStateB = RETURN_OK;
|
||||||
|
if (state == power::States::IDLE or state == power::States::MODE_COMMANDING) {
|
||||||
|
return opResult;
|
||||||
|
}
|
||||||
|
if (state == power::States::SWITCHING_POWER or state == power::States::CHECKING_POWER) {
|
||||||
|
switchStateA = pwrSwitcher->getSwitchState(SWITCH_A);
|
||||||
|
switchStateB = pwrSwitcher->getSwitchState(SWITCH_B);
|
||||||
|
} else {
|
||||||
|
return opResult;
|
||||||
|
}
|
||||||
|
if (targetMode == HasModesIF::MODE_OFF) {
|
||||||
|
if (switchStateA == PowerSwitchIF::SWITCH_OFF and switchStateB == PowerSwitchIF::SWITCH_OFF) {
|
||||||
|
state = power::States::IDLE;
|
||||||
|
opResult = power::OpCodes::TO_OFF_DONE;
|
||||||
|
return opResult;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (targetSubmode) {
|
||||||
|
case (A_SIDE): {
|
||||||
|
if (switchStateA == PowerSwitchIF::SWITCH_ON and
|
||||||
|
switchStateB == PowerSwitchIF::SWITCH_OFF) {
|
||||||
|
state = power::States::MODE_COMMANDING;
|
||||||
|
opResult = power::OpCodes::TO_NOT_OFF_DONE;
|
||||||
|
return opResult;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (B_SIDE): {
|
||||||
|
if (switchStateA == PowerSwitchIF::SWITCH_OFF and
|
||||||
|
switchStateB == PowerSwitchIF::SWITCH_ON) {
|
||||||
|
state = power::States::MODE_COMMANDING;
|
||||||
|
opResult = power::OpCodes::TO_NOT_OFF_DONE;
|
||||||
|
return opResult;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (DUAL_MODE): {
|
||||||
|
if (switchStateA == PowerSwitchIF::SWITCH_ON and switchStateB == PowerSwitchIF::SWITCH_ON) {
|
||||||
|
state = power::States::MODE_COMMANDING;
|
||||||
|
opResult = power::OpCodes::TO_NOT_OFF_DONE;
|
||||||
|
return opResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state == power::States::SWITCHING_POWER) {
|
||||||
|
if (targetMode == HasModesIF::MODE_OFF) {
|
||||||
|
if (switchStateA != PowerSwitchIF::SWITCH_OFF) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_A, PowerSwitchIF::SWITCH_OFF);
|
||||||
|
}
|
||||||
|
if (switchStateB != PowerSwitchIF::SWITCH_OFF) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_B, PowerSwitchIF::SWITCH_OFF);
|
||||||
|
}
|
||||||
|
checkTimeout.resetTimer();
|
||||||
|
} else {
|
||||||
|
switch (targetSubmode) {
|
||||||
|
case (A_SIDE): {
|
||||||
|
if (switchStateA != PowerSwitchIF::SWITCH_ON) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_A, PowerSwitchIF::SWITCH_ON);
|
||||||
|
}
|
||||||
|
if (switchStateB != PowerSwitchIF::SWITCH_OFF) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_B, PowerSwitchIF::SWITCH_OFF);
|
||||||
|
}
|
||||||
|
checkTimeout.resetTimer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (B_SIDE): {
|
||||||
|
if (switchStateA != PowerSwitchIF::SWITCH_OFF) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_A, PowerSwitchIF::SWITCH_OFF);
|
||||||
|
}
|
||||||
|
if (switchStateB != PowerSwitchIF::SWITCH_ON) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_B, PowerSwitchIF::SWITCH_ON);
|
||||||
|
}
|
||||||
|
checkTimeout.resetTimer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (DUAL_MODE): {
|
||||||
|
if (switchStateA != PowerSwitchIF::SWITCH_ON) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_A, PowerSwitchIF::SWITCH_ON);
|
||||||
|
}
|
||||||
|
if (switchStateB != PowerSwitchIF::SWITCH_ON) {
|
||||||
|
pwrSwitcher->sendSwitchCommand(SWITCH_B, PowerSwitchIF::SWITCH_ON);
|
||||||
|
}
|
||||||
|
checkTimeout.resetTimer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state = power::States::CHECKING_POWER;
|
||||||
|
}
|
||||||
|
if (state == power::States::CHECKING_POWER) {
|
||||||
|
if (checkTimeout.hasTimedOut()) {
|
||||||
|
return power::OpCodes::TIMEOUT_OCCURED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return opResult;
|
||||||
|
}
|
25
mission/system/DualLanePowerStateMachine.h
Normal file
25
mission/system/DualLanePowerStateMachine.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_DUALLANEPOWERSTATEMACHINE_H_
|
||||||
|
#define MISSION_SYSTEM_DUALLANEPOWERSTATEMACHINE_H_
|
||||||
|
|
||||||
|
#include <devices/powerSwitcherList.h>
|
||||||
|
#include <fsfw/modes/HasModesIF.h>
|
||||||
|
#include <mission/system/PowerStateMachineBase.h>
|
||||||
|
|
||||||
|
#include "definitions.h"
|
||||||
|
|
||||||
|
class AssemblyBase;
|
||||||
|
class PowerSwitchIF;
|
||||||
|
|
||||||
|
class DualLanePowerStateMachine : public PowerStateMachineBase {
|
||||||
|
public:
|
||||||
|
DualLanePowerStateMachine(pcduSwitches::Switches switchA, pcduSwitches::Switches switchB,
|
||||||
|
PowerSwitchIF* pwrSwitcher, dur_millis_t checkTimeout = 5000);
|
||||||
|
power::OpCodes fsm() override;
|
||||||
|
|
||||||
|
const pcduSwitches::Switches SWITCH_A;
|
||||||
|
const pcduSwitches::Switches SWITCH_B;
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_DUALLANEPOWERSTATEMACHINE_H_ */
|
1
mission/system/EiveSystem.cpp
Normal file
1
mission/system/EiveSystem.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "EiveSystem.h"
|
4
mission/system/EiveSystem.h
Normal file
4
mission/system/EiveSystem.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_EIVESYSTEM_H_
|
||||||
|
#define MISSION_SYSTEM_EIVESYSTEM_H_
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_EIVESYSTEM_H_ */
|
1
mission/system/PayloadSubsystem.cpp
Normal file
1
mission/system/PayloadSubsystem.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "PayloadSubsystem.h"
|
4
mission/system/PayloadSubsystem.h
Normal file
4
mission/system/PayloadSubsystem.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_PAYLOADSUBSYSTEM_H_
|
||||||
|
#define MISSION_SYSTEM_PAYLOADSUBSYSTEM_H_
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_PAYLOADSUBSYSTEM_H_ */
|
1
mission/system/PlPcduAssembly.cpp
Normal file
1
mission/system/PlPcduAssembly.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "PlPcduAssembly.h"
|
4
mission/system/PlPcduAssembly.h
Normal file
4
mission/system/PlPcduAssembly.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_PLPCDUASSEMBLY_H_
|
||||||
|
#define MISSION_SYSTEM_PLPCDUASSEMBLY_H_
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_PLPCDUASSEMBLY_H_ */
|
33
mission/system/PowerStateMachineBase.cpp
Normal file
33
mission/system/PowerStateMachineBase.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include "PowerStateMachineBase.h"
|
||||||
|
|
||||||
|
PowerStateMachineBase::PowerStateMachineBase(PowerSwitchIF *pwrSwitcher, dur_millis_t checkTimeout)
|
||||||
|
: pwrSwitcher(pwrSwitcher), checkTimeout(checkTimeout) {}
|
||||||
|
|
||||||
|
void PowerStateMachineBase::reset() {
|
||||||
|
state = power::States::IDLE;
|
||||||
|
opResult = power::OpCodes::NONE;
|
||||||
|
targetMode = HasModesIF::MODE_OFF;
|
||||||
|
targetSubmode = 0;
|
||||||
|
checkTimeout.resetTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerStateMachineBase::setCheckTimeout(dur_millis_t timeout) {
|
||||||
|
checkTimeout.setTimeout(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PowerStateMachineBase::start(Mode_t mode, Submode_t submode) {
|
||||||
|
reset();
|
||||||
|
checkTimeout.resetTimer();
|
||||||
|
targetMode = mode;
|
||||||
|
targetSubmode = submode;
|
||||||
|
state = power::States::SWITCHING_POWER;
|
||||||
|
}
|
||||||
|
|
||||||
|
power::States PowerStateMachineBase::getState() const { return state; }
|
||||||
|
|
||||||
|
bool PowerStateMachineBase::active() {
|
||||||
|
if (state == power::States::IDLE or state == power::States::MODE_COMMANDING) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
31
mission/system/PowerStateMachineBase.h
Normal file
31
mission/system/PowerStateMachineBase.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_POWERSTATEMACHINE_H_
|
||||||
|
#define MISSION_SYSTEM_POWERSTATEMACHINE_H_
|
||||||
|
|
||||||
|
#include <fsfw/modes/HasModesIF.h>
|
||||||
|
#include <fsfw/power/PowerSwitchIF.h>
|
||||||
|
#include <fsfw/timemanager/Countdown.h>
|
||||||
|
|
||||||
|
#include "definitions.h"
|
||||||
|
|
||||||
|
class PowerStateMachineBase : public HasReturnvaluesIF {
|
||||||
|
public:
|
||||||
|
PowerStateMachineBase(PowerSwitchIF* pwrSwitcher, dur_millis_t checkTimeout);
|
||||||
|
|
||||||
|
virtual power::OpCodes fsm() = 0;
|
||||||
|
|
||||||
|
void setCheckTimeout(dur_millis_t timeout);
|
||||||
|
void reset();
|
||||||
|
void start(Mode_t mode, Submode_t submode);
|
||||||
|
bool active();
|
||||||
|
power::States getState() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
power::OpCodes opResult = power::OpCodes::NONE;
|
||||||
|
power::States state = power::States::IDLE;
|
||||||
|
PowerSwitchIF* pwrSwitcher = nullptr;
|
||||||
|
Mode_t targetMode = HasModesIF::MODE_OFF;
|
||||||
|
Submode_t targetSubmode = 0;
|
||||||
|
Countdown checkTimeout;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_POWERSTATEMACHINE_H_ */
|
6
mission/system/RtdFdir.cpp
Normal file
6
mission/system/RtdFdir.cpp
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include "RtdFdir.h"
|
||||||
|
|
||||||
|
#include <common/config/commonObjects.h>
|
||||||
|
|
||||||
|
RtdFdir::RtdFdir(object_id_t sensorId)
|
||||||
|
: DeviceHandlerFailureIsolation(sensorId, objects::TCS_BOARD_ASS) {}
|
11
mission/system/RtdFdir.h
Normal file
11
mission/system/RtdFdir.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_RTDFDIR_H_
|
||||||
|
#define MISSION_SYSTEM_RTDFDIR_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerFailureIsolation.h>
|
||||||
|
|
||||||
|
class RtdFdir : public DeviceHandlerFailureIsolation {
|
||||||
|
public:
|
||||||
|
RtdFdir(object_id_t sensorId);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_RTDFDIR_H_ */
|
155
mission/system/SusAssembly.cpp
Normal file
155
mission/system/SusAssembly.cpp
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
#include "SusAssembly.h"
|
||||||
|
|
||||||
|
#include <devices/powerSwitcherList.h>
|
||||||
|
#include <fsfw/power/PowerSwitchIF.h>
|
||||||
|
#include <fsfw/serviceinterface.h>
|
||||||
|
|
||||||
|
SusAssembly::SusAssembly(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher,
|
||||||
|
SusAssHelper helper)
|
||||||
|
: DualLaneAssemblyBase(objectId, parentId, pwrSwitcher, SWITCH_NOM, SWITCH_RED,
|
||||||
|
POWER_STATE_MACHINE_TIMEOUT, SIDE_SWITCH_TRANSITION_NOT_ALLOWED,
|
||||||
|
TRANSITION_OTHER_SIDE_FAILED),
|
||||||
|
helper(helper),
|
||||||
|
pwrSwitcher(pwrSwitcher) {
|
||||||
|
ModeListEntry entry;
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS; idx++) {
|
||||||
|
initModeTableEntry(helper.susIds[idx], entry, modeTable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t SusAssembly::commandChildren(Mode_t mode, Submode_t submode) {
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
refreshHelperModes();
|
||||||
|
// Initialize the mode table to ensure all devices are in a defined state
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS; idx++) {
|
||||||
|
modeTable[idx].setMode(MODE_OFF);
|
||||||
|
modeTable[idx].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
if (recoveryState != RecoveryState::RECOVERY_STARTED) {
|
||||||
|
if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) {
|
||||||
|
result = handleNormalOrOnModeCmd(mode, submode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HybridIterator<ModeListEntry> tableIter(modeTable.begin(), modeTable.end());
|
||||||
|
executeTable(tableIter);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode) {
|
||||||
|
using namespace duallane;
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
bool needsSecondStep = false;
|
||||||
|
auto cmdSeq = [&](object_id_t objectId, Mode_t devMode, uint8_t tableIdx) {
|
||||||
|
if (mode == devMode) {
|
||||||
|
modeTable[tableIdx].setMode(mode);
|
||||||
|
} else if (mode == DeviceHandlerIF::MODE_NORMAL) {
|
||||||
|
if (isUseable(objectId, devMode)) {
|
||||||
|
if (devMode == MODE_ON) {
|
||||||
|
modeTable[tableIdx].setMode(mode);
|
||||||
|
modeTable[tableIdx].setSubmode(SUBMODE_NONE);
|
||||||
|
} else {
|
||||||
|
modeTable[tableIdx].setMode(MODE_ON);
|
||||||
|
modeTable[tableIdx].setSubmode(SUBMODE_NONE);
|
||||||
|
if (internalState != STATE_SECOND_STEP) {
|
||||||
|
needsSecondStep = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (mode == MODE_ON) {
|
||||||
|
if (isUseable(objectId, devMode)) {
|
||||||
|
modeTable[tableIdx].setMode(MODE_ON);
|
||||||
|
modeTable[tableIdx].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
switch (submode) {
|
||||||
|
case (A_SIDE): {
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS_ONE_SIDE; idx++) {
|
||||||
|
cmdSeq(helper.susIds[idx], helper.susModes[idx], idx);
|
||||||
|
// Switch off devices on redundant side
|
||||||
|
modeTable[idx + NUMBER_SUN_SENSORS_ONE_SIDE].setMode(MODE_OFF);
|
||||||
|
modeTable[idx + NUMBER_SUN_SENSORS_ONE_SIDE].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (B_SIDE): {
|
||||||
|
for (uint8_t idx = NUMBER_SUN_SENSORS_ONE_SIDE; idx < NUMBER_SUN_SENSORS; idx++) {
|
||||||
|
cmdSeq(helper.susIds[idx], helper.susModes[idx], idx);
|
||||||
|
// Switch devices on nominal side
|
||||||
|
modeTable[idx - NUMBER_SUN_SENSORS_ONE_SIDE].setMode(MODE_OFF);
|
||||||
|
modeTable[idx - NUMBER_SUN_SENSORS_ONE_SIDE].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (DUAL_MODE): {
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS; idx++) {
|
||||||
|
cmdSeq(helper.susIds[idx], helper.susModes[idx], idx);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (needsSecondStep) {
|
||||||
|
result = NEED_SECOND_STEP;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t SusAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) {
|
||||||
|
using namespace duallane;
|
||||||
|
refreshHelperModes();
|
||||||
|
if (wantedSubmode == A_SIDE) {
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_SUN_SENSORS_ONE_SIDE; idx++) {
|
||||||
|
if (helper.susModes[idx] != wantedMode) {
|
||||||
|
return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
} else if (wantedSubmode == B_SIDE) {
|
||||||
|
for (uint8_t idx = NUMBER_SUN_SENSORS_ONE_SIDE; idx < NUMBER_SUN_SENSORS; idx++) {
|
||||||
|
if (helper.susModes[idx] != wantedMode) {
|
||||||
|
return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
} else {
|
||||||
|
// Trigger event if devices are faulty? This is the last fallback mode, returning
|
||||||
|
// a failure here would trigger a transition to MODE_OFF unless handleModeTransitionFailed
|
||||||
|
// is overriden
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t SusAssembly::initialize() {
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
for (const auto& id : helper.susIds) {
|
||||||
|
result = registerChild(id);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return AssemblyBase::initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SusAssembly::isUseable(object_id_t object, Mode_t mode) {
|
||||||
|
if (healthHelper.healthTable->isFaulty(object)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if device is already in target mode
|
||||||
|
if (childrenMap[object].mode == mode) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (healthHelper.healthTable->isCommandable(object)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SusAssembly::refreshHelperModes() {
|
||||||
|
for (uint8_t idx = 0; idx < helper.susModes.size(); idx++) {
|
||||||
|
helper.susModes[idx] = childrenMap[helper.susIds[idx]].mode;
|
||||||
|
}
|
||||||
|
}
|
74
mission/system/SusAssembly.h
Normal file
74
mission/system/SusAssembly.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_SUSASSEMBLY_H_
|
||||||
|
#define MISSION_SYSTEM_SUSASSEMBLY_H_
|
||||||
|
|
||||||
|
#include <devices/powerSwitcherList.h>
|
||||||
|
#include <fsfw/devicehandlers/AssemblyBase.h>
|
||||||
|
|
||||||
|
#include "DualLaneAssemblyBase.h"
|
||||||
|
|
||||||
|
struct SusAssHelper {
|
||||||
|
public:
|
||||||
|
SusAssHelper(std::array<object_id_t, 12> susIds) : susIds(susIds) {}
|
||||||
|
std::array<object_id_t, 12> susIds = {objects::NO_OBJECT};
|
||||||
|
std::array<Mode_t, 12> susModes = {HasModesIF::MODE_OFF};
|
||||||
|
};
|
||||||
|
|
||||||
|
class PowerSwitchIF;
|
||||||
|
|
||||||
|
class SusAssembly : public DualLaneAssemblyBase {
|
||||||
|
public:
|
||||||
|
static constexpr uint8_t NUMBER_SUN_SENSORS_ONE_SIDE = 6;
|
||||||
|
static constexpr uint8_t NUMBER_SUN_SENSORS = 12;
|
||||||
|
|
||||||
|
// Use these variables instead of magic numbers when generator was updated
|
||||||
|
// TRANSITION_OTHER_SIDE_FAILED_ID
|
||||||
|
// NOT_ENOUGH_DEVICES_DUAL_MODE_ID
|
||||||
|
// POWER_STATE_MACHINE_TIMEOUT_ID
|
||||||
|
// SIDE_SWITCH_TRANSITION_NOT_ALLOWED_ID
|
||||||
|
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SUS_BOARD_ASS;
|
||||||
|
static constexpr Event TRANSITION_OTHER_SIDE_FAILED =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 0, severity::HIGH);
|
||||||
|
static constexpr Event NOT_ENOUGH_DEVICES_DUAL_MODE =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 1, severity::HIGH);
|
||||||
|
static constexpr Event POWER_STATE_MACHINE_TIMEOUT =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
||||||
|
//! [EXPORT] : [COMMENT] Not implemented, would increase already high complexity. Operator
|
||||||
|
//! should instead command the assembly off first and then command the assembly on into the
|
||||||
|
//! desired mode/submode combination
|
||||||
|
static constexpr Event SIDE_SWITCH_TRANSITION_NOT_ALLOWED =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 3, severity::LOW);
|
||||||
|
|
||||||
|
SusAssembly(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher,
|
||||||
|
SusAssHelper helper);
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum class States { IDLE, SWITCHING_POWER, MODE_COMMANDING } state = States::IDLE;
|
||||||
|
static constexpr pcduSwitches::Switches SWITCH_NOM =
|
||||||
|
pcduSwitches::Switches::PDU1_CH4_SUS_NOMINAL_3V3;
|
||||||
|
static constexpr pcduSwitches::Switches SWITCH_RED =
|
||||||
|
pcduSwitches::Switches::PDU2_CH4_SUS_REDUNDANT_3V3;
|
||||||
|
FixedArrayList<ModeListEntry, NUMBER_SUN_SENSORS> modeTable;
|
||||||
|
|
||||||
|
SusAssHelper helper;
|
||||||
|
PowerSwitchIF* pwrSwitcher = nullptr;
|
||||||
|
bool tryingOtherSide = false;
|
||||||
|
bool dualModeErrorSwitch = true;
|
||||||
|
ReturnValue_t initialize() override;
|
||||||
|
|
||||||
|
// AssemblyBase overrides
|
||||||
|
ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override;
|
||||||
|
ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) 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);
|
||||||
|
void powerStateMachine(Mode_t mode, Submode_t submode);
|
||||||
|
ReturnValue_t handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode);
|
||||||
|
void refreshHelperModes();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_SUSASSEMBLY_H_ */
|
6
mission/system/SusFdir.cpp
Normal file
6
mission/system/SusFdir.cpp
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include "SusFdir.h"
|
||||||
|
|
||||||
|
#include <common/config/commonObjects.h>
|
||||||
|
|
||||||
|
SusFdir::SusFdir(object_id_t sensorId)
|
||||||
|
: DeviceHandlerFailureIsolation(sensorId, objects::SUS_BOARD_ASS) {}
|
11
mission/system/SusFdir.h
Normal file
11
mission/system/SusFdir.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_SUSFDIR_H_
|
||||||
|
#define MISSION_SYSTEM_SUSFDIR_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerFailureIsolation.h>
|
||||||
|
|
||||||
|
class SusFdir : public DeviceHandlerFailureIsolation {
|
||||||
|
public:
|
||||||
|
SusFdir(object_id_t sensorId);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_SUSFDIR_H_ */
|
206
mission/system/TcsBoardAssembly.cpp
Normal file
206
mission/system/TcsBoardAssembly.cpp
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
#include "TcsBoardAssembly.h"
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
|
||||||
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
|
|
||||||
|
TcsBoardAssembly::TcsBoardAssembly(object_id_t objectId, object_id_t parentId,
|
||||||
|
PowerSwitchIF* pwrSwitcher, power::Switch_t theSwitch,
|
||||||
|
TcsBoardHelper helper)
|
||||||
|
: AssemblyBase(objectId, parentId, 24), switcher(pwrSwitcher, theSwitch), helper(helper) {
|
||||||
|
eventQueue = QueueFactory::instance()->createMessageQueue(24);
|
||||||
|
ModeListEntry entry;
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) {
|
||||||
|
entry.setObject(helper.rtdIds[idx]);
|
||||||
|
entry.setMode(MODE_OFF);
|
||||||
|
entry.setSubmode(SUBMODE_NONE);
|
||||||
|
entry.setInheritSubmode(false);
|
||||||
|
modeTable.insert(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TcsBoardAssembly::performChildOperation() {
|
||||||
|
auto state = switcher.getState();
|
||||||
|
if (state != PowerSwitcher::WAIT_OFF and state != PowerSwitcher::WAIT_ON) {
|
||||||
|
AssemblyBase::performChildOperation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switcher.doStateMachine();
|
||||||
|
if (state == PowerSwitcher::WAIT_OFF and switcher.getState() == PowerSwitcher::SWITCH_IS_OFF) {
|
||||||
|
// Indicator that a transition to off is finished
|
||||||
|
AssemblyBase::handleModeReached();
|
||||||
|
} else if (state == PowerSwitcher::WAIT_ON and
|
||||||
|
switcher.getState() == PowerSwitcher::SWITCH_IS_ON) {
|
||||||
|
// Indicator that mode commanding can be performed now
|
||||||
|
AssemblyBase::startTransition(targetMode, targetSubmode);
|
||||||
|
// AssemblyBase::performChildOperation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t TcsBoardAssembly::commandChildren(Mode_t mode, Submode_t submode) {
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
// Initialize the mode table to ensure all devices are in a defined state
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) {
|
||||||
|
modeTable[idx].setMode(MODE_OFF);
|
||||||
|
modeTable[idx].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
if (recoveryState != RecoveryState::RECOVERY_STARTED) {
|
||||||
|
if (mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_ON) {
|
||||||
|
result = handleNormalOrOnModeCmd(mode, submode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HybridIterator<ModeListEntry> tableIter(modeTable.begin(), modeTable.end());
|
||||||
|
executeTable(tableIter);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t TcsBoardAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) {
|
||||||
|
int devsInWrongMode = 0;
|
||||||
|
try {
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) {
|
||||||
|
if (childrenMap.at(helper.rtdIds[idx]).mode != wantedMode) {
|
||||||
|
devsInWrongMode++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (const std::out_of_range& e) {
|
||||||
|
sif::error << "TcsBoardAssembly: Invalid children map: " << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
if (devsInWrongMode >= 3) {
|
||||||
|
if (warningSwitch) {
|
||||||
|
sif::warning << "TcsBoardAssembly::checkChildrenStateOn: " << devsInWrongMode << " devices in"
|
||||||
|
<< " wrong mode" << std::endl;
|
||||||
|
warningSwitch = false;
|
||||||
|
}
|
||||||
|
return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
|
||||||
|
}
|
||||||
|
// TODO: Can't really do something other than power cycling if devices in wrong mode.
|
||||||
|
// Might attempt one power-cycle. In any case, trigger an event
|
||||||
|
if (devsInWrongMode > 0) {
|
||||||
|
if (warningSwitch) {
|
||||||
|
sif::warning << "TcsBoardAssembly::checkChildrenStateOn: " << devsInWrongMode << " devices in"
|
||||||
|
<< " wrong mode" << std::endl;
|
||||||
|
warningSwitch = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t TcsBoardAssembly::isModeCombinationValid(Mode_t mode, Submode_t submode) {
|
||||||
|
if (mode == MODE_ON or mode == MODE_OFF or mode == DeviceHandlerIF::MODE_NORMAL) {
|
||||||
|
return RETURN_OK;
|
||||||
|
}
|
||||||
|
return HasModesIF::INVALID_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t TcsBoardAssembly::initialize() {
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
for (const auto& obj : helper.rtdIds) {
|
||||||
|
result = registerChild(obj);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SubsystemBase::initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TcsBoardAssembly::startTransition(Mode_t mode, Submode_t submode) {
|
||||||
|
if (mode != MODE_OFF) {
|
||||||
|
switcher.turnOn(true);
|
||||||
|
switcher.doStateMachine();
|
||||||
|
if (switcher.getState() == PowerSwitcher::SWITCH_IS_ON) {
|
||||||
|
AssemblyBase::startTransition(mode, submode);
|
||||||
|
} else {
|
||||||
|
// Need to wait with mode commanding until power switcher is done
|
||||||
|
targetMode = mode;
|
||||||
|
targetSubmode = submode;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Perform regular mode commanding first
|
||||||
|
AssemblyBase::startTransition(mode, submode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t TcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode) {
|
||||||
|
ReturnValue_t result = RETURN_OK;
|
||||||
|
bool needsSecondStep = false;
|
||||||
|
Mode_t devMode = 0;
|
||||||
|
object_id_t objId = 0;
|
||||||
|
try {
|
||||||
|
for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) {
|
||||||
|
devMode = childrenMap.at(helper.rtdIds[idx]).mode;
|
||||||
|
objId = helper.rtdIds[idx];
|
||||||
|
if (mode == devMode) {
|
||||||
|
modeTable[idx].setMode(mode);
|
||||||
|
} else if (mode == DeviceHandlerIF::MODE_NORMAL) {
|
||||||
|
if (isUseable(objId, devMode)) {
|
||||||
|
if (devMode == MODE_ON) {
|
||||||
|
modeTable[idx].setMode(mode);
|
||||||
|
modeTable[idx].setSubmode(SUBMODE_NONE);
|
||||||
|
} else {
|
||||||
|
modeTable[idx].setMode(MODE_ON);
|
||||||
|
modeTable[idx].setSubmode(SUBMODE_NONE);
|
||||||
|
if (internalState != STATE_SECOND_STEP) {
|
||||||
|
needsSecondStep = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (mode == MODE_ON) {
|
||||||
|
if (isUseable(objId, devMode)) {
|
||||||
|
modeTable[idx].setMode(MODE_ON);
|
||||||
|
modeTable[idx].setSubmode(SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (const std::out_of_range& e) {
|
||||||
|
sif::error << "TcsBoardAssembly: Invalid children map: " << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
if (needsSecondStep) {
|
||||||
|
result = NEED_SECOND_STEP;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TcsBoardAssembly::isUseable(object_id_t object, Mode_t mode) {
|
||||||
|
if (healthHelper.healthTable->isFaulty(object)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if device is already in target mode
|
||||||
|
if (childrenMap[object].mode == mode) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (healthHelper.healthTable->isCommandable(object)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageQueueId_t TcsBoardAssembly::getEventReceptionQueue() { return eventQueue->getId(); }
|
||||||
|
|
||||||
|
void TcsBoardAssembly::handleModeReached() {
|
||||||
|
if (targetMode == MODE_OFF) {
|
||||||
|
switcher.turnOff(true);
|
||||||
|
switcher.doStateMachine();
|
||||||
|
// Need to wait with call to AssemblyBase::handleModeReached until power switcher is done
|
||||||
|
if (switcher.getState() == PowerSwitcher::SWITCH_IS_OFF) {
|
||||||
|
AssemblyBase::handleModeReached();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AssemblyBase::handleModeReached();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TcsBoardAssembly::handleChildrenLostMode(ReturnValue_t result) {
|
||||||
|
// TODO: Maybe try a reboot once here?
|
||||||
|
triggerEvent(CHILDREN_LOST_MODE, result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TcsBoardAssembly::handleModeTransitionFailed(ReturnValue_t result) {
|
||||||
|
if (targetMode == MODE_OFF) {
|
||||||
|
AssemblyBase::handleModeTransitionFailed(result);
|
||||||
|
} else {
|
||||||
|
// To avoid transitioning back to off
|
||||||
|
triggerEvent(MODE_TRANSITION_FAILED, result);
|
||||||
|
}
|
||||||
|
}
|
60
mission/system/TcsBoardAssembly.h
Normal file
60
mission/system/TcsBoardAssembly.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_TCSSUBSYSTEM_H_
|
||||||
|
#define MISSION_SYSTEM_TCSSUBSYSTEM_H_
|
||||||
|
|
||||||
|
#include <fsfw/container/FixedArrayList.h>
|
||||||
|
#include <fsfw/devicehandlers/AssemblyBase.h>
|
||||||
|
#include <fsfw/power/PowerSwitcher.h>
|
||||||
|
|
||||||
|
struct TcsBoardHelper {
|
||||||
|
TcsBoardHelper(std::array<object_id_t, 16> rtdIds) : rtdIds(rtdIds) {}
|
||||||
|
|
||||||
|
std::array<object_id_t, 16> rtdIds = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
class TcsBoardAssembly : public AssemblyBase, public ConfirmsFailuresIF {
|
||||||
|
public:
|
||||||
|
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_BOARD_ASS;
|
||||||
|
static constexpr Event CHILDREN_LOST_MODE =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM);
|
||||||
|
|
||||||
|
TcsBoardAssembly(object_id_t objectId, object_id_t parentId, PowerSwitchIF* pwrSwitcher,
|
||||||
|
power::Switch_t switcher, TcsBoardHelper helper);
|
||||||
|
|
||||||
|
ReturnValue_t initialize() override;
|
||||||
|
|
||||||
|
void performChildOperation() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static constexpr uint8_t NUMBER_RTDS = 16;
|
||||||
|
PowerSwitcher switcher;
|
||||||
|
bool warningSwitch = true;
|
||||||
|
TcsBoardHelper helper;
|
||||||
|
FixedArrayList<ModeListEntry, NUMBER_RTDS> modeTable;
|
||||||
|
MessageQueueIF* eventQueue = nullptr;
|
||||||
|
|
||||||
|
ReturnValue_t handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode);
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
// ConfirmFailureIF implementation
|
||||||
|
MessageQueueId_t getEventReceptionQueue() override;
|
||||||
|
|
||||||
|
// AssemblyBase implementation
|
||||||
|
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;
|
||||||
|
void startTransition(Mode_t mode, Submode_t submode) override;
|
||||||
|
void handleModeReached() override;
|
||||||
|
|
||||||
|
// These two overrides prevent a transition of the whole assembly back to off just because
|
||||||
|
// some devices are not working
|
||||||
|
void handleChildrenLostMode(ReturnValue_t result) override;
|
||||||
|
void handleModeTransitionFailed(ReturnValue_t result) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_TCSSUBSYSTEM_H_ */
|
19
mission/system/definitions.h
Normal file
19
mission/system/definitions.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef MISSION_SYSTEM_DEFINITIONS_H_
|
||||||
|
#define MISSION_SYSTEM_DEFINITIONS_H_
|
||||||
|
|
||||||
|
#include <fsfw/modes/ModeMessage.h>
|
||||||
|
|
||||||
|
namespace power {
|
||||||
|
|
||||||
|
enum class States { IDLE, SWITCHING_POWER, CHECKING_POWER, MODE_COMMANDING };
|
||||||
|
enum class OpCodes { NONE, TO_OFF_DONE, TO_NOT_OFF_DONE, TIMEOUT_OCCURED };
|
||||||
|
|
||||||
|
} // namespace power
|
||||||
|
|
||||||
|
namespace duallane {
|
||||||
|
|
||||||
|
enum Submodes : Submode_t { A_SIDE = 0, B_SIDE = 1, DUAL_MODE = 2 };
|
||||||
|
|
||||||
|
} // namespace duallane
|
||||||
|
|
||||||
|
#endif /* MISSION_SYSTEM_DEFINITIONS_H_ */
|
Loading…
Reference in New Issue
Block a user