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 
13 #include <cstdio>
14 #include <cstring>
15 
16 static_assert(std::numeric_limits<FwSizeType>::max() >= PRMDB_NUM_DB_ENTRIES,
17  "PRMDB_NUM_DB_ENTRIES must fit within range of FwSizeType");
18 
19 namespace Svc {
20 
21 // anonymous namespace for buffer declaration
22 namespace {
23 class WorkingBuffer : public Fw::SerializeBufferBase {
24  public:
25  FwSizeType getBuffCapacity() const { return sizeof(m_buff); }
26 
27  U8* getBuffAddr() { return m_buff; }
28 
29  const U8* getBuffAddr() const { return m_buff; }
30 
31  private:
32  // Set to max of parameter buffer + id
33  U8 m_buff[FW_PARAM_BUFFER_MAX_SIZE + sizeof(FwPrmIdType)];
34 };
35 } // namespace
36 
40 PrmDbImpl::PrmDbImpl(const char* name) : PrmDbComponentBase(name), m_state(PrmDbFileLoadState::IDLE) {
41  this->m_activeDb = this->m_dbStore1;
42  this->m_stagingDb = this->m_dbStore2;
43 
44  this->clearDb(PrmDbType::DB_ACTIVE);
45  this->clearDb(PrmDbType::DB_STAGING);
46 }
47 
49 
50 void PrmDbImpl::configure(const char* file) {
51  FW_ASSERT(file != nullptr);
52  this->m_fileName = file;
53 }
54 
56  // Assumed to run at initialization time
57  // State should be IDLE upon entry
58  FW_ASSERT(static_cast<FwAssertArgType>(m_state == PrmDbFileLoadState::IDLE));
59 
60  // Clear databases
61  this->clearDb(PrmDbType::DB_ACTIVE);
62  this->clearDb(PrmDbType::DB_STAGING);
63 
64  // Read parameter file to active database
65  (void)readParamFileImpl(this->m_fileName, PrmDbType::DB_ACTIVE);
66 }
67 
71 
72 // If ports are no longer guarded, these accesses need to be protected from each other
73 // If there are a lot of accesses, perhaps an interrupt lock could be used instead of guarded ports
74 
75 Fw::ParamValid PrmDbImpl::getPrm_handler(FwIndexType portNum, FwPrmIdType id, Fw::ParamBuffer& val) {
76  // search for entry
78 
79  for (FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
80  if (this->m_activeDb[entry].used) {
81  if (this->m_activeDb[entry].id == id) {
82  val = this->m_activeDb[entry].val;
83  stat = Fw::ParamValid::VALID;
84  break;
85  }
86  }
87  }
88 
89  // if unable to find parameter, send error message
90  if (Fw::ParamValid::INVALID == stat.e) {
92  }
93 
94  return stat;
95 }
96 
97 void PrmDbImpl::setPrm_handler(FwIndexType portNum, FwPrmIdType id, Fw::ParamBuffer& val) {
98  // Reject parameter updates during non-idle file load states
99  if (m_state != PrmDbFileLoadState::IDLE) {
101  return;
102  }
103 
104  // Update the parameter in the active database
105  PrmUpdateType update_status = updateAddPrmImpl(id, val, PrmDbType::DB_ACTIVE);
106 
107  // Issue relevant EVR
108  if (update_status == PARAM_UPDATED) {
110  } else if (update_status == NO_SLOTS) {
111  this->log_WARNING_HI_PrmDbFull(id);
112  } else {
113  this->log_ACTIVITY_HI_PrmIdAdded(id);
114  }
115 }
116 
117 void PrmDbImpl::pingIn_handler(FwIndexType portNum, U32 key) {
118  // respond to ping
119  this->pingOut_out(0, key);
120 }
121 
122 void PrmDbImpl::PRM_SAVE_FILE_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) {
123  // Reject PRM_SAVE_FILE command during non-idle file load states
124  if (m_state != PrmDbFileLoadState::IDLE) {
126  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::BUSY);
127  return;
128  }
129 
130  FW_ASSERT(this->m_fileName.length() > 0);
131 
132  Os::File paramFile;
133  WorkingBuffer buff;
134 
135  Os::File::Status stat = paramFile.open(this->m_fileName.toChar(), Os::File::OPEN_WRITE);
136  if (stat != Os::File::OP_OK) {
138  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
139  return;
140  }
141 
142  this->lock();
143  t_dbStruct* db = getDbPtr(PrmDbType::DB_ACTIVE);
144  FW_ASSERT(db != nullptr);
145 
146  // Traverse the parameter list, saving each entry
147 
148  U32 numRecords = 0;
149 
150  for (FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
151  if (db[entry].used) {
152  // write delimiter
153  static const U8 delim = PRMDB_ENTRY_DELIMITER;
154  FwSizeType writeSize = static_cast<FwSizeType>(sizeof(delim));
155  stat = paramFile.write(&delim, writeSize, Os::File::WaitType::WAIT);
156  if (stat != Os::File::OP_OK) {
157  this->unLock();
158  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::DELIMITER, static_cast<I32>(numRecords), stat);
159  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
160  return;
161  }
162  if (writeSize != sizeof(delim)) {
163  this->unLock();
164  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::DELIMITER_SIZE, static_cast<I32>(numRecords),
165  static_cast<I32>(writeSize));
166  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
167  return;
168  }
169  // serialize record size = id field + data
170  U32 recordSize = static_cast<U32>(sizeof(FwPrmIdType) + db[entry].val.getBuffLength());
171 
172  // reset buffer
173  buff.resetSer();
174  Fw::SerializeStatus serStat = buff.serializeFrom(recordSize);
175  // should always work
176  FW_ASSERT(Fw::FW_SERIALIZE_OK == serStat, static_cast<FwAssertArgType>(serStat));
177 
178  // write record size
179  writeSize = static_cast<FwSizeType>(buff.getBuffLength());
180  stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
181  if (stat != Os::File::OP_OK) {
182  this->unLock();
183  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::RECORD_SIZE, static_cast<I32>(numRecords), stat);
184  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
185  return;
186  }
187  if (writeSize != sizeof(recordSize)) {
188  this->unLock();
189  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::RECORD_SIZE_SIZE, static_cast<I32>(numRecords),
190  static_cast<I32>(writeSize));
191  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
192  return;
193  }
194 
195  // reset buffer
196  buff.resetSer();
197 
198  // serialize parameter id
199 
200  serStat = buff.serializeFrom(db[entry].id);
201  // should always work
202  FW_ASSERT(Fw::FW_SERIALIZE_OK == serStat, static_cast<FwAssertArgType>(serStat));
203 
204  // write parameter ID
205  writeSize = static_cast<FwSizeType>(buff.getBuffLength());
206  stat = paramFile.write(buff.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
207  if (stat != Os::File::OP_OK) {
208  this->unLock();
209  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::PARAMETER_ID, static_cast<I32>(numRecords), stat);
210  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
211  return;
212  }
213  if (writeSize != static_cast<FwSizeType>(buff.getBuffLength())) {
214  this->unLock();
215  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::PARAMETER_ID_SIZE, static_cast<I32>(numRecords),
216  static_cast<I32>(writeSize));
217  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
218  return;
219  }
220 
221  // write serialized parameter value
222 
223  writeSize = static_cast<FwSizeType>(db[entry].val.getBuffLength());
224  stat = paramFile.write(db[entry].val.getBuffAddr(), writeSize, Os::File::WaitType::WAIT);
225  if (stat != Os::File::OP_OK) {
226  this->unLock();
227  this->log_WARNING_HI_PrmFileWriteError(PrmWriteError::PARAMETER_VALUE, static_cast<I32>(numRecords),
228  stat);
229  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
230  return;
231  }
232  if (writeSize != static_cast<FwSizeType>(db[entry].val.getBuffLength())) {
233  this->unLock();
235  static_cast<I32>(numRecords), static_cast<I32>(writeSize));
236  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
237  return;
238  }
239  numRecords++;
240  } // end if record in use
241  } // end for each record
242 
243  this->unLock();
244  this->log_ACTIVITY_HI_PrmFileSaveComplete(numRecords);
245  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
246 }
247 
248 void PrmDbImpl::PRM_LOAD_FILE_cmdHandler(FwOpcodeType opCode,
249  U32 cmdSeq,
250  const Fw::CmdStringArg& fileName,
251  PrmDb_Merge merge) {
252  // Reject PRM_LOAD_FILE command during non-idle file load states
253  if (m_state != PrmDbFileLoadState::IDLE) {
255  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::BUSY);
256  return;
257  }
258 
259  // Set state to loading
261 
262  // If reset is true, clear the staging database first
263  if (merge == PrmDb_Merge::MERGE) {
264  // Copy active to staging for merging
266  } else {
267  // reset staging db, all file contents will be loaded but no old parameters will be retained
268  this->clearDb(PrmDbType::DB_STAGING);
269  }
270 
271  // Load the file into staging database
272  // The readParamFileImpl will emit the relevant EVR if the file load fails
273  // and also if it succeeds will emit EVRs with the number of records
274  PrmDbImpl::PrmLoadStatus success = PrmDbImpl::readParamFileImpl(fileName, PrmDbType::DB_STAGING);
275 
276  if (success == PrmLoadStatus::SUCCESS) {
277  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
279  } else {
281  // clear the staging DB and reset to an IDLE state in case of issues
282  this->clearDb(PrmDbType::DB_STAGING);
283  m_state = PrmDbFileLoadState::IDLE;
284  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
285  }
286 }
287 
288 void PrmDbImpl::PRM_COMMIT_STAGED_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) {
289  // Verify we are in the correct state
292  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::VALIDATION_ERROR);
293  return;
294  }
295 
296  // Swap active and staging databases, safely w.r.t. prmGet
297  this->lock();
298  t_dbStruct* temp = this->m_activeDb;
299  this->m_activeDb = this->m_stagingDb;
300  this->unLock();
301  this->m_stagingDb = temp;
302 
303  // Clear the new staging database
304  this->clearDb(PrmDbType::DB_STAGING);
305 
306  // Set file load state to idle
307  m_state = PrmDbFileLoadState::IDLE;
308 
310  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
311 }
312 
316 
317 PrmDbImpl::PrmLoadStatus PrmDbImpl::readParamFileImpl(const Fw::StringBase& fileName, PrmDbType dbType) {
318  FW_ASSERT(dbType == PrmDbType::DB_ACTIVE or dbType == PrmDbType::DB_STAGING);
319  FW_ASSERT(fileName.length() > 0);
320 
321  Fw::String dbString = getDbString(dbType);
322 
323  // load file. FIXME: Put more robust file checking, such as a CRC.
324  Os::File paramFile;
325 
326  Os::File::Status stat = paramFile.open(fileName.toChar(), Os::File::OPEN_READ);
327  if (stat != Os::File::OP_OK) {
329  return PrmLoadStatus::ERROR;
330  }
331 
332  WorkingBuffer buff;
333 
334  U32 recordNumTotal = 0;
335  U32 recordNumAdded = 0;
336  U32 recordNumUpdated = 0;
337 
338  for (FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
339  U8 delimiter;
340  FwSizeType readSize = static_cast<FwSizeType>(sizeof(delimiter));
341 
342  // read delimiter
343  Os::File::Status fStat = paramFile.read(&delimiter, readSize, Os::File::WaitType::WAIT);
344 
345  // check for end of file (read size 0)
346  if (0 == readSize) {
347  break;
348  }
349 
350  if (fStat != Os::File::OP_OK) {
351  this->log_WARNING_HI_PrmFileReadError(PrmReadError::DELIMITER, static_cast<I32>(recordNumTotal), fStat);
352  return PrmLoadStatus::ERROR;
353  }
354 
355  if (sizeof(delimiter) != readSize) {
356  this->log_WARNING_HI_PrmFileReadError(PrmReadError::DELIMITER_SIZE, static_cast<I32>(recordNumTotal),
357  static_cast<I32>(readSize));
358  return PrmLoadStatus::ERROR;
359  }
360 
361  if (PRMDB_ENTRY_DELIMITER != delimiter) {
362  this->log_WARNING_HI_PrmFileReadError(PrmReadError::DELIMITER_VALUE, static_cast<I32>(recordNumTotal),
363  delimiter);
364  return PrmLoadStatus::ERROR;
365  }
366 
367  U32 recordSize = 0;
368 
369  // read record size
370  readSize = sizeof(recordSize);
371 
372  fStat = paramFile.read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
373  if (fStat != Os::File::OP_OK) {
374  this->log_WARNING_HI_PrmFileReadError(PrmReadError::RECORD_SIZE, static_cast<I32>(recordNumTotal), fStat);
375  return PrmLoadStatus::ERROR;
376  }
377  if (sizeof(recordSize) != readSize) {
378  this->log_WARNING_HI_PrmFileReadError(PrmReadError::RECORD_SIZE_SIZE, static_cast<I32>(recordNumTotal),
379  static_cast<I32>(readSize));
380  return PrmLoadStatus::ERROR;
381  }
382  // set serialized size to read size
383  Fw::SerializeStatus desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
384  // should never fail
385  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat, static_cast<FwAssertArgType>(desStat));
386  // reset deserialization
387  buff.resetDeser();
388  // deserialize, since record size is serialized in file
389  desStat = buff.deserializeTo(recordSize);
390  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat);
391 
392  // sanity check value. It can't be larger than the maximum parameter buffer size + id
393  // or smaller than the record id
394  if ((recordSize > FW_PARAM_BUFFER_MAX_SIZE + sizeof(U32)) or (recordSize < sizeof(U32))) {
395  this->log_WARNING_HI_PrmFileReadError(PrmReadError::RECORD_SIZE_VALUE, static_cast<I32>(recordNumTotal),
396  static_cast<I32>(recordSize));
397  return PrmLoadStatus::ERROR;
398  }
399 
400  // read the parameter ID
401  FwPrmIdType parameterId = 0;
402  readSize = static_cast<FwSizeType>(sizeof(FwPrmIdType));
403 
404  fStat = paramFile.read(buff.getBuffAddr(), readSize, Os::File::WaitType::WAIT);
405  if (fStat != Os::File::OP_OK) {
406  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_ID, static_cast<I32>(recordNumTotal), fStat);
407  return PrmLoadStatus::ERROR;
408  }
409  if (sizeof(parameterId) != static_cast<FwSizeType>(readSize)) {
410  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_ID_SIZE, static_cast<I32>(recordNumTotal),
411  static_cast<I32>(readSize));
412  return PrmLoadStatus::ERROR;
413  }
414 
415  // set serialized size to read parameter ID
416  desStat = buff.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
417  // should never fail
418  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat, static_cast<FwAssertArgType>(desStat));
419  // reset deserialization
420  buff.resetDeser();
421  // deserialize, since parameter ID is serialized in file
422  desStat = buff.deserializeTo(parameterId);
423  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat);
424 
425  // copy parameter value from file into a temporary buffer
426  Fw::ParamBuffer tmpParamBuffer; // temporary param buffer to read parameter value from file
427  readSize = recordSize - sizeof(parameterId);
428  desStat = tmpParamBuffer.setBuffLen(static_cast<Fw::Serializable::SizeType>(readSize));
429  FW_ASSERT(Fw::FW_SERIALIZE_OK == desStat, static_cast<FwAssertArgType>(desStat)); // should never fail
430  fStat = paramFile.read(tmpParamBuffer.getBuffAddr(), readSize);
431 
432  if (fStat != Os::File::OP_OK) {
433  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_VALUE, static_cast<I32>(recordNumTotal),
434  fStat);
435  return PrmLoadStatus::ERROR;
436  }
437  if (static_cast<U32>(readSize) != recordSize - sizeof(parameterId)) {
438  this->log_WARNING_HI_PrmFileReadError(PrmReadError::PARAMETER_VALUE_SIZE, static_cast<I32>(recordNumTotal),
439  static_cast<I32>(readSize));
440  return PrmLoadStatus::ERROR;
441  }
442 
443  // Actually update or add parameter
444  PrmUpdateType updateStatus = updateAddPrmImpl(parameterId, tmpParamBuffer, dbType);
445  if (updateStatus == PARAM_ADDED) {
446  recordNumAdded++;
447  } else if (updateStatus == PARAM_UPDATED) {
448  recordNumUpdated++;
449  }
450 
451  if (updateStatus == NO_SLOTS) {
452  this->log_WARNING_HI_PrmDbFull(parameterId);
453  }
454  recordNumTotal++;
455  }
456 
457  this->log_ACTIVITY_HI_PrmFileLoadComplete(dbString, recordNumTotal, recordNumAdded, recordNumUpdated);
458  return PrmLoadStatus::SUCCESS;
459 }
460 
461 PrmDbImpl::PrmUpdateType PrmDbImpl::updateAddPrmImpl(FwPrmIdType id, Fw::ParamBuffer& val, PrmDbType prmDbType) {
462  t_dbStruct* db = getDbPtr(prmDbType);
463 
464  PrmUpdateType updateStatus = NO_SLOTS;
465 
466  this->lock();
467  // search for existing entry
468  bool existingEntry = false;
469 
470  for (FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
471  if ((db[entry].used) && (id == db[entry].id)) {
472  db[entry].val = val;
473  existingEntry = true;
474  updateStatus = PARAM_UPDATED;
475  break;
476  }
477  }
478 
479  // if there is no existing entry, add one
480  if (!existingEntry) {
481  for (FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
482  if (!(db[entry].used)) {
483  db[entry].val = val;
484  db[entry].id = id;
485  db[entry].used = true;
486  updateStatus = PARAM_ADDED;
487  break;
488  }
489  }
490  }
491 
492  this->unLock();
493  return updateStatus;
494 }
495 
499 
500 void PrmDbImpl::clearDb(PrmDbType prmDbType) {
501  t_dbStruct* db = getDbPtr(prmDbType);
502  for (FwSizeType entry = 0; entry < PRMDB_NUM_DB_ENTRIES; entry++) {
503  db[entry].used = false;
504  db[entry].id = 0;
505  }
506 }
507 
508 bool PrmDbImpl::dbEqual() {
509  for (FwSizeType i = 0; i < PRMDB_NUM_DB_ENTRIES; i++) {
510  if (!(this->m_dbStore1[i] == this->m_dbStore2[i]))
511  return false;
512  }
513  return true;
514 }
515 
516 void PrmDbImpl::dbCopy(PrmDbType dest, PrmDbType src) {
517  for (FwSizeType i = 0; i < PRMDB_NUM_DB_ENTRIES; i++) {
518  dbCopySingle(dest, src, i);
519  }
520  this->log_ACTIVITY_HI_PrmDbCopyAllComplete(getDbString(src), getDbString(dest));
521 }
522 
523 void PrmDbImpl::dbCopySingle(PrmDbType dest, PrmDbType src, FwSizeType index) {
524  t_dbStruct* srcPtr = getDbPtr(src);
525  t_dbStruct* destPtr = getDbPtr(dest);
526 
527  FW_ASSERT(index < PRMDB_NUM_DB_ENTRIES);
528  destPtr[index].used = srcPtr[index].used;
529  destPtr[index].id = srcPtr[index].id;
530  destPtr[index].val = srcPtr[index].val;
531 }
532 
533 PrmDbImpl::t_dbStruct* PrmDbImpl::getDbPtr(PrmDbType dbType) {
534  FW_ASSERT(dbType == PrmDbType::DB_ACTIVE or dbType == PrmDbType::DB_STAGING);
535  if (dbType == PrmDbType::DB_ACTIVE) {
536  return m_activeDb;
537  }
538  return m_stagingDb;
539 }
540 
541 Fw::String PrmDbImpl::getDbString(PrmDbType dbType) {
542  FW_ASSERT(dbType == PrmDbType::DB_ACTIVE or dbType == PrmDbType::DB_STAGING);
543  if (dbType == PrmDbType::DB_ACTIVE) {
544  return Fw::String("ACTIVE");
545  }
546  return Fw::String("STAGING");
547 }
548 
549 } // namespace Svc
Serialization/Deserialization operation was successful.
Parameter already in database, updated parameter.
Definition: PrmDbImpl.hpp:71
State of parameter DB file load operations.
U8 * getBuffAddr()
gets buffer address for data filling
Definition: PrmBuffer.cpp:38
FwIdType FwOpcodeType
The type of a command opcode.
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:55
const char * toChar() const
Definition: String.hpp:50
FwIdType FwPrmIdType
The type of a parameter identifier.
void log_ACTIVITY_HI_PrmFileSaveComplete(U32 records) const
Open file for writing.
Definition: File.hpp:33
PrmDbImpl(const char *name)
PrmDb constructor.
Definition: PrmDbImpl.cpp:40
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
PrmDb_PrmDbType PrmDbType
Definition: PrmDbImpl.hpp:27
void log_WARNING_HI_PrmFileWriteError(Svc::PrmDb_PrmWriteError stage, I32 record, I32 error) const
Parameter added to database.
Definition: PrmDbImpl.hpp:70
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
T e
The raw enum value.
Serializable::SizeType getBuffLength() const
returns current buffer size
void log_ACTIVITY_HI_PrmDbCommitComplete() const
void log_WARNING_LO_PrmDbFileLoadInvalidAction(Svc::PrmDb_PrmDbFileLoadState currentState, Svc::PrmDb_PrmLoadAction attemptedAction) const
virtual void unLock()
Unlock the guarded mutex.
void log_ACTIVITY_HI_PrmIdAdded(FwPrmIdType Id) const
SizeType length() const
Get length of string.
Definition: StringBase.cpp:121
#define FW_PARAM_BUFFER_MAX_SIZE
Definition: FpConfig.h:226
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:50
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:168
Auto-generated base for PrmDb component.
Command had execution error.
void log_WARNING_LO_PrmIdNotFound(FwPrmIdType Id)
Operation was successful.
Definition: File.hpp:40
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.
Enum representing parameter validity.
No slots available to add new parameter.
Definition: PrmDbImpl.hpp:69
virtual ~PrmDbImpl()
PrmDb destructor.
Definition: PrmDbImpl.cpp:48
#define FW_ASSERT(...)
Definition: Assert.hpp:14
Component for managing parameters.
void log_WARNING_HI_PrmDbFileLoadFailed() const
virtual const CHAR * toChar() const =0
SerializeStatus setBuffLen(Serializable::SizeType length)
sets buffer length manually after filling with data