Adds Refresh Rate to fw_dut_info.go

BUG=b:326315770
TEST=manual (go run fw_dut_info.go $HOST)

Change-Id: Ibc86548de1dc4c9a4115d325e28c156cf5303d75
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crostestutils/+/5338006
Reviewed-by: Andrew Luo <aluo@chromium.org>
Tested-by: Sean Carpenter <seancarpenter@google.com>
Commit-Queue: Sean Carpenter <seancarpenter@google.com>
diff --git a/go/src/firmware/cmd/dut_info/fw_dut_info.go b/go/src/firmware/cmd/dut_info/fw_dut_info.go
index caf4a47..a569d26 100644
--- a/go/src/firmware/cmd/dut_info/fw_dut_info.go
+++ b/go/src/firmware/cmd/dut_info/fw_dut_info.go
@@ -46,6 +46,7 @@
 	nvmeFirmwareVersion string
 	displaySize         string
 	displayResolution   string
+	displayRefreshRate  string
 	vpd                 string
 }
 
@@ -105,6 +106,7 @@
 	fmt.Println()
 	d.printField("Display Size", d.displaySize)
 	d.printField("Display Resolution", d.displayResolution)
+	d.printField("Display Refresh Rate", d.displayRefreshRate)
 	fmt.Println()
 	d.printField("VPD", d.vpd)
 }
@@ -461,6 +463,22 @@
 	return buildErr(stderr)
 }
 
+// setDisplayRefreshRate gets the refresh rate of the display in Hz
+func (d *dut) setDisplayRefreshRate() error {
+	stdout, stderr := dutio.ExecuteRemoteCommand(
+		d.hostname,
+		"find /sys -name '*edid' -exec edid-decode {} \\;",
+	)
+	r := regexp.MustCompile(`DTD.*\s(?P<RefreshRate>\d+\.\d+ Hz)`)
+	res := r.FindStringSubmatch(stdout)
+	if len(res) > 1 {
+		d.displayRefreshRate = res[1]
+	} else {
+		stderr += fmt.Sprintf("Unable to parse setDisplayRefreshRate stdout: \"%s\"\n", stdout)
+	}
+	return buildErr(stderr)
+}
+
 // setVPD interfaces with a DUT and sets the vpd field (the "Vital Product
 // Data").
 func (d *dut) setVPD() error {
@@ -500,6 +518,7 @@
 	d.setField("NVMe Firmware", d.setNVMEFirmwareVersion)
 	d.setField("Display Size", d.setDisplaySize)
 	d.setField("Display Resolution", d.setDisplayResolution)
+	d.setField("Display Refresh Rate", d.setDisplayRefreshRate)
 	d.setField("VPD", d.setVPD)
 	return d
 }