Merge pull request 'Update for memory management' (#159) from mueller/sdcman-mg into develop
Some checks failed
EIVE/eive-obsw/pipeline/head There was a failure building this commit

Reviewed-on: #159
Reviewed-by: Jakob.Meier <meierj@irs.uni-stuttgart.de>
This commit is contained in:
Jakob Meier 2022-03-04 09:55:06 +01:00
commit b6de685ea2
4 changed files with 35 additions and 7 deletions

View File

@ -1,5 +1,6 @@
#include "SdCardManager.h" #include "SdCardManager.h"
#include <fsfw/ipc/MutexGuard.h>
#include <unistd.h> #include <unistd.h>
#include <cstring> #include <cstring>
@ -15,7 +16,9 @@
SdCardManager* SdCardManager::factoryInstance = nullptr; SdCardManager* SdCardManager::factoryInstance = nullptr;
SdCardManager::SdCardManager() : SystemObject(objects::SDC_MANAGER), cmdExecutor(256) {} SdCardManager::SdCardManager() : SystemObject(objects::SDC_MANAGER), cmdExecutor(256) {
mutex = MutexFactory::instance()->createMutex();
}
SdCardManager::~SdCardManager() {} SdCardManager::~SdCardManager() {}
@ -162,6 +165,7 @@ ReturnValue_t SdCardManager::setSdCardState(sd::SdCard sdCard, bool on) {
ReturnValue_t SdCardManager::getSdCardActiveStatus(SdStatePair& active) { ReturnValue_t SdCardManager::getSdCardActiveStatus(SdStatePair& active) {
using namespace std; using namespace std;
MutexGuard mg(mutex);
if (not filesystem::exists(SD_STATE_FILE)) { if (not filesystem::exists(SD_STATE_FILE)) {
return STATUS_FILE_NEXISTS; return STATUS_FILE_NEXISTS;
} }
@ -366,6 +370,7 @@ ReturnValue_t SdCardManager::updateSdCardStateFile() {
if (cmdExecutor.getCurrentState() == CommandExecutor::States::PENDING) { if (cmdExecutor.getCurrentState() == CommandExecutor::States::PENDING) {
return CommandExecutor::COMMAND_PENDING; return CommandExecutor::COMMAND_PENDING;
} }
MutexGuard mg(mutex);
// Use q7hw utility and pipe the command output into the state file // Use q7hw utility and pipe the command output into the state file
std::string updateCmd = "q7hw sd info all > " + std::string(SD_STATE_FILE); std::string updateCmd = "q7hw sd info all > " + std::string(SD_STATE_FILE);
cmdExecutor.load(updateCmd, blocking, printCmdOutput); cmdExecutor.load(updateCmd, blocking, printCmdOutput);
@ -440,6 +445,7 @@ void SdCardManager::setPrintCommandOutput(bool print) { this->printCmdOutput = p
bool SdCardManager::isSdCardMounted(sd::SdCard sdCard) { bool SdCardManager::isSdCardMounted(sd::SdCard sdCard) {
SdCardManager::SdStatePair active; SdCardManager::SdStatePair active;
ReturnValue_t result = this->getSdCardActiveStatus(active); ReturnValue_t result = this->getSdCardActiveStatus(active);
if (result != HasReturnvaluesIF::RETURN_OK) { if (result != HasReturnvaluesIF::RETURN_OK) {
sif::debug << "SdCardManager::isSdCardMounted: Failed to get SD card active state"; sif::debug << "SdCardManager::isSdCardMounted: Failed to get SD card active state";
return false; return false;

View File

@ -10,11 +10,12 @@
#include <string> #include <string>
#include <utility> #include <utility>
#include "definitions.h"
#include "events/subsystemIdRanges.h" #include "events/subsystemIdRanges.h"
#include "fsfw/events/Event.h" #include "fsfw/events/Event.h"
#include "fsfw/returnvalues/HasReturnvaluesIF.h" #include "fsfw/returnvalues/HasReturnvaluesIF.h"
#include "fsfw_hal/linux/CommandExecutor.h" #include "fsfw_hal/linux/CommandExecutor.h"
#include "mission/memory/SdCardMountedIF.h"
#include "mission/memory/definitions.h"
#include "returnvalues/classIds.h" #include "returnvalues/classIds.h"
class MutexIF; class MutexIF;
@ -23,10 +24,12 @@ class MutexIF;
* @brief Manages handling of SD cards like switching them on or off or getting the current * @brief Manages handling of SD cards like switching them on or off or getting the current
* state * state
*/ */
class SdCardManager : public SystemObject { class SdCardManager : public SystemObject, public SdCardMountedIF {
friend class SdCardAccess; friend class SdCardAccess;
public: public:
using mountInitCb = ReturnValue_t (*)(void* args);
enum class Operations { SWITCHING_ON, SWITCHING_OFF, MOUNTING, UNMOUNTING, IDLE }; enum class Operations { SWITCHING_ON, SWITCHING_OFF, MOUNTING, UNMOUNTING, IDLE };
enum class OpStatus { IDLE, TIMEOUT, ONGOING, SUCCESS, FAIL }; enum class OpStatus { IDLE, TIMEOUT, ONGOING, SUCCESS, FAIL };
@ -88,7 +91,7 @@ class SdCardManager : public SystemObject {
* @param sdCard * @param sdCard
* @return * @return
*/ */
ReturnValue_t getPreferredSdCard(sd::SdCard& sdCard) const; ReturnValue_t getPreferredSdCard(sd::SdCard& sdCard) const override;
/** /**
* Switch on the specified SD card. * Switch on the specified SD card.
@ -170,7 +173,7 @@ class SdCardManager : public SystemObject {
* @param prefSdCardPtr * @param prefSdCardPtr
* @return * @return
*/ */
std::string getCurrentMountPrefix(sd::SdCard prefSdCardPtr = sd::SdCard::NONE); std::string getCurrentMountPrefix(sd::SdCard prefSdCardPtr = sd::SdCard::NONE) override;
OpStatus checkCurrentOp(Operations& currentOp); OpStatus checkCurrentOp(Operations& currentOp);
@ -183,19 +186,20 @@ class SdCardManager : public SystemObject {
void setPrintCommandOutput(bool print); void setPrintCommandOutput(bool print);
/** /**
* @brief Checks if an SD card is mounted * @brief Checks if an SD card is mounted.
* *
* @param sdCard The SD card to check * @param sdCard The SD card to check
* *
* @return true if mounted, otherwise false * @return true if mounted, otherwise false
*/ */
bool isSdCardMounted(sd::SdCard sdCard); bool isSdCardMounted(sd::SdCard sdCard) override;
private: private:
CommandExecutor cmdExecutor; CommandExecutor cmdExecutor;
Operations currentOp = Operations::IDLE; Operations currentOp = Operations::IDLE;
bool blocking = false; bool blocking = false;
bool printCmdOutput = true; bool printCmdOutput = true;
MutexIF* mutex = nullptr;
SdCardManager(); SdCardManager();

View File

@ -0,0 +1,18 @@
#ifndef MISSION_MEMORY_SDCARDMOUNTERIF_H_
#define MISSION_MEMORY_SDCARDMOUNTERIF_H_
#include <string>
#include "definitions.h"
class SdCardMountedIF {
public:
virtual ~SdCardMountedIF(){};
virtual std::string getCurrentMountPrefix(sd::SdCard prefSdCardPtr = sd::SdCard::NONE) = 0;
virtual bool isSdCardMounted(sd::SdCard sdCard) = 0;
virtual ReturnValue_t getPreferredSdCard(sd::SdCard& sdCard) const = 0;
private:
};
#endif /* MISSION_MEMORY_SDCARDMOUNTERIF_H_ */