#include <stdbool.h>

#define ITMSTDERR   (0)
#define ITMSIGNAL   (1)
#define ITMCMDRSP   (2)
#define ITMCHANNELS (3)
#ifndef NDEBUG
#define dbgPrint(fmt, ...) fprintf(stderr, "%s: " fmt, GetLogStamp(), ##__VA_ARGS__);
#define dbgPrintAppend(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__);
#define itmPrint(__channel, fmt, ...) fprintf(g_itm[__channel], "%s: " fmt, GetLogStamp(), ##__VA_ARGS__);
#define itmPrintAppend(__channel, fmt, ...) fprintf(g_itm[__channel], fmt, ##__VA_ARGS__);
#else
#define dbgPrint(fmt, ...) ((void)0)
#define dbgPrintAppend(fmt, ...) ((void)0)
#define itmPrintAppend(__channel, fmt, ...) ((void)0)
#define itmPrint(__channel, fmt, ...) ((void)0)
#endif
#define logError(fmt, ...) dbgPrint("[ERROR] %s (%s@%u) - " fmt, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define logWarning(fmt, ...) dbgPrint("[WARNING] %s (%s@%u) - " fmt, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define logInfo(fmt, ...) dbgPrint("[Info] %s (%s@%u) - " fmt, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
extern char logStampStr[40];
extern void* g_itm[ITMCHANNELS];

#define ITMFILENO (4)
#define ITMCHANNELNO (32)
void ITM_Out(uint32_t port, uint8_t ch);

char* GetLogStamp(void);
int BlueButtonTransitionDetected(void);
void SetDutyCycleIndicator(bool on);
void KillUSBLink(void);
void SetRealTimeClock(time_t tm);
void ReadMcuInfo(unsigned char* serial, uint16_t *flashSize, uint16_t *mcuType, uint16_t *mcuRev);
void PerformSystemReset(void);
void InitializeITM();
