#include #include // cf. https://forum.pjrc.com/threads/41504-Teensy-3-x-multithreading-library-first-release/page6 // println implementation - can be placed in a header file namespace arduino_preprocessor_is_buggy { // helper for parameter pack expansion, // due to GCC bug 51253 we use an array using expand = int[]; // used for suppressing compiler warnings template void silence(T&&) {}; /* inline Threads::Mutex& getSerialLock() { static Threads::Mutex serial_lock; return serial_lock; } */ bool serialavailable(); char serialgetch(); template void print_fwd(const T& arg) { Serial.print(arg); } template void print_fwd(const std::pair& arg) { Serial.print(arg.first, arg.second); } template void print(args_t... params) { // Threads::Scope locker(getSerialLock()); silence(expand{ (print_fwd(params), 42)... }); } template void println(args_t... params) { // Threads::Scope locker(getSerialLock()); silence(expand{ (print_fwd(params), 42)... }); Serial.println(); Serial.flush(); } } using arduino_preprocessor_is_buggy::print; using arduino_preprocessor_is_buggy::println; using arduino_preprocessor_is_buggy::serialavailable; using arduino_preprocessor_is_buggy::serialgetch; using std::make_pair; // end println implementation