83 lines
1.4 KiB
Go
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, ",")
|
|
}
|