|
|
|
@@ -4,30 +4,48 @@ using System.Linq;
|
|
|
|
|
using NibblePoker.Library.Arguments;
|
|
|
|
|
using NibblePoker.Library.ComPortWatcher;
|
|
|
|
|
|
|
|
|
|
namespace NibblePoker.Application.ListComPort;
|
|
|
|
|
|
|
|
|
|
namespace NibblePoker.Application.ListComPort {
|
|
|
|
|
internal static class Program {
|
|
|
|
|
private const string Version = "4.0.0";
|
|
|
|
|
|
|
|
|
|
private static readonly Verb RootVerb = new Verb("");
|
|
|
|
|
// ReSharper disable once InconsistentNaming
|
|
|
|
|
private static readonly Verb RootVerb = new Verb(null);
|
|
|
|
|
|
|
|
|
|
private static readonly Option OptionShowAll = new('a', "show-all", "Display the complete port's name (Equal to '-dfn')");
|
|
|
|
|
private static readonly Option OptionShowDevice = new('d', "show-device", "Displays the port's device name");
|
|
|
|
|
private static readonly Option OptionDivider = new('D', "divider", "Uses the given string or char as a separator (Can be an empty string !)", OptionFlags.HasValue);
|
|
|
|
|
private static readonly Option OptionShowFriendly = new('f', "show-friendly", "Displays the port's friendly name");
|
|
|
|
|
private static readonly Option OptionHelp = new('h', "help", "Display the help text", OptionFlags.StopsParsing);
|
|
|
|
|
private static readonly Option OptionHelpShort = new('H', "short-help", "Display the short help text", OptionFlags.StopsParsing);
|
|
|
|
|
private static readonly Option OptionShowNameRaw = new('n', "show-name-raw", "Displays the port's raw name (See remarks section)");
|
|
|
|
|
private static readonly Option OptionNoPretty = new('P', "no-pretty", "Disables the pretty printing format (Equal to -D \" \"");
|
|
|
|
|
private static readonly Option OptionSort = new('s', "sort", "Sorts the port based on their raw names in an ascending order");
|
|
|
|
|
private static readonly Option OptionSortReverse = new('S', "sort-reverse", "Sorts the port based on their raw names in a descending order");
|
|
|
|
|
private static readonly Option OptionTabPadding = new('t', "tab-padding", "Use tabs for padding between the types of names (Overrides '-D')");
|
|
|
|
|
private static readonly Option OptionVersion = new('v', "version", "Shows the utility's version number and other info");
|
|
|
|
|
private static readonly Option OptionVersionOnly = new('V', "version-only", "Shows the utility's version number only (Overrides '-v')");
|
|
|
|
|
private static readonly Option OptionShowAll = new Option('a', "show-all",
|
|
|
|
|
"Display the complete port's name (Equal to '-dfn')");
|
|
|
|
|
private static readonly Option OptionShowDevice = new Option('d', "show-device",
|
|
|
|
|
"Displays the port's device name");
|
|
|
|
|
private static readonly Option OptionShowFriendly = new Option('f', "show-friendly",
|
|
|
|
|
"Displays the port's friendly name");
|
|
|
|
|
private static readonly Option OptionShowNameRaw = new Option('n', "show-name-raw",
|
|
|
|
|
"Displays the port's raw name (See remarks section)");
|
|
|
|
|
|
|
|
|
|
private static readonly Option OptionDivider = new Option('D', "divider",
|
|
|
|
|
"Uses the given string or char as a separator (Can be an empty string !)", OptionFlags.HasValue);
|
|
|
|
|
private static readonly Option OptionTabPadding = new Option('t', "tab-padding",
|
|
|
|
|
"Use tabs for padding between the types of names (Overrides '-D')");
|
|
|
|
|
private static readonly Option OptionNoPretty = new Option('P', "no-pretty",
|
|
|
|
|
"Disables the pretty printing format (Equal to -D \" \"");
|
|
|
|
|
|
|
|
|
|
private static readonly Option OptionSort = new Option('s', "sort",
|
|
|
|
|
"Sorts the port based on their raw names in an ascending order");
|
|
|
|
|
private static readonly Option OptionSortReverse = new Option('S', "sort-reverse",
|
|
|
|
|
"Sorts the port based on their raw names in a descending order");
|
|
|
|
|
|
|
|
|
|
private static readonly Option OptionHelp = new Option('h', "help",
|
|
|
|
|
"Display the help text", OptionFlags.StopsParsing);
|
|
|
|
|
private static readonly Option OptionHelpShort = new Option('H', "short-help",
|
|
|
|
|
"Display the short help text", OptionFlags.StopsParsing);
|
|
|
|
|
private static readonly Option OptionVersion = new Option('v', "version",
|
|
|
|
|
"Shows the utility's version number and other info");
|
|
|
|
|
private static readonly Option OptionVersionOnly = new Option('V', "version-only",
|
|
|
|
|
"Shows the utility's version number only (Overrides '-v')");
|
|
|
|
|
|
|
|
|
|
// ReSharper disable RedundantDefaultMemberInitializer
|
|
|
|
|
private static bool _shouldPrintRawNames = true;
|
|
|
|
|
private static bool _shouldPrintDeviceNames = false;
|
|
|
|
|
private static bool _shouldPrintFriendlyNames = false;
|
|
|
|
|
// ReSharper enable RedundantDefaultMemberInitializer
|
|
|
|
|
|
|
|
|
|
private static string _paddingText = "";
|
|
|
|
|
|
|
|
|
@@ -45,6 +63,7 @@ internal static class Program {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static int Main(string[] args) {
|
|
|
|
|
// Preparing & parsing launch arguments
|
|
|
|
|
try {
|
|
|
|
|
ArgumentsParser.ParseArguments(RootVerb.RegisterOption(OptionShowAll).RegisterOption(OptionShowDevice)
|
|
|
|
|
.RegisterOption(OptionDivider).RegisterOption(OptionShowFriendly).RegisterOption(OptionHelp)
|
|
|
|
@@ -57,20 +76,31 @@ internal static class Program {
|
|
|
|
|
RootVerb.Clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Processing exiting options
|
|
|
|
|
if(OptionHelp.WasUsed() || OptionHelpShort.WasUsed()) {
|
|
|
|
|
Console.WriteLine(HelpText.GetFullHelpText(RootVerb, "lscom.exe", (uint)Console.BufferWidth - 1, 1, 2, false));
|
|
|
|
|
Console.WriteLine(HelpText.GetFullHelpText(
|
|
|
|
|
RootVerb, "lscom.exe",
|
|
|
|
|
(uint)Console.BufferWidth - 1, 1, 2, false));
|
|
|
|
|
|
|
|
|
|
if(OptionHelp.WasUsed()) {
|
|
|
|
|
Console.WriteLine("\nRemarks:");
|
|
|
|
|
Console.WriteLine(" * If '-d' or '-f' is used, the raw name will not be shown unless '-n' is used.");
|
|
|
|
|
Console.WriteLine(" * If '-D', '-t' or '-p' are used, the special separator between the raw and friendly name and the square brackets are not shown.");
|
|
|
|
|
Console.WriteLine(" * If the program is raw without going through a console, the options '-n' and '-f' will be used.");
|
|
|
|
|
Console.WriteLine(" * By default, the ports are sorted in the order they are provided by the registry, which is often chronological.");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * If '-d' or '-f' is used, the raw name will not be shown unless '-n' is used.");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * If '-D', '-t' or '-p' are used, the special separator between the raw and friendly name and the square brackets are not shown.");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * If the program is raw without going through a console, the options '-n' and '-f' will be used.");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * By default, the ports are sorted in the order they are provided by the registry, which is often chronological.");
|
|
|
|
|
Console.WriteLine(" * The 'raw name' refers to a port name. (e.g.: COM1, COM2, ...)");
|
|
|
|
|
Console.WriteLine(" * The 'device name' refers to a port device path. (e.g.: \\Device\\Serial1, ...)");
|
|
|
|
|
Console.WriteLine(" * The 'friendly name' refers to a port name as seen in the device manager. (e.g.: Communications Port, USB-SERIAL CH340, ...)");
|
|
|
|
|
Console.WriteLine(" * Any result returned with an error code between 1-9 and 30-39 should be considered as invalid.");
|
|
|
|
|
Console.WriteLine(" * Any result returned with another error code is valid but probably not formatted properly.");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * The 'device name' refers to a port device path. (e.g.: \\Device\\Serial1, ...)");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * The 'friendly name' refers to a port name as seen in the device manager. (e.g.: Communications Port, USB-SERIAL CH340, ...)");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * Any result returned with an error code between 1-9 and 30-39 should be considered as invalid.");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
" * Any result returned with another error code is valid but probably not formatted properly.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ErrorCodes.NoError;
|
|
|
|
@@ -87,17 +117,19 @@ internal static class Program {
|
|
|
|
|
Console.WriteLine("Dependencies:");
|
|
|
|
|
Console.WriteLine("├─> NibblePoker.Library.Arguments v2.0.0");
|
|
|
|
|
Console.WriteLine("├─> NibblePoker.Library.ComPortHelpers v" + Version);
|
|
|
|
|
Console.WriteLine("└─> NibblePoker.Library.RegistryHelpers v0.0.1");
|
|
|
|
|
Console.WriteLine("└─> NibblePoker.Library.RegistryHelpers v1.0.0");
|
|
|
|
|
Console.WriteLine("");
|
|
|
|
|
Console.WriteLine("GitHub repositories:");
|
|
|
|
|
Console.WriteLine("├─> https://github.com/aziascreations/DotNet-Arguments");
|
|
|
|
|
Console.WriteLine("├─> https://github.com/aziascreations/DotNet-ListComPort");
|
|
|
|
|
Console.WriteLine("└─> https://github.com/aziascreations/DotNet-RegistryHelpers");
|
|
|
|
|
Console.WriteLine("");
|
|
|
|
|
Console.WriteLine("This software and all its libraries are released in the public domain under the CC0-1.0 license.");
|
|
|
|
|
Console.WriteLine(
|
|
|
|
|
"This software and all its libraries are released in the public domain under the CC0-1.0 license.");
|
|
|
|
|
return ErrorCodes.NoError;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Processing parameter options
|
|
|
|
|
if(OptionShowDevice.WasUsed()) {
|
|
|
|
|
_shouldPrintRawNames = false;
|
|
|
|
|
_shouldPrintDeviceNames = true;
|
|
|
|
@@ -139,7 +171,6 @@ internal static class Program {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Application's code
|
|
|
|
|
|
|
|
|
|
string rawToFriendlySeparator = " - ";
|
|
|
|
|
bool addDeviceBrackets = true;
|
|
|
|
|
|
|
|
|
@@ -157,11 +188,22 @@ internal static class Program {
|
|
|
|
|
List<ComPortInfo> comPortsInfo = ComPortHelper.GetComList(_shouldPrintFriendlyNames);
|
|
|
|
|
|
|
|
|
|
if(comPortsInfo.Count > 0) {
|
|
|
|
|
comPortsInfo = _sortingOrder switch {
|
|
|
|
|
SortingOrder.Ascending => comPortsInfo.OrderBy(o => o.RawName).ToList(),
|
|
|
|
|
SortingOrder.Descending => comPortsInfo.OrderByDescending(o => o.RawName).ToList(),
|
|
|
|
|
_ => comPortsInfo
|
|
|
|
|
};
|
|
|
|
|
//comPortsInfo = _sortingOrder switch {
|
|
|
|
|
// SortingOrder.Ascending => comPortsInfo.OrderBy(o => o.RawName).ToList(),
|
|
|
|
|
// SortingOrder.Descending => comPortsInfo.OrderByDescending(o => o.RawName).ToList(),
|
|
|
|
|
// _ => comPortsInfo
|
|
|
|
|
//};
|
|
|
|
|
switch(_sortingOrder) {
|
|
|
|
|
case SortingOrder.Ascending:
|
|
|
|
|
comPortsInfo = comPortsInfo.OrderBy(o => o.RawName).ToList();
|
|
|
|
|
break;
|
|
|
|
|
case SortingOrder.Descending:
|
|
|
|
|
comPortsInfo = comPortsInfo.OrderByDescending(o => o.RawName).ToList();
|
|
|
|
|
break;
|
|
|
|
|
case SortingOrder.None:
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach(ComPortInfo comPortInfo in comPortsInfo) {
|
|
|
|
|
if(_shouldPrintRawNames) {
|
|
|
|
@@ -181,7 +223,8 @@ internal static class Program {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(_shouldPrintDeviceNames) {
|
|
|
|
|
Console.Write((addDeviceBrackets ? "[" : "") + comPortInfo.DeviceName + (addDeviceBrackets ? "]" : ""));
|
|
|
|
|
Console.Write((addDeviceBrackets ? "[" : "") + comPortInfo.DeviceName +
|
|
|
|
|
(addDeviceBrackets ? "]" : ""));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Console.WriteLine();
|
|
|
|
@@ -200,8 +243,9 @@ internal static class Program {
|
|
|
|
|
return _exitCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Imports "GetConsoleProcessList(...)" in order to know if the program was run via a shortcut or CLI.
|
|
|
|
|
// Imports "GetConsoleProcessList(...)" in order to know if the program was run via a shortcut or a CLI prompt.
|
|
|
|
|
// See: https://learn.microsoft.com/en-us/windows/console/getconsoleprocesslist
|
|
|
|
|
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
|
|
|
|
|
private static extern int GetConsoleProcessList(int[] buffer, int size);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|