diff --git a/bsp_q7s/callbacks/CMakeLists.txt b/bsp_q7s/callbacks/CMakeLists.txt index 8c83e26f..a85bf6fb 100644 --- a/bsp_q7s/callbacks/CMakeLists.txt +++ b/bsp_q7s/callbacks/CMakeLists.txt @@ -1,4 +1,5 @@ target_sources(${TARGET_NAME} PRIVATE rwSpiCallback.cpp gnssCallback.cpp + pcduSwitchCb.cpp ) diff --git a/bsp_q7s/callbacks/pcduSwitchCb.cpp b/bsp_q7s/callbacks/pcduSwitchCb.cpp new file mode 100644 index 00000000..ec5f4dc5 --- /dev/null +++ b/bsp_q7s/callbacks/pcduSwitchCb.cpp @@ -0,0 +1,32 @@ +#include "pcduSwitchCb.h" + +#include + +#include "devices/gpioIds.h" + +void pcdu::switchCallback(GOMSPACE::Pdu pdu, uint8_t channel, bool state, void* args) { + LinuxLibgpioIF* gpioComIF = reinterpret_cast(args); + if (gpioComIF == nullptr) { + return; + } + if (pdu == GOMSPACE::Pdu::PDU1) { + PDU1::SwitchChannels typedChannel = static_cast(channel); + if (typedChannel == PDU1::SwitchChannels::ACS_A_SIDE) { + if (state) { + gpioComIF->pullHigh(gpioIds::GNSS_0_NRESET); + } else { + gpioComIF->pullLow(gpioIds::GNSS_0_NRESET); + } + } + + } else if (pdu == GOMSPACE::Pdu::PDU2) { + PDU2::SwitchChannels typedChannel = static_cast(channel); + if (typedChannel == PDU2::SwitchChannels::ACS_B_SIDE) { + if (state) { + gpioComIF->pullHigh(gpioIds::GNSS_1_NRESET); + } else { + gpioComIF->pullLow(gpioIds::GNSS_1_NRESET); + } + } + } +} diff --git a/bsp_q7s/callbacks/pcduSwitchCb.h b/bsp_q7s/callbacks/pcduSwitchCb.h new file mode 100644 index 00000000..d0f2b748 --- /dev/null +++ b/bsp_q7s/callbacks/pcduSwitchCb.h @@ -0,0 +1,14 @@ +#ifndef BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_ +#define BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_ + +#include + +#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" + +namespace pcdu { + +void switchCallback(GOMSPACE::Pdu pdu, uint8_t channel, bool state, void* args); + +} + +#endif /* BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_ */ diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 69f6dfaf..5867c977 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -3,6 +3,7 @@ #include #include "OBSWConfig.h" +#include "bsp_q7s/callbacks/pcduSwitchCb.h" #include "bsp_q7s/boardtest/Q7STestTask.h" #include "bsp_q7s/callbacks/gnssCallback.h" #include "bsp_q7s/callbacks/rwSpiCallback.h" @@ -122,13 +123,14 @@ void ObjectFactory::produce(void* args) { #if BOARD_TE0720 == 0 new CoreController(objects::CORE_CONTROLLER); - createPcduComponents(); + createPcduComponents(gpioComIF); createRadSensorComponent(gpioComIF); createSunSensorComponents(gpioComIF, spiComIF); #if OBSW_ADD_ACS_BOARD == 1 createAcsBoardComponents(gpioComIF, uartComIF); -#endif /* OBSW_ADD_ACS_BOARD == 1 */ +#endif + createHeaterComponents(); createSolarArrayDeploymentComponents(); #if OBSW_ADD_SYRLINKS == 1 @@ -234,7 +236,7 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, Ua #endif } -void ObjectFactory::createPcduComponents() { +void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF) { CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_LENGTH, addresses::P60DOCK); CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU1); CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH, addresses::PDU2); @@ -244,8 +246,10 @@ void ObjectFactory::createPcduComponents() { new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, p60DockCspCookie); PDU1Handler* pdu1handler = new PDU1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, pdu1CspCookie); + pdu1handler->assignChannelHookFunction(&pcdu::switchCallback, gpioComIF); PDU2Handler* pdu2handler = new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie); + pdu2handler->assignChannelHookFunction(&pcdu::switchCallback, gpioComIF); ACUHandler* acuhandler = new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie); new PCDUHandler(objects::PCDU_HANDLER, 50); @@ -472,6 +476,7 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI gpioComIF->addGpios(gpioCookieAcsBoard); +#if OBSW_ADD_ACS_HANDLERS == 1 std::string spiDev = q7s::SPI_DEFAULT_DEV; SpiCookie* spiCookie = new SpiCookie(addresses::MGM_0_LIS3, gpioIds::MGM_0_LIS3_CS, spiDev, @@ -561,6 +566,7 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI resetArgsGnss0.waitPeriodMs = 100; auto gpsHandler0 = new GPSHyperionHandler(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps); gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0); +#endif /* OBSW_ADD_ACS_HANDLERS == 1 */ } void ObjectFactory::createHeaterComponents() { diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h index 47e06e33..8fa4a147 100644 --- a/bsp_q7s/core/ObjectFactory.h +++ b/bsp_q7s/core/ObjectFactory.h @@ -13,7 +13,7 @@ void produce(void* args); void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF, SpiComIF** spiComIF); void createTmpComponents(); -void createPcduComponents(); +void createPcduComponents(LinuxLibgpioIF* gpioComIF); void createRadSensorComponent(LinuxLibgpioIF* gpioComIF); void createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF); void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF); diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index ea26425b..5d501eb6 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -46,7 +46,8 @@ debugging. */ #define OBSW_ADD_PLOC_SUPERVISOR 0 #define OBSW_ADD_PLOC_MPSOC 0 #define OBSW_ADD_SUN_SENSORS 0 -#define OBSW_ADD_ACS_BOARD 0 +#define OBSW_ADD_ACS_BOARD 1 +#define OBSW_ADD_ACS_HANDLERS 0 #define OBSW_ADD_RW 0 #define OBSW_ADD_RTD_DEVICES 0 #define OBSW_ADD_TMP_DEVICES 0 diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 814e5c2d..0675cf0d 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -435,7 +435,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::RW4, length * 0.8, DeviceHandlerIF::GET_READ); #endif -#if OBSW_ADD_ACS_BOARD == 1 +#if OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 bool enableAside = true; bool enableBside = false; if (enableAside) { @@ -501,7 +501,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); } -#endif /* OBSW_ADD_ACS_BOARD == 1 */ +#endif /* OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 */ ReturnValue_t seqCheck = thisSequence->checkSequence(); if (seqCheck != HasReturnvaluesIF::RETURN_OK) { diff --git a/mission/devices/PDU1Handler.cpp b/mission/devices/PDU1Handler.cpp index f4bd2839..6f2fd01e 100644 --- a/mission/devices/PDU1Handler.cpp +++ b/mission/devices/PDU1Handler.cpp @@ -68,48 +68,50 @@ void PDU1Handler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *pac #endif } -void PDU1Handler::assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook) { +void PDU1Handler::assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook, void *args) { this->channelSwitchHook = hook; + this->hookArgs = args; } ReturnValue_t PDU1Handler::setParamCallback(SetParamMessageUnpacker &unpacker) { using namespace PDU1; + GOMSPACE::Pdu pdu = GOMSPACE::Pdu::PDU1; if (channelSwitchHook != nullptr and unpacker.getParameterSize() == 1) { switch (unpacker.getAddress()) { case (CONFIG_ADDRESS_OUT_EN_TCS_BOARD_3V3): { - channelSwitchHook(0, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 0, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_SYRLINKS): { - channelSwitchHook(1, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 1, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_STAR_TRACKER): { - channelSwitchHook(2, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 2, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_MGT): { - channelSwitchHook(3, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 3, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_SUS_NOMINAL): { - channelSwitchHook(4, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 4, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_SOLAR_CELL_EXP): { - channelSwitchHook(5, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 5, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_PLOC): { - channelSwitchHook(6, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 6, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_A): { - channelSwitchHook(7, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 7, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_CHANNEL8): { - channelSwitchHook(8, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 8, unpacker.getParameter()[0], hookArgs); break; } } diff --git a/mission/devices/PDU1Handler.h b/mission/devices/PDU1Handler.h index fea8395e..9b60e7e9 100644 --- a/mission/devices/PDU1Handler.h +++ b/mission/devices/PDU1Handler.h @@ -27,7 +27,7 @@ class PDU1Handler : public GomspaceDeviceHandler { virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; - void assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook); + void assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook, void* args); protected: /** @@ -43,6 +43,7 @@ class PDU1Handler : public GomspaceDeviceHandler { /** Dataset for the housekeeping table of the PDU1 */ PDU1::PDU1HkTableDataset pdu1HkTableDataset; GOMSPACE::ChannelSwitchHook channelSwitchHook = nullptr; + void* hookArgs = nullptr; void printHkTable(); void parseHkTableReply(const uint8_t* packet); diff --git a/mission/devices/PDU2Handler.cpp b/mission/devices/PDU2Handler.cpp index 68d903f3..d2d879f8 100644 --- a/mission/devices/PDU2Handler.cpp +++ b/mission/devices/PDU2Handler.cpp @@ -49,8 +49,9 @@ void PDU2Handler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *pac #endif } -void PDU2Handler::assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook) { - this->channelSwitchHook = hook; +void PDU2Handler::assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook, void *args) { + this->channelSwitchHook = hook; + this->hookArgs = args; } void PDU2Handler::parseHkTableReply(const uint8_t *packet) { @@ -428,42 +429,43 @@ void PDU2Handler::printHkTable() { ReturnValue_t PDU2Handler::setParamCallback(SetParamMessageUnpacker &unpacker) { using namespace PDU2; + GOMSPACE::Pdu pdu = GOMSPACE::Pdu::PDU2; if (channelSwitchHook != nullptr and unpacker.getParameterSize() == 1) { switch (unpacker.getAddress()) { case (CONFIG_ADDRESS_OUT_EN_Q7S): { - channelSwitchHook(0, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 0, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_PAYLOAD_PCDU_CH1): { - channelSwitchHook(1, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 1, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_RW): { - channelSwitchHook(2, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 2, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_TCS_BOARD_HEATER_IN): { - channelSwitchHook(3, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 3, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_SUS_REDUNDANT): { - channelSwitchHook(4, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 4, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_DEPLOYMENT_MECHANISM): { - channelSwitchHook(5, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 5, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_PAYLOAD_PCDU_CH6PLOC): { - channelSwitchHook(6, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 6, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_B): { - channelSwitchHook(7, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 7, unpacker.getParameter()[0], hookArgs); break; } case (CONFIG_ADDRESS_OUT_EN_PAYLOAD_CAMERA): { - channelSwitchHook(8, unpacker.getParameter()[0]); + channelSwitchHook(pdu, 8, unpacker.getParameter()[0], hookArgs); break; } } diff --git a/mission/devices/PDU2Handler.h b/mission/devices/PDU2Handler.h index 20cfd52c..b721ce58 100644 --- a/mission/devices/PDU2Handler.h +++ b/mission/devices/PDU2Handler.h @@ -26,7 +26,8 @@ class PDU2Handler : public GomspaceDeviceHandler { virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; - void assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook); + void assignChannelHookFunction(GOMSPACE::ChannelSwitchHook hook, void* args); + protected: /** * @brief As soon as the device is in MODE_NORMAL, this function is executed periodically. @@ -34,11 +35,13 @@ class PDU2Handler : public GomspaceDeviceHandler { virtual ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; virtual void letChildHandleHkReply(DeviceCommandId_t id, const uint8_t* packet) override; ReturnValue_t printStatus(DeviceCommandId_t cmd) override; - ReturnValue_t setParamCallback(SetParamMessageUnpacker &unpacker) override; + ReturnValue_t setParamCallback(SetParamMessageUnpacker& unpacker) override; + private: /** Dataset for the housekeeping table of the PDU2 */ PDU2::PDU2HkTableDataset pdu2HkTableDataset; GOMSPACE::ChannelSwitchHook channelSwitchHook = nullptr; + void* hookArgs = nullptr; void printHkTable(); diff --git a/mission/devices/devicedefinitions/GomspaceDefinitions.h b/mission/devices/devicedefinitions/GomspaceDefinitions.h index 64fdd426..fde4e047 100644 --- a/mission/devices/devicedefinitions/GomspaceDefinitions.h +++ b/mission/devices/devicedefinitions/GomspaceDefinitions.h @@ -1,11 +1,3 @@ -/* - * GomspaceDefinitions.h - * - * @brief This file holds all definitions specific for devices from gomspace. - * @date 20.12.2020 - * @author J. Meier - */ - #ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ @@ -17,7 +9,9 @@ namespace GOMSPACE { -using ChannelSwitchHook = void (*)(uint8_t channel, bool on); +enum class Pdu { PDU1, PDU2 }; + +using ChannelSwitchHook = void (*)(Pdu pdu, uint8_t channel, bool on, void* args); static const uint16_t IGNORE_CHECKSUM = 0xbb0; /** The size of the header of a gomspace CSP packet. */ @@ -614,19 +608,32 @@ static const uint8_t HK_TABLE_ENTRIES = 73; namespace PDU1 { static const uint32_t HK_TABLE_DATA_SET_ID = 0x1; // hk table has table id 4 + +enum SwitchChannels : uint8_t { + TCS_BOARD_3V3 = 0, + SYRLINKS = 1, + STR = 2, + MGT = 3, + SUS_NOMINAL = 4, + SOL_CELL_EXPERIMENT = 5, + PLOC = 6, + ACS_A_SIDE = 7, + UNUSED = 8 +}; + /** * Addresses within configuration table to enable or disable output channels. Refer also to * gs-man-nanopower-p60-pdu-200.pdf on page 16. */ static const uint16_t CONFIG_ADDRESS_OUT_EN_TCS_BOARD_3V3 = 0x48; static const uint16_t CONFIG_ADDRESS_OUT_EN_SYRLINKS = 0x49; -static const uint16_t CONFIG_ADDRESS_OUT_EN_STAR_TRACKER = 0x50; -static const uint16_t CONFIG_ADDRESS_OUT_EN_MGT = 0x51; -static const uint16_t CONFIG_ADDRESS_OUT_EN_SUS_NOMINAL = 0x52; -static const uint16_t CONFIG_ADDRESS_OUT_EN_SOLAR_CELL_EXP = 0x53; -static const uint16_t CONFIG_ADDRESS_OUT_EN_PLOC = 0x54; -static const uint16_t CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_A = 0x55; -static const uint16_t CONFIG_ADDRESS_OUT_EN_CHANNEL8 = 0x56; +static const uint16_t CONFIG_ADDRESS_OUT_EN_STAR_TRACKER = 0x4A; +static const uint16_t CONFIG_ADDRESS_OUT_EN_MGT = 0x4B; +static const uint16_t CONFIG_ADDRESS_OUT_EN_SUS_NOMINAL = 0x4C; +static const uint16_t CONFIG_ADDRESS_OUT_EN_SOLAR_CELL_EXP = 0x4D; +static const uint16_t CONFIG_ADDRESS_OUT_EN_PLOC = 0x4E; +static const uint16_t CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_A = 0x4F; +static const uint16_t CONFIG_ADDRESS_OUT_EN_CHANNEL8 = 0x50; /** * @brief This class defines a dataset for the hk table of the PDU1. @@ -802,6 +809,19 @@ class PDU1HkTableDataset : public StaticLocalDataSet { namespace PDU2 { static const uint32_t HK_TABLE_DATA_SET_ID = 0x2; + +enum SwitchChannels : uint8_t { + Q7S = 0, + PAYLOAD_PCDU_CH1 = 1, + RW = 2, + TCS_HEATER_IN = 3, + SUS_REDUNDANT = 4, + DEPY_MECHANISM = 5, + PAYLOAD_PCDU_CH6 = 6, + ACS_B_SIDE = 7, + PAYLOAD_CAMERA = 8 +}; + /** * Addresses within configuration table to enable or disable output channels. Refer also to * gs-man-nanopower-p60-pdu-200.pdf on page 16.