From 900d0cfbe983416cc3d1b633d5e822da8532e762 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Thu, 17 Sep 2026 00:09:40 +0100 Subject: [PATCH] updated the recorder gobngsdk v2 --- constants/constants.go | 3 + go.mod | 2 +- internal/mockservers/beamng/reader.go | 45 ---------- internal/mockservers/beamng/record.go | 119 ++++++++++---------------- internal/mockservers/beamng/replay.go | 7 +- internal/mockservers/beamng/server.go | 41 --------- internal/mockservers/beamng/views.go | 2 +- 7 files changed, 53 insertions(+), 166 deletions(-) create mode 100644 constants/constants.go delete mode 100644 internal/mockservers/beamng/reader.go delete mode 100644 internal/mockservers/beamng/server.go diff --git a/constants/constants.go b/constants/constants.go new file mode 100644 index 0000000..d4e7a87 --- /dev/null +++ b/constants/constants.go @@ -0,0 +1,3 @@ +package constants + +const ProgramName = "TelemetryMockserver" diff --git a/go.mod b/go.mod index bb45902..0c58ce3 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/ESilva15/TelemetryMockserver go 1.23.2 require ( - github.com/ESilva15/gobngsdk v1.1.3 + github.com/ESilva15/gobngsdk v2.2.0 github.com/ESilva15/goirsdk v0.3.0 github.com/spf13/cobra v1.10.1 ) diff --git a/internal/mockservers/beamng/reader.go b/internal/mockservers/beamng/reader.go deleted file mode 100644 index 36bd87c..0000000 --- a/internal/mockservers/beamng/reader.go +++ /dev/null @@ -1,45 +0,0 @@ -package mockserver - -import ( - "io" - "unsafe" - - sdk "github.com/ESilva15/gobngsdk" -) - -type GobReader struct { - TotalRead int64 - File io.ReadSeeker - Buf []byte -} - -func NewGobReader(r io.ReadSeeker) *GobReader { - return &GobReader{ - TotalRead: 0, - File: r, - Buf: make([]byte, unsafe.Sizeof(sdk.Outgauge{})), - } -} - -func (g *GobReader) Reset() error { - _, err := g.File.Seek(0, io.SeekStart) - if err != nil { - return err - } - - g.TotalRead = 0 - - return nil -} - -func (g *GobReader) Next(buffer []byte) error { - _, err := io.ReadFull(g.File, buffer) - if err != nil { - return err - } - - pos, _ := g.File.Seek(0, io.SeekCurrent) - g.TotalRead = pos - - return nil -} diff --git a/internal/mockservers/beamng/record.go b/internal/mockservers/beamng/record.go index ee8e1d4..dcf8b03 100644 --- a/internal/mockservers/beamng/record.go +++ b/internal/mockservers/beamng/record.go @@ -3,83 +3,59 @@ package mockserver import ( "bytes" "context" - "errors" "fmt" + "log/slog" "os" "sync" "time" + "github.com/ESilva15/TelemetryMockserver/constants" bngsdk "github.com/ESilva15/gobngsdk" ) type recorderViewData struct { - TotalBytes int - SDK *bngsdk.BeamNGSDK + TotalBytes int64 + Og bngsdk.Outgauge } type Recorder struct { - SDK bngsdk.BeamNGSDK - OutputFile *os.File - TotalBytes int + SDK *bngsdk.BeamNGSDK // Views mut sync.RWMutex viewDataMut sync.RWMutex viewData recorderViewData viewCh chan *recorderViewData - recorderCh chan []byte } func NewRecorder(fp string, address string, port int) (*Recorder, error) { - // var recorder Recorder - // var err error - // - // recorder.SDK, err = bngsdk.Init(address, port) - // if err != nil { - // return &Recorder{}, err - // } - // - // recorder.OutputFile, err = os.Create(fp) - // if err != nil { - // return &Recorder{}, err - // } - // - // recorder.viewData = recorderViewData{} - // recorder.viewCh = make(chan *recorderViewData, 1) - // recorder.recorderCh = make(chan []byte, 1) + var recorder Recorder + var err error - // return &recorder, nil - return nil, errors.New("not implemented") + recorder.SDK, err = bngsdk.NewBngSDK(bngsdk.Options{ + Logger: slog.Default().With("SDK", "BeamNG"), + SourceType: bngsdk.UDPData, + ImportUDPAddress: address, + ImportUDPPort: port, + ExportData: true, + ExportDataType: bngsdk.BinaryFile, + ExportDataPath: fp, + }) + if err != nil { + return nil, err + } + + recorder.viewData = recorderViewData{} + recorder.viewCh = make(chan *recorderViewData, 1) + + return &recorder, nil } func (r *Recorder) Close() { r.SDK.Close() - - if r.OutputFile != nil { - r.OutputFile.Close() - } -} - -func (r *Recorder) record(ctx context.Context) { - // for { - // select { - // case <-ctx.Done(): - // return - // case data := <-r.recorderCh: - // r.mut.Lock() - // err := binary.Write(r.OutputFile, binary.LittleEndian, r.SDK.Data) - // r.TotalBytes += len(data) - // r.mut.Unlock() - // - // if err != nil { - // // NOTE: find a way of logging this somehow - // } - // } - // } } func (r *Recorder) view(ctx context.Context) { var buf bytes.Buffer - var nBytes int buf.Grow(2048) @@ -90,16 +66,15 @@ func (r *Recorder) view(ctx context.Context) { case viewData := <-r.viewCh: buf.Reset() buf.WriteString("\x1b[2J\x1b[H") - fmt.Fprintf(&buf, "\x1b]0;%s - Recording ", ProgramName) - stringifyRecordingProgress(&buf, nBytes) + fmt.Fprintf(&buf, "\x1b]0;%s - Recording ", constants.ProgramName) + stringifyRecordingProgress(&buf, viewData.TotalBytes) fmt.Fprintf(&buf, "\x07") - stringifyRecordingProgress(&buf, nBytes) + stringifyRecordingProgress(&buf, viewData.TotalBytes) fmt.Fprintf(&buf, "\n\n") r.viewDataMut.RLock() - nBytes = viewData.TotalBytes - // stringifyOutgaugeData(&buf, &r.SDK) + stringifyOutgaugeData(&buf, &viewData.Og) r.viewDataMut.RUnlock() _, _ = buf.WriteTo(os.Stdout) @@ -112,7 +87,6 @@ func (r *Recorder) Record(ctx context.Context) error { ticker := time.NewTicker(time.Second / 60) defer ticker.Stop() - go r.record(ctx) go r.view(ctx) for { @@ -120,28 +94,21 @@ func (r *Recorder) Record(ctx context.Context) error { case <-ctx.Done(): return nil case <-ticker.C: - // err := r.SDK.ReadData(100 * time.Millisecond) - // if err != nil { - // return err - // } - // - // r.viewData.TotalBytes = r.TotalBytes - // - // // Send the data to the view - // select { - // case r.viewCh <- &r.viewData: - // // Sent the data - // default: - // // Dropped the frame! - // } - // - // // Write the data to the file - // select { - // case r.recorderCh <- r.SDK.GetBuffer(): - // // Sent the data - // default: - // // Dropped the frame! - // } + og, err := r.SDK.Update() + if err != nil { + return err + } + + r.viewData.TotalBytes = r.SDK.GetTotalWritten() + r.viewData.Og = *og + + // Send the data to the view + select { + case r.viewCh <- &r.viewData: + // Sent the data + default: + // Dropped the frame! + } } } } diff --git a/internal/mockservers/beamng/replay.go b/internal/mockservers/beamng/replay.go index 19b4ccd..f47264c 100644 --- a/internal/mockservers/beamng/replay.go +++ b/internal/mockservers/beamng/replay.go @@ -12,6 +12,7 @@ import ( "sync" "time" + "github.com/ESilva15/TelemetryMockserver/constants" bngsdk "github.com/ESilva15/gobngsdk" ) @@ -41,6 +42,8 @@ func NewReplayer(address string, port int, fp string) (*Replayer, error) { Logger: slog.Default().With("SDK", "BeamNG"), SourceType: bngsdk.BinaryFile, BinSourcePath: fp, + ExportData: true, + ExportDataType: bngsdk.UDPData, ExportUDPAddress: address, ExportUDPPort: port, Loop: true, @@ -73,7 +76,7 @@ func (r *Replayer) renderToTerminal(ctx context.Context) { buf.Reset() buf.WriteString("\x1b[2J\x1b[H") - fmt.Fprintf(&buf, "\x1b]0;%s - Replaying %d%%\x07", ProgramName, percent) + fmt.Fprintf(&buf, "\x1b]0;%s - Replaying %d%%\x07", constants.ProgramName, percent) fmt.Fprintf(&buf, "Replayed: %d%%\n", percent) @@ -88,7 +91,7 @@ func (r *Replayer) renderToTerminal(ctx context.Context) { func (r *Replayer) Replay(ctx context.Context, loop bool) error { go r.renderToTerminal(ctx) - ticker := time.NewTicker(time.Second / 240) + ticker := time.NewTicker(time.Second / 60) defer ticker.Stop() for { select { diff --git a/internal/mockservers/beamng/server.go b/internal/mockservers/beamng/server.go deleted file mode 100644 index 771a14f..0000000 --- a/internal/mockservers/beamng/server.go +++ /dev/null @@ -1,41 +0,0 @@ -package mockserver - -import ( - "fmt" - "net" -) - -const ProgramName = "TelemetryMockerserver" - -type Transport interface { - Send(data []byte) error - Close() error -} - -type UDPTransport struct { - Conn *net.UDPConn - Addr *net.UDPAddr -} - -func NewUDPTransport(address string, port int) (*UDPTransport, error) { - addr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", address, port)) - if err != nil { - return nil, err - } - - conn, err := net.ListenUDP("udp", nil) - if err != nil { - return nil, err - } - - return &UDPTransport{Conn: conn, Addr: addr}, nil -} - -// Send will send a byte array of data trough the UDP server -func (u *UDPTransport) Send(data []byte) (int, error) { - return u.Conn.WriteToUDP(data, u.Addr) -} - -func (u *UDPTransport) Close() error { - return u.Conn.Close() -} diff --git a/internal/mockservers/beamng/views.go b/internal/mockservers/beamng/views.go index 7a06ca1..7b5cf9e 100644 --- a/internal/mockservers/beamng/views.go +++ b/internal/mockservers/beamng/views.go @@ -14,7 +14,7 @@ const ( GiB ) -func stringifyRecordingProgress(s *bytes.Buffer, nBytes int) { +func stringifyRecordingProgress(s *bytes.Buffer, nBytes int64) { if nBytes < KiB { fmt.Fprintf(s, "%d B", nBytes) } else if nBytes < MiB {