aboutsummaryrefslogtreecommitdiffstats
path: root/sw/cal/csv.go
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2025-11-07 18:15:14 -0500
committerSam Anthony <sam@samanthony.xyz>2025-11-07 18:15:14 -0500
commit688972df9daa1f80d24feff5c056ab3a66c4eee9 (patch)
tree057f1a8379cc11e747d88ee409b1db6d598f2cd6 /sw/cal/csv.go
parent29da72a76d5e043a181f66e8758c4d511c3ef814 (diff)
downloadcan-gauge-interface-688972df9daa1f80d24feff5c056ab3a66c4eee9.zip
cal: parse csv tables
Diffstat (limited to 'sw/cal/csv.go')
-rw-r--r--sw/cal/csv.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/sw/cal/csv.go b/sw/cal/csv.go
new file mode 100644
index 0000000..bb5cd01
--- /dev/null
+++ b/sw/cal/csv.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "os"
+ "fmt"
+ "io"
+ "strconv"
+ "encoding/csv"
+)
+
+func parseTable(filename string) (map[int32]uint16, error) {
+ f, err := os.Open(filename)
+ if err != nil {
+ eprintf("%v\n", err)
+ }
+ defer f.Close()
+
+ tbl := make(map[int32]uint16)
+ rdr := csv.NewReader(f)
+ for {
+ err := parseRow(rdr, tbl)
+ if err == io.EOF {
+ return tbl, nil
+ } else if err != nil {
+ return nil, fmt.Errorf("%s:%v", filename, err)
+ }
+ }
+}
+
+func parseRow(rdr *csv.Reader, tbl map[int32]uint16) error {
+ row, err := rdr.Read()
+ if err != nil {
+ return err
+ }
+ if len(row) != 2 {
+ line, _ := rdr.FieldPos(0)
+ return fmt.Errorf("%d: malformed row", line)
+ }
+ key, err := strconv.ParseInt(row[0], 10, 32)
+ if err != nil {
+ line, col := rdr.FieldPos(0)
+ return fmt.Errorf("%d:%d: %v", line, col, err)
+ }
+ val, err := strconv.ParseUint(row[1], 10, 16)
+ if err != nil {
+ line, col := rdr.FieldPos(1)
+ return fmt.Errorf("%d:%d: %v", line, col, err)
+ }
+ if _, ok := tbl[int32(key)]; ok {
+ line, col := rdr.FieldPos(0)
+ return fmt.Errorf("%d: %d: duplicate key %d", line, col, key)
+ }
+ tbl[int32(key)] = uint16(val)
+ return nil
+}