F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
FileWorker.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title FileWorker.cpp
3 // \author racheljt
4 // \brief cpp file for FileWorker component implementation class
5 // ======================================================================
6 
8 
9 namespace Svc {
10 
11 // ----------------------------------------------------------------------
12 // Component construction and destruction
13 // ----------------------------------------------------------------------
14 
15 FileWorker ::FileWorker(const char* const compName)
16  : FileWorkerComponentBase(compName), m_state(FileWorkerState::FW_STATE_IDLE), m_abort(false), m_chunkSize(0) {}
17 
18 void FileWorker ::configure(U64 chunkSize) {
19  FW_ASSERT(chunkSize > 0);
20  this->m_chunkSize = chunkSize;
21 }
22 
24 
25 // ----------------------------------------------------------------------
26 // Handler implementations for typed input ports
27 // ----------------------------------------------------------------------
28 
29 void FileWorker ::cancelIn_handler(FwIndexType portNum) {
30  this->m_abort.store(true, std::memory_order_relaxed);
31 }
32 
33 void FileWorker ::readIn_handler(FwIndexType portNum, const Fw::StringBase& path, Fw::Buffer& buffer) {
34  // Validate inputs before processing file
35  if (path.length() == 0) {
36  this->log_WARNING_HI_InvalidInput(Fw::LogStringArg("readIn"), Fw::LogStringArg("empty path"));
38  return;
39  }
40  if (!buffer.isValid()) {
41  this->log_WARNING_HI_InvalidInput(Fw::LogStringArg("readIn"), Fw::LogStringArg("invalid buffer"));
43  return;
44  }
45 
46  const char* const fileName = path.toChar();
47  FwSizeType fileSize = 0;
48 
49  if (this->m_state != FW_STATE_IDLE) {
50  this->log_WARNING_HI_NotInIdle(this->m_state);
52  return;
53  }
54 
55  // New read request overrides any leftover abort state
56  this->m_abort.store(false, std::memory_order_relaxed);
57 
58  this->m_state = FW_STATE_READING;
59 
60  // Check CRC
61  U32 crcFromFile = 0;
62  U32 crcCalculated = 0;
63  Utils::crc_stat_t crcStat = Utils::verify_checksum(fileName, crcFromFile, crcCalculated);
64  if (crcStat != Utils::PASSED_FILE_CRC_CHECK) {
65  this->log_WARNING_HI_CrcFailed(crcStat);
67  this->m_state = FW_STATE_IDLE;
68  return;
69  }
70 
71  // Get filesize
72  Os::FileSystem::Status fsStat = Os::FileSystem::getFileSize(fileName, fileSize);
73  if (fsStat != Os::FileSystem::OP_OK) {
74  // Path is ground-controlled and the file may change between the CRC check and here
77  this->m_state = FW_STATE_IDLE;
78  return;
79  }
80 
81  // Start reading
82  FileWorkerStatus workerStat = this->readBufferFromFile(buffer, fileName);
83 
84  // Signal done and pass U8* buffer with data
85  this->readDoneOut_out(0, workerStat, fileSize);
86  this->m_state = FW_STATE_IDLE;
87 }
88 
89 void FileWorker ::verifyIn_handler(FwIndexType portNum, const Fw::StringBase& path, U32 crc) {
90  // Validate inputs before processing file
91  if (path.length() == 0) {
92  this->log_WARNING_HI_InvalidInput(Fw::LogStringArg("verifyIn"), Fw::LogStringArg("empty path"));
94  return;
95  }
96 
97  const char* const fileName = path.toChar();
98  FwSizeType fileSize = 0;
99  FileWorkerStatus workerStat = FW_STATUS_DONE;
100 
101  U32 crcFromFile = 0;
102  U32 crcCalculated = 0;
103  Utils::crc_stat_t crcStat = Utils::verify_checksum(fileName, crcFromFile, crcCalculated);
104 
105  if (crcStat != Utils::PASSED_FILE_CRC_CHECK) {
106  this->log_WARNING_HI_CrcFailed(crcStat);
107  workerStat = FW_STATUS_FAILED_CRC;
108  }
109 
110  if (crc != crcFromFile) {
111  workerStat = FW_STATUS_FAILED_CRC;
112  this->log_WARNING_LO_CrcVerificationError(crc, crcCalculated);
113  }
114 
115  // Get filesize
116  Os::FileSystem::Status fsStat = Os::FileSystem::getFileSize(fileName, fileSize);
117  if (fsStat != Os::FileSystem::OP_OK) {
118  this->log_WARNING_HI_ReadFailedFileSize(fsStat);
119  workerStat = FW_STATUS_FAILED_FILE_SIZE;
120  }
121 
122  this->verifyDoneOut_out(0, workerStat, fileSize);
123 }
124 
125 void FileWorker ::writeIn_handler(FwIndexType portNum,
126  const Fw::StringBase& path,
127  Fw::Buffer& buffer,
128  FwSizeType offsetBytes,
129  bool append) {
130  // Validate inputs before processing file
131  if (path.length() == 0) {
132  this->log_WARNING_HI_InvalidInput(Fw::LogStringArg("writeIn"), Fw::LogStringArg("empty path"));
134  return;
135  }
136  if (!buffer.isValid()) {
137  this->log_WARNING_HI_InvalidInput(Fw::LogStringArg("writeIn"), Fw::LogStringArg("invalid buffer"));
139  return;
140  }
141  if (offsetBytes > buffer.getSize()) {
142  this->log_WARNING_HI_InvalidInput(Fw::LogStringArg("writeIn"), Fw::LogStringArg("invalid offset"));
144  return;
145  }
146 
147  char fileName[FileNameStringSize];
148 
149  // Make sure we are in IDLE state before proceeding
150  if (this->m_state != FW_STATE_IDLE) {
151  this->log_WARNING_HI_NotInIdle(this->m_state);
153  return;
154  }
155 
156  this->m_state = FW_STATE_WRITING;
157 
158  // New write request overrides any leftover abort state
159  this->m_abort.store(false, std::memory_order_relaxed);
160 
161  // Save file name
162  // NB: may count null terminator due to FPRIME/fprime-sw#57, but should still be less than FileNameStringSize in any
163  // case
165  if (length >= FileNameStringSize || length >= sizeof(fileName)) {
166  // Path length is ground-controlled, so an oversized path is invalid input, not a coding error.
167  this->log_WARNING_HI_InvalidInput(Fw::LogStringArg("writeIn"), Fw::LogStringArg("path too long"));
169  this->m_state = FW_STATE_IDLE;
170  return;
171  }
172 
173  (void)Fw::StringUtils::string_copy(fileName, path.toChar(), sizeof(fileName));
174  fileName[sizeof(fileName) - 1] = 0; // guarantee termination
175 
176  // Write
177  bool isWrite = this->writeBufferToFile(buffer, fileName, offsetBytes, append);
178  if (isWrite) {
179  this->writeBufferHashToFile(buffer, fileName, offsetBytes, append);
180  }
181 
182  this->writeDoneOut_out(0, FW_STATUS_DONE_WRITE, buffer.getSize());
183  this->m_state = FW_STATE_IDLE;
184  return;
185 }
186 
187 // ----------------------------------------------------------------------
188 // Helper functions
189 // ----------------------------------------------------------------------
190 
191 Svc ::FileWorkerStatus FileWorker ::readBufferFromFile(Fw::Buffer& buffer, const char* const fileName) {
192  FW_ASSERT(buffer.getData() != nullptr);
193  FW_ASSERT(fileName != nullptr);
194 
195  Fw::LogStringArg fileNameStr(fileName);
196  Os::File file;
197 
198  // Open file
199  Os::File::Status fileStat = file.open(fileName, Os::File::OPEN_READ);
200  if (fileStat != Os::File::OP_OK) {
201  this->log_WARNING_HI_OpenFileError(fileNameStr, fileStat);
203  }
204 
205  // Get buffer data and size
206  FwSizeType readSize = buffer.getSize();
207 
208  // Read file
209  this->log_ACTIVITY_LO_ReadBegin(readSize, fileNameStr);
210  this->readFile(buffer, readSize, file, fileNameStr);
211 
212  this->log_ACTIVITY_LO_ReadCompleted(readSize, fileNameStr);
213  file.close();
214 
216 }
217 
218 void FileWorker ::readFile(Fw::Buffer& buffer, FwSizeType size, Os::File& file, const Fw::LogStringArg& fileNameStr) {
219  FW_ASSERT(buffer.getData() != nullptr);
220  FW_ASSERT(size > 0);
221  FW_ASSERT(fileNameStr != nullptr);
222 
223  FwSizeType bytesRead = 0;
224  FwSizeType numChunks = 0;
225  U64 timeout = 0;
226 
227  if (!file.isOpen()) {
228  return;
229  }
230 
231  FileWorkerReadStatus readStat = this->readFileBytes(buffer, size, file, bytesRead);
232 
233  switch (readStat) {
234  case FW_READ_ERROR:
235  // Some read error
236  this->log_WARNING_HI_ReadError(bytesRead, size, fileNameStr);
237  break;
238 
239  case FW_READ_DONE:
240  break;
241 
242  case FW_READ_ABORT:
243  // Abort command was sent
244  this->log_WARNING_LO_ReadAborted(bytesRead, size, fileNameStr);
245  break;
246 
247  case FW_READ_TIMEOUT:
248  // Determine true timeout
249  static_assert(BLOCK_SIZE_BYTES > 0, "Divide by 0 error");
250  numChunks = (size / BLOCK_SIZE_BYTES);
251  if (size % BLOCK_SIZE_BYTES > 0) {
252  numChunks += 1;
253  }
254  timeout = numChunks * TIMEOUT_MS;
255  this->log_WARNING_HI_ReadTimeout(bytesRead, size, fileNameStr, timeout);
256  break;
257 
258  default:
259  FW_ASSERT(0); // Should not get here
260  break;
261  }
262 
263  return;
264 }
265 
266 Svc ::FileWorkerReadStatus FileWorker ::readFileBytes(Fw::Buffer& buffer,
267  FwSizeType size,
268  Os::File& file,
269  FwSizeType& bytesRead) {
270  FW_ASSERT(buffer.getData() != nullptr);
271  FW_ASSERT(size > 0);
272 
273  // Determine true timeout
274  static_assert(BLOCK_SIZE_BYTES > 0, "Divide by 0 error");
275  FwSizeType numChunks = (size / BLOCK_SIZE_BYTES);
276  if (size % BLOCK_SIZE_BYTES > 0) {
277  numChunks += 1;
278  }
279  U64 timeout = numChunks * TIMEOUT_MS;
280 
281  // Read loop
282  bytesRead = 0;
283  Fw::Time start = this->getTime();
284 
285  for (U32 i = 0; i < MAX_LOOP_ITERATIONS; i++) {
286  FwSizeType readAmt = FW_MIN(size - bytesRead, BLOCK_SIZE_BYTES);
287  FwSizeType readAmtActual = readAmt;
288  Os::File::Status ret = file.read(buffer.getData() + bytesRead, readAmtActual);
289 
290  if (Os::File::OP_OK != ret || readAmt != readAmtActual) {
292  }
293 
294  bool currAbort = this->m_abort.load(std::memory_order_relaxed);
295  if (currAbort) {
296  // Abort command was sent
298  }
299 
300  if (timeout > 0) {
301  // Only check timeout if > 0
302  Fw::Time now = this->getTime();
303  Fw::Time diff = Fw::Time::sub(now, start);
304  U64 elapsed = (diff.getSeconds() * 1000000) + diff.getUSeconds();
305  if (elapsed >= timeout) {
307  }
308  }
309 
310  bytesRead += readAmt;
311  if (bytesRead >= size) {
312  // Finished, break out
314  }
315  }
316 
318 }
319 
320 bool FileWorker ::getHash(const char* const hashFileName,
321  Utils::Hash& hash,
322  Utils::HashBuffer& hashBuffer,
323  const U8* const data,
324  const FwSizeType size) {
325  FW_ASSERT(hashFileName != nullptr);
326  FW_ASSERT(data != nullptr);
327  FW_ASSERT(size > 0);
328 
329  // Open file
330  Os::File file;
331  Os::File::Status stat = file.open(hashFileName, Os::File::OPEN_READ);
332 
333  // Read value if it exists
334  if (stat == Os::File::OP_OK) {
335  HASH_HANDLE_TYPE hashValue;
336  FwSizeType hashSize = sizeof(hashValue);
337  U8* hashValuePtr = reinterpret_cast<U8*>(&hashValue);
338  FW_ASSERT(hashValuePtr != nullptr);
339 
340  Os::File::Status readStat = file.read(hashValuePtr, hashSize);
341  if (readStat != Os::File::OP_OK) {
342  Fw::LogStringArg s(hashFileName);
343  this->log_WARNING_HI_WriteValidationReadError(s, readStat);
344  return false;
345  }
346  Utils::HashBuffer tmp(hashValuePtr, hashSize);
347  hash.setHashValue(tmp);
348  hash.update(data, size);
349  hash.finalize(hashBuffer);
350 
351  } else if (stat == Os::File::DOESNT_EXIST) {
352  hash.hash(data, size, hashBuffer);
353 
354  } else {
355  Fw::LogStringArg s(hashFileName);
357  return false;
358  }
359 
360  return true;
361 }
362 
363 bool FileWorker ::writeBufferToFile(Fw::Buffer& buffer, const char* fileName, FwSizeType offset, bool append) {
364  FW_ASSERT(buffer.getData() != nullptr);
365  FW_ASSERT(fileName != nullptr);
366 
367  Fw::LogStringArg logStringArg(fileName);
368  Os::File file;
370 
371  // Open file
372  if (!append) {
373  stat = file.open(fileName, Os::File::Mode::OPEN_WRITE);
374  } else {
375  stat = file.open(fileName, Os::File::Mode::OPEN_APPEND);
376  }
377 
378  if (stat != Os::File::OP_OK) {
379  this->log_WARNING_HI_OpenFileError(logStringArg, stat);
380  return false;
381  }
382 
383  // Get buffer data and size
384  FwSizeType size = buffer.getSize();
385  U8* const data = reinterpret_cast<U8*>(buffer.getData());
386  FW_ASSERT(data != nullptr);
387 
388  // Apply offset
389  FW_ASSERT(offset <= size);
390  size -= offset;
391  U8* const dataFromOffset = reinterpret_cast<U8*>(data + offset);
392  FW_ASSERT(dataFromOffset != nullptr);
393 
394  // Write file
395  this->log_ACTIVITY_LO_WriteBegin(size, logStringArg);
396  FwSizeType writtenSize = this->writeToFile(dataFromOffset, size, file, fileName);
397 
398  // Check written size
399  if (writtenSize != size) {
400  return false;
401  }
402 
403  this->log_ACTIVITY_LO_WriteCompleted(size, logStringArg);
404  return true;
405 }
406 
407 void FileWorker ::writeBufferHashToFile(Fw::Buffer& buffer, const char* fileName, FwSizeType offset, bool append) {
408  FW_ASSERT(buffer.getData() != nullptr);
409  FW_ASSERT(fileName != nullptr);
410 
411  // Construct hash file name
412  const char* ext = Utils::Hash::getFileExtensionString();
413  FW_ASSERT(ext != nullptr);
414  char hashFileName[FileNameStringSize];
415  Fw::FormatStatus status = Fw::stringFormat(hashFileName, sizeof(hashFileName), "%s%s", fileName, ext);
417 
418  // Compute hash
419  Utils::HashBuffer hashBuffer;
420  FwSizeType size = buffer.getSize();
421  U8* const data = reinterpret_cast<U8*>(buffer.getData());
422  FW_ASSERT(data != nullptr);
423 
424  // Apply offset
425  FW_ASSERT(offset <= size);
426  size -= offset; // checked by assert
427  U8* const dataFromOffset = reinterpret_cast<U8*>(data + offset);
428  FW_ASSERT(dataFromOffset != nullptr);
429 
430  Utils::Hash hash;
431  if (!append) {
432  hash.hash(dataFromOffset, size, hashBuffer);
433 
434  } else {
435  bool isHash = this->getHash(hashFileName, hash, hashBuffer, dataFromOffset, size);
436  if (!isHash) {
437  return;
438  }
439  }
440 
441  // Open file
442  Os::File file;
443  Os::File::Status stat = file.open(hashFileName, Os::File::Mode::OPEN_WRITE);
444  if (stat != Os::File::OP_OK) {
445  Fw::LogStringArg logStringArg(hashFileName);
446  this->log_WARNING_HI_OpenFileError(logStringArg, stat);
447  return;
448  }
449 
450  // Write hash
451  FwSizeType writtenSize = this->writeToFile(hashBuffer.getBuffAddr(), hashBuffer.getSize(), file, hashFileName);
452 
453  // Check written size
454  FwSizeType hashSize = hashBuffer.getSize();
455  if (writtenSize != hashSize) {
456  Fw::LogStringArg logStringArg(hashFileName);
457  this->log_WARNING_LO_WriteValidationError(logStringArg, writtenSize, hashSize);
458  return;
459  }
460 
461  return;
462 }
463 
464 FwSizeType FileWorker ::writeToFile(const U8* data, FwSizeType size, Os::File& file, const char* fileName) {
465  FW_ASSERT(data != nullptr);
466  FW_ASSERT(size > 0);
467  FW_ASSERT(file.isOpen());
468  FW_ASSERT(fileName != nullptr);
469 
470  // Determine true timeout
471  static_assert(BLOCK_SIZE_BYTES > 0, "Divide by 0 error");
472  FwSizeType numChunks = (size / BLOCK_SIZE_BYTES);
473  if (size % BLOCK_SIZE_BYTES > 0) {
474  numChunks += 1;
475  }
476  U64 timeout = numChunks * TIMEOUT_MS;
477 
478  // Write loop
479  FwSizeType bytesWritten = 0;
480  Fw::Time start = this->getTime();
481  for (U32 i = 0; i < MAX_LOOP_ITERATIONS; i++) {
482  FwSizeType writeAmt = FW_MIN(size - bytesWritten, BLOCK_SIZE_BYTES);
483  Os::File::Status ret = file.write(data + bytesWritten, writeAmt);
484 
485  if (Os::File::OP_OK != ret || writeAmt == 0) {
486  Fw::LogStringArg logStringArg(fileName);
487  this->log_WARNING_HI_WriteFileError(bytesWritten, size, logStringArg, ret);
488  break;
489  }
490 
491  bool currAbort = this->m_abort.load(std::memory_order_relaxed);
492  if (currAbort) {
493  // Abort command was sent
494  Fw::LogStringArg logStringArg(fileName);
495  this->log_WARNING_LO_WriteAborted(bytesWritten, size, logStringArg);
496  break;
497  }
498 
499  if (timeout > 0) {
500  // Only check timeout if > 0
501  Fw::Time now = this->getTime();
502  Fw::Time diff = Fw::Time::sub(now, start);
503  U64 elapsed = (diff.getSeconds() * 1000000) + diff.getUSeconds();
504 
505  if (elapsed >= timeout) {
506  Fw::LogStringArg logStringArg(fileName);
507  this->log_WARNING_HI_WriteTimeout(bytesWritten, size, logStringArg, timeout);
508  break;
509  }
510  }
511 
512  bytesWritten += writeAmt;
513  if (bytesWritten >= size) {
514  // Finished, break out
515  break;
516  }
517  }
518 
519  return bytesWritten;
520 }
521 
522 } // namespace Svc
void update(const void *const data, const FwSizeType len)
Definition: HashImpl.cpp:34
void log_WARNING_HI_ReadFailedFileSize(U32 fsStat)
U8 * getBuffAddr() override
PlatformSizeType FwSizeType
Serializable::SizeType getSize() const override
Get current buffer size.
void log_WARNING_HI_WriteValidationOpenError(const Fw::StringBase &hashFileName, I32 status)
void log_WARNING_HI_WriteTimeout(FwSizeType bytesWritten, FwSizeType writeSize, const Fw::StringBase &fileName, U64 timeout) const
U8 * getData() const
Definition: Buffer.cpp:56
virtual const CHAR * toChar() const =0
Convert to a C-style char*.
void log_WARNING_LO_ReadAborted(FwSizeType bytesRead, FwSizeType readSize, const Fw::StringBase &fileName) const
void log_ACTIVITY_LO_WriteBegin(FwSizeType writeSize, const Fw::StringBase &fileName) const
static Time sub(const Time &minuend, const Time &subtrahend)
Definition: Time.cpp:187
void log_WARNING_HI_InvalidInput(const Fw::StringBase &handler, const Fw::StringBase &issue) const
void log_ACTIVITY_LO_ReadCompleted(FwSizeType fileSize, const Fw::StringBase &fileName) const
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
Definition: File.cpp:43
void writeDoneOut_out(FwIndexType portNum, U32 status, FwSizeType sizeBytes) const
Invoke output port writeDoneOut.
#define FW_MIN(a, b)
MIN macro (deprecated in C++, use std::min)
Definition: BasicTypes.h:94
void log_WARNING_HI_OpenFileError(const Fw::StringBase &fileName, U32 fsStat)
bool isValid() const
Definition: Buffer.cpp:52
File doesn&#39;t exist (for read)
Definition: File.hpp:43
void log_ACTIVITY_LO_WriteCompleted(FwSizeType writeSize, const Fw::StringBase &fileName) const
char * string_copy(char *destination, const char *source, FwSizeType num)
copy string with null-termination guaranteed
Definition: StringUtils.cpp:7
void setHashValue(HashBuffer &value)
Definition: HashImpl.cpp:53
U32 getSeconds() const
Definition: Time.cpp:118
void verifyDoneOut_out(FwIndexType portNum, U32 status, FwSizeType sizeBytes) const
Invoke output port verifyDoneOut.
void close() override
close the file, if not opened then do nothing
Definition: File.cpp:90
Status write(const U8 *buffer, FwSizeType &size)
write data to this file from the supplied buffer bounded by size
Definition: File.cpp:206
A generic interface for creating and comparing hash values.
Definition: Hash.hpp:24
static const char * getFileExtensionString()
Definition: HashCommon.cpp:5
~FileWorker()
Destroy FileWorker object.
Definition: FileWorker.cpp:23
crc_stat_t verify_checksum(const char *const fname, U32 &expected, U32 &actual)
Definition: CRCChecker.cpp:133
void readDoneOut_out(FwIndexType portNum, U32 status, FwSizeType sizeBytes) const
Invoke output port readDoneOut.
#define HASH_HANDLE_TYPE
Definition: Crc32.hpp:20
void log_WARNING_HI_WriteFileError(FwSizeType bytesWritten, FwSizeType writeSize, const Fw::StringBase &fileName, I32 status)
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:53
void log_WARNING_HI_NotInIdle(U32 currState)
void log_WARNING_LO_WriteAborted(FwSizeType bytesWritten, FwSizeType writeSize, const Fw::StringBase &fileName) const
void log_ACTIVITY_LO_ReadBegin(FwSizeType fileSize, const Fw::StringBase &fileName) const
static Status getFileSize(const char *path, FwSizeType &size)
Get the size of the file (in bytes) at the specified path.
Definition: FileSystem.cpp:226
Status read(U8 *buffer, FwSizeType &size)
read data from this file into supplied buffer bounded by size
Definition: File.cpp:187
FwSizeType getSize() const
Definition: Buffer.cpp:60
static void hash(const void *data, const FwSizeType len, HashBuffer &buffer)
Definition: HashImpl.cpp:24
void log_WARNING_HI_WriteValidationReadError(const Fw::StringBase &hashFileName, I32 status)
Operation was successful.
Definition: File.hpp:42
U32 getUSeconds() const
Definition: Time.cpp:122
PlatformIndexType FwIndexType
void log_WARNING_LO_CrcVerificationError(U32 crcExp, U32 crcCalculated) const
void configure(U64 chunkSize)
Definition: FileWorker.cpp:18
Open file for reading.
Definition: File.hpp:33
A container class for holding a hash buffer.
Definition: HashBuffer.hpp:26
FormatStatus stringFormat(char *destination, const FwSizeType maximumSize, const char *formatString,...)
format a c-string
FileWorker(const char *const compName)
Construct FileWorker object.
Definition: FileWorker.cpp:15
RateGroupDivider component implementation.
virtual SizeType length() const
Get the length of the string.
FileWorkerReadStatus
void log_WARNING_LO_WriteValidationError(const Fw::StringBase &hashFileName, FwSizeType bytesWritten, FwSizeType hashSize) const
Operation was successful.
Definition: FileSystem.hpp:24
void start(FwTaskPriorityType priority=Os::Task::TASK_PRIORITY_DEFAULT, FwSizeType stackSize=Os::Task::TASK_DEFAULT, FwSizeType cpuAffinity=Os::Task::TASK_DEFAULT, FwTaskIdType identifier=static_cast< FwTaskIdType >(Os::Task::TASK_DEFAULT))
called by instantiator when task is to be started
void finalize(HashBuffer &buffer) const
Definition: HashImpl.cpp:40
void log_WARNING_HI_ReadError(FwSizeType bytesRead, FwSizeType readSize, const Fw::StringBase &fileName) const
#define FW_ASSERT(...)
Definition: Assert.hpp:14
bool isOpen() const
determine if the file is open
Definition: File.cpp:98
void log_WARNING_HI_ReadTimeout(FwSizeType bytesRead, FwSizeType readSize, const Fw::StringBase &fileName, U64 timeout) const
Auto-generated base for FileWorker component.
FwSizeType string_length(const CHAR *source, FwSizeType buffer_size)
get the length of the source string
Definition: StringUtils.cpp:32
FormatStatus
status of string format calls
Definition: format.hpp:18
#define U64(C)
Definition: sha.h:181