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
//! Traits for interactions with a processors watchdog timer.

/// Blocking processor watchdog traits

pub mod blocking {
    /// Feeds an existing watchdog to ensure the processor isn't reset. Sometimes
    /// the "feeding" operation is also referred to as "refreshing".
    pub trait Watchdog {
        /// An enumeration of `Watchdog` errors.
        ///
        /// For infallible implementations, will be `Infallible`
        type Error: core::fmt::Debug;

        /// Triggers the watchdog. This must be done once the watchdog is started
        /// to prevent the processor being reset.
        fn feed(&mut self) -> Result<(), Self::Error>;
    }

    impl<T: Watchdog> Watchdog for &mut T {
        type Error = T::Error;

        fn feed(&mut self) -> Result<(), Self::Error> {
            T::feed(self)
        }
    }

    /// Enables A watchdog timer to reset the processor if software is frozen or
    /// stalled.
    pub trait Enable {
        /// An enumeration of `Enable` errors.
        ///
        /// For infallible implementations, will be `Infallible`
        type Error: core::fmt::Debug;

        /// Unit of time used by the watchdog.
        type Time;

        /// The started watchdog that should be `feed()`.
        type Target: Watchdog;

        /// Starts the watchdog with a given period, typically once this is done
        /// the watchdog needs to be `feed()` periodically, or the processor would be
        /// reset.
        ///
        /// This consumes the value and returns the `Watchdog` trait that you must
        /// `feed()`.
        fn start<T>(self, period: T) -> Result<Self::Target, Self::Error>
        where
            T: Into<Self::Time>;
    }

    /// Disables a running watchdog timer so the processor won't be reset.
    ///
    /// Not all watchdog timers support disable operation after they've been enabled.
    /// In this case, hardware support libraries would not implement this trait
    /// and hardware-agnostic libraries should consider not requiring it.
    pub trait Disable {
        /// An enumeration of `Disable` errors.
        ///
        /// For infallible implementations, will be `Infallible`
        type Error: core::fmt::Debug;

        /// Disabled watchdog instance that can be enabled.
        type Target: Enable;

        /// Disables the watchdog.
        ///
        /// This stops the watchdog and returns an instance implementing the
        /// `Enable` trait so that it can be started again.
        fn disable(self) -> Result<Self::Target, Self::Error>;
    }
}