// (C) peter@lorenzen.us 2018 - license https://en.wikipedia.org/wiki/Beerware
// http://peter.lorenzen.us/embedded/dprint
#ifndef DPRINT_H
#define DPRINT_H
#include <Arduino.h>

extern uint8_t debug_level;
char nibble2ascii(uint8_t);
void _dprintc(char);
void _dprint(uint8_t);
void _dprint(uint16_t);
void _dprint(uint32_t);
void _dprint(int8_t);
void _dprint(int16_t);
void _dprint(int32_t);
void _dprint(char *);
void _dprint(const char *);
void _dprint(const __FlashStringHelper *);
void dprint_init(uint8_t);
void dwheel(void);  // have one in loop() to show your system is alive

#define   dprint(v) if (debug_level>0) _dprint(v)
#define  ddprint(v) if (debug_level>1) _dprint(v)
#define dddprint(v) if (debug_level>2) _dprint(v)

#define dprint3(level,trail,string) do {\
	if (debug_level>level) {\
		_dprint(F(string)); _dprintc(trail);\
	}\
} while (0)
#define dprint4(level,trail,string,value) do {\
	if (debug_level>level) {\
		_dprint(F(string)); _dprintc(' ');\
		_dprint(value); _dprintc(trail);\
	}\
} while (0)
#define dprint5(level,trail,string,val1,val2) do {\
	if (debug_level>level) {\
		_dprint(F(string)); _dprintc(' ');\
		_dprint(val1); _dprintc(' ');\
		_dprint(val2); _dprintc(trail);\
	}\
} while (0)
#define dprint6(level,trail,string,val1,val2,val3) do {\
	if (debug_level>level) {\
		_dprint(F(string)); _dprintc(' ');\
		_dprint(val1); _dprintc(' ');\
		_dprint(val2); _dprintc(' ');\
		_dprint(val3); _dprintc(trail);\
	}\
} while (0)

#define GET_MACRO(_3,_4,_5,_6,NAME,...) NAME
//https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments
#define   DPRINT(...) GET_MACRO(__VA_ARGS__, dprint6, dprint5, dprint4, dprint3, dprint2)(0,' ',__VA_ARGS__)
#define  DDPRINT(...) GET_MACRO(__VA_ARGS__, dprint6, dprint5, dprint4, dprint3, dprint2)(1,' ',__VA_ARGS__)
#define DDDPRINT(...) GET_MACRO(__VA_ARGS__, dprint6, dprint5, dprint4, dprint3, dprint2)(2,' ',__VA_ARGS__)

#define   DPRINTLN(...) GET_MACRO(__VA_ARGS__, dprint6, dprint5, dprint4, dprint3, dprint2)(0,'\n',__VA_ARGS__)
#define  DDPRINTLN(...) GET_MACRO(__VA_ARGS__, dprint6, dprint5, dprint4, dprint3, dprint2)(1,'\n',__VA_ARGS__)
#define DDDPRINTLN(...) GET_MACRO(__VA_ARGS__, dprint6, dprint5, dprint4, dprint3, dprint2)(2,'\n',__VA_ARGS__)

#endif
