//----------------------------------------------------------------------------------
// <copyright file="wdtrog.h" company="LiquidRobotics">
//	Copyright (c) Liquid Robotics Corporation.  All rights reserved.
// </copyright>
//
// <summary>
// 	General purpose interface to watchdog timer, allows for requiring a configurable
//  set of trigger events to be set before actually retriggering the watchdog
// </summary>
//
// <owner>Mike Cookson</owner>
//---------------------------------------------------------------------------------

#ifndef __WDTRIG_H__
# define __WDTRIG_H__

# ifndef WDTRIG_ENABLED
#   define WDTRIG_ENABLED			(1)		// configure data and code generation on = non-zero
# endif
# ifndef WDTRIG_TIME_MASK
#   define WDTRIG_TIME_MASK			(_BV(WDP3) | _BV(WDP0))  // 8 second watchdog trigger
# endif

// --- Possible parameters to OSwatchdogTrigger() ---

# define WDTRIG_IDLE_CTX		(1L)			// mask to trigger when idle task is rescheduled
# define WDTRIG_NON_IDLE_CTX	(2L)			// mask to trigger when any non-idle context switch is made
# define WDTRIG_OSRESERVE_1		(4L)			// reserved for future expansion
# define WDTRIG_OSRESERVE_2		(8L)			// reserved for future expansion
# define WDTRIG_OSRESERVE_3		(0x10L)			// reserved for future expansion
# define WDTRIG_OSRESERVE_4		(0x20L)			// reserved for future expansion
# define WDTRIG_OSRESERVE_5		(0x40L)			// reserved for future expansion
# define WDTRIG_OSRESERVE_6		(0x80L)			// reserved for future expansion
# define WDTRIG_USER_1			(0x100L)		// user-definable trigger source
# define WDTRIG_USER_2			(0x200L)		// user-definable trigger source
# define WDTRIG_USER_3			(0x400L)		// user-definable trigger source
# define WDTRIG_USER_4			(0x800L)		// user-definable trigger source
# define WDTRIG_USER_5			(0x1000L)		// user-definable trigger source
# define WDTRIG_USER_6			(0x2000L)		// user-definable trigger source
# define WDTRIG_USER_7			(0x4000L)		// user-definable trigger source
# define WDTRIG_USER_8			(0x8000L)		// user-definable trigger source
# define WDTRIG_USER_9			(0x10000L)		// user-definable trigger source
# define WDTRIG_USER_10			(0x20000L)		// user-definable trigger source
# define WDTRIG_USER_11			(0x40000L)		// user-definable trigger source
# define WDTRIG_USER_12			(0x80000L)		// user-definable trigger source
# define WDTRIG_USER_13			(0x100000L)		// user-definable trigger source
# define WDTRIG_USER_14			(0x200000L)		// user-definable trigger source
# define WDTRIG_USER_15			(0x400000L)		// user-definable trigger source
# define WDTRIG_USER_16			(0x800000L)		// user-definable trigger source
# define WDTRIG_USER_17			(0x1000000L)	// user-definable trigger source
# define WDTRIG_USER_18			(0x2000000L)	// user-definable trigger source
# define WDTRIG_USER_19			(0x4000000L)	// user-definable trigger source
# define WDTRIG_USER_20			(0x8000000L)	// user-definable trigger source
# define WDTRIG_USER_21			(0x10000000L)	// user-definable trigger source
# define WDTRIG_USER_22			(0x20000000L)	// user-definable trigger source
# define WDTRIG_USER_23			(0x40000000L)	// user-definable trigger source
# define WDTRIG_USER_24			(0x80000000L)	// user-definable trigger source

// suggestion for configuration of which bits must be set to trigger watchdog
# ifndef WDTRIG_CONFIG
#   define WDTRIG_CONFIG		(WDTRIG_NON_IDLE_CTX)
# endif

// setup for watchdog configuration (set for maximum timeout, 8 sec)
# ifndef WDTRIG_CONFIG_WATCHDOG
#   define WDTRIG_CONFIG_WATCHDOG() \
			wdt_enable((_BV(WDIF) | _BV(WDIE) | _BV(WDE) | (WDTRIG_TIME_MASK)))
# endif

// Function Prototypes
extern void OSwatchdogInit(uint32_t trigMask);
extern void OSwatchdogTrigger(uint32_t mask);

#endif
