REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
jsonl_logging.h
Go to the documentation of this file.
1// Copyright (c) 2023 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
4
5#pragma once
6
7#include <Arduino.h> // Output, millis()
8#ifdef ARDUINO
9
10#include <list>
11#include <string>
12
15
16namespace msg {
17
19template <typename T> class ring_buffer {
20 std::list<T> _data;
21
22public:
24 const std::list<T> &data() const { return _data; }
25
26 size_t max_size;
27
29
30 void push_back(T item) {
31 if (_data.size() > max_size)
32 _data.pop_front();
33 _data.push_back(item);
34 }
35
36 void clear() { _data.clear(); }
37};
38
39// Decorates a stream of characters into JSONL-ready LogLines
40struct StreamLogger : public Print {
41 uint16_t line_count = 0;
42 bool new_line = true;
44
45 StreamLogger(Print &_target) : target(_target) {}
46
47 virtual size_t write(uint8_t b) override;
48 // size_t write(const uint8_t *buffer, size_t size) override
49};
50
57struct Log : public Print {
60
62
63 virtual size_t write(uint8_t b) override { return formatter.write(b); }
64
65 // for debugging...
66 // Log() : msg::StreamLogger(Serial) {}
67
68 static Log &get() {
69 static Log instance;
70 return instance;
71 }
72};
73
75
87struct StartupLog : public Print {
88 constexpr static size_t max_buf_size = 60;
90 std::string linebuf = "";
91
92 StartupLog() { linebuf.reserve(80); }
93
94 bool is_active() { return buf.max_size != 0; }
95
96 virtual size_t write(uint8_t b) override {
97 if (b == '\r')
98 return 1; // Ignore CR in CR NL
99 if (b == '\n') {
101 linebuf.clear();
102 return 1;
103 }
104 linebuf += b;
105 return 1;
106 }
107
108 void disable() {
109 buf.max_size = 0;
110 buf.clear();
111 linebuf.clear();
112 }
113
114 // Logs are big so don't use regular ArduinoJSON
116
117 static StartupLog &get() {
118 static StartupLog instance;
119 return instance;
120 }
121};
122
123} // namespace msg
124
125#endif // ARDUINO
Poor man's ring buffer based on a STL list.
const std::list< T > & data() const
Read-only access to the underlying data structure.
size_t max_size
Maximum number of elements to hold.
ring_buffer(int max_size)
void push_back(T item)
A "multiplexer" for Print targets.
The Streaming JSON API provides a way of constructing (writing) JSON messages without RAM overhead.
Definition carrier.h:12
void activate_serial_log()
This provides a simple log facility for error reporting.
utils::PrintMultiplexer sinks
virtual size_t write(uint8_t b) override
static Log & get()
msg::StreamLogger formatter
This class holds a finite size log (i.e.
static StartupLog & get()
static constexpr size_t max_buf_size
msg::ring_buffer< std::string > buf
void stream_to_json(utils::StreamingJson &s)
std::string linebuf
virtual size_t write(uint8_t b) override
::utils::StreamingJson target
virtual size_t write(uint8_t b) override
StreamLogger(Print &_target)