From 65cf9087bf08a08ff4644aeb93dfc2d9babe06b4 Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Sun, 4 Feb 2018 23:16:11 +0100 Subject: [PATCH] Refined serial port selection. So far up to two ports with the substring "usbserial" in their name were used. This was pretty platform specific and didn't allow to use non-USB ports at all. Now if the -p option is given its value is used as substring as "usbserial" was used before. However if no -p option is given than up to two USB-backed ports are used. --- server/main.cpp | 104 +++++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 41 deletions(-) diff --git a/server/main.cpp b/server/main.cpp index 266e727..93a0fcf 100644 --- a/server/main.cpp +++ b/server/main.cpp @@ -17,8 +17,6 @@ #include #include -#define PORT_STR "usbserial" - #if 0 //TODO: Switch xHD client to Z8530 built-in CRC calc /* @@ -53,11 +51,23 @@ int main(int argc, char *argv[]) // Process the command line arguments bool bVerbose = false; bool bLog = true; + char *pPortname = 0; char *apFilename[2] = {0, 0}; + for (int iArg = 1; iArg < argc; iArg++) { + // Process option if (argv[iArg][0] == '-') { + if (argv[iArg][1] == 'p') + { + pPortname = &argv[iArg][2]; + if (bVerbose) + printf("Port: %s\n", pPortname); + continue; + } + + // Process flags for (int iChar = 1; argv[iArg][iChar]; iChar++) { switch (argv[iArg][iChar]) @@ -79,6 +89,8 @@ int main(int argc, char *argv[]) } continue; } + + // Process disk image for (int iDrive = 0; iDrive < 2; iDrive++) { if (apFilename[iDrive] == 0) @@ -93,11 +105,12 @@ int main(int argc, char *argv[]) if (apFilename[0] == 0) { - printf("Usage: %s [-nv] img1 [img2]\n" - "\t-n\tno logging\n" - "\t-v\tbe verbose\n" - "\timg1\tdrive 1 disk image filename\n" - "\timg2\tdrive 2 disk image filename\n", + printf("Usage: %s [-nv] [-p] img1 [img2]\n" + "\t-n\t\tno logging\n" + "\t-v\t\tbe verbose\n" + "\t-p\t(partial) serial portname\n" + "\timg1\t\tdrive 1 disk image filename\n" + "\timg2\t\tdrive 2 disk image filename\n", argv[0]); return EXIT_FAILURE; } @@ -135,18 +148,12 @@ int main(int argc, char *argv[]) // Create a configuration for the serial ports enum sp_return eResult; struct sp_port_config *pSerialConfig = 0; - eResult = sp_new_config(&pSerialConfig); - assert(eResult == SP_OK); - eResult = sp_set_config_baudrate(pSerialConfig, 230400); - assert(eResult == SP_OK); - eResult = sp_set_config_bits(pSerialConfig, 8); - assert(eResult == SP_OK); - eResult = sp_set_config_parity(pSerialConfig, SP_PARITY_NONE); - assert(eResult == SP_OK); - eResult = sp_set_config_stopbits(pSerialConfig, 1); - assert(eResult == SP_OK); - eResult = sp_set_config_flowcontrol(pSerialConfig, SP_FLOWCONTROL_RTSCTS); - assert(eResult == SP_OK); + assert(sp_new_config(&pSerialConfig) == SP_OK); + assert(sp_set_config_baudrate(pSerialConfig, 230400) == SP_OK); + assert(sp_set_config_bits(pSerialConfig, 8) == SP_OK); + assert(sp_set_config_parity(pSerialConfig, SP_PARITY_NONE) == SP_OK); + assert(sp_set_config_stopbits(pSerialConfig, 1) == SP_OK); + assert(sp_set_config_flowcontrol(pSerialConfig, SP_FLOWCONTROL_RTSCTS) == SP_OK); // Find and configure valid serial ports const int MAX_PORTS = 2; @@ -155,32 +162,48 @@ int main(int argc, char *argv[]) { struct sp_port **ports; - eResult = sp_list_ports(&ports); - assert(eResult == SP_OK); + if (sp_list_ports(&ports) != SP_OK) + { + printf("Err: Port enum - %s\n", sp_last_error_message()); + return EXIT_FAILURE; + } for (int i = 0; ports[i]; i++) { struct sp_port *pPort = ports[i]; - if (strstr(sp_get_port_name(pPort), PORT_STR)) + bool bValid = false; + if (pPortname) + { + if (strstr(sp_get_port_name(pPort), pPortname)) + bValid = true; + } + else + { + if (sp_get_port_transport(pPort) == SP_TRANSPORT_USB) + bValid = true; + } + + if (bValid) { if (bVerbose) { printf("Valid port %d: %s\n", iValidPortCount, sp_get_port_name(pPort)); printf("\tDescr: %s\n", sp_get_port_description(pPort)); - int iUsbBus = -1; - int iUsbAddress = -1; - eResult = sp_get_port_usb_bus_address(pPort, &iUsbBus, &iUsbAddress); - assert(eResult == SP_OK); - printf("\tUSB: Bus=%d, Address=%d\n", iUsbBus, iUsbAddress); - int iUsbVid = -1; - int iUsbPid = -1; - eResult = sp_get_port_usb_vid_pid(pPort, &iUsbVid, &iUsbPid); - assert(eResult == SP_OK); - printf("\tUSB: VendorID=$%04X, ProductID=$%04X\n", iUsbVid, iUsbPid); - printf("\tManufacturer: %s\n", sp_get_port_usb_manufacturer(pPort)); - printf("\tProduct: %s\n", sp_get_port_usb_product(pPort)); - printf("\tSerial #: %s\n", sp_get_port_usb_serial(pPort)); + if (sp_get_port_transport(pPort) == SP_TRANSPORT_USB) + { + int iUsbBus = -1; + int iUsbAddress = -1; + if (sp_get_port_usb_bus_address(pPort, &iUsbBus, &iUsbAddress) == SP_OK) + printf("\tUSB: Bus=%d, Address=%d\n", iUsbBus, iUsbAddress); + int iUsbVid = -1; + int iUsbPid = -1; + if (sp_get_port_usb_vid_pid(pPort, &iUsbVid, &iUsbPid) == SP_OK) + printf("\tUSB: VendorID=$%04X, ProductID=$%04X\n", iUsbVid, iUsbPid); + printf("\tManufacturer: %s\n", sp_get_port_usb_manufacturer(pPort)); + printf("\tProduct: %s\n", sp_get_port_usb_product(pPort)); + printf("\tSerial #: %s\n", sp_get_port_usb_serial(pPort)); + } } // Retain the port and configure it's settings @@ -194,18 +217,17 @@ int main(int argc, char *argv[]) pPort = apValidPorts[iValidPortCount-1]; // See if the port can be opened and configured - enum sp_return eResultOpen; - enum sp_return eResultConfig; - eResultOpen = sp_open(pPort, SP_MODE_READ_WRITE); - eResultConfig = sp_set_config(pPort, pSerialConfig); - if (eResultOpen != SP_OK || eResultConfig != SP_OK) + eResult = sp_open(pPort, SP_MODE_READ_WRITE); + if (eResult == SP_OK) + eResult = sp_set_config(pPort, pSerialConfig); + if (eResult != SP_OK) { // Port is not valid iValidPortCount--; sp_close(pPort); sp_free_port(pPort); if (bVerbose) - printf("\n\t--- Could not open this port ---\n\n"); + printf("\n\t--- Could not open this port: %s ---\n\n", sp_last_error_message()); } } }