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