19 static_assert(std::numeric_limits<FwSizeType>::max() >= PRMDB_NUM_DB_ENTRIES,
20 "PRMDB_NUM_DB_ENTRIES must fit within range of FwSizeType");
28 FwSizeType getCapacity()
const {
return sizeof(m_buff); }
30 U8* getBuffAddr() {
return m_buff; }
32 const U8* getBuffAddr()
const {
return m_buff; }
44 this->m_activeDb = this->m_dbStore1;
45 this->m_stagingDb = this->m_dbStore2;
55 this->m_fileName = file;
82 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
83 if (this->m_activeDb[entry].used) {
84 if (this->m_activeDb[entry].
id ==
id) {
85 val = this->m_activeDb[entry].val;
113 }
else if (update_status ==
NO_SLOTS) {
120 void PrmDbImpl::pingIn_handler(
FwIndexType portNum, U32 key) {
125 U32 PrmDbImpl::computeCrc(U32 crc,
const BYTE* buff,
FwSizeType size) {
132 if (buff ==
nullptr) {
141 for (
FwSizeType byte = 0; byte < size; byte++) {
142 crc =
static_cast<U32
>(
update_crc_32(crc, static_cast<char>(buff[byte])));
147 void PrmDbImpl::PRM_SAVE_FILE_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
168 U32 crc = 0xFFFFFFFF;
170 stat = paramFile.write(reinterpret_cast<const U8*>(&crc), writeSize, Os::File::WaitType::WAIT);
186 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
187 if (db[entry].used) {
189 static const U8 delim = PRMDB_ENTRY_DELIMITER;
190 writeSize =
static_cast<FwSizeType>(
sizeof(delim));
191 stat = paramFile.write(&delim, writeSize, Os::File::WaitType::WAIT);
198 if (writeSize !=
sizeof(delim)) {
201 static_cast<I32>(writeSize));
207 crc = this->computeCrc(crc, &delim,
sizeof(delim));
219 writeSize =
static_cast<FwSizeType>(buff.getSize());
220 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
227 if (writeSize !=
sizeof(recordSize)) {
230 static_cast<I32>(writeSize));
236 crc = this->computeCrc(crc, buff.getBuffAddr(), writeSize);
243 serStat = buff.serializeFrom(db[entry].
id);
248 writeSize =
static_cast<FwSizeType>(buff.getSize());
249 stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
256 if (writeSize != static_cast<FwSizeType>(buff.getSize())) {
259 static_cast<I32>(writeSize));
265 crc = this->computeCrc(crc, buff.getBuffAddr(), writeSize);
269 writeSize =
static_cast<FwSizeType>(db[entry].val.getSize());
270 stat = paramFile.write(db[entry].val.
getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
278 if (writeSize != static_cast<FwSizeType>(db[entry].val.
getSize())) {
281 static_cast<I32>(numRecords), static_cast<I32>(writeSize));
287 crc = this->computeCrc(crc, db[entry].val.
getBuffAddr(), writeSize);
298 stat = paramFile.position(currPosInParamFile);
306 stat = paramFile.seek(0, Os::File::SeekType::ABSOLUTE);
312 writeSize =
static_cast<FwSizeType>(
sizeof(crc));
313 stat = paramFile.write(reinterpret_cast<const U8*>(&crc), writeSize, Os::File::WaitType::WAIT);
321 stat = paramFile.seek(static_cast<FwSignedSizeType>(currPosInParamFile), Os::File::SeekType::ABSOLUTE);
332 void PrmDbImpl::PRM_LOAD_FILE_cmdHandler(
FwOpcodeType opCode,
360 if (success == PrmLoadStatus::SUCCESS) {
372 void PrmDbImpl::PRM_COMMIT_STAGED_cmdHandler(
FwOpcodeType opCode, U32 cmdSeq) {
382 t_dbStruct* temp = this->m_activeDb;
383 this->m_activeDb = this->m_stagingDb;
385 this->m_stagingDb = temp;
420 stat = paramFile.
read(reinterpret_cast<U8*>(&fileCrc), readSize);
426 if (readSize !=
sizeof(fileCrc)) {
431 U32 crc = 0xFFFFFFFF;
440 if (fileCrc != crc) {
446 stat = paramFile.
seek(
sizeof(fileCrc), Os::File::SeekType::ABSOLUTE);
455 U32 recordNumTotal = 0;
456 U32 recordNumAdded = 0;
457 U32 recordNumUpdated = 0;
459 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
461 readSize =
static_cast<FwSizeType>(
sizeof(delimiter));
476 if (
sizeof(delimiter) != readSize) {
478 static_cast<I32>(readSize));
482 if (PRMDB_ENTRY_DELIMITER != delimiter) {
491 readSize =
sizeof(recordSize);
493 fStat = paramFile.
read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
498 if (
sizeof(recordSize) != readSize) {
500 static_cast<I32>(readSize));
504 Fw::SerializeStatus desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
510 desStat = buff.deserializeTo(recordSize);
517 static_cast<I32>(recordSize));
525 fStat = paramFile.
read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
530 if (
sizeof(parameterId) != static_cast<FwSizeType>(readSize)) {
532 static_cast<I32>(readSize));
537 desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
543 desStat = buff.deserializeTo(parameterId);
548 readSize = recordSize -
sizeof(parameterId);
549 desStat = tmpParamBuffer.
setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
558 if (static_cast<U32>(readSize) != recordSize -
sizeof(parameterId)) {
560 static_cast<I32>(readSize));
565 PrmUpdateType updateStatus = updateAddPrmImpl(parameterId, tmpParamBuffer, dbType);
579 return PrmLoadStatus::SUCCESS;
583 t_dbStruct* db = getDbPtr(prmDbType);
589 bool existingEntry =
false;
591 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
592 if ((db[entry].used) && (
id == db[entry].
id)) {
594 existingEntry =
true;
601 if (!existingEntry) {
602 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
603 if (!(db[entry].used)) {
606 db[entry].used =
true;
621 void PrmDbImpl::clearDb(
PrmDbType prmDbType) {
622 t_dbStruct* db = getDbPtr(prmDbType);
623 for (
FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
624 db[entry].used =
false;
629 bool PrmDbImpl::dbEqual() {
630 for (
FwSizeType i = 0; i < PRMDB_NUM_DB_ENTRIES; i++) {
631 if (!(this->m_dbStore1[i] == this->m_dbStore2[i])) {
639 for (
FwSizeType i = 0; i < PRMDB_NUM_DB_ENTRIES; i++) {
640 dbCopySingle(dest, src, i);
646 t_dbStruct* srcPtr = getDbPtr(src);
647 t_dbStruct* destPtr = getDbPtr(dest);
650 destPtr[index].used = srcPtr[index].used;
651 destPtr[index].id = srcPtr[index].id;
652 destPtr[index].val = srcPtr[index].val;
655 PrmDbImpl::t_dbStruct* PrmDbImpl::getDbPtr(
PrmDbType dbType) {
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
PlatformSizeType FwSizeType
void log_ACTIVITY_HI_PrmIdUpdated(FwPrmIdType Id) const
void readParamFile()
PrmDb file read function.
const char * toChar() const
Convert to a C-style char*.
Serializable::SizeType getSize() const override
Get current buffer size.
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*.
PrmDbImpl(const char *name)
PrmDb constructor.
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
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
unsigned long update_crc_32(unsigned long crc, char c)
virtual void lock()
Lock the guarded mutex.
void log_WARNING_HI_PrmFileReadError(Svc::PrmDb_PrmReadError stage, I32 record, I32 error) const
void log_ACTIVITY_HI_PrmDbCommitComplete() const
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
void log_ACTIVITY_HI_PrmDbCopyAllComplete(const Fw::StringBase &databaseStringSrc, const Fw::StringBase &databaseStringDest) const
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
void pingOut_out(FwIndexType portNum, U32 key)
Invoke output port pingOut.
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.
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.
virtual ~PrmDbImpl()
PrmDb destructor.
Component for managing parameters.
void log_WARNING_HI_PrmFileBadCrc(U32 readCrc, U32 compCrc) const
void log_WARNING_HI_PrmDbFileLoadFailed() const