Public/Read-CustomerCodeAndData_fromNECformated_IRKitGetData.ps1
#Requires -Version 7.1 <# .SYNOPSIS Read Customer code(16bit) and Data(8bit) on NEC Format from a [IRKit get-method data]. (https://getirkit.com/en/#toc_1) .INPUTS String. It should have a only pair of []. You can pipe objects from a IRKit get-method data. .OUTPUTS PSCustomObject. Properties are CustomerCode(16bits string) and Data(8bits string). .EXAMPLE PS> curl -s -i "http://192.168.0.1/messages" -H "X-Requested-With: curl" | Read-CustomerCodeAndData_fromNECformated_IRKitGetData .EXAMPLE PS> Read-CustomerCodeAndData_fromNECformated_IRKitGetData "[17984,8992,1124,1124,..,3372,1124]" #> function global:Read-CustomerCodeAndData_fromNECformated_IRKitGetData { [CmdletBinding()] [OutputType([PSCustomObject])] Param ( [Parameter(ValueFromPipeline = $True)]$st ) Begin { Get-ChildItem (Get-Item $PSScriptRoot).parent -Include "*.ps1" -Recurse | Where-Object { $_.Name -notmatch "\.Tests\." } | Where-Object FullName -Like "*\Private\*" | ForEach-Object { & $_.PSPath } [int]$T = 562 # modulation unit (μs) [int]$customerCodeFirstIndexPosition = 2 [int]$customerCodeLastIndexPosition = 33 [int]$dataFirstIndexPosition = 34 [int]$revdataLastIndexPosition = 65 [int]$minimunRequiedLength = $revdataLastIndexPosition $result = [PSCustomObject]@{ CustomerCode = "" Data = "" } } Process { $regex = '\[.+\]' if (Select-string -InputObject $st -Pattern $regex -Quiet) { $IRKitData = Select-string -InputObject $st -Pattern $regex | ForEach-Object { $_.Matches } | ForEach-Object { $_.Value } # transfer IRKit count data to T(T: modulation unit) based data. # 1 IRKit count is 2MHz(= 2*10^6 /s). T = 562(= 10^-6 /s). # Then (IRKit count data/(2*10^6))/T -> T based data. # reffer [IR signal JSON represntation.](https://getirkit.com/en/#toc_10) # the IRKit count data is rounded to multiple of 2T, because a IRKit data includes a error. [Int[]]$listTbasedIRKitData = [Int[]]($IRKitData -replace "([^,0-9])").Split(",") | ForEach-Object { (convertTo-NearestT $_ ) / (2 * $T) } # check minimum required length of input. if ($listTbasedIRKitData.Count -lt $minimunRequiedLength) { Write-Error "Input data do not has minimum required length." -ErrorAction Stop } # Leader data # on NEC format, Learder data is [16T:On, 8T:Off] exactly. # in this check, we use [12-20T:On, 6-10T:Off] because of a IRKit count data's error. if (($listTbasedIRKitData[0] -lt 12) -Or ($listTbasedIRKitData[0] -gt 20) -Or ($listTbasedIRKitData[1] -lt 6) -Or ($listTbasedIRKitData[1]) -gt 10 ) { Write-Error "Leader data mismatch (12-20T:On, 6-10T:Off)." -ErrorAction Stop } # customer code(16bit) $customerCodeListTbased = $listTbasedIRKitData[$customerCodeFirstIndexPosition..$customerCodeLastIndexPosition] $cc = convert-TbasedIRKitListToBinaryCode $customerCodeListTbased if ($cc) { $result.CustomerCode = $cc } else { Write-Error ( "Wrong Customer code. 2T based IRKit data=" + ($customerCodeListTbased -join ",") + ".") -ErrorAction Stop } # data(8bit) and reverse data $dataAndReverseDataListTbased = $listTbasedIRKitData[$dataFirstIndexPosition..$revdataLastIndexPosition] [string]$dAndRv = convert-TbasedIRKitListToBinaryCode $dataAndReverseDataListTbased [string]$data = $dAndRv.Substring(0, $dAndRv.Length / 2) [string]$reverseData = $dAndRv.Substring($dAndRv.Length / 2, $dAndRv.Length / 2) if (-Not(compare-BitStringAToBitReversedStringB $data $reverseData)) { Write-Error ( "Data(8bit) is not equal to the bit reversed Reverse Data(8bits). " + $data + " <=> bit-reversed (" + $reverseData + ").") -ErrorAction Stop } if ($data) { $result.Data = $data } $result } } End { } } |