Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,17 @@
getOtherMapInfo(mapInfo);
}

void DeviceMonitor::setInfoFromEdidForCustom(const QMap<QString, QString> &mapInfo)

Check warning on line 167 in deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'setInfoFromEdidForCustom' is never used.
{
setAttribute(mapInfo, "Size", m_ScreenSize);
setAttribute(mapInfo, "Vendor", m_Vendor);
setAttribute(mapInfo, "Date", m_ProductionWeek);
setAttribute(mapInfo, "Display Input", m_DisplayInput);
setAttribute(mapInfo, "Model", m_Model);
m_Name = m_Model;
getOtherMapInfo(mapInfo);
}

void DeviceMonitor::setInfoFromDbus(const QMap<QString, QString> &mapInfo)
{
if (mapInfo["Name"].toLower().contains(m_DisplayInput.toLower(), Qt::CaseInsensitive)) {
Expand Down
2 changes: 2 additions & 0 deletions deepin-devicemanager/src/DeviceManager/DeviceMonitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ class DeviceMonitor : public DeviceBaseInfo
*/
void setInfoFromEdid(const QMap<QString, QString> &mapInfo);

void setInfoFromEdidForCustom(const QMap<QString, QString> &mapInfo);

/**@brief:华为PanGuV项目里面的显示屏信息是从dbus里面获取的*/
/**
* @brief setInfoFromDbus:设置华为PanGuV项目里面的显示屏信息
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ void CustomGenerator::generatorMonitorDevice()
QStringList allEDIDS_all;
allEDIDS_all.append(fileInfo.filePath() + "/" + "edid");
QString interface = fileInfo.fileName().remove("card0-").remove("card1-").remove("card2-");
CommonTools::parseEDID(allEDIDS_all, interface);
CommonTools::parseEDID(allEDIDS_all, interface, false);
}
}
}
2 changes: 1 addition & 1 deletion deepin-devicemanager/src/GenerateDevice/HWGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ void HWGenerator::generatorMonitorDevice()
QStringList allEDIDS_all;
allEDIDS_all.append(fileInfo.filePath() + "/" + "edid");
QString interface = fileInfo.fileName().remove("card0-").remove("card1-").remove("card2-");
CommonTools::parseEDID(allEDIDS_all,interface);
CommonTools::parseEDID(allEDIDS_all, interface, true);
}
}
}
Expand Down
68 changes: 67 additions & 1 deletion deepin-devicemanager/src/Tool/EDIDParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@
parseReleaseDate();
// 解析屏幕尺寸
parseScreenSize();

// 解析监视器名称
parseMonitorName();

return true;
}
Expand All @@ -103,6 +104,11 @@
return m_ScreenSize;
}

const QString &EDIDParser::monitorName() const

Check warning on line 107 in deepin-devicemanager/src/Tool/EDIDParser.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'monitorName' is never used.
{
return m_MonitorName;
}

int EDIDParser::width()
{
return m_Width;
Expand Down Expand Up @@ -213,7 +219,67 @@
m_ScreenSize = QString("%1 %2(%3mm×%4mm)").arg(QString::number(inch, '0', Common::specialComType == 7 ? 0 : 1)).arg(QObject::tr("inch")).arg(m_Width).arg(m_Height);
}

void EDIDParser::parseMonitorName()
{
// EDID中从字节54开始有4个18字节的Descriptor Block
// 每个Descriptor Block可能包含显示器名称信息
// 显示器名称的标识符是0xFC(Display Product Name) 注意:部分机型有一些特殊,标识符为0xFE

// 4个Descriptor Block的起始字节位置
int descriptorStarts[4] = {54, 72, 90, 108};

Check warning on line 229 in deepin-devicemanager/src/Tool/EDIDParser.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Variable 'descriptorStarts' can be declared as const array

for (int i = 0; i < 4; i++) {
int startByte = descriptorStarts[i];

// 计算行号和字节位置(每行16字节)
int line = startByte / 16;
int byteInLine = startByte % 16;

// 获取Descriptor Block的关键字节
QString byte0 = getBytes(line, byteInLine); // 第0字节
QString byte1 = getBytes(line, byteInLine + 1); // 第1字节
QString byte3 = getBytes(line, byteInLine + 3); // 第3字节(类型标识)

// 检查是否为Display Descriptor (字节0-1为0x0000) 且类型为Display Product Name (字节3为0xFC)
if (byte0.toUpper() == "00" && byte1.toUpper() == "00" && (byte3.toUpper() == "FC" || byte3.toUpper() == "FE")) {

// 找到显示器名称描述符,提取ASCII字符串(字节5-17)
QString monitorName;

for (int j = 5; j <= 17; j++) {
int currentByte = startByte + j;
int currentLine = currentByte / 16;
int currentByteInLine = currentByte % 16;

QString charByte = getBytes(currentLine, currentByteInLine);

if (!charByte.isEmpty()) {
int asciiValue = hexToDec(charByte).toInt();

// ASCII可打印字符范围:32-126,0x0A为换行符,0x00为结束符
if (asciiValue == 0x00 || asciiValue == 0x0A) {
break; // 遇到结束符或换行符,停止解析
} else if (asciiValue >= 32 && asciiValue <= 126) {
monitorName.append(QChar(asciiValue));
}
}
}

// 去除首尾空白字符
m_MonitorName = monitorName.trimmed();

// 如果找到有效的监视器名称,记录日志并返回
if (!m_MonitorName.isEmpty())
return;
}
}

// 如果没有找到有效的监视器名称,设置默认值
if (m_MonitorName.isEmpty())
m_MonitorName = "Unknown Monitor";
}

QString EDIDParser::binToDec(QString strBin) //二进制转十进制

Check warning on line 282 in deepin-devicemanager/src/Tool/EDIDParser.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Parameter 'strBin' is passed by value. It could be passed as a const reference which is usually faster and recommended in C++.
{
// 二进制转十进制
QString decimal;
Expand Down
12 changes: 12 additions & 0 deletions deepin-devicemanager/src/Tool/EDIDParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@
*/
const QString &screenSize()const;

/**
* @brief screenSize:获取监视器名称
* @return 监视器名称
*/
const QString &monitorName()const;

Check warning on line 59 in deepin-devicemanager/src/Tool/EDIDParser.h

View workflow job for this annotation

GitHub Actions / cppcheck

Local variable 'monitorName' shadows outer function

/**
* @brief width : get screen width
* @return
Expand Down Expand Up @@ -81,6 +87,11 @@
*/
void parseScreenSize();

/**
* @brief parseScreenSize:从edid中获取监视器名称
*/
void parseMonitorName();

/**
* @brief binToDec:将二进制转换成十进制
* @param strBin:二进制字符串
Expand Down Expand Up @@ -140,6 +151,7 @@
QString m_Model; // 显示屏的型号信息
QString m_ReleaseDate; // 显示屏的生产日期
QString m_ScreenSize; // 屏幕大小
QString m_MonitorName; // 监视器名称
bool m_LittleEndianMode; // 小端模式
int m_Width; // width
int m_Height; // heigth
Expand Down
80 changes: 59 additions & 21 deletions deepin-devicemanager/src/Tool/commontools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,45 +167,83 @@ QString CommonTools::getBackupPath()
return "/usr/share/deepin-devicemanager/";
}

void CommonTools::parseEDID(const QStringList &allEDIDS, const QString &input)
void CommonTools::parseEDID(const QStringList &allEDIDS, const QString &input, bool isHW)
{
for (auto edid:allEDIDS) {
QProcess process;
process.start(QString("hexdump %1").arg(edid));
process.waitForFinished(-1);
QString edidStr;
if (isHW) {
QProcess process;
process.start(QString("hexdump %1").arg(edid));
process.waitForFinished(-1);

QString deviceInfo = process.readAllStandardOutput();
if (deviceInfo.isEmpty())
continue;
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)
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);
}
} else {
QProcess process;
process.start(QString("hexdump -C %1").arg(edid));
process.waitForFinished(-1);
QString deviceInfo = process.readAllStandardOutput();
if (deviceInfo.isEmpty())
continue;

words.removeAt(0);
QString l = words.join("");
l.append("\n");
edidStr.append(l);
QStringList lines = deviceInfo.split("\n");
for (auto line: lines) {
if (line.trimmed().isEmpty())
continue;
int firstSpace = line.indexOf(" ");
int lastPipe = line.indexOf("|");

if (firstSpace == -1 || lastPipe == -1 || firstSpace >= lastPipe)
continue;

QString hexPart = line.mid(firstSpace + 2, lastPipe - firstSpace -3).trimmed();

QStringList hexBytes = hexPart.split(QRegExp("\\s+"));

QString lineData;
for (const QString &hexByte : hexBytes) {
if (hexByte.length() == 2 && hexByte != "")
lineData.append(hexByte);
}

if (lineData.length() == 32)
edidStr.append(lineData + "\n");
}
}

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

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

DeviceMonitor *device = new DeviceMonitor();
device->setInfoFromEdid(mapInfo);
if (isHW)
device->setInfoFromEdid(mapInfo);
else
device->setInfoFromEdidForCustom(mapInfo);
DeviceManager::instance()->addMonitor(device);
}
}
Expand Down
2 changes: 1 addition & 1 deletion deepin-devicemanager/src/Tool/commontools.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class CommonTools : public QObject
*/
static QString getBackupPath();

static void parseEDID(const QStringList &allEDIDS, const QString &input);
static void parseEDID(const QStringList &allEDIDS, const QString &input, bool isHW = true);
static QString getGpuInfoCommandFromDConfig();

signals:
Expand Down