17 static_assert(std::numeric_limits<FwSizeType>::max() >= PRMDB_NUM_DB_ENTRIES,
18 "PRMDB_NUM_DB_ENTRIES must fit within range of FwSizeType");
26 FwSizeType getCapacity()
const {
return sizeof(m_buff); }
28 U8* getBuffAddr() {
return m_buff; }
30 const U8* getBuffAddr()
const {
return m_buff; }
35 static_assert(
sizeof(m_buff) >=
sizeof(U32),
"Size of parameter buffer storage must be >= sizeof(U32)");
43 this->m_activeDb = &this->m_dbStore1;
44 this->m_stagingDb = &this->m_dbStore2;
54 this->m_fileName = file;
79 auto success = this->m_activeDb->
find(
id, val);
107 }
else if (update_status ==
NO_SLOTS) {
114 void PrmDbImpl::pingIn_handler(
FwIndexType portNum, U32 key) {
119 void PrmDbImpl::PRM_SAVE_FILE_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
141 U32 crcInitial = 0xFFFFFFFF;
146 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
162 for (
const auto& entry : *db) {
164 static const U8 delim = PRMDB_ENTRY_DELIMITER;
165 writeSize =
static_cast<FwSizeType>(
sizeof(delim));
166 stat = paramFile.write(&delim, writeSize, Os::File::WaitType::WAIT);
173 if (writeSize !=
sizeof(delim)) {
176 static_cast<I32>(writeSize));
182 crc.
update(&delim,
sizeof(delim));
185 U32 recordSize =
static_cast<U32
>(
sizeof(
FwPrmIdType) + entry.getValue().getSize());
189 serStat = buff.serializeFrom(recordSize);
194 writeSize =
static_cast<FwSizeType>(buff.getSize());
195 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
202 if (writeSize !=
sizeof(recordSize)) {
205 static_cast<I32>(writeSize));
211 if (buff.getBuffAddr() !=
nullptr && writeSize != 0) {
212 crc.
update(buff.getBuffAddr(), writeSize);
220 serStat = buff.serializeFrom(entry.getKey());
225 writeSize =
static_cast<FwSizeType>(buff.getSize());
226 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
233 if (writeSize != static_cast<FwSizeType>(buff.getSize())) {
236 static_cast<I32>(writeSize));
242 if (buff.getBuffAddr() !=
nullptr && writeSize != 0) {
243 crc.
update(buff.getBuffAddr(), writeSize);
248 writeSize =
static_cast<FwSizeType>(entry.getValue().getSize());
249 stat = paramFile.write(entry.getValue().getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
256 if (writeSize != static_cast<FwSizeType>(entry.getValue().getSize())) {
259 static_cast<I32>(writeSize));
265 if (entry.getValue().getBuffAddr() !=
nullptr && writeSize != 0) {
266 crc.
update(entry.getValue().getBuffAddr(), writeSize);
277 stat = paramFile.position(currPosInParamFile);
285 stat = paramFile.seek(0, Os::File::SeekType::ABSOLUTE);
294 crcFinal = ~crcFinal;
295 serStat = buff.serializeFrom(crcFinal);
298 writeSize =
static_cast<FwSizeType>(buff.getSize());
300 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
308 stat = paramFile.seek(static_cast<FwSignedSizeType>(currPosInParamFile), Os::File::SeekType::ABSOLUTE);
319 void PrmDbImpl::PRM_LOAD_FILE_cmdHandler(
FwOpcodeType opCode,
347 if (success == PrmLoadStatus::SUCCESS) {
359 void PrmDbImpl::PRM_COMMIT_STAGED_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
369 PrmDbStore* temp = this->m_activeDb;
370 this->m_activeDb = this->m_stagingDb;
372 this->m_stagingDb = temp;
409 stat = paramFile.
read(buff.getBuffAddr(), readSize);
415 if (readSize !=
sizeof(fileCrc)) {
424 serStat = buff.deserializeTo(fileCrc);
427 U32 crc = 0xFFFFFFFF;
436 if (fileCrc != crc) {
442 stat = paramFile.
seek(
sizeof(fileCrc), Os::File::SeekType::ABSOLUTE);
449 U32 recordNumTotal = 0;
450 U32 recordNumAdded = 0;
451 U32 recordNumUpdated = 0;
453 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
455 readSize =
static_cast<FwSizeType>(
sizeof(delimiter));
470 if (
sizeof(delimiter) != readSize) {
472 static_cast<I32>(readSize));
476 if (PRMDB_ENTRY_DELIMITER != delimiter) {
485 readSize =
sizeof(recordSize);
487 fStat = paramFile.
read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
492 if (
sizeof(recordSize) != readSize) {
494 static_cast<I32>(readSize));
498 Fw::SerializeStatus desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
504 desStat = buff.deserializeTo(recordSize);
511 static_cast<I32>(recordSize));
519 fStat = paramFile.
read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
524 if (
sizeof(parameterId) != static_cast<FwSizeType>(readSize)) {
526 static_cast<I32>(readSize));
531 desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
537 desStat = buff.deserializeTo(parameterId);
542 readSize = recordSize -
sizeof(parameterId);
543 desStat = tmpParamBuffer.
setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
552 if (static_cast<U32>(readSize) != recordSize -
sizeof(parameterId)) {
554 static_cast<I32>(readSize));
559 PrmUpdateType updateStatus = updateAddPrmImpl(parameterId, tmpParamBuffer, dbType);
573 return PrmLoadStatus::SUCCESS;
577 auto* db = getDbPtr(prmDbType);
583 auto prevSize = db->getSize();
584 switch (db->insert(
id, val)) {
589 if (prevSize < db->getSize()) {
593 static_cast<FwAssertArgType>(db->getSize()));
609 void PrmDbImpl::clearDb(
PrmDbType prmDbType) {
610 getDbPtr(prmDbType)->
clear();
614 *getDbPtr(dest) = *getDbPtr(src);
618 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.
State of parameter DB file load operations.
U8 * getBuffAddr()
Get buffer address for data filling (non-const version)
FwIdType FwOpcodeType
The type of a command opcode.
Status calculateCrc(U32 &crc)
calculate the CRC32 of the entire file
void pingOut_out(FwIndexType portNum, U32 key) const
Invoke output port pingOut.
PlatformSizeType FwSizeType
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_ACTIVITY_HI_PrmFileSaveComplete(U32 records) const
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
void log_WARNING_HI_PrmFileWriteError(Svc::PrmDb_PrmWriteError stage, I32 record, I32 error) const
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.
void log_WARNING_HI_PrmFileReadError(Svc::PrmDb_PrmReadError stage, I32 record, I32 error) const
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
void log_ACTIVITY_HI_PrmDbCommitComplete() const
void clear() override
Clear the map.
void log_WARNING_LO_PrmDbFileLoadInvalidAction(Svc::PrmDb_PrmDbFileLoadState currentState, Svc::PrmDb_PrmLoadAction attemptedAction) const
Status seek(FwSignedSizeType offset, SeekType seekType) override
seek the file pointer to the given offset
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
Status read(U8 *buffer, FwSizeType &size)
read data from this file into supplied buffer bounded by size
Auto-generated base for PrmDb component.
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.
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
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