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