#ifndef BSP_Q7S_MEMORY_SCRATCHAPI_H_ #define BSP_Q7S_MEMORY_SCRATCHAPI_H_ #include "fsfw/returnvalues/HasReturnvaluesIF.h" #include "fsfw/serviceinterface/ServiceInterface.h" #include "linux/utility/utility.h" #include "returnvalues/classIds.h" #include #include #include #include #include /** * @brief API for the scratch buffer */ namespace scratch { static constexpr char PREFERED_SDC_KEY[] = "PREFSD"; static constexpr uint8_t INTERFACE_ID = CLASS_ID::SCRATCH_BUFFER; static constexpr ReturnValue_t KEY_NOT_FOUND = HasReturnvaluesIF::makeReturnCode(INTERFACE_ID, 0); namespace { static uint8_t counter = 0; } template::value>::type> inline ReturnValue_t writeNumber(std::string name, T num) noexcept { std::ostringstream oss; oss << "xsc_scratch write " << name << " " << std::to_string(num); int result = std::system(oss.str().c_str()); if(result != 0) { utility::handleSystemError(result, "scratch::writeNumber"); return HasReturnvaluesIF::RETURN_FAILED; } return HasReturnvaluesIF::RETURN_OK; } template::value>::type> inline ReturnValue_t readNumber(std::string name, T& num) noexcept { using namespace std; string filename = "/tmp/sro" + std::to_string(counter++); ostringstream oss; oss << "xsc_scratch read " << name << " > " << filename; int result = std::system(oss.str().c_str()); if(result != 0) { if(result == 256) { sif::warning << "scratch::readNumber: Key " << name << " does not exist" << std::endl; // Could not find value std::remove(filename.c_str()); return KEY_NOT_FOUND; } else { utility::handleSystemError(result, "scratch::readNumber"); std::remove(filename.c_str()); return HasReturnvaluesIF::RETURN_FAILED; } } ifstream file(filename); string line; if (not std::getline(file, line)) { return HasReturnvaluesIF::RETURN_FAILED; } size_t pos = line.find("="); if(pos == string::npos) { sif::warning << "scratch::readNumber: Output file format invalid, " "no \"=\" found" << std::endl; // Could not find value std::remove(filename.c_str()); return KEY_NOT_FOUND; } std::string valueAsString = line.substr(pos + 1); try { num = std::stoi(valueAsString); } catch(std::invalid_argument& e) { sif::warning << "scratch::readNumber: stoi call failed with " << e.what() << std::endl; } std::remove(filename.c_str()); return HasReturnvaluesIF::RETURN_OK; } ReturnValue_t writeString(std::string name, std::string string); } #endif /* BSP_Q7S_MEMORY_SCRATCHAPI_H_ */