Skip to content

Commit b983abe

Browse files
committed
Add implementation for the logging library.
Signed-off-by: Jan Losinski <[email protected]>
1 parent 83c787c commit b983abe

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed

src/ArduinoSimpleLogging.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* ArduinoSimpleLogging
3+
*
4+
* https://github.com/janLo/ArduinoSimpleLogging
5+
*
6+
* Copyright (c) 2017 Jan Losinski.
7+
* MIT License
8+
*/
9+
10+
#include "ArduinoSimpleLogging.h"
11+
12+
size_t ArduinoSimpleLogging::LogTarget::write(uint8_t byte) {
13+
return Logger.log(_level, byte);
14+
}
15+
16+
size_t ArduinoSimpleLogging::LogTarget::write(const uint8_t *buffer, size_t size) {
17+
return Logger.log(_level, buffer, size);
18+
}
19+
20+
size_t ArduinoSimpleLogging::log(ArduinoSimpleLogging::Level level, const uint8_t *buffer,
21+
size_t size) {
22+
for (auto &handler : handlers) {
23+
if ((handler.mask & level) != 0) {
24+
handler.stream.write(buffer, size);
25+
}
26+
}
27+
return size;
28+
}
29+
30+
size_t ArduinoSimpleLogging::log(ArduinoSimpleLogging::Level level, uint8_t byte) {
31+
for (auto &handler : handlers) {
32+
if ((handler.mask & level) != 0) {
33+
handler.stream.write(byte);
34+
}
35+
}
36+
37+
return 1;
38+
}
39+
40+
uint8_t ArduinoSimpleLogging::LogHandler::makeMask(
41+
const ArduinoSimpleLogging::Level level) {
42+
uint8_t mask = 0x0;
43+
while (mask < level) {
44+
mask = (mask << 1) | (uint8_t)0x01;
45+
}
46+
return mask;
47+
}
48+
49+
void ArduinoSimpleLogging::addHandler(ArduinoSimpleLogging::Level level, Print &stream) {
50+
removeHandler(stream);
51+
handlers.emplace_front(level, stream);
52+
}
53+
54+
void ArduinoSimpleLogging::removeHandler(Print &stream) {
55+
handlers.remove_if([&stream](const LogHandler &handler) {
56+
return &(handler.stream) == &stream;
57+
});
58+
}
59+
60+
ArduinoSimpleLogging Logger;
61+
62+
ArduinoSimpleLogging::LogTarget ArduinoSimpleLogging::debug(DEBUG);
63+
ArduinoSimpleLogging::LogTarget ArduinoSimpleLogging::info(INFO);
64+
ArduinoSimpleLogging::LogTarget ArduinoSimpleLogging::warning(WARNING);
65+
ArduinoSimpleLogging::LogTarget ArduinoSimpleLogging::error(ERROR);

src/ArduinoSimpleLogging.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* ArduinoSimpleLogging
3+
*
4+
* https://github.com/janLo/ArduinoSimpleLogging
5+
*
6+
* Copyright (c) 2017 Jan Losinski.
7+
* MIT License
8+
*/
9+
10+
#ifndef ARDUINOLOGGING_H
11+
#define ARDUINOLOGGING_H
12+
13+
#include <forward_list>
14+
15+
#include <Print.h>
16+
17+
class ArduinoSimpleLogging {
18+
public:
19+
enum Level {
20+
ERROR = 0x01,
21+
WARNING = (0x01 << 1),
22+
INFO = (0x01 << 2),
23+
DEBUG = (0x01 << 3)
24+
};
25+
26+
class LogTarget : public Print {
27+
public:
28+
explicit LogTarget(const Level level) : _level(level) {}
29+
LogTarget(const LogTarget &) = delete;
30+
LogTarget(const LogTarget &&) = delete;
31+
32+
size_t write(uint8_t) override;
33+
size_t write(const uint8_t *buffer, size_t size) override;
34+
35+
private:
36+
Level _level;
37+
};
38+
39+
static LogTarget debug;
40+
static LogTarget info;
41+
static LogTarget warning;
42+
static LogTarget error;
43+
44+
size_t log(Level level, const uint8_t *buffer, size_t size);
45+
size_t log(Level level, uint8_t);
46+
47+
void addHandler(Level level, Print &);
48+
void removeHandler(Print &);
49+
50+
private:
51+
struct LogHandler {
52+
const uint8_t mask;
53+
Print &stream;
54+
55+
static uint8_t makeMask(Level level);
56+
LogHandler(Level level, Print &stream)
57+
: mask(makeMask(level)), stream(stream) {}
58+
};
59+
60+
std::forward_list<LogHandler> handlers;
61+
};
62+
63+
extern ArduinoSimpleLogging Logger;
64+
65+
#endif // ARDUINOLOGGING_H

0 commit comments

Comments
 (0)