#ifndef WATCHDOGSAMD_H
#define WATCHDOGSAMD_H

class WatchdogSAMD {
public:
    WatchdogSAMD():
      _initialized(false)
    {}

    // Enable the watchdog timer to reset the machine after a period of time
    // without any calls to reset().  The passed in period (in milliseconds) is
    // just a suggestion and a lower value might be picked if the hardware does
    // not support the exact desired value.
    //
    // The actual period (in milliseconds) before a watchdog timer reset is
    // returned.
    int enable(int maxPeriodMS = 0);

    // Reset or 'kick' the watchdog timer to prevent a reset of the device.
    void reset();

    // Completely disable the watchdog timer.
    void disable();

    // Enter the lowest power sleep mode (using the watchdog timer) for the
    // desired period of time.  The passed in period (in milliseconds) is
    // just a suggestion and a lower value might be picked if the hardware does
    // not support the exact desired value
    //
    // The actual period (in milliseconds) that the hardware was asleep will be
    // returned.
    //
    // NOTE: This is currently not implemented on the SAMD21!
    int sleep(int maxPeriodMS = 0);

private:
    void _initialize_wdt();

    bool _initialized;
};

#endif
