1 Commits
Author SHA1 Message Date
esilva 52056a7da3 updated it to use the latest and greatest API change on bngsdk
May have introduce some stupid things, will look at them after
2026-07-01 00:20:12 +01:00
6 changed files with 75 additions and 86 deletions
+1
View File
@@ -1 +1,2 @@
*.bin
*.work*
+1 -3
View File
@@ -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
)
+2 -2
View File
@@ -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=
+5 -18
View File
@@ -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 {
+18 -15
View File
@@ -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!
+48 -48
View File
@@ -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, "}")
}