Skip to content

Commit

Permalink
fix: 解析edid显示设备模块
Browse files Browse the repository at this point in the history
 解析显示设备模块

Log: 解析显示设备模块

Bug: https://pms.uniontech.com/bug-view-246695.html
  • Loading branch information
shuaijie authored and deepin-bot[bot] committed May 29, 2024
1 parent f140ad8 commit 2358a5e
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 0 deletions.
1 change: 1 addition & 0 deletions deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ void DeviceMonitor::setInfoFromEdid(const QMap<QString, QString> &mapInfo)
setAttribute(mapInfo, "Vendor", m_Vendor);
setAttribute(mapInfo, "Date", m_ProductionWeek);
setAttribute(mapInfo, "Display Input", m_DisplayInput);
setAttribute(mapInfo, "Model", m_Model);
getOtherMapInfo(mapInfo);
}

Expand Down
70 changes: 70 additions & 0 deletions deepin-devicemanager/src/GenerateDevice/HWGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@

// 项目自身文件
#include "HWGenerator.h"
#include "EDIDParser.h"

// Qt库文件
#include <QDebug>
#include <QProcess>
#include <QFile>
#include <QDir>
#include <QDebug>

// 其它头文件
#include "DeviceManager/DeviceManager.h"
Expand Down Expand Up @@ -414,3 +418,69 @@ void HWGenerator::getMemoryInfoFromLshw()
DeviceManager::instance()->addMemoryDevice(device);
}
}

static void parseEDID(QStringList allEDIDS,QString input)
{
for (auto edid:allEDIDS) {
QProcess process;
process.start(QString("hexdump %1").arg(edid));
process.waitForFinished(-1);

QString deviceInfo = process.readAllStandardOutput();
if(deviceInfo.isEmpty())
continue;

QString edidStr;
QStringList lines = deviceInfo.split("\n");
for (auto line:lines) {
QStringList words = line.trimmed().split(" ");
if(words.size() != 9)
continue;

words.removeAt(0);
QString l = words.join("");
l.append("\n");
edidStr.append(l);
}

lines = edidStr.split("\n");
if(lines.size() > 3){
EDIDParser edidParser;
QString errorMsg;
edidParser.setEdid(edidStr,errorMsg,"\n", false);

QMap<QString, QString> mapInfo;
mapInfo.insert("Vendor",edidParser.vendor());
mapInfo.insert("Model",edidParser.model());
mapInfo.insert("Date",edidParser.releaseDate());
mapInfo.insert("Size",edidParser.screenSize());
mapInfo.insert("Display Input",input);

DeviceMonitor *device = new DeviceMonitor();
device->setInfoFromEdid(mapInfo);
DeviceManager::instance()->addMonitor(device);
}
}
}

void HWGenerator::generatorMonitorDevice()
{
QString toDir = "/sys/class/drm";
QDir toDir_(toDir);

if (!toDir_.exists())
return;

QFileInfoList fileInfoList = toDir_.entryInfoList();
foreach(QFileInfo fileInfo, fileInfoList) {
if(fileInfo.fileName() == "." || fileInfo.fileName() == ".." || !fileInfo.fileName().startsWith("card"))
continue;

if(QFile::exists(fileInfo.filePath() + "/" + "edid")) {
QStringList allEDIDS_all;
allEDIDS_all.append(fileInfo.filePath() + "/" + "edid");
QString interface = fileInfo.fileName().remove("card0-").remove("card1-").remove("card2-");
parseEDID(allEDIDS_all,interface);
}
}
}
5 changes: 5 additions & 0 deletions deepin-devicemanager/src/GenerateDevice/HWGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ class HWGenerator : public DeviceGenerator
* @brief getMemoryInfoFromLshw:从lshw获取内存信息
*/
virtual void getMemoryInfoFromLshw() override;

/**
* @brief generatorMonitorDevice:生成显示设备信息
*/
virtual void generatorMonitorDevice() override;
};

#endif // PANGUVGENERATOR_H
10 changes: 10 additions & 0 deletions deepin-devicemanager/src/Tool/EDIDParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ const QString &EDIDParser::vendor()const
return m_Vendor;
}

const QString &EDIDParser::model()const
{
return m_Model;
}

const QString &EDIDParser::releaseDate()const
{
return m_ReleaseDate;
Expand Down Expand Up @@ -134,6 +139,11 @@ void EDIDParser::parserVendor()

m_Vendor = QString(name);

QString h0a = getBytes(0, 10);
QString h0b = getBytes(0, 11);

m_Model = h0a + h0b;

// // 将16进制的厂商信息转换成二进制的厂商信息
// QString binStr = hexToBin(vendorStr);

Expand Down
7 changes: 7 additions & 0 deletions deepin-devicemanager/src/Tool/EDIDParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ class EDIDParser
*/
const QString &vendor()const;

/**
* @brief model:获取厂商信息
* @return 厂商信息
*/
const QString &model()const;

/**
* @brief releaseDate:获取生产日期
* @return 生产日期
Expand Down Expand Up @@ -131,6 +137,7 @@ class EDIDParser
private:
/**@brief:机器的存储模式不同,会导致计算结果不同,所以在解析的时候需要考虑大小端模式*/
QString m_Vendor; // 显示屏的厂商信息
QString m_Model; // 显示屏的型号信息
QString m_ReleaseDate; // 显示屏的生产日期
QString m_ScreenSize; // 屏幕大小
bool m_LittleEndianMode; // 小端模式
Expand Down

0 comments on commit 2358a5e

Please sign in to comment.