diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-12-13 17:45:38 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-12-13 17:45:38 -0500 |
| commit | d1a70e94bf4b7f15615be6f097067d005ea2e49e (patch) | |
| tree | 76d3a5e7e4c355e6d5c15cf008ec7105e6210bc3 /sw | |
| parent | 22d12c198848444d7e02c913ac055b46ea7e368a (diff) | |
| download | can-gauge-interface-d1a70e94bf4b7f15615be6f097067d005ea2e49e.zip | |
remove usbcom
Diffstat (limited to 'sw')
| -rw-r--r-- | sw/usbcom/go.mod | 8 | ||||
| -rw-r--r-- | sw/usbcom/go.sum | 8 | ||||
| -rw-r--r-- | sw/usbcom/main.go | 85 | ||||
| -rw-r--r-- | sw/usbcom/usb/usb.go | 158 |
4 files changed, 0 insertions, 259 deletions
diff --git a/sw/usbcom/go.mod b/sw/usbcom/go.mod deleted file mode 100644 index 1870f76..0000000 --- a/sw/usbcom/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module git.samanthony.xyz/can_gauge_interface/sw/usbcom - -go 1.24.6 - -require ( - github.com/google/gousb v1.1.3 // indirect - golang.org/x/sync v0.17.0 // indirect -) diff --git a/sw/usbcom/go.sum b/sw/usbcom/go.sum deleted file mode 100644 index 64a2dc3..0000000 --- a/sw/usbcom/go.sum +++ /dev/null @@ -1,8 +0,0 @@ -github.com/google/gousb v1.1.3 h1:xt6M5TDsGSZ+rlomz5Si5Hmd/Fvbmo2YCJHN+yGaK4o= -github.com/google/gousb v1.1.3/go.mod h1:GGWUkK0gAXDzxhwrzetW592aOmkkqSGcj5KLEgmCVUg= -github.com/gotmc/libusb/v2 v2.3.4 h1:xDKi52trBIq7QTMxlhHy9zgb+HRmimSBo8yhx+k1NWU= -github.com/gotmc/libusb/v2 v2.3.4/go.mod h1:rU0mvps+snf/CHvEkISbxrwUlWpt6VluOkjqpKo6TFw= -github.com/sam-rba/share v0.3.0 h1:aBVvgSbcBaH43Jrbq++iz15/DAso/D6oJDm+dDM4E40= -github.com/sam-rba/share v0.3.0/go.mod h1:rDx/wFG1Vc6JO1F/F0eBnkcy2wHwV0T9100ig/hu12A= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= diff --git a/sw/usbcom/main.go b/sw/usbcom/main.go deleted file mode 100644 index 70661d9..0000000 --- a/sw/usbcom/main.go +++ /dev/null @@ -1,85 +0,0 @@ -package main - -import ( - "context" - "fmt" - "io" - "os" - - "golang.org/x/sync/errgroup" - - "git.samanthony.xyz/can_gauge_interface/sw/usbcom/usb" -) - -const bufSize = 512 - -func main() { - exitCode := make(chan int) - go exit(exitCode) - defer close(exitCode) - - dev, err := usb.Connect() - if err != nil { - fmt.Fprintf(os.Stderr, "Error connecting to device: %v\n", err) - exitCode <- 1 - return - } - defer func() { - if err := dev.Close(); err != nil { - fmt.Fprintf(os.Stderr, "Error :%v\n", err) - exitCode <- 1 - } - }() - - var group errgroup.Group - ctx, cancel := context.WithCancel(context.Background()) - - // Host->Device - group.Go(func() error { - err := hostToDevice(dev) - cancel() // device->host routine - return err - }) - - // Device->Host - group.Go(func() error { - return deviceToHost(ctx, dev) - }) - - if err = group.Wait(); err != nil { - fmt.Fprintf(os.Stderr, "Error: %v\n", err) - exitCode <- 1 - } -} - -func exit(code <-chan int) { - worst := 0 - for c := range code { - if c > worst { - worst = c - } - } - os.Exit(worst) -} - -func hostToDevice(dev *usb.Device) error { - _, err := io.Copy(dev, os.Stdin) - return err -} - -func deviceToHost(ctx context.Context, dev *usb.Device) error { - buf := make([]byte, bufSize) - for { - select { - case <-ctx.Done(): - return nil - default: - } - - n, err := dev.Read(buf) - if err != nil { - return err - } - fmt.Print(string(buf[:n])) - } -} diff --git a/sw/usbcom/usb/usb.go b/sw/usbcom/usb/usb.go deleted file mode 100644 index c920884..0000000 --- a/sw/usbcom/usb/usb.go +++ /dev/null @@ -1,158 +0,0 @@ -package usb - -import ( - "fmt" - - "github.com/google/gousb" -) - -const ( - vendorId gousb.ID = 0x04d8 - productId gousb.ID = 0x000a - - inEndpointAddr = 0x82 - outEndpointAddr = 0x02 -) - -type Device struct { - ctx *gousb.Context - dev *gousb.Device - closeIntf func() - in *gousb.ReadStream // IN endpoint (device->host) - out *gousb.WriteStream // OUT endpoint (host->device) -} - -func Connect() (*Device, error) { - ctx := gousb.NewContext() - - dev, err := ctx.OpenDeviceWithVIDPID(vendorId, productId) - if err != nil { - ctx.Close() - return nil, err - } - - intf, closeIntf, err := interfaceByClass(dev, gousb.ClassData) - if err != nil { - dev.Close() - ctx.Close() - return nil, err - } - - in, err := inEndpoint(intf) - if err != nil { - closeIntf() - dev.Close() - ctx.Close() - return nil, err - } - - out, err := outEndpoint(intf) - if err != nil { - in.Close() - closeIntf() - dev.Close() - ctx.Close() - return nil, err - } - - return &Device{ - ctx, - dev, - closeIntf, - in, out, - }, nil -} - -func interfaceByClass(dev *gousb.Device, class gousb.Class) (intf *gousb.Interface, close func(), err error) { - cfgNum, err := dev.ActiveConfigNum() - if err != nil { - return nil, nil, fmt.Errorf("failed to get active config number of device %s: %v", dev, err) - } - cfg, err := dev.Config(cfgNum) - if err != nil { - return nil, nil, fmt.Errorf("failed to claim config %d of device %s: %v", cfgNum, dev, err) - } - - intfNum, altNum, ok := func() (int, int, bool) { - for i, intf := range cfg.Desc.Interfaces { - for a, alt := range intf.AltSettings { - if alt.Class == class { - return i, a, true - } - } - } - return -1, -1, false - }() - if !ok { - cfg.Close() - return nil, nil, fmt.Errorf("failed to get %s interface of device %s: %v", class, dev, err) - } - - intf, err = cfg.Interface(intfNum, altNum) - if err != nil { - cfg.Close() - return nil, nil, fmt.Errorf("failed to select interface (%d,%d) of config %d of device %s: %v", intfNum, altNum, cfgNum, dev, err) - } - - return intf, func() { - intf.Close() - cfg.Close() - }, nil -} - -func inEndpoint(intf *gousb.Interface) (*gousb.ReadStream, error) { - ep, err := intf.InEndpoint(inEndpointAddr) - if err != nil { - return nil, err - } - - desc, ok := intf.Setting.Endpoints[inEndpointAddr] - if !ok { - return nil, fmt.Errorf("no such endpoint: %x", inEndpointAddr) - } - - return ep.NewStream(desc.MaxPacketSize, 1) -} - -func outEndpoint(intf *gousb.Interface) (*gousb.WriteStream, error) { - ep, err := intf.OutEndpoint(outEndpointAddr) - if err != nil { - return nil, err - } - - desc, ok := intf.Setting.Endpoints[outEndpointAddr] - if !ok { - return nil, fmt.Errorf("no such endpoint: %x", outEndpointAddr) - } - - return ep.NewStream(desc.MaxPacketSize, 1) -} - -func (dev *Device) Close() error { - outErr := dev.out.Close() - inErr := dev.in.Close() - dev.closeIntf() - devErr := dev.dev.Close() - ctxErr := dev.ctx.Close() - - return nonNil(outErr, inErr, devErr, ctxErr) -} - -func nonNil(errs ...error) error { - for _, err := range errs { - if err != nil { - return err - } - } - return nil -} - -// Read from the IN endpoint (device->host) -func (dev *Device) Read(p []byte) (n int, err error) { - return dev.in.Read(p) -} - -// Write to the OUT endpoint (host->device) -func (dev *Device) Write(p []byte) (n int, err error) { - return dev.out.Write(p) -} |