add xbee device parser

This commit is contained in:
saji 2023-05-07 10:40:03 -05:00
parent ddad848127
commit 6f8e696dcc

View file

@ -4,10 +4,13 @@ package cmd
// we can do network discovery and netcat-like things. // we can do network discovery and netcat-like things.
import ( import (
"errors"
"fmt" "fmt"
"io" "io"
"net"
"os" "os"
"runtime" "runtime"
"strconv"
"strings" "strings"
"github.com/kschamplin/gotelem/xbee" "github.com/kschamplin/gotelem/xbee"
@ -69,8 +72,8 @@ writtend to stdout.
func xbeeInfo(ctx *cli.Context) error { func xbeeInfo(ctx *cli.Context) error {
logger := slog.New(slog.NewTextHandler(os.Stderr)) logger := slog.New(slog.NewTextHandler(os.Stderr))
serialDevice, _ := serial.Open("/dev/ttyACM0", &serial.Mode{}) transport, _ := parseDeviceString(ctx.String("device"))
xb, err := xbee.NewSession(serialDevice, logger.With("name", "")) xb, err := xbee.NewSession(transport, logger.With("device", transport.Type()))
if err != nil { if err != nil {
return cli.Exit(err, 1) return cli.Exit(err, 1)
} }
@ -94,7 +97,7 @@ func netcat(ctx *cli.Context) error {
// basically create two pipes. // basically create two pipes.
logger := slog.New(slog.NewTextHandler(os.Stderr)) logger := slog.New(slog.NewTextHandler(os.Stderr))
transport, _ := parseDeviceString("/dev/ttyUSB0") transport, _ := parseDeviceString(ctx.String("device"))
xb, _ := xbee.NewSession(transport, logger.With("devtype", transport.Type())) xb, _ := xbee.NewSession(transport, logger.With("devtype", transport.Type()))
sent := make(chan int64) sent := make(chan int64)
@ -137,10 +140,58 @@ func parseDeviceString(dev string) (*xbeeTransport, error) {
} }
if strings.HasPrefix(dev, "tcp://") { if strings.HasPrefix(dev, "tcp://") {
addr, _ := strings.CutPrefix(dev, "tcp://")
conn, err := net.Dial("tcp", addr)
if err != nil {
return nil, err
}
xbt.ReadWriteCloser = conn
xbt.devType = "tcp"
} else if strings.HasPrefix(dev, "COM") && runtime.GOOS == "windows" { } else if strings.HasPrefix(dev, "COM") && runtime.GOOS == "windows" {
} else if strings.HasPrefix(dev, "/") && runtime.GOOS != "windows" { path, bRate, found := strings.Cut(dev, ":")
mode := &serial.Mode{
BaudRate: 9600,
}
if found {
b, err := strconv.Atoi(bRate)
if err != nil {
return nil, err
}
mode.BaudRate = b
}
sDev, err := serial.Open(path, mode)
if err != nil {
return nil, err
}
xbt.ReadWriteCloser = sDev
xbt.devType = "serialWin"
} else if strings.HasPrefix(dev, "/") && runtime.GOOS != "windows" {
path, bRate, found := strings.Cut(dev, ":")
mode := &serial.Mode{
BaudRate: 9600,
}
if found {
b, err := strconv.Atoi(bRate)
if err != nil {
return nil, err
}
mode.BaudRate = b
}
sDev, err := serial.Open(path, mode)
if err != nil {
return nil, err
}
xbt.ReadWriteCloser = sDev
xbt.devType = "serial"
} else {
return nil, errors.New("could not parse device path")
} }
return xbt, nil return xbt, nil
} }