Remove the bench option, add num_reads instead for controlling how many

reads to send. Default is read forever.
This commit is contained in:
Sebastian Zagrodzki
2017-02-10 13:02:48 +01:00
parent 66db4a686b
commit 0588c4e512

View File

@@ -23,8 +23,6 @@ import (
"os" "os"
"strconv" "strconv"
"strings" "strings"
"sync/atomic"
"time"
"github.com/kylelemons/gousb/usb" "github.com/kylelemons/gousb/usb"
"github.com/kylelemons/gousb/usbid" "github.com/kylelemons/gousb/usbid"
@@ -39,7 +37,7 @@ var (
endpoint = flag.Uint("endpoint", 1, "Endpoint to which to connect") endpoint = flag.Uint("endpoint", 1, "Endpoint to which to connect")
debug = flag.Int("debug", 3, "Debug level for libusb") debug = flag.Int("debug", 3, "Debug level for libusb")
size = flag.Uint("read_size", 1024, "Number of bytes of data to read in a single transaction.") size = flag.Uint("read_size", 1024, "Number of bytes of data to read in a single transaction.")
bench = flag.Bool("benchmark", false, "When true, keep reading from the endpoint and periodically report the measured throughput. If false, only one read operation is performed and obtained data is printed to STDOUT.") num = flag.Uint("read_num", 0, "Number of read transactions to perform. 0 means infinite.")
) )
func parseVIDPID(vidPid string) (usb.ID, usb.ID, error) { func parseVIDPID(vidPid string) (usb.ID, usb.ID, error) {
@@ -92,13 +90,15 @@ func main() {
case *vidPID != "" && *busAddr != "": case *vidPID != "" && *busAddr != "":
log.Fatal("You can't use --vidpid flag together with --busaddr. Pick one.") log.Fatal("You can't use --vidpid flag together with --busaddr. Pick one.")
case *vidPID != "": case *vidPID != "":
vid, pid, err := parseVIDPID(*vidPID) var err error
vid, pid, err = parseVIDPID(*vidPID)
if err != nil { if err != nil {
log.Fatalf("Invalid value for --vidpid (%q): %v", *vidPID, err) log.Fatalf("Invalid value for --vidpid (%q): %v", *vidPID, err)
} }
devName = fmt.Sprintf("VID:PID %s:%s", vid, pid) devName = fmt.Sprintf("VID:PID %s:%s", vid, pid)
default: default:
bus, addr, err := parseBusAddr(*busAddr) var err error
bus, addr, err = parseBusAddr(*busAddr)
if err != nil { if err != nil {
log.Fatalf("Invalid value for --busaddr (%q): %v", *busAddr, err) log.Fatalf("Invalid value for --busaddr (%q): %v", *busAddr, err)
} }
@@ -162,41 +162,19 @@ func main() {
log.Printf(" --------------\n") log.Printf(" --------------\n")
} }
log.Print("Connecting to endpoint...") log.Printf("Connecting to endpoint %d...", *endpoint)
ep, err := dev.OpenEndpoint(uint8(*config), uint8(*iface), uint8(*setup), uint8(*endpoint)|uint8(usb.ENDPOINT_DIR_IN)) ep, err := dev.OpenEndpoint(uint8(*config), uint8(*iface), uint8(*setup), uint8(*endpoint)|uint8(usb.ENDPOINT_DIR_IN))
if err != nil { if err != nil {
log.Fatalf("open: %s", err) log.Fatalf("open: %s", err)
} }
log.Print("Reading...") log.Print("Reading...")
var total uint64 buf := make([]byte, *size)
if *bench { for i := uint(0); *num == 0 || i < *num; i++ {
go func() {
var last uint64
var before = time.Now()
for {
time.Sleep(4 * time.Second)
cur := atomic.LoadUint64(&total)
now := time.Now()
dur := now.Sub(before)
log.Printf("%.2f B/s\n", float64(cur-last)/(float64(dur)/float64(time.Second)))
before = now
last = cur
}
}()
}
for {
buf := make([]byte, *size)
num, err := ep.Read(buf) num, err := ep.Read(buf)
if err != nil { if err != nil {
log.Fatalf("Reading from device failed: %v", err) log.Fatalf("Reading from device failed: %v", err)
} }
if !*bench { os.Stdout.Write(buf[:num])
log.Printf("Read %d bytes of data", num)
os.Stdout.Write(buf[:num])
return
}
atomic.AddUint64(&total, uint64(num))
} }
} }