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 *.bin
*.work*
+1 -3
View File
@@ -1,11 +1,9 @@
module github.com/ESilva15/BeamNGMockOg module github.com/ESilva15/BeamNGMockOg
replace github.com/ESilva15/gobngsdk => ../pkg/bngsdk
go 1.23.2 go 1.23.2
require ( require (
github.com/ESilva15/gobngsdk v0.0.0-00010101000000-000000000000 github.com/ESilva15/gobngsdk v1.1.1
github.com/spf13/cobra v1.10.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 v1.1.1 h1:MyKUjIqG77lYcUY6cnZpnnxPoxS/FdAYwGoi6InXan0=
github.com/ESilva15/gobngsdk v0.0.2/go.mod h1:cKLaZRgM0tGGXDvosaSjHnxeyC5Y6rg7zCLqEUJnOzw= 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/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 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+5 -18
View File
@@ -1,7 +1,6 @@
package mockserver package mockserver
import ( import (
"bytes"
"context" "context"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
@@ -15,7 +14,7 @@ import (
type recorderViewData struct { type recorderViewData struct {
TotalBytes int TotalBytes int
Data []byte SDK *bngsdk.BeamNGSDK
} }
type Recorder struct { type Recorder struct {
@@ -80,8 +79,6 @@ func (r *Recorder) record(ctx context.Context) {
func (r *Recorder) view(ctx context.Context) { func (r *Recorder) view(ctx context.Context) {
var s strings.Builder var s strings.Builder
var nBytes int var nBytes int
var bytesReader bytes.Reader
og := bngsdk.Outgauge{}
for { for {
select { select {
@@ -91,22 +88,13 @@ func (r *Recorder) view(ctx context.Context) {
s.Reset() s.Reset()
fmt.Fprintf(os.Stdout, "\x1b[2J\x1b[H") fmt.Fprintf(os.Stdout, "\x1b[2J\x1b[H")
r.viewDataMut.RLock()
nBytes = viewData.TotalBytes
r.viewDataMut.RUnlock()
stringifyRecordingProgress(&s, nBytes) stringifyRecordingProgress(&s, nBytes)
fmt.Fprintf(&s, "\n\n") fmt.Fprintf(&s, "\n\n")
bytesReader.Reset(viewData.Data) r.viewDataMut.RLock()
err := binary.Read(&bytesReader, binary.LittleEndian, &og) nBytes = viewData.TotalBytes
if err != nil { stringifyOutgaugeData(&s, &r.SDK)
fmt.Fprintf(&s, "\n\nFAILED TO PARSE DATA\nError: %+v\n\n", err) r.viewDataMut.RUnlock()
fmt.Fprint(os.Stdout, s.String())
continue
}
stringifyOutgaugeData(&s, &og)
fmt.Fprint(os.Stdout, s.String()) 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.TotalBytes = r.TotalBytes
r.viewData.Data = r.SDK.Buffer
// Send the data to the view // Send the data to the view
select { select {
+18 -15
View File
@@ -18,13 +18,14 @@ import (
) )
type ViewData struct { type ViewData struct {
Data []byte SDK *bngsdk.BeamNGSDK
SizeRead int64 SizeRead int64
} }
// Replayer does the replaying // Replayer does the replaying
// Should we make a "player" struct that can record and replay? // Should we make a "player" struct that can record and replay?
type Replayer struct { type Replayer struct {
SDK bngsdk.BeamNGSDK
DataSourcePath string DataSourcePath string
Socket *UDPTransport Socket *UDPTransport
@@ -33,8 +34,7 @@ type Replayer struct {
socketCh chan []byte socketCh chan []byte
// Mut // Mut
mut sync.RWMutex mut sync.RWMutex
data []byte
// View // View
viewData ViewData viewData ViewData
@@ -48,11 +48,14 @@ func NewReplayer(address string, port int, fp string) (*Replayer, error) {
replayer := &Replayer{ replayer := &Replayer{
DataSourcePath: fp, DataSourcePath: fp,
Socket: udp, SDK: bngsdk.BeamNGSDK{
data: make([]byte, unsafe.Sizeof(bngsdk.Outgauge{})), Data: &bngsdk.Outgauge{},
viewData: ViewData{}, Buffer: make([]byte, unsafe.Sizeof(bngsdk.Outgauge{})),
dataViewCh: make(chan ViewData, 1), },
socketCh: make(chan []byte, 1), Socket: udp,
viewData: ViewData{},
dataViewCh: make(chan ViewData, 1),
socketCh: make(chan []byte, 1),
} }
return replayer, nil return replayer, nil
@@ -69,7 +72,6 @@ func (r *Replayer) renderToTerminal(ctx context.Context) {
// NOTE: temporary until I make a better view // NOTE: temporary until I make a better view
var s strings.Builder var s strings.Builder
var bytesReader bytes.Reader var bytesReader bytes.Reader
og := bngsdk.Outgauge{}
for { for {
select { select {
@@ -80,8 +82,8 @@ func (r *Replayer) renderToTerminal(ctx context.Context) {
s.Reset() s.Reset()
fmt.Fprintf(os.Stdout, "\x1b[2J\x1b[H") fmt.Fprintf(os.Stdout, "\x1b[2J\x1b[H")
bytesReader.Reset(data.Data) bytesReader.Reset(data.SDK.Buffer)
err := binary.Read(&bytesReader, binary.LittleEndian, &og) err := binary.Read(&bytesReader, binary.LittleEndian, r.SDK.Data)
if err != nil { if err != nil {
fmt.Fprintf(&s, "FAILED TO PARSE DATA\nError: %+v", err) fmt.Fprintf(&s, "FAILED TO PARSE DATA\nError: %+v", err)
fmt.Fprint(os.Stdout, s.String()) 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) percent := int(float64(data.SizeRead) / float64(fileInfo.Size()) * 100)
fmt.Fprintf(&s, "Replayed: %d%%\n", percent) fmt.Fprintf(&s, "Replayed: %d%%\n", percent)
stringifyOutgaugeData(&s, &og) stringifyOutgaugeData(&s, data.SDK)
fmt.Fprint(os.Stdout, s.String()) fmt.Fprint(os.Stdout, s.String())
} }
@@ -139,7 +141,7 @@ func (r *Replayer) Replay(ctx context.Context, loop bool) error {
case <-ticker.C: case <-ticker.C:
r.mut.Lock() r.mut.Lock()
err := reader.Next(r.data) err := reader.Next(r.SDK.Buffer)
r.mut.Unlock() r.mut.Unlock()
if err == io.EOF { if err == io.EOF {
@@ -159,7 +161,8 @@ func (r *Replayer) Replay(ctx context.Context, loop bool) error {
return err return err
} }
r.viewData.Data = r.data // NOTE: Really like this???
r.viewData.SDK = &r.SDK
r.viewData.SizeRead = reader.TotalRead r.viewData.SizeRead = reader.TotalRead
// Send the data to the view // 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 // Send the data to the UDP socket
select { select {
case r.socketCh <- r.data: case r.socketCh <- r.SDK.Buffer:
// Sent the data // Sent the data
default: default:
// Dropped the frame! // 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 // NOTE: write a string serialization function on the SDK itself
fmt.Fprint(s, "Outgauge {\n") fmt.Fprint(s, "Outgauge {\n")
fmt.Fprintf(s, " Time: %d ms\n", og.Time) fmt.Fprintf(s, " Time: %d ms\n", sdk.Data.Time)
fmt.Fprintf(s, " Car: %s\n", og.Car) fmt.Fprintf(s, " Car: %s\n", sdk.Data.Car)
fmt.Fprintf(s, " Flags: %b\n", og.Flags) fmt.Fprintf(s, " Flags: %b\n", sdk.Data.Flags)
fmt.Fprintf(s, " Gear: %d\n", og.Gear) fmt.Fprintf(s, " Gear: %d\n", sdk.Data.Gear)
fmt.Fprintf(s, " Plid: %d\n", og.Plid) fmt.Fprintf(s, " Plid: %d\n", sdk.Data.Plid)
fmt.Fprintf(s, " Speed: %f m/s\n", og.Speed) fmt.Fprintf(s, " Speed: %f m/s\n", sdk.Data.Speed)
fmt.Fprintf(s, " RPM: %f RPM\n", og.RPM) fmt.Fprintf(s, " RPM: %f RPM\n", sdk.Data.RPM)
fmt.Fprintf(s, " Turbo: %f Bar\n", og.Turbo) fmt.Fprintf(s, " Turbo: %f Bar\n", sdk.Data.Turbo)
fmt.Fprintf(s, " EngTemp: %f °C\n", og.EngTemp) fmt.Fprintf(s, " EngTemp: %f °C\n", sdk.Data.EngTemp)
fmt.Fprintf(s, " Fuel: %f\n", og.Fuel) fmt.Fprintf(s, " Fuel: %f\n", sdk.Data.Fuel)
fmt.Fprintf(s, " OilPressure: %f Bar\n", og.OilPressure) fmt.Fprintf(s, " OilPressure: %f Bar\n", sdk.Data.OilPressure)
fmt.Fprintf(s, " OilTemp: %f °C\n", og.OilTemp) fmt.Fprintf(s, " OilTemp: %f °C\n", sdk.Data.OilTemp)
fmt.Fprintf(s, " DashLights: %b\n", og.DashLights) fmt.Fprintf(s, " DashLights: %b\n", sdk.Data.DashLights)
fmt.Fprintf(s, " ShowLights: %b\n", og.ShowLights) fmt.Fprintf(s, " ShowLights: %b\n", sdk.Data.ShowLights)
fmt.Fprintf(s, " Throttle: %f\n", og.Throttle) fmt.Fprintf(s, " Throttle: %f\n", sdk.Data.Throttle)
fmt.Fprintf(s, " Brakes: %f\n", og.Brake) fmt.Fprintf(s, " Brakes: %f\n", sdk.Data.Brake)
fmt.Fprintf(s, " Clutch: %f\n", og.Clutch) fmt.Fprintf(s, " Clutch: %f\n", sdk.Data.Clutch)
fmt.Fprintf(s, " Display1: %s\n", og.Display1) fmt.Fprintf(s, " Display1: %s\n", sdk.Data.Display1)
fmt.Fprintf(s, " Display2: %s\n", og.Display2) fmt.Fprintf(s, " Display2: %s\n", sdk.Data.Display2)
fmt.Fprintf(s, " ID: %d\n", og.Display2) fmt.Fprintf(s, " ID: %d\n", sdk.Data.ID)
fmt.Fprint(s, "}\n\n") fmt.Fprint(s, "}\n\n")
fmt.Fprint(s, "DashLights {\n") fmt.Fprint(s, "DashLights {\n")
fmt.Fprintf(s, " DL_SHIFT: %t\n", og.DashLights&bngsdk.DL_SHIFT != 0) fmt.Fprintf(s, " DL_SHIFT: %t\n", sdk.HasShiftLight())
fmt.Fprintf(s, " DL_FULLBEAM: %t\n", og.DashLights&bngsdk.DL_FULLBEAM != 0) fmt.Fprintf(s, " DL_FULLBEAM: %t\n", sdk.HasHighBeamLight())
fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", og.DashLights&bngsdk.DL_HANDBRAKE != 0) fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", sdk.HasHandbrakeLight())
fmt.Fprintf(s, " DL_PITSPEED: %t\n", og.DashLights&bngsdk.DL_PITSPEED != 0) fmt.Fprintf(s, " DL_PITSPEED: %t\n", sdk.HasPitspeed())
fmt.Fprintf(s, " DL_TC: %t\n", og.DashLights&bngsdk.DL_TC != 0) fmt.Fprintf(s, " DL_TC: %t\n", sdk.HasTractionControlLight())
fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", og.DashLights&bngsdk.DL_SIGNAL_L != 0) fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", sdk.HasLeftIndicatorLight())
fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", og.DashLights&bngsdk.DL_SIGNAL_R != 0) fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", sdk.HasRightIndicatorLight())
fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", og.DashLights&bngsdk.DL_SIGNAL_ANY != 0) fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", sdk.HasAnyIndicatorLight())
fmt.Fprintf(s, " DL_OILWARN: %t\n", og.DashLights&bngsdk.DL_OILWARN != 0) fmt.Fprintf(s, " DL_OILWARN: %t\n", sdk.HasOilLight())
fmt.Fprintf(s, " DL_BATTERY: %t\n", og.DashLights&bngsdk.DL_BATTERY != 0) fmt.Fprintf(s, " DL_BATTERY: %t\n", sdk.HasBatteryLight())
fmt.Fprintf(s, " DL_ABS: %t\n", og.DashLights&bngsdk.DL_ABS != 0) fmt.Fprintf(s, " DL_ABS: %t\n", sdk.HasABSLight())
fmt.Fprintf(s, " DL_SPARE: %t\n", og.DashLights&bngsdk.DL_SPARE != 0) fmt.Fprintf(s, " DL_SPARE: %t\n", sdk.Data.DashLights&bngsdk.DL_SPARE != 0)
fmt.Fprint(s, "}\n\n") fmt.Fprint(s, "}\n\n")
fmt.Fprint(s, "ShowLights {\n") // Fixed typo "ShowLigths" 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_SHIFT: %t\n", sdk.ShiftLight())
fmt.Fprintf(s, " DL_FULLBEAM: %t\n", og.ShowLights&bngsdk.DL_FULLBEAM != 0) fmt.Fprintf(s, " DL_FULLBEAM: %t\n", sdk.HighBeam())
fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", og.ShowLights&bngsdk.DL_HANDBRAKE != 0) fmt.Fprintf(s, " DL_HANDBRAKE: %t\n", sdk.Handbrake())
fmt.Fprintf(s, " DL_PITSPEED: %t\n", og.ShowLights&bngsdk.DL_PITSPEED != 0) fmt.Fprintf(s, " DL_PITSPEED: %t\n", sdk.Pitspeed())
fmt.Fprintf(s, " DL_TC: %t\n", og.ShowLights&bngsdk.DL_TC != 0) fmt.Fprintf(s, " DL_TC: %t\n", sdk.TractionControl())
fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", og.ShowLights&bngsdk.DL_SIGNAL_L != 0) fmt.Fprintf(s, " DL_SIGNAL_L: %t\n", sdk.LeftIndicator())
fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", og.ShowLights&bngsdk.DL_SIGNAL_R != 0) fmt.Fprintf(s, " DL_SIGNAL_R: %t\n", sdk.RightIndicator())
fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", og.ShowLights&bngsdk.DL_SIGNAL_ANY != 0) fmt.Fprintf(s, " DL_SIGNAL_ANY: %t\n", sdk.AnyIndicator())
fmt.Fprintf(s, " DL_OILWARN: %t\n", og.ShowLights&bngsdk.DL_OILWARN != 0) fmt.Fprintf(s, " DL_OILWARN: %t\n", sdk.OilLight())
fmt.Fprintf(s, " DL_BATTERY: %t\n", og.ShowLights&bngsdk.DL_BATTERY != 0) fmt.Fprintf(s, " DL_BATTERY: %t\n", sdk.BatteryLight())
fmt.Fprintf(s, " DL_ABS: %t\n", og.ShowLights&bngsdk.DL_ABS != 0) fmt.Fprintf(s, " DL_ABS: %t\n", sdk.ABS())
fmt.Fprintf(s, " DL_SPARE: %t\n", og.ShowLights&bngsdk.DL_SPARE != 0) fmt.Fprintf(s, " DL_SPARE: %t\n", sdk.Data.ShowLights&bngsdk.DL_SPARE != 0)
fmt.Fprint(s, "}\n\n") fmt.Fprint(s, "}\n\n")
fmt.Fprint(s, "Flags {\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_TURBO (Has Turbo): %t\n", sdk.HasTurbo())
fmt.Fprintf(s, " OG_KM (Is Metric): %t\n", og.Flags&bngsdk.OG_KM != 0) fmt.Fprintf(s, " OG_KM (Is Metric): %t\n", sdk.PrefersKm())
fmt.Fprintf(s, " OG_BAR (Pressure): %t\n", og.Flags&bngsdk.OG_BAR != 0) fmt.Fprintf(s, " OG_BAR (Pressure): %t\n", sdk.PrefersBAR())
fmt.Fprint(s, "}") fmt.Fprint(s, "}")
} }