Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix two issues preventing Garmin devices working #1

Merged
merged 2 commits into from
Nov 1, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 25 additions & 15 deletions mtp/mtp.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,14 +210,23 @@ func (d *Device) ID() (string, error) {
d.devDescr.Manufacturer,
d.devDescr.Product,
d.devDescr.SerialNumber} {
s, err := d.h.GetStringDescriptorASCII(b)
if err != nil {
if d.USBDebug {
log.Printf("USB: GetStringDescriptorASCII, err: %v", err)
var descriptor string
if b == 0 {
// All three of the descriptors are optional.
// Index of 0 means the string is not available.
descriptor = ""
} else {
s, err := d.h.GetStringDescriptorASCII(b)
if err != nil {
if d.USBDebug {
log.Printf("USB: GetStringDescriptorASCII, err: %v", err)
}
return "", err
}
return "", err
descriptor = s
}
ids = append(ids, s)

ids = append(ids, descriptor)
}

return strings.Join(ids, " "), nil
Expand Down Expand Up @@ -295,21 +304,21 @@ func (d *Device) sendReq(req *Container) error {

// Fetches one USB packet. The header is split off, and the remainder is returned.
// dest should be at least 512bytes.
func (d *Device) fetchPacket(dest []byte, header *usbBulkHeader) (rest []byte, err error) {
func (d *Device) fetchPacket(dest []byte, header *usbBulkHeader) (rest []byte, bytesRead int, err error) {
n, err := d.h.BulkTransfer(d.fetchEP, dest[:d.fetchMaxPacketSize()], d.Timeout)
if n > 0 {
d.dataPrint(d.fetchEP, dest[:n])
}

if err != nil {
return nil, err
return nil, n, err
}

buf := bytes.NewBuffer(dest[:n])
if err = binary.Read(buf, binary.LittleEndian, header); err != nil {
return nil, err
return nil, n, err
}
return buf.Bytes(), nil
return buf.Bytes(), n, nil
}

func (d *Device) decodeRep(h *usbBulkHeader, rest []byte, rep *Container) error {
Expand Down Expand Up @@ -410,7 +419,7 @@ func (d *Device) runTransaction(req *Container, rep *Container,
fetchPacketSize := d.fetchMaxPacketSize()
data := make([]byte, fetchPacketSize)
h := &usbBulkHeader{}
rest, err := d.fetchPacket(data[:], h)
rest, n, err := d.fetchPacket(data[:], h)
if err != nil {
return err
}
Expand All @@ -429,9 +438,10 @@ func (d *Device) runTransaction(req *Container, rep *Container,

dest.Write(rest)

if len(rest)+usbHdrLen == fetchPacketSize {
// If this was a full packet, read until we
// have a short read.
if len(rest)+usbHdrLen == fetchPacketSize || uint32(n) < h.Length {
// If this was a full packet, or if the packet wasn't full but
// the device said it was sending more data than we received,
// continue reading until we have a read less than a full packet.
_, finalPacket, err = d.bulkRead(dest, progressCb)
if err != nil {
return err
Expand All @@ -447,7 +457,7 @@ func (d *Device) runTransaction(req *Container, rep *Container,
finalBuf := bytes.NewBuffer(finalPacket[:len(finalPacket)])
err = binary.Read(finalBuf, binary.LittleEndian, h)
} else {
rest, err = d.fetchPacket(data[:], h)
rest, _, err = d.fetchPacket(data[:], h)
}
}

Expand Down