18 static_assert(std::numeric_limits<FwSizeType>::max() >= PRMDB_NUM_DB_ENTRIES,
19 "PRMDB_NUM_DB_ENTRIES must fit within range of FwSizeType");
27 WorkingBuffer() :
Fw::LinearBufferBase(m_buff, sizeof(m_buff)) {}
32 static_assert(
sizeof(m_buff) >=
sizeof(U32),
"Size of parameter buffer storage must be >= sizeof(U32)");
40 this->m_activeDb = &this->m_dbStore1;
41 this->m_stagingDb = &this->m_dbStore2;
51 this->m_fileName = file;
56 this->m_sandboxDir = directory;
81 auto success = this->m_activeDb->
find(
id, val);
109 }
else if (update_status ==
NO_SLOTS) {
116 void PrmDbImpl::pingIn_handler(
FwIndexType portNum, U32 key) {
121 void PrmDbImpl::PRM_SAVE_FILE_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
143 U32 crcInitial = 0xFFFFFFFF;
148 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
164 for (
const auto& entry : *db) {
166 static const U8 delim = PRMDB_ENTRY_DELIMITER;
167 writeSize =
static_cast<FwSizeType>(
sizeof(delim));
168 stat = paramFile.write(&delim, writeSize, Os::File::WaitType::WAIT);
175 if (writeSize !=
sizeof(delim)) {
178 static_cast<I32>(writeSize));
184 crc.
update(&delim,
sizeof(delim));
187 U32 recordSize =
static_cast<U32
>(
sizeof(
FwPrmIdType) + entry.getValue().getSize());
191 serStat = buff.serializeFrom(recordSize);
196 writeSize =
static_cast<FwSizeType>(buff.getSize());
197 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
204 if (writeSize !=
sizeof(recordSize)) {
207 static_cast<I32>(writeSize));
213 if (buff.getBuffAddr() !=
nullptr && writeSize != 0) {
214 crc.
update(buff.getBuffAddr(), writeSize);
222 serStat = buff.serializeFrom(entry.getKey());
227 writeSize =
static_cast<FwSizeType>(buff.getSize());
228 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
235 if (writeSize != static_cast<FwSizeType>(buff.getSize())) {
238 static_cast<I32>(writeSize));
244 if (buff.getBuffAddr() !=
nullptr && writeSize != 0) {
245 crc.
update(buff.getBuffAddr(), writeSize);
250 writeSize =
static_cast<FwSizeType>(entry.getValue().getSize());
251 stat = paramFile.write(entry.getValue().getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
258 if (writeSize != static_cast<FwSizeType>(entry.getValue().getSize())) {
261 static_cast<I32>(writeSize));
267 if (entry.getValue().getBuffAddr() !=
nullptr && writeSize != 0) {
268 crc.
update(entry.getValue().getBuffAddr(), writeSize);
279 stat = paramFile.position(currPosInParamFile);
287 stat = paramFile.seek(0, Os::File::SeekType::ABSOLUTE);
296 crcFinal = ~crcFinal;
297 serStat = buff.serializeFrom(crcFinal);
300 writeSize =
static_cast<FwSizeType>(buff.getSize());
302 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
310 stat = paramFile.seek(static_cast<FwSignedSizeType>(currPosInParamFile), Os::File::SeekType::ABSOLUTE);
321 void PrmDbImpl::PRM_LOAD_FILE_cmdHandler(
FwOpcodeType opCode,
324 const PrmDb_Merge& merge) {
349 if (success == PrmLoadStatus::SUCCESS) {
361 void PrmDbImpl::PRM_COMMIT_STAGED_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
371 PrmDbStore* temp = this->m_activeDb;
372 this->m_activeDb = this->m_stagingDb;
374 this->m_stagingDb = temp;
399 return this->readParamFileWork(paramFile, fileName, dbType);
402 return this->readParamFileWork(paramFile, fileName, dbType);
405 template <
typename FileType>
423 stat = paramFile.read(buff.getBuffAddr(), readSize);
429 if (readSize !=
sizeof(fileCrc)) {
438 serStat = buff.deserializeTo(fileCrc);
441 U32 crc = 0xFFFFFFFF;
450 if (fileCrc != crc) {
456 stat = paramFile.seek(
sizeof(fileCrc), Os::File::SeekType::ABSOLUTE);
463 U32 recordNumTotal = 0;
464 U32 recordNumAdded = 0;
465 U32 recordNumUpdated = 0;
466 U32 recordNumDropped = 0;
468 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
470 readSize =
static_cast<FwSizeType>(
sizeof(delimiter));
473 Os::File::Status fStat = paramFile.read(&delimiter, readSize, Os::File::WaitType::WAIT);
486 if (
sizeof(delimiter) != readSize) {
488 static_cast<I32>(readSize));
492 if (PRMDB_ENTRY_DELIMITER != delimiter) {
501 readSize =
sizeof(recordSize);
503 fStat = paramFile.read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
508 if (
sizeof(recordSize) != readSize) {
510 static_cast<I32>(readSize));
514 Fw::SerializeStatus desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
520 desStat = buff.deserializeTo(recordSize);
527 static_cast<I32>(recordSize));
535 fStat = paramFile.read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
540 if (
sizeof(parameterId) != static_cast<FwSizeType>(readSize)) {
542 static_cast<I32>(readSize));
547 desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
553 desStat = buff.deserializeTo(parameterId);
558 readSize = recordSize -
sizeof(parameterId);
559 desStat = tmpParamBuffer.
setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
561 fStat = paramFile.read(tmpParamBuffer.
getBuffAddr(), readSize);
568 if (static_cast<U32>(readSize) != recordSize -
sizeof(parameterId)) {
570 static_cast<I32>(readSize));
575 PrmUpdateType updateStatus = updateAddPrmImpl(parameterId, tmpParamBuffer, dbType);
590 if (recordNumDropped > 0) {
595 return PrmLoadStatus::SUCCESS;
599 auto* db = getDbPtr(prmDbType);
605 auto prevSize = db->getSize();
606 switch (db->insert(
id, val)) {
611 if (prevSize < db->getSize()) {
615 static_cast<FwAssertArgType>(db->getSize()));
631 void PrmDbImpl::clearDb(
PrmDbType prmDbType) {
632 getDbPtr(prmDbType)->
clear();
636 *getDbPtr(dest) = *getDbPtr(src);
640 PrmDbImpl::PrmDbStore* PrmDbImpl::getDbPtr(
PrmDbType dbType) {
void update(const void *const data, const FwSizeType len)
Serialization/Deserialization operation was successful.
Parameter already in database, updated parameter.
void configure(const char *allowedDirectory)
Configure the allowed sandbox directory.
State of parameter DB file load operations.
FwIdType FwOpcodeType
The type of a command opcode.
void pingOut_out(FwIndexType portNum, U32 key) const
Invoke output port pingOut.
PlatformSizeType FwSizeType
void log_WARNING_LO_PrmDbFileLoadInvalidAction(const Svc::PrmDb_PrmDbFileLoadState ¤tState, const Svc::PrmDb_PrmLoadAction &attemptedAction) const
void log_ACTIVITY_HI_PrmIdUpdated(FwPrmIdType Id) const
void readParamFile()
PrmDb file read function.
StringTemplate< FW_FIXED_LENGTH_STRING_SIZE > String
FwIdType FwPrmIdType
The type of a parameter identifier.
void log_WARNING_HI_PrmFileReadError(const Svc::PrmDb_PrmReadError &stage, I32 record, I32 error) const
void log_ACTIVITY_HI_PrmFileSaveComplete(U32 records) const
void log_WARNING_HI_PrmFileWriteError(const Svc::PrmDb_PrmWriteError &stage, I32 record, I32 error) const
A wrapper around Os::File that restricts file access to an allowed directory.
virtual const CHAR * toChar() const =0
Convert to a C-style char*.
Overwrite file when it exists and creation was requested.
PrmDbImpl(const char *name)
PrmDb constructor.
PrmDb_PrmDbType PrmDbType
Parameter added to database.
void log_ACTIVITY_HI_PrmFileLoadComplete(const Fw::StringBase &databaseString, U32 recordsTotal, U32 recordsAdded, U32 recordsUpdated) const
SerializeStatus
forward declaration for string
virtual void lock()
Lock the guarded mutex.
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
void log_ACTIVITY_HI_PrmDbCommitComplete() const
U8 * getBuffAddr()
Get buffer address for data filling (non-const version)
void clear() override
Clear the map.
virtual void unLock()
Unlock the guarded mutex.
void log_ACTIVITY_HI_PrmIdAdded(FwPrmIdType Id) const
A generic interface for creating and comparing hash values.
void log_ACTIVITY_HI_PrmDbCopyAllComplete(const Fw::StringBase &databaseStringSrc, const Fw::StringBase &databaseStringDest) const
const char * toChar() const
Convert to a C-style char*.
void configure(const char *file)
PrmDb configure method.
Command successfully executed.
uint8_t U8
8-bit unsigned integer
void log_WARNING_HI_PrmDbFull(FwPrmIdType Id) const
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
Auto-generated base for PrmDb component.
void configureLoadSandbox(const char *directory)
PrmDb load sandbox configure method.
Command had execution error.
void log_WARNING_LO_PrmIdNotFound(FwPrmIdType Id)
Operation was successful.
Success find(const K &key, V &value) const override
PlatformIndexType FwIndexType
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
Command failed validation.
RateGroupDivider component implementation.
virtual SizeType length() const
Get the length of the string.
Enum representing parameter validity.
Implementation of malloc based allocator.
No slots available to add new parameter.
void finalize(HashBuffer &buffer) const
virtual ~PrmDbImpl()
PrmDb destructor.
Component for managing parameters.
void log_WARNING_HI_PrmFileBadCrc(U32 readCrc, U32 compCrc) const
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.
void log_WARNING_HI_PrmDbFileLoadFailed() const