From dd2aabcabf52f550aa257ec5b5590adf15cbf4de Mon Sep 17 00:00:00 2001 From: Adrian Suciu Date: Wed, 26 Jun 2024 12:49:10 +0300 Subject: [PATCH] iioutil: created IIOUnitsManager singleton Signed-off-by: Adrian Suciu --- core/src/scopymainwindow.cpp | 5 +- iioutil/include/iioutil/iiounits.h | 48 ++++++++++++++++ iioutil/src/iiounits.cpp | 56 +++++++++++++++++++ plugins/datalogger/CMakeLists.txt | 2 +- plugins/datalogger/include/datalogger/dmm.hpp | 16 ++---- plugins/datalogger/src/dmm.cpp | 55 +++--------------- 6 files changed, 120 insertions(+), 62 deletions(-) create mode 100644 iioutil/include/iioutil/iiounits.h create mode 100644 iioutil/src/iiounits.cpp diff --git a/core/src/scopymainwindow.cpp b/core/src/scopymainwindow.cpp index 1e9e6dc203..641a83d41e 100644 --- a/core/src/scopymainwindow.cpp +++ b/core/src/scopymainwindow.cpp @@ -26,17 +26,15 @@ #include "iioutil/connectionprovider.h" #include "pluginbase/messagebroker.h" #include "scopy-core_config.h" -#include "popupwidget.h" #include "pluginbase/statusbarmanager.h" #include "scopytitlemanager.h" #include #include #include -#include -#include #include #include #include +#include using namespace scopy; using namespace scopy::gui; @@ -58,6 +56,7 @@ ScopyMainWindow::ScopyMainWindow(QWidget *parent) ScopyTitleManager::setGitHash(QString(SCOPY_VERSION_GIT)); StyleHelper::GetInstance()->initColorMap(); + IIOUnitsManager::GetInstance(); setAttribute(Qt::WA_QuitOnClose, true); initPythonWIN32(); initStatusBar(); diff --git a/iioutil/include/iioutil/iiounits.h b/iioutil/include/iioutil/iiounits.h new file mode 100644 index 0000000000..46db0a48c7 --- /dev/null +++ b/iioutil/include/iioutil/iiounits.h @@ -0,0 +1,48 @@ +#ifndef IIOUNITS_H +#define IIOUNITS_H + +#include +#include +#include + +#include "scopy-iioutil_export.h" +#include + +namespace scopy { + +typedef struct IIOUnit_ +{ + QString name; + QString symbol; + double scale = 1; +} IIOUnit; + +class SCOPY_IIOUTIL_EXPORT IIOUnitsManager : public QObject +{ + Q_OBJECT +protected: + IIOUnitsManager(QObject *parent = nullptr); + ~IIOUnitsManager(); + +public: + // singleton + IIOUnitsManager(IIOUnitsManager &other) = delete; + void operator=(const IIOUnitsManager &) = delete; + static IIOUnitsManager *GetInstance(); + + static QMap iioChannelTypes(); + static QMap hwmonChannelTypes(); + +private: + QMap _iioChannelTypes(); + QMap _hwmonChannelTypes(); + +private: + static IIOUnitsManager *pinstance_; + QMap m_iioChannelTypes; + QMap m_hwmonChannelTypes; +}; + +}; // namespace scopy + +#endif // IIOUNITS_H diff --git a/iioutil/src/iiounits.cpp b/iioutil/src/iiounits.cpp new file mode 100644 index 0000000000..174647a618 --- /dev/null +++ b/iioutil/src/iiounits.cpp @@ -0,0 +1,56 @@ +#include +#include + +using namespace scopy; + +IIOUnitsManager *IIOUnitsManager::pinstance_{nullptr}; + +IIOUnitsManager::IIOUnitsManager(QObject *parent) + : QObject(parent) +{ + + m_iioChannelTypes = QMap({ + {IIO_VOLTAGE, {"Voltage", "V", 0.001}}, + {IIO_TEMP, {"Degree Celsius", "°C", 0.001}}, + {IIO_CURRENT, {"Ampere", "A", 0.001}}, + {IIO_PRESSURE, {"Pascal", "Pa", 1000}}, + {IIO_ACCEL, {"Metre per second squared", "m/s2", 1}}, + {IIO_ANGL_VEL, {"Radian per second", "rad/s", 1}}, + {IIO_MAGN, {"Gauss", "Gs", 1}} + /// and others + }); + + m_hwmonChannelTypes = { + {HWMON_VOLTAGE, {"Voltage", "V", 0.001}}, {HWMON_TEMP, {"Degree Celsius", "°C", 0.001}}, + {HWMON_CURRENT, {"Ampere", "A", 0.001}}, {HWMON_POWER, {"Watt", "W", 0.000001 }}, + {HWMON_ENERGY, {"Joule", "J", 0.000001 }}, {HWMON_FAN, {"Revolution/Min", "RPM", 1}}, + {HWMON_HUMIDITY, {"percent", "%", 0.001}} + /// and others + }; +} + +IIOUnitsManager *IIOUnitsManager::GetInstance() +{ + if(pinstance_ == nullptr) { + pinstance_ = new IIOUnitsManager(QApplication::instance()); // singleton has the app as parent + } + return pinstance_; +} + +QMap IIOUnitsManager::iioChannelTypes() +{ + return IIOUnitsManager::GetInstance()->_iioChannelTypes(); +} + +QMap IIOUnitsManager::hwmonChannelTypes() +{ + return IIOUnitsManager::GetInstance()->_hwmonChannelTypes(); +} + +IIOUnitsManager::~IIOUnitsManager() {} + +QMap IIOUnitsManager::_iioChannelTypes() { return m_iioChannelTypes; } + +QMap IIOUnitsManager::_hwmonChannelTypes() { return m_hwmonChannelTypes; } + +#include "moc_iiounits.cpp" diff --git a/plugins/datalogger/CMakeLists.txt b/plugins/datalogger/CMakeLists.txt index dcce10e7c2..6cad96533f 100644 --- a/plugins/datalogger/CMakeLists.txt +++ b/plugins/datalogger/CMakeLists.txt @@ -80,7 +80,7 @@ target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} target_include_directories(${PROJECT_NAME} PRIVATE ${INCLUDE_DIRECTORIES}) target_include_directories(${PROJECT_NAME} PUBLIC scopy-pluginbase scopy-gui) -target_include_directories(${PROJECT_NAME} PRIVATE ${IIO_INCLUDE_DIRS} scopy-gui scopy-iio-widgets) +target_include_directories(${PROJECT_NAME} PRIVATE ${IIO_INCLUDE_DIRS} scopy-gui scopy-iio-widgets scopy-iioutil) target_link_libraries( ${PROJECT_NAME} diff --git a/plugins/datalogger/include/datalogger/dmm.hpp b/plugins/datalogger/include/datalogger/dmm.hpp index 95b07fd393..21ee394db7 100644 --- a/plugins/datalogger/include/datalogger/dmm.hpp +++ b/plugins/datalogger/include/datalogger/dmm.hpp @@ -7,17 +7,11 @@ #include "datamonitor/dmmdatamonitormodel.hpp" #include "iio.h" #include "scopy-datalogger_export.h" +#include "iioutil/iiounits.h" namespace scopy { namespace datamonitor { -struct DMMInfo -{ - QString key; - QString key_symbol; - double umScale = 1; -}; - class SCOPY_DATALOGGER_EXPORT DMM : public QObject { Q_OBJECT @@ -30,12 +24,12 @@ class SCOPY_DATALOGGER_EXPORT DMM : public QObject bool iioChannelHasAttribute(iio_channel *chn, std::string const &attr); void generateDictionaries(); - QMap iioDevices() const; - QMap hwmonDevices() const; + QMap iioDevices() const; + QMap hwmonDevices() const; private: - QMap m_iioDevices; - QMap m_hwmonDevices; + QMap m_iioDevices; + QMap m_hwmonDevices; }; } // namespace datamonitor } // namespace scopy diff --git a/plugins/datalogger/src/dmm.cpp b/plugins/datalogger/src/dmm.cpp index 062f20251b..3d35e8482b 100644 --- a/plugins/datalogger/src/dmm.cpp +++ b/plugins/datalogger/src/dmm.cpp @@ -36,17 +36,17 @@ QList DMM::getDmmMonitors(iio_context *ctx) int type = iio_channel_get_type(chn); if(type != iio_chan_type::IIO_CHAN_TYPE_UNKNOWN) { - DMMInfo dmmInfo = m_iioDevices.value(type); + IIOUnit dmmInfo = m_iioDevices.value(static_cast(type)); if(isHwmon(dev, chn)) { - dmmInfo = m_hwmonDevices.value(type); + dmmInfo = m_hwmonDevices.value(static_cast(type)); } channelModel->setUnitOfMeasure( - new UnitOfMeasurement(dmmInfo.key, dmmInfo.key_symbol)); + new UnitOfMeasurement(dmmInfo.name, dmmInfo.symbol)); DMMReadStrategy *dmmReadStrategy = new DMMReadStrategy(dev, chn); - dmmReadStrategy->setUmScale(dmmInfo.umScale); + dmmReadStrategy->setUmScale(dmmInfo.scale); channelModel->setReadStrategy(dmmReadStrategy); if(iioChannelHasAttribute(chn, "offset")) { @@ -103,51 +103,12 @@ bool DMM::iioChannelHasAttribute(iio_channel *chn, const std::string &attr) void DMM::generateDictionaries() { - DMMInfo hwmon_voltage = {"Voltage", "V", 0.001}; - m_hwmonDevices.insert(hwmon_chan_type::HWMON_VOLTAGE, hwmon_voltage); - - DMMInfo hwmon_temp = {"Degree Celsius", "°C", 0.001}; - m_hwmonDevices.insert(hwmon_chan_type::HWMON_TEMP, hwmon_temp); - - DMMInfo hwmon_current = {"Ampere", "A", 0.001}; - m_hwmonDevices.insert(hwmon_chan_type::HWMON_CURRENT, hwmon_current); - - DMMInfo hwmon_power = {"milliWatt", "mW", 0.001}; - m_hwmonDevices.insert(hwmon_chan_type::HWMON_POWER, hwmon_power); - - DMMInfo hwmon_energy = {"milliJoule", "mJ", 0.001}; - m_hwmonDevices.insert(hwmon_chan_type::HWMON_ENERGY, hwmon_energy); - - DMMInfo hwmon_fan = {"Revolution/Min", "RPM"}; - m_hwmonDevices.insert(hwmon_chan_type::HWMON_FAN, hwmon_fan); - - DMMInfo hwmon_humidity = {"milli-percent", "pcm"}; - m_hwmonDevices.insert(hwmon_chan_type::HWMON_HUMIDITY, hwmon_humidity); - - DMMInfo iio_voltage = {"Voltage", "V", 0.001}; - m_iioDevices.insert(iio_chan_type::IIO_VOLTAGE, iio_voltage); - - DMMInfo iio_temp = {"Degree Celsius", "°C", 0.001}; - m_iioDevices.insert(iio_chan_type::IIO_TEMP, iio_temp); - - DMMInfo iio_current = {"Ampere", "A", 0.001}; - m_iioDevices.insert(iio_chan_type::IIO_CURRENT, iio_current); - - DMMInfo iio_pressure = {"Pascal", "Pa", 1000}; - m_iioDevices.insert(iio_chan_type::IIO_PRESSURE, iio_pressure); - - DMMInfo iio_accel = {"Metre per second squared", "m/s²"}; - m_iioDevices.insert(iio_chan_type::IIO_ACCEL, iio_accel); - - DMMInfo iio_angl_vel = {"Radian per second", "rad/s"}; - m_iioDevices.insert(iio_chan_type::IIO_ANGL_VEL, iio_angl_vel); - - DMMInfo iio_magn = {"Gauss", "Gs"}; - m_iioDevices.insert(iio_chan_type::IIO_MAGN, iio_magn); + m_hwmonDevices = IIOUnitsManager::hwmonChannelTypes(); + m_iioDevices = IIOUnitsManager::iioChannelTypes(); } -QMap DMM::iioDevices() const { return m_iioDevices; } +QMap DMM::iioDevices() const { return m_iioDevices; } -QMap DMM::hwmonDevices() const { return m_hwmonDevices; } +QMap DMM::hwmonDevices() const { return m_hwmonDevices; } #include "moc_dmm.cpp"