vcdMaker demo logger library. See http://vcdmaker.org for details. vcdMaker demos: For Freescale FRDM-KL46Z: https://developer.mbed.org/users/ketjow/code/vcdMaker_Demo/ For ST Disco L476: https://developer.mbed.org/users/ketjow/code/vcdMaker_Demo_DISCO_L476/
logger.cpp
- Committer:
- ketjow
- Date:
- 2016-05-27
- Revision:
- 0:caae6cde6ca8
File content as of revision 0:caae6cde6ca8:
/*! @file logger.cpp The implementation of the logger base class. @par Full Description The implementation of the logger base class. @if REVISION_HISTORY_INCLUDED @par Edit History @li [0] wojciech.rynczuk@wp.pl 20-JAN-2015 Initial file revision. @endif @ingroup Logger The MIT License (MIT) Copyright (c) 2016 Wojciech Rynczuk */ #include "logger.hpp" #include <new> #include <cstring> Logger::Logger(uint32_t nLines, uint32_t nCharacters) : m_Lines(nLines), m_Characters(nCharacters) { m_ReadMarker = 0; m_WriteMarker = 0; m_isRecording = false; m_pLogData = new(std::nothrow) char [sizeof(char) * m_Lines * m_Characters]; m_Timer.start(); } Logger::~Logger() { delete m_pLogData; } uint32_t Logger::Log(const char* line) { int32_t was_masked; if (m_pLogData != NULL) { if (true == m_isRecording) { //Disable interrupts was_masked = __disable_irq(); if ((m_ReadMarker == (m_WriteMarker + 1)) || \ ((m_WriteMarker == (m_Lines - 1)) && (m_ReadMarker == 0))) { AlarmFull(); } else { (void)std::strncpy(m_pLogData + (m_WriteMarker * m_Characters), line, m_Characters); m_WriteMarker++; if (m_WriteMarker == m_Lines) { m_WriteMarker = 0; } } //Enable interrupts (or not) if (!was_masked) { __enable_irq(); } } } else { Printf("Not enough memory for logging.\n"); } return 0; } uint32_t Logger::Print() { uint32_t counter = 0; if (m_pLogData != NULL) { while(m_ReadMarker != m_WriteMarker) { Printf(m_pLogData + (m_ReadMarker++ * m_Characters)); if (m_ReadMarker == m_Lines) { m_ReadMarker = 0; } counter++; } } return counter; } int32_t Logger::GetTime() { return m_Timer.read_us(); } void Logger::StartRecording() { if (0 == StartAction()) { m_isRecording = true; } } void Logger::StopRecording() { m_isRecording = false; StopAction(); } bool Logger::IsRecording() { return m_isRecording; }