Add functions to get serial port path from USB VID/PID for both Windows and Linux. Use this function to automatically detect the presence of an NZXT Hue+.
This commit is contained in:
parent
bfd8030438
commit
5074a923d1
6 changed files with 266 additions and 65 deletions
119
serial_port/find_usb_serial_port_linux.cpp
Normal file
119
serial_port/find_usb_serial_port_linux.cpp
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
#include "find_usb_serial_port.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
|
||||
/*---------------------------------------------------------------------*\
|
||||
| |
|
||||
| find_usb_serial_port |
|
||||
| |
|
||||
| This function returns the name of the first USB serial port matching|
|
||||
| the given USB product and vendor ID. |
|
||||
| |
|
||||
| vid: Vendor ID code |
|
||||
| pid: Product ID code |
|
||||
| |
|
||||
| returns: std::string containing port name "COMx" or "/dev/ttyX" |
|
||||
| |
|
||||
\*---------------------------------------------------------------------*/
|
||||
|
||||
std::string find_usb_serial_port(unsigned short vid, unsigned short pid)
|
||||
{
|
||||
std::string ret_string = "";
|
||||
DIR* dir;
|
||||
char symlink_path[1024] = {0};
|
||||
struct dirent* ent;
|
||||
char vid_pid[10] = {0}; //Store VID/PID
|
||||
|
||||
/*-----------------------------------------------------------------*\
|
||||
| Open /sys/class/tty |
|
||||
\*-----------------------------------------------------------------*/
|
||||
dir = opendir("/sys/class/tty");
|
||||
|
||||
if(dir == NULL)
|
||||
{
|
||||
closedir(dir);
|
||||
return ret_string;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------*\
|
||||
| Loop through all symlinks in /sys/class/tty directory to find |
|
||||
| paths with "usb" in them. These links should have the USB device |
|
||||
| index which can be used to find the VID/PID |
|
||||
\*-----------------------------------------------------------------*/
|
||||
ent = readdir(dir);
|
||||
|
||||
while(ent != NULL)
|
||||
{
|
||||
if(ent->d_type == DT_LNK)
|
||||
{
|
||||
char tty_path[1024];
|
||||
strcpy(tty_path, "/sys/class/tty/");
|
||||
strcat(tty_path, ent->d_name);
|
||||
|
||||
readlink(tty_path, symlink_path, 1024);
|
||||
|
||||
char * usb_string = strstr(symlink_path, "usb");
|
||||
|
||||
if(usb_string != NULL)
|
||||
{
|
||||
char * usb_dev = strstr(usb_string, "/");
|
||||
usb_dev++;
|
||||
usb_dev = strtok(usb_dev, "/");
|
||||
|
||||
char usb_path[1024];
|
||||
|
||||
strcpy(usb_path, "/sys/bus/usb/devices/");
|
||||
strcat(usb_path, usb_dev);
|
||||
|
||||
char vendor_path[1024];
|
||||
char product_path[1024];
|
||||
|
||||
strcpy(vendor_path, usb_path);
|
||||
strcat(vendor_path, "/idVendor");
|
||||
|
||||
strcpy(product_path, usb_path);
|
||||
strcat(product_path, "/idProduct");
|
||||
|
||||
std::ifstream vendor_file;
|
||||
std::ifstream product_file;
|
||||
std::string vendor_string;
|
||||
std::string product_string;
|
||||
|
||||
vendor_file.open(vendor_path);
|
||||
product_file.open(product_path);
|
||||
|
||||
std::getline(vendor_file, vendor_string);
|
||||
std::getline(product_file, product_string);
|
||||
|
||||
snprintf(vid_pid, 10, "%04x", vid);
|
||||
|
||||
if(strcmp(vid_pid, vendor_string.c_str()) == 0)
|
||||
{
|
||||
snprintf(vid_pid, 10, "%04x", pid);
|
||||
if(strcmp(vid_pid, product_string.c_str()) == 0)
|
||||
{
|
||||
char* port_string = NULL;
|
||||
for(int i = strlen(tty_path); i > 0; i--)
|
||||
{
|
||||
if(tty_path[i] == '/')
|
||||
{
|
||||
port_string = &tty_path[i + 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret_string.append("/dev/");
|
||||
ret_string.append(port_string);
|
||||
|
||||
return ret_string;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ent = readdir(dir);
|
||||
}
|
||||
|
||||
return ret_string;
|
||||
|
||||
} /* find_usb_serial_port() */
|
||||
Loading…
Add table
Add a link
Reference in a new issue