1*d7be555eSGeorge Liu #pragma once
2*d7be555eSGeorge Liu 
3*d7be555eSGeorge Liu #include <boost/asio/io_context.hpp>
4*d7be555eSGeorge Liu #include <boost/asio/steady_timer.hpp>
5*d7be555eSGeorge Liu #include <gpiod.hpp>
6*d7be555eSGeorge Liu #include <sdbusplus/asio/object_server.hpp>
7*d7be555eSGeorge Liu 
8*d7be555eSGeorge Liu #include <memory>
9*d7be555eSGeorge Liu #include <string>
10*d7be555eSGeorge Liu 
11*d7be555eSGeorge Liu namespace fs = std::filesystem;
12*d7be555eSGeorge Liu 
13*d7be555eSGeorge Liu class ChassisIntrusionSensor
14*d7be555eSGeorge Liu {
15*d7be555eSGeorge Liu   public:
16*d7be555eSGeorge Liu     explicit ChassisIntrusionSensor(bool autoRearm,
17*d7be555eSGeorge Liu                                     sdbusplus::asio::object_server& objServer);
18*d7be555eSGeorge Liu 
19*d7be555eSGeorge Liu     virtual ~ChassisIntrusionSensor();
20*d7be555eSGeorge Liu 
21*d7be555eSGeorge Liu     void start();
22*d7be555eSGeorge Liu 
23*d7be555eSGeorge Liu   protected:
24*d7be555eSGeorge Liu     virtual int readSensor() = 0;
25*d7be555eSGeorge Liu     virtual void pollSensorStatus() = 0;
26*d7be555eSGeorge Liu     void updateValue(const size_t& value);
27*d7be555eSGeorge Liu 
28*d7be555eSGeorge Liu   private:
29*d7be555eSGeorge Liu     std::string mValue;
30*d7be555eSGeorge Liu     // If this sensor uses automatic rearm method. Otherwise, manually rearm it
31*d7be555eSGeorge Liu     bool mAutoRearm;
32*d7be555eSGeorge Liu     std::shared_ptr<sdbusplus::asio::dbus_interface> mIface;
33*d7be555eSGeorge Liu     sdbusplus::asio::object_server& mObjServer;
34*d7be555eSGeorge Liu     bool mOverridenState = false;
35*d7be555eSGeorge Liu     bool mInternalSet = false;
36*d7be555eSGeorge Liu     bool mRearmFlag = false;
37*d7be555eSGeorge Liu 
38*d7be555eSGeorge Liu     int setSensorValue(const std::string& req, std::string& propertyValue);
39*d7be555eSGeorge Liu };
40*d7be555eSGeorge Liu 
41*d7be555eSGeorge Liu class ChassisIntrusionPchSensor :
42*d7be555eSGeorge Liu     public ChassisIntrusionSensor,
43*d7be555eSGeorge Liu     public std::enable_shared_from_this<ChassisIntrusionPchSensor>
44*d7be555eSGeorge Liu {
45*d7be555eSGeorge Liu   public:
46*d7be555eSGeorge Liu     ChassisIntrusionPchSensor(bool autoRearm, boost::asio::io_context& io,
47*d7be555eSGeorge Liu                               sdbusplus::asio::object_server& objServer,
48*d7be555eSGeorge Liu                               int busId, int slaveAddr);
49*d7be555eSGeorge Liu 
50*d7be555eSGeorge Liu     ~ChassisIntrusionPchSensor() override;
51*d7be555eSGeorge Liu 
52*d7be555eSGeorge Liu   private:
53*d7be555eSGeorge Liu     int mBusFd{-1};
54*d7be555eSGeorge Liu     int mSlaveAddr{-1};
55*d7be555eSGeorge Liu     boost::asio::steady_timer mPollTimer;
56*d7be555eSGeorge Liu     int readSensor() override;
57*d7be555eSGeorge Liu     void pollSensorStatus() override;
58*d7be555eSGeorge Liu };
59*d7be555eSGeorge Liu 
60*d7be555eSGeorge Liu class ChassisIntrusionGpioSensor :
61*d7be555eSGeorge Liu     public ChassisIntrusionSensor,
62*d7be555eSGeorge Liu     public std::enable_shared_from_this<ChassisIntrusionGpioSensor>
63*d7be555eSGeorge Liu {
64*d7be555eSGeorge Liu   public:
65*d7be555eSGeorge Liu     ChassisIntrusionGpioSensor(bool autoRearm, boost::asio::io_context& io,
66*d7be555eSGeorge Liu                                sdbusplus::asio::object_server& objServer,
67*d7be555eSGeorge Liu                                bool gpioInverted);
68*d7be555eSGeorge Liu 
69*d7be555eSGeorge Liu     ~ChassisIntrusionGpioSensor() override;
70*d7be555eSGeorge Liu 
71*d7be555eSGeorge Liu   private:
72*d7be555eSGeorge Liu     bool mGpioInverted{false};
73*d7be555eSGeorge Liu     std::string mPinName = "CHASSIS_INTRUSION";
74*d7be555eSGeorge Liu     gpiod::line mGpioLine;
75*d7be555eSGeorge Liu     boost::asio::posix::stream_descriptor mGpioFd;
76*d7be555eSGeorge Liu     int readSensor() override;
77*d7be555eSGeorge Liu     void pollSensorStatus() override;
78*d7be555eSGeorge Liu };
79*d7be555eSGeorge Liu 
80*d7be555eSGeorge Liu class ChassisIntrusionHwmonSensor :
81*d7be555eSGeorge Liu     public ChassisIntrusionSensor,
82*d7be555eSGeorge Liu     public std::enable_shared_from_this<ChassisIntrusionHwmonSensor>
83*d7be555eSGeorge Liu {
84*d7be555eSGeorge Liu   public:
85*d7be555eSGeorge Liu     ChassisIntrusionHwmonSensor(bool autoRearm, boost::asio::io_context& io,
86*d7be555eSGeorge Liu                                 sdbusplus::asio::object_server& objServer,
87*d7be555eSGeorge Liu                                 std::string hwmonName);
88*d7be555eSGeorge Liu 
89*d7be555eSGeorge Liu     ~ChassisIntrusionHwmonSensor() override;
90*d7be555eSGeorge Liu 
91*d7be555eSGeorge Liu   private:
92*d7be555eSGeorge Liu     std::string mHwmonName;
93*d7be555eSGeorge Liu     std::string mHwmonPath;
94*d7be555eSGeorge Liu     boost::asio::steady_timer mPollTimer;
95*d7be555eSGeorge Liu     int readSensor() override;
96*d7be555eSGeorge Liu     void pollSensorStatus() override;
97*d7be555eSGeorge Liu };
98