gpiobutten.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "gpiobutten.h"
  2. #include "QFile"
  3. GpioButten::GpioButten(QObject *parent) : QObject(parent)
  4. {
  5. QFile exportFile("/sys/class/gpio/export");
  6. if (exportFile.open(QIODevice::WriteOnly)) {
  7. exportFile.write(QByteArray::number(PG(8)));
  8. exportFile.close();
  9. }
  10. QFile dirFile(QString("/sys/class/gpio/gpio%1/direction").arg(PG(8)));
  11. dirFile.open(QIODevice::WriteOnly);
  12. dirFile.write("in");
  13. dirFile.close();
  14. m_lastvalue = 0;
  15. connect(&m_timer, &QTimer::timeout, this, &GpioButten::onPoll);
  16. m_timer.start(20);
  17. }
  18. void GpioButten::onPoll()
  19. {
  20. QString valPath = QString("/sys/class/gpio/gpio%1/value").arg(PG(8));
  21. QFile valFile(valPath);
  22. if (!valFile.open(QIODevice::ReadOnly)) return;
  23. QTextStream in(&valFile);
  24. int currentValue = in.readLine().toInt();
  25. valFile.close();
  26. if(currentValue != m_lastvalue)
  27. {
  28. if (!m_debounceTimer.isValid()) {
  29. m_debounceTimer.start();
  30. } else if (m_debounceTimer.elapsed() > 50) {
  31. // 假设低电平有效(按下为0),高电平释放
  32. if (currentValue == 0) {
  33. emit pressed();
  34. } else {
  35. //emit released();
  36. }
  37. m_lastvalue = currentValue;
  38. m_debounceTimer.invalidate();
  39. }
  40. } else {
  41. m_debounceTimer.invalidate();
  42. }
  43. }
  44. GpioButten:: ~GpioButten()
  45. {
  46. QFile unexportFile("/sys/class/gpio/unexport");
  47. if (unexportFile.open(QIODevice::WriteOnly)) {
  48. unexportFile.write(QByteArray::number(PG(8)));
  49. unexportFile.close();
  50. }
  51. }