updating tools
This commit is contained in:
45
cmd/ft8grid/main.go
Normal file
45
cmd/ft8grid/main.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"git.wntrmute.dev/kyle/goutils/die"
|
||||
"git.wntrmute.dev/kyle/gridsq/ft8"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func main() {
|
||||
defaultDir := ft8.GetDefaultDirectory()
|
||||
defaultLog := filepath.Join(defaultDir, "ALL.TXT")
|
||||
|
||||
var logFile string
|
||||
flag.StringVar(&logFile, "f", defaultLog, "path to logfile")
|
||||
flag.Parse()
|
||||
|
||||
if flag.NArg() == 0 {
|
||||
die.With("No callsign specified!")
|
||||
}
|
||||
|
||||
records, err := ft8.ProcessFile(logFile)
|
||||
die.If(err)
|
||||
|
||||
grids := map[string]bool{}
|
||||
who := flag.Arg(0)
|
||||
fmt.Println("find grid for ", who)
|
||||
|
||||
for _, rec := range records {
|
||||
if !rec.HasGrid() {
|
||||
continue
|
||||
}
|
||||
|
||||
if rec.De != who {
|
||||
continue
|
||||
}
|
||||
|
||||
if grids[rec.Grid] {
|
||||
continue
|
||||
}
|
||||
grids[rec.Grid] = true
|
||||
fmt.Printf("%s: %s\n", rec.De, rec.Grid)
|
||||
}
|
||||
}
|
||||
186
cmd/gridsq/main.go
Normal file
186
cmd/gridsq/main.go
Normal file
@@ -0,0 +1,186 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"flag"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"git.wntrmute.dev/kyle/goutils/die"
|
||||
"github.com/klaus-tockloth/coco"
|
||||
"github.com/logocomune/maidenhead"
|
||||
geo "gopkg.in/billups/golang-geo.v2"
|
||||
)
|
||||
|
||||
var qths = map[int]string{
|
||||
4: "CM97",
|
||||
6: "CM97cq",
|
||||
8: "CM97cq53",
|
||||
10: "CM97cq53CI",
|
||||
}
|
||||
|
||||
var mgrsAccuracyToMaidenheadDigits = map[int]int{
|
||||
1: 10,
|
||||
10: 10,
|
||||
100: 10,
|
||||
1000: 8,
|
||||
10000: 6,
|
||||
}
|
||||
|
||||
var kmToMile = 0.621371
|
||||
|
||||
func cToP(c maidenhead.Coordinate) *geo.Point {
|
||||
return geo.NewPoint(c.Lat, c.Lng)
|
||||
}
|
||||
|
||||
func distBearing(qth, qsl string) (err error) {
|
||||
var cqth, cqsl maidenhead.Coordinate
|
||||
cqth.Lat, cqth.Lng, err = maidenhead.GridCenter(qth)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cqsl.Lat, cqsl.Lng, err = maidenhead.GridCenter(qsl)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pqth := cToP(cqth)
|
||||
pqsl := cToP(cqsl)
|
||||
dist := pqth.GreatCircleDistance(pqsl)
|
||||
bearing := pqth.BearingTo(pqsl)
|
||||
fmt.Printf("%s => %s: distance %0.2f miles, bearing %0.1f°\n",
|
||||
qth, qsl, dist*kmToMile, bearing)
|
||||
return nil
|
||||
}
|
||||
|
||||
var utmZoneRegexp = regexp.MustCompile(`^(\d+)(\w+)$`)
|
||||
var utmNorthingRegexp = regexp.MustCompile(`^(\d+)\w*[nsNS]$`)
|
||||
var utmEastingRegexp = regexp.MustCompile(`^(\d+)\w+[ewEW]$`)
|
||||
var errInvalidUTM = errors.New("invalid UTM coordinate")
|
||||
|
||||
func stringToUTM(s string) coco.UTM {
|
||||
utm := coco.UTM{
|
||||
ZoneNumber: 0,
|
||||
ZoneLetter: 0,
|
||||
Easting: 0,
|
||||
Northing: 0,
|
||||
}
|
||||
|
||||
fields := strings.Fields(s)
|
||||
if len(fields) != 3 {
|
||||
die.If(errInvalidUTM)
|
||||
}
|
||||
|
||||
zone := utmZoneRegexp.FindStringSubmatch(fields[0])
|
||||
if len(zone) != 3 {
|
||||
fmt.Println(zone)
|
||||
die.If(errInvalidUTM)
|
||||
}
|
||||
|
||||
var err error
|
||||
utm.ZoneNumber, err = strconv.Atoi(zone[1])
|
||||
if err != nil {
|
||||
die.If(errors.Join(err, errInvalidUTM))
|
||||
}
|
||||
utm.ZoneLetter = zone[2][0]
|
||||
|
||||
easting := utmEastingRegexp.FindStringSubmatch(fields[1])
|
||||
if len(easting) == 0 {
|
||||
die.If(errInvalidUTM)
|
||||
}
|
||||
utm.Easting, err = strconv.ParseFloat(easting[1], 64)
|
||||
if err != nil {
|
||||
die.If(errors.Join(err, errInvalidUTM))
|
||||
}
|
||||
|
||||
northing := utmNorthingRegexp.FindStringSubmatch(fields[2])
|
||||
if len(northing) == 0 {
|
||||
die.If(errInvalidUTM)
|
||||
}
|
||||
utm.Northing, err = strconv.ParseFloat(northing[1], 64)
|
||||
if err != nil {
|
||||
die.If(errors.Join(err, errInvalidUTM))
|
||||
}
|
||||
|
||||
return utm
|
||||
}
|
||||
|
||||
func main() {
|
||||
var lat, lon float64
|
||||
var precision int64
|
||||
|
||||
flag.Float64Var(&lat, "lat", 0.0, "latitude of grid")
|
||||
flag.Float64Var(&lon, "lon", 0.0, "longitude of grid")
|
||||
flag.Int64Var(&precision, "d", 6, "number of digits")
|
||||
flag.Parse()
|
||||
|
||||
if flag.NArg() == 0 {
|
||||
fmt.Println("nothing")
|
||||
return
|
||||
}
|
||||
|
||||
cmd := flag.Arg(0)
|
||||
switch cmd {
|
||||
case "geo":
|
||||
grid, err := maidenhead.Locator(lat, lon, int(precision))
|
||||
die.If(err)
|
||||
|
||||
fmt.Printf("%0.6f %0.6f: ", lat, lon)
|
||||
fmt.Println(grid)
|
||||
case "qth":
|
||||
grid, ok := qths[int(precision)]
|
||||
if !ok {
|
||||
fmt.Println(qths[6])
|
||||
} else {
|
||||
fmt.Println(grid)
|
||||
}
|
||||
case "db":
|
||||
var qth, qsl string
|
||||
if flag.NArg() == 2 {
|
||||
qsl = flag.Arg(1)
|
||||
qth = qths[len(qsl)]
|
||||
} else {
|
||||
qsl = flag.Arg(2)
|
||||
qth = flag.Arg(1)
|
||||
}
|
||||
|
||||
err := distBearing(qth, qsl)
|
||||
die.If(err)
|
||||
|
||||
case "mgrs":
|
||||
if flag.NArg() == 0 {
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
utm := coco.MGRS(strings.Replace(flag.Arg(1), " ", "", -1))
|
||||
ll, accuracy, err := utm.ToLL()
|
||||
fmt.Printf("%#v\n", ll)
|
||||
die.If(err)
|
||||
|
||||
precision, ok := mgrsAccuracyToMaidenheadDigits[accuracy]
|
||||
if !ok {
|
||||
precision = 4
|
||||
}
|
||||
grid, err := maidenhead.Locator(ll.Lat, ll.Lon, precision)
|
||||
die.If(err)
|
||||
fmt.Println(grid)
|
||||
case "utm":
|
||||
if flag.NArg() == 0 {
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
utm := stringToUTM(flag.Arg(1))
|
||||
ll, err := utm.ToLL()
|
||||
fmt.Printf("%#v\n", ll)
|
||||
die.If(err)
|
||||
|
||||
grid, err := maidenhead.Locator(ll.Lat, ll.Lon, 8)
|
||||
die.If(err)
|
||||
fmt.Println(grid)
|
||||
}
|
||||
}
|
||||
12
cmd/kepfetch/main.go
Normal file
12
cmd/kepfetch/main.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
type Kep struct {
|
||||
Filename string
|
||||
URL string
|
||||
}
|
||||
|
||||
type User struct {
|
||||
Name string
|
||||
Directory string
|
||||
Prefix string
|
||||
}
|
||||
Reference in New Issue
Block a user