From 9b19731858a05614f8312ec636eed183792fc7d4 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 8 Jul 2026 23:19:08 +0100 Subject: [PATCH] starting the foundation for multiple types of telemetry data --- README.md | 8 +- cmd/beamng.go | 94 +++++++++++++++++++ cmd/record.go | 44 --------- cmd/replay.go | 45 --------- .../mockservers/beamng}/reader.go | 0 .../mockservers/beamng}/record.go | 0 .../mockservers/beamng}/replay.go | 0 .../mockservers/beamng}/replay_test.go | 0 .../mockservers/beamng}/server.go | 0 .../mockservers/beamng}/views.go | 0 10 files changed, 100 insertions(+), 91 deletions(-) create mode 100644 cmd/beamng.go delete mode 100644 cmd/record.go delete mode 100644 cmd/replay.go rename {mockserver => internal/mockservers/beamng}/reader.go (100%) rename {mockserver => internal/mockservers/beamng}/record.go (100%) rename {mockserver => internal/mockservers/beamng}/replay.go (100%) rename {mockserver => internal/mockservers/beamng}/replay_test.go (100%) rename {mockserver => internal/mockservers/beamng}/server.go (100%) rename {mockserver => internal/mockservers/beamng}/views.go (100%) diff --git a/README.md b/README.md index cf55aaf..1b187a6 100644 --- a/README.md +++ b/README.md @@ -12,17 +12,21 @@ without having to be playing the game while doing it (fans are noisy). # Usage To start replaying: -`BeamNGMockOg replay [--loop] -a 127.0.0.1 -p 4443 -i sunburstManual.bin` +`telemetrymockserver beamng replay [--loop] -a 127.0.0.1 -p 4443 -i sunburstManual.bin` - `loop` allows the replay functionality to keep replaying the same data file To start recording: -`BeamNGMockOg record -a 127.0.0.1 -p 4443 -o sunburstDCT.bin` +`BeamNGMockOg beamng record -a 127.0.0.1 -p 4443 -o sunburstDCT.bin` ## Development Use `tcpdump` to listen to the socket and check if data is coming through: `tcpdump -i any udp port -X` +### TODO: +- [ ] Create the auto completion file and add it to `$FPATH` +- [ ] Create a shortcut so we don't have to type out `telemetrymockserver` everytime + ### Benchmark Run with: diff --git a/cmd/beamng.go b/cmd/beamng.go new file mode 100644 index 0000000..49f2c60 --- /dev/null +++ b/cmd/beamng.go @@ -0,0 +1,94 @@ +package cmd + +import ( + "context" + "fmt" + + beamng "github.com/ESilva15/TelemetryMockserver/internal/mockservers/beamng" + + "github.com/spf13/cobra" +) + +// beamNGCmd is the parent command for the BeamNG agent actions +var beamNGCmd = &cobra.Command{ + Use: "beamng", + Short: "record -o ", + Long: "record will store the data from the given UDP server to the " + + "filepath given by -i", + Args: nil, + // Run: beamngAction, +} + +var beamNGRecordCMD = &cobra.Command{ + Use: "record", + Short: "record -o ", + Long: `record will store the data from the given UDP server to the + filepath given by -o`, + Args: nil, + Run: recordAction, +} + +var beamNGReplayCMD = &cobra.Command{ + Use: "replay", + Short: "replay -i ", + Long: "replay will replay the data on the given filepath on a UDP server", + Args: nil, + Run: replayAction, +} + +func recordAction(cmd *cobra.Command, args []string) { + outputFile, _ := cmd.Flags().GetString("output") + address, _ := cmd.Flags().GetString("address") + port, _ := cmd.Flags().GetInt("port") + + recorder, err := beamng.NewRecorder(outputFile, address, port) + if err != nil { + panic(fmt.Sprintf("failed to create new BeamNG recorder: %+v", err)) + } + defer recorder.Close() + + // NOTE: is this doing anything at all?? + ctx := context.Background() + if err := recorder.Record(ctx); err != nil { + fmt.Printf("Something went wrong while recording the file: %v", err) + } +} + +func replayAction(cmd *cobra.Command, args []string) { + inputFile, _ := cmd.Flags().GetString("input") + address, _ := cmd.Flags().GetString("address") + port, _ := cmd.Flags().GetInt("port") + loop, _ := cmd.Flags().GetBool("loop") + + replayer, err := beamng.NewReplayer(address, port, inputFile) + if err != nil { + fmt.Printf("Something went wrong setting up the player: %+v", err) + return + } + + // NOTE: is this doing anything at all?? + ctx := context.Background() + if err := replayer.Replay(ctx, loop); err != nil { + fmt.Printf("Something went wrong while playing the file: %v", err) + } +} + +func init() { + // Beamng commnad flags + beamNGCmd.PersistentFlags().StringP("address", "a", "127.0.0.1", "Address for the UDP server") + beamNGCmd.MarkFlagRequired("address") + beamNGCmd.PersistentFlags().IntP("port", "p", 4444, "Port for the UDP server") + beamNGCmd.MarkFlagRequired("port") + + // Record command flags + beamNGRecordCMD.Flags().StringP("output", "o", "output.bin", "output file for recording") + beamNGRecordCMD.MarkFlagRequired("output") + + // Replay command flags + beamNGReplayCMD.Flags().BoolP("loop", "l", false, "whether to loop the recording") + beamNGReplayCMD.Flags().StringP("input", "i", "input.bin", "input file for reading") + beamNGReplayCMD.MarkFlagRequired("input") + + rootCmd.AddCommand(beamNGCmd) + beamNGCmd.AddCommand(beamNGRecordCMD, beamNGReplayCMD) +} diff --git a/cmd/record.go b/cmd/record.go deleted file mode 100644 index 13236cd..0000000 --- a/cmd/record.go +++ /dev/null @@ -1,44 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - - "github.com/ESilva15/TelemetryMockserver/mockserver" - - "github.com/spf13/cobra" -) - -func recordAction(cmd *cobra.Command, args []string) { - outputFile, _ := cmd.Flags().GetString("output") - address, _ := cmd.Flags().GetString("address") - port, _ := cmd.Flags().GetInt("port") - - recorder, err := mockserver.NewRecorder(outputFile, address, port) - if err != nil { - panic(fmt.Sprintf("failed to create new BeamNG recorder: %+v", err)) - } - defer recorder.Close() - - // NOTE: is this doing anything at all?? - ctx := context.Background() - if err := recorder.Record(ctx); err != nil { - fmt.Printf("Something went wrong while recording the file: %v", err) - } -} - -// shelf -var recordCmd = &cobra.Command{ - Use: "record", - Short: "record -o ", - Long: `record will store the data from the given UDP server to the - filepath given by -i`, - Args: nil, - Run: recordAction, -} - -func init() { - rootCmd.AddCommand(recordCmd) - - recordCmd.PersistentFlags().StringP("output", "o", "output.bin", "output file for recording") -} diff --git a/cmd/replay.go b/cmd/replay.go deleted file mode 100644 index 8446ad2..0000000 --- a/cmd/replay.go +++ /dev/null @@ -1,45 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - - "github.com/ESilva15/TelemetryMockserver/mockserver" - - "github.com/spf13/cobra" -) - -func replayAction(cmd *cobra.Command, args []string) { - inputFile, _ := cmd.Flags().GetString("input") - address, _ := cmd.Flags().GetString("address") - port, _ := cmd.Flags().GetInt("port") - loop, _ := cmd.Flags().GetBool("loop") - - replayer, err := mockserver.NewReplayer(address, port, inputFile) - if err != nil { - fmt.Printf("Something went wrong setting up the player: %+v", err) - return - } - - // NOTE: is this doing anything at all?? - ctx := context.Background() - if err := replayer.Replay(ctx, loop); err != nil { - fmt.Printf("Something went wrong while playing the file: %v", err) - } -} - -// shelf -var replayCmd = &cobra.Command{ - Use: "replay", - Short: "replay -i ", - Long: `replay will replay the data on the given filepath on a UDP server`, - Args: nil, - Run: replayAction, -} - -func init() { - rootCmd.AddCommand(replayCmd) - - replayCmd.PersistentFlags().StringP("input", "i", "nofile.bin", "input file for serving") - replayCmd.PersistentFlags().BoolP("loop", "l", false, "loop replay after finishing") -} diff --git a/mockserver/reader.go b/internal/mockservers/beamng/reader.go similarity index 100% rename from mockserver/reader.go rename to internal/mockservers/beamng/reader.go diff --git a/mockserver/record.go b/internal/mockservers/beamng/record.go similarity index 100% rename from mockserver/record.go rename to internal/mockservers/beamng/record.go diff --git a/mockserver/replay.go b/internal/mockservers/beamng/replay.go similarity index 100% rename from mockserver/replay.go rename to internal/mockservers/beamng/replay.go diff --git a/mockserver/replay_test.go b/internal/mockservers/beamng/replay_test.go similarity index 100% rename from mockserver/replay_test.go rename to internal/mockservers/beamng/replay_test.go diff --git a/mockserver/server.go b/internal/mockservers/beamng/server.go similarity index 100% rename from mockserver/server.go rename to internal/mockservers/beamng/server.go diff --git a/mockserver/views.go b/internal/mockservers/beamng/views.go similarity index 100% rename from mockserver/views.go rename to internal/mockservers/beamng/views.go