1dae0a8d7SMatt Spinler #pragma once
2dae0a8d7SMatt Spinler 
3dae0a8d7SMatt Spinler #include <memory>
4dae0a8d7SMatt Spinler #include <string>
5dae0a8d7SMatt Spinler 
6dae0a8d7SMatt Spinler namespace witherspoon
7dae0a8d7SMatt Spinler {
8dae0a8d7SMatt Spinler namespace power
9dae0a8d7SMatt Spinler {
10dae0a8d7SMatt Spinler 
11dae0a8d7SMatt Spinler /**
12dae0a8d7SMatt Spinler  * @class Device
13dae0a8d7SMatt Spinler  *
14dae0a8d7SMatt Spinler  * This object is an abstract base class for a device that
15dae0a8d7SMatt Spinler  * can be monitored for power faults.
16dae0a8d7SMatt Spinler  */
17dae0a8d7SMatt Spinler class Device
18dae0a8d7SMatt Spinler {
19dae0a8d7SMatt Spinler   public:
20dae0a8d7SMatt Spinler     Device() = delete;
21dae0a8d7SMatt Spinler     virtual ~Device() = default;
22dae0a8d7SMatt Spinler     Device(const Device&) = delete;
23dae0a8d7SMatt Spinler     Device& operator=(const Device&) = delete;
24dae0a8d7SMatt Spinler     Device(Device&&) = default;
25dae0a8d7SMatt Spinler     Device& operator=(Device&&) = default;
26dae0a8d7SMatt Spinler 
27dae0a8d7SMatt Spinler     /**
28dae0a8d7SMatt Spinler      * Constructor
29dae0a8d7SMatt Spinler      *
30dae0a8d7SMatt Spinler      * @param name - the device name
31dae0a8d7SMatt Spinler      * @param inst - the device instance
32dae0a8d7SMatt Spinler      */
33*f0f02b9aSMatt Spinler     Device(const std::string& name, size_t inst) : name(name), instance(inst)
34dae0a8d7SMatt Spinler     {
35dae0a8d7SMatt Spinler     }
36dae0a8d7SMatt Spinler 
37dae0a8d7SMatt Spinler     /**
38dae0a8d7SMatt Spinler      * Returns the instance number
39dae0a8d7SMatt Spinler      */
40dae0a8d7SMatt Spinler     inline auto getInstance() const
41dae0a8d7SMatt Spinler     {
42dae0a8d7SMatt Spinler         return instance;
43dae0a8d7SMatt Spinler     }
44dae0a8d7SMatt Spinler 
45dae0a8d7SMatt Spinler     /**
46dae0a8d7SMatt Spinler      * Returns the name
47dae0a8d7SMatt Spinler      */
48dae0a8d7SMatt Spinler     inline auto getName() const
49dae0a8d7SMatt Spinler     {
50dae0a8d7SMatt Spinler         return name;
51dae0a8d7SMatt Spinler     }
52dae0a8d7SMatt Spinler 
53dae0a8d7SMatt Spinler     /**
54dae0a8d7SMatt Spinler      * Pure virtual function to analyze an error
55dae0a8d7SMatt Spinler      */
56dae0a8d7SMatt Spinler     virtual void analyze() = 0;
57dae0a8d7SMatt Spinler 
58dae0a8d7SMatt Spinler     /**
59b54357f6SMatt Spinler      * Stubbed virtual function to call when it's known
60b54357f6SMatt Spinler      * the chip is in error state.  Override if functionality
61b54357f6SMatt Spinler      * is required
62b54357f6SMatt Spinler      */
63b54357f6SMatt Spinler     virtual void onFailure()
64b54357f6SMatt Spinler     {
65b54357f6SMatt Spinler     }
66b54357f6SMatt Spinler 
67b54357f6SMatt Spinler     /**
68dae0a8d7SMatt Spinler      * Pure virtual function to clear faults on the device
69dae0a8d7SMatt Spinler      */
70dae0a8d7SMatt Spinler     virtual void clearFaults() = 0;
71dae0a8d7SMatt Spinler 
72dae0a8d7SMatt Spinler   private:
73dae0a8d7SMatt Spinler     /**
74dae0a8d7SMatt Spinler      * the device name
75dae0a8d7SMatt Spinler      */
76dae0a8d7SMatt Spinler     const std::string name;
77dae0a8d7SMatt Spinler 
78dae0a8d7SMatt Spinler     /**
79dae0a8d7SMatt Spinler      * the device instance number
80dae0a8d7SMatt Spinler      */
81dae0a8d7SMatt Spinler     const size_t instance;
82dae0a8d7SMatt Spinler };
83dae0a8d7SMatt Spinler 
84*f0f02b9aSMatt Spinler } // namespace power
85*f0f02b9aSMatt Spinler } // namespace witherspoon
86