1 #include "keywidget.h"
2 #include <QSocketNotifier>
3 #include <QLoggingCategory>
4 #include <linux/input.h>
5 #include <fcntl.h>
6 #include <unistd.h>
7 #include <QHBoxLayout>
8 #include <QPainter>
9
10 Q_LOGGING_CATEGORY(flapp, "app.key")
11
KeyWidget(QWidget * parent)12 KeyWidget::KeyWidget(QWidget *parent) : IWidget(parent),m_fd(-1)
13 {
14 }
15
~KeyWidget()16 KeyWidget::~KeyWidget()
17 {
18 if(m_fd >=0)
19 {
20 ::close(m_fd);
21 }
22 }
23
loadData(const QDomElement & head,const QDomElement & body)24 void KeyWidget::loadData(const QDomElement &head, const QDomElement &body)
25 {
26 m_devName = head.attribute("devName");
27 QString config = head.attribute("config");
28 QDomElement e = body.firstChildElement(config);
29 for(int i=0; i<e.childNodes().size(); i++){
30 QDomElement child = e.childNodes().at(i).toElement();
31 Key k;
32 k.code = child.attribute("code").toInt();
33 k.name = child.attribute("name");
34 k.state = 0;
35 m_keys << k;
36 }
37 this->update();
38
39 if(m_devName.isEmpty() || m_keys.isEmpty())
40 {
41 qCDebug(flapp) <<"please config key";
42 return ;
43 }
44
45 m_fd = open(m_devName.toLocal8Bit().data(), O_RDONLY | O_NONBLOCK);
46 if(m_fd <0 )
47 {
48 qCDebug(flapp) <<QString("open file faire: %1").arg(m_devName);
49 return;
50 }
51
52 QSocketNotifier* notifer = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
53 connect(notifer, &QSocketNotifier::activated, this, [=](){
54 struct input_event event;
55 int ret = ::read(m_fd, &event, sizeof(event));
56 if (ret != sizeof(event))
57 {
58 qCDebug(flapp) <<QString("valid data");
59 return;
60 }
61
62 for(int i=0; i<m_keys.size(); i++)
63 {
64 if(m_keys[i].code == event.code)
65 {
66 m_keys[i].state = event.value;
67 qCDebug(flapp)<<"code/value/name"<<event.code << " " << event.value << " " << m_keys[i].name;
68 this->update();
69 break;
70 }
71 }
72 });
73 }
74
id()75 QString KeyWidget::id()
76 {
77 return "key";
78 }
79
paintEvent(QPaintEvent * e)80 void KeyWidget::paintEvent(QPaintEvent *e)
81 {
82 Q_UNUSED(e)
83 int count = m_keys.size();
84 QPainter painter(this);
85 painter.setRenderHint(QPainter::Antialiasing);
86 if(count !=0)
87 {
88 qreal avgWidth = width()/count;
89
90 painter.setPen(Qt::gray);
91 for(int i=0; i<count; i++)
92 {
93 painter.save();
94 QString name = m_keys[i].name;
95 qCDebug(flapp)<<QString("name%1=%2").arg(i).arg(name);
96 int state = m_keys[i].state;
97 if(state == 1 || state ==2)
98 {
99 QFont f= this->font();
100 f.setPointSize(15);
101 painter.setFont(f);
102 painter.setPen(Qt::blue);
103 }
104 QRectF rect(i*avgWidth, 0, avgWidth, height()-150);
105 QRectF r = painter.boundingRect(rect, name, QTextOption(Qt::AlignCenter));
106 painter.drawText(r, name);
107 QPointF center(rect.x() + avgWidth/2, rect.height()/2);
108 qreal minValue = qMin(avgWidth, rect.height());
109 qreal perfaceValue = qMin(minValue, 120.0);
110 QPen pen;
111 pen.setWidth(3);
112 pen.setColor(QColor(30, 144,255));
113 painter.setPen(pen);
114 painter.drawEllipse(center, perfaceValue/2-5, perfaceValue/2-5);
115 painter.restore();
116 }
117 }
118
119 QString text = "Please Press the physical key of the development board";
120 QRect r(0, height()-150, width(), 150);
121 QRectF rect =painter.boundingRect(r, text, QTextOption(Qt::AlignHCenter));
122 painter.setPen(QColor(37, 37, 37));
123 painter.drawText(rect, text);
124 }
125
resizeEvent(QResizeEvent * e)126 void KeyWidget::resizeEvent(QResizeEvent *e)
127 {
128 Q_UNUSED(e)
129 this->update();
130 }
131