Files
ham/protocol/aprs/address.go
maze 63040a44b3
Some checks failed
Run tests / test (1.25) (push) Failing after 1m37s
Run tests / test (stable) (push) Failing after 1m37s
protocol/aprs: refactored
2026-03-02 22:28:17 +01:00

83 lines
1.4 KiB
Go

package aprs
import "strings"
type Address struct {
Call string `json:"call"`
SSID string `json:"ssid,omitempty"`
IsRepeated bool `json:"is_repeated"`
}
func ParseAddress(s string) Address {
r := strings.HasSuffix(s, "*")
if r {
s = strings.TrimSuffix(s, "*")
}
i := strings.IndexByte(s, '-')
if i < 1 {
return Address{
Call: s,
IsRepeated: r,
}
}
return Address{
Call: s[:i],
SSID: s[i+1:],
IsRepeated: r,
}
}
func (a Address) EqualTo(b Address) bool {
return strings.EqualFold(a.Call, b.Call) && a.SSID == b.SSID
}
func (a Address) IsQConstruct() bool {
return len(a.Call) == 3 && len(a.SSID) == 0 && a.Call[0] == 'q'
}
func (a Address) Passcode() int16 {
v := int16(0x73e2)
for i, l := 0, len(a.Call); i < l; i = i + 2 {
v ^= int16(a.Call[i]) << 8
if i+1 < len(a.Call) {
v ^= int16(a.Call[i+1])
}
}
return v & 0x7fff
}
func (a Address) String() string {
var b strings.Builder
b.WriteString(a.Call)
if a.SSID != "" {
b.WriteByte('-')
b.WriteString(a.SSID)
}
if a.IsRepeated {
b.WriteByte('*')
}
return b.String()
}
type Path []Address
func (path Path) EqualTo(other Path) bool {
if len(path) != len(other) {
return false
}
for i, a := range path {
if !a.EqualTo(other[i]) {
return false
}
}
return true
}
func (path Path) String() string {
part := make([]string, len(path))
for i, a := range path {
part[i] = a.String()
}
return strings.Join(part, ",")
}