#include "SdCardManager.h" #include "fsfw/ipc/MutexFactory.h" #include "fsfw/serviceinterface/ServiceInterface.h" #include #include SdCardManager* SdCardManager::factoryInstance = nullptr; SdCardManager::SdCardManager() { } SdCardManager::~SdCardManager() { } void SdCardManager::create() { if(factoryInstance == nullptr) { factoryInstance = new SdCardManager(); } } SdCardManager* SdCardManager::instance() { SdCardManager::create(); return SdCardManager::factoryInstance; } ReturnValue_t SdCardManager::switchOnSdCard(sd::SdCard sdCard) { if(sdCardActive(sdCard)) { return ALREADY_ON; } return HasReturnvaluesIF::RETURN_OK; } ReturnValue_t SdCardManager::switchOffSdCard(sd::SdCard sdCard) { return HasReturnvaluesIF::RETURN_OK; } bool SdCardManager::sdCardActive(sd::SdCard sdCard) { using namespace std; if(not filesystem::exists("/tmp/sd_status.txt")) { ReturnValue_t result = updateSdCardStateFile(); if(result != HasReturnvaluesIF::RETURN_OK) { return result; } } // Now the file should exist in any case. Still check whether it exists. fstream sdStatus("/tmp/sd_status.txt"); if (not sdStatus.good()) { return false; } string line; uint8_t idx = 0; while (std::getline(sdStatus, line)) { istringstream iss(line); string word; if((sdCard == sd::SdCard::SLOT_0 and idx == 0) or (sdCard == sd::SdCard::SLOT_1 and idx == 1)) { while(iss >> word) { if(word == "on") { return true; } else { return false; } } } idx++; } return HasReturnvaluesIF::RETURN_OK; return false; } sd::SdCard SdCardManager::getPreferredSdCard() const { return preferredSdCard; } void SdCardManager::setPreferredSdCard(sd::SdCard sdCard) { preferredSdCard = sdCard; } ReturnValue_t SdCardManager::updateSdCardStateFile() { int result = std::system("q7hw sd info all > /tmp/sd_status.txt"); if(result == 0) { return HasReturnvaluesIF::RETURN_OK; } sif::warning << "SdCardManager::updateSdCardStateFile: system call failed with code " << result << std::endl; return HasReturnvaluesIF::RETURN_FAILED; }