Compare commits
No commits in common. "d6cd4d3e260d076dd00e239258dac945f759f427" and "05d9584fb517e0a526ad1ad1036e2e919157e06d" have entirely different histories.
d6cd4d3e26
...
05d9584fb5
206
cmd/fixer/fixer.go
Normal file
206
cmd/fixer/fixer.go
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/kschamplin/gotelem/skylab"
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// fixer resolves four major issues with CAN dumps:
|
||||||
|
// 1. ISO8601 timestamps
|
||||||
|
// 2. Unix seconds timestamps
|
||||||
|
// 3. Missing/broken timestamps (retime)
|
||||||
|
// 4. missing names
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
app := cli.NewApp()
|
||||||
|
app.Name = "fixer"
|
||||||
|
app.Usage = " fix skylabify outputs"
|
||||||
|
app.ArgsUsage = "<input file>"
|
||||||
|
app.Description = `fixer fixes four major issues with CAN dumps
|
||||||
|
1. ISO8601 timestamps --time iso8601
|
||||||
|
2. Unix seconds timestamps --time seconds
|
||||||
|
3. Missing/broken timestamps --retime
|
||||||
|
4. missing names (enabled by default, --no-rename to skip)
|
||||||
|
`
|
||||||
|
app.Flags = []cli.Flag{
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "retime",
|
||||||
|
Usage: "ignore timestamps and retime data based on 200ms heartbeat packet",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "format",
|
||||||
|
Usage: "Timestamp format. One of 'iso8601', 'seconds'. Ignored if using retime.",
|
||||||
|
},
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "no-rename",
|
||||||
|
Usage: "skip changing packet names",
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "output",
|
||||||
|
Usage: "file to output to. defaults to stdout.",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
app.Before = validateArgs
|
||||||
|
app.Action = run
|
||||||
|
app.HideHelp = true
|
||||||
|
app.Run(os.Args)
|
||||||
|
}
|
||||||
|
|
||||||
|
var allowedFormats = []string{
|
||||||
|
"iso8601",
|
||||||
|
"seconds",
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkFormat(input string) bool {
|
||||||
|
for _, allowed := range allowedFormats {
|
||||||
|
if input == allowed {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateArgs(ctx *cli.Context) error {
|
||||||
|
if ctx.IsSet("format") {
|
||||||
|
format := ctx.String("format")
|
||||||
|
if !checkFormat(format) {
|
||||||
|
fmt.Printf("invalid format string, got %s, must be one of %s", format, strings.Join(allowedFormats, ", "))
|
||||||
|
cli.ShowAppHelpAndExit(ctx, int(syscall.EINVAL))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if ctx.Args().Get(0) == "" {
|
||||||
|
fmt.Println("missing input file")
|
||||||
|
cli.ShowAppHelpAndExit(ctx, int(syscall.EINVAL))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(ctx *cli.Context) (err error) {
|
||||||
|
path := ctx.Args().Get(0)
|
||||||
|
|
||||||
|
var istream *os.File
|
||||||
|
if path == "-" {
|
||||||
|
istream = os.Stdin
|
||||||
|
} else {
|
||||||
|
istream, err = os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var ostream *os.File
|
||||||
|
oFilename := ctx.Args().Get(1)
|
||||||
|
if oFilename == "" {
|
||||||
|
ostream = os.Stdout
|
||||||
|
} else {
|
||||||
|
ostream, err = os.Create(oFilename)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iReader := json.NewDecoder(istream)
|
||||||
|
|
||||||
|
shouldRetime := ctx.Bool("retime")
|
||||||
|
|
||||||
|
// used for retime - increment by 200 ms every time we see a WsrStatusPacket
|
||||||
|
currentTick := time.Now().UnixMilli()
|
||||||
|
|
||||||
|
for {
|
||||||
|
// read a line of json and fix names if we should.
|
||||||
|
|
||||||
|
// FIXME: handle missing trailing newline.
|
||||||
|
// based on the fomat string, we should parse the data raw...
|
||||||
|
var res brokenCANMsg
|
||||||
|
err := iReader.Decode(&res)
|
||||||
|
|
||||||
|
// float64 can have issues when represeneting
|
||||||
|
// unix milliseconds. the JSON decoder supports
|
||||||
|
// a "Number" struct that can be either.
|
||||||
|
iReader.UseNumber()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var goodPkt skylab.RawJsonEvent
|
||||||
|
|
||||||
|
goodPkt.Data = res.Data
|
||||||
|
goodPkt.Id = uint32(res.Id)
|
||||||
|
goodPkt.Name = res.Name
|
||||||
|
// wait to decode packet before rename.
|
||||||
|
|
||||||
|
switch ts := res.Timestamp.(type) {
|
||||||
|
case json.Number:
|
||||||
|
// if it contains a decimal.
|
||||||
|
if strings.Contains(ts.String(), ".") {
|
||||||
|
// it's a float.
|
||||||
|
t, _ := ts.Float64()
|
||||||
|
t = t * 1000
|
||||||
|
goodPkt.Timestamp = int64(t)
|
||||||
|
} else {
|
||||||
|
// it's an int.
|
||||||
|
t, _ := ts.Int64()
|
||||||
|
if ctx.String("format") == "seconds" {
|
||||||
|
t = t * 1000
|
||||||
|
}
|
||||||
|
goodPkt.Timestamp = t
|
||||||
|
}
|
||||||
|
case string:
|
||||||
|
// parse as ISO8601
|
||||||
|
// use unix millis
|
||||||
|
var t time.Time
|
||||||
|
err := t.UnmarshalText([]byte(ts))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
goodPkt.Timestamp = t.UnixMilli()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if shouldRetime {
|
||||||
|
if goodPkt.Id == uint32(skylab.WsrStatusInformationId) {
|
||||||
|
// bump the clock 200ms
|
||||||
|
currentTick += 200
|
||||||
|
}
|
||||||
|
goodPkt.Timestamp = currentTick
|
||||||
|
}
|
||||||
|
|
||||||
|
// now, spit it out.
|
||||||
|
var bEv skylab.BusEvent
|
||||||
|
bEv.Timestamp = time.UnixMilli(goodPkt.Timestamp)
|
||||||
|
bEv.Id = goodPkt.Id
|
||||||
|
bEv.Data, err = skylab.FromJson(goodPkt.Id, goodPkt.Data)
|
||||||
|
var idErr *skylab.UnknownIdError
|
||||||
|
if errors.As(err, &idErr) {
|
||||||
|
// unknown id
|
||||||
|
slog.Info("unknown id", "err", err)
|
||||||
|
continue
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
out, err := json.Marshal(&bEv)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Fprintln(ostream, string(out))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type brokenCANMsg struct {
|
||||||
|
Timestamp any `json:"ts"`
|
||||||
|
Id int32
|
||||||
|
Name string
|
||||||
|
Data json.RawMessage
|
||||||
|
}
|
|
@ -28,12 +28,16 @@ type TelemDb struct {
|
||||||
// TelemDbOption lets you customize the behavior of the sqlite database
|
// TelemDbOption lets you customize the behavior of the sqlite database
|
||||||
type TelemDbOption func(*TelemDb) error
|
type TelemDbOption func(*TelemDb) error
|
||||||
|
|
||||||
|
// this string is used to open the read-write db.
|
||||||
|
// the extra options improve performance significantly.
|
||||||
|
const rwDbPathFmt = "file:%s?_journal_mode=wal&mode=rwc&_txlock=immediate&_timeout=10000"
|
||||||
|
|
||||||
// this function is internal use. It actually opens the database, but uses
|
|
||||||
// a raw path string instead of formatting one like the exported functions.
|
func OpenTelemDb(path string, options ...TelemDbOption) (tdb *TelemDb, err error) {
|
||||||
func openRawDb(rawpath string, options ...TelemDbOption) (tdb *TelemDb, err error) {
|
|
||||||
tdb = &TelemDb{}
|
tdb = &TelemDb{}
|
||||||
tdb.db, err = sqlx.Connect("sqlite3", rawpath)
|
|
||||||
|
dbStr := fmt.Sprintf(rwDbPathFmt, path)
|
||||||
|
tdb.db, err = sqlx.Connect("sqlite3", dbStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -58,17 +62,6 @@ func openRawDb(rawpath string, options ...TelemDbOption) (tdb *TelemDb, err erro
|
||||||
return tdb, err
|
return tdb, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// this string is used to open the read-write db.
|
|
||||||
// the extra options improve performance significantly.
|
|
||||||
const rwDbPathFmt = "file:%s?_journal_mode=wal&mode=rwc&_txlock=immediate&_timeout=10000"
|
|
||||||
|
|
||||||
// OpenTelemDb opens a new telemetry database at the given path.
|
|
||||||
func OpenTelemDb(path string, options ...TelemDbOption) (*TelemDb, error) {
|
|
||||||
dbStr := fmt.Sprintf(rwDbPathFmt, path)
|
|
||||||
return openRawDb(dbStr, options...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tdb *TelemDb) GetVersion() (int, error) {
|
func (tdb *TelemDb) GetVersion() (int, error) {
|
||||||
var version int
|
var version int
|
||||||
err := tdb.db.Get(&version, "PRAGMA user_version")
|
err := tdb.db.Get(&version, "PRAGMA user_version")
|
||||||
|
@ -86,10 +79,7 @@ const sqlInsertEvent =`INSERT INTO "bus_events" (ts, name, data) VALUES `
|
||||||
|
|
||||||
// AddEvent adds the bus event to the database.
|
// AddEvent adds the bus event to the database.
|
||||||
func (tdb *TelemDb) AddEventsCtx(ctx context.Context, events ...skylab.BusEvent) (n int64, err error) {
|
func (tdb *TelemDb) AddEventsCtx(ctx context.Context, events ...skylab.BusEvent) (n int64, err error) {
|
||||||
// edge case - zero events.
|
//
|
||||||
if len(events) == 0 {
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
n = 0
|
n = 0
|
||||||
tx, err := tdb.db.BeginTx(ctx, nil)
|
tx, err := tdb.db.BeginTx(ctx, nil)
|
||||||
defer tx.Rollback()
|
defer tx.Rollback()
|
||||||
|
@ -119,7 +109,7 @@ func (tdb *TelemDb) AddEventsCtx(ctx context.Context, events ...skylab.BusEvent)
|
||||||
// construct the full statement now
|
// construct the full statement now
|
||||||
sqlStmt = sqlStmt + strings.Join(inserts[:idx], ",")
|
sqlStmt = sqlStmt + strings.Join(inserts[:idx], ",")
|
||||||
stmt, err := tx.PrepareContext(ctx, sqlStmt)
|
stmt, err := tx.PrepareContext(ctx, sqlStmt)
|
||||||
// defer stmt.Close()
|
defer stmt.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
@ -20,6 +19,7 @@ func GetRandomBusEvent() skylab.BusEvent {
|
||||||
Timestamp: time.Now(),
|
Timestamp: time.Now(),
|
||||||
Data: &data,
|
Data: &data,
|
||||||
}
|
}
|
||||||
|
ev.Id, _ = data.CANId()
|
||||||
|
|
||||||
return ev
|
return ev
|
||||||
}
|
}
|
||||||
|
@ -30,20 +30,11 @@ func TestTelemDb(t *testing.T) {
|
||||||
|
|
||||||
t.Run("test opening database", func(t *testing.T) {
|
t.Run("test opening database", func(t *testing.T) {
|
||||||
var err error
|
var err error
|
||||||
// we use the underlying raw database to avoid the options.
|
tdb, err = OpenTelemDb("file::memory:?cache=shared")
|
||||||
tdb, err = openRawDb("file::memory:?cache=shared")
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("could not open db: %v", err)
|
t.Errorf("could not open db: %v", err)
|
||||||
}
|
}
|
||||||
tdb.db.Ping()
|
tdb.db.Ping()
|
||||||
res, _ := tdb.db.Query("SELECT name FROM sqlite_master WHERE type='table'")
|
|
||||||
|
|
||||||
var table string
|
|
||||||
|
|
||||||
for res.Next() {
|
|
||||||
res.Scan(&table)
|
|
||||||
fmt.Println(table)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("test inserting bus event", func(t *testing.T) {
|
t.Run("test inserting bus event", func(t *testing.T) {
|
||||||
|
@ -72,7 +63,7 @@ func TestTelemDb(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
if _, err := tdb.AddEvents(tt.args.events...); (err != nil) != tt.wantErr {
|
if err := tdb.AddEvents(tt.args.events...); (err != nil) != tt.wantErr {
|
||||||
t.Errorf("TelemDb.AddEvents() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("TelemDb.AddEvents() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -87,7 +87,7 @@ func RunMigrations(tdb *TelemDb) (finalVer int, err error) {
|
||||||
for _, v := range vers {
|
for _, v := range vers {
|
||||||
if v != expectedVer {
|
if v != expectedVer {
|
||||||
err = errors.New("missing update between")
|
err = errors.New("missing update between")
|
||||||
return 0, err
|
return
|
||||||
// invalid
|
// invalid
|
||||||
}
|
}
|
||||||
expectedVer = v + 1
|
expectedVer = v + 1
|
||||||
|
@ -97,36 +97,35 @@ func RunMigrations(tdb *TelemDb) (finalVer int, err error) {
|
||||||
// now apply the mappings based on current ver.
|
// now apply the mappings based on current ver.
|
||||||
|
|
||||||
tx, err := tdb.db.Begin()
|
tx, err := tdb.db.Begin()
|
||||||
defer tx.Rollback()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return
|
||||||
}
|
}
|
||||||
for v := currentVer + 1; v <= finalVer; v++ {
|
for v := currentVer + 1; v <= finalVer; v++ {
|
||||||
// attempt to get the "up" migration.
|
// attempt to get the "up" migration.
|
||||||
mMap, ok := migrations[v]
|
mMap, ok := migrations[v]
|
||||||
if !ok {
|
if !ok {
|
||||||
err = errors.New("could not find migration for version")
|
err = errors.New("could not find migration for version")
|
||||||
return 0, err
|
goto rollback
|
||||||
}
|
}
|
||||||
upMigration, ok := mMap["up"]
|
upMigration, ok := mMap["up"]
|
||||||
if !ok {
|
if !ok {
|
||||||
err = errors.New("could not get up migration")
|
err = errors.New("could not get up migration")
|
||||||
return 0, err
|
goto rollback
|
||||||
}
|
}
|
||||||
upFile, err := migrationsFs.Open(path.Join("migrations", upMigration.FileName))
|
upFile, err := migrationsFs.Open(path.Join("migrations", upMigration.FileName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
goto rollback
|
||||||
}
|
}
|
||||||
|
|
||||||
upStmt, err := io.ReadAll(upFile)
|
upStmt, err := io.ReadAll(upFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
goto rollback
|
||||||
}
|
}
|
||||||
// open the file name
|
// open the file name
|
||||||
// execute the file.
|
// execute the file.
|
||||||
_, err = tx.Exec(string(upStmt))
|
_, err = tx.Exec(string(upStmt))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
goto rollback
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -135,4 +134,8 @@ func RunMigrations(tdb *TelemDb) (finalVer int, err error) {
|
||||||
err = tdb.SetVersion(finalVer)
|
err = tdb.SetVersion(finalVer)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
// yeah, we use goto. Deal with it.
|
||||||
|
rollback:
|
||||||
|
tx.Rollback()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
DROP TABLE "packet_definitions";
|
|
||||||
DROP TABLE "field_definitions";
|
|
|
@ -1,13 +0,0 @@
|
||||||
CREATE TABLE "packet_definitions" (
|
|
||||||
"name" TEXT NOT NULL,
|
|
||||||
"description" TEXT,
|
|
||||||
"id" INTEGER NOT NULL,
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE "field_definitions" (
|
|
||||||
"name" TEXT NOT NULL,
|
|
||||||
"subname" TEXT, -- if the data type is a bitfield, we can use subname to identify the bit.
|
|
||||||
"packet_name" TEXT NOT NULL,
|
|
||||||
"type" TEXT NOT NULL,
|
|
||||||
FOREIGN KEY("packet_name") REFERENCES packet_definitions(name)
|
|
||||||
);
|
|
|
@ -1,3 +0,0 @@
|
||||||
package db
|
|
||||||
// This file implements Packet modelling, which allows us to look up fields by name
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// generated by gen_skylab.go at 2024-02-27 19:26:47.373116343 -0600 CST m=+0.002925968 DO NOT EDIT!
|
// generated by gen_skylab.go at 2024-02-12 10:42:55.884248761 -0600 CST m=+0.003327461 DO NOT EDIT!
|
||||||
|
|
||||||
package skylab
|
package skylab
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,8 @@ func TestJSONBmsMeasurement(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -63,7 +64,8 @@ func TestJSONBatteryStatus(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -98,7 +100,8 @@ func TestJSONBmsKillReason(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -133,7 +136,8 @@ func TestJSONBmsModuleMinMax(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -168,7 +172,8 @@ func TestJSONBmsSoc(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -203,7 +208,8 @@ func TestJSONBmsCapacity(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -238,7 +244,8 @@ func TestJSONBmsCurrentlimit(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -273,7 +280,8 @@ func TestJSONBmsFanInfo(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -308,7 +316,8 @@ func TestJSONBmsSetMinFanSpeed(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -343,7 +352,8 @@ func TestJSONBmsModule(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -378,7 +388,8 @@ func TestJSONBmsChargerResponse(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -413,7 +424,8 @@ func TestJSONChassisIsolationFault(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -448,7 +460,8 @@ func TestJSONBmsImdInfo(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -483,7 +496,8 @@ func TestJSONDashboardPedalPercentages(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -518,7 +532,8 @@ func TestJSONCarState(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -553,7 +568,8 @@ func TestJSONDashboardPedalFault(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -588,7 +604,8 @@ func TestJSONDashboardSystemTimeoutTest(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -623,7 +640,8 @@ func TestJSONCarSpeed(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -658,7 +676,8 @@ func TestJSONFlightComputerLvBoardDisconnectCounts(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -693,7 +712,8 @@ func TestJSONFlightComputerHvBoardDisconnectCounts(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -728,7 +748,8 @@ func TestJSONFlightComputerInternalState(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -763,7 +784,8 @@ func TestJSONPowerToDrive(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -798,7 +820,8 @@ func TestJSONArrayPower(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -833,7 +856,8 @@ func TestJSONArrayEnergy(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -868,7 +892,8 @@ func TestJSONArrayEnergyReset(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -903,7 +928,8 @@ func TestJSONVisionTurnSignalsCommand(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -938,7 +964,8 @@ func TestJSONVisionBrakeLightsCommand(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -973,7 +1000,8 @@ func TestJSONVisionHeadlightsCommand(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1008,7 +1036,8 @@ func TestJSONVisionHornCommand(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1043,7 +1072,8 @@ func TestJSONVisionArrayLatchesCommand(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1078,7 +1108,8 @@ func TestJSONVisionRearviewCommand(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1113,7 +1144,8 @@ func TestJSONTrackerEnable(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1148,7 +1180,8 @@ func TestJSONDistanceTraveled(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1183,7 +1216,8 @@ func TestJSONChargerState(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1218,7 +1252,8 @@ func TestJSONChargerBmsRequest(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1253,7 +1288,8 @@ func TestJSONChargerCurrentVoltage(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1288,7 +1324,8 @@ func TestJSONChargerPower(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1323,7 +1360,8 @@ func TestJSONThunderstruckControlMessage(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1358,7 +1396,8 @@ func TestJSONVisionStatusFront(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1393,7 +1432,8 @@ func TestJSONVisionStatusRear(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1428,7 +1468,8 @@ func TestJSONLightsFrontId(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1463,7 +1504,8 @@ func TestJSONLightsBackId(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1498,7 +1540,8 @@ func TestJSONVisionId(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1533,7 +1576,8 @@ func TestJSONSteeringPressCount1(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1568,7 +1612,8 @@ func TestJSONSteeringPressCount2(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1603,7 +1648,8 @@ func TestJSONSteeringButtonColors1(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1638,7 +1684,8 @@ func TestJSONSteeringButtonColors2(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1673,7 +1720,8 @@ func TestJSONSteeringHorn(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1708,7 +1756,8 @@ func TestJSONThunderstruckStatusMessage(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1743,7 +1792,8 @@ func TestJSONTrackerData(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1778,7 +1828,8 @@ func TestJSONTritiumMotorDriveL(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1813,7 +1864,8 @@ func TestJSONTritiumMotorPowerL(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1848,7 +1900,8 @@ func TestJSONTritiumResetL(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1883,7 +1936,8 @@ func TestJSONTritiumMotorDriveR(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1918,7 +1972,8 @@ func TestJSONTritiumMotorPowerR(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1953,7 +2008,8 @@ func TestJSONTritiumResetR(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1988,7 +2044,8 @@ func TestJSONBmsAhSet(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2023,7 +2080,8 @@ func TestJSONBmsWhSet(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2058,7 +2116,8 @@ func TestJSONBmsKill(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2093,7 +2152,8 @@ func TestJSONTelemetryRtcReset(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2128,7 +2188,8 @@ func TestJSONWsrIdentification(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2163,7 +2224,8 @@ func TestJSONWsrStatusInformation(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2198,7 +2260,8 @@ func TestJSONWsrBusMeasurement(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2233,7 +2296,8 @@ func TestJSONWsrVelocity(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2268,7 +2332,8 @@ func TestJSONWsrPhaseCurrent(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2303,7 +2368,8 @@ func TestJSONWsrMotorVoltageVector(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2338,7 +2404,8 @@ func TestJSONWsrMotorCurrentVector(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2373,7 +2440,8 @@ func TestJSONWsrMotorBackemf(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2408,7 +2476,8 @@ func TestJSONWsr15165VoltageRail(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2443,7 +2512,8 @@ func TestJSONWsr2512VoltageRail(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2478,7 +2548,8 @@ func TestJSONWsrHeatsinkMotorTemp(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2513,7 +2584,8 @@ func TestJSONWsrDspBoardTemp(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2548,7 +2620,8 @@ func TestJSONWsrReserved(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2583,7 +2656,8 @@ func TestJSONWsrOdometerBusAmphoursMeasurement(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2618,7 +2692,8 @@ func TestJSONWsrSlipSpeedMeasurement(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2653,7 +2728,8 @@ func TestJSONWslIdentification(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2688,7 +2764,8 @@ func TestJSONWslStatusInformation(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2723,7 +2800,8 @@ func TestJSONWslBusMeasurement(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2758,7 +2836,8 @@ func TestJSONWslVelocity(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2793,7 +2872,8 @@ func TestJSONWslPhaseCurrent(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2828,7 +2908,8 @@ func TestJSONWslMotorVoltageVector(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2863,7 +2944,8 @@ func TestJSONWslMotorCurrentVector(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2898,7 +2980,8 @@ func TestJSONWslMotorBackemf(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2933,7 +3016,8 @@ func TestJSONWsl15165VoltageRail(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -2968,7 +3052,8 @@ func TestJSONWsl2512VoltageRail(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -3003,7 +3088,8 @@ func TestJSONWslHeatsinkMotorTemp(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -3038,7 +3124,8 @@ func TestJSONWslDspBoardTemp(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -3073,7 +3160,8 @@ func TestJSONWslOdometerBusAmphoursMeasurement(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -3108,7 +3196,8 @@ func TestJSONWslReserved(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -3143,7 +3232,8 @@ func TestJSONWslSlipSpeedMeasurement(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,8 @@ func TestJSON{{$structName}}(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := FromJson(v.String(), rawData)
|
id, _ := v.CANId()
|
||||||
|
p, err := FromJson(id, rawData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/kschamplin/gotelem/internal/can"
|
"github.com/kschamplin/gotelem"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCanSocket(t *testing.T) {
|
func TestCanSocket(t *testing.T) {
|
||||||
|
@ -43,9 +43,9 @@ func TestCanSocket(t *testing.T) {
|
||||||
defer sock.Close()
|
defer sock.Close()
|
||||||
|
|
||||||
// make a packet.
|
// make a packet.
|
||||||
testFrame := &can.Frame{
|
testFrame := &gotelem.Frame{
|
||||||
Id: can.CanID{Id: 0x123, Extended: false},
|
Id: 0x123,
|
||||||
Kind: can.CanDataFrame,
|
Kind: gotelem.CanSFFFrame,
|
||||||
Data: []byte{0, 1, 2, 3, 4, 5, 6, 7},
|
Data: []byte{0, 1, 2, 3, 4, 5, 6, 7},
|
||||||
}
|
}
|
||||||
err := sock.Send(testFrame)
|
err := sock.Send(testFrame)
|
||||||
|
@ -61,9 +61,9 @@ func TestCanSocket(t *testing.T) {
|
||||||
defer sock.Close()
|
defer sock.Close()
|
||||||
defer rsock.Close()
|
defer rsock.Close()
|
||||||
|
|
||||||
testFrame := &can.Frame{
|
testFrame := &gotelem.Frame{
|
||||||
Id: can.CanID{Id: 0x234, Extended: false},
|
Id: 0x234,
|
||||||
Kind: can.CanDataFrame,
|
Kind: gotelem.CanSFFFrame,
|
||||||
Data: []byte{0, 1, 2, 3, 4, 5, 6, 7},
|
Data: []byte{0, 1, 2, 3, 4, 5, 6, 7},
|
||||||
}
|
}
|
||||||
_ = sock.Send(testFrame)
|
_ = sock.Send(testFrame)
|
||||||
|
|
Loading…
Reference in a new issue