F´ Flight Software - C/C++ Documentation  NASA-v2.0.1
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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