F´ Flight Software - C/C++ Documentation  NASA-v2.0.0
A framework for building embedded system applications to NASA flight quality standards.
FileCommon.cpp
Go to the documentation of this file.
1 #include <FpConfig.hpp>
3 #include <Os/File.hpp>
4 #include <Fw/Types/Assert.hpp>
5 
6 #ifdef __cplusplus
7 extern "C" {
8 #endif // __cplusplus
9 
10 #include <Utils/Hash/libcrc/lib_crc.h> // borrow CRC
11 
12 #ifdef __cplusplus
13 }
14 #endif // __cplusplus
15 
16 namespace Os {
17  File::Status File::niceCRC32(U32 &crc, const char* fileName)
18  {
19  //Constants used in this function
20  const U32 CHUNK_SIZE = 4096;
21  const U32 INITIAL_SEED = 0xFFFFFFFF;
22  const U32 MAX_IT = 0xFFFFFFFF; //Max int for U32
23  //Loop variables for calculating CRC
24  NATIVE_INT_TYPE offset = 0;
25  U32 seed = INITIAL_SEED;
26  Status status;
27  File file;
28  U8 file_buffer[CHUNK_SIZE];
29  bool eof = false;
30  //Loop across the whole file
31  for (U32 i = 0; !eof && i < MAX_IT; i++) {
32  //Open and check status
33  status = file.open(fileName, OPEN_READ);
34  if (status != OP_OK) {
35  crc = 0;
36  return status;
37  }
38  //Find our place
39  status = file.seek(offset, true);
40  if (status != OP_OK) {
41  crc = 0;
42  return status;
43  }
44  NATIVE_INT_TYPE chunk = CHUNK_SIZE;
45  //Read data and check status
46  status = file.read(file_buffer, chunk, false);
47  offset += chunk;
48  //Close file, then update CRC. This reduces time file is required open
49  file.close();
50  if (chunk != 0 && status == OP_OK) {
51  for (U32 ci = 0; static_cast<NATIVE_INT_TYPE>(ci) < chunk; ci++) {
52  seed = update_crc_32(seed, file_buffer[ci]);
53  }
54  } else if (chunk == 0 && status == OP_OK) {
55  eof = true;
56  break;
57  } else {
58  crc = 0;
59  return status;
60  }
61  }
62  //Reach max-loop
63  if (!eof) {
64  crc = 0;
65  return OTHER_ERROR;
66  }
67  //Good CRC
68  crc = seed;
69  return OP_OK;
70  }
71 }
Os
Definition: File.cpp:7
Os::File::niceCRC32
static Status niceCRC32(U32 &crc, const char *fileName)
Calculates CRC32 of file, not burdening FS.
Definition: FileCommon.cpp:17
Os::File::close
void close(void)
close file
Definition: File.cpp:37
Os::File::read
Status read(void *buffer, NATIVE_INT_TYPE &size, bool waitForFull=true)
waitForFull = true to wait for all bytes to be read
Definition: File.cpp:29
U8
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.hpp:76
Os::File::OTHER_ERROR
@ OTHER_ERROR
A catch-all for other errors. Have to look in implementation-specific code.
Definition: File.hpp:32
Assert.hpp
Os::File::seek
Status seek(NATIVE_INT_TYPE offset, bool absolute=true)
seek to location. If absolute = true, absolute from beginning of file
Definition: File.cpp:25
Os::File::open
Status open(const char *fileName, Mode mode)
open file. Writing creates file if it doesn't exist
Definition: File.cpp:13
File.hpp
FpConfig.hpp
ISF configuration file.
lib_crc.h
Os::File::Status
Status
Definition: File.hpp:24
BasicTypes.hpp
Declares ISF basic types.
Os::File::OP_OK
@ OP_OK
Operation was successful.
Definition: File.hpp:25
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
Os::File::OPEN_READ
@ OPEN_READ
Open file for reading.
Definition: File.hpp:16
Os::File
Definition: File.hpp:11
update_crc_32
unsigned long update_crc_32(unsigned long crc, char c)
Definition: lib_crc.c:269