#ifndef ANDROID_HARDWARE_POWERSTATS_RAILDATAPROVIDER_H
#define ANDROID_HARDWARE_POWERSTATS_RAILDATAPROVIDER_H
#include <fmq/MessageQueue.h>
#include <pixelpowerstats/PowerStats.h>
namespace android {
namespace hardware {
namespace google {
namespace pixel {
namespace powerstats {
typedef MessageQueue<EnergyData, kSynchronizedReadWrite> MessageQueueSync;
struct RailData {
    std::string devicePath;
    uint32_t index;
    std::string subsysName;
    uint32_t samplingRate;
};
struct OnDeviceMmt {
    std::mutex mLock;
    bool hwEnabled;
    std::vector<std::string> devicePaths;
    std::map<std::string, RailData> railsInfo;
    std::vector<EnergyData> reading;
    std::unique_ptr<MessageQueueSync> fmqSynchronized;
};
class RailDataProvider : public IRailDataProvider {
public:
    RailDataProvider();
    // Methods from ::android::hardware::power::stats::V1_0::IPowerStats follow.
    Return<void> getRailInfo(IPowerStats::getRailInfo_cb _hidl_cb) override;
    Return<void> getEnergyData(const hidl_vec<uint32_t>& railIndices,
                        IPowerStats::getEnergyData_cb _hidl_cb) override;
    Return<void> streamEnergyData(uint32_t timeMs, uint32_t samplingRate,
                        IPowerStats::streamEnergyData_cb _hidl_cb) override;
 private:
     OnDeviceMmt mOdpm;
     void findIioPowerMonitorNodes();
     size_t parsePowerRails();
     int parseIioEnergyNode(std::string devName);
     Status parseIioEnergyNodes();
};
}  // namespace powerstats
}  // namespace pixel
}  // namespace google
}  // namespace hardware
}  // namespace android
#endif  // ANDROID_HARDWARE_POWERSTATS_RAILDATAPROVIDER_H