Private/Functions.ps1

$ScriptBlockSwitchFrequencyChanel = { 
    param ($frequency_mhz)
    switch ($frequency_mhz) {
        # 2.4 GHz Band (Channels 1–13)
        { $_ -ge 2412 -and $_ -le 2472 } {
            return [math]::Floor(($_ - 2412) / 5) + 1
        }
        # 5 GHz Band
        # UNII-1 (Channels 36-48)
        { $_ -ge 5180 -and $_ -le 5230 } {
            return [math]::Floor(($_ - 5180) / 5) + 36
        }
        # UNII-2 (Channels 52-64)
        { $_ -ge 5230 -and $_ -le 5280 } {
            return [math]::Floor(($_ - 5230) / 5) + 52
        }
        # UNII-3 (Channels 100-144)
        { $_ -ge 5500 -and $_ -le 5700 } {
            return [math]::Floor(($_ - 5500) / 5) + 100
        }
        # UNII-4 (Channels 149-165)
        { $_ -ge 5745 -and $_ -le 5825 } {
            return [math]::Floor(($_ - 5745) / 5) + 149
        }
        # 6 GHz Band (Channels 1–233)
        { $_ -ge 5950 -and $_ -le 6525 } {
            return [math]::Floor(($_ - 5950) / 5) + 1
        }
        # If the frequency is out of range
        default {
            return "Out of range"
        }
    }
}

function Get-WifiChannel {
    param(
        [parameter(Mandatory = $False, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias("WiFiAvailableNetwork")]
        [Windows.Devices.WiFi.WiFiAvailableNetwork[]]$WiFiAvailableNetworks,
        
        # Single center frequency in kilohertz (optional)
        [parameter(Mandatory = $False)]
        [int]$ChannelCenterFrequencyInKilohertz
    )
    
    process {
        if ($ChannelCenterFrequencyInKilohertz) {
            # If a single center frequency is provided, calculate the channel for it
            return &$ScriptBlockSwitchFrequencyChanel ($ChannelCenterFrequencyInKilohertz / 1000)
        } else {
            # If no frequency is provided, loop through Wi-Fi networks
            foreach ($WiFiAvailableNetwork in $WiFiAvailableNetworks) {
                # Get the ChannelCenterFrequencyInKilohertz from the current network and convert it to MHz
                # Call the script block to get the channel number
                [PSCustomObject]@{
                    Ssid        = $WiFiAvailableNetwork.Ssid
                    WifiChannel = &$ScriptBlockSwitchFrequencyChanel ($WiFiAvailableNetwork.ChannelCenterFrequencyInKilohertz / 1000)
                }   
            }
        }
    }
}
function Get-WifiBandName {
    param ([long]$ChannelCenterFrequencyInKilohertz)
    switch ($ChannelCenterFrequencyInKilohertz) {
        { $_ -ge 2400000 -and $_ -le 2500000 } { "2.4 GHz"; break }
        { $_ -ge 5150000 -and $_ -le 5895000 } { "5 GHz"; break }
        { $_ -ge 5925000 -and $_ -le 7125000 } { "6 GHz"; break }
        Default { 
            $ghz = [math]::Floor($_ / 100000) / 10
            "$ghz GHz"
        }
    }
}