From 94a95eceb5c2c6ddead64d0e48268669cfe79aaa Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 14 Nov 2024 13:57:52 +0100 Subject: [PATCH] dCArun: add DigitalOutputAbstraction --- dCArun/DigitalOutputAbstraction.cpp | 170 ++++++++++++++++++++++++++++ dCArun/DigitalOutputAbstraction.h | 37 ++++++ dCArun/dCArun.pro | 2 + 3 files changed, 209 insertions(+) create mode 100644 dCArun/DigitalOutputAbstraction.cpp create mode 100644 dCArun/DigitalOutputAbstraction.h diff --git a/dCArun/DigitalOutputAbstraction.cpp b/dCArun/DigitalOutputAbstraction.cpp new file mode 100644 index 0000000..1635293 --- /dev/null +++ b/dCArun/DigitalOutputAbstraction.cpp @@ -0,0 +1,170 @@ +#include +#include +#include +#include + +#include + +#include "DigitalOutputAbstraction.h" +#include "plugin.h" + +/** + * this is based on a solution from: + * https://embeddeduse.com/2018/09/18/monitoring-sys-files-qfilesystemwatcher/ + * + */ + +DigitalOutputAbstraction::DigitalOutputAbstraction(hwinf *dc, QObject *parent) + : QObject(parent) + , dc(dc) +{ + auto fileMonitor = new QFileSystemWatcher(this); + + connect(fileMonitor, &QFileSystemWatcher::fileChanged, + this, &DigitalOutputAbstraction::fileChanged); + + qCritical() << "... init DigitalOutputAbstraction"; +} + + + + +bool DigitalOutputAbstraction::addCCWake(const QString file) +{ + // on PTU5: "/sys/class/leds/wakeupctrl_cc/brightness" + if (!QFileInfo::exists(file)) { + qCritical() << " ... create file: " << file; + QFile(file).open(QIODevice::ReadWrite | QIODevice::Text); + } + + qCritical() << " ... add file: " << file; + + this->ccWakePath = file; + return this->fileMonitor->addPath(file); +} + +bool DigitalOutputAbstraction::addCCPower(const QString file) +{ + if (!QFileInfo::exists(file)) { + qCritical() << " ... create file: " << file; + QFile(file).open(QIODevice::ReadWrite | QIODevice::Text); + } + + qCritical() << " ... add file: " << file; + + this->ccPowerPath = file; + return this->fileMonitor->addPath(file); +} + +bool DigitalOutputAbstraction::addCCModem(const QString file) +{ + if (!QFileInfo::exists(file)) { + qCritical() << " ... create file: " << file; + QFile(file).open(QIODevice::ReadWrite | QIODevice::Text); + } + + qCritical() << " ... add file: " << file; + + this->modemPowerPath = file; + return this->fileMonitor->addPath(file); +} + + +void DigitalOutputAbstraction::fileChanged(const QString &path) +{ + if (path == this->ccPowerPath) this->private_ccPowerChanged(); + if (path == this->ccWakePath) this->private_ccWakeChanged(); + if (path == this->modemPowerPath) this->private_ccWakeChanged(); +} + +void DigitalOutputAbstraction::private_modemPowerChanged() +{ + QFile modemPowerFile(this->modemPowerPath); + if (!modemPowerFile.open(QIODevice::ReadOnly)) { + qWarning() << "ERROR: Could not open modemPowerFile " << this->modemPowerPath; + return; + } + auto modemPower = modemPowerFile.readAll(); + if (!modemPower.isEmpty()) { + int state = modemPower.at(0); + //qCritical() << "INFO: modemPower = " << modemPower; + switch (state) { + case 0x30: // '0' + qCritical() << "INFO: modemPower -> off"; + this->dc->mod_switchWake(false); + this->dc->mod_switchPower(false); + break; + case 0x31: // '1' + qCritical() << "INFO: modemPower -> on"; + this->dc->mod_switchWake(true); + this->dc->mod_switchPower(true); + break; + } + } +} + +void DigitalOutputAbstraction::private_ccPowerChanged() +{ + QFile ccPowerFile(this->ccPowerPath); + if (!ccPowerFile.open(QIODevice::ReadOnly)) { + qWarning() << "ERROR: Could not open ccPowerFile file."; + return; + } + auto ccPower = ccPowerFile.readAll(); + if (!ccPower.isEmpty()) { + int state = ccPower.at(0); + + auto lambdaOn = [this]() -> void + { + this->dc->credit_switchPower(true); + this->dc->credit_switchWake(true); + }; + auto lambdaOff = [this]() -> void + { + this->dc->credit_switchPower(false); + this->dc->credit_switchWake(false); + }; + + + //qCritical() << "INFO: modemPower = " << modemPower; + switch (state) { + case 0x30: // '0' + qCritical() << "INFO: ccPower -> off"; + lambdaOff(); + break; + case 0x31: // '1' + qCritical() << "INFO: ccPower -> on"; + lambdaOn(); + break; + case 0x32: // '2' + qCritical() << "INFO: ccPower -> on / off"; + lambdaOff(); + QTimer::singleShot(500, this, lambdaOn); + break; + } + } +} + +void DigitalOutputAbstraction::private_ccWakeChanged() +{ + QFile ccWakeFile(this->ccWakePath); + if (!ccWakeFile.open(QIODevice::ReadOnly)) { + qWarning() << "ERROR: Could not open ccWakeFile " << this->ccWakePath; + return; + } + auto ccWake = ccWakeFile.readAll(); + if (!ccWake.isEmpty()) { + int state = ccWake.at(0); + //qCritical() << "INFO: ccWake = " << state; + switch (state) { + case 0x30: // '0' + qCritical() << "INFO: ccWake -> sleep"; + this->dc->credit_switchWake(true); // switch 'sleep' + break; + case 0x31: // '1' + qCritical() << "INFO: ccWake -> wake"; + this->dc->credit_switchWake(false); // switch 'wake' + break; + } + } +} diff --git a/dCArun/DigitalOutputAbstraction.h b/dCArun/DigitalOutputAbstraction.h new file mode 100644 index 0000000..f8f5910 --- /dev/null +++ b/dCArun/DigitalOutputAbstraction.h @@ -0,0 +1,37 @@ +#ifndef DIGITALOUTPUTABSTRACTION_H +#define DIGITALOUTPUTABSTRACTION_H + + +#include + +class hwinf; +class QFileSystemWatcher; + + +class DigitalOutputAbstraction : public QObject +{ + Q_OBJECT + +public: + DigitalOutputAbstraction(hwinf *dc, QObject *parent = nullptr); + bool addCCWake(const QString file); + bool addCCPower(const QString file); + bool addCCModem(const QString file); + + +private: + hwinf *dc; + QFileSystemWatcher *fileMonitor; + + QString modemPowerPath; + QString ccPowerPath; + QString ccWakePath; + + void fileChanged(const QString &path); + + void private_modemPowerChanged(); + void private_ccPowerChanged(); + void private_ccWakeChanged(); +}; + +#endif // DIGITALOUTPUTABSTRACTION_H diff --git a/dCArun/dCArun.pro b/dCArun/dCArun.pro index 676dd16..42abcfa 100644 --- a/dCArun/dCArun.pro +++ b/dCArun/dCArun.pro @@ -41,6 +41,7 @@ DEFINES+=APP_EXTENDED_VERSION=\\\"$$EXTENDED_VERSION\\\" SOURCES += \ CArun.cpp \ CCWakelineAbstraction.cpp \ + DigitalOutputAbstraction.cpp \ main.cpp \ tslib.cpp \ datei.cpp @@ -48,6 +49,7 @@ SOURCES += \ HEADERS += \ CArun.h \ CCWakelineAbstraction.h \ + DigitalOutputAbstraction.h \ guidefs.h \ tslib.h \ versionHistory.txt \