diff --git a/GridCoordTraining.ps1 b/GridCoordTraining.ps1 new file mode 100644 index 0000000..cb61f95 --- /dev/null +++ b/GridCoordTraining.ps1 @@ -0,0 +1,114 @@ +[CmdletBinding()] +param ( + [Parameter(Mandatory = $false)] + [UInt16] $WorldSize = 30720, + [Parameter(Mandatory = $false)] + [UInt16] $digitPrecision = 8, + [Parameter(Mandatory = $false)] + [Float] $SpeechRate = 2 +) + +Add-Type -AssemblyName PresentationFramework; +Add-Type -AssemblyName System.Speech; +$Speech = New-Object System.Speech.Synthesis.SpeechSynthesizer + +$host.ui.RawUI.WindowTitle = "Grid Coordinate Training" + +# prompt for worldsize and precision +$worldsize = Read-Host "What is the world size im km^2? (30720)" +if ($worldsize -eq '') { $worldsize = 30720 } else { + $worldsize = [UInt16] $worldsize +} + +if (-not $PSBoundParameters.ContainsKey('Precision')) { + [UInt16] $digitPrecision = Read-Host "How many digits of precision? (6, 8, or 10)" + if ($digitPrecision -eq '') { $digitPrecision = 8 } +} +if (-not ($digitPrecision % 2 -eq 0)) { + $digitPrecision = 8 + Write-Warning "Precision must be an even number. Setting digit precision to $digitPrecision." +} +if ($digitPrecision -notin @(6, 8, 10)) { + $digitPrecision = 8 + Write-Warning "Precision must be 6, 8, or 10. Setting digit precision to $digitPrecision." +} + +if (-not $PSBoundParameters.ContainsKey('SpeechRate')) { + [Float] $SpeechRate = Read-Host "How quickly do you want it spoken? (2)" + if ($SpeechRate -eq '') { $SpeechRate = 2 } +} +$Speech.Rate = $SpeechRate + + +$segment, $segmentStr, $x, $y, $xArr, $yArr, $input = $null +function Format-GridCoord ([UInt16] $segment) { + + [Int] $segmentPrecision = [Math]::Floor($digitPrecision / 2) + + + [String] $segmentStr = $segment.ToString() + + switch ($true) { + ($segmentStr.Length -lt $segmentPrecision) { + $extraLength = $segmentPrecision - $segmentStr.Length + Write-Debug ( + "Segment is $extraLength digit short of precision.`nORIG: {0}`nPADDED: {1}" -f ( + $segmentStr, + $segmentStr.PadLeft($segmentPrecision, '0') + ) + ) + $segmentStr = $segmentStr.PadLeft($segmentPrecision, '0') + break + } + ($segmentStr.Length -eq $segmentPrecision) { + Write-Debug ( + "Segment is equal to precision.`nORIG: {0}" -f ( + $segmentStr + + ) + ) + break + } + ($segmentStr.Length -gt $segmentPrecision) { + $extraLength = $segmentStr.Length - $segmentPrecision + + $segmentStrNew = $segmentStr + $segmentNew = $segment + while ($segmentStrNew.Length -gt $segmentPrecision) { + $segmentNew = [Math]::floor($segmentNew / 10) + $segmentStrNew = $segmentNew.ToString() + } + + Write-Debug ( + "Segment is $extraLength longer than precision.`nORIG: {0}`nDIVIDED: {1}" -f ( + $segmentStr, + $segmentStrNew + ) + ) + + $segmentStr = $segmentStrNew + + break + } + } + + # return array + $segmentArr = $segmentStr.ToCharArray() + return $segmentArr +} + + +for ($input = 'no'; !($input -eq 'cancel'); ) { + if ($input -eq 'no') { + $x = Get-Random -Minimum 0 -Maximum $worldsize + $xArr = Format-GridCoord $x + $y = Get-Random -Minimum 0 -Maximum $worldsize + $yArr = Format-GridCoord $y + } + + Write-Debug "$($digitPrecision) digit grid reference is: $($xArr -join ', '). break. $($yArr -join ', ')" | Out-Host + + $Speech.Speak("$($digitPrecision) digit grid reference is: $($xArr -join ', '), break. $($yArr -join ', ')"); + + $input = [System.Windows.MessageBox]::Show('How copy? Should I say again?', '8 Digit Grid Coordinate Practice', [System.Windows.MessageBoxButton]::YesNoCancel) +} \ No newline at end of file