text: 
  #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
  