c++ 监控HDMI电缆状态

roejwanj  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(179)

我想在我的代码中监视HDMI电缆状态。有一个文件在电缆连接和断开时会发生变化。

$cat /sys/devices/soc0/soc/20e0000.hdmi_video/cable_state
plugin
$cat /sys/devices/soc0/soc/20e0000.hdmi_video/cable_state
plugout

我使用QFileSystemWatcher来监视此文件,但它不起作用。

QFileSystemWatcher watcher;
    watcher.addPath("/sys/devices/soc0/soc/20e0000.hdmi_video/cable_state");
    QObject::connect(&watcher, &QFileSystemWatcher::fileChanged,
    [this]( const QString& path ) {
        qDebug() << path;
        QFile file(path);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return;
        auto line = file.readLine();
        qDebug() << line;
    });

我认为它不起作用,因为这个文件属于sysfs,而不是一个普通的文件。有没有办法访问一个平台设备属性,并得到通知,没有文件监控,用代码?
在内核中定义cable_state属性的部分代码:

static ssize_t mxc_hdmi_show_state(struct device *dev,
        struct device_attribute *attr, char *buf)
{
    struct mxc_hdmi *hdmi = dev_get_drvdata(dev);

    if (hdmi->cable_plugin == false)
        strcpy(buf, "plugout\n");
    else
        strcpy(buf, "plugin\n");

    return strlen(buf);
}

static DEVICE_ATTR(cable_state, S_IRUGO, mxc_hdmi_show_state, NULL);
of1yzvn4

of1yzvn41#

您是正确的:sys中的文件不是普通的文件。2它们的内容是在你真正读它们的时候被内核艾德出来的。
您将不得不转而求助于轮询:

class HDMIWatcher : public QObject {
Q_OBJECT
public:
  HDMIWatcher(const QString& path, QObject* parent) : QObject(parent), path(file), timer(new QTimer(this)) {
    QObject::connect(timer, &QTimer::timeout, this, &HDMIWatcher::poll);
    timer->setInterval(5000);
    poll();
  }

public slots:
  void start() {
    timer->start();
  }

  void poll() {
    QFile file(path);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
    auto line = file.readLine();
    if (last.isEmpty()) {
      last = line;
    }
    if (line != last) {
      emit changeDetected(last, line);
      last = line;
    }
  }

public signals:
  void changeDetected(const QString& old, const QString& new);

private:
  QString last;
};

相关问题