@@ -56,28 +56,50 @@ void serial_thread_func()
56
56
{
57
57
Serial.begin (9600 );
58
58
59
- char const * thread_name = rtos::ThisThread::get_name ();
60
- Serial.prefix ([thread_name](String const & /* msg */ ) -> String
59
+ Serial.prefix ([](String const & /* msg */ ) -> String
61
60
{
62
- char msg[64 ] = {0 };
63
- snprintf (msg, sizeof (msg), " [%05lu] %s " , millis (), thread_name);
64
- return String (msg);
61
+ return String (" $" );
65
62
});
66
- Serial.suffix ([](String const & /* prefix */ , String const & /* msg */ ) -> String
63
+ Serial.suffix ([](String const & prefix, String const & msg) -> String
67
64
{
68
- return String (" \r\n " );
65
+ /* NMEA checksum is calculated over the complete message
66
+ * starting with '$' and ending with the end of the message.
67
+ */
68
+ byte checksum = 0 ;
69
+ std::for_each (msg.c_str (),
70
+ msg.c_str () + msg.length (),
71
+ [&checksum](char const c)
72
+ {
73
+ checksum ^= static_cast <uint8_t >(c);
74
+ });
75
+ /* Assemble the footer of the NMEA message. */
76
+ char footer[16 ] = {0 };
77
+ snprintf (footer, sizeof (footer), " *%02X\r\n " , checksum);
78
+ return String (footer);
69
79
});
70
80
71
81
for (;;)
72
82
{
73
83
/* Sleep between 5 and 500 ms */
74
84
rtos::ThisThread::sleep_for (rtos::Kernel::Clock::duration_u32 (random (5 ,500 )));
75
- /* Print a unbroken log message including thread name and timestamp as a prefix. */
85
+ /* Print a fake NMEA GPRMC message:
86
+ * $GPRMC,062101.714,A,5001.869,N,01912.114,E,955535.7,116.2,290520,000.0,W*45\r\n
87
+ */
76
88
Serial.block ();
77
- Serial.print (" My " );
78
- Serial.print (" unbroken " );
79
- Serial.print (" thread-safe " );
80
- Serial.print (" message!" );
89
+
90
+ Serial.print (" GPRMC," );
91
+ Serial.print (millis ());
92
+ Serial.print (" ,A," );
93
+ Serial.print (" 5001.869," );
94
+ Serial.print (" N," );
95
+ Serial.print (" 01912.114," );
96
+ Serial.print (" E," );
97
+ Serial.print (" 955535.7," );
98
+ Serial.print (" 116.2," );
99
+ Serial.print (" 290520," );
100
+ Serial.print (" 000.0," );
101
+ Serial.print (" W" );
102
+
81
103
Serial.unblock ();
82
104
}
83
105
}
0 commit comments