diff --git a/constants.go b/constants.go index c86c7fb..9855f69 100644 --- a/constants.go +++ b/constants.go @@ -119,7 +119,25 @@ const ( // Some other constants that I need to get trough // // bit fields -// enum irsdk_EngineWarnings + +type bitfieldValue struct { + Value int + Name string +} + +// EngineWarnings const +var ( + irsdkWaterTempWarning = bitfieldValue{0x01, "irsdk_waterTempWarning"} + irsdkFuelPressureWarning = bitfieldValue{0x02, "irsdk_fueldPressureWarning"} + irsdkOilPressureWarning = bitfieldValue{0x04, "irsdk_oilPressureWarning"} + irsdkEngineStalled = bitfieldValue{0x08, "irsdk_engineStalled"} + irsdkPitSpeedLimiter = bitfieldValue{0x10, "irsdk_pitSpeedLimiter"} + irsdkRevLimiterActive = bitfieldValue{0x20, "irsdk_revLimiterActive"} + irsdkEngineWarnings = []bitfieldValue{irsdkWaterTempWarning, irsdkFuelPressureWarning, + irsdkOilPressureWarning, irsdkEngineStalled, irsdkPitSpeedLimiter, irsdkRevLimiterActive} +) + +// enum irsdk_EngineWarnings // { // irsdk_waterTempWarning = 0x01, // irsdk_fuelPressureWarning = 0x02, diff --git a/variables.go b/variables.go index 84dde33..32fdc92 100644 --- a/variables.go +++ b/variables.go @@ -7,6 +7,7 @@ import ( "io" "log" "math" + "strconv" "strings" "time" ) @@ -153,6 +154,38 @@ func (i *IBT) readVariablerHeaders() error { return nil } +func (i *IBT) parseEngineWarnings() { + val, ok := i.Vars.Vars["EngineWarnings"] + if !ok { + log.Fatal("no engine warnings") + } + + bitfield, err := strconv.ParseInt(val.Value.(string), 0, 64) + if err != nil { + log.Fatal("Unable to get engine warnings: " + err.Error()) + } + + for _, ew := range irsdkEngineWarnings { + result := (int(bitfield) & ew.Value) != 0 + i.Vars.Vars[ew.Name] = Var{Value: result} + } +} + +// parseBitfieldVariables will parse the variables: +// - irsdk_CameraState "CamCameraState" +// - irsdk_EngineWarnings "EngineWarnings" +// - irsdk_PitSvFlags "PitSvFlags" +// - irsdk_Flags "SessionFlags" +// - irsdk_SessionState "SessionState" +// - irsdk_TrkLoc "CarIdxTrackSurface" +// +// The approach for now will be to create unique entries in the data map for +// the fields in these variables +func (i *IBT) parseBitfieldVariables() { + // Parse the EngineWarnings variables - its the only one for now + i.parseEngineWarnings() +} + func (i *IBT) readData(buf []byte) error { for k, v := range i.Vars.Vars { // Slice of the variable value in the buffer @@ -264,6 +297,9 @@ func (i *IBT) readData(buf []byte) error { i.Vars.Vars[k] = v } + // Parse the bitfield variables here + i.parseBitfieldVariables() + return nil } @@ -324,7 +360,7 @@ func (i *IBT) Update(timeout time.Duration) (IRacingState, error) { return Ended, nil } - // Document why this is here, I don't remember the exact words right now + // Document why this is here, I don't remember the exact words right now i.Vars.RecorderTick++ } else { // This will get the dataframe corresponding to a given tick