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 
21dae0a8d7SMatt Spinler         Device() = delete;
22dae0a8d7SMatt Spinler         virtual ~Device() = default;
23dae0a8d7SMatt Spinler         Device(const Device&) = delete;
24dae0a8d7SMatt Spinler         Device& operator=(const Device&) = delete;
25dae0a8d7SMatt Spinler         Device(Device&&) = default;
26dae0a8d7SMatt Spinler         Device& operator=(Device&&) = default;
27dae0a8d7SMatt Spinler 
28dae0a8d7SMatt Spinler         /**
29dae0a8d7SMatt Spinler          * Constructor
30dae0a8d7SMatt Spinler          *
31dae0a8d7SMatt Spinler          * @param name - the device name
32dae0a8d7SMatt Spinler          * @param inst - the device instance
33dae0a8d7SMatt Spinler          */
34dae0a8d7SMatt Spinler         Device(const std::string& name, size_t inst) :
35dae0a8d7SMatt Spinler             name(name),
36dae0a8d7SMatt Spinler             instance(inst)
37dae0a8d7SMatt Spinler             {
38dae0a8d7SMatt Spinler             }
39dae0a8d7SMatt Spinler 
40dae0a8d7SMatt Spinler         /**
41dae0a8d7SMatt Spinler          * Returns the instance number
42dae0a8d7SMatt Spinler          */
43dae0a8d7SMatt Spinler         inline auto getInstance() const
44dae0a8d7SMatt Spinler         {
45dae0a8d7SMatt Spinler             return instance;
46dae0a8d7SMatt Spinler         }
47dae0a8d7SMatt Spinler 
48dae0a8d7SMatt Spinler         /**
49dae0a8d7SMatt Spinler          * Returns the name
50dae0a8d7SMatt Spinler          */
51dae0a8d7SMatt Spinler         inline auto getName() const
52dae0a8d7SMatt Spinler         {
53dae0a8d7SMatt Spinler             return name;
54dae0a8d7SMatt Spinler         }
55dae0a8d7SMatt Spinler 
56dae0a8d7SMatt Spinler         /**
57dae0a8d7SMatt Spinler          * Pure virtual function to analyze an error
58dae0a8d7SMatt Spinler          */
59dae0a8d7SMatt Spinler         virtual void analyze() = 0;
60dae0a8d7SMatt Spinler 
61dae0a8d7SMatt Spinler         /**
62*b54357f6SMatt Spinler          * Stubbed virtual function to call when it's known
63*b54357f6SMatt Spinler          * the chip is in error state.  Override if functionality
64*b54357f6SMatt Spinler          * is required
65*b54357f6SMatt Spinler          */
66*b54357f6SMatt Spinler         virtual void onFailure()
67*b54357f6SMatt Spinler         {
68*b54357f6SMatt Spinler         }
69*b54357f6SMatt Spinler 
70*b54357f6SMatt Spinler         /**
71dae0a8d7SMatt Spinler          * Pure virtual function to clear faults on the device
72dae0a8d7SMatt Spinler          */
73dae0a8d7SMatt Spinler         virtual void clearFaults() = 0;
74dae0a8d7SMatt Spinler 
75dae0a8d7SMatt Spinler     private:
76dae0a8d7SMatt Spinler 
77dae0a8d7SMatt Spinler         /**
78dae0a8d7SMatt Spinler          * the device name
79dae0a8d7SMatt Spinler          */
80dae0a8d7SMatt Spinler         const std::string name;
81dae0a8d7SMatt Spinler 
82dae0a8d7SMatt Spinler         /**
83dae0a8d7SMatt Spinler          * the device instance number
84dae0a8d7SMatt Spinler          */
85dae0a8d7SMatt Spinler         const size_t instance;
86dae0a8d7SMatt Spinler };
87dae0a8d7SMatt Spinler 
88dae0a8d7SMatt Spinler }
89dae0a8d7SMatt Spinler }
90