# Usage:
#
# > find-device-port-cygwin.ps1 '1209' '2300' -Format COM
# COM7
# > find-device-port-cygwin.ps1 '1209' '2300' -Format WSL
# /dev/ttyS7
# > find-device-port-cygwin.ps1 '1209' '2300' -Format Cygwin
# /dev/ttyS6
Param(
    [string]$VendorID,
    [string]$ProductID, # Careful; $PID is a different builtin
    [ValidateSet('COM','Cygwin','WSL')][string]$Format
)

$DeviceParametersRegKey = @(Get-ChildItem -ErrorAction SilentlyContinue -Recurse 'HKLM:\SYSTEM\CurrentControlSet\Enum' |
    Where-Object Name -match "VID_$VendorID&PID_$ProductID" |
    Where-Object Property -eq PortName)

if ($DeviceParametersRegKey.Count -eq 0) {
    throw "Could not find any devices matching VID $VendorID and PID $ProductID which were mapped to a COM port"
}

if ($DeviceParametersRegKey.Count -ge 2) {
    throw "More than one devices matching VID $VendorID and PID $ProductID were found mapped to a COM port"
}

# This will be of form 'COM6'
$COMPortName = ($DeviceParametersRegKey | Get-ItemProperty).PortName
$COMPortNumber = [int]$COMPortName.Substring(3)

if ($Format -eq 'COM') {
    $Output = $COMPortName
} elseif ($Format -eq 'WSL') {
    $Output = "/dev/ttyS$COMPortNumber"
} elseif ($Format -eq 'Cygwin') {
    $CygwinPortNumber = $COMPortNumber - 1
    $Output = "/dev/ttyS$CygwinPortNumber"
}

# "-NoNewline" below is important to prevent bash from seeing an extra trailing '\r'
Write-Host -NoNewline $Output