Skip to content

Commit 28522d6

Browse files
authored
Merge pull request #27 from bcmi-labs/global-local-callbacks
Global local callbacks
2 parents fd2bfa1 + 31840d7 commit 28522d6

File tree

4 files changed

+120
-0
lines changed

4 files changed

+120
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/**************************************************************************************
2+
* INCLUDE
3+
**************************************************************************************/
4+
5+
#include <Arduino_ThreadsafeIO.h>
6+
7+
/**************************************************************************************
8+
* CONSTANTS
9+
**************************************************************************************/
10+
11+
static size_t constexpr NUM_THREADS = 5;
12+
13+
/**************************************************************************************
14+
* FUNCTION DECLARATION
15+
**************************************************************************************/
16+
17+
String serial_log_message_prefix(String const & /* msg */);
18+
String serial_log_message_suffix(String const & prefix, String const & msg);
19+
void serial_thread_func();
20+
21+
/**************************************************************************************
22+
* GLOBAL VARIABLES
23+
**************************************************************************************/
24+
25+
static char thread_name[NUM_THREADS][32];
26+
#undef Serial
27+
#ifdef ARDUINO_PORTENTA_H7_M4
28+
SerialDispatcher Serial(Serial1); /* No SerialUSB for Portenta H7 / M4 Core */
29+
#else
30+
SerialDispatcher Serial(SerialUSB);
31+
#endif
32+
33+
/**************************************************************************************
34+
* SETUP/LOOP
35+
**************************************************************************************/
36+
37+
void setup()
38+
{
39+
Serial.global_prefix(serial_log_message_prefix);
40+
Serial.global_suffix(serial_log_message_suffix);
41+
42+
/* Fire up some threads all accessing the LSM6DSOX */
43+
for(size_t i = 0; i < NUM_THREADS; i++)
44+
{
45+
snprintf(thread_name[i], sizeof(thread_name[i]), "Thread #%02d", i);
46+
rtos::Thread * t = new rtos::Thread(osPriorityNormal, OS_STACK_SIZE, nullptr, thread_name[i]);
47+
t->start(serial_thread_func);
48+
}
49+
}
50+
51+
void loop()
52+
{
53+
54+
}
55+
56+
/**************************************************************************************
57+
* FUNCTION DEFINITION
58+
**************************************************************************************/
59+
60+
String serial_log_message_prefix(String const & /* msg */)
61+
{
62+
char msg[32] = {0};
63+
snprintf(msg, sizeof(msg), "[%05lu] ", millis());
64+
return String(msg);
65+
}
66+
67+
String serial_log_message_suffix(String const & prefix, String const & msg)
68+
{
69+
return String("\r\n");
70+
}
71+
72+
void serial_thread_func()
73+
{
74+
Serial.begin(9600);
75+
76+
for(;;)
77+
{
78+
/* Sleep between 5 and 500 ms */
79+
rtos::ThisThread::sleep_for(rtos::Kernel::Clock::duration_u32(random(5,500)));
80+
/* Print a unbroken log message including thread name and timestamp as a prefix. */
81+
Serial.block();
82+
Serial.print(rtos::ThisThread::get_name());
83+
Serial.print(": ");
84+
Serial.print("Lorem ipsum ...");
85+
Serial.unblock();
86+
}
87+
}

keywords.txt

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ block KEYWORD2
2424
unblock KEYWORD2
2525
prefix KEYWORD2
2626
suffix KEYWORD2
27+
global_prefix KEYWORD2
28+
global_suffix KEYWORD2
2729
spi KEYWORD2
2830
wire KEYWORD2
2931
read KEYWORD2

src/serial/SerialDispatcher.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ SerialDispatcher::SerialDispatcher(arduino::HardwareSerial & serial)
3434
, _thread(osPriorityRealtime, 4096, nullptr, "SerialDispatcher")
3535
, _has_tread_started{false}
3636
, _terminate_thread{false}
37+
, _global_prefix_callback{nullptr}
38+
, _global_suffix_callback{nullptr}
3739
{
3840

3941
}
@@ -202,6 +204,18 @@ void SerialDispatcher::suffix(SuffixInjectorCallbackFunc func)
202204
iter->suffix_func = func;
203205
}
204206

207+
void SerialDispatcher::global_prefix(PrefixInjectorCallbackFunc func)
208+
{
209+
mbed::ScopedLock<rtos::Mutex> lock(_mutex);
210+
_global_prefix_callback = func;
211+
}
212+
213+
void SerialDispatcher::global_suffix(SuffixInjectorCallbackFunc func)
214+
{
215+
mbed::ScopedLock<rtos::Mutex> lock(_mutex);
216+
_global_suffix_callback = func;
217+
}
218+
205219
/**************************************************************************************
206220
* PRIVATE MEMBER FUNCTIONS
207221
**************************************************************************************/
@@ -254,6 +268,12 @@ void SerialDispatcher::threadFunc()
254268
String prefix;
255269
if (d.prefix_func)
256270
prefix = d.prefix_func(msg);
271+
/* A prefix callback function defined per thread
272+
* takes precedence over a globally defined prefix
273+
* callback function.
274+
*/
275+
else if (_global_prefix_callback)
276+
prefix = _global_prefix_callback(msg);
257277

258278
/* Similar to the prefix function this callback
259279
* allows the user to specify a specific message
@@ -262,6 +282,12 @@ void SerialDispatcher::threadFunc()
262282
String suffix;
263283
if (d.suffix_func)
264284
suffix = d.suffix_func(prefix, msg);
285+
/* A suffix callback function defined per thread
286+
* takes precedence over a globally defined suffix
287+
* callback function.
288+
*/
289+
else if (_global_suffix_callback)
290+
suffix = _global_suffix_callback(prefix, msg);
265291

266292
/* Now it's time to actually write the message
267293
* conveyed by the user via Serial.print/println.

src/serial/SerialDispatcher.h

+5
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class SerialDispatcher : public arduino::HardwareSerial
6363
typedef std::function<String(String const &, String const &)> SuffixInjectorCallbackFunc;
6464
void prefix(PrefixInjectorCallbackFunc func);
6565
void suffix(SuffixInjectorCallbackFunc func);
66+
void global_prefix(PrefixInjectorCallbackFunc func);
67+
void global_suffix(SuffixInjectorCallbackFunc func);
6668

6769

6870
private:
@@ -76,6 +78,9 @@ class SerialDispatcher : public arduino::HardwareSerial
7678
bool _has_tread_started;
7779
bool _terminate_thread;
7880

81+
PrefixInjectorCallbackFunc _global_prefix_callback;
82+
SuffixInjectorCallbackFunc _global_suffix_callback;
83+
7984
static int constexpr THREADSAFE_SERIAL_TRANSMIT_RINGBUFFER_SIZE = 128;
8085
typedef arduino::RingBufferN<THREADSAFE_SERIAL_TRANSMIT_RINGBUFFER_SIZE> SerialTransmitRingbuffer;
8186

0 commit comments

Comments
 (0)