/*
template<class T> inline Print &operator<<(Print &Outport, T str) {
Outport.print(str);
return Outport;
}
int pp = 1234;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial << "Hello World, " << "This is my variable: " << pp << "\n";
}
void loop() {
delay(1000);
Serial << "This is my variable: " << ++pp << "\n";
}
*/
// echo() support for arduino: print many variables (max 9) to a Print* derived class
// released under Apache v2 license by atesin, homepage: https://gitlab.com/-/snippets/4838085
// example: echo(&Serial, "rate = ", 61.8, '%');
// utility macros
#define HAS_ARGS(...) COUNT_ARGS(__VA_ARGS__) > 0
#define COUNT_ARGS(...) COUNT_ARGS_CHECK(DUMMY, ##__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define COUNT_ARGS_CHECK(DUMMY, _9, _8, _7, _6, _5, _4, _3, _2, _1, RESULT, ...) RESULT
#define CAT(a, b) a ## b
#define XCAT(a, b) CAT(a, b)
// convert list to sequence
#define LIST_TO_PAIRS(p, ...) XCAT(PAIRS_,COUNT_ARGS(__VA_ARGS__))(p, ##__VA_ARGS__)
#define PAIRS_0(p)
#define PAIRS_1(p,x1) (p,x1)
#define PAIRS_2(p,x1,x2) (p,x1)(p,x2)
#define PAIRS_3(p,x1,x2,x3) (p,x1)(p,x2)(p,x3)
#define PAIRS_4(p,x1,x2,x3,x4) (p,x1)(p,x2)(p,x3)(p,x4)
#define PAIRS_5(p,x1,x2,x3,x4,x5) (p,x1)(p,x2)(p,x3)(p,x4)(p,x5)
#define PAIRS_6(p,x1,x2,x3,x4,x5,x6) (p,x1)(p,x2)(p,x3)(p,x4)(p,x5)(p,x6)
#define PAIRS_7(p,x1,x2,x3,x4,x5,x6,x7) (p,x1)(p,x2)(p,x3)(p,x4)(p,x5)(p,x6)(p,x7)
#define PAIRS_8(p,x1,x2,x3,x4,x5,x6,x7,x8) (p,x1)(p,x2)(p,x3)(p,x4)(p,x5)(p,x6)(p,x7)(p,x8)
#define PAIRS_9(p,x1,x2,x3,x4,x5,x6,x7,x8,x9) (p,x1)(p,x2)(p,x3)(p,x4)(p,x5)(p,x6)(p,x7)(p,x8)(p,x9)
// print up to 9 different variables concatenated in one line, to any Print* derived class
// example: echo(&Serial, "rate = ", 61.8, '%');
#define echo(p, ...) ECHO_SEQ(LIST_TO_PAIRS(p,##__VA_ARGS__)(p,'\n'))
// echo() helper macros
#define ECHO_SEQ(seq) do{XCAT(ECHO_A seq,_END)}while(0)
#define ECHO_A(p,x) (p)->print(x);ECHO_B
#define ECHO_B(p,x) (p)->print(x);ECHO_A
#define ECHO_A_END
#define ECHO_B_END
int pp = 0;
void setup() {
Serial.begin(115200);
echo(&Serial, "Hello World, " , "This is my variable: " , pp , "\n");
// ECHO_SEQ((&Serial,foo)(&Serial,bar)(&Serial,'\n'));
// do{XCAT(ECHO_A (&Serial,foo)(&Serial,bar)(&Serial,'\n'),_END)}while(0);
// do{ECHO_A (&Serial,foo)(&Serial,bar)(&Serial,'\n')_END}while(0);
// do{(&Serial)->print(foo);ECHO_B(&Serial,bar)(&Serial,'\n')_END}while(0);
// do{(&Serial)->print(foo);(&Serial)->print(bar);(&Serial)->print('\n');ECHO_B_END}while(0);
// do{(&Serial)->print(foo);(&Serial)->print(bar);(&Serial)->print('\n');}while(0);
}
void loop() {
delay(1000);
echo(&Serial, "This is my variable: " , ++pp );
}