added command to list directory into file
This commit is contained in:
parent
81ac5a3b2c
commit
5c01401042
@ -724,7 +724,7 @@ EIVE implementation
|
||||
### SD Cards
|
||||
|
||||
- Folder `bin` for binaries, for example the OBSW
|
||||
- Folder `misc` for miscellaneous files
|
||||
- Folder `misc` for miscellaneous files. Contains `ls` for directory listings
|
||||
- Folder `tc` for telecommands
|
||||
- Folder `tm` for telemetry
|
||||
- Folder `xdi` for XDI components (e.g. for firmware or device tree updates)
|
||||
|
@ -109,6 +109,59 @@ ReturnValue_t CoreController::sdCardSetup(SdCardManager& sdcMan,
|
||||
}
|
||||
}
|
||||
|
||||
ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
|
||||
const uint8_t *data, size_t size) {
|
||||
switch(actionId) {
|
||||
case(LIST_DIRECTORY_INTO_FILE): {
|
||||
// TODO: Packet definition for clean deserialization
|
||||
// Two bytes for a and R flag, at least 5 bytes for minimum valid path /tmp with
|
||||
// null termination
|
||||
if(size < 7) {
|
||||
return HasActionsIF::INVALID_PARAMETERS;
|
||||
}
|
||||
// This flag specifies to run ls with -a
|
||||
bool aFlag = data[0];
|
||||
data += 1;
|
||||
// This flag specifies to run ls with -R
|
||||
bool RFlag = data[1];
|
||||
data += 1;
|
||||
|
||||
size_t remainingSize = size - 2;
|
||||
// One larger for null termination, which prevents undefined behaviour if the sent
|
||||
// string is not 0 terminated
|
||||
std::vector<uint8_t> repoAndTargetFileBuffer(remainingSize + 1, 0);
|
||||
std::memcpy(repoAndTargetFileBuffer.data(), data, remainingSize);
|
||||
const char* currentCharPtr = reinterpret_cast<const char*>(repoAndTargetFileBuffer.data());
|
||||
// Full target file name
|
||||
std::string repoName(currentCharPtr);
|
||||
size_t repoLength = repoName.length();
|
||||
// The other string needs to be at least one letter plus NULL termination to be valid at all
|
||||
// The first string also needs to be NULL terminated, but the termination is not included
|
||||
// in the string length, so this is subtracted from the remaining size as well
|
||||
if(repoLength > remainingSize - 3) {
|
||||
return HasActionsIF::INVALID_PARAMETERS;
|
||||
}
|
||||
// The file length will not include the NULL termination, so we skip it
|
||||
currentCharPtr += repoLength + 1;
|
||||
std::string targetFileName(currentCharPtr);
|
||||
std::ostringstream oss;
|
||||
oss << "ls -l";
|
||||
if(aFlag) {
|
||||
oss << "a";
|
||||
}
|
||||
if(RFlag) {
|
||||
oss << "R";
|
||||
}
|
||||
oss << " " << repoName << " > " << targetFileName;
|
||||
std::system(oss.str().c_str());
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
}
|
||||
default: {
|
||||
return HasActionsIF::INVALID_ACTION_ID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ReturnValue_t CoreController::sdCardColdRedundantInit(SdCardManager* sdcMan,
|
||||
SdCardManager::SdStatusPair& statusPair) {
|
||||
sd::SdCard preferredSdCard = sd::SdCard::SLOT_0;
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
class CoreController: public ExtendedControllerBase {
|
||||
public:
|
||||
static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0;
|
||||
|
||||
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE;
|
||||
|
||||
static constexpr Event ALLOC_FAILURE = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM);
|
||||
@ -16,6 +18,9 @@ public:
|
||||
|
||||
ReturnValue_t initialize() override;
|
||||
|
||||
ReturnValue_t executeAction(ActionId_t actionId,
|
||||
MessageQueueId_t commandedBy, const uint8_t *data, size_t size) override;
|
||||
|
||||
ReturnValue_t handleCommandMessage(CommandMessage *message) override;
|
||||
void performControlOperation() override;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user