-
Notifications
You must be signed in to change notification settings - Fork 1
/
serialdevenumerator.cpp
124 lines (110 loc) · 2.92 KB
/
serialdevenumerator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <QStringList>
#ifdef linux
#include <QDir>
#include <QFileInfo>
#include <QFileInfoList>
#elif defined(WIN32)
#include <stdio.h>
#include <windows.h>
#endif
#include "serialdevenumerator.h"
/**
* Constructor.
*/
SerialDevEnumerator::SerialDevEnumerator()
{
}
/**
* Queries the OS / device filesystem for the list of serial devices likely
* to be the one that is connected to the ECU.
* @return List of device names
*/
QStringList SerialDevEnumerator::getSerialDevList(QString savedDevName)
{
QStringList serialDevices;
if (savedDevName.isNull() || savedDevName.isEmpty())
{
serialDevices.append("");
}
else
{
serialDevices.append(savedDevName);
}
#ifdef linux
// first check to see if this Linux distribution uses the /dev/serial/
// directory to store symlinks to each serial device
QDir devSerial("/dev/serial/by-id/", "", QDir::Name, QDir::Files | QDir::NoDotAndDotDot);
if (devSerial.exists())
{
QFileInfoList files = devSerial.entryInfoList();
foreach(const QFileInfo file, files)
{
if (file.exists())
{
if (file.isSymLink())
{
serialDevices.append(file.symLinkTarget());
}
else
{
serialDevices.append(file.absoluteFilePath());
}
}
}
}
// if nothing was found using the method above, simply return a list of
// devices that match the pattern "ttyS*"
if (serialDevices.count() == 0)
{
QDir dev("/dev", "ttyUSB* ttyS*", QDir::NoSort, QDir::Files | QDir::System | QDir::Hidden | QDir::NoDotAndDotDot);
QFileInfoList files = dev.entryInfoList();
foreach(const QFileInfo file, files)
{
if (file.exists())
{
if (file.isSymLink())
{
serialDevices.append(file.symLinkTarget());
}
else
{
serialDevices.append(file.absoluteFilePath());
}
}
}
}
#elif defined(__APPLE__)
QDir dev("/dev", "cu.usbserial*", QDir::NoSort, QDir::Files | QDir::System | QDir::Hidden | QDir::NoDotAndDotDot);
QFileInfoList files = dev.entryInfoList();
foreach(const QFileInfo file, files)
{
if (file.exists())
{
if (file.isSymLink())
{
serialDevices.append(file.symLinkTarget());
}
else
{
serialDevices.append(file.absoluteFilePath());
}
}
}
#elif defined(WIN32)
// compiling with MinGW, so use a WinAPI mechanism to enumerate ports
char portName[8];
COMMCONFIG cc;
DWORD dwSize = sizeof(COMMCONFIG);
// apparently, COM ports can be numbered from 1 to 255
for (int portNum = 1; portNum < 256; portNum++)
{
snprintf(portName, 8, "COM%d", portNum);
if (GetDefaultCommConfig(portName, &cc, &dwSize))
{
serialDevices.append(portName);
}
}
#endif
serialDevices.removeDuplicates();
return serialDevices;
}