Com Subsystem #364
21
CHANGELOG.md
21
CHANGELOG.md
@ -16,8 +16,24 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
eive-tmtc: v2.15.1
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Usage of floats as iterators and using them to calculate a uint8_t index in `SusConverter`
|
||||||
|
- Removed unused variables in the `AcsController`
|
||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
|
COM PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/364
|
||||||
|
|
||||||
|
* Moved transmitter timer and handling of carrier and bitlock event from CCSDS handler to COM
|
||||||
|
subsystem
|
||||||
|
* Added parameter command to be able to change the transmitter timeout
|
||||||
|
* Solves [#362](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/362)
|
||||||
|
* Solves [#360](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/360)
|
||||||
|
* Solves [#361](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/361)
|
||||||
|
* Solves [#386](https://egit.irs.uni-stuttgart.de/eive/eive-obsw/issues/386)
|
||||||
- All `targetQuat` functions in `Guidance` now return the target quaternion (target
|
- All `targetQuat` functions in `Guidance` now return the target quaternion (target
|
||||||
in ECI frame), which is passed on to `CtrlValData`.
|
in ECI frame), which is passed on to `CtrlValData`.
|
||||||
|
|
||||||
@ -35,11 +51,6 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
- `MekfData` now includes `mekfStatus`
|
- `MekfData` now includes `mekfStatus`
|
||||||
- `CtrlValData` now includes `tgtRotRate`
|
- `CtrlValData` now includes `tgtRotRate`
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- Usage of floats as iterators and using them to calculate a uint8_t index in `SusConverter`
|
|
||||||
- Removed unused variables in the `AcsController`
|
|
||||||
|
|
||||||
# [v1.30.0]
|
# [v1.30.0]
|
||||||
|
|
||||||
eive-tmtc: v2.14.0
|
eive-tmtc: v2.14.0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 258 translations.
|
* @brief Auto-generated event translation file. Contains 260 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2023-02-22 15:00:34
|
* Generated on: 2023-02-23 15:20:41
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -93,6 +93,8 @@ const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
|
|||||||
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
||||||
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
||||||
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
|
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
|
||||||
|
const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO";
|
||||||
|
const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION";
|
||||||
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
||||||
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
||||||
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
||||||
@ -437,6 +439,10 @@ const char *translateEvents(Event event) {
|
|||||||
return SAFE_RATE_RECOVERY_STRING;
|
return SAFE_RATE_RECOVERY_STRING;
|
||||||
case (11202):
|
case (11202):
|
||||||
return MULTIPLE_RW_INVALID_STRING;
|
return MULTIPLE_RW_INVALID_STRING;
|
||||||
|
case (11203):
|
||||||
|
return MEKF_INVALID_INFO_STRING;
|
||||||
|
case (11204):
|
||||||
|
return MEKF_INVALID_MODE_VIOLATION_STRING;
|
||||||
case (11300):
|
case (11300):
|
||||||
return SWITCH_CMD_SENT_STRING;
|
return SWITCH_CMD_SENT_STRING;
|
||||||
case (11301):
|
case (11301):
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 148 translations.
|
* Contains 148 translations.
|
||||||
* Generated on: 2023-02-22 15:00:34
|
* Generated on: 2023-02-23 15:20:41
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
|
@ -573,7 +573,6 @@ void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
|
|||||||
new SyrlinksHandler(objects::SYRLINKS_HANDLER, objects::UART_COM_IF, syrlinksUartCookie,
|
new SyrlinksHandler(objects::SYRLINKS_HANDLER, objects::UART_COM_IF, syrlinksUartCookie,
|
||||||
pcdu::PDU1_CH1_SYRLINKS_12V, syrlinksFdir);
|
pcdu::PDU1_CH1_SYRLINKS_12V, syrlinksFdir);
|
||||||
syrlinksHandler->setPowerSwitcher(pwrSwitcher);
|
syrlinksHandler->setPowerSwitcher(pwrSwitcher);
|
||||||
syrlinksHandler->setStartUpImmediately();
|
|
||||||
syrlinksHandler->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
syrlinksHandler->connectModeTreeParent(satsystem::com::SUBSYSTEM);
|
||||||
#if OBSW_DEBUG_SYRLINKS == 1
|
#if OBSW_DEBUG_SYRLINKS == 1
|
||||||
syrlinksHandler->setDebugMode(true);
|
syrlinksHandler->setDebugMode(true);
|
||||||
@ -756,15 +755,10 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF,
|
|||||||
AxiPtmeConfig* axiPtmeConfig =
|
AxiPtmeConfig* axiPtmeConfig =
|
||||||
new AxiPtmeConfig(objects::AXI_PTME_CONFIG, q7s::UIO_PTME, q7s::uiomapids::PTME_CONFIG);
|
new AxiPtmeConfig(objects::AXI_PTME_CONFIG, q7s::UIO_PTME, q7s::uiomapids::PTME_CONFIG);
|
||||||
PtmeConfig* ptmeConfig = new PtmeConfig(objects::PTME_CONFIG, axiPtmeConfig);
|
PtmeConfig* ptmeConfig = new PtmeConfig(objects::PTME_CONFIG, axiPtmeConfig);
|
||||||
#if OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT == 1
|
|
||||||
// Set to high value when not sending via syrlinks
|
*ipCoreHandler = new CcsdsIpCoreHandler(objects::CCSDS_HANDLER, objects::PTME,
|
||||||
static const uint32_t TRANSMITTER_TIMEOUT = 86400000; // 1 day
|
objects::CCSDS_PACKET_DISTRIBUTOR, ptmeConfig, gpioComIF,
|
||||||
#else
|
gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA);
|
||||||
static const uint32_t TRANSMITTER_TIMEOUT = 900000; // 15 minutes
|
|
||||||
#endif
|
|
||||||
*ipCoreHandler = new CcsdsIpCoreHandler(
|
|
||||||
objects::CCSDS_HANDLER, objects::PTME, objects::CCSDS_PACKET_DISTRIBUTOR, ptmeConfig,
|
|
||||||
gpioComIF, gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA, TRANSMITTER_TIMEOUT);
|
|
||||||
VirtualChannel* vc = nullptr;
|
VirtualChannel* vc = nullptr;
|
||||||
vc = new VirtualChannel(ccsds::VC0, config::VC0_QUEUE_SIZE, objects::CCSDS_HANDLER);
|
vc = new VirtualChannel(ccsds::VC0, config::VC0_QUEUE_SIZE, objects::CCSDS_HANDLER);
|
||||||
(*ipCoreHandler)->addVirtualChannel(ccsds::VC0, vc);
|
(*ipCoreHandler)->addVirtualChannel(ccsds::VC0, vc);
|
||||||
|
2
fsfw
2
fsfw
@ -1 +1 @@
|
|||||||
Subproject commit 2efff4d2c5ef82b5b62567ab1bb0ee53aeed6a5a
|
Subproject commit bd208038dd85a94dce8c763397ad5ac7eae76402
|
@ -87,6 +87,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acsDefs.h
|
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acsDefs.h
|
||||||
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acsDefs.h
|
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acsDefs.h
|
||||||
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acsDefs.h
|
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acsDefs.h
|
||||||
|
11203;0x2bc3;MEKF_INVALID_INFO;INFO;No description;mission/acsDefs.h
|
||||||
|
11204;0x2bc4;MEKF_INVALID_MODE_VIOLATION;HIGH;No description;mission/acsDefs.h
|
||||||
11300;0x2c24;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
|
11300;0x2c24;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
|
||||||
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
|
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
|
||||||
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h
|
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h
|
||||||
|
|
@ -53,9 +53,13 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x6a01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
|
0x6a01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
|
||||||
0x6b01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
|
0x6b01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
|
||||||
0x6c01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
|
0x6c01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
|
||||||
0x6901;ACSKAL_KalmanNoGyrMeas;No description;1;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6902;ACSKAL_KalmanUninitialized;No description;2;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x6902;ACSKAL_KalmanNoModel;No description;2;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6903;ACSKAL_KalmanNoGyrData;No description;3;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x6903;ACSKAL_KalmanInversionFailed;No description;3;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6904;ACSKAL_KalmanNoModelVectors;No description;4;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6905;ACSKAL_KalmanNoSusMgmStrData;No description;5;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6906;ACSKAL_KalmanCovarianceInversionFailed;No description;6;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6907;ACSKAL_KalmanInitialized;No description;7;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6908;ACSKAL_KalmanRunning;No description;8;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
||||||
0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
||||||
0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
||||||
|
|
@ -87,6 +87,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acsDefs.h
|
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acsDefs.h
|
||||||
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acsDefs.h
|
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acsDefs.h
|
||||||
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acsDefs.h
|
11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acsDefs.h
|
||||||
|
11203;0x2bc3;MEKF_INVALID_INFO;INFO;No description;mission/acsDefs.h
|
||||||
|
11204;0x2bc4;MEKF_INVALID_MODE_VIOLATION;HIGH;No description;mission/acsDefs.h
|
||||||
11300;0x2c24;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
|
11300;0x2c24;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
|
||||||
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
|
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
|
||||||
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h
|
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h
|
||||||
|
|
@ -53,9 +53,13 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
|
|||||||
0x6a01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
|
0x6a01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h
|
||||||
0x6b01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
|
0x6b01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h
|
||||||
0x6c01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
|
0x6c01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h
|
||||||
0x6901;ACSKAL_KalmanNoGyrMeas;No description;1;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6902;ACSKAL_KalmanUninitialized;No description;2;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x6902;ACSKAL_KalmanNoModel;No description;2;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6903;ACSKAL_KalmanNoGyrData;No description;3;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x6903;ACSKAL_KalmanInversionFailed;No description;3;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
0x6904;ACSKAL_KalmanNoModelVectors;No description;4;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6905;ACSKAL_KalmanNoSusMgmStrData;No description;5;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6906;ACSKAL_KalmanCovarianceInversionFailed;No description;6;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6907;ACSKAL_KalmanInitialized;No description;7;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
|
0x6908;ACSKAL_KalmanRunning;No description;8;ACS_KALMAN;mission/controller/acs/MultiplicativeKalmanFilter.h
|
||||||
0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
0x4500;HSPI_OpeningFileFailed;No description;0;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
||||||
0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
0x4501;HSPI_FullDuplexTransferFailed;No description;1;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
||||||
0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
0x4502;HSPI_HalfDuplexTransferFailed;No description;2;HAL_SPI;fsfw/src/fsfw_hal/linux/spi/SpiComIF.h
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 258 translations.
|
* @brief Auto-generated event translation file. Contains 260 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2023-02-22 15:00:34
|
* Generated on: 2023-02-23 15:20:41
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -93,6 +93,8 @@ const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
|
|||||||
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
||||||
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
||||||
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
|
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
|
||||||
|
const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO";
|
||||||
|
const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION";
|
||||||
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
||||||
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
||||||
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
||||||
@ -437,6 +439,10 @@ const char *translateEvents(Event event) {
|
|||||||
return SAFE_RATE_RECOVERY_STRING;
|
return SAFE_RATE_RECOVERY_STRING;
|
||||||
case (11202):
|
case (11202):
|
||||||
return MULTIPLE_RW_INVALID_STRING;
|
return MULTIPLE_RW_INVALID_STRING;
|
||||||
|
case (11203):
|
||||||
|
return MEKF_INVALID_INFO_STRING;
|
||||||
|
case (11204):
|
||||||
|
return MEKF_INVALID_MODE_VIOLATION_STRING;
|
||||||
case (11300):
|
case (11300):
|
||||||
return SWITCH_CMD_SENT_STRING;
|
return SWITCH_CMD_SENT_STRING;
|
||||||
case (11301):
|
case (11301):
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 153 translations.
|
* Contains 153 translations.
|
||||||
* Generated on: 2023-02-22 15:00:34
|
* Generated on: 2023-02-23 15:20:41
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
|
@ -3,7 +3,8 @@ if(EIVE_BUILD_GPSD_GPS_HANDLER)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
${OBSW_NAME} PRIVATE Max31865RtdPolling.cpp ScexUartReader.cpp ImtqPollingTask.cpp
|
${OBSW_NAME}
|
||||||
|
PRIVATE Max31865RtdPolling.cpp ScexUartReader.cpp ImtqPollingTask.cpp
|
||||||
ScexDleParser.cpp ScexHelper.cpp RwPollingTask.cpp)
|
ScexDleParser.cpp ScexHelper.cpp RwPollingTask.cpp)
|
||||||
|
|
||||||
add_subdirectory(ploc)
|
add_subdirectory(ploc)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 258 translations.
|
* @brief Auto-generated event translation file. Contains 260 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2023-02-22 15:00:34
|
* Generated on: 2023-02-23 15:20:41
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -93,6 +93,8 @@ const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
|
|||||||
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
|
||||||
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
|
||||||
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
|
const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
|
||||||
|
const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO";
|
||||||
|
const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION";
|
||||||
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
|
||||||
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
|
||||||
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
|
||||||
@ -437,6 +439,10 @@ const char *translateEvents(Event event) {
|
|||||||
return SAFE_RATE_RECOVERY_STRING;
|
return SAFE_RATE_RECOVERY_STRING;
|
||||||
case (11202):
|
case (11202):
|
||||||
return MULTIPLE_RW_INVALID_STRING;
|
return MULTIPLE_RW_INVALID_STRING;
|
||||||
|
case (11203):
|
||||||
|
return MEKF_INVALID_INFO_STRING;
|
||||||
|
case (11204):
|
||||||
|
return MEKF_INVALID_MODE_VIOLATION_STRING;
|
||||||
case (11300):
|
case (11300):
|
||||||
return SWITCH_CMD_SENT_STRING;
|
return SWITCH_CMD_SENT_STRING;
|
||||||
case (11301):
|
case (11301):
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 153 translations.
|
* Contains 153 translations.
|
||||||
* Generated on: 2023-02-22 15:00:34
|
* Generated on: 2023-02-23 15:20:41
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
|
@ -167,6 +167,7 @@ ReturnValue_t PdecHandler::irqOperation() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
state = State::RUNNING;
|
state = State::RUNNING;
|
||||||
|
checkLocks();
|
||||||
|
|||||||
break;
|
break;
|
||||||
case State::RUNNING: {
|
case State::RUNNING: {
|
||||||
checkAndHandleIrqs(fd, info);
|
checkAndHandleIrqs(fd, info);
|
||||||
|
@ -24,7 +24,7 @@ enum class CcsdsSubmode : uint8_t {
|
|||||||
DATARATE_HIGH = 2,
|
DATARATE_HIGH = 2,
|
||||||
DATARATE_DEFAULT = 3
|
DATARATE_DEFAULT = 3
|
||||||
};
|
};
|
||||||
enum class ParameterId : uint8_t { DATARATE = 0 };
|
enum class ParameterId : uint8_t { DATARATE = 0, TRANSMITTER_TIMEOUT = 1 };
|
||||||
|
|
||||||
} // namespace com
|
} // namespace com
|
||||||
|
|
||||||
|
@ -256,7 +256,7 @@ ReturnValue_t ImtqHandler::scanForReply(const uint8_t* start, size_t remainingSi
|
|||||||
ReturnValue_t ImtqHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) {
|
ReturnValue_t ImtqHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) {
|
||||||
ReturnValue_t result;
|
ReturnValue_t result;
|
||||||
ReturnValue_t status = returnvalue::OK;
|
ReturnValue_t status = returnvalue::OK;
|
||||||
if(getMode() != MODE_NORMAL) {
|
if (getMode() != MODE_NORMAL) {
|
||||||
// Ignore replies during transitions.
|
// Ignore replies during transitions.
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,36 @@
|
|||||||
#include "ComSubsystem.h"
|
#include "ComSubsystem.h"
|
||||||
|
|
||||||
|
#include <fsfw/events/EventManagerIF.h>
|
||||||
#include <fsfw/ipc/MutexGuard.h>
|
#include <fsfw/ipc/MutexGuard.h>
|
||||||
|
#include <fsfw/ipc/QueueFactory.h>
|
||||||
|
#include <fsfw/serviceinterface/ServiceInterface.h>
|
||||||
|
#include <linux/ipcore/PdecHandler.h>
|
||||||
|
#include <mission/comDefs.h>
|
||||||
|
#include <mission/config/comCfg.h>
|
||||||
|
|
||||||
#include "mission/config/comCfg.h"
|
#include <utility>
|
||||||
|
|
||||||
ComSubsystem::ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences,
|
ComSubsystem::ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences,
|
||||||
uint32_t maxNumberOfTables)
|
uint32_t maxNumberOfTables, uint32_t transmitterTimeout)
|
||||||
: Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables), paramHelper(this) {
|
: Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables), paramHelper(this) {
|
||||||
com::setCurrentDatarate(com::Datarate::LOW_RATE_MODULATION_BPSK);
|
com::setCurrentDatarate(com::Datarate::LOW_RATE_MODULATION_BPSK);
|
||||||
|
auto mqArgs = MqArgs(setObjectId, static_cast<void *>(this));
|
||||||
|
eventQueue =
|
||||||
|
QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs);
|
||||||
|
transmitterCountdown.setTimeout(transmitterTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::performChildOperation() {
|
||||||
|
readEventQueue();
|
||||||
|
// Execute default rate sequence after transition has been completed
|
||||||
|
if (rememberBitLock and not isInTransition) {
|
||||||
|
startRxAndTxLowRateSeq();
|
||||||
|
rememberBitLock = false;
|
||||||
|
}
|
||||||
|
if (countdownActive) {
|
||||||
|
checkTransmitterCountdown();
|
||||||
|
}
|
||||||
|
Subsystem::performChildOperation();
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageQueueId_t ComSubsystem::getCommandQueue() const { return Subsystem::getCommandQueue(); }
|
MessageQueueId_t ComSubsystem::getCommandQueue() const { return Subsystem::getCommandQueue(); }
|
||||||
@ -27,6 +50,17 @@ ReturnValue_t ComSubsystem::getParameter(uint8_t domainId, uint8_t uniqueIdentif
|
|||||||
parameterWrapper->set(datarateCfg);
|
parameterWrapper->set(datarateCfg);
|
||||||
com::setCurrentDatarate(static_cast<com::Datarate>(newVal));
|
com::setCurrentDatarate(static_cast<com::Datarate>(newVal));
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
|
} else if ((domainId == 0) and
|
||||||
|
(uniqueIdentifier == static_cast<uint8_t>(com::ParameterId::TRANSMITTER_TIMEOUT))) {
|
||||||
|
uint32_t newVal = 0;
|
||||||
|
ReturnValue_t result = newValues->getElement(&newVal);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
parameterWrapper->set(transmitterTimeout);
|
||||||
|
transmitterTimeout = newVal;
|
||||||
|
transmitterCountdown.setTimeout(transmitterTimeout);
|
||||||
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
@ -44,5 +78,121 @@ ReturnValue_t ComSubsystem::initialize() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
EventManagerIF *manager = ObjectManager::instance()->get<EventManagerIF>(objects::EVENT_MANAGER);
|
||||||
|
if (manager == nullptr) {
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
sif::error << "ComSubsystem::initialize: Invalid event manager" << std::endl;
|
||||||
|
#endif
|
||||||
|
return ObjectManagerIF::CHILD_INIT_FAILED;
|
||||||
|
}
|
||||||
|
result = manager->registerListener(eventQueue->getId());
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
sif::warning << "ComSubsystem::initialize: Failed to register Com Subsystem as event "
|
||||||
|
"listener"
|
||||||
|
<< std::endl;
|
||||||
|
#endif
|
||||||
|
return ObjectManagerIF::CHILD_INIT_FAILED;
|
||||||
|
}
|
||||||
|
result = manager->subscribeToEventRange(eventQueue->getId(),
|
||||||
|
event::getEventId(PdecHandler::CARRIER_LOCK),
|
||||||
|
event::getEventId(PdecHandler::BIT_LOCK_PDEC));
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||||
|
sif::error << "ComSubsystem::initialize: Failed to subscribe to events from PDEC "
|
||||||
|
"handler"
|
||||||
|
<< std::endl;
|
||||||
|
#endif
|
||||||
|
return result;
|
||||||
|
}
|
||||||
return Subsystem::initialize();
|
return Subsystem::initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::startTransition(Mode_t mode, Submode_t submode) {
|
||||||
|
// Depending on the submode the transmitter timeout is enabled or
|
||||||
|
// disabled here
|
||||||
|
if (mode == com::Submode::RX_ONLY) {
|
||||||
|
transmitterCountdown.timeOut();
|
||||||
|
countdownActive = false;
|
||||||
|
} else if (isTxMode(mode)) {
|
||||||
|
// Only start transmitter countdown if transmitter is not already on
|
||||||
|
if (not isTxMode(this->mode)) {
|
||||||
|
transmitterCountdown.resetTimer();
|
||||||
|
countdownActive = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Subsystem::startTransition(mode, submode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::readEventQueue() {
|
||||||
|
EventMessage event;
|
||||||
|
for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == returnvalue::OK;
|
||||||
|
result = eventQueue->receiveMessage(&event)) {
|
||||||
|
switch (event.getMessageId()) {
|
||||||
|
case EventMessage::EVENT_MESSAGE:
|
||||||
|
handleEventMessage(&event);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sif::debug << "CcsdsHandler::checkEvents: Did not subscribe to this event message"
|
||||||
|
<< std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::handleEventMessage(EventMessage *eventMessage) {
|
||||||
|
Event event = eventMessage->getEvent();
|
||||||
|
switch (event) {
|
||||||
|
case PdecHandler::BIT_LOCK_PDEC: {
|
||||||
|
handleBitLockEvent();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PdecHandler::CARRIER_LOCK: {
|
||||||
|
handleCarrierLockEvent();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
sif::debug << "ComSubsystem::handleEvent: Did not subscribe to this event" << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::handleBitLockEvent() {
|
||||||
|
if (isTxMode(mode)) {
|
||||||
|
// Tx already on
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (isInTransition) {
|
||||||
|
rememberBitLock = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
startRxAndTxLowRateSeq();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::handleCarrierLockEvent() {
|
||||||
|
if (!enableTxWhenCarrierLock) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
startRxAndTxLowRateSeq();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::startRxAndTxLowRateSeq() {
|
||||||
|
// Turns transmitter on
|
||||||
|
startTransition(com::Submode::RX_AND_TX_LOW_DATARATE, SUBMODE_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComSubsystem::checkTransmitterCountdown() {
|
||||||
|
if (transmitterCountdown.hasTimedOut()) {
|
||||||
|
startTransition(com::Submode::RX_ONLY, SUBMODE_NONE);
|
||||||
|
countdownActive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ComSubsystem::isTxMode(Mode_t mode) {
|
||||||
|
if ((mode == com::Submode::RX_AND_TX_DEFAULT_DATARATE) ||
|
||||||
|
(mode == com::Submode::RX_AND_TX_LOW_DATARATE) ||
|
||||||
|
(mode == com::Submode::RX_AND_TX_HIGH_DATARATE)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef MISSION_SYSTEM_COMSUBSYSTEM_H_
|
#ifndef MISSION_SYSTEM_COMSUBSYSTEM_H_
|
||||||
#define MISSION_SYSTEM_COMSUBSYSTEM_H_
|
#define MISSION_SYSTEM_COMSUBSYSTEM_H_
|
||||||
|
|
||||||
|
#include <fsfw/events/EventMessage.h>
|
||||||
#include <fsfw/parameters/HasParametersIF.h>
|
#include <fsfw/parameters/HasParametersIF.h>
|
||||||
#include <fsfw/parameters/ParameterHelper.h>
|
#include <fsfw/parameters/ParameterHelper.h>
|
||||||
#include <fsfw/subsystem/Subsystem.h>
|
#include <fsfw/subsystem/Subsystem.h>
|
||||||
@ -9,21 +10,71 @@
|
|||||||
|
|
||||||
class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF {
|
class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF {
|
||||||
public:
|
public:
|
||||||
ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables);
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* @param setObjectId
|
||||||
|
* @param maxNumberOfSequences
|
||||||
|
* @param maxNumberOfTables
|
||||||
|
* @param transmitterTimeout Maximum time the transmitter of the syrlinks
|
||||||
|
* will be
|
||||||
|
* enabled
|
||||||
|
*/
|
||||||
|
ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables,
|
||||||
|
uint32_t transmitterTimeout);
|
||||||
virtual ~ComSubsystem() = default;
|
virtual ~ComSubsystem() = default;
|
||||||
|
|
||||||
MessageQueueId_t getCommandQueue() const override;
|
MessageQueueId_t getCommandQueue() const override;
|
||||||
ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueIdentifier,
|
ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueIdentifier,
|
||||||
ParameterWrapper *parameterWrapper, const ParameterWrapper *newValues,
|
ParameterWrapper *parameterWrapper, const ParameterWrapper *newValues,
|
||||||
uint16_t startAtIndex) override;
|
uint16_t startAtIndex) override;
|
||||||
|
virtual void performChildOperation() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static const Mode_t INITIAL_MODE = 0;
|
||||||
|
|
||||||
ReturnValue_t handleCommandMessage(CommandMessage *message) override;
|
ReturnValue_t handleCommandMessage(CommandMessage *message) override;
|
||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
|
|
||||||
|
void startTransition(Mode_t mode, Submode_t submode) override;
|
||||||
|
|
||||||
|
void readEventQueue();
|
||||||
|
void handleEventMessage(EventMessage *eventMessage);
|
||||||
|
void handleBitLockEvent();
|
||||||
|
void handleCarrierLockEvent();
|
||||||
|
void checkTransmitterCountdown();
|
||||||
|
/**
|
||||||
|
* @brief Enables transmitter in low rate mode
|
||||||
|
*/
|
||||||
|
void startRxAndTxLowRateSeq();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns true if mode is a mode where the transmitter is on
|
||||||
|
*/
|
||||||
|
bool isTxMode(Mode_t mode);
|
||||||
|
|
||||||
uint8_t datarateCfg = static_cast<uint8_t>(com::Datarate::LOW_RATE_MODULATION_BPSK);
|
uint8_t datarateCfg = static_cast<uint8_t>(com::Datarate::LOW_RATE_MODULATION_BPSK);
|
||||||
|
// Maximum time after which the transmitter will be turned of. This is a
|
||||||
|
// protection mechanism due prevent the syrlinks from overheating
|
||||||
|
uint32_t transmitterTimeout = 0;
|
||||||
ParameterHelper paramHelper;
|
ParameterHelper paramHelper;
|
||||||
|
|
||||||
|
MessageQueueIF *eventQueue = nullptr;
|
||||||
|
|
||||||
|
bool enableTxWhenCarrierLock = false;
|
||||||
|
|
||||||
|
// Countdown will be started as soon as the transmitter was enabled
|
||||||
|
Countdown transmitterCountdown;
|
||||||
|
|
||||||
|
// Transmitter countdown only active when sysrlinks transmitter is on (modes:
|
||||||
|
// rx and tx low rate, rx and tx high rate, rx and tx default rate)
|
||||||
|
bool countdownActive = false;
|
||||||
|
|
||||||
|
// True when bit lock occurred while COM subsystem is in a transition. This
|
||||||
|
// variable is used to remember the bit lock and execute the default rate
|
||||||
|
// sequence after the active transition has been completed
|
||||||
|
bool rememberBitLock = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* MISSION_SYSTEM_COMSUBSYSTEM_H_ */
|
#endif /* MISSION_SYSTEM_COMSUBSYSTEM_H_ */
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include "comModeTree.h"
|
#include "comModeTree.h"
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
|
|
||||||
#include <fsfw/modes/HasModesIF.h>
|
#include <fsfw/modes/HasModesIF.h>
|
||||||
#include <fsfw/returnvalues/returnvalue.h>
|
#include <fsfw/returnvalues/returnvalue.h>
|
||||||
#include <fsfw/subsystem/Subsystem.h>
|
#include <fsfw/subsystem/Subsystem.h>
|
||||||
@ -11,7 +10,8 @@
|
|||||||
|
|
||||||
const auto check = subsystem::checkInsert;
|
const auto check = subsystem::checkInsert;
|
||||||
|
|
||||||
ComSubsystem satsystem::com::SUBSYSTEM = ComSubsystem(objects::COM_SUBSYSTEM, 12, 24);
|
ComSubsystem satsystem::com::SUBSYSTEM =
|
||||||
|
ComSubsystem(objects::COM_SUBSYSTEM, 12, 24, TRANSMITTER_TIMEOUT);
|
||||||
|
|
||||||
static const auto OFF = HasModesIF::MODE_OFF;
|
static const auto OFF = HasModesIF::MODE_OFF;
|
||||||
static const auto ON = HasModesIF::MODE_ON;
|
static const auto ON = HasModesIF::MODE_ON;
|
||||||
@ -19,39 +19,48 @@ static const auto NML = DeviceHandlerIF::MODE_NORMAL;
|
|||||||
|
|
||||||
auto COM_SEQUENCE_RX_ONLY =
|
auto COM_SEQUENCE_RX_ONLY =
|
||||||
std::make_pair(::com::Submode::RX_ONLY, FixedArrayList<ModeListEntry, 3>());
|
std::make_pair(::com::Submode::RX_ONLY, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto COM_TABLE_RX_ONLY_TGT =
|
auto COM_TABLE_RX_ONLY_TGT = std::make_pair(
|
||||||
std::make_pair((::com::Submode::RX_ONLY << 24) | 1, FixedArrayList<ModeListEntry, 3>());
|
static_cast<uint32_t>(::com::Submode::RX_ONLY << 24) | 1, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto COM_TABLE_RX_ONLY_TRANS_0 =
|
auto COM_TABLE_RX_ONLY_TRANS_0 = std::make_pair(
|
||||||
std::make_pair((::com::Submode::RX_ONLY << 24) | 2, FixedArrayList<ModeListEntry, 3>());
|
static_cast<uint32_t>(::com::Submode::RX_ONLY << 24) | 2, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto COM_TABLE_RX_ONLY_TRANS_1 =
|
auto COM_TABLE_RX_ONLY_TRANS_1 = std::make_pair(
|
||||||
std::make_pair((::com::Submode::RX_ONLY << 24) | 3, FixedArrayList<ModeListEntry, 3>());
|
static_cast<uint32_t>(::com::Submode::RX_ONLY << 24) | 3, FixedArrayList<ModeListEntry, 3>());
|
||||||
|
|
||||||
auto COM_SEQUENCE_RX_AND_TX_LOW_RATE =
|
auto COM_SEQUENCE_RX_AND_TX_LOW_RATE =
|
||||||
std::make_pair(::com::Submode::RX_AND_TX_LOW_DATARATE, FixedArrayList<ModeListEntry, 3>());
|
std::make_pair(::com::Submode::RX_AND_TX_LOW_DATARATE, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto COM_TABLE_RX_AND_TX_LOW_RATE_TGT = std::make_pair(
|
auto COM_TABLE_RX_AND_TX_LOW_RATE_TGT =
|
||||||
(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 1, FixedArrayList<ModeListEntry, 3>());
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 1,
|
||||||
auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_0 = std::make_pair(
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 2, FixedArrayList<ModeListEntry, 3>());
|
auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_0 =
|
||||||
auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1 = std::make_pair(
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 2,
|
||||||
(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 3, FixedArrayList<ModeListEntry, 3>());
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
|
auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1 =
|
||||||
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 3,
|
||||||
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
|
|
||||||
auto COM_SEQUENCE_RX_AND_TX_HIGH_RATE =
|
auto COM_SEQUENCE_RX_AND_TX_HIGH_RATE =
|
||||||
std::make_pair(::com::Submode::RX_AND_TX_HIGH_DATARATE, FixedArrayList<ModeListEntry, 3>());
|
std::make_pair(::com::Submode::RX_AND_TX_HIGH_DATARATE, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto COM_TABLE_RX_AND_TX_HIGH_RATE_TGT = std::make_pair(
|
auto COM_TABLE_RX_AND_TX_HIGH_RATE_TGT =
|
||||||
(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 1, FixedArrayList<ModeListEntry, 3>());
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 1,
|
||||||
auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_0 = std::make_pair(
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 2, FixedArrayList<ModeListEntry, 3>());
|
auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_0 =
|
||||||
auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1 = std::make_pair(
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 2,
|
||||||
(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 3, FixedArrayList<ModeListEntry, 3>());
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
|
auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1 =
|
||||||
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 3,
|
||||||
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
|
|
||||||
auto COM_SEQUENCE_RX_AND_TX_DEFAULT_RATE =
|
auto COM_SEQUENCE_RX_AND_TX_DEFAULT_RATE =
|
||||||
std::make_pair(::com::Submode::RX_AND_TX_DEFAULT_DATARATE, FixedArrayList<ModeListEntry, 3>());
|
std::make_pair(::com::Submode::RX_AND_TX_DEFAULT_DATARATE, FixedArrayList<ModeListEntry, 3>());
|
||||||
auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TGT = std::make_pair(
|
auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TGT =
|
||||||
(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 1, FixedArrayList<ModeListEntry, 3>());
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 1,
|
||||||
auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_0 = std::make_pair(
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 2, FixedArrayList<ModeListEntry, 3>());
|
auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_0 =
|
||||||
auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1 = std::make_pair(
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 2,
|
||||||
(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 3, FixedArrayList<ModeListEntry, 3>());
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
|
auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1 =
|
||||||
|
std::make_pair(static_cast<uint32_t>(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 3,
|
||||||
|
FixedArrayList<ModeListEntry, 3>());
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -68,7 +77,7 @@ Subsystem& satsystem::com::init() {
|
|||||||
buildTxAndRxLowRateSequence(SUBSYSTEM, entry);
|
buildTxAndRxLowRateSequence(SUBSYSTEM, entry);
|
||||||
buildTxAndRxHighRateSequence(SUBSYSTEM, entry);
|
buildTxAndRxHighRateSequence(SUBSYSTEM, entry);
|
||||||
buildTxAndRxDefaultRateSequence(SUBSYSTEM, entry);
|
buildTxAndRxDefaultRateSequence(SUBSYSTEM, entry);
|
||||||
SUBSYSTEM.setInitialMode(NML, ::com::Submode::RX_ONLY);
|
SUBSYSTEM.setInitialMode(COM_SEQUENCE_RX_ONLY.first);
|
||||||
return SUBSYSTEM;
|
return SUBSYSTEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +104,7 @@ void buildRxOnlySequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
|
|
||||||
// Build RX Only table. We could track the state of the CCSDS IP core handler
|
// Build RX Only table. We could track the state of the CCSDS IP core handler
|
||||||
// as well but I do not think this is necessary because enabling that should
|
// as well but I do not think this is necessary because enabling that should
|
||||||
// not intefere with the Syrlinks Handler.
|
// not interfere with the Syrlinks Handler.
|
||||||
iht(objects::SYRLINKS_HANDLER, NML, ::com::Submode::RX_ONLY, COM_TABLE_RX_ONLY_TGT.second);
|
iht(objects::SYRLINKS_HANDLER, NML, ::com::Submode::RX_ONLY, COM_TABLE_RX_ONLY_TGT.second);
|
||||||
check(ss.addTable(TableEntry(COM_TABLE_RX_ONLY_TGT.first, &COM_TABLE_RX_ONLY_TGT.second)), ctxc);
|
check(ss.addTable(TableEntry(COM_TABLE_RX_ONLY_TGT.first, &COM_TABLE_RX_ONLY_TGT.second)), ctxc);
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef MISSION_SYSTEM_TREE_COMMODETREE_H_
|
#ifndef MISSION_SYSTEM_TREE_COMMODETREE_H_
|
||||||
#define MISSION_SYSTEM_TREE_COMMODETREE_H_
|
#define MISSION_SYSTEM_TREE_COMMODETREE_H_
|
||||||
|
|
||||||
|
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
|
||||||
#include <mission/system/objects/ComSubsystem.h>
|
#include <mission/system/objects/ComSubsystem.h>
|
||||||
|
|
||||||
namespace satsystem {
|
namespace satsystem {
|
||||||
@ -8,6 +9,11 @@ namespace satsystem {
|
|||||||
namespace com {
|
namespace com {
|
||||||
extern ComSubsystem SUBSYSTEM;
|
extern ComSubsystem SUBSYSTEM;
|
||||||
|
|
||||||
|
// The syrlinks must not transmitting longer then 15 minutes otherwise the
|
||||||
|
// transceiver might be damaged due to overheating
|
||||||
|
// 15 minutes in milliseconds
|
||||||
|
static const uint32_t TRANSMITTER_TIMEOUT = 900000;
|
||||||
|
|
||||||
Subsystem& init();
|
Subsystem& init();
|
||||||
} // namespace com
|
} // namespace com
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "acsModeTree.h"
|
#include "acsModeTree.h"
|
||||||
#include "comModeTree.h"
|
#include "comModeTree.h"
|
||||||
#include "eive/objects.h"
|
#include "eive/objects.h"
|
||||||
|
#include "mission/comDefs.h"
|
||||||
#include "payloadModeTree.h"
|
#include "payloadModeTree.h"
|
||||||
#include "tcsModeTree.h"
|
#include "tcsModeTree.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@ -85,6 +86,7 @@ void buildSafeSequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
// Build SAFE transition 0. Two transitions to reduce number of consecutive events and because
|
// Build SAFE transition 0. Two transitions to reduce number of consecutive events and because
|
||||||
// consecutive commanding of TCS and ACS can lead to SPI issues.
|
// consecutive commanding of TCS and ACS can lead to SPI issues.
|
||||||
iht(objects::TCS_SUBSYSTEM, NML, 0, EIVE_TABLE_SAFE_TRANS_0.second);
|
iht(objects::TCS_SUBSYSTEM, NML, 0, EIVE_TABLE_SAFE_TRANS_0.second);
|
||||||
|
iht(objects::COM_SUBSYSTEM, com::RX_ONLY, 0, EIVE_TABLE_SAFE_TRANS_0.second);
|
||||||
check(ss.addTable(TableEntry(EIVE_TABLE_SAFE_TRANS_0.first, &EIVE_TABLE_SAFE_TRANS_0.second)),
|
check(ss.addTable(TableEntry(EIVE_TABLE_SAFE_TRANS_0.first, &EIVE_TABLE_SAFE_TRANS_0.second)),
|
||||||
ctxc);
|
ctxc);
|
||||||
|
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
#include "CcsdsIpCoreHandler.h"
|
#include "CcsdsIpCoreHandler.h"
|
||||||
|
|
||||||
#include <fsfw/subsystem/helper.h>
|
#include <fsfw/subsystem/helper.h>
|
||||||
#include <linux/ipcore/PdecHandler.h>
|
|
||||||
#include <linux/ipcore/PtmeConfig.h>
|
#include <linux/ipcore/PtmeConfig.h>
|
||||||
#include <mission/config/comCfg.h>
|
#include <mission/config/comCfg.h>
|
||||||
|
|
||||||
#include "eive/definitions.h"
|
#include "eive/definitions.h"
|
||||||
#include "fsfw/events/EventManagerIF.h"
|
|
||||||
#include "fsfw/ipc/QueueFactory.h"
|
#include "fsfw/ipc/QueueFactory.h"
|
||||||
#include "fsfw/objectmanager/ObjectManager.h"
|
#include "fsfw/objectmanager/ObjectManager.h"
|
||||||
#include "fsfw/serialize/SerializeAdapter.h"
|
#include "fsfw/serialize/SerializeAdapter.h"
|
||||||
@ -16,8 +14,7 @@
|
|||||||
|
|
||||||
CcsdsIpCoreHandler::CcsdsIpCoreHandler(object_id_t objectId, object_id_t ptmeId,
|
CcsdsIpCoreHandler::CcsdsIpCoreHandler(object_id_t objectId, object_id_t ptmeId,
|
||||||
object_id_t tcDestination, PtmeConfig* ptmeConfig,
|
object_id_t tcDestination, PtmeConfig* ptmeConfig,
|
||||||
GpioIF* gpioIF, gpioId_t enTxClock, gpioId_t enTxData,
|
GpioIF* gpioIF, gpioId_t enTxClock, gpioId_t enTxData)
|
||||||
uint32_t transmitterTimeout)
|
|
||||||
: SystemObject(objectId),
|
: SystemObject(objectId),
|
||||||
ptmeId(ptmeId),
|
ptmeId(ptmeId),
|
||||||
tcDestination(tcDestination),
|
tcDestination(tcDestination),
|
||||||
@ -27,8 +24,7 @@ CcsdsIpCoreHandler::CcsdsIpCoreHandler(object_id_t objectId, object_id_t ptmeId,
|
|||||||
ptmeConfig(ptmeConfig),
|
ptmeConfig(ptmeConfig),
|
||||||
gpioIF(gpioIF),
|
gpioIF(gpioIF),
|
||||||
enTxClock(enTxClock),
|
enTxClock(enTxClock),
|
||||||
enTxData(enTxData),
|
enTxData(enTxData) {
|
||||||
transmitterTimeout(transmitterTimeout) {
|
|
||||||
commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE);
|
commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE);
|
||||||
auto mqArgs = MqArgs(objectId, static_cast<void*>(this));
|
auto mqArgs = MqArgs(objectId, static_cast<void*>(this));
|
||||||
eventQueue =
|
eventQueue =
|
||||||
@ -38,11 +34,9 @@ CcsdsIpCoreHandler::CcsdsIpCoreHandler(object_id_t objectId, object_id_t ptmeId,
|
|||||||
CcsdsIpCoreHandler::~CcsdsIpCoreHandler() {}
|
CcsdsIpCoreHandler::~CcsdsIpCoreHandler() {}
|
||||||
|
|
||||||
ReturnValue_t CcsdsIpCoreHandler::performOperation(uint8_t operationCode) {
|
ReturnValue_t CcsdsIpCoreHandler::performOperation(uint8_t operationCode) {
|
||||||
checkEvents();
|
|
||||||
readCommandQueue();
|
readCommandQueue();
|
||||||
handleTelemetry();
|
handleTelemetry();
|
||||||
handleTelecommands();
|
handleTelecommands();
|
||||||
checkTxTimer();
|
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,46 +92,11 @@ ReturnValue_t CcsdsIpCoreHandler::initialize() {
|
|||||||
iter->second->setPtmeObject(ptme);
|
iter->second->setPtmeObject(ptme);
|
||||||
}
|
}
|
||||||
|
|
||||||
EventManagerIF* manager = ObjectManager::instance()->get<EventManagerIF>(objects::EVENT_MANAGER);
|
|
||||||
if (manager == nullptr) {
|
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
||||||
sif::error << "CcsdsHandler::initialize: Invalid event manager" << std::endl;
|
|
||||||
#endif
|
|
||||||
return ObjectManagerIF::CHILD_INIT_FAILED;
|
|
||||||
}
|
|
||||||
result = manager->registerListener(eventQueue->getId());
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
||||||
sif::warning << "CcsdsHandler::initialize: Failed to register CCSDS handler as event "
|
|
||||||
"listener"
|
|
||||||
<< std::endl;
|
|
||||||
#endif
|
|
||||||
return ObjectManagerIF::CHILD_INIT_FAILED;
|
|
||||||
;
|
|
||||||
}
|
|
||||||
result = manager->subscribeToEventRange(eventQueue->getId(),
|
|
||||||
event::getEventId(PdecHandler::CARRIER_LOCK),
|
|
||||||
event::getEventId(PdecHandler::BIT_LOCK_PDEC));
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
||||||
sif::error << "CcsdsHandler::initialize: Failed to subscribe to events from PDEC "
|
|
||||||
"handler"
|
|
||||||
<< std::endl;
|
|
||||||
#endif
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
result = ptmeConfig->initialize();
|
result = ptmeConfig->initialize();
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
return ObjectManagerIF::CHILD_INIT_FAILED;
|
return ObjectManagerIF::CHILD_INIT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
return ObjectManagerIF::CHILD_INIT_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
transmitterCountdown.setTimeout(transmitterTimeout);
|
|
||||||
transmitterCountdown.timeOut();
|
|
||||||
|
|
||||||
#if OBSW_SYRLINKS_SIMULATED == 1
|
#if OBSW_SYRLINKS_SIMULATED == 1
|
||||||
// Update data on rising edge
|
// Update data on rising edge
|
||||||
ptmeConfig->invertTxClock(false);
|
ptmeConfig->invertTxClock(false);
|
||||||
@ -286,54 +245,6 @@ ReturnValue_t CcsdsIpCoreHandler::executeAction(ActionId_t actionId, MessageQueu
|
|||||||
return EXECUTION_FINISHED;
|
return EXECUTION_FINISHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::checkEvents() {
|
|
||||||
EventMessage event;
|
|
||||||
for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == returnvalue::OK;
|
|
||||||
result = eventQueue->receiveMessage(&event)) {
|
|
||||||
switch (event.getMessageId()) {
|
|
||||||
case EventMessage::EVENT_MESSAGE:
|
|
||||||
handleEvent(&event);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sif::debug << "CcsdsHandler::checkEvents: Did not subscribe to this event message"
|
|
||||||
<< std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::handleEvent(EventMessage* eventMessage) {
|
|
||||||
Event event = eventMessage->getEvent();
|
|
||||||
switch (event) {
|
|
||||||
case PdecHandler::BIT_LOCK_PDEC: {
|
|
||||||
handleBitLockEvent();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PdecHandler::CARRIER_LOCK: {
|
|
||||||
handleCarrierLockEvent();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
sif::debug << "CcsdsHandler::handleEvent: Did not subscribe to this event" << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::handleBitLockEvent() {
|
|
||||||
if (transmitterCountdown.isBusy()) {
|
|
||||||
// Transmitter already enabled
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
enableTransmit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::handleCarrierLockEvent() {
|
|
||||||
if (!enableTxWhenCarrierLock) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
enableTransmit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::forwardLinkstate() {
|
void CcsdsIpCoreHandler::forwardLinkstate() {
|
||||||
VirtualChannelMapIter iter;
|
VirtualChannelMapIter iter;
|
||||||
for (iter = virtualChannelMap.begin(); iter != virtualChannelMap.end(); iter++) {
|
for (iter = virtualChannelMap.begin(); iter != virtualChannelMap.end(); iter++) {
|
||||||
@ -342,27 +253,12 @@ void CcsdsIpCoreHandler::forwardLinkstate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::enableTransmit() {
|
void CcsdsIpCoreHandler::enableTransmit() {
|
||||||
if (transmitterCountdown.isBusy()) {
|
|
||||||
// Transmitter already enabled
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifndef TE0720_1CFA
|
#ifndef TE0720_1CFA
|
||||||
gpioIF->pullHigh(enTxClock);
|
gpioIF->pullHigh(enTxClock);
|
||||||
gpioIF->pullHigh(enTxData);
|
gpioIF->pullHigh(enTxData);
|
||||||
#endif
|
#endif
|
||||||
linkState = UP;
|
linkState = UP;
|
||||||
forwardLinkstate();
|
forwardLinkstate();
|
||||||
transmitterCountdown.resetTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::checkTxTimer() {
|
|
||||||
if (linkState == DOWN) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (transmitterCountdown.hasTimedOut()) {
|
|
||||||
disableTransmit();
|
|
||||||
// TODO: set mode to off (move timer to subsystem)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CcsdsIpCoreHandler::getMode(Mode_t* mode, Submode_t* submode) {
|
void CcsdsIpCoreHandler::getMode(Mode_t* mode, Submode_t* submode) {
|
||||||
@ -431,7 +327,6 @@ void CcsdsIpCoreHandler::disableTransmit() {
|
|||||||
#endif
|
#endif
|
||||||
linkState = DOWN;
|
linkState = DOWN;
|
||||||
forwardLinkstate();
|
forwardLinkstate();
|
||||||
transmitterCountdown.timeOut();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* CcsdsIpCoreHandler::getName() const { return "CCSDS Handler"; }
|
const char* CcsdsIpCoreHandler::getName() const { return "CCSDS Handler"; }
|
||||||
|
@ -59,8 +59,7 @@ class CcsdsIpCoreHandler : public SystemObject,
|
|||||||
* @param enTxData GPIO ID of RS485 tx data enable
|
* @param enTxData GPIO ID of RS485 tx data enable
|
||||||
*/
|
*/
|
||||||
CcsdsIpCoreHandler(object_id_t objectId, object_id_t ptmeId, object_id_t tcDestination,
|
CcsdsIpCoreHandler(object_id_t objectId, object_id_t ptmeId, object_id_t tcDestination,
|
||||||
PtmeConfig* ptmeConfig, GpioIF* gpioIF, gpioId_t enTxClock, gpioId_t enTxData,
|
PtmeConfig* ptmeConfig, GpioIF* gpioIF, gpioId_t enTxClock, gpioId_t enTxData);
|
||||||
uint32_t transmitterTimeout = 900000);
|
|
||||||
|
|
||||||
~CcsdsIpCoreHandler();
|
~CcsdsIpCoreHandler();
|
||||||
|
|
||||||
@ -154,29 +153,16 @@ class CcsdsIpCoreHandler : public SystemObject,
|
|||||||
PtmeConfig* ptmeConfig = nullptr;
|
PtmeConfig* ptmeConfig = nullptr;
|
||||||
|
|
||||||
GpioIF* gpioIF = nullptr;
|
GpioIF* gpioIF = nullptr;
|
||||||
|
// GPIO to enable RS485 transceiver for TX clock
|
||||||
gpioId_t enTxClock = gpio::NO_GPIO;
|
gpioId_t enTxClock = gpio::NO_GPIO;
|
||||||
|
// GPIO to enable RS485 transceiver for TX data signal
|
||||||
gpioId_t enTxData = gpio::NO_GPIO;
|
gpioId_t enTxData = gpio::NO_GPIO;
|
||||||
|
|
||||||
// Syrlinks must not be transmitting more than 15 minutes (according to datasheet)
|
|
||||||
// Value initialized by constructor argument
|
|
||||||
const uint32_t transmitterTimeout = 0;
|
|
||||||
|
|
||||||
// Countdown to disable transmitter after 15 minutes
|
|
||||||
Countdown transmitterCountdown;
|
|
||||||
|
|
||||||
// When true transmitting is started as soon as carrier lock has been detected
|
|
||||||
bool enableTxWhenCarrierLock = false;
|
|
||||||
|
|
||||||
bool linkState = DOWN;
|
bool linkState = DOWN;
|
||||||
|
|
||||||
void readCommandQueue(void);
|
void readCommandQueue(void);
|
||||||
void handleTelemetry();
|
void handleTelemetry();
|
||||||
void handleTelecommands();
|
void handleTelecommands();
|
||||||
void checkEvents();
|
|
||||||
void handleEvent(EventMessage* eventMessage);
|
|
||||||
|
|
||||||
void handleBitLockEvent();
|
|
||||||
void handleCarrierLockEvent();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Forward link state to virtual channels.
|
* @brief Forward link state to virtual channels.
|
||||||
@ -188,12 +174,6 @@ class CcsdsIpCoreHandler : public SystemObject,
|
|||||||
*/
|
*/
|
||||||
void enableTransmit();
|
void enableTransmit();
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Checks Tx timer for timeout and disables RS485 tx clock and tx data in case
|
|
||||||
* timer has expired.
|
|
||||||
*/
|
|
||||||
void checkTxTimer();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Disables the transmitter by pulling the enable tx clock and tx data pin of the
|
* @brief Disables the transmitter by pulling the enable tx clock and tx data pin of the
|
||||||
* RS485 transceiver chips to high.
|
* RS485 transceiver chips to high.
|
||||||
|
@ -21,7 +21,7 @@ ReturnValue_t CfdpTmFunnel::performOperation(uint8_t) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
count++;
|
count++;
|
||||||
if(count == 500) {
|
if (count == 500) {
|
||||||
sif::error << "CfdpTmFunnel: Possible message storm detected" << std::endl;
|
sif::error << "CfdpTmFunnel: Possible message storm detected" << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ ReturnValue_t PusTmFunnel::performOperation(uint8_t) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
count++;
|
count++;
|
||||||
if(count == 500) {
|
if (count == 500) {
|
||||||
sif::error << "PusTmFunnel: Possible message storm detected" << std::endl;
|
sif::error << "PusTmFunnel: Possible message storm detected" << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ ReturnValue_t VirtualChannel::performOperation() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
if(count == 500) {
|
if (count == 500) {
|
||||||
sif::error << "VirtualChannel: Possible message storm detected" << std::endl;
|
sif::error << "VirtualChannel: Possible message storm detected" << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
2
tmtc
2
tmtc
@ -1 +1 @@
|
|||||||
Subproject commit be032ab925cab58bc443dd877b8260d291894802
|
Subproject commit a04bd8aa738ca14cb3d5badffd00e91047730d5e
|
Loading…
x
Reference in New Issue
Block a user
Any specific reason or bug why this was added?
Yes. If the syrlinks already had a bit lock during reboot, the bit lock and carrier lock events were never triggered.