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/

Committer:
ketjow
Date:
Fri May 27 10:27:41 2016 +0000
Revision:
0:caae6cde6ca8
Initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ketjow 0:caae6cde6ca8 1 /*!
ketjow 0:caae6cde6ca8 2 @file logger.cpp
ketjow 0:caae6cde6ca8 3
ketjow 0:caae6cde6ca8 4 The implementation of the logger base class.
ketjow 0:caae6cde6ca8 5
ketjow 0:caae6cde6ca8 6 @par Full Description
ketjow 0:caae6cde6ca8 7 The implementation of the logger base class.
ketjow 0:caae6cde6ca8 8
ketjow 0:caae6cde6ca8 9 @if REVISION_HISTORY_INCLUDED
ketjow 0:caae6cde6ca8 10 @par Edit History
ketjow 0:caae6cde6ca8 11 @li [0] wojciech.rynczuk@wp.pl 20-JAN-2015 Initial file revision.
ketjow 0:caae6cde6ca8 12 @endif
ketjow 0:caae6cde6ca8 13
ketjow 0:caae6cde6ca8 14 @ingroup Logger
ketjow 0:caae6cde6ca8 15
ketjow 0:caae6cde6ca8 16 The MIT License (MIT)
ketjow 0:caae6cde6ca8 17 Copyright (c) 2016 Wojciech Rynczuk
ketjow 0:caae6cde6ca8 18
ketjow 0:caae6cde6ca8 19 */
ketjow 0:caae6cde6ca8 20
ketjow 0:caae6cde6ca8 21 #include "logger.hpp"
ketjow 0:caae6cde6ca8 22
ketjow 0:caae6cde6ca8 23 #include <new>
ketjow 0:caae6cde6ca8 24 #include <cstring>
ketjow 0:caae6cde6ca8 25
ketjow 0:caae6cde6ca8 26 Logger::Logger(uint32_t nLines, uint32_t nCharacters) : m_Lines(nLines), m_Characters(nCharacters)
ketjow 0:caae6cde6ca8 27 {
ketjow 0:caae6cde6ca8 28 m_ReadMarker = 0;
ketjow 0:caae6cde6ca8 29 m_WriteMarker = 0;
ketjow 0:caae6cde6ca8 30 m_isRecording = false;
ketjow 0:caae6cde6ca8 31 m_pLogData = new(std::nothrow) char [sizeof(char) * m_Lines * m_Characters];
ketjow 0:caae6cde6ca8 32 m_Timer.start();
ketjow 0:caae6cde6ca8 33 }
ketjow 0:caae6cde6ca8 34
ketjow 0:caae6cde6ca8 35 Logger::~Logger()
ketjow 0:caae6cde6ca8 36 {
ketjow 0:caae6cde6ca8 37 delete m_pLogData;
ketjow 0:caae6cde6ca8 38 }
ketjow 0:caae6cde6ca8 39
ketjow 0:caae6cde6ca8 40 uint32_t Logger::Log(const char* line)
ketjow 0:caae6cde6ca8 41 {
ketjow 0:caae6cde6ca8 42 int32_t was_masked;
ketjow 0:caae6cde6ca8 43
ketjow 0:caae6cde6ca8 44 if (m_pLogData != NULL)
ketjow 0:caae6cde6ca8 45 {
ketjow 0:caae6cde6ca8 46 if (true == m_isRecording)
ketjow 0:caae6cde6ca8 47 {
ketjow 0:caae6cde6ca8 48 //Disable interrupts
ketjow 0:caae6cde6ca8 49 was_masked = __disable_irq();
ketjow 0:caae6cde6ca8 50
ketjow 0:caae6cde6ca8 51 if ((m_ReadMarker == (m_WriteMarker + 1)) || \
ketjow 0:caae6cde6ca8 52 ((m_WriteMarker == (m_Lines - 1)) && (m_ReadMarker == 0)))
ketjow 0:caae6cde6ca8 53 {
ketjow 0:caae6cde6ca8 54 AlarmFull();
ketjow 0:caae6cde6ca8 55 }
ketjow 0:caae6cde6ca8 56 else
ketjow 0:caae6cde6ca8 57 {
ketjow 0:caae6cde6ca8 58 (void)std::strncpy(m_pLogData + (m_WriteMarker * m_Characters), line, m_Characters);
ketjow 0:caae6cde6ca8 59 m_WriteMarker++;
ketjow 0:caae6cde6ca8 60 if (m_WriteMarker == m_Lines)
ketjow 0:caae6cde6ca8 61 {
ketjow 0:caae6cde6ca8 62 m_WriteMarker = 0;
ketjow 0:caae6cde6ca8 63 }
ketjow 0:caae6cde6ca8 64 }
ketjow 0:caae6cde6ca8 65
ketjow 0:caae6cde6ca8 66 //Enable interrupts (or not)
ketjow 0:caae6cde6ca8 67 if (!was_masked)
ketjow 0:caae6cde6ca8 68 {
ketjow 0:caae6cde6ca8 69 __enable_irq();
ketjow 0:caae6cde6ca8 70 }
ketjow 0:caae6cde6ca8 71 }
ketjow 0:caae6cde6ca8 72 }
ketjow 0:caae6cde6ca8 73 else
ketjow 0:caae6cde6ca8 74 {
ketjow 0:caae6cde6ca8 75 Printf("Not enough memory for logging.\n");
ketjow 0:caae6cde6ca8 76 }
ketjow 0:caae6cde6ca8 77 return 0;
ketjow 0:caae6cde6ca8 78 }
ketjow 0:caae6cde6ca8 79
ketjow 0:caae6cde6ca8 80 uint32_t Logger::Print()
ketjow 0:caae6cde6ca8 81 {
ketjow 0:caae6cde6ca8 82 uint32_t counter = 0;
ketjow 0:caae6cde6ca8 83 if (m_pLogData != NULL)
ketjow 0:caae6cde6ca8 84 {
ketjow 0:caae6cde6ca8 85 while(m_ReadMarker != m_WriteMarker)
ketjow 0:caae6cde6ca8 86 {
ketjow 0:caae6cde6ca8 87 Printf(m_pLogData + (m_ReadMarker++ * m_Characters));
ketjow 0:caae6cde6ca8 88 if (m_ReadMarker == m_Lines)
ketjow 0:caae6cde6ca8 89 {
ketjow 0:caae6cde6ca8 90 m_ReadMarker = 0;
ketjow 0:caae6cde6ca8 91 }
ketjow 0:caae6cde6ca8 92 counter++;
ketjow 0:caae6cde6ca8 93 }
ketjow 0:caae6cde6ca8 94 }
ketjow 0:caae6cde6ca8 95 return counter;
ketjow 0:caae6cde6ca8 96 }
ketjow 0:caae6cde6ca8 97
ketjow 0:caae6cde6ca8 98 int32_t Logger::GetTime()
ketjow 0:caae6cde6ca8 99 {
ketjow 0:caae6cde6ca8 100 return m_Timer.read_us();
ketjow 0:caae6cde6ca8 101 }
ketjow 0:caae6cde6ca8 102
ketjow 0:caae6cde6ca8 103 void Logger::StartRecording()
ketjow 0:caae6cde6ca8 104 {
ketjow 0:caae6cde6ca8 105 if (0 == StartAction())
ketjow 0:caae6cde6ca8 106 {
ketjow 0:caae6cde6ca8 107 m_isRecording = true;
ketjow 0:caae6cde6ca8 108 }
ketjow 0:caae6cde6ca8 109 }
ketjow 0:caae6cde6ca8 110
ketjow 0:caae6cde6ca8 111 void Logger::StopRecording()
ketjow 0:caae6cde6ca8 112 {
ketjow 0:caae6cde6ca8 113 m_isRecording = false;
ketjow 0:caae6cde6ca8 114 StopAction();
ketjow 0:caae6cde6ca8 115 }
ketjow 0:caae6cde6ca8 116
ketjow 0:caae6cde6ca8 117 bool Logger::IsRecording()
ketjow 0:caae6cde6ca8 118 {
ketjow 0:caae6cde6ca8 119 return m_isRecording;
ketjow 0:caae6cde6ca8 120 }