-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCFrameDataFileWriter.cpp
More file actions
60 lines (48 loc) · 1.56 KB
/
Copy pathCFrameDataFileWriter.cpp
File metadata and controls
60 lines (48 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "CFrameDataFileWriter.h"
PurrFX::CFrameDataFileWriter::CFrameDataFileWriter(const pathstring& i_sFileName, size_t i_nSize):
CFrameDataConsumer(i_nSize),
m_oFile(i_sFileName)
{
if (!m_oFile.isOpened())
return;
// Header format:
// "FD" - 2 bytes string
// Version - 1 byte, unsigned
// Register count - 1 byte, unsigned
static_assert(RegisterCount <= 0xFF, "Too many registers");
const uint8_t nVersion = 1;
const uint8_t nRegisterCount = RegisterCount;
m_oFile.write("FD", 2);
m_oFile.write(&nVersion, sizeof(nVersion));
m_oFile.write(&nRegisterCount, sizeof(nRegisterCount));
}
void PurrFX::CFrameDataFileWriter::onFrameDataReady(const CFrameData& i_rFrameData)
{
if (!m_oFile.isOpened())
return;
// Frame data item format:
// Write marks - X bytes (depends on register count, for example 2 bytes for 9 registers)
// Register Values - Y bytes (by register count)
// Write marks
constexpr size_t nMarksBytes = RegisterCount/8 + (RegisterCount%8 == 0 ? 0 : 1);
std::array<uint8_t, nMarksBytes> aMarks;
std::fill(aMarks.begin(), aMarks.end(), 0);
for (size_t i = 0; i < RegisterCount; i++)
{
ERegister eRegister = ERegister(i);
if (i_rFrameData.isSet(eRegister))
{
const size_t nByte = i/8;
const size_t nBit = i%8;
aMarks[nByte] |= (uint8_t(1) << nBit);
}
}
m_oFile.write(aMarks.data(), aMarks.size());
// Register values
for (size_t i = 0; i < RegisterCount; i++)
{
ERegister eRegister = ERegister(i);
uint8_t nValue = i_rFrameData.get(eRegister);
m_oFile.write(&nValue, sizeof(nValue));
}
}