updated the recorder gobngsdk v2

This commit is contained in:
2026-09-17 00:09:40 +01:00
parent 202dd75a65
commit 900d0cfbe9
7 changed files with 53 additions and 166 deletions
+3
View File
@@ -0,0 +1,3 @@
package constants
const ProgramName = "TelemetryMockserver"
+1 -1
View File
@@ -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
)
-45
View File
@@ -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
}
+43 -76
View File
@@ -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!
}
}
}
}
+5 -2
View File
@@ -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 {
-41
View File
@@ -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()
}
+1 -1
View File
@@ -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 {