xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/key/keywidget.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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