2022-10-24 10:14:58 +02:00
|
|
|
#include "Service15TmStorage.h"
|
|
|
|
|
2022-12-14 13:51:24 +01:00
|
|
|
#include <fsfw/objectmanager/ObjectManager.h>
|
|
|
|
#include <fsfw/tmstorage/TmStoreFrontendSimpleIF.h>
|
|
|
|
|
|
|
|
#include "eive/objects.h"
|
2022-12-14 15:41:20 +01:00
|
|
|
#include "fsfw/tmstorage/TmStoreMessage.h"
|
2022-12-14 13:51:24 +01:00
|
|
|
|
2022-10-24 10:26:00 +02:00
|
|
|
using namespace returnvalue;
|
2022-10-24 10:14:58 +02:00
|
|
|
|
2022-10-24 10:26:00 +02:00
|
|
|
Service15TmStorage::Service15TmStorage(object_id_t objectId, uint16_t apid,
|
|
|
|
uint8_t numParallelCommands, uint16_t commandTimeoutSecs,
|
|
|
|
size_t queueDepth)
|
|
|
|
: CommandingServiceBase(objectId, apid, "PUS Service 15", 15, numParallelCommands,
|
|
|
|
commandTimeoutSecs, queueDepth) {}
|
|
|
|
|
2022-12-14 11:29:32 +01:00
|
|
|
ReturnValue_t Service15TmStorage::isValidSubservice(uint8_t subservice) {
|
|
|
|
switch (subservice) {
|
2023-11-15 15:21:00 +01:00
|
|
|
case (Subservice::DELETE_UP_TO):
|
2023-11-16 11:01:56 +01:00
|
|
|
case (Subservice::DELETE_BY_TIME_RANGE):
|
2023-11-15 15:21:00 +01:00
|
|
|
case (Subservice::START_BY_TIME_RANGE_RETRIEVAL): {
|
2022-12-14 13:19:14 +01:00
|
|
|
return OK;
|
|
|
|
}
|
2023-02-20 16:12:56 +01:00
|
|
|
default: {
|
|
|
|
return FAILED;
|
2022-12-14 13:19:14 +01:00
|
|
|
}
|
2022-12-14 11:29:32 +01:00
|
|
|
}
|
|
|
|
}
|
2022-10-24 10:26:00 +02:00
|
|
|
|
|
|
|
ReturnValue_t Service15TmStorage::getMessageQueueAndObject(uint8_t subservice,
|
|
|
|
const uint8_t *tcData, size_t tcDataLen,
|
|
|
|
MessageQueueId_t *id,
|
|
|
|
object_id_t *objectId) {
|
2023-02-21 20:43:16 +01:00
|
|
|
if (tcDataLen < 4) {
|
|
|
|
return CommandingServiceBase::INVALID_TC;
|
2022-12-14 13:51:24 +01:00
|
|
|
}
|
2023-02-21 20:43:16 +01:00
|
|
|
SerializeAdapter::deSerialize(objectId, &tcData, &tcDataLen, SerializeIF::Endianness::NETWORK);
|
2022-12-14 13:51:24 +01:00
|
|
|
auto *frontendIF = ObjectManager::instance()->get<TmStoreFrontendSimpleIF>(*objectId);
|
|
|
|
if (frontendIF == nullptr) {
|
2023-02-24 18:22:36 +01:00
|
|
|
return CommandingServiceBase::INVALID_OBJECT;
|
2022-12-14 13:51:24 +01:00
|
|
|
}
|
|
|
|
*id = frontendIF->getCommandQueue();
|
2022-10-24 10:26:00 +02:00
|
|
|
return OK;
|
2022-10-24 10:14:58 +02:00
|
|
|
}
|
|
|
|
|
2022-10-24 10:26:00 +02:00
|
|
|
ReturnValue_t Service15TmStorage::prepareCommand(CommandMessage *message, uint8_t subservice,
|
|
|
|
const uint8_t *tcData, size_t tcDataLen,
|
|
|
|
uint32_t *state, object_id_t objectId) {
|
2023-11-15 15:21:00 +01:00
|
|
|
switch (subservice) {
|
|
|
|
case (Subservice::START_BY_TIME_RANGE_RETRIEVAL): {
|
|
|
|
// TODO: Hardcoded to UNIX timestamps.. Should allow arbitrary timestamp and let receiver
|
|
|
|
// to time reading and reply handling
|
|
|
|
if (tcDataLen != 12) {
|
|
|
|
return INVALID_TC;
|
|
|
|
}
|
|
|
|
store_address_t storeId;
|
|
|
|
ReturnValue_t result = ipcStore->addData(&storeId, tcData + 4, tcDataLen - 4);
|
|
|
|
if (result != OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
// Store timestamps
|
|
|
|
TmStoreMessage::setDownlinkContentTimeMessage(message, storeId);
|
|
|
|
return CommandingServiceBase::EXECUTION_COMPLETE;
|
2022-12-14 15:41:20 +01:00
|
|
|
}
|
2023-11-15 15:21:00 +01:00
|
|
|
case (Subservice::DELETE_UP_TO): {
|
|
|
|
// TODO: Hardcoded to UNIX timestamps.. Should allow arbitrary timestamp and let receiver
|
|
|
|
// to time reading and reply handling
|
|
|
|
if (tcDataLen != 8) {
|
|
|
|
return INVALID_TC;
|
|
|
|
}
|
|
|
|
store_address_t storeId;
|
|
|
|
ReturnValue_t result = ipcStore->addData(&storeId, tcData + 4, tcDataLen - 4);
|
|
|
|
if (result != OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
// Store timestamps
|
|
|
|
TmStoreMessage::setDeleteContentTimeMessage(message, storeId);
|
|
|
|
return CommandingServiceBase::EXECUTION_COMPLETE;
|
2022-12-14 15:41:20 +01:00
|
|
|
}
|
2023-11-15 15:21:00 +01:00
|
|
|
case (Subservice::DELETE_BY_TIME_RANGE): {
|
|
|
|
// TODO: Hardcoded two UNIX timestamps.. Should allow arbitrary timestamp and let receiver
|
|
|
|
// to time reading and reply handling
|
|
|
|
if (tcDataLen != 12) {
|
|
|
|
return INVALID_TC;
|
|
|
|
}
|
|
|
|
store_address_t storeId;
|
|
|
|
ReturnValue_t result = ipcStore->addData(&storeId, tcData + 4, tcDataLen - 4);
|
|
|
|
if (result != OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
// Store timestamps
|
|
|
|
TmStoreMessage::setDeleteContentTimeMessage(message, storeId);
|
|
|
|
return CommandingServiceBase::EXECUTION_COMPLETE;
|
2022-12-14 15:41:20 +01:00
|
|
|
}
|
2023-11-15 15:21:00 +01:00
|
|
|
default: {
|
|
|
|
return CommandingServiceBase::INVALID_SUBSERVICE;
|
2022-12-14 15:41:20 +01:00
|
|
|
}
|
|
|
|
}
|
2022-10-24 10:26:00 +02:00
|
|
|
return OK;
|
2022-10-24 10:14:58 +02:00
|
|
|
}
|
|
|
|
|
2022-10-24 10:26:00 +02:00
|
|
|
ReturnValue_t Service15TmStorage::handleReply(const CommandMessage *reply,
|
|
|
|
Command_t previousCommand, uint32_t *state,
|
|
|
|
CommandMessage *optionalNextCommand,
|
|
|
|
object_id_t objectId, bool *isStep) {
|
|
|
|
return OK;
|
2022-10-24 10:14:58 +02:00
|
|
|
}
|