F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
PrmDbImpl.cpp
Go to the documentation of this file.
1 /*
2  * PrmDbImpl.cpp
3  *
4  * Created on: March 9, 2015
5  * Author: Timothy Canham
6  */
7 
8 #include <Fw/Types/Assert.hpp>
10 
11 #include <Os/File.hpp>
12 extern "C" {
14 }
15 
16 #include <cstdio>
17 #include <cstring>
18 
19 static_assert(std::numeric_limits<FwSizeType>::max() >= PRMDB_NUM_DB_ENTRIES,
20  "PRMDB_NUM_DB_ENTRIES must fit within range of FwSizeType");
21 
22 namespace Svc {
23 
24 // anonymous namespace for buffer declaration
25 namespace {
26 class WorkingBuffer : public Fw::SerializeBufferBase {
27  public:
28  FwSizeType getCapacity() const { return sizeof(m_buff); }
29 
30  U8* getBuffAddr() { return m_buff; }
31 
32  const U8* getBuffAddr() const { return m_buff; }
33 
34  private:
35  // Set to max of parameter buffer + id
36  U8 m_buff[FW_PARAM_BUFFER_MAX_SIZE + sizeof(FwPrmIdType)];
37 };
38 } // namespace
39 
43 PrmDbImpl::PrmDbImpl(const char* name) : PrmDbComponentBase(name), m_state(PrmDbFileLoadState::IDLE) {
44  this->m_activeDb = &this->m_dbStore1;
45  this->m_stagingDb = &this->m_dbStore2;
46 
47  this->clearDb(PrmDbType::DB_ACTIVE);
48  this->clearDb(PrmDbType::DB_STAGING);
49 }
50 
52 
53 void PrmDbImpl::configure(const char* file) {
54  FW_ASSERT(file != nullptr);
55  this->m_fileName = file;
56 }
57 
59  // Assumed to run at initialization time
60  // State should be IDLE upon entry
61  FW_ASSERT(static_cast<FwAssertArgType>(m_state == PrmDbFileLoadState::IDLE));
62 
63  // Clear databases
64  this->clearDb(PrmDbType::DB_ACTIVE);
65  this->clearDb(PrmDbType::DB_STAGING);
66 
67  // Read parameter file to active database
68  (void)readParamFileImpl(this->m_fileName, PrmDbType::DB_ACTIVE);
69 }
70 
74 
75 // If ports are no longer guarded, these accesses need to be protected from each other
76 // If there are a lot of accesses, perhaps an interrupt lock could be used instead of guarded ports
77 
78 Fw::ParamValid PrmDbImpl::getPrm_handler(FwIndexType portNum, FwPrmIdType id, Fw::ParamBuffer& val) {
79  // search for entry
80  auto success = this->m_activeDb->find(id, val);
81 
82  switch (success.e) {
84  // if unable to find parameter, send error message
88  return Fw::ParamValid::VALID;
89  default:
90  FW_ASSERT(0, success.e);
92  }
93 }
94 
95 void PrmDbImpl::setPrm_handler(FwIndexType portNum, FwPrmIdType id, Fw::ParamBuffer& val) {
96  // Reject parameter updates during non-idle file load states
97  if (m_state != PrmDbFileLoadState::IDLE) {
99  return;
100  }
101 
102  // Update the parameter in the active database
103  PrmUpdateType update_status = updateAddPrmImpl(id, val, PrmDbType::DB_ACTIVE);
104 
105  // Issue relevant EVR
106  if (update_status == PARAM_UPDATED) {
108  } else if (update_status == NO_SLOTS) {
109  this->log_WARNING_HI_PrmDbFull(id);
110  } else {
111  this->log_ACTIVITY_HI_PrmIdAdded(id);
112  }
113 }
114 
115 void PrmDbImpl::pingIn_handler(FwIndexType portNum, U32 key) {
116  // respond to ping
117  this->pingOut_out(0, key);
118 }
119 
120 U32 PrmDbImpl::computeCrc(U32 crc, const BYTE* buff, FwSizeType size) {
121  // Note: The crc parameter accepts any U32 value as valid input.
122  // This is correct behavior for CRC32 accumulation functions where:
123  // - Initial CRC values are typically 0x00000000 or 0xFFFFFFFF
124  // - Intermediate CRC values (from prior computeCrc calls) can be any U32 value
125 
126  // Check for null pointer before dereferencing
127  if (buff == nullptr) {
128  // Return the input CRC unchanged if buffer is null
129  return crc;
130  }
131 
132  // Check for zero size to avoid unnecessary processing
133  if (size == 0) {
134  return crc;
135  }
136  for (FwSizeType byte = 0; byte < size; byte++) {
137  crc = static_cast<U32>(update_crc_32(crc, static_cast<char>(buff[byte])));
138  }
139  return crc;
140 }
141 
142 void PrmDbImpl::PRM_SAVE_FILE_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) {
143  // Reject PRM_SAVE_FILE command during non-idle file load states
144  if (m_state != PrmDbFileLoadState::IDLE) {
146  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::BUSY);
147  return;
148  }
149 
150  FW_ASSERT(this->m_fileName.length() > 0);
151 
152  Os::File paramFile;
153  WorkingBuffer buff;
154 
155  Os::File::Status stat = paramFile.open(this->m_fileName.toChar(), Os::File::OPEN_WRITE);
156  if (stat != Os::File::OP_OK) {
158  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
159  return;
160  }
161 
162  // write placeholder for the CRC
163  U32 crc = 0xFFFFFFFF;
164  FwSizeType writeSize = static_cast<FwSizeType>(sizeof(crc));
165  stat = paramFile.write(reinterpret_cast<const U8*>(&crc), writeSize, Os::File::WaitType::WAIT);
166 
167  if (stat != Os::File::OP_OK) {
169  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
170  return;
171  }
172 
173  this->lock();
174  auto db = getDbPtr(PrmDbType::DB_ACTIVE);
175  FW_ASSERT(db != nullptr);
176 
177  // Traverse the parameter list, saving each entry
178 
179  U32 numRecords = 0;
180 
181  for (const auto& entry : *db) {
182  // write delimiter
183  static const U8 delim = PRMDB_ENTRY_DELIMITER;
184  writeSize = static_cast<FwSizeType>(sizeof(delim));
185  stat = paramFile.write(&delim, writeSize, Os::File::WaitType::WAIT);
186  if (stat != Os::File::OP_OK) {
187  this->unLock();
188  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::DELIMITER, static_cast<I32>(numRecords), stat);
189  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
190  return;
191  }
192  if (writeSize != sizeof(delim)) {
193  this->unLock();
194  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::DELIMITER_SIZE, static_cast<I32>(numRecords),
195  static_cast<I32>(writeSize));
196  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
197  return;
198  }
199 
200  // add delimiter to CRC
201  crc = this->computeCrc(crc, &delim, sizeof(delim));
202 
203  // serialize record size = id field + data
204  U32 recordSize = static_cast<U32>(sizeof(FwPrmIdType) + entry.getValue().getSize());
205 
206  // reset buffer
207  buff.resetSer();
208  Fw::SerializeStatus serStat = buff.serializeFrom(recordSize);
209  // should always work
210  FW_ASSERT(Fw::FW_SERIALIZE_OK == serStat, static_cast<FwAssertArgType>(serStat));
211 
212  // write record size
213  writeSize = static_cast<FwSizeType>(buff.getSize());
214  stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
215  if (stat != Os::File::OP_OK) {
216  this->unLock();
217  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::RECORD_SIZE, static_cast<I32>(numRecords), stat);
218  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
219  return;
220  }
221  if (writeSize != sizeof(recordSize)) {
222  this->unLock();
223  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::RECORD_SIZE_SIZE, static_cast<I32>(numRecords),
224  static_cast<I32>(writeSize));
225  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
226  return;
227  }
228 
229  // add recordSize to CRC
230  crc = this->computeCrc(crc, buff.getBuffAddr(), writeSize);
231 
232  // reset buffer
233  buff.resetSer();
234 
235  // serialize parameter id
236 
237  serStat = buff.serializeFrom(entry.getKey());
238  // should always work
239  FW_ASSERT(Fw::FW_SERIALIZE_OK == serStat, static_cast<FwAssertArgType>(serStat));
240 
241  // write parameter ID
242  writeSize = static_cast<FwSizeType>(buff.getSize());
243  stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
244  if (stat != Os::File::OP_OK) {
245  this->unLock();
246  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::PARAMETER_ID, static_cast<I32>(numRecords), stat);
247  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
248  return;
249  }
250  if (writeSize != static_cast<FwSizeType>(buff.getSize())) {
251  this->unLock();
252  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::PARAMETER_ID_SIZE, static_cast<I32>(numRecords),
253  static_cast<I32>(writeSize));
254  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
255  return;
256  }
257 
258  // add parameter ID to CRC
259  crc = this->computeCrc(crc, buff.getBuffAddr(), writeSize);
260 
261  // write serialized parameter value
262 
263  writeSize = static_cast<FwSizeType>(entry.getValue().getSize());
264  stat = paramFile.write(entry.getValue().getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
265  if (stat != Os::File::OP_OK) {
266  this->unLock();
267  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::PARAMETER_VALUE, static_cast<I32>(numRecords), stat);
268  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
269  return;
270  }
271  if (writeSize != static_cast<FwSizeType>(entry.getValue().getSize())) {
272  this->unLock();
273  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::PARAMETER_VALUE_SIZE, static_cast<I32>(numRecords),
274  static_cast<I32>(writeSize));
275  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
276  return;
277  }
278 
279  // add serialized parameter value to crc
280  crc = this->computeCrc(crc, entry.getValue().getBuffAddr(), writeSize);
281 
282  numRecords++;
283  }
284 
285  this->unLock();
286 
287  // save current location of pointer in paramFile
288  FwSizeType currPosInParamFile;
289 
290  stat = paramFile.position(currPosInParamFile);
291  if (stat != Os::File::OP_OK) {
293  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
294  return;
295  }
296 
297  // seek to beginning and write CRC value
298  stat = paramFile.seek(0, Os::File::SeekType::ABSOLUTE);
299  if (stat != Os::File::OP_OK) {
301  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
302  return;
303  }
304  writeSize = static_cast<FwSizeType>(sizeof(crc));
305  stat = paramFile.write(reinterpret_cast<const U8*>(&crc), writeSize, Os::File::WaitType::WAIT);
306  if (stat != Os::File::OP_OK) {
308  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
309  return;
310  }
311 
312  // Restore pointer to previously saved location
313  stat = paramFile.seek(static_cast<FwSignedSizeType>(currPosInParamFile), Os::File::SeekType::ABSOLUTE);
314  if (stat != Os::File::OP_OK) {
316  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
317  return;
318  }
319 
320  this->log_ACTIVITY_HI_PrmFileSaveComplete(numRecords);
321  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
322 }
323 
324 void PrmDbImpl::PRM_LOAD_FILE_cmdHandler(FwOpcodeType opCode,
325  U32 cmdSeq,
326  const Fw::CmdStringArg& fileName,
327  PrmDb_Merge merge) {
328  // Reject PRM_LOAD_FILE command during non-idle file load states
329  if (m_state != PrmDbFileLoadState::IDLE) {
331  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::BUSY);
332  return;
333  }
334 
335  // Set state to loading
337 
338  // If reset is true, clear the staging database first
339  if (merge == PrmDb_Merge::MERGE) {
340  // Copy active to staging for merging
342  } else {
343  // reset staging db, all file contents will be loaded but no old parameters will be retained
344  this->clearDb(PrmDbType::DB_STAGING);
345  }
346 
347  // Load the file into staging database
348  // The readParamFileImpl will emit the relevant EVR if the file load fails
349  // and also if it succeeds will emit EVRs with the number of records
350  PrmDbImpl::PrmLoadStatus success = PrmDbImpl::readParamFileImpl(fileName, PrmDbType::DB_STAGING);
351 
352  if (success == PrmLoadStatus::SUCCESS) {
353  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
355  } else {
357  // clear the staging DB and reset to an IDLE state in case of issues
358  this->clearDb(PrmDbType::DB_STAGING);
359  m_state = PrmDbFileLoadState::IDLE;
360  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
361  }
362 }
363 
364 void PrmDbImpl::PRM_COMMIT_STAGED_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) {
365  // Verify we are in the correct state
368  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::VALIDATION_ERROR);
369  return;
370  }
371 
372  // Swap active and staging databases, safely w.r.t. prmGet
373  this->lock();
374  PrmDbStore* temp = this->m_activeDb;
375  this->m_activeDb = this->m_stagingDb;
376  this->unLock();
377  this->m_stagingDb = temp;
378 
379  // Clear the new staging database
380  this->clearDb(PrmDbType::DB_STAGING);
381 
382  // Set file load state to idle
383  m_state = PrmDbFileLoadState::IDLE;
384 
386  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
387 }
388 
392 
393 PrmDbImpl::PrmLoadStatus PrmDbImpl::readParamFileImpl(const Fw::StringBase& fileName, PrmDbType dbType) {
394  FW_ASSERT(dbType == PrmDbType::DB_ACTIVE or dbType == PrmDbType::DB_STAGING);
395  FW_ASSERT(fileName.length() > 0);
396 
397  Fw::String dbString = getDbString(dbType);
398 
399  // load file. FIXME: Put more robust file checking, such as a CRC.
400  Os::File paramFile;
401 
402  Os::File::Status stat = paramFile.open(fileName.toChar(), Os::File::OPEN_READ);
403  if (stat != Os::File::OP_OK) {
405  return PrmLoadStatus::ERROR;
406  }
407  //===========================================================================
408  // read CRC from beginning of file
409  U32 fileCrc;
410  FwSizeType readSize = static_cast<FwSizeType>(sizeof(fileCrc));
411 
412  stat = paramFile.read(reinterpret_cast<U8*>(&fileCrc), readSize);
413  if (stat != Os::File::OP_OK) {
414  this->log_WARNING_HI_PrmFileReadError(PrmReadError::CRC, static_cast<I32>(0), stat);
415  return PrmLoadStatus::ERROR;
416  }
417 
418  if (readSize != sizeof(fileCrc)) {
419  this->log_WARNING_HI_PrmFileReadError(PrmReadError::CRC_SIZE, static_cast<I32>(0), static_cast<I32>(readSize));
420  return PrmLoadStatus::ERROR;
421  }
422 
423  U32 crc = 0xFFFFFFFF;
424  // read into CRC buffer for checking
425 
426  Os::File::Status status = paramFile.calculateCrc(crc);
427  if (status != Os::File::OP_OK) {
428  this->log_WARNING_HI_PrmFileReadError(PrmReadError::CRC_BUFFER, static_cast<I32>(0), status);
429  return PrmLoadStatus::ERROR;
430  }
431 
432  if (fileCrc != crc) {
433  this->log_WARNING_HI_PrmFileBadCrc(fileCrc, crc);
434  return PrmLoadStatus::ERROR;
435  }
436 
437  // seek back to just after CRC
438  stat = paramFile.seek(sizeof(fileCrc), Os::File::SeekType::ABSOLUTE);
439  if (stat != Os::File::OP_OK) {
441  return PrmLoadStatus::ERROR;
442  }
443  //===========================================================================
444 
445  WorkingBuffer buff;
446 
447  U32 recordNumTotal = 0;
448  U32 recordNumAdded = 0;
449  U32 recordNumUpdated = 0;
450 
451  for (FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
452  U8 delimiter;
453  readSize = static_cast<FwSizeType>(sizeof(delimiter));
454 
455  // read delimiter
456  Os::File::Status fStat = paramFile.read(&delimiter, readSize, Os::File::WaitType::WAIT);
457 
458  // check for end of file (read size 0)
459  if (0 == readSize) {
460  break;
461  }
462 
463  if (fStat != Os::File::OP_OK) {
464  this->log_WARNING_HI_PrmFileReadError(PrmReadError::DELIMITER, static_cast<I32>(recordNumTotal), fStat);
465  return PrmLoadStatus::ERROR;
466  }
467 
468  if (sizeof(delimiter) != readSize) {
469  this->log_WARNING_HI_PrmFileReadError(PrmReadError::DELIMITER_SIZE, static_cast<I32>(recordNumTotal),
470  static_cast<I32>(readSize));
471  return PrmLoadStatus::ERROR;
472  }
473 
474  if (PRMDB_ENTRY_DELIMITER != delimiter) {
475  this->log_WARNING_HI_PrmFileReadError(PrmReadError::DELIMITER_VALUE, static_cast<I32>(recordNumTotal),
476  delimiter);
477  return PrmLoadStatus::ERROR;
478  }
479 
480  U32 recordSize = 0;
481 
482  // read record size
483  readSize = sizeof(recordSize);
484 
485  fStat = paramFile.read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
486  if (fStat != Os::File::OP_OK) {
487  this->log_WARNING_HI_PrmFileReadError(PrmReadError::RECORD_SIZE, static_cast<I32>(recordNumTotal), fStat);
488  return PrmLoadStatus::ERROR;
489  }
490  if (sizeof(recordSize) != readSize) {
491  this->log_WARNING_HI_PrmFileReadError(PrmReadError::RECORD_SIZE_SIZE, static_cast<I32>(recordNumTotal),
492  static_cast<I32>(readSize));
493  return PrmLoadStatus::ERROR;
494  }
495  // set serialized size to read size
496  Fw::SerializeStatus desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
497  // should never fail
498  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat, static_cast<FwAssertArgType>(desStat));
499  // reset deserialization
500  buff.resetDeser();
501  // deserialize, since record size is serialized in file
502  desStat = buff.deserializeTo(recordSize);
503  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat);
504 
505  // sanity check value. It can't be larger than the maximum parameter buffer size + id
506  // or smaller than the record id
507  if ((recordSize > FW_PARAM_BUFFER_MAX_SIZE + sizeof(U32)) or (recordSize < sizeof(U32))) {
508  this->log_WARNING_HI_PrmFileReadError(PrmReadError::RECORD_SIZE_VALUE, static_cast<I32>(recordNumTotal),
509  static_cast<I32>(recordSize));
510  return PrmLoadStatus::ERROR;
511  }
512 
513  // read the parameter ID
514  FwPrmIdType parameterId = 0;
515  readSize = static_cast<FwSizeType>(sizeof(FwPrmIdType));
516 
517  fStat = paramFile.read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
518  if (fStat != Os::File::OP_OK) {
519  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_ID, static_cast<I32>(recordNumTotal), fStat);
520  return PrmLoadStatus::ERROR;
521  }
522  if (sizeof(parameterId) != static_cast<FwSizeType>(readSize)) {
523  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_ID_SIZE, static_cast<I32>(recordNumTotal),
524  static_cast<I32>(readSize));
525  return PrmLoadStatus::ERROR;
526  }
527 
528  // set serialized size to read parameter ID
529  desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
530  // should never fail
531  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat, static_cast<FwAssertArgType>(desStat));
532  // reset deserialization
533  buff.resetDeser();
534  // deserialize, since parameter ID is serialized in file
535  desStat = buff.deserializeTo(parameterId);
536  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat);
537 
538  // copy parameter value from file into a temporary buffer
539  Fw::ParamBuffer tmpParamBuffer; // temporary param buffer to read parameter value from file
540  readSize = recordSize - sizeof(parameterId);
541  desStat = tmpParamBuffer.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
542  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat, static_cast<FwAssertArgType>(desStat)); // should never fail
543  fStat = paramFile.read(tmpParamBuffer.getBuffAddr(), readSize);
544 
545  if (fStat != Os::File::OP_OK) {
546  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_VALUE, static_cast<I32>(recordNumTotal),
547  fStat);
548  return PrmLoadStatus::ERROR;
549  }
550  if (static_cast<U32>(readSize) != recordSize - sizeof(parameterId)) {
551  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_VALUE_SIZE, static_cast<I32>(recordNumTotal),
552  static_cast<I32>(readSize));
553  return PrmLoadStatus::ERROR;
554  }
555 
556  // Actually update or add parameter
557  PrmUpdateType updateStatus = updateAddPrmImpl(parameterId, tmpParamBuffer, dbType);
558  if (updateStatus == PARAM_ADDED) {
559  recordNumAdded++;
560  } else if (updateStatus == PARAM_UPDATED) {
561  recordNumUpdated++;
562  }
563 
564  if (updateStatus == NO_SLOTS) {
565  this->log_WARNING_HI_PrmDbFull(parameterId);
566  }
567  recordNumTotal++;
568  }
569 
570  this->log_ACTIVITY_HI_PrmFileLoadComplete(dbString, recordNumTotal, recordNumAdded, recordNumUpdated);
571  return PrmLoadStatus::SUCCESS;
572 }
573 
574 PrmDbImpl::PrmUpdateType PrmDbImpl::updateAddPrmImpl(FwPrmIdType id, Fw::ParamBuffer& val, PrmDbType prmDbType) {
575  auto* db = getDbPtr(prmDbType);
576 
577  PrmUpdateType updateStatus = NO_SLOTS;
578 
579  this->lock();
580 
581  auto prevSize = db->getSize();
582  switch (db->insert(id, val)) {
584  updateStatus = NO_SLOTS;
585  break;
587  if (prevSize < db->getSize()) {
588  updateStatus = PARAM_ADDED;
589  } else {
590  FW_ASSERT(prevSize == db->getSize(), static_cast<FwAssertArgType>(prevSize),
591  static_cast<FwAssertArgType>(db->getSize()));
592  updateStatus = PARAM_UPDATED;
593  }
594  break;
595  default:
596  FW_ASSERT(false);
597  }
598 
599  this->unLock();
600  return updateStatus;
601 }
602 
606 
607 void PrmDbImpl::clearDb(PrmDbType prmDbType) {
608  getDbPtr(prmDbType)->clear();
609 }
610 
611 void PrmDbImpl::dbCopy(PrmDbType dest, PrmDbType src) {
612  *getDbPtr(dest) = *getDbPtr(src);
613  this->log_ACTIVITY_HI_PrmDbCopyAllComplete(getDbString(src), getDbString(dest));
614 }
615 
616 PrmDbImpl::PrmDbStore* PrmDbImpl::getDbPtr(PrmDbType dbType) {
617  FW_ASSERT(dbType == PrmDbType::DB_ACTIVE or dbType == PrmDbType::DB_STAGING);
618  if (dbType == PrmDbType::DB_ACTIVE) {
619  return m_activeDb;
620  }
621  return m_stagingDb;
622 }
623 
624 Fw::String PrmDbImpl::getDbString(PrmDbType dbType) {
625  FW_ASSERT(dbType == PrmDbType::DB_ACTIVE or dbType == PrmDbType::DB_STAGING);
626  if (dbType == PrmDbType::DB_ACTIVE) {
627  return Fw::String("ACTIVE");
628  }
629  return Fw::String("STAGING");
630 }
631 
632 } // namespace Svc
Serialization/Deserialization operation was successful.
Parameter already in database, updated parameter.
Definition: PrmDbImpl.hpp:75
State of parameter DB file load operations.
U8 * getBuffAddr()
Get buffer address for data filling (non-const version)
Definition: PrmBuffer.cpp:42
FwIdType FwOpcodeType
The type of a command opcode.
Status calculateCrc(U32 &crc)
calculate the CRC32 of the entire file
Definition: File.cpp:212
Representing success.
PlatformSizeType FwSizeType
Operation failed.
Definition: Os.hpp:27
void log_ACTIVITY_HI_PrmIdUpdated(FwPrmIdType Id) const
void readParamFile()
PrmDb file read function.
Definition: PrmDbImpl.cpp:58
const char * toChar() const
Convert to a C-style char*.
Definition: String.hpp:50
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*.
Open file for writing.
Definition: File.hpp:33
PrmDbImpl(const char *name)
PrmDb constructor.
Definition: PrmDbImpl.cpp:43
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
PrmDb_PrmDbType PrmDbType
Definition: PrmDbImpl.hpp:29
void log_WARNING_HI_PrmFileWriteError(Svc::PrmDb_PrmWriteError stage, I32 record, I32 error) const
Parameter added to database.
Definition: PrmDbImpl.hpp:74
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)
Definition: lib_crc.c:272
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 clear() override
Clear the map.
Definition: ArrayMap.hpp:73
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
Definition: File.cpp:117
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.
Definition: PrmDbImpl.cpp:53
Representing failure.
Command successfully executed.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:53
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
Definition: File.cpp:169
Auto-generated base for PrmDb component.
Command had execution error.
void log_WARNING_LO_PrmIdNotFound(FwPrmIdType Id)
Operation was successful.
Definition: File.hpp:40
Success find(const K &key, V &value) const override
Definition: ArrayMap.hpp:81
PlatformIndexType FwIndexType
Open file for reading.
Definition: File.hpp:31
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.
U8 BYTE
byte type
Definition: BasicTypes.h:56
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
No slots available to add new parameter.
Definition: PrmDbImpl.hpp:73
virtual ~PrmDbImpl()
PrmDb destructor.
Definition: PrmDbImpl.cpp:51
#define FW_ASSERT(...)
Definition: Assert.hpp:14
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