From 052f4582c96a764a7c0ef01e3f62cceb3f1109f7 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Thu, 10 Sep 2026 15:13:42 +0100 Subject: [PATCH] The logger needs to be passed from the caller now - will change this in the future --- constants.go | 6 +-- diskSubHeader.go | 8 +--- .../read_from_ibt_file/read_from_ibt_file.go | 14 ++++++ .../read_from_mmap_file.go | 38 +++++++++++++++- headers.go | 6 +-- irsdk.go | 19 ++++---- logger/logger.go | 23 ---------- sessionInfo.go | 6 +-- variables.go | 45 +++++++++++-------- 9 files changed, 93 insertions(+), 72 deletions(-) delete mode 100644 logger/logger.go diff --git a/constants.go b/constants.go index 4fce1e9..1aa2cb0 100644 --- a/constants.go +++ b/constants.go @@ -155,12 +155,12 @@ func (i *IBT) checkEngineWarningsBitfield(field int) bool { log.Fatal("no EngineWarnings") } - bitfield, ok := val.Value.(int) + bitfield, ok := val.Value.(uint32) if !ok { - log.Fatalf("unable to typecast EngineWarnings: %+v", val.Value) + log.Fatalf("unable to typecast EngineWarnings: %+v", val) } - return bitfield&field != 0 + return bitfield&uint32(field) != 0 } func (i *IBT) WaterTempWarning() bool { diff --git a/diskSubHeader.go b/diskSubHeader.go index 5ff94c4..24fb05f 100644 --- a/diskSubHeader.go +++ b/diskSubHeader.go @@ -4,8 +4,6 @@ import ( "bytes" "encoding/binary" "fmt" - - "github.com/ESilva15/goirsdk/logger" ) const ( @@ -23,8 +21,6 @@ type DiskSubHeader struct { // readSubheader will read the subheader contents out of the telemetry data func (i *IBT) readSubheader() error { - log := logger.GetInstance() - var subheaderRaw [SubHeaderSize]byte _, err := i.File.ReadAt(subheaderRaw[:], HeaderSize) if err != nil { @@ -39,7 +35,7 @@ func (i *IBT) readSubheader() error { if i.Opts.IBTExport { err = i.exportIBT(subheaderRaw[:], HeaderSize) if err != nil { - log.Printf("failed to export subheaders: %v\n", err) + i.Opts.Logger.Debug("failed to export disksubheader", "err", err) } } @@ -50,8 +46,6 @@ func (i *IBT) readSubheader() error { // or nil if an error occurs. In which case the error return value is more // valuable func parseTelemetrySubHeader(buf [SubHeaderSize]byte) (*DiskSubHeader, error) { - // utils.HexDump(buf[:]) - dst := DiskSubHeader{} err := binary.Read(bytes.NewBuffer(buf[:]), binary.LittleEndian, &dst) if err != nil { diff --git a/examples/read_from_ibt_file/read_from_ibt_file.go b/examples/read_from_ibt_file/read_from_ibt_file.go index 2b86590..9ba4c99 100644 --- a/examples/read_from_ibt_file/read_from_ibt_file.go +++ b/examples/read_from_ibt_file/read_from_ibt_file.go @@ -3,6 +3,8 @@ package main import ( "fmt" "log" + "log/slog" + "os" "time" "github.com/ESilva15/goirsdk" @@ -13,8 +15,20 @@ func msToKph(v float32) int { } func main() { + output, err := os.OpenFile("./output.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o755) + if err != nil { + log.Fatalf("Failed to open log file: %+v", err) + } + + logger := slog.New( + slog.NewTextHandler(output, &slog.HandlerOptions{ + Level: slog.LevelDebug, + }), + ) + // Instantiate our iRacing SDK instance irsdk, err := goirsdk.Init(goirsdk.Options{ + Logger: logger, SourceType: goirsdk.IBTFile, SourcePath: "../../../../testTelemetry/mx5_2016Okayama_full_2024_10_19_22_02_12.ibt", IBTExportType: goirsdk.SharedMemoryFile, diff --git a/examples/read_from_mmap_file/read_from_mmap_file.go b/examples/read_from_mmap_file/read_from_mmap_file.go index 71df02e..ba733b2 100644 --- a/examples/read_from_mmap_file/read_from_mmap_file.go +++ b/examples/read_from_mmap_file/read_from_mmap_file.go @@ -3,6 +3,8 @@ package main import ( "fmt" "log" + "log/slog" + "os" "time" "github.com/ESilva15/goirsdk" @@ -13,8 +15,22 @@ func msToKph(v float32) int { } func main() { + output, err := os.OpenFile("./output.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o755) + if err != nil { + log.Fatalf("Failed to open log file: %+v", err) + } + + logger := slog.New( + slog.NewTextHandler(output, &slog.HandlerOptions{ + Level: slog.LevelDebug, + }), + ) + + logger.Debug("Starting test") + // Instantiate our iRacing SDK instance irsdk, err := goirsdk.Init(goirsdk.Options{ + Logger: logger, SourceType: goirsdk.SharedMemoryFile, }) if err != nil { @@ -53,9 +69,29 @@ func main() { gear := int32(irsdk.Vars.Vars["Gear"].Value.(int)) rpm := int32(irsdk.Vars.Vars["RPM"].Value.(float32)) speed := int32(msToKph(irsdk.Vars.Vars["Speed"].Value.(float32))) + sessionState := irsdk.Vars.Vars["SessionState"].Value.(int) + trkloc := irsdk.Vars.Vars["PlayerTrackSurface"].Value.(int) + trksurf := irsdk.Vars.Vars["PlayerTrackSurfaceMaterial"].Value.(int) + pitsvflags := irsdk.Vars.Vars["PitSvFlags"].Value.(uint32) fmt.Printf("\033[?25l\033[2J\033[H") - fmt.Printf("Gear: %d, RPM: %d, Speed: %d", gear, rpm, speed) + fmt.Printf("Gear: %d, RPM: %d, Speed: %d\n", gear, rpm, speed) + fmt.Printf("SessionState: %s\n", goirsdk.SessionStateToString(sessionState)) + fmt.Printf("TrkLoc: %s\n", goirsdk.TrkLocToString(trkloc)) + fmt.Printf("TrkSurf: %s\n", goirsdk.TrkSurfToString(trksurf)) + fmt.Printf("PitSvFlags: %d\n", pitsvflags) + fmt.Printf(" FL FR\n") + fmt.Printf(" %t %t\n", irsdk.LFTireChange(), irsdk.RFTireChange()) + fmt.Printf("\n") + fmt.Printf(" RL RR\n") + fmt.Printf(" %t %t\n", irsdk.LRTireChange(), irsdk.RRTireChange()) + fmt.Printf(" FuelFill: %t\n", irsdk.FuelFill()) + fmt.Printf(" WindshieldTearoff: %t\n", irsdk.WindshieldTearoff()) + fmt.Printf(" FastRepair: %t\n", irsdk.FastRepair()) + fmt.Printf(" ClearTires: %t\n", irsdk.ClearTires()) + fmt.Printf(" ClearWS: %t\n", irsdk.ClearWS()) + fmt.Printf(" ClearFR: %t\n", irsdk.ClearFR()) + fmt.Printf(" ClearFuel: %t\n", irsdk.ClearFuel()) <-mainLoopTicker.C } diff --git a/headers.go b/headers.go index 91c3ec0..5b7e43a 100644 --- a/headers.go +++ b/headers.go @@ -4,8 +4,6 @@ import ( "bytes" "encoding/binary" "fmt" - - "github.com/ESilva15/goirsdk/logger" ) const ( @@ -32,8 +30,6 @@ type TelemetryHeaders struct { // readHeader will read the header out of the telemetry data func (i *IBT) readHeader() error { - log := logger.GetInstance() - var headerRaw [FileHeaderSize]byte _, err := i.File.ReadAt(headerRaw[:], 0) if err != nil { @@ -48,7 +44,7 @@ func (i *IBT) readHeader() error { if i.Opts.IBTExport { err = i.exportIBT(headerRaw[:], 0) if err != nil { - log.Printf("Failed to export headers: %v\n", err) + i.Opts.Logger.Debug("Failed to export headers", "err", err) } } diff --git a/irsdk.go b/irsdk.go index 6aa7e30..a671ddb 100644 --- a/irsdk.go +++ b/irsdk.go @@ -4,9 +4,9 @@ package goirsdk import ( "fmt" "io" + "log/slog" "os" - "github.com/ESilva15/goirsdk/logger" "github.com/ESilva15/goirsdk/mmaputils" "github.com/ESilva15/goirsdk/sharedMem" "gopkg.in/yaml.v3" @@ -33,6 +33,7 @@ const ( ) type Options struct { + Logger *slog.Logger SourceType TelemetryContainer // type of source data SourcePath string // Path to source IBTExportType TelemetryContainer // export type of telemetry: store .ibt or replay in shm @@ -75,11 +76,9 @@ func (i *IBT) IsConnected() bool { } func (i *IBT) exportYAML() error { - log := logger.GetInstance() - file, err := os.OpenFile(i.Opts.SessionInfoExportPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) if err != nil { - log.Printf("Failed to open file for YAML export: %v\n", err) + i.Opts.Logger.Debug(fmt.Sprintf("Failed to open file for YAML export: %v\n", err)) return fmt.Errorf("failed to open output file for YAML: %v", err) } defer file.Close() @@ -88,7 +87,7 @@ func (i *IBT) exportYAML() error { err = enc.Encode(i.SessionInfo) if err != nil { - log.Printf("Failed to write into file for YAML export: %v\n", err) + i.Opts.Logger.Debug(fmt.Sprintf("Failed to write into file for YAML export: %v\n", err)) return fmt.Errorf("failed to write YAML contents to file: %v", err) } @@ -96,13 +95,11 @@ func (i *IBT) exportYAML() error { } func (i *IBT) exportIBT(data []byte, offset int64) error { - log := logger.GetInstance() - _, err := i.IBTExporter.WriteAt(data, offset) if err != nil { i.IBTExporter.Close() i.IBTExporter = nil - log.Println("Won't attempt to export anymore") + i.Opts.Logger.Debug(fmt.Sprintf("won't attempt to export anymore: %+v", err)) return err } @@ -177,8 +174,6 @@ func (i *IBT) openExporter() error { // Init serves to initialize and get a hold of a IBT struct // Receives an Options struct with the required configurations func Init(opts Options) (*IBT, error) { - // log := logger.GetInstance() - // Create our irsdk instance var err error ibt := IBT{ @@ -236,6 +231,10 @@ func (i *IBT) ListVariables() map[string]Var { // Close cleans up our irsdk instance func (i *IBT) Close() { + if i == nil { + return + } + if i.winUtils != nil { // If its not live data, the user is the one with ownership of the handle i.File.Close() diff --git a/logger/logger.go b/logger/logger.go deleted file mode 100644 index 6bf410d..0000000 --- a/logger/logger.go +++ /dev/null @@ -1,23 +0,0 @@ -package logger - -import ( - "log" - "os" - "sync" -) - -var l *log.Logger -var once sync.Once - -func createLogger() { - l = log.New(os.Stdout, "[ibtReader] ", log.LstdFlags | log.Lshortfile) -} - -func GetInstance() *log.Logger { - once.Do(func() { - createLogger() - }) - - return l -} - diff --git a/sessionInfo.go b/sessionInfo.go index 980ed6f..e6d796c 100644 --- a/sessionInfo.go +++ b/sessionInfo.go @@ -6,8 +6,6 @@ import ( "log" "strings" - "github.com/ESilva15/goirsdk/logger" - "golang.org/x/text/encoding/charmap" "gopkg.in/yaml.v3" ) @@ -312,8 +310,6 @@ type Driver struct { // readSessionInfo will read the session info yaml out of the telemetry data func (i *IBT) readSessionInfo() error { - log := logger.GetInstance() - sessionInfoStringRaw := make([]byte, i.Headers.SessionInfoLength) _, err := i.File.ReadAt(sessionInfoStringRaw, int64(i.Headers.SessionInfoOffset)) if err != nil { @@ -337,7 +333,7 @@ func (i *IBT) readSessionInfo() error { if i.Opts.SessionInfoExport { err := i.exportYAML() if err != nil { - log.Printf("Failed to export YAML string: %v\n", err) + i.Opts.Logger.Debug("Failed to export YAML string", "err", err) } } diff --git a/variables.go b/variables.go index c414cef..a6ca088 100644 --- a/variables.go +++ b/variables.go @@ -263,6 +263,10 @@ func (i *IBT) readData(buf []byte) error { } // -------------- + if k == "SessionState" { + i.Opts.Logger.Debug(fmt.Sprintf("SessionState: %+v", v)) + } + i.Vars.Vars[k] = v } @@ -273,7 +277,8 @@ func (i *IBT) readData(buf []byte) error { // live and offline data func (i *IBT) Update(timeout time.Duration) (IRacingState, error) { // This is what happens if we are reading live data - if i.winUtils != nil { + switch i.Opts.SourceType { + case SharedMemoryFile: // Put a way to check if the sim is active here // fmt.Println("NOT CHECKING IF SIM IS ACTIVE - ADD ME") @@ -313,17 +318,19 @@ func (i *IBT) Update(timeout time.Duration) (IRacingState, error) { if i.Opts.IBTExport { // Dirty attempt at getting this to work to write to a memory mapped file + var offset int64 = 0 switch i.Opts.IBTExportType { case IBTFile: - err = i.exportIBT(buf, int64(i.Headers.BufOffset+i.Vars.RecorderTick*i.Headers.BufLen)) - if err != nil { - log.Printf("Failed to export live telemetry data: %v", err) - } + i.Opts.Logger.Debug("Reading live data and exporting to IBT file") + offset = int64(i.Headers.BufOffset + i.Vars.RecorderTick*i.Headers.BufLen) case SharedMemoryFile: - err = i.exportIBT(buf, int64(i.Headers.BufOffset)) - if err != nil { - log.Printf("Failed to export live telemetry data: %v", err) - } + i.Opts.Logger.Debug("Reading live data and exporting to SHM file") + offset = int64(i.Headers.BufOffset) + } + + err = i.exportIBT(buf, offset) + if err != nil { + i.Opts.Logger.Debug(fmt.Sprintf("Failed to export offline telemetry data: %+v", err)) } } @@ -338,7 +345,7 @@ func (i *IBT) Update(timeout time.Duration) (IRacingState, error) { // Document why this is here, I don't remember the exact words right now i.Vars.RecorderTick++ - } else { + case IBTFile: // This is what happens if we are reading from an .ibt file // This will get the dataframe corresponding to a given tick start := i.Headers.BufOffset + i.Vars.Tick*i.Headers.BufLen @@ -349,17 +356,19 @@ func (i *IBT) Update(timeout time.Duration) (IRacingState, error) { // writing to a file if i.Opts.IBTExport { // Dirty attempt at getting this to work to write to a memory mapped file + var offset int64 = 0 switch i.Opts.IBTExportType { case IBTFile: - err = i.exportIBT(buf, int64(start)) - if err != nil { - log.Printf("Failed to export offline telemetry data: %v", err) - } + i.Opts.Logger.Debug("Reading IBT file and exporting to IBT file") + offset = int64(start) case SharedMemoryFile: - err = i.exportIBT(buf, int64(i.Headers.BufOffset)) - if err != nil { - log.Printf("Failed to export live telemetry data: %v", err) - } + i.Opts.Logger.Debug("Reading IBT file and exporting to SHM file") + offset = int64(i.Headers.BufOffset) + } + + err = i.exportIBT(buf, offset) + if err != nil { + i.Opts.Logger.Debug(fmt.Sprintf("Failed to export offline telemetry data: %+v", err)) } }