Linux开发板设备输入能否触发QFile::readyRead信号,还是只能使能Linux异步IO实现异步输入

本文介绍了Key类,它通过读取/dev/input/event1设备文件,监控按键事件来控制系统的LED灯(客厅灯和卧室灯)。当特定按键被按下时,相应的LED灯状态会改变。
摘要由CSDN通过智能技术生成

 key.h

#ifndef KEY_H
#define KEY_H

#include <QObject>
#include <QFile>
#include <QDebug>
#include <linux/input.h>

class Key : public QObject
{
    Q_OBJECT
public:
    explicit Key(QObject *parent = nullptr);
    ~Key();
    static void Qsys_led_on();
    static void Qsys_led_off();
    static void Quser_led_on();
    static void Quser_led_off();
public slots:
    void read_key();
private:
    QFile* file;
};

#endif // KEY_H

key.cpp

#include "key.h"

Key::Key(QObject *parent) : QObject(parent)
{
    file = new QFile(this);
    file->setFileName("/dev/input/event1");
    file->open(QIODevice::ReadWrite);
    connect(file, &QFile::readyRead, this, &Key::read_key);
}

Key::~Key()
{
    file->close();
}

void Key::read_key()
{
    int size = sizeof(struct input_event);
    char* buff = new char[size];
    if(size == file->read(buff, size)){
        struct input_event* key_ev;
        key_ev = (struct input_event*)buff;
        if(key_ev->type == EV_KEY){
            switch(key_ev->code){
            case 1:
                if(key_ev->value == 1){
                    Qsys_led_on();
                }
                break;
            case 139:
                if(key_ev->value == 1){
                    Qsys_led_off();
                }
                break;
            case 105:
                if(key_ev->value == 1){
                    Quser_led_on();
                }
                break;
            case 106:
                if(key_ev->value == 1){
                    Quser_led_off();
                }
                break;
            }
        }
    }
    delete[] buff;
}

//客厅灯打开
void Key::Qsys_led_on()
{
    QFile sfile;
    sfile.setFileName("/sys/class/leds/sys-led/brightness");
    if(!sfile.open(QIODevice::ReadWrite)){
        qDebug()<<sfile.errorString();
    }
    sfile.write("1");
    sfile.close();
}
//客厅灯关闭
void Key::Qsys_led_off()
{
    QFile sfile;
    sfile.setFileName("/sys/class/leds/sys-led/brightness");
    if(!sfile.open(QIODevice::ReadWrite)){
        qDebug()<<sfile.errorString();
    }
    sfile.write("0");
    sfile.close();
}
//卧室灯打开
void Key::Quser_led_on()
{
    QFile ufile;
    ufile.setFileName("/sys/class/leds/user-led/brightness");
    if(!ufile.open(QIODevice::ReadWrite)){
        qDebug()<<ufile.errorString();
    }
    ufile.write("1");
    ufile.close();
}
//卧室灯关闭
void Key::Quser_led_off()
{
    QFile ufile;
    ufile.setFileName("/sys/class/leds/user-led/brightness");
    if(!ufile.open(QIODevice::ReadWrite)){
        qDebug()<<ufile.errorString();
    }
    ufile.write("0");
    ufile.close();
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值