commit 84fbe98f901c37f36e25a916593045e9a5106428 Author: Ben Charlton Date: Tue Jul 10 21:24:17 2018 +0100 Initial version, CSV and images diff --git a/rigol.go b/rigol.go new file mode 100644 index 0000000..68c885d --- /dev/null +++ b/rigol.go @@ -0,0 +1,164 @@ + +package main + +import ( + "fmt" + "net" + "bufio" + "time" + "os" + "flag" + "strings" + "strconv" +) + +var chancount = flag.Int("channels", 4, "number of channels to collect") +var host = flag.String("host", "rigol", "hostname or IP address") +var port = flag.Int("port", 5555, "tcp port to use") +var interval = flag.Int("interval", 1, "number of seconds between readings") +var count = flag.Int("count", -1, "number of measurements to take. -1 = no limit") +var f_vavg = flag.Bool("vavg", true, "include Vavg") +var f_vmin = flag.Bool("vmin", true, "include Vmin") +var f_vmax = flag.Bool("vmax", true, "include Vmax") +var f_vpp = flag.Bool("vpp", false, "include Vpp") +var f_vrms = flag.Bool("vrms", false, "include Vrms") +var f_freq = flag.Bool("freq", false, "include frequency") +var f_screen = flag.Bool("screen", false, "collect screenshots in PNG format") + +func main() { + + flag.Parse() + + connstr := fmt.Sprintf("%s:%d", *host, *port) + conn, err := net.Dial("tcp", connstr) + if err != nil { + fmt.Printf("Unable to connect to %s\n", connstr) + os.Exit(2) + } + + toRun, header := buildQuery() + + // Output CSV header + fmt.Printf("%s, %s, %s\n", "timestamp", header, "querytime") + + for ; *count != 0; *count-- { + + tstart := time.Now() + + // Collect and write screenshot if the screen flag is set. + if *f_screen { + img := getScreenshot(conn) + writeScreenshot(img) + } + + result := queryScope(conn, toRun) + // Return from scope is semicolon separated, so we'll just switch for commas. + result = strings.Replace(result, ";", ", ", -1) + + tdone := time.Now() + fmt.Printf("%s, %s, %s\n", tdone.Format(time.RFC3339), result, tdone.Sub(tstart)) + + time.Sleep(time.Duration(*interval)*time.Second) + } +} + +func queryScope (conn net.Conn, query string) string { + fmt.Fprintf(conn, fmt.Sprintf("%s\n", query)) + c1, _ := bufio.NewReader(conn).ReadString('\n') + return strings.TrimSuffix(c1, "\n") +} + +func getScreenshot (conn net.Conn) []byte { + // Args are Colour, Invert, Format. + fmt.Fprintf(conn, ":DISP:DATA? ON,FALSE,PNG\n") + reader := bufio.NewReader(conn) + header1,_ := reader.ReadByte() + + // should be a # + if header1 != 35 { + return nil + } + + // Next character shows us the length of the length of the datastream! + header2,_ := reader.ReadByte() + buffsize := int(header2 - 48) + + header3 := make([]byte, buffsize) + for i:=0; i