updating tools

This commit is contained in:
2024-01-27 13:53:15 -08:00
parent 14f29f88d3
commit ec18e60869
8 changed files with 425 additions and 89 deletions

45
cmd/ft8grid/main.go Normal file
View 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
View 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
View File

@@ -0,0 +1,12 @@
package main
type Kep struct {
Filename string
URL string
}
type User struct {
Name string
Directory string
Prefix string
}