diff --git a/providers/beamng/beamng.go b/providers/beamng/beamng.go index 2bd2f4d..58e245c 100644 --- a/providers/beamng/beamng.go +++ b/providers/beamng/beamng.go @@ -20,6 +20,7 @@ type BeamNG struct { logger *slog.Logger SDK *bngsdk.BeamNGSDK + og *bngsdk.Outgauge // data handling mut sync.Mutex @@ -38,22 +39,18 @@ const ( NAME = "BeamNG.drive" ) -func NewBeamNGProvider(ip string, port int, newLogger *slog.Logger) (*BeamNG, error) { - beam, err := bngsdk.NewBngSDK(bngsdk.Options{ - Logger: newLogger.With("TelemetrySDK", "BeamNG"), - SourceType: bngsdk.UDPData, - ImportUDPAddress: "127.0.0.1", - ImportUDPPort: 4444, - }) +func NewBeamNGProvider(logger *slog.Logger, opts *bngsdk.Options) (*BeamNG, error) { + beam, err := bngsdk.NewBngSDK(*opts) if err != nil { return &BeamNG{}, err } provider := &BeamNG{ - logger: newLogger.With("TelemetryProvider", "BeamNG"), + logger: logger.With("TelemetryProvider", NAME), streamCh: make(chan telemetry.TelemetryData, 1), data: telemetry.NewTelemetryData(), SDK: beam, + og: &bngsdk.Outgauge{}, ticker: time.NewTicker(time.Second / 60), } @@ -164,7 +161,7 @@ func (b *BeamNG) Subscribe(requestFields map[int16]telemetry.FieldID) { func (b *BeamNG) readData() { slog.Debug("READING THIS DATA") // BUG: getting stuck in here - _, err := b.SDK.Update() + ogSnapshot, err := b.SDK.Update() slog.Debug("THE DATA WAS READ") if err != nil { slog.Error("Error getting data", "error", err) @@ -172,6 +169,7 @@ func (b *BeamNG) readData() { } b.mut.Lock() + b.og = ogSnapshot defer b.mut.Unlock() // Read 1 to 1 data diff --git a/providers/beamng/transforms.go b/providers/beamng/transforms.go index ee751b8..e56fba1 100644 --- a/providers/beamng/transforms.go +++ b/providers/beamng/transforms.go @@ -18,34 +18,34 @@ func (b *BeamNG) unused(out *telemetry.TelemetryField) { func (b *BeamNG) updateSpeed(out *telemetry.TelemetryField) { out.Type = telemetry.DataTypeUINT16 - out.Raw = uint64(conv.MsToKph(b.SDK.Data.Speed)) + out.Raw = uint64(conv.MsToKph(b.og.Speed)) } func (b *BeamNG) updateGear(out *telemetry.TelemetryField) { out.Type = telemetry.DataTypeSTRING // NOTE: stupid idea but we can cache these values - out.Str = strconv.Itoa(int(b.SDK.Data.Gear)) + out.Str = strconv.Itoa(int(b.og.Gear)) } func (b *BeamNG) updateRPM(out *telemetry.TelemetryField) { out.Type = telemetry.DataTypeUINT16 - out.Raw = uint64(uint16(b.SDK.Data.RPM)) + out.Raw = uint64(uint16(b.og.RPM)) } func (b *BeamNG) fuelLevel(out *telemetry.TelemetryField) { - telemetry.FloatToStringTransform(b.SDK.Data.Fuel, out) + telemetry.FloatToStringTransform(b.og.Fuel, out) } func (b *BeamNG) oilPressure(out *telemetry.TelemetryField) { - telemetry.FloatToStringTransform(b.SDK.Data.OilPressure, out) + telemetry.FloatToStringTransform(b.og.OilPressure, out) } func (b *BeamNG) oilTemp(out *telemetry.TelemetryField) { - telemetry.FloatToStringTransform(b.SDK.Data.OilTemp, out) + telemetry.FloatToStringTransform(b.og.OilTemp, out) } func (b *BeamNG) engTemp(out *telemetry.TelemetryField) { - telemetry.FloatToStringTransform(b.SDK.Data.EngTemp, out) + telemetry.FloatToStringTransform(b.og.EngTemp, out) } // NOTE: find how to empty this @@ -54,7 +54,7 @@ func (b *BeamNG) pitSpeedLimiter(out *telemetry.TelemetryField) { func (b *BeamNG) leftIndicator(out *telemetry.TelemetryField) { chr := ' ' - if b.SDK.LeftIndicator() { + if b.og.LeftIndicator() { chr = '<' } @@ -64,7 +64,7 @@ func (b *BeamNG) leftIndicator(out *telemetry.TelemetryField) { func (b *BeamNG) rightIndicator(out *telemetry.TelemetryField) { chr := ' ' - if b.SDK.RightIndicator() { + if b.og.RightIndicator() { chr = '>' } @@ -74,7 +74,7 @@ func (b *BeamNG) rightIndicator(out *telemetry.TelemetryField) { func (b *BeamNG) absLight(out *telemetry.TelemetryField) { chr := ' ' - if b.SDK.ABS() { + if b.og.ABS() { chr = 'A' } @@ -84,7 +84,7 @@ func (b *BeamNG) absLight(out *telemetry.TelemetryField) { func (b *BeamNG) handbrakeLight(out *telemetry.TelemetryField) { chr := ' ' - if b.SDK.Handbrake() { + if b.og.Handbrake() { chr = 'P' } @@ -94,7 +94,7 @@ func (b *BeamNG) handbrakeLight(out *telemetry.TelemetryField) { func (b *BeamNG) tcLight(out *telemetry.TelemetryField) { chr := ' ' - if b.SDK.TractionControl() { + if b.og.TractionControl() { chr = 'T' } @@ -104,7 +104,7 @@ func (b *BeamNG) tcLight(out *telemetry.TelemetryField) { func (b *BeamNG) batteryLight(out *telemetry.TelemetryField) { chr := ' ' - if b.SDK.BatteryLight() { + if b.og.BatteryLight() { chr = 'B' } diff --git a/providers/providers.go b/providers/providers.go index a4dc180..00f0f08 100644 --- a/providers/providers.go +++ b/providers/providers.go @@ -8,6 +8,7 @@ import ( "esdi/providers/iracing" "esdi/telemetry" + bngsdk "github.com/ESilva15/gobngsdk" "github.com/ESilva15/goirsdk" ) @@ -42,8 +43,13 @@ func NewLiveIRacingProvider(logger *slog.Logger) telemetry.TelemetryProvider { } func NewBeamNGProvider(logger *slog.Logger) telemetry.TelemetryProvider { - // TODO: Get from some kind of config or whatever - provider, _ := beamng.NewBeamNGProvider("127.0.0.1", 4444, logger) + // TODO: these should come from some kind of config + provider, _ := beamng.NewBeamNGProvider(logger, &bngsdk.Options{ + Logger: logger.With("TelemetryProvider", beamng.NAME), + SourceType: bngsdk.UDPData, + ImportUDPAddress: "127.0.0.1", + ImportUDPPort: 4444, + }) return provider }