From 2261ccb30447142b8325a3a305612e6a6a65f9f7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 11:40:10 +0200 Subject: [PATCH 01/11] create ACS controller in EM sw --- bsp_q7s/em/emObjectFactory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index 9301f6d3..ad71b8c6 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -68,4 +68,5 @@ void ObjectFactory::produce(void* args) { #endif /* OBSW_ADD_TEST_CODE == 1 */ createMiscComponents(); + createAcsController(); } From 3230efa4aa2e7974a50d23f7bbc02f9ebd48ad7e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 11:54:43 +0200 Subject: [PATCH 02/11] new dummy helper functions --- dummies/CMakeLists.txt | 3 ++- dummies/MgmLIS3MDLDummy.cpp | 2 +- dummies/MgmLIS3MDLDummy.h | 2 ++ dummies/helpers.cpp | 52 +++++++++++++++++++++++++++++++++++++ dummies/helpers.h | 13 ++++++++++ 5 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 dummies/helpers.cpp create mode 100644 dummies/helpers.h diff --git a/dummies/CMakeLists.txt b/dummies/CMakeLists.txt index d855b155..a12a0a8d 100644 --- a/dummies/CMakeLists.txt +++ b/dummies/CMakeLists.txt @@ -16,4 +16,5 @@ target_sources( GyroL3GD20Dummy.cpp MgmLIS3MDLDummy.cpp PlPcduDummy.cpp - CoreControllerDummy.cpp) + CoreControllerDummy.cpp + helpers.cpp) diff --git a/dummies/MgmLIS3MDLDummy.cpp b/dummies/MgmLIS3MDLDummy.cpp index ea84c4b2..7aa5fdf7 100644 --- a/dummies/MgmLIS3MDLDummy.cpp +++ b/dummies/MgmLIS3MDLDummy.cpp @@ -3,7 +3,7 @@ #include "fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h" MgmLIS3MDLDummy::MgmLIS3MDLDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) - : DeviceHandlerBase(objectId, comif, comCookie) {} + : DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {} MgmLIS3MDLDummy::~MgmLIS3MDLDummy() {} diff --git a/dummies/MgmLIS3MDLDummy.h b/dummies/MgmLIS3MDLDummy.h index 86b3e433..bd18cb25 100644 --- a/dummies/MgmLIS3MDLDummy.h +++ b/dummies/MgmLIS3MDLDummy.h @@ -2,6 +2,7 @@ #define DUMMIES_MGMLIS3MDLDUMMY_H_ #include +#include "fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h" class MgmLIS3MDLDummy : public DeviceHandlerBase { public: @@ -15,6 +16,7 @@ class MgmLIS3MDLDummy : public DeviceHandlerBase { virtual ~MgmLIS3MDLDummy(); protected: + MGMLIS3MDL::MgmPrimaryDataset dataset; void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; diff --git a/dummies/helpers.cpp b/dummies/helpers.cpp new file mode 100644 index 00000000..13ebec98 --- /dev/null +++ b/dummies/helpers.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "helpers.h" + +using namespace dummy; + +void createDummies(DummyCfg cfg) { + new ComIFDummy(objects::DUMMY_COM_IF); + ComCookieDummy* comCookieDummy = new ComCookieDummy(); + new BpxDummy(objects::BPX_BATT_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + if(cfg.addCoreCtrlCfg) { + new CoreControllerDummy(objects::CORE_CONTROLLER); + } + + new RwDummy(objects::RW1, objects::DUMMY_COM_IF, comCookieDummy); + new RwDummy(objects::RW2, objects::DUMMY_COM_IF, comCookieDummy); + new RwDummy(objects::RW3, objects::DUMMY_COM_IF, comCookieDummy); + new RwDummy(objects::RW4, objects::DUMMY_COM_IF, comCookieDummy); + new StarTrackerDummy(objects::STAR_TRACKER, objects::DUMMY_COM_IF, comCookieDummy); + new SyrlinksDummy(objects::SYRLINKS_HK_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new ImtqDummy(objects::IMTQ_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + if(cfg.addPowerDummies) { + new AcuDummy(objects::ACU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new PduDummy(objects::PDU1_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new PduDummy(objects::PDU2_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new P60DockDummy(objects::P60DOCK_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + } + + if(cfg.addAcsBoardDummies) { + new GyroAdisDummy(objects::GYRO_0_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new GyroL3GD20Dummy(objects::GYRO_1_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new GyroAdisDummy(objects::GYRO_2_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new GyroL3GD20Dummy(objects::GYRO_3_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new MgmLIS3MDLDummy(objects::MGM_0_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new MgmLIS3MDLDummy(objects::MGM_2_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + } + + new PlPcduDummy(objects::PLPCDU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); +} diff --git a/dummies/helpers.h b/dummies/helpers.h new file mode 100644 index 00000000..d19b3882 --- /dev/null +++ b/dummies/helpers.h @@ -0,0 +1,13 @@ +#pragma once + +namespace dummy { + +struct DummyCfg { + bool addCoreCtrlCfg = true; + bool addPowerDummies = true; + bool addAcsBoardDummies = true; +}; + +void createDummies(DummyCfg cfg); + +} From c61672009552341e4e9e7a6d25e19156b5f895c5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 11:58:00 +0200 Subject: [PATCH 03/11] update .cproject file again --- dummies/helpers.cpp | 4 +++- misc/eclipse/.cproject | 10 +++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/dummies/helpers.cpp b/dummies/helpers.cpp index 13ebec98..1c807217 100644 --- a/dummies/helpers.cpp +++ b/dummies/helpers.cpp @@ -1,3 +1,5 @@ +#include "helpers.h" + #include #include #include @@ -13,7 +15,7 @@ #include #include #include -#include "helpers.h" + using namespace dummy; diff --git a/misc/eclipse/.cproject b/misc/eclipse/.cproject index 9bb5f401..a4df0648 100644 --- a/misc/eclipse/.cproject +++ b/misc/eclipse/.cproject @@ -57,7 +57,7 @@ - + @@ -119,7 +119,7 @@ - + @@ -187,7 +187,7 @@ - + @@ -255,7 +255,7 @@ - + @@ -1317,7 +1317,7 @@ - + From 3313604cb51294a9f46318c182f1a14de58ca124 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 12:00:58 +0200 Subject: [PATCH 04/11] move some dummy creation into separate function --- bsp_hosted/ObjectFactory.cpp | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/bsp_hosted/ObjectFactory.cpp b/bsp_hosted/ObjectFactory.cpp index 64092bad..45be19f3 100644 --- a/bsp_hosted/ObjectFactory.cpp +++ b/bsp_hosted/ObjectFactory.cpp @@ -43,6 +43,7 @@ #include #include #include +#include "dummies/helpers.h" void Factory::setStaticFrameworkObjectIds() { PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_PACKET_DISTRIBUTOR; @@ -62,28 +63,8 @@ void ObjectFactory::produce(void* args) { Factory::setStaticFrameworkObjectIds(); ObjectFactory::produceGenericObjects(); - new ComIFDummy(objects::DUMMY_COM_IF); - ComCookieDummy* comCookieDummy = new ComCookieDummy(); - new BpxDummy(objects::BPX_BATT_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new CoreControllerDummy(objects::CORE_CONTROLLER); - new RwDummy(objects::RW1, objects::DUMMY_COM_IF, comCookieDummy); - new RwDummy(objects::RW2, objects::DUMMY_COM_IF, comCookieDummy); - new RwDummy(objects::RW3, objects::DUMMY_COM_IF, comCookieDummy); - new RwDummy(objects::RW4, objects::DUMMY_COM_IF, comCookieDummy); - new StarTrackerDummy(objects::STAR_TRACKER, objects::DUMMY_COM_IF, comCookieDummy); - new SyrlinksDummy(objects::SYRLINKS_HK_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new ImtqDummy(objects::IMTQ_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new AcuDummy(objects::ACU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new PduDummy(objects::PDU1_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new PduDummy(objects::PDU2_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new P60DockDummy(objects::P60DOCK_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new GyroAdisDummy(objects::GYRO_0_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new GyroL3GD20Dummy(objects::GYRO_1_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new GyroAdisDummy(objects::GYRO_2_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new GyroL3GD20Dummy(objects::GYRO_3_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new MgmLIS3MDLDummy(objects::MGM_0_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new MgmLIS3MDLDummy(objects::MGM_2_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - new PlPcduDummy(objects::PLPCDU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + dummy::DummyCfg cfg; + dummy::createDummies(cfg); new TemperatureSensorsDummy(); new SusDummy(); new ThermalController(objects::THERMAL_CONTROLLER, objects::NO_OBJECT); From 8ebc62cbe6b406f0a39f630538a751fbbfd11e26 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 13:03:22 +0200 Subject: [PATCH 05/11] new ACS preproc defines --- CMakeLists.txt | 9 ++++++--- bsp_q7s/OBSWConfig.h.in | 3 ++- bsp_q7s/core/InitMission.cpp | 10 +++++----- bsp_q7s/core/ObjectFactory.cpp | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b8190ec..03c1eece 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,11 +95,14 @@ set(OBSW_ADD_SUS_BOARD_ASS set(OBSW_ADD_ACS_BOARD ${INIT_VAL} CACHE STRING "Add ACS board module") -set(OBSW_ADD_ACS_HANDLERS +set(OBSW_ADD_GPS_CTRL ${INIT_VAL} - CACHE STRING "Add ACS handlers") + CACHE STRING "Add GPS controllers") +set(OBSW_ADD_ACS_CTRL + ${INIT_VAL} + CACHE STRING "Add ACS controller") set(OBSW_ADD_RTD_DEVICES - ${INIT_VAL} + 1 CACHE STRING "Add RTD devices") set(OBSW_ADD_RAD_SENSORS ${INIT_VAL} diff --git a/bsp_q7s/OBSWConfig.h.in b/bsp_q7s/OBSWConfig.h.in index b9c27840..c20db3f1 100644 --- a/bsp_q7s/OBSWConfig.h.in +++ b/bsp_q7s/OBSWConfig.h.in @@ -30,7 +30,8 @@ #define OBSW_ADD_SUN_SENSORS @OBSW_ADD_SUN_SENSORS@ #define OBSW_ADD_SUS_BOARD_ASS @OBSW_ADD_SUS_BOARD_ASS@ #define OBSW_ADD_ACS_BOARD @OBSW_ADD_ACS_BOARD@ -#define OBSW_ADD_ACS_HANDLERS @OBSW_ADD_ACS_HANDLERS@ +#define OBSW_ADD_ACS_CTRL @OBSW_ADD_ACS_CTRL@ +#define OBSW_ADD_GPS_CTRL @OBSW_ADD_GPS_CTRL@ #define OBSW_ADD_RW @OBSW_ADD_RW@ #define OBSW_ADD_RTD_DEVICES @OBSW_ADD_RTD_DEVICES@ #define OBSW_ADD_TMP_DEVICES @OBSW_ADD_TMP_DEVICES@ diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index c6f7ce51..e60c2caf 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -126,22 +126,24 @@ void initmission::initTasks() { PeriodicTaskIF* acsTask = factory->createPeriodicTask( "ACS_TASK", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc); -#if OBSW_ADD_ACS_HANDLERS == 1 +#if OBSW_ADD_GPS_CTRL == 1 result = acsTask->addComponent(objects::GPS_CONTROLLER); if (result != returnvalue::OK) { initmission::printAddObjectError("GPS_CTRL", objects::GPS_CONTROLLER); } -#endif /* OBSW_ADD_ACS_HANDLERS */ +#endif /* OBSW_ADD_GPS_CTRL */ +#if OBSW_ADD_ACS_CTRL == 1 acsTask->addComponent(objects::ACS_CONTROLLER); if (result != returnvalue::OK) { initmission::printAddObjectError("ACS_CTRL", objects::ACS_CONTROLLER); } +#endif PeriodicTaskIF* sysTask = factory->createPeriodicTask( "SYS_TASK", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc); static_cast(sysTask); -#if OBSW_ADD_ACS_HANDLERS == 1 +#if OBSW_ADD_ACS_BOARD == 1 result = sysTask->addComponent(objects::ACS_BOARD_ASS); if (result != returnvalue::OK) { initmission::printAddObjectError("ACS_BOARD_ASS", objects::ACS_BOARD_ASS); @@ -293,9 +295,7 @@ void initmission::initTasks() { strHelperTask->startTask(); #endif /* OBSW_ADD_STAR_TRACKER == 1 */ -#if OBSW_ADD_ACS_HANDLERS == 1 acsTask->startTask(); -#endif /* OBSW_ADD_ACS_HANDLERS == 1 */ sysTask->startTask(); #if OBSW_ADD_RTD_DEVICES == 1 tcsPollingTask->startTask(); diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 6627d90d..f8e604a8 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -331,7 +331,7 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI AcsBoardFdir* fdir = nullptr; static_cast(fdir); -#if OBSW_ADD_ACS_HANDLERS == 1 +#if OBSW_ADD_ACS_BOARD == 1 std::string spiDev = q7s::SPI_DEFAULT_DEV; SpiCookie* spiCookie = new SpiCookie(addresses::MGM_0_LIS3, gpioIds::MGM_0_LIS3_CS, MGMLIS3MDL::MAX_BUFFER_SIZE, From 8a6a69d23007966baa34222c27abebf5a840e0dc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 13:15:39 +0200 Subject: [PATCH 06/11] update EM code --- bsp_q7s/em/emObjectFactory.cpp | 22 ++++++++++++---------- dummies/helpers.cpp | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index ad71b8c6..fa2a0101 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -1,4 +1,5 @@ #include +#include #include "OBSWConfig.h" #include "bsp_q7s/core/CoreController.h" @@ -10,6 +11,7 @@ #include "linux/ObjectFactory.h" #include "linux/callbacks/gpioCallbacks.h" #include "mission/core/GenericFactory.h" +#include "dummies/helpers.h" void ObjectFactory::produce(void* args) { ObjectFactory::setStatics(); @@ -20,14 +22,18 @@ void ObjectFactory::produce(void* args) { UartComIF* uartComIF = nullptr; SpiComIF* spiMainComIF = nullptr; I2cComIF* i2cComIF = nullptr; - PowerSwitchIF* pwrSwitcher = nullptr; SpiComIF* spiRwComIF = nullptr; createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF, &spiRwComIF); createTmpComponents(); new CoreController(objects::CORE_CONTROLLER); gpioCallbacks::disableAllDecoder(gpioComIF); - createPcduComponents(gpioComIF, &pwrSwitcher); + PowerSwitchIF* pwrSwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0); + + // Regular FM code, does not work for EM if the hardware is not connected + // createPcduComponents(gpioComIF, &pwrSwitcher); + // createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher); + // createSyrlinksComponents(pwrSwitcher); createRadSensorComponent(gpioComIF); createSunSensorComponents(gpioComIF, spiMainComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV); @@ -36,14 +42,7 @@ void ObjectFactory::produce(void* args) { #endif createHeaterComponents(gpioComIF, pwrSwitcher, healthTable); createSolarArrayDeploymentComponents(); - createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher); -#if OBSW_ADD_SYRLINKS == 1 -#if OBSW_Q7S_EM == 1 - createSyrlinksComponents(nullptr); -#else - createSyrlinksComponents(pwrSwitcher); -#endif /* OBSW_Q7S_EM == 1 */ -#endif /* OBSW_ADD_SYRLINKS == 1 */ + createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher, spiMainComIF); createPayloadComponents(gpioComIF); @@ -69,4 +68,7 @@ void ObjectFactory::produce(void* args) { createMiscComponents(); createAcsController(); + dummy::DummyCfg dummyCfg; + dummyCfg.addCoreCtrlCfg = false; + dummy::createDummies(dummyCfg); } diff --git a/dummies/helpers.cpp b/dummies/helpers.cpp index 1c807217..c27439a6 100644 --- a/dummies/helpers.cpp +++ b/dummies/helpers.cpp @@ -19,7 +19,7 @@ using namespace dummy; -void createDummies(DummyCfg cfg) { +void dummy::createDummies(DummyCfg cfg) { new ComIFDummy(objects::DUMMY_COM_IF); ComCookieDummy* comCookieDummy = new ComCookieDummy(); new BpxDummy(objects::BPX_BATT_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); From 9ad649e43e42e5639e4ee80cc3076ca0f31ad72f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 13:40:57 +0200 Subject: [PATCH 07/11] ACS controller running in EM SW withour errors now --- bsp_hosted/ObjectFactory.cpp | 1 + bsp_q7s/em/emObjectFactory.cpp | 14 ++++--- dummies/CMakeLists.txt | 3 +- dummies/GyroAdisDummy.cpp | 2 +- dummies/GyroAdisDummy.h | 3 ++ dummies/MgmLIS3MDLDummy.h | 1 + dummies/MgmRm3100Dummy.cpp | 40 +++++++++++++++++++ dummies/MgmRm3100Dummy.h | 29 ++++++++++++++ dummies/helpers.cpp | 14 +++++-- dummies/helpers.h | 3 +- fsfw | 2 +- linux/obc/PtmeConfig.h | 2 +- mission/devices/SusHandler.h | 3 +- .../GyroADIS1650XDefinitions.h | 2 + 14 files changed, 103 insertions(+), 16 deletions(-) create mode 100644 dummies/MgmRm3100Dummy.cpp create mode 100644 dummies/MgmRm3100Dummy.h diff --git a/bsp_hosted/ObjectFactory.cpp b/bsp_hosted/ObjectFactory.cpp index 45be19f3..0701a77a 100644 --- a/bsp_hosted/ObjectFactory.cpp +++ b/bsp_hosted/ObjectFactory.cpp @@ -43,6 +43,7 @@ #include #include #include + #include "dummies/helpers.h" void Factory::setStaticFrameworkObjectIds() { diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index fa2a0101..219ed580 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -7,11 +7,11 @@ #include "busConf.h" #include "commonObjects.h" #include "devConf.h" +#include "dummies/helpers.h" #include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h" #include "linux/ObjectFactory.h" #include "linux/callbacks/gpioCallbacks.h" #include "mission/core/GenericFactory.h" -#include "dummies/helpers.h" void ObjectFactory::produce(void* args) { ObjectFactory::setStatics(); @@ -24,6 +24,13 @@ void ObjectFactory::produce(void* args) { I2cComIF* i2cComIF = nullptr; SpiComIF* spiRwComIF = nullptr; createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF, &spiRwComIF); + + // Hardware is usually not connected to EM, so we need to create dummies which replace lower + // level components. + dummy::DummyCfg dummyCfg; + dummyCfg.addCoreCtrlCfg = false; + dummy::createDummies(dummyCfg); + createTmpComponents(); new CoreController(objects::CORE_CONTROLLER); @@ -34,8 +41,8 @@ void ObjectFactory::produce(void* args) { // createPcduComponents(gpioComIF, &pwrSwitcher); // createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher); // createSyrlinksComponents(pwrSwitcher); + // createSunSensorComponents(gpioComIF, spiMainComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV); createRadSensorComponent(gpioComIF); - createSunSensorComponents(gpioComIF, spiMainComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV); #if OBSW_ADD_ACS_BOARD == 1 createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher); @@ -68,7 +75,4 @@ void ObjectFactory::produce(void* args) { createMiscComponents(); createAcsController(); - dummy::DummyCfg dummyCfg; - dummyCfg.addCoreCtrlCfg = false; - dummy::createDummies(dummyCfg); } diff --git a/dummies/CMakeLists.txt b/dummies/CMakeLists.txt index a12a0a8d..4cb05289 100644 --- a/dummies/CMakeLists.txt +++ b/dummies/CMakeLists.txt @@ -17,4 +17,5 @@ target_sources( MgmLIS3MDLDummy.cpp PlPcduDummy.cpp CoreControllerDummy.cpp - helpers.cpp) + helpers.cpp + MgmRm3100Dummy.cpp) diff --git a/dummies/GyroAdisDummy.cpp b/dummies/GyroAdisDummy.cpp index de4e7f91..42af6412 100644 --- a/dummies/GyroAdisDummy.cpp +++ b/dummies/GyroAdisDummy.cpp @@ -3,7 +3,7 @@ #include "mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h" GyroAdisDummy::GyroAdisDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) - : DeviceHandlerBase(objectId, comif, comCookie) {} + : DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {} GyroAdisDummy::~GyroAdisDummy() {} diff --git a/dummies/GyroAdisDummy.h b/dummies/GyroAdisDummy.h index 89f7c06e..b3aad620 100644 --- a/dummies/GyroAdisDummy.h +++ b/dummies/GyroAdisDummy.h @@ -3,6 +3,8 @@ #include +#include "mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h" + class GyroAdisDummy : public DeviceHandlerBase { public: static const DeviceCommandId_t SIMPLE_COMMAND = 1; @@ -15,6 +17,7 @@ class GyroAdisDummy : public DeviceHandlerBase { virtual ~GyroAdisDummy(); protected: + AdisGyroPrimaryDataset dataset; void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; diff --git a/dummies/MgmLIS3MDLDummy.h b/dummies/MgmLIS3MDLDummy.h index bd18cb25..f63ed578 100644 --- a/dummies/MgmLIS3MDLDummy.h +++ b/dummies/MgmLIS3MDLDummy.h @@ -2,6 +2,7 @@ #define DUMMIES_MGMLIS3MDLDUMMY_H_ #include + #include "fsfw_hal/devicehandlers/devicedefinitions/MgmLIS3HandlerDefs.h" class MgmLIS3MDLDummy : public DeviceHandlerBase { diff --git a/dummies/MgmRm3100Dummy.cpp b/dummies/MgmRm3100Dummy.cpp new file mode 100644 index 00000000..ad97e7be --- /dev/null +++ b/dummies/MgmRm3100Dummy.cpp @@ -0,0 +1,40 @@ +#include "MgmRm3100Dummy.h" + +using namespace returnvalue; + +MgmRm3100Dummy::MgmRm3100Dummy(object_id_t objectId, object_id_t comif, CookieIF* comCookie) + : DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {} + +MgmRm3100Dummy::~MgmRm3100Dummy() = default; + +void MgmRm3100Dummy::doStartUp() {} + +void MgmRm3100Dummy::doShutDown() {} + +ReturnValue_t MgmRm3100Dummy::buildNormalDeviceCommand(DeviceCommandId_t* id) { return OK; } + +ReturnValue_t MgmRm3100Dummy::buildTransitionDeviceCommand(DeviceCommandId_t* id) { return OK; } + +ReturnValue_t MgmRm3100Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand, + const uint8_t* commandData, + size_t commandDataLen) { + return OK; +} + +ReturnValue_t MgmRm3100Dummy::scanForReply(const uint8_t* start, size_t len, + DeviceCommandId_t* foundId, size_t* foundLen) { + return OK; +} + +ReturnValue_t MgmRm3100Dummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { + return OK; +} + +void MgmRm3100Dummy::fillCommandAndReplyMap() {} + +uint32_t MgmRm3100Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 0; } + +ReturnValue_t MgmRm3100Dummy::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, + LocalDataPoolManager& poolManager) { + return OK; +} diff --git a/dummies/MgmRm3100Dummy.h b/dummies/MgmRm3100Dummy.h new file mode 100644 index 00000000..857e6f69 --- /dev/null +++ b/dummies/MgmRm3100Dummy.h @@ -0,0 +1,29 @@ +#ifndef DUMMIES_MGMRM3100DUMMY_H_ +#define DUMMIES_MGMRM3100DUMMY_H_ + +#include "fsfw/devicehandlers/DeviceHandlerBase.h" +#include "fsfw_hal/devicehandlers/devicedefinitions/MgmRM3100HandlerDefs.h" + +class MgmRm3100Dummy : public DeviceHandlerBase { + public: + MgmRm3100Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie); + virtual ~MgmRm3100Dummy(); + + protected: + RM3100::Rm3100PrimaryDataset dataset; + void doStartUp() override; + void doShutDown() override; + ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; + ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t *id) override; + ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t *commandData, + size_t commandDataLen) override; + ReturnValue_t scanForReply(const uint8_t *start, size_t len, DeviceCommandId_t *foundId, + size_t *foundLen) override; + ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override; + void fillCommandAndReplyMap() override; + uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; + ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, + LocalDataPoolManager &poolManager) override; +}; + +#endif /* DUMMIES_MGMRM3100DUMMY_H_ */ diff --git a/dummies/helpers.cpp b/dummies/helpers.cpp index c27439a6..46cf207d 100644 --- a/dummies/helpers.cpp +++ b/dummies/helpers.cpp @@ -9,21 +9,22 @@ #include #include #include +#include #include #include #include #include #include +#include #include - using namespace dummy; void dummy::createDummies(DummyCfg cfg) { new ComIFDummy(objects::DUMMY_COM_IF); ComCookieDummy* comCookieDummy = new ComCookieDummy(); new BpxDummy(objects::BPX_BATT_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - if(cfg.addCoreCtrlCfg) { + if (cfg.addCoreCtrlCfg) { new CoreControllerDummy(objects::CORE_CONTROLLER); } @@ -34,21 +35,26 @@ void dummy::createDummies(DummyCfg cfg) { new StarTrackerDummy(objects::STAR_TRACKER, objects::DUMMY_COM_IF, comCookieDummy); new SyrlinksDummy(objects::SYRLINKS_HK_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new ImtqDummy(objects::IMTQ_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); - if(cfg.addPowerDummies) { + if (cfg.addPowerDummies) { new AcuDummy(objects::ACU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new PduDummy(objects::PDU1_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new PduDummy(objects::PDU2_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new P60DockDummy(objects::P60DOCK_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); } - if(cfg.addAcsBoardDummies) { + if (cfg.addAcsBoardDummies) { new GyroAdisDummy(objects::GYRO_0_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new GyroL3GD20Dummy(objects::GYRO_1_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new GyroAdisDummy(objects::GYRO_2_ADIS_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new GyroL3GD20Dummy(objects::GYRO_3_L3G_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new MgmLIS3MDLDummy(objects::MGM_0_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); new MgmLIS3MDLDummy(objects::MGM_2_LIS3_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new MgmRm3100Dummy(objects::MGM_1_RM3100_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); + new MgmRm3100Dummy(objects::MGM_3_RM3100_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); } + if (cfg.addSusDummies) { + new SusDummy(); + } new PlPcduDummy(objects::PLPCDU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); } diff --git a/dummies/helpers.h b/dummies/helpers.h index d19b3882..dfda7d81 100644 --- a/dummies/helpers.h +++ b/dummies/helpers.h @@ -6,8 +6,9 @@ struct DummyCfg { bool addCoreCtrlCfg = true; bool addPowerDummies = true; bool addAcsBoardDummies = true; + bool addSusDummies = true; }; void createDummies(DummyCfg cfg); -} +} // namespace dummy diff --git a/fsfw b/fsfw index cf8fe7ea..7e0a5d5a 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit cf8fe7ea728bea077b9936bcf0db96845bc6419e +Subproject commit 7e0a5d5a9e4f38c6d818bbdd5b44d34d8007eb1e diff --git a/linux/obc/PtmeConfig.h b/linux/obc/PtmeConfig.h index aa5c663a..9c5a85af 100644 --- a/linux/obc/PtmeConfig.h +++ b/linux/obc/PtmeConfig.h @@ -4,8 +4,8 @@ #include "AxiPtmeConfig.h" #include "fsfw/objectmanager/SystemObject.h" #include "fsfw/returnvalues/returnvalue.h" -#include "returnvalues/classIds.h" #include "linux/obc/PtmeConfig.h" +#include "returnvalues/classIds.h" /** * @brief Class to configure donwlink specific parameters in the PTME IP core. diff --git a/mission/devices/SusHandler.h b/mission/devices/SusHandler.h index 94673c40..5645c47d 100644 --- a/mission/devices/SusHandler.h +++ b/mission/devices/SusHandler.h @@ -4,10 +4,9 @@ #include #include "devicedefinitions/SusDefinitions.h" +#include "events/subsystemIdRanges.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" #include "mission/devices/max1227.h" - -#include "events/subsystemIdRanges.h" #include "returnvalues/classIds.h" /** diff --git a/mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h b/mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h index a09d2fb7..5932b756 100644 --- a/mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h +++ b/mission/devices/devicedefinitions/GyroADIS1650XDefinitions.h @@ -113,6 +113,8 @@ class AdisGyroPrimaryDataset : public StaticLocalDataSet<8> { private: friend class GyroADIS1650XHandler; + friend class GyroAdisDummy; + /** Constructor for the data creator */ AdisGyroPrimaryDataset(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, ADIS1650X::ADIS_DATASET_ID) {} From 2e03cfa1164e166fc73896ca6bf57aad11830ee6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 15 Sep 2022 13:44:54 +0200 Subject: [PATCH 08/11] small update for .cproject file --- misc/eclipse/.cproject | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/eclipse/.cproject b/misc/eclipse/.cproject index a4df0648..83a78c5f 100644 --- a/misc/eclipse/.cproject +++ b/misc/eclipse/.cproject @@ -1317,7 +1317,7 @@ - + From 54f73661fc4ebca11c1d7321d889370ea9ac329f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 16 Sep 2022 14:01:54 +0200 Subject: [PATCH 09/11] fix init error --- CMakeLists.txt | 3 +++ bsp_q7s/OBSWConfig.h.in | 1 + bsp_q7s/core/InitMission.cpp | 8 +++++--- bsp_q7s/em/emObjectFactory.cpp | 5 ++--- dummies/helpers.cpp | 9 ++++++++- dummies/helpers.h | 2 ++ 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03c1eece..c5f3d1bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,6 +98,9 @@ set(OBSW_ADD_ACS_BOARD set(OBSW_ADD_GPS_CTRL ${INIT_VAL} CACHE STRING "Add GPS controllers") +set(OBSW_ADD_TCS_CTRL + ${INIT_VAL} + CACHE STRING "Add TCS controllers") set(OBSW_ADD_ACS_CTRL ${INIT_VAL} CACHE STRING "Add ACS controller") diff --git a/bsp_q7s/OBSWConfig.h.in b/bsp_q7s/OBSWConfig.h.in index c20db3f1..9ff67209 100644 --- a/bsp_q7s/OBSWConfig.h.in +++ b/bsp_q7s/OBSWConfig.h.in @@ -32,6 +32,7 @@ #define OBSW_ADD_ACS_BOARD @OBSW_ADD_ACS_BOARD@ #define OBSW_ADD_ACS_CTRL @OBSW_ADD_ACS_CTRL@ #define OBSW_ADD_GPS_CTRL @OBSW_ADD_GPS_CTRL@ +#define OBSW_ADD_TCS_CTRL @OBSW_ADD_TCS_CTRL@ #define OBSW_ADD_RW @OBSW_ADD_RW@ #define OBSW_ADD_RTD_DEVICES @OBSW_ADD_RTD_DEVICES@ #define OBSW_ADD_TMP_DEVICES @OBSW_ADD_TMP_DEVICES@ diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index e60c2caf..5116e808 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -189,8 +189,7 @@ void initmission::initTasks() { objects::RTD_14_IC17_TCS_BOARD, objects::RTD_15_IC18_IMTQ, }; - tcsTask->addComponent(objects::TCS_BOARD_ASS); - tcsTask->addComponent(objects::THERMAL_CONTROLLER); + for (const auto& rtd : rtdIds) { tcsTask->addComponent(rtd, DeviceHandlerIF::PERFORM_OPERATION); tcsTask->addComponent(rtd, DeviceHandlerIF::SEND_WRITE); @@ -198,8 +197,11 @@ void initmission::initTasks() { tcsTask->addComponent(rtd, DeviceHandlerIF::SEND_READ); tcsTask->addComponent(rtd, DeviceHandlerIF::GET_READ); } + tcsTask->addComponent(objects::TCS_BOARD_ASS); #endif /* OBSW_ADD_RTD_DEVICES */ - +#if OBSW_ADD_TCS_CTRL == 1 + tcsTask->addComponent(objects::THERMAL_CONTROLLER); +#endif // FS task, task interval does not matter because it runs in permanent loop, priority low // because it is a non-essential background task PeriodicTaskIF* fsTask = factory->createPeriodicTask( diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index 219ed580..780b6b13 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -31,7 +31,6 @@ void ObjectFactory::produce(void* args) { dummyCfg.addCoreCtrlCfg = false; dummy::createDummies(dummyCfg); - createTmpComponents(); new CoreController(objects::CORE_CONTROLLER); gpioCallbacks::disableAllDecoder(gpioComIF); @@ -42,6 +41,8 @@ void ObjectFactory::produce(void* args) { // createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher); // createSyrlinksComponents(pwrSwitcher); // createSunSensorComponents(gpioComIF, spiMainComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV); + // createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher, spiMainComIF); + // createTmpComponents(); createRadSensorComponent(gpioComIF); #if OBSW_ADD_ACS_BOARD == 1 @@ -49,8 +50,6 @@ void ObjectFactory::produce(void* args) { #endif createHeaterComponents(gpioComIF, pwrSwitcher, healthTable); createSolarArrayDeploymentComponents(); - - createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher, spiMainComIF); createPayloadComponents(gpioComIF); #if OBSW_ADD_MGT == 1 diff --git a/dummies/helpers.cpp b/dummies/helpers.cpp index 46cf207d..8eb73250 100644 --- a/dummies/helpers.cpp +++ b/dummies/helpers.cpp @@ -17,6 +17,7 @@ #include #include #include +#include using namespace dummy; @@ -27,7 +28,9 @@ void dummy::createDummies(DummyCfg cfg) { if (cfg.addCoreCtrlCfg) { new CoreControllerDummy(objects::CORE_CONTROLLER); } - + if (cfg.addRtdComIFDummy) { + new ComIFDummy(objects::SPI_RTD_COM_IF); + } new RwDummy(objects::RW1, objects::DUMMY_COM_IF, comCookieDummy); new RwDummy(objects::RW2, objects::DUMMY_COM_IF, comCookieDummy); new RwDummy(objects::RW3, objects::DUMMY_COM_IF, comCookieDummy); @@ -56,5 +59,9 @@ void dummy::createDummies(DummyCfg cfg) { if (cfg.addSusDummies) { new SusDummy(); } + + if (cfg.addTempSensorDummies) { + new TemperatureSensorsDummy(); + } new PlPcduDummy(objects::PLPCDU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); } diff --git a/dummies/helpers.h b/dummies/helpers.h index dfda7d81..680f97c1 100644 --- a/dummies/helpers.h +++ b/dummies/helpers.h @@ -7,6 +7,8 @@ struct DummyCfg { bool addPowerDummies = true; bool addAcsBoardDummies = true; bool addSusDummies = true; + bool addTempSensorDummies = true; + bool addRtdComIFDummy = true; }; void createDummies(DummyCfg cfg); From 2f183474306c8eea54a5e2b8c96598048a6f1b6a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 16 Sep 2022 15:12:32 +0200 Subject: [PATCH 10/11] move object ID definition --- common/config/commonObjects.h | 3 +++ linux/fsfwconfig/objects/systemObjectList.h | 1 - linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/common/config/commonObjects.h b/common/config/commonObjects.h index e0efbce7..6389046b 100644 --- a/common/config/commonObjects.h +++ b/common/config/commonObjects.h @@ -107,6 +107,9 @@ enum commonObjects : uint32_t { SYRLINKS_HK_HANDLER = 0x445300A3, + /* 0x49 ('I') for Communication Interfaces */ + SPI_RTD_COM_IF = 0x49020006, + // 0x60 for other stuff HEATER_0_PLOC_PROC_BRD = 0x60000000, HEATER_1_PCDU_BRD = 0x60000001, diff --git a/linux/fsfwconfig/objects/systemObjectList.h b/linux/fsfwconfig/objects/systemObjectList.h index 669fcc9f..4b49ce82 100644 --- a/linux/fsfwconfig/objects/systemObjectList.h +++ b/linux/fsfwconfig/objects/systemObjectList.h @@ -50,7 +50,6 @@ enum sourceObjects : uint32_t { SPI_MAIN_COM_IF = 0x49020004, GPIO_IF = 0x49010005, SPI_RW_COM_IF = 0x49020005, - SPI_RTD_COM_IF = 0x49020006, /* 0x54 ('T') for test handlers */ TEST_TASK = 0x54694269, diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 2535a10e..e11632c8 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -370,7 +370,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::RAD_SENSOR, length * 0.8, DeviceHandlerIF::GET_READ); #endif -#if OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 +#if OBSW_ADD_ACS_BOARD == 1 bool enableAside = true; bool enableBside = true; if (enableAside) { @@ -436,7 +436,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); } -#endif /* OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 */ +#endif /* OBSW_ADD_ACS_BOARD == 1 */ return thisSequence->checkSequence(); } From f4cceeb21e5fe6bca7f05e41b308710844ab23b4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 10 Oct 2022 10:26:26 +0200 Subject: [PATCH 11/11] fix one merge conflict --- bsp_hosted/ObjectFactory.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bsp_hosted/ObjectFactory.cpp b/bsp_hosted/ObjectFactory.cpp index a9c46ec5..ef5d3c98 100644 --- a/bsp_hosted/ObjectFactory.cpp +++ b/bsp_hosted/ObjectFactory.cpp @@ -43,12 +43,8 @@ #include #include #include - -<<<<<<< HEAD #include "dummies/helpers.h" -======= #include "mission/utility/GlobalConfigHandler.h" ->>>>>>> origin/develop void Factory::setStaticFrameworkObjectIds() { PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_PACKET_DISTRIBUTOR;