30#include <fmt/format.h>
51 int logNumber = findNextLogNumber();
54 TRACE(
"Too many log files, aborting\n");
58 string logName = getLogName(logNumber);
60 file = fopen(logName.c_str(),
"ab");
64 TRACE(
"Error opening %s file\n", logName.c_str());
69 fileNumber = logNumber;
78 packTh = Thread::create(packThreadLauncher, STACK_MIN_FOR_SKYWARD, 1,
this,
83 TRACE(
"Error creating pack thread\n");
87 writeTh = Thread::create(writeThreadLauncher, STACK_MIN_FOR_SKYWARD, 1,
88 this, Thread::JOINABLE);
91 fullRecordsQueue.put(
nullptr);
95 while (fullBufferList.front() !=
nullptr)
97 emptyBufferList.push(fullBufferList.front());
100 fullBufferList.pop();
102 TRACE(
"Error creating write thread\n");
113 if (started ==
false)
119 fullRecordsQueue.put(
nullptr);
133 bool result = ofstream(
"/sd/test").good();
134 std::remove(
"/sd/test");
174 for (
unsigned int i = 0; i < numRecords; i++)
175 emptyRecordsQueue.put(
new Record);
178 for (
unsigned int i = 0; i < numMappings; i++)
179 emptyMappingsQueue.put(
new MappingRecord);
182 for (
unsigned int i = 0; i < numBuffers; i++)
183 emptyBufferList.push(
new Buffer);
186int Logger::findNextLogNumber()
189 int high = maxFilenameNumber;
193 int mid = low + (high - low) / 2;
194 std::string logName = getLogName(mid);
197 if (stat(logName.c_str(), &st) == 0)
211 if (low > maxFilenameNumber)
221string Logger::getLogName(
int logNumber)
223 return fmt::format(
"/sd/log{:02d}.dat", logNumber);
226void Logger::packThreadLauncher(
void* argv)
228 reinterpret_cast<Logger*
>(argv)->packThread();
231void Logger::writeThreadLauncher(
void* argv)
233 reinterpret_cast<Logger*
>(argv)->writeThread();
236void Logger::packThread()
257 Buffer* buffer =
nullptr;
259 Lock<FastMutex>
l(mutex);
261 while (emptyBufferList.empty())
263 buffer = emptyBufferList.front();
264 emptyBufferList.pop();
270 Record* record =
nullptr;
271 fullRecordsQueue.get(record);
274 if (record ==
nullptr)
276 Lock<FastMutex>
l(mutex);
277 fullBufferList.push(buffer);
278 fullBufferList.push(
nullptr);
289 auto* mapping = record->mapping;
290 memcpy(buffer->data + buffer->size, mapping->data,
292 buffer->size += mapping->size;
293 emptyMappingsQueue.put(mapping);
296 memcpy(buffer->data + buffer->size, record->data, record->size);
297 buffer->size += record->size;
298 emptyRecordsQueue.put(record);
299 }
while (bufferSize - buffer->size >=
300 maxRecordSize + maxMappingSize);
303 Lock<FastMutex>
l(mutex);
305 fullBufferList.push(buffer);
313 TRACE(
"Error: packThread failed due to an exception: %s\n", e.what());
317void Logger::writeThread()
325 Buffer* buffer =
nullptr;
327 Lock<FastMutex>
l(mutex);
329 while (fullBufferList.empty())
331 buffer = fullBufferList.front();
332 fullBufferList.pop();
337 if (buffer ==
nullptr)
341 using namespace std::chrono;
342 auto start = system_clock::now();
344 size_t result = fwrite(buffer->data, 1, buffer->size, file);
345 if (result != buffer->size)
357 auto interval = system_clock::now() -
start;
359 duration_cast<milliseconds>(interval).count();
364 Lock<FastMutex>
l(mutex);
367 emptyBufferList.push(buffer);
374 TRACE(
"Error: writeThread failed due to an exception: %s\n", e.what());
LoggerResult log(const T &t)
Call this function to log a class.
void logStats()
Log logger stats using the logger itself.
std::string getCurrentFileName()
int getCurrentLogNumber()
static bool testSDCard()
Tests if the Logger can write to the SD card by opening a file.
void stop()
Call this function to stop the logger.
bool start()
Call this function to start the logger.
static StackLogger & getInstance()
void updateStack(uint8_t threadId)
uint64_t getTimestamp()
Returns the current timer value in microseconds.
Driver for the VN100S IMU.
Statistics for the logger.
int32_t buffersWritten
Number of buffers written to disk.
int32_t buffersFilled
Number of buffers filled.
int32_t logNumber
Number of dropped samples because they where too large.
int32_t lastWriteError
Error of the last fwrite() that failed.
int32_t maxWriteTime
Max time for an fwrite() of a buffer.
int32_t averageWriteTime
Average time for an fwrite() of a buffer.
int32_t writesFailed
Number of fwrite() that failed.