Skip to content

Commit 2358a5e

Browse files
shuaijiedeepin-bot[bot]
authored andcommitted
fix: 解析edid显示设备模块
解析显示设备模块 Log: 解析显示设备模块 Bug: https://pms.uniontech.com/bug-view-246695.html
1 parent f140ad8 commit 2358a5e

5 files changed

Lines changed: 93 additions & 0 deletions

File tree

deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ void DeviceMonitor::setInfoFromEdid(const QMap<QString, QString> &mapInfo)
163163
setAttribute(mapInfo, "Vendor", m_Vendor);
164164
setAttribute(mapInfo, "Date", m_ProductionWeek);
165165
setAttribute(mapInfo, "Display Input", m_DisplayInput);
166+
setAttribute(mapInfo, "Model", m_Model);
166167
getOtherMapInfo(mapInfo);
167168
}
168169

deepin-devicemanager/src/GenerateDevice/HWGenerator.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44

55
// 项目自身文件
66
#include "HWGenerator.h"
7+
#include "EDIDParser.h"
78

89
// Qt库文件
910
#include <QDebug>
1011
#include <QProcess>
12+
#include <QFile>
13+
#include <QDir>
14+
#include <QDebug>
1115

1216
// 其它头文件
1317
#include "DeviceManager/DeviceManager.h"
@@ -414,3 +418,69 @@ void HWGenerator::getMemoryInfoFromLshw()
414418
DeviceManager::instance()->addMemoryDevice(device);
415419
}
416420
}
421+
422+
static void parseEDID(QStringList allEDIDS,QString input)
423+
{
424+
for (auto edid:allEDIDS) {
425+
QProcess process;
426+
process.start(QString("hexdump %1").arg(edid));
427+
process.waitForFinished(-1);
428+
429+
QString deviceInfo = process.readAllStandardOutput();
430+
if(deviceInfo.isEmpty())
431+
continue;
432+
433+
QString edidStr;
434+
QStringList lines = deviceInfo.split("\n");
435+
for (auto line:lines) {
436+
QStringList words = line.trimmed().split(" ");
437+
if(words.size() != 9)
438+
continue;
439+
440+
words.removeAt(0);
441+
QString l = words.join("");
442+
l.append("\n");
443+
edidStr.append(l);
444+
}
445+
446+
lines = edidStr.split("\n");
447+
if(lines.size() > 3){
448+
EDIDParser edidParser;
449+
QString errorMsg;
450+
edidParser.setEdid(edidStr,errorMsg,"\n", false);
451+
452+
QMap<QString, QString> mapInfo;
453+
mapInfo.insert("Vendor",edidParser.vendor());
454+
mapInfo.insert("Model",edidParser.model());
455+
mapInfo.insert("Date",edidParser.releaseDate());
456+
mapInfo.insert("Size",edidParser.screenSize());
457+
mapInfo.insert("Display Input",input);
458+
459+
DeviceMonitor *device = new DeviceMonitor();
460+
device->setInfoFromEdid(mapInfo);
461+
DeviceManager::instance()->addMonitor(device);
462+
}
463+
}
464+
}
465+
466+
void HWGenerator::generatorMonitorDevice()
467+
{
468+
QString toDir = "/sys/class/drm";
469+
QDir toDir_(toDir);
470+
471+
if (!toDir_.exists())
472+
return;
473+
474+
QFileInfoList fileInfoList = toDir_.entryInfoList();
475+
foreach(QFileInfo fileInfo, fileInfoList) {
476+
if(fileInfo.fileName() == "." || fileInfo.fileName() == ".." || !fileInfo.fileName().startsWith("card"))
477+
continue;
478+
479+
if(QFile::exists(fileInfo.filePath() + "/" + "edid")) {
480+
QStringList allEDIDS_all;
481+
allEDIDS_all.append(fileInfo.filePath() + "/" + "edid");
482+
QString interface = fileInfo.fileName().remove("card0-").remove("card1-").remove("card2-");
483+
parseEDID(allEDIDS_all,interface);
484+
}
485+
}
486+
}

deepin-devicemanager/src/GenerateDevice/HWGenerator.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ class HWGenerator : public DeviceGenerator
9292
* @brief getMemoryInfoFromLshw:从lshw获取内存信息
9393
*/
9494
virtual void getMemoryInfoFromLshw() override;
95+
96+
/**
97+
* @brief generatorMonitorDevice:生成显示设备信息
98+
*/
99+
virtual void generatorMonitorDevice() override;
95100
};
96101

97102
#endif // PANGUVGENERATOR_H

deepin-devicemanager/src/Tool/EDIDParser.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ const QString &EDIDParser::vendor()const
8888
return m_Vendor;
8989
}
9090

91+
const QString &EDIDParser::model()const
92+
{
93+
return m_Model;
94+
}
95+
9196
const QString &EDIDParser::releaseDate()const
9297
{
9398
return m_ReleaseDate;
@@ -134,6 +139,11 @@ void EDIDParser::parserVendor()
134139

135140
m_Vendor = QString(name);
136141

142+
QString h0a = getBytes(0, 10);
143+
QString h0b = getBytes(0, 11);
144+
145+
m_Model = h0a + h0b;
146+
137147
// // 将16进制的厂商信息转换成二进制的厂商信息
138148
// QString binStr = hexToBin(vendorStr);
139149

deepin-devicemanager/src/Tool/EDIDParser.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ class EDIDParser
3434
*/
3535
const QString &vendor()const;
3636

37+
/**
38+
* @brief model:获取厂商信息
39+
* @return 厂商信息
40+
*/
41+
const QString &model()const;
42+
3743
/**
3844
* @brief releaseDate:获取生产日期
3945
* @return 生产日期
@@ -131,6 +137,7 @@ class EDIDParser
131137
private:
132138
/**@brief:机器的存储模式不同,会导致计算结果不同,所以在解析的时候需要考虑大小端模式*/
133139
QString m_Vendor; // 显示屏的厂商信息
140+
QString m_Model; // 显示屏的型号信息
134141
QString m_ReleaseDate; // 显示屏的生产日期
135142
QString m_ScreenSize; // 屏幕大小
136143
bool m_LittleEndianMode; // 小端模式

0 commit comments

Comments
 (0)