11package org.operatorfoundation.codex.symbols
2- import android.telecom.Call
32import java.math.BigInteger
43import org.operatorfoundation.codex.*
54
65class WSPRMessage (
7- val prefix : Required ,
8- val callsign1 : CallLetterNumber ,
9- val callsign2 : CallLetterNumber ,
10- val callsign3 : CallLetterNumber ,
11- val callsign4 : CallLetterNumber ,
12- val callsign5 : CallLetterNumber ,
6+ val prefix : Required , // Q (position 1)
7+ val callsign1 : CallLetter , // Letter (position 2)
8+ val callsign2 : CallNumber , // Number (position 3) - MUST be a digit
9+ val callsign3 : CallLetter , // Letter (position 4)
10+ val callsign4 : CallLetter , // Letter (position 5)
11+ val callsign5 : CallLetter , // Letter (position 6)
1312 val grid1 : GridLetter ,
1413 val grid2 : GridLetter ,
1514 val grid3 : GridNumber ,
@@ -18,12 +17,14 @@ class WSPRMessage(
1817) : Symbol {
1918 companion object : SymbolFactory <WSPRMessage > {
2019 override fun size (): BigInteger {
21- val callsignCapacity = BigInteger .valueOf(CallLetterNumber .size().toLong()).pow(5 )
20+ val callLetterCapacity = BigInteger .valueOf(CallLetter .size().toLong()).pow(4 ) // 4 letter positions
21+ val callNumberCapacity = CallNumber .size() // 1 number position
2222 val gridLetterCapacity = BigInteger .valueOf(GridLetter .size().toLong()).pow(2 )
2323 val gridNumberCapacity = BigInteger .valueOf(GridNumber .size().toLong()).pow(2 )
2424 val powerCapacity = Power .size()
2525
26- return callsignCapacity
26+ return callLetterCapacity
27+ .multiply(callNumberCapacity)
2728 .multiply(gridLetterCapacity)
2829 .multiply(gridNumberCapacity)
2930 .multiply(powerCapacity)
@@ -62,34 +63,34 @@ class WSPRMessage(
6263 val grid1 = GridLetter .encode(value)
6364 remaining = remaining.divide(size)
6465
65- // callsign5
66- size = CallLetterNumber .size()
66+ // callsign5 - Letter
67+ size = CallLetter .size()
6768 value = remaining.mod(size)
68- val callsign5 = CallLetterNumber .encode(value)
69+ val callsign5 = CallLetter .encode(value)
6970 remaining = remaining.divide(size)
7071
71- // callsign4
72- size = CallLetterNumber .size()
72+ // callsign4 - Letter
73+ size = CallLetter .size()
7374 value = remaining.mod(size)
74- val callsign4 = CallLetterNumber .encode(value)
75+ val callsign4 = CallLetter .encode(value)
7576 remaining = remaining.divide(size)
7677
77- // callsign3
78- size = CallLetterNumber .size()
78+ // callsign3 - Letter
79+ size = CallLetter .size()
7980 value = remaining.mod(size)
80- val callsign3 = CallLetterNumber .encode(value)
81+ val callsign3 = CallLetter .encode(value)
8182 remaining = remaining.divide(size)
8283
83- // callsign2
84- size = CallLetterNumber .size()
84+ // callsign2 - NUMBER position
85+ size = CallNumber .size()
8586 value = remaining.mod(size)
86- val callsign2 = CallLetterNumber .encode(value)
87+ val callsign2 = CallNumber .encode(value)
8788 remaining = remaining.divide(size)
8889
89- // callsign1
90- size = CallLetterNumber .size()
90+ // callsign1 - Letter
91+ size = CallLetter .size()
9192 value = remaining.mod(size)
92- val callsign1 = CallLetterNumber .encode(value)
93+ val callsign1 = CallLetter .encode(value)
9394 remaining = remaining.divide(size)
9495
9596 require(remaining == BigInteger .ZERO ) { " Value $numericValue is too large to encode in WSPR" }
@@ -108,23 +109,23 @@ class WSPRMessage(
108109 var result = BigInteger .ZERO
109110
110111 // Process symbols in order (most significant first in mixed-radix)
111- var size = CallLetterNumber .size()
112+ var size = CallLetter .size()
112113 var decoded = callsign1.decode()
113114 result = result.multiply(size).add(decoded)
114115
115- size = CallLetterNumber .size()
116+ size = CallNumber .size() // NUMBER position
116117 decoded = callsign2.decode()
117118 result = result.multiply(size).add(decoded)
118119
119- size = CallLetterNumber .size()
120+ size = CallLetter .size()
120121 decoded = callsign3.decode()
121122 result = result.multiply(size).add(decoded)
122123
123- size = CallLetterNumber .size()
124+ size = CallLetter .size()
124125 decoded = callsign4.decode()
125126 result = result.multiply(size).add(decoded)
126127
127- size = CallLetterNumber .size()
128+ size = CallLetter .size()
128129 decoded = callsign5.decode()
129130 result = result.multiply(size).add(decoded)
130131
@@ -151,8 +152,7 @@ class WSPRMessage(
151152 return result
152153 }
153154
154- fun extractValues (): Triple <String , String , Int >
155- {
155+ fun extractValues (): Triple <String , String , Int > {
156156 val callsign = " Q${callsign1.value}${callsign2.value}${callsign3.value}${callsign4.value}${callsign5.value} "
157157 val grid = " ${grid1.value}${grid2.value}${grid3.value}${grid4.value} "
158158 val power = power.value
0 commit comments