blob: be1806b00bb3e9774e400b69d3e6f4f8b9be7819 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0
// Copyright (C) 2020 YADRO
#pragma once
#include <ctime>
#include <functional>
#include <list>
#include <string>
/**
* @class LogBuffer
* @brief Container with automatic log message rotation.
*/
class LogBuffer
{
public:
/**
* @struct Message
* @brief Single log message.
*/
struct Message
{
/** @brief Message creation time. */
time_t timeStamp;
/** @brief Text of the message. */
std::string text;
};
using container_t = std::list<Message>;
/**
* @brief Constructor.
*
* @param[in] maxSize max number of messages that can be stored
* @param[in] maxTime max age of messages that can be stored, in minutes
*/
LogBuffer(size_t maxSize, size_t maxTime);
virtual ~LogBuffer() = default;
/**
* @brief Add raw data from host's console output.
*
* @param[in] data pointer to raw data buffer
* @param[in] sz size of the buffer in bytes
*/
virtual void append(const char* data, size_t sz);
/**
* @brief Set handler called if buffer is full.
*
* @param[in] cb callback function
*/
virtual void setFullHandler(std::function<void()> cb);
/** @brief Clear (reset) container. */
virtual void clear();
/** @brief Check container for empty. */
virtual bool empty() const;
/** @brief Get container's iterator. */
container_t::const_iterator begin() const;
/** @brief Get container's iterator. */
container_t::const_iterator end() const;
private:
/** @brief Remove the oldest messages from container. */
void shrink();
private:
/** @brief Log message list. */
container_t messages;
/** @brief Flag to indicate that the last message is incomplete. */
bool lastComplete;
/** @brief Max number of messages that can be stored. */
size_t sizeLimit;
/** @brief Max age of messages (in minutes) that can be stored. */
size_t timeLimit;
/** @brief Callback function called if buffer is full. */
std::function<void()> fullHandler;
};