RemoteDebugger.h 20.3 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
/*
 * Header for RemoteDebugger
 *
 * Copyright (C) 2018  Joao Lopes https://github.com/JoaoLopesF/RemoteDebuggger
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 * This header file describes the public API for sending debug messages to a telnet client.
 *
 */

#ifndef REMOTEDEBUGGER_H
#define REMOTEDEBUGGER_H

//////// Simple software debugger (based on SerialDebug)

// Is for SerialDebug (TODO: in future will some code for both library)

//#define DEBUGGER_FOR_SERIALDEBUG true

// Is for RemoteDebug

#define DEBUGGER_FOR_REMOTEDEBUG true

//////// Includes

#include "Arduino.h"

// Library

#ifdef DEBUGGER_FOR_SERIALDEBUG

#include "SerialDebug.h"
#define DEBUGGER_VAR_TYPE

#else // RemoteDebug

#include "RemoteDebug.h"
#define DEBUGGER_VAR_TYPE static

#endif

// Boards

#ifdef DEBUGGER_FOR_SERIALDEBUG
#include "utility/Boards.h"
#else // RemoteDebug
#define BOARD_ENOUGH_MEMORY true // WiFi boards have a lot of memory
#endif

//////
// Debugger options
// It is here too, due Arduino IDE not working for project local defines
/////

// Debug watch global variables - need stay here, to not cause errors in DEBUG_DISABLED empty macros

typedef enum {										// Type of operator
	DEBUG_WATCH_CHANGED,							// Changed value ?
	DEBUG_WATCH_EQUAL,								// Equal (==)
	DEBUG_WATCH_DIFF,								// Different (!=)
	DEBUG_WATCH_LESS,								// Less (<=)
	DEBUG_WATCH_GREAT,								// Greater (>)
	DEBUG_WATCH_LESS_EQ,							// Less or equal (<=)
	DEBUG_WATCH_GREAT_EQ							// Greater or equal (>=)
} debugEnumWatch_t;

// Disable debug - good for release (production)
// Put below define after the include SerialDebug/RemoteDebug in your project to disable all debug
// as nothing of SerialDebug/RemoteDebug is compiled, zero overhead :-)
//#define DEBUG_DISABLED true

#ifdef DEBUG_DISABLED

	// No debugs

#ifdef DEBUGGER_FOR_SERIALDEBUG
	#define debugSilence(...)
#endif

	#define DEBUG_DISABLE_DEBUGGER true

#endif

// Disable debugger ? No more commands and features as functions and globals
// Uncomment this to disable it (SerialDebug will not do reads from Serial, good if already have this)
//#define DEBUG_DISABLE_DEBUGGER true

#ifndef DEBUG_DISABLE_DEBUGGER	// Debugger enabled

// Enable Flash variables support - F()
// Used internally in SerialDebug and in public API
// If is a low memory board, like AVR, all strings in SerialDebug is using flash memory
// If have RAM memory, this is more fast than flash
//#define DEBUG_USE_FLASH_F true

// For Espressif boards, default is not flash support for printf,
// due it have a lot of memory and Serial.printf is not compatible with it
// If you need more memory, can force it:
//#define DEBUG_USE_FLASH_F true

//////// Defines

// Internal printf ?

#if (defined ESP8266 || defined ESP32) && !(defined DEBUG_USE_FLASH_F)  // For Espressif boards, have Serial.printf native (but not for Flash F)
											 							// TODO: see if another boards have it, Arduinos AVR not have it)
	#define DEBUG_USE_NATIVE_PRINTF true	// Enable native
	#define DEBUG_NOT_USE_FLASH_F true    	// Disable all printf with __FlashStringHelper - If you need, just comment it
#endif

// Uses flash ?

#if (defined ESP8266 || defined ESP32) && !(defined DEBUG_USE_FLASH_F)  // For Espressif boards, have Serial.printf native (but not for Flash F)
																		// TODO: see if another boards have it, Arduinos AVR not have it)
	#define DEBUG_NOT_USE_FLASH_F true    	// Disable all printf with __FlashStringHelper - If you need, just comment it
#endif

// Size for commands

#define DEBUG_MAX_SIZE_COMMANDS 10			// Maximum size of commands - can be changed
#define DEBUG_MAX_SIZE_CMD_OPTIONS 64		// Maximum size of commands options - can be changed

// Max size for compare char arrays or string

#define DEBUG_MAX_CMP_STRING 48

// Timeout for debugBreak - put 0 if not want timeout

#ifndef DEBUG_BREAK_TIMEOUT
	#define DEBUG_BREAK_TIMEOUT 5000
#endif

// Timeout for watch triggered - put 0 if not want timeout

#ifndef DEBUG_BREAK_WATCH
	#define DEBUG_BREAK_WATCH 10000
#endif

// Minimum time to process handle event

#define DEBUG_MIN_TIME_EVENT 850

//////// Prototypes - public

#ifdef DEBUGGER_FOR_SERIALDEBUG
void debugInitDebugger (HardwareSerial *serial, void (*callbackShowHelp)(), void (*callbackProcessCmd)(),
						boolean *debuggerActive); // TODO: in future do both lib share this same code
#else // RemoteDebug
void debugInitDebugger (RemoteDebug *Debug);
#endif

void debugPrintInfo(const char level, const char* function);

void debugProcessCmdDebugger();
String debugGetHelpDebugger();
boolean debugGetDebuggerEnabled();
void debugSetDebuggerEnabled(boolean enabled);
void debugHandleEvent(boolean calledByHandleEvent);
String debugBreak();
#ifdef DEBUG_USE_FLASH_F
String debugBreak(const __FlashStringHelper * str, uint32_t timeout = DEBUG_BREAK_TIMEOUT, boolean byWatch = false);
#endif
String debugBreak(const char* str, uint32_t timeout = DEBUG_BREAK_TIMEOUT, boolean byWatch = false);

#ifndef BOARD_LOW_MEMORY // Not for low memory boards
	String debugBreak(String& str, uint32_t timeout = DEBUG_BREAK_TIMEOUT);
#endif

#ifdef DEBUGGER_FOR_SERIALDEBUG
void debugSilence(boolean activate, boolean showMessage, boolean fromBreak = false);
#endif

// Debugger

// For functions // TODO: make more types

int8_t debugAddFunctionVoid(const char* name, void (*callback)());
int8_t debugAddFunctionStr(const char* name, void (*callback)(String));
int8_t debugAddFunctionChar(const char* name, void (*callback)(char));
int8_t debugAddFunctionInt(const char* name, void (*callback)(int));

void debugSetLastFunctionDescription(const char *description);

// For globals

#ifndef BOARD_LOW_MEMORY // Not for low memory boards

	int8_t debugAddGlobalBoolean (const char* name, boolean* pointer);
	int8_t debugAddGlobalChar (const char* name, char* pointer);
	int8_t debugAddGlobalByte (const char* name, byte* pointer);
	int8_t debugAddGlobalInt (const char* name, int* pointer);
	int8_t debugAddGlobalUInt (const char* name, unsigned int* pointer);
	int8_t debugAddGlobalLong (const char* name, long* pointer);
	int8_t debugAddGlobalULong (const char* name, unsigned long* pointer);
	int8_t debugAddGlobalFloat (const char* name, float* pointer);
	int8_t debugAddGlobalDouble (const char* name, double* pointer);
	int8_t debugAddGlobalInt8_t (const char* name, int8_t* pointer);
	int8_t debugAddGlobalInt16_t (const char* name, int16_t* pointer);
	int8_t debugAddGlobalInt32_t (const char* name, int32_t* pointer);
//		#ifdef ESP32
	//int8_t debugAddGlobalInt64_t (const char* name, int64_t* pointer);
//		#endif
	int8_t debugAddGlobalUInt8_t (const char* name, uint8_t* pointer);
	int8_t debugAddGlobalUInt16_t (const char* name, uint16_t* pointer);
	int8_t debugAddGlobalUInt32_t (const char* name, uint32_t* pointer);
//		#ifdef ESP32
	//int8_t debugAddGlobalUInt64_t (const char* name, uint64_t* pointer);
//		#endif
	int8_t debugAddGlobalCharArray (const char* name, char* pointer);
	int8_t debugAddGlobalCharArray (const char* name, char* pointer, uint8_t showLength);
	int8_t debugAddGlobalString (const char* name, String* pointer);
	int8_t debugAddGlobalString (const char* name, String* pointer, uint8_t showLength);

	void debugSetLastGlobalDescription(const char *description);

	// For flash F

	int8_t debugAddFunctionVoid(const __FlashStringHelper* name, void (*callback)());
	int8_t debugAddFunctionStr(const __FlashStringHelper* name, void (*callback)(String));
	int8_t debugAddFunctionChar(const __FlashStringHelper* name, void (*callback)(char));
	int8_t debugAddFunctionInt(const __FlashStringHelper* name, void (*callback)(int));

	void debugSetLastFunctionDescription(const __FlashStringHelper *description);

	int8_t debugAddGlobalBoolean (const __FlashStringHelper* name, boolean* pointer);
	int8_t debugAddGlobalChar (const __FlashStringHelper* name, char* pointer);
	int8_t debugAddGlobalByte (const __FlashStringHelper* name, byte* pointer);
	int8_t debugAddGlobalInt (const __FlashStringHelper* name, int* pointer);
	int8_t debugAddGlobalUInt (const __FlashStringHelper* name, unsigned int* pointer);
	int8_t debugAddGlobalLong (const __FlashStringHelper* name, long* pointer);
	int8_t debugAddGlobalULong (const __FlashStringHelper* name, unsigned long* pointer);
	int8_t debugAddGlobalFloat (const __FlashStringHelper* name, float* pointer);
	int8_t debugAddGlobalDouble (const __FlashStringHelper* name, double* pointer);
	int8_t debugAddGlobalInt8_t (const __FlashStringHelper* name, int8_t* pointer);
	int8_t debugAddGlobalInt16_t (const __FlashStringHelper* name, int16_t* pointer);
	int8_t debugAddGlobalInt32_t (const __FlashStringHelper* name, int32_t* pointer);
//			#ifdef ESP32
	//int8_t debugAddGlobalInt64_t (const __FlashStringHelper* name, int64_t* pointer);
//			#endif
	int8_t debugAddGlobalUInt8_t (const __FlashStringHelper* name, uint8_t* pointer);
	int8_t debugAddGlobalUInt16_t (const __FlashStringHelper* name, uint16_t* pointer);
	int8_t debugAddGlobalUInt32_t (const __FlashStringHelper* name, uint32_t* pointer);
//			#ifdef ESP32
	//int8_t debugAddGlobalUInt64_t (const __FlashStringHelper* name, uint64_t* pointer);
//			#endif
	int8_t debugAddGlobalCharArray (const __FlashStringHelper* name, char* pointer);
	int8_t debugAddGlobalCharArray (const __FlashStringHelper* name, char* pointer, uint8_t showLength);
	int8_t debugAddGlobalString (const __FlashStringHelper* name, String* pointer);
	int8_t debugAddGlobalString (const __FlashStringHelper* name, String* pointer, uint8_t showLength);

	void debugSetLastGlobalDescription(const __FlashStringHelper *description);

	// Watches

	int8_t debugAddWatchBoolean (uint8_t globalNum, uint8_t operation, boolean value, boolean allwaysStop = false);
	int8_t debugAddWatchChar (uint8_t globalNum, uint8_t operation, char value, boolean allwaysStop = false);
	int8_t debugAddWatchByte (uint8_t globalNum, uint8_t operation, byte value, boolean allwaysStop = false);
	int8_t debugAddWatchInt (uint8_t globalNum, uint8_t operation, int value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt (uint8_t globalNum, uint8_t operation, unsigned int value, boolean allwaysStop = false);
	int8_t debugAddWatchLong (uint8_t globalNum, uint8_t operation, long value, boolean allwaysStop = false);
	int8_t debugAddWatchULong (uint8_t globalNum, uint8_t operation, unsigned long value, boolean allwaysStop = false);
	int8_t debugAddWatchFloat (uint8_t globalNum, uint8_t operation, float value, boolean allwaysStop = false);
	int8_t debugAddWatchDouble (uint8_t globalNum, uint8_t operation, double value, boolean allwaysStop = false);
	int8_t debugAddWatchInt8_t (uint8_t globalNum, uint8_t operation, int8_t value, boolean allwaysStop = false);
	int8_t debugAddWatchInt16_t (uint8_t globalNum, uint8_t operation, int16_t value, boolean allwaysStop = false);
	int8_t debugAddWatchInt32_t (uint8_t globalNum, uint8_t operation, int32_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt8_t (uint8_t globalNum, uint8_t operation, uint8_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt16_t (uint8_t globalNum, uint8_t operation, uint16_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt32_t (uint8_t globalNum, uint8_t operation, uint32_t value, boolean allwaysStop = false);

	int8_t debugAddWatchCharArray (uint8_t globalNum, uint8_t operation, const char* value, boolean allwaysStop = false);
	int8_t debugAddWatchString (uint8_t globalNum, uint8_t operation, String value, boolean allwaysStop = false);

	int8_t debugAddWatchBoolean  (const char* globalName, uint8_t operation, boolean value, boolean allwaysStop = false);
	int8_t debugAddWatchChar  (const char* globalName, uint8_t operation, char value, boolean allwaysStop = false);
	int8_t debugAddWatchByte  (const char* globalName, uint8_t operation, byte value, boolean allwaysStop = false);
	int8_t debugAddWatchInt  (const char* globalName, uint8_t operation, int value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt  (const char* globalName, uint8_t operation, unsigned int value, boolean allwaysStop = false);
	int8_t debugAddWatchLong  (const char* globalName, uint8_t operation, long value, boolean allwaysStop = false);
	int8_t debugAddWatchULong  (const char* globalName, uint8_t operation, unsigned long value, boolean allwaysStop = false);
	int8_t debugAddWatchFloat  (const char* globalName, uint8_t operation, float value, boolean allwaysStop = false);
	int8_t debugAddWatchDouble  (const char* globalName, uint8_t operation, double value, boolean allwaysStop = false);
	int8_t debugAddWatchInt8_t  (const char* globalName, uint8_t operation, int8_t value, boolean allwaysStop = false);
	int8_t debugAddWatchInt16_t  (const char* globalName, uint8_t operation, int16_t value, boolean allwaysStop = false);
	int8_t debugAddWatchInt32_t  (const char* globalName, uint8_t operation, int32_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt8_t  (const char* globalName, uint8_t operation, uint8_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt16_t  (const char* globalName, uint8_t operation, uint16_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt32_t  (const char* globalName, uint8_t operation, uint32_t value, boolean allwaysStop = false);

	int8_t debugAddWatchCharArray (const char* globalName, uint8_t operation, const char* value, boolean allwaysStop = false);
	int8_t debugAddWatchString (const char* globalName, uint8_t operation, String value, boolean allwaysStop = false);

	int8_t debugAddWatchCross(uint8_t globalNum, uint8_t operation, uint8_t anotherGlobalNum, boolean allwaysStop = false);
	int8_t debugAddWatchCross(const char* globalName, uint8_t operation, const char* anotherGlobalName, boolean allwaysStop = false);

	// For Flash F

	int8_t debugAddWatchBoolean (const __FlashStringHelper* globalName, uint8_t operation, boolean value, boolean allwaysStop = false);
	int8_t debugAddWatchChar (const __FlashStringHelper* globalName, uint8_t operation, char value, boolean allwaysStop = false);
	int8_t debugAddWatchByte (const __FlashStringHelper* globalName, uint8_t operation, byte value, boolean allwaysStop = false);
	int8_t debugAddWatchInt (const __FlashStringHelper* globalName, uint8_t operation, int value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt (const __FlashStringHelper* globalName, uint8_t operation, unsigned int value, boolean allwaysStop = false);
	int8_t debugAddWatchLong (const __FlashStringHelper* globalName, uint8_t operation, long value, boolean allwaysStop = false);
	int8_t debugAddWatchULong (const __FlashStringHelper* globalName, uint8_t operation, unsigned long value, boolean allwaysStop = false);
	int8_t debugAddWatchFloat (const __FlashStringHelper* globalName, uint8_t operation, float value, boolean allwaysStop = false);
	int8_t debugAddWatchDouble (const __FlashStringHelper* globalName, uint8_t operation, double value, boolean allwaysStop = false);
	int8_t debugAddWatchInt8_t (const __FlashStringHelper* globalName, uint8_t operation, int8_t value, boolean allwaysStop = false);
	int8_t debugAddWatchInt16_t (const __FlashStringHelper* globalName, uint8_t operation, int16_t value, boolean allwaysStop = false);
	int8_t debugAddWatchInt32_t (const __FlashStringHelper* globalName, uint8_t operation, int32_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt8_t (const __FlashStringHelper* globalName, uint8_t operation, uint8_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt16_t (const __FlashStringHelper* globalName, uint8_t operation, uint16_t value, boolean allwaysStop = false);
	int8_t debugAddWatchUInt32_t (const __FlashStringHelper* globalName, uint8_t operation, uint32_t value, boolean allwaysStop = false);

	int8_t debugAddWatchCharArray (const __FlashStringHelper* globalName, uint8_t operation, const char* value, boolean allwaysStop = false);
	int8_t debugAddWatchString (const __FlashStringHelper* globalName, uint8_t operation, String value, boolean allwaysStop = false);

	int8_t debugAddWatchCross(const __FlashStringHelper* globalName, uint8_t operation, const __FlashStringHelper* anotherGlobalName, boolean allwaysStop = false);

#else // Low memory boards -> reduced number of functions

	// For flash F

	int8_t debugAddFunctionVoid(const __FlashStringHelper* name, void (*callback)());
	int8_t debugAddFunctionStr(const __FlashStringHelper* name, void (*callback)(String));
	int8_t debugAddFunctionChar(const __FlashStringHelper* name, void (*callback)(char));
	int8_t debugAddFunctionInt(const __FlashStringHelper* name, void (*callback)(int));

	#define debugSetLastFunctionDescription(str) // Not compile this

	int8_t debugAddGlobalBoolean (const __FlashStringHelper* name, boolean* pointer);
	int8_t debugAddGlobalChar (const __FlashStringHelper* name, char* pointer);
	int8_t debugAddGlobalInt (const __FlashStringHelper* name, int* pointer);
	int8_t debugAddGlobalULong (const __FlashStringHelper* name, unsigned long* pointer);
	int8_t debugAddGlobalString (const __FlashStringHelper* name, String* pointer);
	int8_t debugAddGlobalString (const __FlashStringHelper* name, String* pointer, uint8_t showLength);

	#define debugSetLastGlobalDescription(str) // Not compile this

	// No watches

#endif // Low memory

// Handle debugger

void debugHandleDebugger (const boolean calledByHandleEvent);

//////// External variables (need to use macros)

#ifdef DEBUGGER_FOR_SERIALDEBUG
extern boolean _debugActive;		   			// Debug is only active after receive first data from Serial
extern bool _debugSilence;						// Silent mode ?

extern uint8_t _debugFunctionsAdded;			// Number of functions added
extern uint8_t _debugGlobalsAdded;				// Number of globals added
extern uint8_t _debugWatchesAdded;				// Number of watches added
extern boolean _debugWatchesEnabled;			// Watches is enabled (only after add any)?
extern boolean _debugDebuggerEnabled;			// Simple Software Debugger enabled ?
#endif

//////// Defines and macros

// Macro to handle (better performance)

// Macros for debugs
// Note: not used F() for formats, due it is small and Flash can be slow

#ifndef BOARD_LOW_MEMORY // Not for low memory boards
	#define DEBUG_HANDLE_DEBUGGER() \
		if (_debugDebuggerEnabled && _debugGlobalsAdded > 0) { \
			debugHandleDebugger(false); \
		}
#else
	#define DEBUG_HANDLE_DEBUGGER()
#endif

#ifndef DEBUG_USE_FLASH_F // Only if not using flash

#ifndef FPSTR // Thanks a lot Espressif -> https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html
	#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
#endif

#endif

#endif // DEBUG_DISABLE_DEBUGGER

// Debugger disabled ?

#ifdef DEBUG_DISABLE_DEBUGGER

	#define debugAddGlobalBoolean (...)
	#define debugAddGlobalChar (...)
	#define debugAddGlobalByte (...)
	#define debugAddGlobalInt (...)
	#define debugAddGlobalUInt (...)
	#define debugAddGlobalLong (...)
	#define debugAddGlobalULong (...)
	#define debugAddGlobalFloat (...)
	#define debugAddGlobalDouble (...)
	#define debugAddGlobalInt8_t (...)
	#define debugAddGlobalInt16_t (...)
	#define debugAddGlobalInt32_t (...)
	//#ifdef ESP32
	//#define debugAddGlobalInt64_t (...)
	//#endif
	#define debugAddGlobalUInt8_t (...)
	#define debugAddGlobalUInt16_t (...)
	#define debugAddGlobalUInt32_t (...)
	//#ifdef ESP32
	//#define debugAddGlobalUInt64_t (...)
	//#endif
	#define debugAddGlobalCharArray (...)
	#define debugAddGlobalString (...)

	#define debugSetLastGlobalDescription(...)

	#define debugAddWatchBoolean (...)
	#define debugAddWatchChar (...)
	#define debugAddWatchByte (...)
	#define debugAddWatchInt (...)
	#define debugAddWatchUInt (...)
	#define debugAddWatchLong (...)
	#define debugAddWatchULong (...)
	#define debugAddWatchFloat (...)
	#define debugAddWatchDouble (...)
	#define debugAddWatchInt8_t (...)
	#define debugAddWatchInt16_t (...)
	#define debugAddWatchInt32_t (...)
	#define debugAddWatchUInt8_t (...)
	#define debugAddWatchUInt16_t (...)
	#define debugAddWatchUInt32_t (...)

	#define debugAddWatchCharArray (...)
	#define debugAddWatchString (...)

	#define debugAddWatchCross(...)

	#define debugHandleDebugger(...)

#endif // DEBUG_DISABLE_DEBUGGER

#endif // H

//////// End