From 52056a7da34a607b6bf23ae6ba825af9375ed733 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 1 Jul 2026 00:20:12 +0100 Subject: [PATCH] updated it to use the latest and greatest API change on bngsdk May have introduce some stupid things, will look at them after --- .gitignore | 1 + go.mod | 4 +- go.sum | 4 +- mockserver/record.go | 23 +++-------- mockserver/replay.go | 33 ++++++++------- mockserver/views.go | 96 ++++++++++++++++++++++---------------------- 6 files changed, 75 insertions(+), 86 deletions(-) diff --git a/.gitignore b/.gitignore index a8a0dce..66391f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.bin +*.work* diff --git a/go.mod b/go.mod index 8a25d8e..02c03cf 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,9 @@ module github.com/ESilva15/BeamNGMockOg -replace github.com/ESilva15/gobngsdk => ../pkg/bngsdk - go 1.23.2 require ( - github.com/ESilva15/gobngsdk v0.0.0-00010101000000-000000000000 + github.com/ESilva15/gobngsdk v1.1.1 github.com/spf13/cobra v1.10.1 ) diff --git a/go.sum b/go.sum index 96b5fc2..4ed9180 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/ESilva15/gobngsdk v0.0.2 h1:N6stNOE14Wg80BAZMFu/Qd9Qa/J0DmExCfdPoDf7lco= -github.com/ESilva15/gobngsdk v0.0.2/go.mod h1:cKLaZRgM0tGGXDvosaSjHnxeyC5Y6rg7zCLqEUJnOzw= +github.com/ESilva15/gobngsdk v1.1.1 h1:MyKUjIqG77lYcUY6cnZpnnxPoxS/FdAYwGoi6InXan0= +github.com/ESilva15/gobngsdk v1.1.1/go.mod h1:cKLaZRgM0tGGXDvosaSjHnxeyC5Y6rg7zCLqEUJnOzw= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= diff --git a/mockserver/record.go b/mockserver/record.go index 5cb486a..72dda92 100644 --- a/mockserver/record.go +++ b/mockserver/record.go @@ -1,7 +1,6 @@ package mockserver import ( - "bytes" "context" "encoding/binary" "fmt" @@ -15,7 +14,7 @@ import ( type recorderViewData struct { TotalBytes int - Data []byte + SDK *bngsdk.BeamNGSDK } type Recorder struct { @@ -80,8 +79,6 @@ func (r *Recorder) record(ctx context.Context) { func (r *Recorder) view(ctx context.Context) { var s strings.Builder var nBytes int - var bytesReader bytes.Reader - og := bngsdk.Outgauge{} for { select { @@ -91,22 +88,13 @@ func (r *Recorder) view(ctx context.Context) { s.Reset() fmt.Fprintf(os.Stdout, "\x1b[2J\x1b[H") - r.viewDataMut.RLock() - nBytes = viewData.TotalBytes - r.viewDataMut.RUnlock() - stringifyRecordingProgress(&s, nBytes) fmt.Fprintf(&s, "\n\n") - bytesReader.Reset(viewData.Data) - err := binary.Read(&bytesReader, binary.LittleEndian, &og) - if err != nil { - fmt.Fprintf(&s, "\n\nFAILED TO PARSE DATA\nError: %+v\n\n", err) - fmt.Fprint(os.Stdout, s.String()) - continue - } - - stringifyOutgaugeData(&s, &og) + r.viewDataMut.RLock() + nBytes = viewData.TotalBytes + stringifyOutgaugeData(&s, &r.SDK) + r.viewDataMut.RUnlock() fmt.Fprint(os.Stdout, s.String()) } @@ -132,7 +120,6 @@ func (r *Recorder) Record(ctx context.Context) error { } r.viewData.TotalBytes = r.TotalBytes - r.viewData.Data = r.SDK.Buffer // Send the data to the view select { diff --git a/mockserver/replay.go b/mockserver/replay.go index 668a08b..778a1aa 100644 --- a/mockserver/replay.go +++ b/mockserver/replay.go @@ -18,13 +18,14 @@ import ( ) type ViewData struct { - Data []byte + SDK *bngsdk.BeamNGSDK SizeRead int64 } // Replayer does the replaying // Should we make a "player" struct that can record and replay? type Replayer struct { + SDK bngsdk.BeamNGSDK DataSourcePath string Socket *UDPTransport @@ -33,8 +34,7 @@ type Replayer struct { socketCh chan []byte // Mut - mut sync.RWMutex - data []byte + mut sync.RWMutex // View viewData ViewData @@ -48,11 +48,14 @@ func NewReplayer(address string, port int, fp string) (*Replayer, error) { replayer := &Replayer{ DataSourcePath: fp, - Socket: udp, - data: make([]byte, unsafe.Sizeof(bngsdk.Outgauge{})), - viewData: ViewData{}, - dataViewCh: make(chan ViewData, 1), - socketCh: make(chan []byte, 1), + SDK: bngsdk.BeamNGSDK{ + Data: &bngsdk.Outgauge{}, + Buffer: make([]byte, unsafe.Sizeof(bngsdk.Outgauge{})), + }, + Socket: udp, + viewData: ViewData{}, + dataViewCh: make(chan ViewData, 1), + socketCh: make(chan []byte, 1), } return replayer, nil @@ -69,7 +72,6 @@ func (r *Replayer) renderToTerminal(ctx context.Context) { // NOTE: temporary until I make a better view var s strings.Builder var bytesReader bytes.Reader - og := bngsdk.Outgauge{} for { select { @@ -80,8 +82,8 @@ func (r *Replayer) renderToTerminal(ctx context.Context) { s.Reset() fmt.Fprintf(os.Stdout, "\x1b[2J\x1b[H") - bytesReader.Reset(data.Data) - err := binary.Read(&bytesReader, binary.LittleEndian, &og) + bytesReader.Reset(data.SDK.Buffer) + err := binary.Read(&bytesReader, binary.LittleEndian, r.SDK.Data) if err != nil { fmt.Fprintf(&s, "FAILED TO PARSE DATA\nError: %+v", err) fmt.Fprint(os.Stdout, s.String()) @@ -91,7 +93,7 @@ func (r *Replayer) renderToTerminal(ctx context.Context) { percent := int(float64(data.SizeRead) / float64(fileInfo.Size()) * 100) fmt.Fprintf(&s, "Replayed: %d%%\n", percent) - stringifyOutgaugeData(&s, &og) + stringifyOutgaugeData(&s, data.SDK) fmt.Fprint(os.Stdout, s.String()) } @@ -139,7 +141,7 @@ func (r *Replayer) Replay(ctx context.Context, loop bool) error { case <-ticker.C: r.mut.Lock() - err := reader.Next(r.data) + err := reader.Next(r.SDK.Buffer) r.mut.Unlock() if err == io.EOF { @@ -159,7 +161,8 @@ func (r *Replayer) Replay(ctx context.Context, loop bool) error { return err } - r.viewData.Data = r.data + // NOTE: Really like this??? + r.viewData.SDK = &r.SDK r.viewData.SizeRead = reader.TotalRead // Send the data to the view @@ -172,7 +175,7 @@ func (r *Replayer) Replay(ctx context.Context, loop bool) error { // Send the data to the UDP socket select { - case r.socketCh <- r.data: + case r.socketCh <- r.SDK.Buffer: // Sent the data default: // Dropped the frame! diff --git a/mockserver/views.go b/mockserver/views.go index 809516e..e943b38 100644 --- a/mockserver/views.go +++ b/mockserver/views.go @@ -26,64 +26,64 @@ func stringifyRecordingProgress(s *strings.Builder, nBytes int) { } } -func stringifyOutgaugeData(s *strings.Builder, og *bngsdk.Outgauge) { +func stringifyOutgaugeData(s *strings.Builder, sdk *bngsdk.BeamNGSDK) { // NOTE: write a string serialization function on the SDK itself fmt.Fprint(s, "Outgauge {\n") - fmt.Fprintf(s, " Time: %d ms\n", og.Time) - fmt.Fprintf(s, " Car: %s\n", og.Car) - fmt.Fprintf(s, " Flags: %b\n", og.Flags) - fmt.Fprintf(s, " Gear: %d\n", og.Gear) - fmt.Fprintf(s, " Plid: %d\n", og.Plid) - fmt.Fprintf(s, " Speed: %f m/s\n", og.Speed) - fmt.Fprintf(s, " RPM: %f RPM\n", og.RPM) - fmt.Fprintf(s, " Turbo: %f Bar\n", og.Turbo) - fmt.Fprintf(s, " EngTemp: %f °C\n", og.EngTemp) - fmt.Fprintf(s, " Fuel: %f\n", og.Fuel) - fmt.Fprintf(s, " OilPressure: %f Bar\n", og.OilPressure) - fmt.Fprintf(s, " OilTemp: %f °C\n", og.OilTemp) - fmt.Fprintf(s, " DashLights: %b\n", og.DashLights) - fmt.Fprintf(s, " ShowLights: %b\n", og.ShowLights) - fmt.Fprintf(s, " Throttle: %f\n", og.Throttle) - fmt.Fprintf(s, " Brakes: %f\n", og.Brake) - fmt.Fprintf(s, " Clutch: %f\n", og.Clutch) - fmt.Fprintf(s, " Display1: %s\n", og.Display1) - fmt.Fprintf(s, " Display2: %s\n", og.Display2) - fmt.Fprintf(s, " ID: %d\n", og.Display2) + fmt.Fprintf(s, " Time: %d ms\n", sdk.Data.Time) + fmt.Fprintf(s, " Car: %s\n", sdk.Data.Car) + fmt.Fprintf(s, " Flags: %b\n", sdk.Data.Flags) + fmt.Fprintf(s, " Gear: %d\n", sdk.Data.Gear) + fmt.Fprintf(s, " Plid: %d\n", sdk.Data.Plid) + fmt.Fprintf(s, " Speed: %f m/s\n", sdk.Data.Speed) + fmt.Fprintf(s, " RPM: %f RPM\n", sdk.Data.RPM) + fmt.Fprintf(s, " Turbo: %f Bar\n", sdk.Data.Turbo) + fmt.Fprintf(s, " EngTemp: %f °C\n", sdk.Data.EngTemp) + fmt.Fprintf(s, " Fuel: %f\n", sdk.Data.Fuel) + fmt.Fprintf(s, " OilPressure: %f Bar\n", sdk.Data.OilPressure) + fmt.Fprintf(s, " OilTemp: %f °C\n", sdk.Data.OilTemp) + fmt.Fprintf(s, " DashLights: %b\n", sdk.Data.DashLights) + fmt.Fprintf(s, " ShowLights: %b\n", sdk.Data.ShowLights) + fmt.Fprintf(s, " Throttle: %f\n", sdk.Data.Throttle) + fmt.Fprintf(s, " Brakes: %f\n", sdk.Data.Brake) + fmt.Fprintf(s, " Clutch: %f\n", sdk.Data.Clutch) + fmt.Fprintf(s, " Display1: %s\n", sdk.Data.Display1) + fmt.Fprintf(s, " Display2: %s\n", sdk.Data.Display2) + fmt.Fprintf(s, " ID: %d\n", sdk.Data.ID) fmt.Fprint(s, "}\n\n") fmt.Fprint(s, "DashLights {\n") - fmt.Fprintf(s, " DL_SHIFT: %t\n", og.DashLights&bngsdk.DL_SHIFT != 0) - fmt.Fprintf(s, " DL_FULLBEAM: %t\n", og.DashLights&bngsdk.DL_FULLBEAM != 0) - fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", og.DashLights&bngsdk.DL_HANDBRAKE != 0) - fmt.Fprintf(s, " DL_PITSPEED: %t\n", og.DashLights&bngsdk.DL_PITSPEED != 0) - fmt.Fprintf(s, " DL_TC: %t\n", og.DashLights&bngsdk.DL_TC != 0) - fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", og.DashLights&bngsdk.DL_SIGNAL_L != 0) - fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", og.DashLights&bngsdk.DL_SIGNAL_R != 0) - fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", og.DashLights&bngsdk.DL_SIGNAL_ANY != 0) - fmt.Fprintf(s, " DL_OILWARN: %t\n", og.DashLights&bngsdk.DL_OILWARN != 0) - fmt.Fprintf(s, " DL_BATTERY: %t\n", og.DashLights&bngsdk.DL_BATTERY != 0) - fmt.Fprintf(s, " DL_ABS: %t\n", og.DashLights&bngsdk.DL_ABS != 0) - fmt.Fprintf(s, " DL_SPARE: %t\n", og.DashLights&bngsdk.DL_SPARE != 0) + fmt.Fprintf(s, " DL_SHIFT: %t\n", sdk.HasShiftLight()) + fmt.Fprintf(s, " DL_FULLBEAM: %t\n", sdk.HasHighBeamLight()) + fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", sdk.HasHandbrakeLight()) + fmt.Fprintf(s, " DL_PITSPEED: %t\n", sdk.HasPitspeed()) + fmt.Fprintf(s, " DL_TC: %t\n", sdk.HasTractionControlLight()) + fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", sdk.HasLeftIndicatorLight()) + fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", sdk.HasRightIndicatorLight()) + fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", sdk.HasAnyIndicatorLight()) + fmt.Fprintf(s, " DL_OILWARN: %t\n", sdk.HasOilLight()) + fmt.Fprintf(s, " DL_BATTERY: %t\n", sdk.HasBatteryLight()) + fmt.Fprintf(s, " DL_ABS: %t\n", sdk.HasABSLight()) + fmt.Fprintf(s, " DL_SPARE: %t\n", sdk.Data.DashLights&bngsdk.DL_SPARE != 0) fmt.Fprint(s, "}\n\n") fmt.Fprint(s, "ShowLights {\n") // Fixed typo "ShowLigths" - fmt.Fprintf(s, " DL_SHIFT: %t\n", og.ShowLights&bngsdk.DL_SHIFT != 0) - fmt.Fprintf(s, " DL_FULLBEAM: %t\n", og.ShowLights&bngsdk.DL_FULLBEAM != 0) - fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", og.ShowLights&bngsdk.DL_HANDBRAKE != 0) - fmt.Fprintf(s, " DL_PITSPEED: %t\n", og.ShowLights&bngsdk.DL_PITSPEED != 0) - fmt.Fprintf(s, " DL_TC: %t\n", og.ShowLights&bngsdk.DL_TC != 0) - fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", og.ShowLights&bngsdk.DL_SIGNAL_L != 0) - fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", og.ShowLights&bngsdk.DL_SIGNAL_R != 0) - fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", og.ShowLights&bngsdk.DL_SIGNAL_ANY != 0) - fmt.Fprintf(s, " DL_OILWARN: %t\n", og.ShowLights&bngsdk.DL_OILWARN != 0) - fmt.Fprintf(s, " DL_BATTERY: %t\n", og.ShowLights&bngsdk.DL_BATTERY != 0) - fmt.Fprintf(s, " DL_ABS: %t\n", og.ShowLights&bngsdk.DL_ABS != 0) - fmt.Fprintf(s, " DL_SPARE: %t\n", og.ShowLights&bngsdk.DL_SPARE != 0) + fmt.Fprintf(s, " DL_SHIFT: %t\n", sdk.ShiftLight()) + fmt.Fprintf(s, " DL_FULLBEAM: %t\n", sdk.HighBeam()) + fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", sdk.Handbrake()) + fmt.Fprintf(s, " DL_PITSPEED: %t\n", sdk.Pitspeed()) + fmt.Fprintf(s, " DL_TC: %t\n", sdk.TractionControl()) + fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", sdk.LeftIndicator()) + fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", sdk.RightIndicator()) + fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", sdk.AnyIndicator()) + fmt.Fprintf(s, " DL_OILWARN: %t\n", sdk.OilLight()) + fmt.Fprintf(s, " DL_BATTERY: %t\n", sdk.BatteryLight()) + fmt.Fprintf(s, " DL_ABS: %t\n", sdk.ABS()) + fmt.Fprintf(s, " DL_SPARE: %t\n", sdk.Data.ShowLights&bngsdk.DL_SPARE != 0) fmt.Fprint(s, "}\n\n") fmt.Fprint(s, "Flags {\n") - fmt.Fprintf(s, " OG_TURBO (Has Turbo): %t\n", og.Flags&bngsdk.OG_TURBO != 0) - fmt.Fprintf(s, " OG_KM (Is Metric): %t\n", og.Flags&bngsdk.OG_KM != 0) - fmt.Fprintf(s, " OG_BAR (Pressure): %t\n", og.Flags&bngsdk.OG_BAR != 0) + fmt.Fprintf(s, " OG_TURBO (Has Turbo): %t\n", sdk.HasTurbo()) + fmt.Fprintf(s, " OG_KM (Is Metric): %t\n", sdk.PrefersKm()) + fmt.Fprintf(s, " OG_BAR (Pressure): %t\n", sdk.PrefersBAR()) fmt.Fprint(s, "}") }