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