diff --git a/.gitmodules b/.gitmodules
index d309e0f5..a00cea25 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -19,3 +19,6 @@
[submodule "thirdparty/json"]
path = thirdparty/json
url = https://github.com/nlohmann/json.git
+[submodule "thirdparty/rapidcsv"]
+ path = thirdparty/rapidcsv
+ url = https://github.com/d99kris/rapidcsv.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c7fce0a5..9a0672aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,24 @@ list yields a list of all related PRs for each release.
# [v1.12.0]
+## Added
+
+- Adds `HealthIF` to heaters. Heaters are own system object with queues now which allows to set them faulty.
+- Some simplifications for `HeaterHandler`, use `std::vector` instead of `std::unordered_map` for primary container. Using the heater indexes 0 to 7 allows to use natural array indexing
+- Some additional input sanity checks in `executeAction`
+- `RwAssembly` added to system components. Assembly works in principle,
+ issues making 4 consecutives RWs communicate at once..
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/224
+- Adds a yocto helper script which is able to install the release build binaries
+ (OBSW and Watchdog) into the `q7s-yocto` repository as long as the `q7s-package`
+ or `q7s-yocto` repo was cloned in the same directory the EIVE OBSW repo.
+ This makes updating the root filesystem a lot easier. It also creates and installs a
+ version file.
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/248
+- Create the generic image by default for the Q7S build. The unique binary with the
+ username appended at the end is created as a side-product now
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/248
+
## Changed
- Build unittest as default side product of hosted builds
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c96070b3..2443ec69 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -275,11 +275,8 @@ add_library(${LIB_EIVE_MISSION})
# Add main executable
add_executable(${OBSW_NAME})
-if(EIVE_CREATE_UNIQUE_OBSW_BIN)
- set(OBSW_BIN_NAME ${CMAKE_PROJECT_NAME}-$ENV{USERNAME})
-else()
- set(OBSW_BIN_NAME ${CMAKE_PROJECT_NAME})
-endif()
+set(OBSW_BIN_NAME ${CMAKE_PROJECT_NAME})
+
set_target_properties(${OBSW_NAME} PROPERTIES OUTPUT_NAME ${OBSW_BIN_NAME})
# Watchdog
@@ -311,6 +308,8 @@ if(EIVE_ADD_JSON_LIB)
add_subdirectory(${LIB_JSON_PATH})
endif()
+add_subdirectory(thirdparty/rapidcsv)
+
if(EIVE_ADD_LINUX_FILES)
add_subdirectory(${LIB_ARCSEC_PATH})
add_subdirectory(${LINUX_PATH})
@@ -409,6 +408,7 @@ endif()
target_link_libraries(${UNITTEST_NAME} PRIVATE
Catch2
${LIB_EIVE_MISSION}
+ rapidcsv
)
if(TGT_BSP MATCHES "arm/egse")
diff --git a/README.md b/README.md
index 97fe4056..fcff24d0 100644
--- a/README.md
+++ b/README.md
@@ -70,8 +70,9 @@ prerequisites.
## Building the OBSW and flashing it on the Q7S
1. ARM cross-compiler installed, either as part of [Vivado 2018.2 installation](#vivado) or
- as a [separate download](#arm-toolchain)
-2. [Q7S sysroot](#sysroot) on local development machine
+ as a [separate download](#arm-toolchain). The Xiphos SDK also installs a cross-compiler,
+ but its version is currently too old to compile the OBSW (7.3.0).
+2. [Q7S sysroot](#sysroot) on local development machine. It is installed by the Xiphos SDK
3. Recommended: Eclipse or [Vivado 2018.2 SDK](#vivado) for OBSW development
3. [TCF agent](https://wiki.eclipse.org/TCF) running on Q7S
@@ -88,7 +89,7 @@ When using Windows, run theses steps in MSYS2.
1. Clone the repository with
```sh
- git clone https://egit.irs.uni-stuttgart.de/eive/eive_obsw.git
+ git clone https://egit.irs.uni-stuttgart.de/eive/eive-obsw.git
```
2. Update all the submodules
@@ -143,7 +144,7 @@ When using Windows, run theses steps in MSYS2.
There are also different values for `-DTGT_BSP` to build for the Raspberry Pi
or the Beagle Bone Black: `arm/raspberrypi` and `arm/beagleboneblack`.
-
+
5. Build the software with
```sh
@@ -151,6 +152,53 @@ When using Windows, run theses steps in MSYS2.
cmake --build . -j
```
+## Build for the Q7S target root filesystem with `yocto`
+
+The EIVE root filesystem will contain the EIVE OBSW and the Watchdog component.
+It is currently generated with `yocto`, but the tool can not compile the primary
+OBSW due to toolchain version incompatibility. Therefore, the OBSW components
+are currently compiled using the toolchain specified in this README (e.g. installed by Vivado).
+
+However, it is still possible to install the two components using yocto. A few helper files were
+provided to make this process easier. The following steps can be used to install the OBSW
+components and a version file to the yocto sources for the generation of the complete EIVE root
+file system image. The steps here are shown for Ubuntu, you can use the according Windows
+helper scripts as well.
+
+1. Copy the `q7s-env.sh` script to the same layer as the `eive-obsw`.
+
+ ```sh
+ cp scripts/q7s-env.sh ..
+ cd ..
+ ./q7s-env.sh
+ q7s-make-release.sh
+ ```
+
+2. Compile the OBSW components in release mode
+
+ ```sh
+ cd cmake-build-release-q7s
+ cmake --build . -j
+ ```
+
+3. Make sure the [`q7s-yocto`](https://egit.irs.uni-stuttgart.de/eive/q7s-yocto)
+ repository or the [`q7s-package`](https://egit.irs.uni-stuttgart.de/eive/q7s-package.git)
+ repository and its `q7s-yocto` submodule were cloned in the same directory layer as
+ the `eive-obsw`.
+
+4. Run the install script to install the files into `q7s-yocto`.
+
+ ```sh
+ install-obsw-yocto.sh
+ ```
+
+5. Navigate into the `q7s-yocto` repo and review the changes. You can then add and push those
+ changes.
+
+6. You can now rebuild the root filesystem with the updated OBSW using `yocto`. This probably needs
+ to be done on another machine or in a VM. The [`q7s-yocto`](https://egit.irs.uni-stuttgart.de/eive/q7s-yocto)
+ repository contains details on how to best do this.
+
## Building in Xilinx SDK 2018.2
1. Open Xilinx SDK 2018.2
@@ -326,7 +374,7 @@ If you are comiling for the Raspberry Pi, you have to set the `LINUX_ROOTFS` env
variable instead. You can find a base root filesystem for the Raspberry Pi
[here](https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/Software/rootfs).
-## Installing Vivado the the Xilinx development tools
+## Installing Vivado and the Xilinx development tools
It's also possible to perform debugging with a normal Eclipse installation by installing
the TCF plugin and downloading the cross-compiler as specified in the section below. However,
@@ -342,9 +390,9 @@ installed Vivado with the SDK core tools.
-
+
-
+
* For supported OS refer to https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_2/ug973-vivado-release-notes-install-license.pdf .
Installation was tested on Windows and Ubuntu 21.04.
@@ -661,35 +709,7 @@ Thus the replies are received with a larger delay compared to a direct TCP conne
3. Make sure the netmask of the ehternet interface of the workstation matches the netmask of the Q7S
* When IP address is set to 192.168.133.10 and the netmask is 255.255.255.0, an example IP address for the workstation
is 192.168.133.2
-
-4. Run tcf-agent on Q7S
-
- * Tcf-agent is not yet integrated in the rootfs of the Q7S. Therefore build tcf-agent manually
-
- ```sh
- git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git
- cd org.eclipse.tcf.agent/agent
- make CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld MACHINE=arm NO_SSL=1 NO_UUID=1
- ```
-
- * Transfer executable agent from org.eclipse.tcf.agent/agent/obj/GNU/Linux/arm/Debug to /tmp of Q7S
-
- ```sh
- cd obj/GNU/Linux/arm/Debug
- scp agent root@192.168.133.10:/tmp
- ```
-
- * On Q7S
- ```sh
- cd /tmp
- chmod +x agent
- ```
-
- * Run agent
- ```sh
- ./agent
- ```
-
+4. Make sure th `tcf-agent` is running by checking `systemctl status tcf-agent`
5. In Xilinx SDK 2018.2 right click on project → Debug As → Debug Configurations
6. Right click Xilinx C/C++ applicaton (System Debugger) → New →
7. Set Debug Type to Linux Application Debug and Connectin to Linux Agent
@@ -699,8 +719,8 @@ Thus the replies are received with a larger delay compared to a direct TCP conne
11. Test connection (This ensures the TCF Agent is running on the Q7S)
12. Select Application tab
* Project Name: eive_obsw
- * Local File Path: Path to eiveobsw-linux.elf (in `_bin\linux\devel`)
- * Remote File Path: `/tmp/eive_obsw.elf`
+ * Local File Path: Path to OBSW application image with debug symbols (non-stripped)
+ * Remote File Path: `/tmp/`
# Transfering Files to the Q7S
@@ -726,7 +746,8 @@ From a windows machine files can be copied with putty tools (note: use IPv4 addr
pscp -scp -P 22 eive@192.168.199.227:/example-file
````
-More detailed information about the used q7s commands can be found in the Q7S user manual.
+A helper script named `q7s-cp.py` can be used together with the `q7s-port.sh`
+script to make this process easier.
# Q7S OBC
@@ -1106,16 +1127,28 @@ Eclipse indexer.
The [TCF agent](https://wiki.eclipse.org/TCF) can be used to perform remote debugging on the Q7S.
-1. Install the TCF agent plugin in Eclipse from
+1. Copy the `.cproject` file and the `.project` file inside the `misc/eclipse` folder into the
+ repo root
+
+ ```sh
+ cd eive-obsw
+ cp misc/eclipse/.cproject .
+ cp misc/eclipse/.project .
+ ```
+
+2. Open the repo in Eclipse as a folder.
+
+3. Install the TCF agent plugin in Eclipse from
the [releases](https://www.eclipse.org/tcf/downloads.php). Go to
Help → Install New Software and use the download page, for
- example https://download.eclipse.org/tools/tcf/releases/1.7/1.7.0/ to search for the plugin and install it. You can find the newest version [here](https://www.eclipse.org/tcf/downloads.php)
+ example https://download.eclipse.org/tools/tcf/releases/1.7/1.7.0/ to search for the plugin and
+ install it. You can find the newest version [here](https://www.eclipse.org/tcf/downloads.php)
-2. Go to Window → Perspective → Open Perspective and open the **Target Explorer Perspective**.
+4. Go to Window → Perspective → Open Perspective and open the **Target Explorer Perspective**.
Here, the Q7S should show up if the local port forwarding was set up as explained previously.
Please note that you have to connect to `localhost` and port `1534` with port forwaring set up.
-3. A launch configuration was provided, but it might be necessary to adapt it for your own needs.
+5. A launch configuration was provided, but it might be necessary to adapt it for your own needs.
Alternatively:
- Create a new **TCF Remote Application** by pressing the cogs button at the top or going to
diff --git a/bsp_hosted/InitMission.cpp b/bsp_hosted/InitMission.cpp
index 0ca59db5..359dc2df 100644
--- a/bsp_hosted/InitMission.cpp
+++ b/bsp_hosted/InitMission.cpp
@@ -131,6 +131,7 @@ void initmission::initTasks() {
PeriodicTaskIF* testTask = factory->createPeriodicTask(
"TEST_TASK", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc);
+ static_cast(testTask);
#if OBSW_ADD_TEST_CODE == 1
result = testTask->addComponent(objects::TEST_TASK);
if (result != HasReturnvaluesIF::RETURN_OK) {
diff --git a/bsp_q7s/CMakeLists.txt b/bsp_q7s/CMakeLists.txt
index 34ee8e2a..cf3425c9 100644
--- a/bsp_q7s/CMakeLists.txt
+++ b/bsp_q7s/CMakeLists.txt
@@ -25,7 +25,9 @@ add_subdirectory(core)
if(EIVE_Q7S_EM)
add_subdirectory(em)
else()
- add_subdirectory(fm)
+ target_sources(${OBSW_NAME} PUBLIC
+ fmObjectFactory.cpp
+ )
endif()
add_subdirectory(memory)
diff --git a/bsp_q7s/boardconfig/etl_profile.h b/bsp_q7s/boardconfig/etl_profile.h
index 54aca344..86534d14 100644
--- a/bsp_q7s/boardconfig/etl_profile.h
+++ b/bsp_q7s/boardconfig/etl_profile.h
@@ -34,5 +34,6 @@ SOFTWARE.
#define ETL_CPP11_SUPPORTED 1
#define ETL_NO_NULLPTR_SUPPORT 0
+#define ETL_HAS_ERROR_ON_STRING_TRUNCATION 1
#endif
diff --git a/bsp_q7s/callbacks/q7sGpioCallbacks.cpp b/bsp_q7s/callbacks/q7sGpioCallbacks.cpp
index 6db5aed4..cf222b03 100644
--- a/bsp_q7s/callbacks/q7sGpioCallbacks.cpp
+++ b/bsp_q7s/callbacks/q7sGpioCallbacks.cpp
@@ -48,7 +48,7 @@ void q7s::gpioCallbacks::initSpiCsDecoder(GpioIF* gpioComIF) {
result = gpioComIF->addGpios(spiMuxGpios);
if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "initSpiCsDecoder: Failed to add mux bit gpios to gpioComIF" << std::endl;
+ sif::error << "initSpiCsDecoder: Failed to add SPI MUX bit GPIOs" << std::endl;
return;
}
}
diff --git a/bsp_q7s/callbacks/rwSpiCallback.cpp b/bsp_q7s/callbacks/rwSpiCallback.cpp
index 3ca3c181..b65224e5 100644
--- a/bsp_q7s/callbacks/rwSpiCallback.cpp
+++ b/bsp_q7s/callbacks/rwSpiCallback.cpp
@@ -1,5 +1,7 @@
#include "rwSpiCallback.h"
+#include
+
#include "devices/gpioIds.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
#include "fsfw_hal/linux/UnixFileGuard.h"
@@ -8,8 +10,25 @@
namespace rwSpiCallback {
+namespace {
+static bool MODE_SET = false;
+
+ReturnValue_t openSpi(const std::string& devname, int flags, GpioIF* gpioIF, gpioId_t gpioId,
+ MutexIF* mutex, MutexIF::TimeoutType timeoutType, uint32_t timeoutMs,
+ int& fd);
+/**
+ * @brief This function closes a spi session. Pulls the chip select to high an releases the
+ * mutex.
+ * @param gpioId Gpio ID of chip select
+ * @param gpioIF Pointer to gpio interface to drive the chip select
+ * @param mutex The spi mutex
+ */
+void closeSpi(int fd, gpioId_t gpioId, GpioIF* gpioIF, MutexIF* mutex);
+} // namespace
+
ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sendData,
size_t sendLen, void* args) {
+ // Stopwatch watch;
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
RwHandler* handler = reinterpret_cast(args);
@@ -18,7 +37,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
return HasReturnvaluesIF::RETURN_FAILED;
}
- uint8_t writeBuffer[2];
+ uint8_t writeBuffer[2] = {};
uint8_t writeSize = 0;
gpioId_t gpioId = cookie->getChipSelectPin();
@@ -32,37 +51,30 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
}
int fileDescriptor = 0;
- std::string device = cookie->getSpiDevice();
- UnixFileGuard fileHelper(device, &fileDescriptor, O_RDWR, "rwSpiCallback::spiCallback");
- if (fileHelper.getOpenResult() != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "rwSpiCallback::spiCallback: Failed to open device file" << std::endl;
- return SpiComIF::OPENING_FILE_FAILED;
- }
- spi::SpiModes spiMode = spi::SpiModes::MODE_0;
- uint32_t spiSpeed = 0;
- cookie->getSpiParameters(spiMode, spiSpeed, nullptr);
- comIf->setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed);
-
- result = mutex->lockMutex(timeoutType, timeoutMs);
+ const std::string& dev = comIf->getSpiDev();
+ result = openSpi(dev, O_RDWR, gpioIF, gpioId, mutex, timeoutType, timeoutMs, fileDescriptor);
if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::debug << "rwSpiCallback::spiCallback: Failed to lock mutex" << std::endl;
return result;
}
- /** Sending frame start sign */
- writeBuffer[0] = 0x7E;
- writeSize = 1;
-
- // Pull SPI CS low. For now, no support for active high given
- if (gpioId != gpio::NO_GPIO) {
- if (gpioIF->pullLow(gpioId) != HasReturnvaluesIF::RETURN_OK) {
- sif::error << "rwSpiCallback::spiCallback: Failed to pull chip select low" << std::endl;
- }
+ spi::SpiModes spiMode = spi::SpiModes::MODE_0;
+ uint32_t spiSpeed = 0;
+ cookie->getSpiParameters(spiMode, spiSpeed, nullptr);
+ // We are in protected section, so we can use the static variable here without issues.
+ // We don't need to set the speed because a SPI core is used, but the mode has to be set once
+ // correctly for all RWs
+ if (not MODE_SET) {
+ comIf->setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed);
+ MODE_SET = true;
}
+ /** Sending frame start sign */
+ writeBuffer[0] = FLAG_BYTE;
+ writeSize = 1;
+
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast(writeSize)) {
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return RwHandler::SPI_WRITE_FAILURE;
}
@@ -87,33 +99,39 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
}
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast(writeSize)) {
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return RwHandler::SPI_WRITE_FAILURE;
}
idx++;
}
/** Sending frame end sign */
- writeBuffer[0] = 0x7E;
+ writeBuffer[0] = FLAG_BYTE;
writeSize = 1;
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast(writeSize)) {
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return RwHandler::SPI_WRITE_FAILURE;
}
uint8_t* rxBuf = nullptr;
result = comIf->getReadBuffer(cookie->getSpiAddress(), &rxBuf);
if (result != HasReturnvaluesIF::RETURN_OK) {
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return result;
}
size_t replyBufferSize = cookie->getMaxBufferSize();
- /** There must be a delay of at least 20 ms after sending the command */
+ // There must be a delay of at least 20 ms after sending the command.
+ // Delay for 70 ms here and release the SPI bus for that duration.
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
usleep(RwDefinitions::SPI_REPLY_DELAY);
+ result = openSpi(dev, O_RDWR, gpioIF, gpioId, mutex, timeoutType, timeoutMs, fileDescriptor);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ return result;
+ }
/**
* The reaction wheel responds with empty frames while preparing the reply data.
@@ -123,13 +141,13 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
for (int idx = 0; idx < 10; idx++) {
if (read(fileDescriptor, &byteRead, 1) != 1) {
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return RwHandler::SPI_READ_FAILURE;
}
if (idx == 0) {
if (byteRead != FLAG_BYTE) {
sif::error << "Invalid data, expected start marker" << std::endl;
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return RwHandler::NO_START_MARKER;
}
}
@@ -140,7 +158,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
if (idx == 9) {
sif::error << "rwSpiCallback::spiCallback: Empty frame timeout" << std::endl;
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return RwHandler::NO_REPLY;
}
}
@@ -180,7 +198,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
continue;
} else {
sif::error << "rwSpiCallback::spiCallback: Invalid substitute" << std::endl;
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
result = RwHandler::INVALID_SUBSTITUTE;
break;
}
@@ -201,8 +219,9 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
result = RwHandler::SPI_READ_FAILURE;
break;
}
- if (byteRead != 0x7E) {
- sif::error << "rwSpiCallback::spiCallback: Missing end sign 0x7E" << std::endl;
+ if (byteRead != FLAG_BYTE) {
+ sif::error << "rwSpiCallback::spiCallback: Missing end sign " << static_cast(FLAG_BYTE)
+ << std::endl;
decodedFrameLen--;
result = RwHandler::MISSING_END_SIGN;
break;
@@ -213,12 +232,40 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
cookie->setTransferSize(decodedFrameLen);
- closeSpi(gpioId, gpioIF, mutex);
+ closeSpi(fileDescriptor, gpioId, gpioIF, mutex);
return result;
}
-void closeSpi(gpioId_t gpioId, GpioIF* gpioIF, MutexIF* mutex) {
+namespace {
+
+ReturnValue_t openSpi(const std::string& devname, int flags, GpioIF* gpioIF, gpioId_t gpioId,
+ MutexIF* mutex, MutexIF::TimeoutType timeoutType, uint32_t timeoutMs,
+ int& fd) {
+ ReturnValue_t result = mutex->lockMutex(timeoutType, timeoutMs);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::debug << "rwSpiCallback::spiCallback: Failed to lock mutex" << std::endl;
+ return result;
+ }
+
+ fd = open(devname.c_str(), flags);
+ if (fd < 0) {
+ sif::error << "rwSpiCallback::spiCallback: Failed to open device file" << std::endl;
+ return SpiComIF::OPENING_FILE_FAILED;
+ }
+
+ // Pull SPI CS low. For now, no support for active high given
+ if (gpioId != gpio::NO_GPIO) {
+ result = gpioIF->pullLow(gpioId);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "rwSpiCallback::spiCallback: Failed to pull chip select low" << std::endl;
+ return result;
+ }
+ }
+ return HasReturnvaluesIF::RETURN_OK;
+}
+void closeSpi(int fd, gpioId_t gpioId, GpioIF* gpioIF, MutexIF* mutex) {
+ close(fd);
if (gpioId != gpio::NO_GPIO) {
if (gpioIF->pullHigh(gpioId) != HasReturnvaluesIF::RETURN_OK) {
sif::error << "closeSpi: Failed to pull chip select high" << std::endl;
@@ -229,4 +276,7 @@ void closeSpi(gpioId_t gpioId, GpioIF* gpioIF, MutexIF* mutex) {
;
}
}
+
+} // namespace
+
} // namespace rwSpiCallback
diff --git a/bsp_q7s/callbacks/rwSpiCallback.h b/bsp_q7s/callbacks/rwSpiCallback.h
index 843d5b80..4a5389a3 100644
--- a/bsp_q7s/callbacks/rwSpiCallback.h
+++ b/bsp_q7s/callbacks/rwSpiCallback.h
@@ -33,14 +33,5 @@ static constexpr uint8_t FLAG_BYTE = 0x7E;
ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sendData,
size_t sendLen, void* args);
-/**
- * @brief This function closes a spi session. Pulls the chip select to high an releases the
- * mutex.
- * @param gpioId Gpio ID of chip select
- * @param gpioIF Pointer to gpio interface to drive the chip select
- * @param mutex The spi mutex
- */
-void closeSpi(gpioId_t gpioId, GpioIF* gpioIF, MutexIF* mutex);
-
} // namespace rwSpiCallback
#endif /* BSP_Q7S_RW_SPI_CALLBACK_H_ */
diff --git a/bsp_q7s/core/CMakeLists.txt b/bsp_q7s/core/CMakeLists.txt
index e5668acc..344112b6 100644
--- a/bsp_q7s/core/CMakeLists.txt
+++ b/bsp_q7s/core/CMakeLists.txt
@@ -1,6 +1,7 @@
target_sources(${OBSW_NAME} PRIVATE
CoreController.cpp
InitMission.cpp
+ ObjectFactory.cpp
)
target_sources(${SIMPLE_OBSW_NAME} PRIVATE
diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp
index 6b011e7e..bb531023 100644
--- a/bsp_q7s/core/InitMission.cpp
+++ b/bsp_q7s/core/InitMission.cpp
@@ -138,6 +138,12 @@ void initmission::initTasks() {
initmission::printAddObjectError("ACS_BOARD_ASS", objects::ACS_BOARD_ASS);
}
#endif /* OBSW_ADD_ACS_HANDLERS */
+#if OBSW_ADD_RW == 1
+ result = sysTask->addComponent(objects::RW_ASS);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ initmission::printAddObjectError("RW_ASS", objects::RW_ASS);
+ }
+#endif
#if OBSW_ADD_SUS_BOARD_ASS == 1
result = sysTask->addComponent(objects::SUS_BOARD_ASS);
@@ -266,7 +272,7 @@ void initmission::createPstTasks(TaskFactory& factory,
/* Polling Sequence Table Default */
#if OBSW_ADD_SPI_TEST_CODE == 0
FixedTimeslotTaskIF* spiPst = factory.createFixedTimeslotTask(
- "PST_TASK_DEFAULT", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc);
+ "MAIN_SPI", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc);
result = pst::pstSpi(spiPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
@@ -279,8 +285,23 @@ void initmission::createPstTasks(TaskFactory& factory,
}
#endif
+#if OBSW_ADD_RW == 1
+ FixedTimeslotTaskIF* rwPstTask = factory.createFixedTimeslotTask(
+ "RW_SPI", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 1.0, missedDeadlineFunc);
+ result = pst::pstSpiRw(rwPstTask);
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
+ sif::warning << "InitMission::initTasks: SPI PST is empty" << std::endl;
+ } else {
+ sif::error << "InitMission::initTasks: Creating SPI PST failed!" << std::endl;
+ }
+ } else {
+ taskVec.push_back(rwPstTask);
+ }
+#endif
+
FixedTimeslotTaskIF* uartPst = factory.createFixedTimeslotTask(
- "UART_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
+ "UART_PST", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
result = pst::pstUart(uartPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
@@ -293,7 +314,7 @@ void initmission::createPstTasks(TaskFactory& factory,
}
FixedTimeslotTaskIF* gpioPst = factory.createFixedTimeslotTask(
- "GPIO_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
+ "GPIO_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.2, missedDeadlineFunc);
result = pst::pstGpio(gpioPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
@@ -306,7 +327,7 @@ void initmission::createPstTasks(TaskFactory& factory,
}
#if OBSW_ADD_I2C_TEST_CODE == 0
FixedTimeslotTaskIF* i2cPst = factory.createFixedTimeslotTask(
- "I2C_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
+ "I2C_PST", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.2, missedDeadlineFunc);
result = pst::pstI2c(i2cPst);
if (result != HasReturnvaluesIF::RETURN_OK) {
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
diff --git a/bsp_q7s/fm/fmObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp
similarity index 85%
rename from bsp_q7s/fm/fmObjectFactory.cpp
rename to bsp_q7s/core/ObjectFactory.cpp
index a3a208c9..6e548741 100644
--- a/bsp_q7s/fm/fmObjectFactory.cpp
+++ b/bsp_q7s/core/ObjectFactory.cpp
@@ -1,5 +1,4 @@
-#include
-#include
+#include "ObjectFactory.h"
#include "OBSWConfig.h"
#include "bsp_q7s/boardtest/Q7STestTask.h"
@@ -8,7 +7,6 @@
#include "bsp_q7s/callbacks/q7sGpioCallbacks.h"
#include "bsp_q7s/callbacks/rwSpiCallback.h"
#include "bsp_q7s/core/CoreController.h"
-#include "bsp_q7s/core/ObjectFactory.h"
#include "bsp_q7s/memory/FileSystemHandler.h"
#include "busConf.h"
#include "ccsdsConfig.h"
@@ -38,9 +36,12 @@
#include "linux/obc/PdecHandler.h"
#include "linux/obc/Ptme.h"
#include "linux/obc/PtmeConfig.h"
+#include "mission/system/RwAssembly.h"
#include "mission/system/fdir/AcsBoardFdir.h"
+#include "mission/system/fdir/GomspacePowerFdir.h"
#include "mission/system/fdir/RtdFdir.h"
#include "mission/system/fdir/SusFdir.h"
+#include "mission/system/fdir/SyrlinksFdir.h"
#include "tmtc/apid.h"
#include "tmtc/pusIds.h"
#if OBSW_TEST_LIBGPIOD == 1
@@ -91,11 +92,10 @@
#include "mission/tmtc/CCSDSHandler.h"
#include "mission/tmtc/VirtualChannel.h"
#include "mission/utility/TmFunnel.h"
+
ResetArgs resetArgsGnss0;
ResetArgs resetArgsGnss1;
-void ObjectFactory::setStatics() { Factory::setStaticFrameworkObjectIds(); }
-
void Factory::setStaticFrameworkObjectIds() {
PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR;
PusServiceBase::packetDestination = objects::TM_FUNNEL;
@@ -119,88 +119,7 @@ void Factory::setStaticFrameworkObjectIds() {
TmPacketBase::timeStamperId = objects::TIME_STAMPER;
}
-void ObjectFactory::produce(void* args) {
- ObjectFactory::setStatics();
- HealthTableIF* healthTable = nullptr;
- ObjectFactory::produceGenericObjects(&healthTable);
-
- LinuxLibgpioIF* gpioComIF = nullptr;
- UartComIF* uartComIF = nullptr;
- SpiComIF* spiComIF = nullptr;
- I2cComIF* i2cComIF = nullptr;
- PowerSwitchIF* pwrSwitcher = nullptr;
- createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiComIF, &i2cComIF);
- createTmpComponents();
- new CoreController(objects::CORE_CONTROLLER);
-
- gpioCallbacks::disableAllDecoder(gpioComIF);
- createPcduComponents(gpioComIF, &pwrSwitcher);
- createRadSensorComponent(gpioComIF);
- createSunSensorComponents(gpioComIF, spiComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV);
-
-#if OBSW_ADD_ACS_BOARD == 1
- createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher);
-#endif
- createHeaterComponents(gpioComIF, pwrSwitcher, healthTable);
-
- createSolarArrayDeploymentComponents();
- createPlPcduComponents(gpioComIF, spiComIF, pwrSwitcher);
-#if OBSW_ADD_SYRLINKS == 1
- createSyrlinksComponents(pwrSwitcher);
-#endif /* OBSW_ADD_SYRLINKS == 1 */
- createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher);
- createPayloadComponents(gpioComIF);
-
-#if OBSW_ADD_MGT == 1
- I2cCookie* imtqI2cCookie =
- new I2cCookie(addresses::IMTQ, IMTQ::MAX_REPLY_SIZE, q7s::I2C_DEFAULT_DEV);
- auto imtqHandler = new IMTQHandler(objects::IMTQ_HANDLER, objects::I2C_COM_IF, imtqI2cCookie,
- pcdu::Switches::PDU1_CH3_MGT_5V);
- imtqHandler->setPowerSwitcher(pwrSwitcher);
- static_cast(imtqHandler);
-#if OBSW_TEST_IMTQ == 1
- imtqHandler->setStartUpImmediately();
- imtqHandler->setToGoToNormal(true);
-#endif
-#if OBSW_DEBUG_IMTQ == 1
- imtqHandler->setDebugMode(true);
-#endif
-#endif
- createReactionWheelComponents(gpioComIF);
-
-#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
- I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_DEFAULT_DEV);
- BpxBatteryHandler* bpxHandler =
- new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie);
- bpxHandler->setStartUpImmediately();
- bpxHandler->setToGoToNormalMode(true);
-#if OBSW_DEBUG_BPX_BATT == 1
- bpxHandler->setDebugMode(true);
-#endif
-#endif
- new FileSystemHandler(objects::FILE_SYSTEM_HANDLER);
-
-#if OBSW_ADD_STAR_TRACKER == 1
- UartCookie* starTrackerCookie =
- new UartCookie(objects::STAR_TRACKER, q7s::UART_STAR_TRACKER_DEV, uart::STAR_TRACKER_BAUD,
- startracker::MAX_FRAME_SIZE * 2 + 2, UartModes::NON_CANONICAL);
- starTrackerCookie->setNoFixedSizeReply();
- StrHelper* strHelper = new StrHelper(objects::STR_HELPER);
- auto starTracker =
- new StarTrackerHandler(objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie,
- strHelper, pcdu::PDU1_CH2_STAR_TRACKER_5V);
- starTracker->setPowerSwitcher(pwrSwitcher);
-
-#endif /* OBSW_ADD_STAR_TRACKER == 1 */
-#if OBSW_USE_CCSDS_IP_CORE == 1
- createCcsdsComponents(gpioComIF);
-#endif /* OBSW_USE_CCSDS_IP_CORE == 1 */
- /* Test Task */
-#if OBSW_ADD_TEST_CODE == 1
- createTestComponents(gpioComIF);
-#endif /* OBSW_ADD_TEST_CODE == 1 */
- new PlocMemoryDumper(objects::PLOC_MEMORY_DUMPER);
-}
+void ObjectFactory::setStatics() { Factory::setStaticFrameworkObjectIds(); }
void ObjectFactory::createTmpComponents() {
I2cCookie* i2cCookieTmp1075tcs1 =
@@ -218,8 +137,10 @@ void ObjectFactory::createTmpComponents() {
}
void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
- SpiComIF** spiComIF, I2cComIF** i2cComIF) {
- if (gpioComIF == nullptr or uartComIF == nullptr or spiComIF == nullptr) {
+ SpiComIF** spiMainComIF, I2cComIF** i2cComIF,
+ SpiComIF** spiRWComIF) {
+ if (gpioComIF == nullptr or uartComIF == nullptr or spiMainComIF == nullptr or
+ spiRWComIF == nullptr) {
sif::error << "ObjectFactory::createCommunicationInterfaces: Invalid passed ComIF pointer"
<< std::endl;
}
@@ -229,8 +150,8 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, Ua
new CspComIF(objects::CSP_COM_IF);
*i2cComIF = new I2cComIF(objects::I2C_COM_IF);
*uartComIF = new UartComIF(objects::UART_COM_IF);
- *spiComIF = new SpiComIF(objects::SPI_COM_IF, *gpioComIF);
-
+ *spiMainComIF = new SpiComIF(objects::SPI_MAIN_COM_IF, q7s::SPI_DEFAULT_DEV, *gpioComIF);
+ *spiRWComIF = new SpiComIF(objects::SPI_RW_COM_IF, q7s::SPI_RW_DEV, *gpioComIF);
/* Adding gpios for chip select decoding to the gpioComIf */
q7s::gpioCallbacks::initSpiCsDecoder(*gpioComIF);
}
@@ -288,12 +209,12 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
gpio = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_RADFET, consumer.str(), Direction::OUT,
Levels::LOW);
gpioCookieRadSensor->addGpio(gpioIds::ENABLE_RADFET, gpio);
- gpioComIF->addGpios(gpioCookieRadSensor);
+ gpioChecker(gpioComIF->addGpios(gpioCookieRadSensor), "RAD sensor");
- SpiCookie* spiCookieRadSensor = new SpiCookie(
- addresses::RAD_SENSOR, gpioIds::CS_RAD_SENSOR, std::string(q7s::SPI_DEFAULT_DEV),
- RAD_SENSOR::READ_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED);
- auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF,
+ SpiCookie* spiCookieRadSensor =
+ new SpiCookie(addresses::RAD_SENSOR, gpioIds::CS_RAD_SENSOR, RAD_SENSOR::READ_SIZE,
+ spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED);
+ auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_MAIN_COM_IF,
spiCookieRadSensor, gpioComIF);
static_cast(radSensor);
// The radiation sensor ADC is powered by the 5V stack connector which should always be on
@@ -404,16 +325,16 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_SELECT, consumer.str(), Direction::OUT,
Levels::LOW);
gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio);
- gpioComIF->addGpios(gpioCookieAcsBoard);
+ gpioChecker(gpioComIF->addGpios(gpioCookieAcsBoard), "ACS Board");
AcsBoardFdir* fdir = nullptr;
static_cast(fdir);
#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,
- MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
- auto mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_0_LIS3_HANDLER, objects::SPI_COM_IF,
+ new SpiCookie(addresses::MGM_0_LIS3, gpioIds::MGM_0_LIS3_CS, MGMLIS3MDL::MAX_BUFFER_SIZE,
+ spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
+ auto mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_0_LIS3_HANDLER, objects::SPI_MAIN_COM_IF,
spiCookie, spi::LIS3_TRANSITION_DELAY);
fdir = new AcsBoardFdir(objects::MGM_0_LIS3_HANDLER);
mgmLis3Handler->setCustomFdir(fdir);
@@ -426,10 +347,11 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
#endif
spiCookie =
- new SpiCookie(addresses::MGM_1_RM3100, gpioIds::MGM_1_RM3100_CS, spiDev,
- RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
- auto mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::RM3100_TRANSITION_DELAY);
+ new SpiCookie(addresses::MGM_1_RM3100, gpioIds::MGM_1_RM3100_CS, RM3100::MAX_BUFFER_SIZE,
+ spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
+ auto mgmRm3100Handler =
+ new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie,
+ spi::RM3100_TRANSITION_DELAY);
fdir = new AcsBoardFdir(objects::MGM_1_RM3100_HANDLER);
mgmRm3100Handler->setCustomFdir(fdir);
mgmRm3100Handler->setParent(objects::ACS_BOARD_ASS);
@@ -442,9 +364,9 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
mgmRm3100Handler->enablePeriodicPrintouts(true, 10);
#endif
spiCookie =
- new SpiCookie(addresses::MGM_2_LIS3, gpioIds::MGM_2_LIS3_CS, spiDev,
- MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
- mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_COM_IF,
+ new SpiCookie(addresses::MGM_2_LIS3, gpioIds::MGM_2_LIS3_CS, MGMLIS3MDL::MAX_BUFFER_SIZE,
+ spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
+ mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_MAIN_COM_IF,
spiCookie, spi::LIS3_TRANSITION_DELAY);
fdir = new AcsBoardFdir(objects::MGM_2_LIS3_HANDLER);
mgmLis3Handler->setCustomFdir(fdir);
@@ -458,9 +380,9 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
mgmLis3Handler->enablePeriodicPrintouts(true, 10);
#endif
spiCookie =
- new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, spiDev,
- RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
- mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_COM_IF,
+ new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, RM3100::MAX_BUFFER_SIZE,
+ spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
+ mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_MAIN_COM_IF,
spiCookie, spi::RM3100_TRANSITION_DELAY);
fdir = new AcsBoardFdir(objects::MGM_3_RM3100_HANDLER);
mgmRm3100Handler->setCustomFdir(fdir);
@@ -474,11 +396,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
#endif
// Commented until ACS board V2 in in clean room again
// Gyro 0 Side A
- spiCookie = new SpiCookie(addresses::GYRO_0_ADIS, gpioIds::GYRO_0_ADIS_CS, spiDev,
- ADIS1650X::MAXIMUM_REPLY_SIZE, spi::DEFAULT_ADIS16507_MODE,
- spi::DEFAULT_ADIS16507_SPEED);
- auto adisHandler = new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF,
- spiCookie, ADIS1650X::Type::ADIS16505);
+ spiCookie =
+ new SpiCookie(addresses::GYRO_0_ADIS, gpioIds::GYRO_0_ADIS_CS, ADIS1650X::MAXIMUM_REPLY_SIZE,
+ spi::DEFAULT_ADIS16507_MODE, spi::DEFAULT_ADIS16507_SPEED);
+ auto adisHandler =
+ new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie,
+ ADIS1650X::Type::ADIS16505);
fdir = new AcsBoardFdir(objects::GYRO_0_ADIS_HANDLER);
adisHandler->setCustomFdir(fdir);
adisHandler->setParent(objects::ACS_BOARD_ASS);
@@ -491,11 +414,10 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
adisHandler->enablePeriodicPrintouts(true, 10);
#endif
// Gyro 1 Side A
- spiCookie =
- new SpiCookie(addresses::GYRO_1_L3G, gpioIds::GYRO_1_L3G_CS, spiDev, L3GD20H::MAX_BUFFER_SIZE,
- spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
- auto gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_1_L3G_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::L3G_TRANSITION_DELAY);
+ spiCookie = new SpiCookie(addresses::GYRO_1_L3G, gpioIds::GYRO_1_L3G_CS, L3GD20H::MAX_BUFFER_SIZE,
+ spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
+ auto gyroL3gHandler = new GyroHandlerL3GD20H(
+ objects::GYRO_1_L3G_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie, spi::L3G_TRANSITION_DELAY);
fdir = new AcsBoardFdir(objects::GYRO_1_L3G_HANDLER);
gyroL3gHandler->setCustomFdir(fdir);
gyroL3gHandler->setParent(objects::ACS_BOARD_ASS);
@@ -508,10 +430,10 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
gyroL3gHandler->enablePeriodicPrintouts(true, 10);
#endif
// Gyro 2 Side B
- spiCookie = new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, spiDev,
- ADIS1650X::MAXIMUM_REPLY_SIZE, spi::DEFAULT_ADIS16507_MODE,
- spi::DEFAULT_ADIS16507_SPEED);
- adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF,
+ spiCookie =
+ new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, ADIS1650X::MAXIMUM_REPLY_SIZE,
+ spi::DEFAULT_ADIS16507_MODE, spi::DEFAULT_ADIS16507_SPEED);
+ adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_MAIN_COM_IF,
spiCookie, ADIS1650X::Type::ADIS16505);
fdir = new AcsBoardFdir(objects::GYRO_2_ADIS_HANDLER);
adisHandler->setCustomFdir(fdir);
@@ -521,10 +443,9 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI
adisHandler->setToGoToNormalModeImmediately();
#endif
// Gyro 3 Side B
- spiCookie =
- new SpiCookie(addresses::GYRO_3_L3G, gpioIds::GYRO_3_L3G_CS, spiDev, L3GD20H::MAX_BUFFER_SIZE,
- spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
- gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_3_L3G_HANDLER, objects::SPI_COM_IF,
+ spiCookie = new SpiCookie(addresses::GYRO_3_L3G, gpioIds::GYRO_3_L3G_CS, L3GD20H::MAX_BUFFER_SIZE,
+ spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
+ gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_3_L3G_HANDLER, objects::SPI_MAIN_COM_IF,
spiCookie, spi::L3G_TRANSITION_DELAY);
fdir = new AcsBoardFdir(objects::GYRO_3_L3G_HANDLER);
gyroL3gHandler->setCustomFdir(fdir);
@@ -664,7 +585,7 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF) {
consumer.str(), Direction::OUT, Levels::HIGH);
auto mpsocGpioCookie = new GpioCookie;
mpsocGpioCookie->addGpio(gpioIds::ENABLE_MPSOC_UART, gpioConfigMPSoC);
- gpioComIF->addGpios(mpsocGpioCookie);
+ gpioChecker(gpioComIF->addGpios(mpsocGpioCookie), "PLOC MPSoC");
auto mpsocCookie =
new UartCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV, uart::PLOC_MPSOC_BAUD,
mpsoc::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
@@ -693,7 +614,8 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF) {
static_cast(consumer);
}
-void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) {
+void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF,
+ PowerSwitchIF* pwrSwitcher) {
using namespace gpio;
GpioCookie* gpioCookieRw = new GpioCookie;
GpioCallback* csRw1 =
@@ -735,50 +657,38 @@ void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) {
Levels::LOW);
gpioCookieRw->addGpio(gpioIds::EN_RW4, gpio);
- gpioComIF->addGpios(gpioCookieRw);
+ gpioChecker(gpioComIF->addGpios(gpioCookieRw), "RWs");
#if OBSW_ADD_RW == 1
- auto rw1SpiCookie =
- new SpiCookie(addresses::RW1, gpioIds::CS_RW1, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
- auto rw2SpiCookie =
- new SpiCookie(addresses::RW2, gpioIds::CS_RW2, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
- auto rw3SpiCookie =
- new SpiCookie(addresses::RW3, gpioIds::CS_RW3, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
- auto rw4SpiCookie =
- new SpiCookie(addresses::RW4, gpioIds::CS_RW4, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
+ std::array, 4> rwCookieParams = {
+ {{addresses::RW1, gpioIds::CS_RW1},
+ {addresses::RW2, gpioIds::CS_RW2},
+ {addresses::RW3, gpioIds::CS_RW3},
+ {addresses::RW4, gpioIds::CS_RW4}}};
+ std::array rwCookies = {};
+ std::array rwIds = {objects::RW1, objects::RW2, objects::RW3, objects::RW4};
+ std::array rwGpioIds = {gpioIds::EN_RW1, gpioIds::EN_RW2, gpioIds::EN_RW3,
+ gpioIds::EN_RW4};
+ std::array rws = {};
+ for (uint8_t idx = 0; idx < rwCookies.size(); idx++) {
+ rwCookies[idx] = new SpiCookie(rwCookieParams[idx].first, rwCookieParams[idx].second,
+ RwDefinitions::MAX_REPLY_SIZE, spi::RW_MODE, spi::RW_SPEED,
+ &rwSpiCallback::spiCallback, nullptr);
+ rws[idx] = new RwHandler(rwIds[idx], objects::SPI_RW_COM_IF, rwCookies[idx], gpioComIF,
+ rwGpioIds[idx]);
+ rwCookies[idx]->setCallbackArgs(rws[idx]);
+#if OBSW_TEST_RW == 1
+ rws[idx]->setStartUpImmediately();
+#endif
+#if OBSW_DEBUG_RW == 1
+ rws[idx]->setDebugMode(true);
+#endif
+ }
- auto rwHandler1 =
- new RwHandler(objects::RW1, objects::SPI_COM_IF, rw1SpiCookie, gpioComIF, gpioIds::EN_RW1);
- rw1SpiCookie->setCallbackArgs(rwHandler1);
-#if OBSW_DEBUG_RW == 1
- rwHandler1->setStartUpImmediately();
- rwHandler1->setDebugMode(true);
-#endif
- auto rwHandler2 =
- new RwHandler(objects::RW2, objects::SPI_COM_IF, rw2SpiCookie, gpioComIF, gpioIds::EN_RW2);
- rw2SpiCookie->setCallbackArgs(rwHandler2);
-#if OBSW_DEBUG_RW == 1
- rwHandler2->setStartUpImmediately();
- rwHandler2->setDebugMode(true);
-#endif
- auto rwHandler3 =
- new RwHandler(objects::RW3, objects::SPI_COM_IF, rw3SpiCookie, gpioComIF, gpioIds::EN_RW3);
- rw3SpiCookie->setCallbackArgs(rwHandler3);
-#if OBSW_DEBUG_RW == 1
- rwHandler3->setStartUpImmediately();
- rwHandler3->setDebugMode(true);
-#endif
- auto rwHandler4 =
- new RwHandler(objects::RW4, objects::SPI_COM_IF, rw4SpiCookie, gpioComIF, gpioIds::EN_RW4);
- rw4SpiCookie->setCallbackArgs(rwHandler4);
-#if OBSW_DEBUG_RW == 1
- rwHandler4->setStartUpImmediately();
- rwHandler4->setDebugMode(true);
-#endif
+ RwHelper rwHelper(rwIds);
+ auto* rwAss = new RwAssembly(objects::RW_ASS, objects::NO_OBJECT, pwrSwitcher,
+ pcdu::Switches::PDU2_CH2_RW_5V, rwHelper);
+ static_cast(rwAss);
#endif /* OBSW_ADD_RW == 1 */
}
@@ -817,7 +727,7 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) {
gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC3, consumer.str());
gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_EMPTY, gpio);
- gpioComIF->addGpios(gpioCookiePtmeIp);
+ gpioChecker(gpioComIF->addGpios(gpioCookiePtmeIp), "PTME PAPB VCs");
// Creating virtual channel interfaces
VcInterfaceIF* vc0 =
@@ -871,7 +781,7 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) {
Levels::LOW);
gpioCookiePdec->addGpio(gpioIds::PDEC_RESET, gpio);
- gpioComIF->addGpios(gpioCookiePdec);
+ gpioChecker(gpioComIF->addGpios(gpioCookiePdec), "PDEC");
new PdecHandler(objects::PDEC_HANDLER, objects::CCSDS_HANDLER, gpioComIF, gpioIds::PDEC_RESET,
q7s::UIO_PDEC_CONFIG_MEMORY, q7s::UIO_PDEC_RAM, q7s::UIO_PDEC_REGISTERS);
@@ -892,7 +802,7 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) {
Direction::OUT, Levels::LOW);
gpioRS485Chip->addGpio(gpioIds::RS485_EN_RX_DATA, gpio);
- gpioComIF->addGpios(gpioRS485Chip);
+ gpioChecker(gpioComIF->addGpios(gpioRS485Chip), "RS485 Transceiver");
}
void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
@@ -937,14 +847,14 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF*
gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ADC_CS, consumer, Direction::OUT,
gpio::Levels::HIGH);
plPcduGpios->addGpio(gpioIds::PLPCDU_ADC_CS, gpio);
- gpioComIF->addGpios(plPcduGpios);
- SpiCookie* spiCookie = new SpiCookie(addresses::PLPCDU_ADC, gpioIds::PLPCDU_ADC_CS,
- q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::PL_PCDU_MAX_1227_SPEED);
+ gpioChecker(gpioComIF->addGpios(plPcduGpios), "PL PCDU");
+ SpiCookie* spiCookie =
+ new SpiCookie(addresses::PLPCDU_ADC, gpioIds::PLPCDU_ADC_CS, plpcdu::MAX_ADC_REPLY_SIZE,
+ spi::DEFAULT_MAX_1227_MODE, spi::PL_PCDU_MAX_1227_SPEED);
// Create device handler components
auto plPcduHandler = new PayloadPcduHandler(
- objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, gpioComIF, SdCardManager::instance(),
- pwrSwitcher, pcdu::Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8,
+ objects::PLPCDU_HANDLER, objects::SPI_MAIN_COM_IF, spiCookie, gpioComIF,
+ SdCardManager::instance(), pwrSwitcher, pcdu::Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8,
pcdu::Switches::PDU2_CH6_PL_PCDU_BATT_1_14V8, false);
spiCookie->setCallbackMode(PayloadPcduHandler::extConvAsTwoCallback, plPcduHandler);
// plPcduHandler->enablePeriodicPrintout(true, 5);
@@ -971,6 +881,50 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
#endif
}
+void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) {
+ UartCookie* starTrackerCookie =
+ new UartCookie(objects::STAR_TRACKER, q7s::UART_STAR_TRACKER_DEV, uart::STAR_TRACKER_BAUD,
+ startracker::MAX_FRAME_SIZE * 2 + 2, UartModes::NON_CANONICAL);
+ starTrackerCookie->setNoFixedSizeReply();
+ StrHelper* strHelper = new StrHelper(objects::STR_HELPER);
+ auto starTracker =
+ new StarTrackerHandler(objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie,
+ strHelper, pcdu::PDU1_CH2_STAR_TRACKER_5V);
+ starTracker->setPowerSwitcher(pwrSwitcher);
+}
+
+void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher) {
+ I2cCookie* imtqI2cCookie =
+ new I2cCookie(addresses::IMTQ, IMTQ::MAX_REPLY_SIZE, q7s::I2C_DEFAULT_DEV);
+ auto imtqHandler = new IMTQHandler(objects::IMTQ_HANDLER, objects::I2C_COM_IF, imtqI2cCookie,
+ pcdu::Switches::PDU1_CH3_MGT_5V);
+ imtqHandler->setPowerSwitcher(pwrSwitcher);
+ static_cast(imtqHandler);
+#if OBSW_TEST_IMTQ == 1
+ imtqHandler->setStartUpImmediately();
+ imtqHandler->setToGoToNormal(true);
+#endif
+#if OBSW_DEBUG_IMTQ == 1
+ imtqHandler->setDebugMode(true);
+#endif
+}
+
+void ObjectFactory::createBpxBatteryComponent() {
+ I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_DEFAULT_DEV);
+ BpxBatteryHandler* bpxHandler =
+ new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie);
+ bpxHandler->setStartUpImmediately();
+ bpxHandler->setToGoToNormalMode(true);
+#if OBSW_DEBUG_BPX_BATT == 1
+ bpxHandler->setDebugMode(true);
+#endif
+}
+
+void ObjectFactory::createMiscComponents() {
+ new FileSystemHandler(objects::FILE_SYSTEM_HANDLER);
+ new PlocMemoryDumper(objects::PLOC_MEMORY_DUMPER);
+}
+
void ObjectFactory::testAcsBrdAss(AcsBoardAssembly* acsAss) {
CommandMessage msg;
ModeMessage::setModeMessage(&msg, ModeMessage::CMD_MODE_COMMAND, DeviceHandlerIF::MODE_NORMAL,
diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h
index 7dee478c..e17d2cda 100644
--- a/bsp_q7s/core/ObjectFactory.h
+++ b/bsp_q7s/core/ObjectFactory.h
@@ -1,6 +1,10 @@
#ifndef BSP_Q7S_OBJECTFACTORY_H_
#define BSP_Q7S_OBJECTFACTORY_H_
+#include
+
+#include
+
class LinuxLibgpioIF;
class UartComIF;
class SpiComIF;
@@ -16,7 +20,8 @@ void setStatics();
void produce(void* args);
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
- SpiComIF** spiComIF, I2cComIF** i2cComIF);
+ SpiComIF** spiMainComIF, I2cComIF** i2cComIF,
+ SpiComIF** spiRwComIF);
void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher);
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
PowerSwitchIF* pwrSwitcher);
@@ -24,12 +29,21 @@ void createTmpComponents();
void createRadSensorComponent(LinuxLibgpioIF* gpioComIF);
void createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF,
PowerSwitchIF* pwrSwitcher);
+<<<<<<< HEAD
void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTableIF* healthTable);
+=======
+void createHeaterComponents();
+void createImtqComponents(PowerSwitchIF* pwrSwitcher);
+void createBpxBatteryComponent();
+void createStrComponents(PowerSwitchIF* pwrSwitcher);
+>>>>>>> origin/develop
void createSolarArrayDeploymentComponents();
void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher);
void createPayloadComponents(LinuxLibgpioIF* gpioComIF);
-void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF);
+void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
void createCcsdsComponents(LinuxLibgpioIF* gpioComIF);
+void createMiscComponents();
+
void createTestComponents(LinuxLibgpioIF* gpioComIF);
void testAcsBrdAss(AcsBoardAssembly* assAss);
diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp
index 077bc3d2..561786e8 100644
--- a/bsp_q7s/em/emObjectFactory.cpp
+++ b/bsp_q7s/em/emObjectFactory.cpp
@@ -1,126 +1,13 @@
-#include
-#include
-
#include "OBSWConfig.h"
-#include "bsp_q7s/boardtest/Q7STestTask.h"
-#include "bsp_q7s/callbacks/gnssCallback.h"
-#include "bsp_q7s/callbacks/pcduSwitchCb.h"
-#include "bsp_q7s/callbacks/q7sGpioCallbacks.h"
-#include "bsp_q7s/callbacks/rwSpiCallback.h"
#include "bsp_q7s/core/CoreController.h"
#include "bsp_q7s/core/ObjectFactory.h"
-#include "bsp_q7s/memory/FileSystemHandler.h"
#include "busConf.h"
-#include "ccsdsConfig.h"
+#include "commonObjects.h"
#include "devConf.h"
-#include "devices/addresses.h"
-#include "devices/gpioIds.h"
-#include "devices/powerSwitcherList.h"
-#include "fsfw/ipc/QueueFactory.h"
-#include "linux/ObjectFactory.h"
-#include "linux/boardtest/I2cTestClass.h"
-#include "linux/boardtest/SpiTestClass.h"
-#include "linux/boardtest/UartTestClass.h"
-#include "linux/callbacks/gpioCallbacks.h"
-#include "linux/csp/CspComIF.h"
-#include "linux/csp/CspCookie.h"
-#include "linux/devices/GPSHyperionLinuxController.h"
-#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h"
-#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
-#include "linux/devices/ploc/PlocMPSoCHandler.h"
-#include "linux/devices/ploc/PlocMPSoCHelper.h"
-#include "linux/devices/ploc/PlocMemoryDumper.h"
-#include "linux/devices/ploc/PlocSupervisorHandler.h"
-#include "linux/devices/ploc/PlocSupvHelper.h"
-#include "linux/devices/startracker/StarTrackerHandler.h"
-#include "linux/devices/startracker/StrHelper.h"
-#include "linux/obc/AxiPtmeConfig.h"
-#include "linux/obc/PapbVcInterface.h"
-#include "linux/obc/PdecHandler.h"
-#include "linux/obc/Ptme.h"
-#include "linux/obc/PtmeConfig.h"
-#include "mission/system/SusAssembly.h"
-#include "mission/system/TcsBoardAssembly.h"
-#include "mission/system/fdir/AcsBoardFdir.h"
-#include "mission/system/fdir/RtdFdir.h"
-#include "mission/system/fdir/SusFdir.h"
-#include "tmtc/apid.h"
-#include "tmtc/pusIds.h"
-#if OBSW_TEST_LIBGPIOD == 1
-#include "linux/boardtest/LibgpiodTest.h"
-#endif
-#include
-
-#include "fsfw/datapoollocal/LocalDataPoolManager.h"
-#include "fsfw/tmtcpacket/pus/tm.h"
-#include "fsfw/tmtcservices/CommandingServiceBase.h"
-#include "fsfw/tmtcservices/PusServiceBase.h"
-#include "fsfw_hal/common/gpio/GpioCookie.h"
-#include "fsfw_hal/common/gpio/gpioDefinitions.h"
-#include "fsfw_hal/devicehandlers/GyroL3GD20Handler.h"
-#include "fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h"
-#include "fsfw_hal/devicehandlers/MgmRM3100Handler.h"
#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
-#include "fsfw_hal/linux/i2c/I2cComIF.h"
-#include "fsfw_hal/linux/i2c/I2cCookie.h"
-#include "fsfw_hal/linux/spi/SpiComIF.h"
-#include "fsfw_hal/linux/spi/SpiCookie.h"
-#include "fsfw_hal/linux/uart/UartComIF.h"
-#include "fsfw_hal/linux/uart/UartCookie.h"
+#include "linux/ObjectFactory.h"
+#include "linux/callbacks/gpioCallbacks.h"
#include "mission/core/GenericFactory.h"
-#include "mission/devices/ACUHandler.h"
-#include "mission/devices/BpxBatteryHandler.h"
-#include "mission/devices/GyroADIS1650XHandler.h"
-#include "mission/devices/HeaterHandler.h"
-#include "mission/devices/IMTQHandler.h"
-#include "mission/devices/Max31865PT1000Handler.h"
-#include "mission/devices/P60DockHandler.h"
-#include "mission/devices/PCDUHandler.h"
-#include "mission/devices/PDU1Handler.h"
-#include "mission/devices/PDU2Handler.h"
-#include "mission/devices/PayloadPcduHandler.h"
-#include "mission/devices/RadiationSensorHandler.h"
-#include "mission/devices/RwHandler.h"
-#include "mission/devices/SolarArrayDeploymentHandler.h"
-#include "mission/devices/SyrlinksHkHandler.h"
-#include "mission/devices/Tmp1075Handler.h"
-#include "mission/devices/devicedefinitions/GomspaceDefinitions.h"
-#include "mission/devices/devicedefinitions/Max31865Definitions.h"
-#include "mission/devices/devicedefinitions/RadSensorDefinitions.h"
-#include "mission/devices/devicedefinitions/RwDefinitions.h"
-#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h"
-#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h"
-#include "mission/system/AcsBoardAssembly.h"
-#include "mission/tmtc/CCSDSHandler.h"
-#include "mission/tmtc/VirtualChannel.h"
-#include "mission/utility/TmFunnel.h"
-ResetArgs resetArgsGnss0;
-ResetArgs resetArgsGnss1;
-
-void ObjectFactory::setStatics() { Factory::setStaticFrameworkObjectIds(); }
-
-void Factory::setStaticFrameworkObjectIds() {
- PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR;
- PusServiceBase::packetDestination = objects::TM_FUNNEL;
-
- CommandingServiceBase::defaultPacketSource = objects::PUS_PACKET_DISTRIBUTOR;
- CommandingServiceBase::defaultPacketDestination = objects::TM_FUNNEL;
-
- DeviceHandlerBase::powerSwitcherId = objects::PCDU_HANDLER;
- // DeviceHandlerBase::powerSwitcherId = objects::NO_OBJECT;
-#if OBSW_TM_TO_PTME == 1
- TmFunnel::downlinkDestination = objects::CCSDS_HANDLER;
-#else
- TmFunnel::downlinkDestination = objects::TMTC_BRIDGE;
-#endif /* OBSW_TM_TO_PTME == 1 */
- // No storage object for now.
- TmFunnel::storageDestination = objects::NO_OBJECT;
-
- LocalDataPoolManager::defaultHkDestination = objects::PUS_SERVICE_3_HOUSEKEEPING;
-
- VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION;
- TmPacketBase::timeStamperId = objects::TIME_STAMPER;
-}
void ObjectFactory::produce(void* args) {
ObjectFactory::setStatics();
@@ -128,24 +15,25 @@ void ObjectFactory::produce(void* args) {
LinuxLibgpioIF* gpioComIF = nullptr;
UartComIF* uartComIF = nullptr;
- SpiComIF* spiComIF = nullptr;
+ SpiComIF* spiMainComIF = nullptr;
I2cComIF* i2cComIF = nullptr;
PowerSwitchIF* pwrSwitcher = nullptr;
- createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiComIF, &i2cComIF);
+ SpiComIF* spiRwComIF = nullptr;
+ createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF, &spiRwComIF);
createTmpComponents();
new CoreController(objects::CORE_CONTROLLER);
gpioCallbacks::disableAllDecoder(gpioComIF);
createPcduComponents(gpioComIF, &pwrSwitcher);
createRadSensorComponent(gpioComIF);
- createSunSensorComponents(gpioComIF, spiComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV);
+ createSunSensorComponents(gpioComIF, spiMainComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV);
#if OBSW_ADD_ACS_BOARD == 1
createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher);
#endif
createHeaterComponents();
createSolarArrayDeploymentComponents();
- createPlPcduComponents(gpioComIF, spiComIF, pwrSwitcher);
+ createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher);
#if OBSW_ADD_SYRLINKS == 1
createSyrlinksComponents(pwrSwitcher);
#endif /* OBSW_ADD_SYRLINKS == 1 */
@@ -153,45 +41,16 @@ void ObjectFactory::produce(void* args) {
createPayloadComponents(gpioComIF);
#if OBSW_ADD_MGT == 1
- I2cCookie* imtqI2cCookie =
- new I2cCookie(addresses::IMTQ, IMTQ::MAX_REPLY_SIZE, q7s::I2C_DEFAULT_DEV);
- auto imtqHandler = new IMTQHandler(objects::IMTQ_HANDLER, objects::I2C_COM_IF, imtqI2cCookie,
- pcdu::Switches::PDU1_CH3_MGT_5V);
- imtqHandler->setPowerSwitcher(pwrSwitcher);
- static_cast(imtqHandler);
-#if OBSW_TEST_IMTQ == 1
- imtqHandler->setStartUpImmediately();
- imtqHandler->setToGoToNormal(true);
+ createImtqComponents(pwrSwitcher);
#endif
-#if OBSW_DEBUG_IMTQ == 1
- imtqHandler->setDebugMode(true);
-#endif
-#endif
- createReactionWheelComponents(gpioComIF);
+ createReactionWheelComponents(gpioComIF, pwrSwitcher);
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
- I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_DEFAULT_DEV);
- BpxBatteryHandler* bpxHandler =
- new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie);
- bpxHandler->setStartUpImmediately();
- bpxHandler->setToGoToNormalMode(true);
-#if OBSW_DEBUG_BPX_BATT == 1
- bpxHandler->setDebugMode(true);
+ createBpxBatteryComponent();
#endif
-#endif
- new FileSystemHandler(objects::FILE_SYSTEM_HANDLER);
#if OBSW_ADD_STAR_TRACKER == 1
- UartCookie* starTrackerCookie =
- new UartCookie(objects::STAR_TRACKER, q7s::UART_STAR_TRACKER_DEV, uart::STAR_TRACKER_BAUD,
- startracker::MAX_FRAME_SIZE * 2 + 2, UartModes::NON_CANONICAL);
- starTrackerCookie->setNoFixedSizeReply();
- StrHelper* strHelper = new StrHelper(objects::STR_HELPER);
- auto starTracker =
- new StarTrackerHandler(objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie,
- strHelper, pcdu::PDU1_CH2_STAR_TRACKER_5V);
- starTracker->setPowerSwitcher(pwrSwitcher);
-
+ createStrComponents(pwrSwitcher);
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
#if OBSW_USE_CCSDS_IP_CORE == 1
createCcsdsComponents(gpioComIF);
@@ -200,770 +59,6 @@ void ObjectFactory::produce(void* args) {
#if OBSW_ADD_TEST_CODE == 1
createTestComponents(gpioComIF);
#endif /* OBSW_ADD_TEST_CODE == 1 */
- new PlocMemoryDumper(objects::PLOC_MEMORY_DUMPER);
-}
-
-void ObjectFactory::createTmpComponents() {
- I2cCookie* i2cCookieTmp1075tcs1 =
- new I2cCookie(addresses::TMP1075_TCS_1, TMP1075::MAX_REPLY_LENGTH, q7s::I2C_DEFAULT_DEV);
- I2cCookie* i2cCookieTmp1075tcs2 =
- new I2cCookie(addresses::TMP1075_TCS_2, TMP1075::MAX_REPLY_LENGTH, q7s::I2C_DEFAULT_DEV);
-
- /* Temperature sensors */
- Tmp1075Handler* tmp1075Handler_1 =
- new Tmp1075Handler(objects::TMP1075_HANDLER_1, objects::I2C_COM_IF, i2cCookieTmp1075tcs1);
- (void)tmp1075Handler_1;
- Tmp1075Handler* tmp1075Handler_2 =
- new Tmp1075Handler(objects::TMP1075_HANDLER_2, objects::I2C_COM_IF, i2cCookieTmp1075tcs2);
- (void)tmp1075Handler_2;
-}
-
-void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF,
- SpiComIF** spiComIF, I2cComIF** i2cComIF) {
- if (gpioComIF == nullptr or uartComIF == nullptr or spiComIF == nullptr) {
- sif::error << "ObjectFactory::createCommunicationInterfaces: Invalid passed ComIF pointer"
- << std::endl;
- }
- *gpioComIF = new LinuxLibgpioIF(objects::GPIO_IF);
-
- /* Communication interfaces */
- new CspComIF(objects::CSP_COM_IF);
- *i2cComIF = new I2cComIF(objects::I2C_COM_IF);
- *uartComIF = new UartComIF(objects::UART_COM_IF);
- *spiComIF = new SpiComIF(objects::SPI_COM_IF, *gpioComIF);
-
- /* Adding gpios for chip select decoding to the gpioComIf */
- q7s::gpioCallbacks::initSpiCsDecoder(*gpioComIF);
-}
-
-void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher) {
- 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);
- CspCookie* acuCspCookie = new CspCookie(ACU::MAX_REPLY_LENGTH, addresses::ACU);
-
- auto p60Fdir = new GomspacePowerFdir(objects::P60DOCK_HANDLER);
- P60DockHandler* p60dockhandler =
- new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, p60DockCspCookie, p60Fdir);
-
- auto pdu1Fdir = new GomspacePowerFdir(objects::PDU1_HANDLER);
- PDU1Handler* pdu1handler =
- new PDU1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, pdu1CspCookie, pdu1Fdir);
-
- auto pdu2Fdir = new GomspacePowerFdir(objects::PDU2_HANDLER);
- PDU2Handler* pdu2handler =
- new PDU2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie, pdu2Fdir);
-
- auto acuFdir = new GomspacePowerFdir(objects::ACU_HANDLER);
- ACUHandler* acuhandler =
- new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie, acuFdir);
- auto pcduHandler = new PCDUHandler(objects::PCDU_HANDLER, 50);
-
- /**
- * Setting PCDU devices to mode normal immediately after start up because PCDU is always
- * running.
- */
- p60dockhandler->setModeNormal();
- pdu1handler->setModeNormal();
- pdu2handler->setModeNormal();
- acuhandler->setModeNormal();
- if (pwrSwitcher != nullptr) {
- *pwrSwitcher = pcduHandler;
- }
-#if OBSW_DEBUG_P60DOCK == 1
- p60dockhandler->setDebugMode(true);
-#endif
-#if OBSW_DEBUG_ACU == 1
- acuhandler->setDebugMode(true);
-#endif
-}
-
-void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) {
- using namespace gpio;
- GpioCookie* gpioCookieRadSensor = new GpioCookie;
- std::stringstream consumer;
- consumer << "0x" << std::hex << objects::RAD_SENSOR;
- GpiodRegularByLineName* gpio = new GpiodRegularByLineName(
- q7s::gpioNames::RAD_SENSOR_CHIP_SELECT, consumer.str(), Direction::OUT, Levels::HIGH);
- gpioCookieRadSensor->addGpio(gpioIds::CS_RAD_SENSOR, gpio);
- gpio = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_RADFET, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieRadSensor->addGpio(gpioIds::ENABLE_RADFET, gpio);
- gpioComIF->addGpios(gpioCookieRadSensor);
-
- SpiCookie* spiCookieRadSensor = new SpiCookie(
- addresses::RAD_SENSOR, gpioIds::CS_RAD_SENSOR, std::string(q7s::SPI_DEFAULT_DEV),
- RAD_SENSOR::READ_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED);
- auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF,
- spiCookieRadSensor, gpioComIF);
- static_cast(radSensor);
- // The radiation sensor ADC is powered by the 5V stack connector which should always be on
- radSensor->setStartUpImmediately();
- // It's a simple sensor, so just to to normal mode immediately
- radSensor->setToGoToNormalModeImmediately();
-#if OBSW_DEBUG_RAD_SENSOR == 1
- radSensor->enablePeriodicDataPrint(true);
-#endif
-}
-
-void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF,
- PowerSwitchIF* pwrSwitcher) {
- using namespace gpio;
- GpioCookie* gpioCookieAcsBoard = new GpioCookie();
-
- std::stringstream consumer;
- GpiodRegularByLineName* gpio = nullptr;
- consumer << "0x" << std::hex << objects::GYRO_0_ADIS_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_0_ADIS_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::GYRO_0_ADIS_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GYRO_1_L3G_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_1_L3G_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::GYRO_1_L3G_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GYRO_2_ADIS_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_2_ADIS_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::GYRO_2_ADIS_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GYRO_3_L3G_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_3_L3G_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::GYRO_3_L3G_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::MGM_0_LIS3_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_0_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::MGM_0_LIS3_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::MGM_1_RM3100_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_1_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::MGM_1_RM3100_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::MGM_2_LIS3_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_2_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::MGM_2_LIS3_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::MGM_3_RM3100_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::MGM_3_CS, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::MGM_3_RM3100_CS, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
- // GNSS reset pins are active low
- gpio = new GpiodRegularByLineName(q7s::gpioNames::RESET_GNSS_0, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::GNSS_0_NRESET, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::RESET_GNSS_1, consumer.str(), Direction::OUT,
- Levels::HIGH);
- gpioCookieAcsBoard->addGpio(gpioIds::GNSS_1_NRESET, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GYRO_0_ADIS_HANDLER;
- // Enable pins must be pulled low for regular operations
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_0_ENABLE, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieAcsBoard->addGpio(gpioIds::GYRO_0_ENABLE, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GYRO_2_ADIS_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GYRO_2_ENABLE, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieAcsBoard->addGpio(gpioIds::GYRO_2_ENABLE, gpio);
-
- // Enable pins for GNSS
- consumer.str("");
- consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_0_ENABLE, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieAcsBoard->addGpio(gpioIds::GNSS_0_ENABLE, gpio);
-
- consumer.str("");
- consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_1_ENABLE, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieAcsBoard->addGpio(gpioIds::GNSS_1_ENABLE, gpio);
-
- // Select pin. 0 for GPS side A, 1 for GPS side B
- consumer.str("");
- consumer << "0x" << std::hex << objects::GPS_CONTROLLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::GNSS_SELECT, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieAcsBoard->addGpio(gpioIds::GNSS_SELECT, gpio);
- gpioComIF->addGpios(gpioCookieAcsBoard);
- AcsBoardFdir* fdir = nullptr;
- static_cast(fdir);
-
-#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,
- MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
- auto mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_0_LIS3_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::LIS3_TRANSITION_DELAY);
- fdir = new AcsBoardFdir(objects::MGM_0_LIS3_HANDLER);
- mgmLis3Handler->setCustomFdir(fdir);
- static_cast(mgmLis3Handler);
-#if OBSW_TEST_ACS == 1
- mgmLis3Handler->setStartUpImmediately();
- mgmLis3Handler->setToGoToNormalMode(true);
-#endif
-#if OBSW_DEBUG_ACS == 1
- mgmLis3Handler->enablePeriodicPrintouts(true, 10);
-#endif
- spiCookie =
- new SpiCookie(addresses::MGM_1_RM3100, gpioIds::MGM_1_RM3100_CS, spiDev,
- RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
- auto mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::RM3100_TRANSITION_DELAY);
- fdir = new AcsBoardFdir(objects::MGM_1_RM3100_HANDLER);
- mgmRm3100Handler->setCustomFdir(fdir);
- mgmRm3100Handler->setParent(objects::ACS_BOARD_ASS);
- static_cast(mgmRm3100Handler);
-#if OBSW_TEST_ACS == 1
- mgmRm3100Handler->setStartUpImmediately();
- mgmRm3100Handler->setToGoToNormalMode(true);
-#endif
-#if OBSW_DEBUG_ACS == 1
- mgmRm3100Handler->enablePeriodicPrintouts(true, 10);
-#endif
- spiCookie =
- new SpiCookie(addresses::MGM_2_LIS3, gpioIds::MGM_2_LIS3_CS, spiDev,
- MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED);
- mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::LIS3_TRANSITION_DELAY);
- fdir = new AcsBoardFdir(objects::MGM_2_LIS3_HANDLER);
- mgmLis3Handler->setCustomFdir(fdir);
- mgmLis3Handler->setParent(objects::ACS_BOARD_ASS);
- static_cast(mgmLis3Handler);
-#if OBSW_TEST_ACS == 1
- mgmLis3Handler->setStartUpImmediately();
- mgmLis3Handler->setToGoToNormalMode(true);
-#endif
-#if OBSW_DEBUG_ACS == 1
- mgmLis3Handler->enablePeriodicPrintouts(true, 10);
-#endif
- spiCookie =
- new SpiCookie(addresses::MGM_3_RM3100, gpioIds::MGM_3_RM3100_CS, spiDev,
- RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED);
- mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::RM3100_TRANSITION_DELAY);
- fdir = new AcsBoardFdir(objects::MGM_3_RM3100_HANDLER);
- mgmRm3100Handler->setCustomFdir(fdir);
- mgmRm3100Handler->setParent(objects::ACS_BOARD_ASS);
-#if OBSW_TEST_ACS == 1
- mgmRm3100Handler->setStartUpImmediately();
- mgmRm3100Handler->setToGoToNormalMode(true);
-#endif
-#if OBSW_DEBUG_ACS == 1
- mgmRm3100Handler->enablePeriodicPrintouts(true, 10);
-#endif
- // Commented until ACS board V2 in in clean room again
- // Gyro 0 Side A
- spiCookie = new SpiCookie(addresses::GYRO_0_ADIS, gpioIds::GYRO_0_ADIS_CS, spiDev,
- ADIS1650X::MAXIMUM_REPLY_SIZE, spi::DEFAULT_ADIS16507_MODE,
- spi::DEFAULT_ADIS16507_SPEED);
- auto adisHandler = new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF,
- spiCookie, ADIS1650X::Type::ADIS16505);
- fdir = new AcsBoardFdir(objects::GYRO_0_ADIS_HANDLER);
- adisHandler->setCustomFdir(fdir);
- adisHandler->setParent(objects::ACS_BOARD_ASS);
- static_cast(adisHandler);
-#if OBSW_TEST_ACS == 1
- adisHandler->setStartUpImmediately();
- adisHandler->setToGoToNormalModeImmediately();
-#endif
-#if OBSW_DEBUG_ACS == 1
- adisHandler->enablePeriodicPrintouts(true, 10);
-#endif
- // Gyro 1 Side A
- spiCookie =
- new SpiCookie(addresses::GYRO_1_L3G, gpioIds::GYRO_1_L3G_CS, spiDev, L3GD20H::MAX_BUFFER_SIZE,
- spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
- auto gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_1_L3G_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::L3G_TRANSITION_DELAY);
- fdir = new AcsBoardFdir(objects::GYRO_1_L3G_HANDLER);
- gyroL3gHandler->setCustomFdir(fdir);
- gyroL3gHandler->setParent(objects::ACS_BOARD_ASS);
- static_cast(gyroL3gHandler);
-#if OBSW_TEST_ACS == 1
- gyroL3gHandler->setStartUpImmediately();
- gyroL3gHandler->setToGoToNormalMode(true);
-#endif
-#if OBSW_DEBUG_ACS == 1
- gyroL3gHandler->enablePeriodicPrintouts(true, 10);
-#endif
- // Gyro 2 Side B
- spiCookie = new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, spiDev,
- ADIS1650X::MAXIMUM_REPLY_SIZE, spi::DEFAULT_ADIS16507_MODE,
- spi::DEFAULT_ADIS16507_SPEED);
- adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF,
- spiCookie, ADIS1650X::Type::ADIS16505);
- fdir = new AcsBoardFdir(objects::GYRO_2_ADIS_HANDLER);
- adisHandler->setCustomFdir(fdir);
- adisHandler->setParent(objects::ACS_BOARD_ASS);
-#if OBSW_TEST_ACS == 1
- adisHandler->setStartUpImmediately();
- adisHandler->setToGoToNormalModeImmediately();
-#endif
- // Gyro 3 Side B
- spiCookie =
- new SpiCookie(addresses::GYRO_3_L3G, gpioIds::GYRO_3_L3G_CS, spiDev, L3GD20H::MAX_BUFFER_SIZE,
- spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED);
- gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_3_L3G_HANDLER, objects::SPI_COM_IF,
- spiCookie, spi::L3G_TRANSITION_DELAY);
- fdir = new AcsBoardFdir(objects::GYRO_3_L3G_HANDLER);
- gyroL3gHandler->setCustomFdir(fdir);
- gyroL3gHandler->setParent(objects::ACS_BOARD_ASS);
-#if OBSW_TEST_ACS == 1
- gyroL3gHandler->setStartUpImmediately();
- gyroL3gHandler->setToGoToNormalMode(true);
-#endif
-#if OBSW_DEBUG_ACS == 1
- gyroL3gHandler->enablePeriodicPrintouts(true, 10);
-#endif
- bool debugGps = false;
-#if OBSW_DEBUG_GPS == 1
- debugGps = true;
-#endif
- resetArgsGnss1.gnss1 = true;
- resetArgsGnss1.gpioComIF = gpioComIF;
- resetArgsGnss1.waitPeriodMs = 100;
- resetArgsGnss0.gnss1 = false;
- resetArgsGnss0.gpioComIF = gpioComIF;
- resetArgsGnss0.waitPeriodMs = 100;
- auto gpsHandler0 =
- new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps);
- gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &resetArgsGnss0);
- AcsBoardHelper acsBoardHelper = AcsBoardHelper(
- objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER,
- objects::MGM_3_RM3100_HANDLER, objects::GYRO_0_ADIS_HANDLER, objects::GYRO_1_L3G_HANDLER,
- objects::GYRO_2_ADIS_HANDLER, objects::GYRO_3_L3G_HANDLER, objects::GPS_CONTROLLER);
- auto acsAss = new AcsBoardAssembly(objects::ACS_BOARD_ASS, objects::NO_OBJECT, pwrSwitcher,
- acsBoardHelper, gpioComIF);
- static_cast(acsAss);
-#endif /* OBSW_ADD_ACS_HANDLERS == 1 */
-}
-
-void ObjectFactory::createHeaterComponents() {
- using namespace gpio;
- GpioCookie* heaterGpiosCookie = new GpioCookie;
- GpiodRegularByLineName* gpio = nullptr;
-
- std::stringstream consumer;
- consumer << "0x" << std::hex << objects::HEATER_HANDLER;
- /* Pin H2-11 on stack connector */
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_0, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_0, gpio);
- /* Pin H2-12 on stack connector */
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_1, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_1, gpio);
-
- /* Pin H2-13 on stack connector */
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_2, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_2, gpio);
-
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_3, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_3, gpio);
-
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_4, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_4, gpio);
-
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_5, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_5, gpio);
-
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_6, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_6, gpio);
-
- gpio = new GpiodRegularByLineName(q7s::gpioNames::HEATER_7, consumer.str(), Direction::OUT,
- Levels::LOW);
- heaterGpiosCookie->addGpio(gpioIds::HEATER_7, gpio);
-
- new HeaterHandler(objects::HEATER_HANDLER, objects::GPIO_IF, heaterGpiosCookie,
- objects::PCDU_HANDLER, pcdu::Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V);
-}
-
-void ObjectFactory::createSolarArrayDeploymentComponents() {
- using namespace gpio;
- GpioCookie* solarArrayDeplCookie = new GpioCookie;
- GpiodRegularByLineName* gpio = nullptr;
-
- std::stringstream consumer;
- consumer << "0x" << std::hex << objects::SOLAR_ARRAY_DEPL_HANDLER;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::SA_DPL_PIN_0, consumer.str(), Direction::OUT,
- Levels::LOW);
- solarArrayDeplCookie->addGpio(gpioIds::DEPLSA1, gpio);
- gpio = new GpiodRegularByLineName(q7s::gpioNames::SA_DPL_PIN_1, consumer.str(), Direction::OUT,
- Levels::LOW);
- solarArrayDeplCookie->addGpio(gpioIds::DEPLSA2, gpio);
-
- // TODO: Find out burn time. For now set to 1000 ms.
- new SolarArrayDeploymentHandler(objects::SOLAR_ARRAY_DEPL_HANDLER, objects::GPIO_IF,
- solarArrayDeplCookie, objects::PCDU_HANDLER,
- pcdu::Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V,
- gpioIds::DEPLSA1, gpioIds::DEPLSA2, 1000);
-}
-
-void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) {
- UartCookie* syrlinksUartCookie =
- new UartCookie(objects::SYRLINKS_HK_HANDLER, q7s::UART_SYRLINKS_DEV, uart::SYRLINKS_BAUD,
- syrlinks::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
- syrlinksUartCookie->setParityEven();
-
- auto syrlinksFdir = new SyrlinksFdir(objects::SYRLINKS_HK_HANDLER);
- auto syrlinksHandler =
- new SyrlinksHkHandler(objects::SYRLINKS_HK_HANDLER, objects::UART_COM_IF, syrlinksUartCookie,
- pcdu::PDU1_CH1_SYRLINKS_12V, syrlinksFdir);
- syrlinksHandler->setPowerSwitcher(pwrSwitcher);
-#if OBSW_DEBUG_SYRLINKS == 1
- syrlinksHandler->setDebugMode(true);
-#endif
-}
-
-void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF) {
- using namespace gpio;
- std::stringstream consumer;
-#if OBSW_ADD_PLOC_MPSOC == 1
- consumer << "0x" << std::hex << objects::PLOC_MPSOC_HANDLER;
- auto gpioConfigMPSoC = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_MPSOC_UART,
- consumer.str(), Direction::OUT, Levels::LOW);
- auto mpsocGpioCookie = new GpioCookie;
- mpsocGpioCookie->addGpio(gpioIds::ENABLE_MPSOC_UART, gpioConfigMPSoC);
- gpioComIF->addGpios(mpsocGpioCookie);
- auto mpsocCookie =
- new UartCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV, uart::PLOC_MPSOC_BAUD,
- mpsoc::MAX_REPLY_SIZE, UartModes::NON_CANONICAL);
- mpsocCookie->setNoFixedSizeReply();
- auto plocMpsocHelper = new PlocMPSoCHelper(objects::PLOC_MPSOC_HELPER);
- new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, mpsocCookie,
- plocMpsocHelper, Gpio(gpioIds::ENABLE_MPSOC_UART, gpioComIF),
- objects::PLOC_SUPERVISOR_HANDLER);
-#endif /* OBSW_ADD_PLOC_MPSOC == 1 */
-#if OBSW_ADD_PLOC_SUPERVISOR == 1
- consumer << "0x" << std::hex << objects::PLOC_SUPERVISOR_HANDLER;
- auto gpioConfigSupv = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_SUPV_UART, consumer.str(),
- Direction::OUT, Levels::LOW);
- auto supvGpioCookie = new GpioCookie;
- supvGpioCookie->addGpio(gpioIds::ENABLE_SUPV_UART, gpioConfigSupv);
- gpioComIF->addGpios(supvGpioCookie);
- auto supervisorCookie =
- new UartCookie(objects::PLOC_SUPERVISOR_HANDLER, q7s::UART_PLOC_SUPERVSIOR_DEV,
- uart::PLOC_SUPV_BAUD, supv::MAX_PACKET_SIZE * 20, UartModes::NON_CANONICAL);
- supervisorCookie->setNoFixedSizeReply();
- auto supvHelper = new PlocSupvHelper(objects::PLOC_SUPERVISOR_HELPER);
- new PlocSupervisorHandler(objects::PLOC_SUPERVISOR_HANDLER, objects::UART_COM_IF,
- supervisorCookie, Gpio(gpioIds::ENABLE_SUPV_UART, gpioComIF),
- pcdu::PDU1_CH6_PLOC_12V, supvHelper);
-#endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */
- static_cast(consumer);
-}
-
-void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) {
- using namespace gpio;
- GpioCookie* gpioCookieRw = new GpioCookie;
- GpioCallback* csRw1 =
- new GpioCallback("Chip select reaction wheel 1", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieRw->addGpio(gpioIds::CS_RW1, csRw1);
- GpioCallback* csRw2 =
- new GpioCallback("Chip select reaction wheel 2", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieRw->addGpio(gpioIds::CS_RW2, csRw2);
- GpioCallback* csRw3 =
- new GpioCallback("Chip select reaction wheel 3", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieRw->addGpio(gpioIds::CS_RW3, csRw3);
- GpioCallback* csRw4 =
- new GpioCallback("Chip select reaction wheel 4", Direction::OUT, Levels::HIGH,
- &gpioCallbacks::spiCsDecoderCallback, gpioComIF);
- gpioCookieRw->addGpio(gpioIds::CS_RW4, csRw4);
-
- std::stringstream consumer;
- GpiodRegularByLineName* gpio = nullptr;
- consumer << "0x" << std::hex << objects::RW1;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::EN_RW_1, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieRw->addGpio(gpioIds::EN_RW1, gpio);
- consumer.str("");
- consumer << "0x" << std::hex << objects::RW2;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::EN_RW_2, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieRw->addGpio(gpioIds::EN_RW2, gpio);
- consumer.str("");
- consumer << "0x" << std::hex << objects::RW3;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::EN_RW_3, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieRw->addGpio(gpioIds::EN_RW3, gpio);
- consumer.str("");
- consumer << "0x" << std::hex << objects::RW4;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::EN_RW_4, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookieRw->addGpio(gpioIds::EN_RW4, gpio);
-
- gpioComIF->addGpios(gpioCookieRw);
-
-#if OBSW_ADD_RW == 1
- auto rw1SpiCookie =
- new SpiCookie(addresses::RW1, gpioIds::CS_RW1, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
- auto rw2SpiCookie =
- new SpiCookie(addresses::RW2, gpioIds::CS_RW2, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
- auto rw3SpiCookie =
- new SpiCookie(addresses::RW3, gpioIds::CS_RW3, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
- auto rw4SpiCookie =
- new SpiCookie(addresses::RW4, gpioIds::CS_RW4, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE,
- spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr);
-
- auto rwHandler1 =
- new RwHandler(objects::RW1, objects::SPI_COM_IF, rw1SpiCookie, gpioComIF, gpioIds::EN_RW1);
- rw1SpiCookie->setCallbackArgs(rwHandler1);
-#if OBSW_DEBUG_RW == 1
- rwHandler1->setStartUpImmediately();
- rwHandler1->setDebugMode(true);
-#endif
- auto rwHandler2 =
- new RwHandler(objects::RW2, objects::SPI_COM_IF, rw2SpiCookie, gpioComIF, gpioIds::EN_RW2);
- rw2SpiCookie->setCallbackArgs(rwHandler2);
-#if OBSW_DEBUG_RW == 1
- rwHandler2->setStartUpImmediately();
- rwHandler2->setDebugMode(true);
-#endif
- auto rwHandler3 =
- new RwHandler(objects::RW3, objects::SPI_COM_IF, rw3SpiCookie, gpioComIF, gpioIds::EN_RW3);
- rw3SpiCookie->setCallbackArgs(rwHandler3);
-#if OBSW_DEBUG_RW == 1
- rwHandler3->setStartUpImmediately();
- rwHandler3->setDebugMode(true);
-#endif
- auto rwHandler4 =
- new RwHandler(objects::RW4, objects::SPI_COM_IF, rw4SpiCookie, gpioComIF, gpioIds::EN_RW4);
- rw4SpiCookie->setCallbackArgs(rwHandler4);
-#if OBSW_DEBUG_RW == 1
- rwHandler4->setStartUpImmediately();
- rwHandler4->setDebugMode(true);
-#endif
-#endif /* OBSW_ADD_RW == 1 */
-}
-
-void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) {
- using namespace gpio;
- // GPIO definitions of signals connected to the virtual channel interfaces of the PTME IP Core
- GpioCookie* gpioCookiePtmeIp = new GpioCookie;
- GpiodRegularByLineName* gpio = nullptr;
- std::stringstream consumer;
- consumer.str("PAPB VC0");
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC0, consumer.str());
- gpioCookiePtmeIp->addGpio(gpioIds::VC0_PAPB_BUSY, gpio);
- consumer.str("PAPB VC0");
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC0, consumer.str());
- gpioCookiePtmeIp->addGpio(gpioIds::VC0_PAPB_EMPTY, gpio);
- consumer.str("PAPB VC 1");
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC1, consumer.str());
- gpioCookiePtmeIp->addGpio(gpioIds::VC1_PAPB_BUSY, gpio);
- consumer.str("");
- consumer.str("PAPB VC 1");
- gpioCookiePtmeIp->addGpio(gpioIds::VC1_PAPB_EMPTY, gpio);
- consumer.str("");
- consumer.str("PAPB VC 2");
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC2, consumer.str());
- gpioCookiePtmeIp->addGpio(gpioIds::VC2_PAPB_BUSY, gpio);
- consumer.str("");
- consumer.str("PAPB VC 2");
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC2, consumer.str());
- gpioCookiePtmeIp->addGpio(gpioIds::VC2_PAPB_EMPTY, gpio);
- consumer.str("");
- consumer.str("PAPB VC 3");
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_BUSY_SIGNAL_VC3, consumer.str());
- gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_BUSY, gpio);
- consumer.str("");
- consumer.str("PAPB VC 3");
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC3, consumer.str());
- gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_EMPTY, gpio);
-
- gpioComIF->addGpios(gpioCookiePtmeIp);
-
- // Creating virtual channel interfaces
- VcInterfaceIF* vc0 =
- new PapbVcInterface(gpioComIF, gpioIds::VC0_PAPB_BUSY, gpioIds::VC0_PAPB_EMPTY, q7s::UIO_PTME,
- q7s::uiomapids::PTME_VC0);
- VcInterfaceIF* vc1 =
- new PapbVcInterface(gpioComIF, gpioIds::VC1_PAPB_BUSY, gpioIds::VC1_PAPB_EMPTY, q7s::UIO_PTME,
- q7s::uiomapids::PTME_VC1);
- VcInterfaceIF* vc2 =
- new PapbVcInterface(gpioComIF, gpioIds::VC2_PAPB_BUSY, gpioIds::VC2_PAPB_EMPTY, q7s::UIO_PTME,
- q7s::uiomapids::PTME_VC2);
- VcInterfaceIF* vc3 =
- new PapbVcInterface(gpioComIF, gpioIds::VC3_PAPB_BUSY, gpioIds::VC3_PAPB_EMPTY, q7s::UIO_PTME,
- q7s::uiomapids::PTME_VC3);
-
- // Creating ptme object and adding virtual channel interfaces
- Ptme* ptme = new Ptme(objects::PTME);
- ptme->addVcInterface(ccsds::VC0, vc0);
- ptme->addVcInterface(ccsds::VC1, vc1);
- ptme->addVcInterface(ccsds::VC2, vc2);
- ptme->addVcInterface(ccsds::VC3, vc3);
-
- AxiPtmeConfig* axiPtmeConfig =
- new AxiPtmeConfig(objects::AXI_PTME_CONFIG, q7s::UIO_PTME, q7s::uiomapids::PTME_CONFIG);
- PtmeConfig* ptmeConfig = new PtmeConfig(objects::PTME_CONFIG, axiPtmeConfig);
-#if OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT == 1
- // Set to high value when not sending via syrlinks
- static const uint32_t TRANSMITTER_TIMEOUT = 86400000; // 1 day
-#else
- static const uint32_t TRANSMITTER_TIMEOUT = 900000; // 15 minutes
-#endif
- CCSDSHandler* ccsdsHandler = new CCSDSHandler(
- 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;
- vc = new VirtualChannel(ccsds::VC0, common::VC0_QUEUE_SIZE, objects::CCSDS_HANDLER);
- ccsdsHandler->addVirtualChannel(ccsds::VC0, vc);
- vc = new VirtualChannel(ccsds::VC1, common::VC1_QUEUE_SIZE, objects::CCSDS_HANDLER);
- ccsdsHandler->addVirtualChannel(ccsds::VC1, vc);
- vc = new VirtualChannel(ccsds::VC2, common::VC2_QUEUE_SIZE, objects::CCSDS_HANDLER);
- ccsdsHandler->addVirtualChannel(ccsds::VC2, vc);
- vc = new VirtualChannel(ccsds::VC3, common::VC3_QUEUE_SIZE, objects::CCSDS_HANDLER);
- ccsdsHandler->addVirtualChannel(ccsds::VC3, vc);
-
- GpioCookie* gpioCookiePdec = new GpioCookie;
- consumer.str("");
- consumer << "0x" << std::hex << objects::PDEC_HANDLER;
- // GPIO also low after linux boot (specified by device-tree)
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PDEC_RESET, consumer.str(), Direction::OUT,
- Levels::LOW);
- gpioCookiePdec->addGpio(gpioIds::PDEC_RESET, gpio);
-
- gpioComIF->addGpios(gpioCookiePdec);
-
- new PdecHandler(objects::PDEC_HANDLER, objects::CCSDS_HANDLER, gpioComIF, gpioIds::PDEC_RESET,
- q7s::UIO_PDEC_CONFIG_MEMORY, q7s::UIO_PDEC_RAM, q7s::UIO_PDEC_REGISTERS);
-
- GpioCookie* gpioRS485Chip = new GpioCookie;
- gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_TX_CLOCK, "RS485 Transceiver",
- Direction::OUT, Levels::LOW);
- gpioRS485Chip->addGpio(gpioIds::RS485_EN_TX_CLOCK, gpio);
- gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_TX_DATA, "RS485 Transceiver",
- Direction::OUT, Levels::LOW);
- gpioRS485Chip->addGpio(gpioIds::RS485_EN_TX_DATA, gpio);
-
- // Default configuration enables RX channels (RXEN = LOW)
- gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_RX_CLOCK, "RS485 Transceiver",
- Direction::OUT, Levels::LOW);
- gpioRS485Chip->addGpio(gpioIds::RS485_EN_RX_CLOCK, gpio);
- gpio = new GpiodRegularByLineName(q7s::gpioNames::RS485_EN_RX_DATA, "RS485 Transceiver",
- Direction::OUT, Levels::LOW);
- gpioRS485Chip->addGpio(gpioIds::RS485_EN_RX_DATA, gpio);
-
- gpioComIF->addGpios(gpioRS485Chip);
-}
-
-void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
- PowerSwitchIF* pwrSwitcher) {
- using namespace gpio;
- // Create all GPIO components first
- GpioCookie* plPcduGpios = new GpioCookie;
- GpiodRegularByLineName* gpio = nullptr;
- std::string consumer;
- // Switch pins are active high
- consumer = "PLPCDU_ENB_VBAT_0";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_VBAT0, consumer, Direction::OUT,
- gpio::Levels::LOW);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_VBAT0, gpio);
- consumer = "PLPCDU_ENB_VBAT_1";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_VBAT1, consumer, Direction::OUT,
- gpio::Levels::LOW);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_VBAT1, gpio);
- consumer = "PLPCDU_ENB_DRO";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_DRO, consumer, Direction::OUT,
- gpio::Levels::LOW);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_DRO, gpio);
- consumer = "PLPCDU_ENB_X8";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_X8, consumer, Direction::OUT,
- gpio::Levels::LOW);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_X8, gpio);
- consumer = "PLPCDU_ENB_TX";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_TX, consumer, Direction::OUT,
- gpio::Levels::LOW);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_TX, gpio);
- consumer = "PLPCDU_ENB_MPA";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_MPA, consumer, Direction::OUT,
- gpio::Levels::LOW);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_MPA, gpio);
- consumer = "PLPCDU_ENB_HPA";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_HPA, consumer, Direction::OUT,
- gpio::Levels::LOW);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_HPA, gpio);
-
- // Chip select pin is active low
- consumer = "PLPCDU_ADC_CS";
- gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ADC_CS, consumer, Direction::OUT,
- gpio::Levels::HIGH);
- plPcduGpios->addGpio(gpioIds::PLPCDU_ADC_CS, gpio);
- gpioComIF->addGpios(plPcduGpios);
- SpiCookie* spiCookie = new SpiCookie(addresses::PLPCDU_ADC, gpioIds::PLPCDU_ADC_CS,
- q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE,
- spi::DEFAULT_MAX_1227_MODE, spi::PL_PCDU_MAX_1227_SPEED);
- // Create device handler components
- auto plPcduHandler = new PayloadPcduHandler(
- objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, gpioComIF, SdCardManager::instance(),
- pwrSwitcher, pcdu::Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8,
- pcdu::Switches::PDU2_CH6_PL_PCDU_BATT_1_14V8, false);
- spiCookie->setCallbackMode(PayloadPcduHandler::extConvAsTwoCallback, plPcduHandler);
-// plPcduHandler->enablePeriodicPrintout(true, 5);
-// static_cast(plPcduHandler);
-#if OBSW_TEST_PL_PCDU == 1
- plPcduHandler->setStartUpImmediately();
-#endif
-#if OBSW_DEBUG_PL_PCDU == 1
- plPcduHandler->setToGoToNormalModeImmediately(true);
- plPcduHandler->enablePeriodicPrintout(true, 10);
-#endif
-}
-
-void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) {
- new Q7STestTask(objects::TEST_TASK);
-#if OBSW_ADD_SPI_TEST_CODE == 1
- new SpiTestClass(objects::SPI_TEST, gpioComIF);
-#endif
-#if OBSW_ADD_I2C_TEST_CODE == 1
- new I2cTestClass(objects::I2C_TEST, q7s::I2C_DEFAULT_DEV);
-#endif
-#if OBSW_ADD_UART_TEST_CODE == 1
- new UartTestClass(objects::UART_TEST);
-#endif
-}
-
-void ObjectFactory::testAcsBrdAss(AcsBoardAssembly* acsAss) {
- CommandMessage msg;
- ModeMessage::setModeMessage(&msg, ModeMessage::CMD_MODE_COMMAND, DeviceHandlerIF::MODE_NORMAL,
- duallane::A_SIDE);
- ReturnValue_t result = MessageQueueSenderIF::sendMessage(acsAss->getCommandQueue(), &msg);
- if (result != HasReturnvaluesIF::RETURN_OK) {
- sif::warning << "Sending mode command failed" << std::endl;
- }
+
+ createMiscComponents();
}
diff --git a/bsp_q7s/fm/CMakeLists.txt b/bsp_q7s/fm/CMakeLists.txt
deleted file mode 100644
index 5d20a118..00000000
--- a/bsp_q7s/fm/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-target_sources(${OBSW_NAME} PRIVATE
- fmObjectFactory.cpp
-)
diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp
new file mode 100644
index 00000000..561786e8
--- /dev/null
+++ b/bsp_q7s/fmObjectFactory.cpp
@@ -0,0 +1,64 @@
+#include "OBSWConfig.h"
+#include "bsp_q7s/core/CoreController.h"
+#include "bsp_q7s/core/ObjectFactory.h"
+#include "busConf.h"
+#include "commonObjects.h"
+#include "devConf.h"
+#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
+#include "linux/ObjectFactory.h"
+#include "linux/callbacks/gpioCallbacks.h"
+#include "mission/core/GenericFactory.h"
+
+void ObjectFactory::produce(void* args) {
+ ObjectFactory::setStatics();
+ ObjectFactory::produceGenericObjects();
+
+ LinuxLibgpioIF* gpioComIF = nullptr;
+ 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);
+ createRadSensorComponent(gpioComIF);
+ createSunSensorComponents(gpioComIF, spiMainComIF, pwrSwitcher, q7s::SPI_DEFAULT_DEV);
+
+#if OBSW_ADD_ACS_BOARD == 1
+ createAcsBoardComponents(gpioComIF, uartComIF, pwrSwitcher);
+#endif
+ createHeaterComponents();
+ createSolarArrayDeploymentComponents();
+ createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher);
+#if OBSW_ADD_SYRLINKS == 1
+ createSyrlinksComponents(pwrSwitcher);
+#endif /* OBSW_ADD_SYRLINKS == 1 */
+ createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher);
+ createPayloadComponents(gpioComIF);
+
+#if OBSW_ADD_MGT == 1
+ createImtqComponents(pwrSwitcher);
+#endif
+ createReactionWheelComponents(gpioComIF, pwrSwitcher);
+
+#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
+ createBpxBatteryComponent();
+#endif
+
+#if OBSW_ADD_STAR_TRACKER == 1
+ createStrComponents(pwrSwitcher);
+#endif /* OBSW_ADD_STAR_TRACKER == 1 */
+#if OBSW_USE_CCSDS_IP_CORE == 1
+ createCcsdsComponents(gpioComIF);
+#endif /* OBSW_USE_CCSDS_IP_CORE == 1 */
+ /* Test Task */
+#if OBSW_ADD_TEST_CODE == 1
+ createTestComponents(gpioComIF);
+#endif /* OBSW_ADD_TEST_CODE == 1 */
+
+ createMiscComponents();
+}
diff --git a/cmake/HardwareOsPostConfig.cmake b/cmake/HardwareOsPostConfig.cmake
index 5146de98..111e859a 100644
--- a/cmake/HardwareOsPostConfig.cmake
+++ b/cmake/HardwareOsPostConfig.cmake
@@ -33,6 +33,10 @@ add_compile_options(
set(STRIPPED_OBSW_NAME ${OBSW_BIN_NAME}-stripped)
set(STRIPPED_WATCHDOG_NAME eive-watchdog-stripped)
+if(EIVE_CREATE_UNIQUE_OBSW_BIN)
+ set(UNIQUE_OBSW_BIN_NAME ${OBSW_BIN_NAME}-$ENV{USERNAME})
+endif()
+
add_custom_command(
TARGET ${OBSW_NAME}
POST_BUILD
@@ -41,6 +45,16 @@ add_custom_command(
COMMENT "Generating stripped executable ${STRIPPED_OBSW_NAME}.."
)
+if(UNIQUE_OBSW_BIN_NAME)
+ add_custom_command(
+ TARGET ${OBSW_NAME}
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_BINARY_DIR}/${OBSW_BIN_NAME}
+ ${CMAKE_CURRENT_BINARY_DIR}/${UNIQUE_OBSW_BIN_NAME}
+ COMMENT "Generating unique EIVE OBSW binary ${UNIQUE_OBSW_BIN_NAME}")
+endif()
+
add_custom_command(
TARGET ${WATCHDOG_NAME}
POST_BUILD
diff --git a/cmake/scripts/q7s/q7s-make-release.sh b/cmake/scripts/q7s/q7s-make-release.sh
index d9b74bc3..b86ca873 100755
--- a/cmake/scripts/q7s/q7s-make-release.sh
+++ b/cmake/scripts/q7s/q7s-make-release.sh
@@ -20,7 +20,7 @@ else
cfg_script_name="${EIVE_OBSW_ROOT}/cmake/scripts/${cfg_script_name}"
fi
-if [[ -z "${EIVE_Q7S_EM}" ]]; then
+if [ ! -z "${EIVE_Q7S_EM}" ]; then
build_defs="EIVE_Q7S_EM=ON"
fi
diff --git a/cmake/scripts/q7s/q7s-ninja-debug.sh b/cmake/scripts/q7s/q7s-ninja-debug.sh
index bf880a28..ad50b6a6 100755
--- a/cmake/scripts/q7s/q7s-ninja-debug.sh
+++ b/cmake/scripts/q7s/q7s-ninja-debug.sh
@@ -20,7 +20,7 @@ else
cfg_script_name="${EIVE_OBSW_ROOT}/cmake/scripts/${cfg_script_name}"
fi
-if [[ -z "${EIVE_Q7S_EM}" ]]; then
+if [ ! -z "${EIVE_Q7S_EM}" ]; then
build_defs="EIVE_Q7S_EM=ON"
fi
diff --git a/cmake/scripts/q7s/q7s-ninja-release.sh b/cmake/scripts/q7s/q7s-ninja-release.sh
index 4dfaa210..f0587f5c 100755
--- a/cmake/scripts/q7s/q7s-ninja-release.sh
+++ b/cmake/scripts/q7s/q7s-ninja-release.sh
@@ -20,7 +20,7 @@ else
cfg_script_name="${EIVE_OBSW_ROOT}/cmake/scripts/${cfg_script_name}"
fi
-if [[ -z "${EIVE_Q7S_EM}" ]]; then
+if [ ! -z "${EIVE_Q7S_EM}" ]; then
build_defs="EIVE_Q7S_EM=ON"
fi
diff --git a/common/config/commonObjects.h b/common/config/commonObjects.h
index d797c208..bacd5b9b 100644
--- a/common/config/commonObjects.h
+++ b/common/config/commonObjects.h
@@ -120,7 +120,8 @@ enum commonObjects: uint32_t {
// 0x73 ('s') for assemblies and system/subsystem components
ACS_BOARD_ASS = 0x73000001,
SUS_BOARD_ASS = 0x73000002,
- TCS_BOARD_ASS = 0x73000003
+ TCS_BOARD_ASS = 0x73000003,
+ RW_ASS = 0x73000004
};
}
diff --git a/fsfw b/fsfw
index d72b212f..dafcaa60 160000
--- a/fsfw
+++ b/fsfw
@@ -1 +1 @@
-Subproject commit d72b212fa629029924d9862e3e862d0388911f8e
+Subproject commit dafcaa60079ba8e57753d389e6a569ee3eb0b7cb
diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv
index 5794dcce..88fb35b5 100644
--- a/generators/bsp_q7s_events.csv
+++ b/generators/bsp_q7s_events.csv
@@ -78,7 +78,7 @@
9700;0x25e4;TEST;INFO;;fsfw/src/fsfw/pus/Service17Test.h
10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;;fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h
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 swithc 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;;mission/devices/devicedefinitions/powerDefinitions.h
11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;;mission/devices/HeaterHandler.h
@@ -107,7 +107,8 @@
11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/IMTQHandler.h
11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/IMTQHandler.h
-11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/RwHandler.h
+11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/RwDefinitions.h
+11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/RwDefinitions.h
11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h
diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv
index bba63235..f9380ece 100644
--- a/generators/bsp_q7s_objects.csv
+++ b/generators/bsp_q7s_objects.csv
@@ -69,7 +69,8 @@
0x445300A3;SYRLINKS_HK_HANDLER
0x49000000;ARDUINO_COM_IF
0x49010005;GPIO_IF
-0x49020004;SPI_COM_IF
+0x49020004;SPI_MAIN_COM_IF
+0x49020005;SPI_RW_COM_IF
0x49030003;UART_COM_IF
0x49040002;I2C_COM_IF
0x49050001;CSP_COM_IF
@@ -111,10 +112,10 @@
0x5400CAFE;DUMMY_INTERFACE
0x54123456;LIBGPIOD_TEST
0x54694269;TEST_TASK
-0x60000000;HEATER_0_OBC_BRD
-0x60000001;HEATER_1_PLOC_PROC_BRD
+0x60000000;HEATER_0_PLOC_PROC_BRD
+0x60000001;HEATER_1_PCDU_BRD
0x60000002;HEATER_2_ACS_BRD
-0x60000003;HEATER_3_PCDU_BRD
+0x60000003;HEATER_3_OBC_BRD
0x60000004;HEATER_4_CAMERA
0x60000005;HEATER_5_STR
0x60000006;HEATER_6_DRO
@@ -122,6 +123,7 @@
0x73000001;ACS_BOARD_ASS
0x73000002;SUS_BOARD_ASS
0x73000003;TCS_BOARD_ASS
+0x73000004;RW_ASS
0x73000100;TM_FUNNEL
0x73500000;CCSDS_IP_CORE_BRIDGE
0xFFFFFFFF;NO_OBJECT
diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp
index cf455397..7cf4646b 100644
--- a/generators/events/translateEvents.cpp
+++ b/generators/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
- * @brief Auto-generated event translation file. Contains 201 translations.
+ * @brief Auto-generated event translation file. Contains 202 translations.
* @details
- * Generated on: 2022-05-08 13:04:56
+ * Generated on: 2022-05-12 14:08:08
*/
#include "translateEvents.h"
@@ -115,6 +115,7 @@ const char *SELF_TEST_MTM_RANGE_FAILURE_STRING = "SELF_TEST_MTM_RANGE_FAILURE";
const char *SELF_TEST_COIL_CURRENT_FAILURE_STRING = "SELF_TEST_COIL_CURRENT_FAILURE";
const char *INVALID_ERROR_BYTE_STRING = "INVALID_ERROR_BYTE";
const char *ERROR_STATE_STRING = "ERROR_STATE";
+const char *RESET_OCCURED_STRING = "RESET_OCCURED";
const char *BOOTING_FIRMWARE_FAILED_STRING = "BOOTING_FIRMWARE_FAILED";
const char *BOOTING_BOOTLOADER_FAILED_STRING = "BOOTING_BOOTLOADER_FAILED";
const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_FAILURE";
@@ -425,6 +426,8 @@ const char *translateEvents(Event event) {
return INVALID_ERROR_BYTE_STRING;
case (11801):
return ERROR_STATE_STRING;
+ case (11802):
+ return RESET_OCCURED_STRING;
case (11901):
return BOOTING_FIRMWARE_FAILED_STRING;
case (11902):
diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp
index 7a7212a3..0b7f0314 100644
--- a/generators/objects/translateObjects.cpp
+++ b/generators/objects/translateObjects.cpp
@@ -1,8 +1,8 @@
/**
* @brief Auto-generated object translation file.
* @details
- * Contains 127 translations.
- * Generated on: 2022-05-08 13:04:56
+ * Contains 129 translations.
+ * Generated on: 2022-05-12 14:08:08
*/
#include "translateObjects.h"
@@ -77,7 +77,8 @@ const char *RTD_15_IC18_IMTQ_STRING = "RTD_15_IC18_IMTQ";
const char *SYRLINKS_HK_HANDLER_STRING = "SYRLINKS_HK_HANDLER";
const char *ARDUINO_COM_IF_STRING = "ARDUINO_COM_IF";
const char *GPIO_IF_STRING = "GPIO_IF";
-const char *SPI_COM_IF_STRING = "SPI_COM_IF";
+const char *SPI_MAIN_COM_IF_STRING = "SPI_MAIN_COM_IF";
+const char *SPI_RW_COM_IF_STRING = "SPI_RW_COM_IF";
const char *UART_COM_IF_STRING = "UART_COM_IF";
const char *I2C_COM_IF_STRING = "I2C_COM_IF";
const char *CSP_COM_IF_STRING = "CSP_COM_IF";
@@ -119,10 +120,10 @@ const char *DUMMY_HANDLER_STRING = "DUMMY_HANDLER";
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST";
const char *TEST_TASK_STRING = "TEST_TASK";
-const char *HEATER_0_OBC_BRD_STRING = "HEATER_0_OBC_BRD";
-const char *HEATER_1_PLOC_PROC_BRD_STRING = "HEATER_1_PLOC_PROC_BRD";
+const char *HEATER_0_PLOC_PROC_BRD_STRING = "HEATER_0_PLOC_PROC_BRD";
+const char *HEATER_1_PCDU_BRD_STRING = "HEATER_1_PCDU_BRD";
const char *HEATER_2_ACS_BRD_STRING = "HEATER_2_ACS_BRD";
-const char *HEATER_3_PCDU_BRD_STRING = "HEATER_3_PCDU_BRD";
+const char *HEATER_3_OBC_BRD_STRING = "HEATER_3_OBC_BRD";
const char *HEATER_4_CAMERA_STRING = "HEATER_4_CAMERA";
const char *HEATER_5_STR_STRING = "HEATER_5_STR";
const char *HEATER_6_DRO_STRING = "HEATER_6_DRO";
@@ -130,6 +131,7 @@ const char *HEATER_7_HPA_STRING = "HEATER_7_HPA";
const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS";
const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS";
const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS";
+const char *RW_ASS_STRING = "RW_ASS";
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
const char *NO_OBJECT_STRING = "NO_OBJECT";
@@ -279,7 +281,9 @@ const char *translateObject(object_id_t object) {
case 0x49010005:
return GPIO_IF_STRING;
case 0x49020004:
- return SPI_COM_IF_STRING;
+ return SPI_MAIN_COM_IF_STRING;
+ case 0x49020005:
+ return SPI_RW_COM_IF_STRING;
case 0x49030003:
return UART_COM_IF_STRING;
case 0x49040002:
@@ -363,13 +367,13 @@ const char *translateObject(object_id_t object) {
case 0x54694269:
return TEST_TASK_STRING;
case 0x60000000:
- return HEATER_0_OBC_BRD_STRING;
+ return HEATER_0_PLOC_PROC_BRD_STRING;
case 0x60000001:
- return HEATER_1_PLOC_PROC_BRD_STRING;
+ return HEATER_1_PCDU_BRD_STRING;
case 0x60000002:
return HEATER_2_ACS_BRD_STRING;
case 0x60000003:
- return HEATER_3_PCDU_BRD_STRING;
+ return HEATER_3_OBC_BRD_STRING;
case 0x60000004:
return HEATER_4_CAMERA_STRING;
case 0x60000005:
@@ -384,6 +388,8 @@ const char *translateObject(object_id_t object) {
return SUS_BOARD_ASS_STRING;
case 0x73000003:
return TCS_BOARD_ASS_STRING;
+ case 0x73000004:
+ return RW_ASS_STRING;
case 0x73000100:
return TM_FUNNEL_STRING;
case 0x73500000:
diff --git a/linux/ObjectFactory.cpp b/linux/ObjectFactory.cpp
index fcf1f81f..269b0f79 100644
--- a/linux/ObjectFactory.cpp
+++ b/linux/ObjectFactory.cpp
@@ -62,104 +62,103 @@ void ObjectFactory::createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiCo
&gpioCallbacks::spiCsDecoderCallback, gpioComIF);
gpioCookieSus->addGpio(gpioIds::CS_SUS_11, susgpio);
- gpioComIF->addGpios(gpioCookieSus);
+ gpioChecker(gpioComIF->addGpios(gpioCookieSus), "Sun Sensors");
#if OBSW_ADD_SUN_SENSORS == 1
SusFdir* fdir = nullptr;
std::array susHandlers = {};
- SpiCookie* spiCookie =
- new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, spiDev, SUS::MAX_CMD_SIZE,
- spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
+ SpiCookie* spiCookie = new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, SUS::MAX_CMD_SIZE,
+ spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[0] =
- new SusHandler(objects::SUS_0_N_LOC_XFYFZM_PT_XF, 0, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_0_N_LOC_XFYFZM_PT_XF, 0, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_0_N_LOC_XFYFZM_PT_XF);
susHandlers[0]->setParent(objects::SUS_BOARD_ASS);
susHandlers[0]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[1] =
- new SusHandler(objects::SUS_1_N_LOC_XBYFZM_PT_XB, 1, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_1_N_LOC_XBYFZM_PT_XB, 1, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_1_N_LOC_XBYFZM_PT_XB);
susHandlers[1]->setParent(objects::SUS_BOARD_ASS);
susHandlers[1]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[2] =
- new SusHandler(objects::SUS_2_N_LOC_XFYBZB_PT_YB, 2, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_2_N_LOC_XFYBZB_PT_YB, 2, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_2_N_LOC_XFYBZB_PT_YB);
susHandlers[2]->setParent(objects::SUS_BOARD_ASS);
susHandlers[2]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[3] =
- new SusHandler(objects::SUS_3_N_LOC_XFYBZF_PT_YF, 3, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_3_N_LOC_XFYBZF_PT_YF, 3, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_3_N_LOC_XFYBZF_PT_YF);
susHandlers[3]->setParent(objects::SUS_BOARD_ASS);
susHandlers[3]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[4] =
- new SusHandler(objects::SUS_4_N_LOC_XMYFZF_PT_ZF, 4, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_4_N_LOC_XMYFZF_PT_ZF, 4, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_4_N_LOC_XMYFZF_PT_ZF);
susHandlers[4]->setParent(objects::SUS_BOARD_ASS);
susHandlers[4]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[5] =
- new SusHandler(objects::SUS_5_N_LOC_XFYMZB_PT_ZB, 5, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_5_N_LOC_XFYMZB_PT_ZB, 5, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_5_N_LOC_XFYMZB_PT_ZB);
susHandlers[5]->setParent(objects::SUS_BOARD_ASS);
susHandlers[5]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[6] =
- new SusHandler(objects::SUS_6_R_LOC_XFYBZM_PT_XF, 6, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_6_R_LOC_XFYBZM_PT_XF, 6, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_6_R_LOC_XFYBZM_PT_XF);
susHandlers[6]->setParent(objects::SUS_BOARD_ASS);
susHandlers[6]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[7] =
- new SusHandler(objects::SUS_7_R_LOC_XBYBZM_PT_XB, 7, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_7_R_LOC_XBYBZM_PT_XB, 7, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_7_R_LOC_XBYBZM_PT_XB);
susHandlers[7]->setParent(objects::SUS_BOARD_ASS);
susHandlers[7]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[8] =
- new SusHandler(objects::SUS_8_R_LOC_XBYBZB_PT_YB, 8, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_8_R_LOC_XBYBZB_PT_YB, 8, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_8_R_LOC_XBYBZB_PT_YB);
susHandlers[8]->setParent(objects::SUS_BOARD_ASS);
susHandlers[8]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[9] =
- new SusHandler(objects::SUS_9_R_LOC_XBYBZB_PT_YF, 9, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_9_R_LOC_XBYBZB_PT_YF, 9, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_9_R_LOC_XBYBZB_PT_YF);
susHandlers[9]->setParent(objects::SUS_BOARD_ASS);
susHandlers[9]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[10] =
- new SusHandler(objects::SUS_10_N_LOC_XMYBZF_PT_ZF, 10, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_10_N_LOC_XMYBZF_PT_ZF, 10, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_10_N_LOC_XMYBZF_PT_ZF);
susHandlers[10]->setParent(objects::SUS_BOARD_ASS);
susHandlers[10]->setCustomFdir(fdir);
- spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, spiDev, SUS::MAX_CMD_SIZE,
+ spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, SUS::MAX_CMD_SIZE,
spi::SUS_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ);
susHandlers[11] =
- new SusHandler(objects::SUS_11_R_LOC_XBYMZB_PT_ZB, 11, objects::SPI_COM_IF, spiCookie);
+ new SusHandler(objects::SUS_11_R_LOC_XBYMZB_PT_ZB, 11, objects::SPI_MAIN_COM_IF, spiCookie);
fdir = new SusFdir(objects::SUS_11_R_LOC_XBYMZB_PT_ZB);
susHandlers[11]->setParent(objects::SUS_BOARD_ASS);
susHandlers[11]->setCustomFdir(fdir);
@@ -243,7 +242,7 @@ void ObjectFactory::createRtdComponents(std::string spiDev, GpioIF* gpioComIF,
&gpioCallbacks::spiCsDecoderCallback, gpioComIF);
rtdGpioCookie->addGpio(gpioIds::RTD_IC_18, gpioRtdIc15);
- gpioComIF->addGpios(rtdGpioCookie);
+ gpioChecker(gpioComIF->addGpios(rtdGpioCookie), "RTDs");
#if OBSW_ADD_RTD_DEVICES == 1
static constexpr uint8_t NUMBER_RTDS = 16;
@@ -286,9 +285,9 @@ void ObjectFactory::createRtdComponents(std::string spiDev, GpioIF* gpioComIF,
RtdFdir* rtdFdir = nullptr;
for (uint8_t idx = 0; idx < NUMBER_RTDS; idx++) {
rtdCookies[idx] =
- new SpiCookie(cookieArgs[idx].first, cookieArgs[idx].second, spiDev,
+ new SpiCookie(cookieArgs[idx].first, cookieArgs[idx].second,
Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED);
- rtds[idx] = new Max31865PT1000Handler(rtdIds[idx], objects::SPI_COM_IF, rtdCookies[idx]);
+ rtds[idx] = new Max31865PT1000Handler(rtdIds[idx], objects::SPI_MAIN_COM_IF, rtdCookies[idx]);
rtds[idx]->setParent(objects::TCS_BOARD_ASS);
rtdFdir = new RtdFdir(rtdIds[idx]);
rtds[idx]->setCustomFdir(rtdFdir);
@@ -313,3 +312,9 @@ void ObjectFactory::createRtdComponents(std::string spiDev, GpioIF* gpioComIF,
static_cast(tcsBoardAss);
#endif // OBSW_ADD_RTD_DEVICES == 1
}
+
+void ObjectFactory::gpioChecker(ReturnValue_t result, std::string output) {
+ if (result != HasReturnvaluesIF::RETURN_OK) {
+ sif::error << "ObjectFactory: Adding GPIOs failed for " << output << std::endl;
+ }
+}
diff --git a/linux/ObjectFactory.h b/linux/ObjectFactory.h
index d918115f..0ba78360 100644
--- a/linux/ObjectFactory.h
+++ b/linux/ObjectFactory.h
@@ -1,5 +1,7 @@
#pragma once
+#include
+
#include
class GpioIF;
@@ -12,4 +14,6 @@ void createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitc
std::string spiDev);
void createRtdComponents(std::string spiDev, GpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
+void gpioChecker(ReturnValue_t result, std::string output);
+
} // namespace ObjectFactory
diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp
index cf455397..7cf4646b 100644
--- a/linux/fsfwconfig/events/translateEvents.cpp
+++ b/linux/fsfwconfig/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
- * @brief Auto-generated event translation file. Contains 201 translations.
+ * @brief Auto-generated event translation file. Contains 202 translations.
* @details
- * Generated on: 2022-05-08 13:04:56
+ * Generated on: 2022-05-12 14:08:08
*/
#include "translateEvents.h"
@@ -115,6 +115,7 @@ const char *SELF_TEST_MTM_RANGE_FAILURE_STRING = "SELF_TEST_MTM_RANGE_FAILURE";
const char *SELF_TEST_COIL_CURRENT_FAILURE_STRING = "SELF_TEST_COIL_CURRENT_FAILURE";
const char *INVALID_ERROR_BYTE_STRING = "INVALID_ERROR_BYTE";
const char *ERROR_STATE_STRING = "ERROR_STATE";
+const char *RESET_OCCURED_STRING = "RESET_OCCURED";
const char *BOOTING_FIRMWARE_FAILED_STRING = "BOOTING_FIRMWARE_FAILED";
const char *BOOTING_BOOTLOADER_FAILED_STRING = "BOOTING_BOOTLOADER_FAILED";
const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_FAILURE";
@@ -425,6 +426,8 @@ const char *translateEvents(Event event) {
return INVALID_ERROR_BYTE_STRING;
case (11801):
return ERROR_STATE_STRING;
+ case (11802):
+ return RESET_OCCURED_STRING;
case (11901):
return BOOTING_FIRMWARE_FAILED_STRING;
case (11902):
diff --git a/linux/fsfwconfig/objects/systemObjectList.h b/linux/fsfwconfig/objects/systemObjectList.h
index cf5b7423..57c63863 100644
--- a/linux/fsfwconfig/objects/systemObjectList.h
+++ b/linux/fsfwconfig/objects/systemObjectList.h
@@ -47,8 +47,9 @@ enum sourceObjects : uint32_t {
CSP_COM_IF = 0x49050001,
I2C_COM_IF = 0x49040002,
UART_COM_IF = 0x49030003,
- SPI_COM_IF = 0x49020004,
+ SPI_MAIN_COM_IF = 0x49020004,
GPIO_IF = 0x49010005,
+ SPI_RW_COM_IF = 0x49020005,
/* 0x54 ('T') for test handlers */
TEST_TASK = 0x54694269,
diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp
index 7a7212a3..0b7f0314 100644
--- a/linux/fsfwconfig/objects/translateObjects.cpp
+++ b/linux/fsfwconfig/objects/translateObjects.cpp
@@ -1,8 +1,8 @@
/**
* @brief Auto-generated object translation file.
* @details
- * Contains 127 translations.
- * Generated on: 2022-05-08 13:04:56
+ * Contains 129 translations.
+ * Generated on: 2022-05-12 14:08:08
*/
#include "translateObjects.h"
@@ -77,7 +77,8 @@ const char *RTD_15_IC18_IMTQ_STRING = "RTD_15_IC18_IMTQ";
const char *SYRLINKS_HK_HANDLER_STRING = "SYRLINKS_HK_HANDLER";
const char *ARDUINO_COM_IF_STRING = "ARDUINO_COM_IF";
const char *GPIO_IF_STRING = "GPIO_IF";
-const char *SPI_COM_IF_STRING = "SPI_COM_IF";
+const char *SPI_MAIN_COM_IF_STRING = "SPI_MAIN_COM_IF";
+const char *SPI_RW_COM_IF_STRING = "SPI_RW_COM_IF";
const char *UART_COM_IF_STRING = "UART_COM_IF";
const char *I2C_COM_IF_STRING = "I2C_COM_IF";
const char *CSP_COM_IF_STRING = "CSP_COM_IF";
@@ -119,10 +120,10 @@ const char *DUMMY_HANDLER_STRING = "DUMMY_HANDLER";
const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE";
const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST";
const char *TEST_TASK_STRING = "TEST_TASK";
-const char *HEATER_0_OBC_BRD_STRING = "HEATER_0_OBC_BRD";
-const char *HEATER_1_PLOC_PROC_BRD_STRING = "HEATER_1_PLOC_PROC_BRD";
+const char *HEATER_0_PLOC_PROC_BRD_STRING = "HEATER_0_PLOC_PROC_BRD";
+const char *HEATER_1_PCDU_BRD_STRING = "HEATER_1_PCDU_BRD";
const char *HEATER_2_ACS_BRD_STRING = "HEATER_2_ACS_BRD";
-const char *HEATER_3_PCDU_BRD_STRING = "HEATER_3_PCDU_BRD";
+const char *HEATER_3_OBC_BRD_STRING = "HEATER_3_OBC_BRD";
const char *HEATER_4_CAMERA_STRING = "HEATER_4_CAMERA";
const char *HEATER_5_STR_STRING = "HEATER_5_STR";
const char *HEATER_6_DRO_STRING = "HEATER_6_DRO";
@@ -130,6 +131,7 @@ const char *HEATER_7_HPA_STRING = "HEATER_7_HPA";
const char *ACS_BOARD_ASS_STRING = "ACS_BOARD_ASS";
const char *SUS_BOARD_ASS_STRING = "SUS_BOARD_ASS";
const char *TCS_BOARD_ASS_STRING = "TCS_BOARD_ASS";
+const char *RW_ASS_STRING = "RW_ASS";
const char *TM_FUNNEL_STRING = "TM_FUNNEL";
const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE";
const char *NO_OBJECT_STRING = "NO_OBJECT";
@@ -279,7 +281,9 @@ const char *translateObject(object_id_t object) {
case 0x49010005:
return GPIO_IF_STRING;
case 0x49020004:
- return SPI_COM_IF_STRING;
+ return SPI_MAIN_COM_IF_STRING;
+ case 0x49020005:
+ return SPI_RW_COM_IF_STRING;
case 0x49030003:
return UART_COM_IF_STRING;
case 0x49040002:
@@ -363,13 +367,13 @@ const char *translateObject(object_id_t object) {
case 0x54694269:
return TEST_TASK_STRING;
case 0x60000000:
- return HEATER_0_OBC_BRD_STRING;
+ return HEATER_0_PLOC_PROC_BRD_STRING;
case 0x60000001:
- return HEATER_1_PLOC_PROC_BRD_STRING;
+ return HEATER_1_PCDU_BRD_STRING;
case 0x60000002:
return HEATER_2_ACS_BRD_STRING;
case 0x60000003:
- return HEATER_3_PCDU_BRD_STRING;
+ return HEATER_3_OBC_BRD_STRING;
case 0x60000004:
return HEATER_4_CAMERA_STRING;
case 0x60000005:
@@ -384,6 +388,8 @@ const char *translateObject(object_id_t object) {
return SUS_BOARD_ASS_STRING;
case 0x73000003:
return TCS_BOARD_ASS_STRING;
+ case 0x73000004:
+ return RW_ASS_STRING;
case 0x73000100:
return TM_FUNNEL_STRING;
case 0x73500000:
diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
index 6df7a2e4..05de8cf3 100644
--- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
+++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
@@ -29,6 +29,36 @@ ReturnValue_t pst::pstGpio(FixedTimeslotTaskIF *thisSequence) {
return HasReturnvaluesIF::RETURN_FAILED;
}
+ReturnValue_t pst::pstSpiRw(FixedTimeslotTaskIF *thisSequence) {
+ uint32_t length = thisSequence->getPeriodMs();
+ static_cast(length);
+ thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
+ thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
+ thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
+ thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
+
+ thisSequence->addSlot(objects::RW1, length * 0.2, DeviceHandlerIF::SEND_WRITE);
+ thisSequence->addSlot(objects::RW2, length * 0.2, DeviceHandlerIF::SEND_WRITE);
+ thisSequence->addSlot(objects::RW3, length * 0.2, DeviceHandlerIF::SEND_WRITE);
+ thisSequence->addSlot(objects::RW4, length * 0.2, DeviceHandlerIF::SEND_WRITE);
+
+ thisSequence->addSlot(objects::RW1, length * 0.8, DeviceHandlerIF::GET_WRITE);
+ thisSequence->addSlot(objects::RW2, length * 0.8, DeviceHandlerIF::GET_WRITE);
+ thisSequence->addSlot(objects::RW3, length * 0.8, DeviceHandlerIF::GET_WRITE);
+ thisSequence->addSlot(objects::RW4, length * 0.8, DeviceHandlerIF::GET_WRITE);
+
+ thisSequence->addSlot(objects::RW1, length * 0.8, DeviceHandlerIF::SEND_READ);
+ thisSequence->addSlot(objects::RW2, length * 0.8, DeviceHandlerIF::SEND_READ);
+ thisSequence->addSlot(objects::RW3, length * 0.8, DeviceHandlerIF::SEND_READ);
+ thisSequence->addSlot(objects::RW4, length * 0.8, DeviceHandlerIF::SEND_READ);
+
+ thisSequence->addSlot(objects::RW1, length * 0.8, DeviceHandlerIF::GET_READ);
+ thisSequence->addSlot(objects::RW2, length * 0.8, DeviceHandlerIF::GET_READ);
+ thisSequence->addSlot(objects::RW3, length * 0.8, DeviceHandlerIF::GET_READ);
+ thisSequence->addSlot(objects::RW4, length * 0.8, DeviceHandlerIF::GET_READ);
+ return thisSequence->checkSequence();
+}
+
ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) {
uint32_t length = thisSequence->getPeriodMs();
static_cast(length);
@@ -452,32 +482,6 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) {
}
#endif /* OBSW_ADD_SUN_SENSORS == 1 */
-#if OBSW_ADD_RW == 1
- thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- thisSequence->addSlot(objects::RW1, length * 0.2, DeviceHandlerIF::SEND_WRITE);
- thisSequence->addSlot(objects::RW1, length * 0.5, DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW1, length * 0.65, DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW1, length * 0.8, DeviceHandlerIF::GET_READ);
-
- thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- thisSequence->addSlot(objects::RW2, length * 0.2, DeviceHandlerIF::SEND_WRITE);
- thisSequence->addSlot(objects::RW2, length * 0.5, DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW2, length * 0.65, DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW2, length * 0.8, DeviceHandlerIF::GET_READ);
-
- thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- thisSequence->addSlot(objects::RW3, length * 0.2, DeviceHandlerIF::SEND_WRITE);
- thisSequence->addSlot(objects::RW3, length * 0.5, DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW3, length * 0.65, DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW3, length * 0.8, DeviceHandlerIF::GET_READ);
-
- thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- thisSequence->addSlot(objects::RW4, length * 0.2, DeviceHandlerIF::SEND_WRITE);
- thisSequence->addSlot(objects::RW4, length * 0.5, DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW4, length * 0.65, DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW4, length * 0.8, DeviceHandlerIF::GET_READ);
-#endif
-
#if OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1
bool enableAside = true;
bool enableBside = true;
diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.h b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.h
index 19c86e52..03b0afb5 100644
--- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.h
+++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.h
@@ -46,6 +46,8 @@ ReturnValue_t pstUart(FixedTimeslotTaskIF* thisSequence);
ReturnValue_t pstSpi(FixedTimeslotTaskIF* thisSequence);
+ReturnValue_t pstSpiRw(FixedTimeslotTaskIF* thisSequence);
+
ReturnValue_t pstI2c(FixedTimeslotTaskIF* thisSequence);
/**
diff --git a/linux/obc/PdecHandler.cpp b/linux/obc/PdecHandler.cpp
index 48816512..4c8beeed 100644
--- a/linux/obc/PdecHandler.cpp
+++ b/linux/obc/PdecHandler.cpp
@@ -6,7 +6,6 @@
#include
#include
-#include "OBSWConfig.h"
#include "fsfw/ipc/QueueFactory.h"
#include "fsfw/objectmanager/ObjectManager.h"
#include "fsfw/serviceinterface/ServiceInterface.h"
diff --git a/misc/eclipse/.cproject b/misc/eclipse/.cproject
index 4c345a2d..f40535b7 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 @@
-
+
@@ -418,7 +418,7 @@
-
+
@@ -580,7 +580,7 @@
-
+
@@ -687,7 +687,8 @@
-
+
+
@@ -699,7 +700,8 @@
-
+
+
@@ -868,6 +871,7 @@
+