diff --git a/powersensor3/PowerSensor3.cpp b/powersensor3/PowerSensor3.cpp index 0a58f590062bd801b92df2dc8351cc4b2bc49dd8..5fb0ee93601ecbda59afc79c61bba18d2f89425d 100644 --- a/powersensor3/PowerSensor3.cpp +++ b/powersensor3/PowerSensor3.cpp @@ -1,7 +1,13 @@ #include "PowerSensor3.h" +#include <cassert> +#include <iostream> +#include <map> + #include POWERSENSOR3_HEADER +const unsigned MAX_PAIRS = PowerSensor3::MAX_PAIRS; + namespace { double Seconds(const PowerSensor3::State &first, const PowerSensor3::State &second) { @@ -9,13 +15,13 @@ double Seconds(const PowerSensor3::State &first, } double Joules(const PowerSensor3::State &first, - const PowerSensor3::State &second, int sensor_id) { - return PowerSensor3::Joules(first, second, sensor_id); + const PowerSensor3::State &second, int pair_id) { + return PowerSensor3::Joules(first, second, pair_id); } double Watt(const PowerSensor3::State &first, const PowerSensor3::State &second, - int sensor_id) { - return PowerSensor3::Watt(first, second, sensor_id); + int pair_id) { + return PowerSensor3::Watt(first, second, pair_id); } } // namespace @@ -26,25 +32,57 @@ class PowerSensor3Impl : public PowerSensor3 { public: PowerSensor3Impl(const char *device) : powersensor_(std::make_unique<PowerSensor>(device)), - first_state_(powersensor_->read()) {} + first_state_(powersensor_->read()) { + for (unsigned pair_id; pair_id < MAX_PAIRS; pair_id++) { + pairNames[pair_id] = GetPairName(pair_id); + } + } State GetState() override { + State state(MAX_PAIRS + 1); const PowerSensorState powersensor_state = powersensor_->read(); - State state; + + state.name_[0] = "total"; state.timestamp_ = ::Seconds(first_state_, powersensor_state); - state.name_[0] = "device"; state.joules_[0] = ::Joules(first_state_, powersensor_state, -1); state.watt_[0] = ::Watt(first_state_, powersensor_state, -1); + + for (unsigned pair_id; pair_id < MAX_PAIRS; pair_id++) { + state.name_[pair_id + 1] = pairNames[pair_id]; + state.joules_[pair_id + 1] = + ::Joules(first_state_, powersensor_state, pair_id); + state.watt_[pair_id + 1] = + ::Watt(first_state_, powersensor_state, pair_id); + } + return state; + } + + State Read(int pair_id) override { + State state{1}; + State current_state{MAX_PAIRS + 1}; + current_state = PMT::Read(); + + state.timestamp_ = current_state.timestamp_; + state.name_[0] = current_state.name_[pair_id + 1]; + state.joules_[0] = current_state.joules_[pair_id + 1]; + state.watt_[0] = current_state.watt_[pair_id + 1]; return state; } + bool IsInUse(int pair_id) override { return powersensor_->getInUse(pair_id); } + + std::string GetPairName(int pair_id) override { + return powersensor_->getPairName(pair_id); + } + private: virtual const char *GetDumpFilename() { return "/tmp/pmt_powersensor3.out"; } - virtual int GetMeasurementInterval() { + virtual int GetMeasurementInterval() override { return 1; // milliseconds } + std::string pairNames[MAX_PAIRS]; std::unique_ptr<PowerSensor> powersensor_{}; PowerSensorState first_state_{}; }; diff --git a/powersensor3/PowerSensor3.h b/powersensor3/PowerSensor3.h index 355407a5d83d538519673c7d56db05177888ec73..225e62ce666caff1df8ce58fe9aa3f2231cca104 100644 --- a/powersensor3/PowerSensor3.h +++ b/powersensor3/PowerSensor3.h @@ -10,8 +10,11 @@ class PowerSensor3 : public PMT { static std::unique_ptr<PowerSensor3> Create( const char *device = default_device().c_str()); static std::string default_device() { return "/dev/ttyACM0"; } + virtual std::string GetPairName(int pairID) { return ""; }; + virtual bool IsInUse(int pairID) { return false; }; + virtual State Read(int pairID) { return PMT::Read(); }; }; } // end namespace pmt::powersensor3 -#endif // PMT_POWERSENSOR3_H_ +#endif // PMT_POWERSENSOR3_H_ diff --git a/python/pmt.py b/python/pmt.py index fc8481eb38b36415ca084b7adbd1cab7507dfa4b..0dd5ac1f81275fd4245de5d565e8392704eb2823 100644 --- a/python/pmt.py +++ b/python/pmt.py @@ -1,17 +1,29 @@ import pypmt +import os +import re + + +def is_tty_device(device_id): + return isinstance(device_id, str) and bool(re.search(r"^/dev/tty.*", device_id)) def get_pmt(platform, device_id=0): if platform == "cray": return pypmt.Cray.create() - elif platform in ['powersensor2', 'powersensor3']: + elif platform == 'powersensor2': try: - return pypmt.PowerSensor_.create(device_id, 2) + if is_tty_device(device_id): + return pypmt.PowerSensor2.create(str(device_id)) + else: + return pypmt.PowerSensor2.create() except AttributeError: raise Exception("PowerSensor2 not installed") elif platform == 'powersensor3': try: - return pypmt.PowerSensor_.create(device_id, 3) + if is_tty_device(device_id): + return pypmt.PowerSensor3.create(str(device_id)) + else: + return pypmt.PowerSensor3.create() except AttributeError: raise Exception("PowerSensor3 not installed") elif platform == "dummy": @@ -76,14 +88,13 @@ def dump(platform, **kwargs): device_id = kwargs[device_id_arg] def decorator(func): - def wrapper(*args, **kwargs): - pmt = get_pmt(platform, device_id) - pmt.startDump(filename) - result = func(*args, **kwargs) - pmt.stopDump() - return result + def wrapper(*args, **kwargs): + pmt = get_pmt(platform, device_id) + pmt.startDump(filename) + result = func(*args, **kwargs) + pmt.stopDump() + return result - return wrapper + return wrapper return decorator - diff --git a/python/pypmt.cpp b/python/pypmt.cpp index 510d2bc9b14a06972faa674b5126a9e28892f06f..3636cb9c09d957e373340e1acf098c838031ced4 100644 --- a/python/pypmt.cpp +++ b/python/pypmt.cpp @@ -58,7 +58,9 @@ PYBIND11_MODULE(pypmt, m) { .def("create", &pmt::powersensor3::PowerSensor3::Create) .def("read", &pmt::powersensor3::PowerSensor3::Read) .def("startDump", &pmt::powersensor3::PowerSensor3::StartDump) - .def("stopDump", &pmt::powersensor3::PowerSensor3::StopDump); + .def("stopDump", &pmt::powersensor3::PowerSensor3::StopDump) + .def("getPairName", &pmt::powersensor3::PowerSensor3::GetPairName) + .def("isInUse", &pmt::powersensor3::PowerSensor3::IsInUse); #endif py::class_<pmt::Dummy>(m, "Dummy")