bettercap/modules/can/can_obd2_pid_request.go
2024-08-31 14:01:40 +02:00

248 lines
8.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package can
import (
"encoding/binary"
"fmt"
"go.einride.tech/can"
)
var servicePIDS = map[uint8]map[uint16]string{
0x01: {
0x0: "PIDs supported [$01 - $20]",
0x1: "Monitor status since DTCs cleared.",
0x2: "DTC that caused freeze frame to be stored.",
0x3: "Fuel system status",
0x4: "Calculated engine load",
0x5: "Engine coolant temperature",
0x6: "Short term fuel trim (STFT)—Bank 1",
0x7: "Long term fuel trim (LTFT)—Bank 1",
0x8: "Short term fuel trim (STFT)—Bank 2",
0x9: "Long term fuel trim (LTFT)—Bank 2",
0x0A: "Fuel pressure (gauge pressure)",
0x0B: "Intake manifold absolute pressure",
0x0C: "Engine speed",
0x0D: "Vehicle speed",
0x0E: "Timing advance",
0x0F: "Intake air temperature",
0x10: "Mass air flow sensor (MAF) air flow rate",
0x11: "Throttle position",
0x12: "Commanded secondary air status",
0x13: "Oxygen sensors present",
0x14: "Oxygen Sensor 1",
0x15: "Oxygen Sensor 2",
0x16: "Oxygen Sensor 3",
0x17: "Oxygen Sensor 4",
0x18: "Oxygen Sensor 5",
0x19: "Oxygen Sensor 6",
0x1A: "Oxygen Sensor 7",
0x1B: "Oxygen Sensor 8",
0x1C: "OBD standards this vehicle conforms to",
0x1D: "Oxygen sensors present",
0x1E: "Auxiliary input status",
0x1F: "Run time since engine start",
0x20: "PIDs supported [$21 - $40]",
0x21: "Distance traveled with malfunction indicator lamp (MIL) on",
0x22: "Fuel Rail Pressure (relative to manifold vacuum)",
0x23: "Fuel Rail Gauge Pressure (diesel, or gasoline direct injection)",
0x24: "Oxygen Sensor 1",
0x25: "Oxygen Sensor 2",
0x26: "Oxygen Sensor 3",
0x27: "Oxygen Sensor 4",
0x28: "Oxygen Sensor 5",
0x29: "Oxygen Sensor 6",
0x2A: "Oxygen Sensor 7",
0x2B: "Oxygen Sensor 8",
0x2C: "Commanded EGR",
0x2D: "EGR Error",
0x2E: "Commanded evaporative purge",
0x2F: "Fuel Tank Level Input",
0x30: "Warm-ups since codes cleared",
0x31: "Distance traveled since codes cleared",
0x32: "Evap. System Vapor Pressure",
0x33: "Absolute Barometric Pressure",
0x34: "Oxygen Sensor 1",
0x35: "Oxygen Sensor 2",
0x36: "Oxygen Sensor 3",
0x37: "Oxygen Sensor 4",
0x38: "Oxygen Sensor 5",
0x39: "Oxygen Sensor 6",
0x3A: "Oxygen Sensor 7",
0x3B: "Oxygen Sensor 8",
0x3C: "Catalyst Temperature: Bank 1, Sensor 1",
0x3D: "Catalyst Temperature: Bank 2, Sensor 1",
0x3E: "Catalyst Temperature: Bank 1, Sensor 2",
0x3F: "Catalyst Temperature: Bank 2, Sensor 2",
0x40: "PIDs supported [$41 - $60]",
0x41: "Monitor status this drive cycle",
0x42: "Control module voltage",
0x43: "Absolute load value",
0x44: "Commanded Air-Fuel Equivalence Ratio (lambda,λ)",
0x45: "Relative throttle position",
0x46: "Ambient air temperature",
0x47: "Absolute throttle position B",
0x48: "Absolute throttle position C",
0x49: "Accelerator pedal position D",
0x4A: "Accelerator pedal position E",
0x4B: "Accelerator pedal position F",
0x4C: "Commanded throttle actuator",
0x4D: "Time run with MIL on",
0x4E: "Time since trouble codes cleared",
0x4F: "Maximum value for FuelAir equivalence ratio, oxygen sensor voltage, oxygen sensor current, and intake manifold absolute pressure",
0x50: "Maximum value for air flow rate from mass air flow sensor",
0x51: "Fuel Type",
0x52: "Ethanol fuel %",
0x53: "Absolute Evap system Vapor Pressure",
0x54: "Evap system vapor pressure",
0x55: "Short term secondary oxygen sensor trim, A: bank 1, B: bank 3",
0x56: "Long term secondary oxygen sensor trim, A: bank 1, B: bank 3",
0x57: "Short term secondary oxygen sensor trim, A: bank 2, B: bank 4",
0x58: "Long term secondary oxygen sensor trim, A: bank 2, B: bank 4",
0x59: "Fuel rail absolute pressure",
0x5A: "Relative accelerator pedal position",
0x5B: "Hybrid battery pack remaining life",
0x5C: "Engine oil temperature",
0x5D: "Fuel injection timing",
0x5E: "Engine fuel rate",
0x5F: "Emission requirements to which vehicle is designed",
0x60: "PIDs supported [$61 - $80]",
0x61: "Driver's demand engine - percent torque",
0x62: "Actual engine - percent torque",
0x63: "Engine reference torque",
0x64: "Engine percent torque data",
0x65: "Auxiliary input / output supported",
0x66: "Mass air flow sensor",
0x67: "Engine coolant temperature",
0x68: "Intake air temperature sensor",
0x69: "Actual EGR, Commanded EGR, and EGR Error",
0x6A: "Commanded Diesel intake air flow control and relative intake air flow position",
0x6B: "Exhaust gas recirculation temperature",
0x6C: "Commanded throttle actuator control and relative throttle position",
0x6D: "Fuel pressure control system",
0x6E: "Injection pressure control system",
0x6F: "Turbocharger compressor inlet pressure",
0x70: "Boost pressure control",
0x71: "Variable Geometry turbo (VGT) control",
0x72: "Wastegate control",
0x73: "Exhaust pressure",
0x74: "Turbocharger RPM",
0x75: "Turbocharger temperature",
0x76: "Turbocharger temperature",
0x77: "Charge air cooler temperature (CACT)",
0x78: "Exhaust Gas temperature (EGT) Bank 1",
0x79: "Exhaust Gas temperature (EGT) Bank 2",
0x7A: "Diesel particulate filter (DPF)differential pressure",
0x7B: "Diesel particulate filter (DPF)",
0x7C: "Diesel Particulate filter (DPF) temperature",
0x7D: "NOx NTE (Not-To-Exceed) control area status",
0x7E: "PM NTE (Not-To-Exceed) control area status",
0x7F: "Engine run time [b]",
0x80: "PIDs supported [$81 - $A0]",
0x81: "Engine run time for Auxiliary Emissions Control Device(AECD)",
0x82: "Engine run time for Auxiliary Emissions Control Device(AECD)",
0x83: "NOx sensor",
0x84: "Manifold surface temperature",
0x85: "NOx reagent system",
0x86: "Particulate matter (PM) sensor",
0x87: "Intake manifold absolute pressure",
0x88: "SCR Induce System",
0x89: "Run Time for AECD #11-#15",
0x8A: "Run Time for AECD #16-#20",
0x8B: "Diesel Aftertreatment",
0x8C: "O2 Sensor (Wide Range)",
0x8D: "Throttle Position G",
0x8E: "Engine Friction - Percent Torque",
0x8F: "PM Sensor Bank 1 & 2",
0x90: "WWH-OBD Vehicle OBD System Information",
0x91: "WWH-OBD Vehicle OBD System Information",
0x92: "Fuel System Control",
0x93: "WWH-OBD Vehicle OBD Counters support",
0x94: "NOx Warning And Inducement System",
0x98: "Exhaust Gas Temperature Sensor",
0x99: "Exhaust Gas Temperature Sensor",
0x9A: "Hybrid/EV Vehicle System Data, Battery, Voltage",
0x9B: "Diesel Exhaust Fluid Sensor Data",
0x9C: "O2 Sensor Data",
0x9D: "Engine Fuel Rate",
0x9E: "Engine Exhaust Flow Rate",
0x9F: "Fuel System Percentage Use",
0xA0: "PIDs supported [$A1 - $C0]",
0xA1: "NOx Sensor Corrected Data",
0xA2: "Cylinder Fuel Rate",
0xA3: "Evap System Vapor Pressure",
0xA4: "Transmission Actual Gear",
0xA5: "Commanded Diesel Exhaust Fluid Dosing",
0xA6: "Odometer [c]",
0xA7: "NOx Sensor Concentration Sensors 3 and 4",
0xA8: "NOx Sensor Corrected Concentration Sensors 3 and 4",
0xA9: "ABS Disable Switch State",
0xC0: "PIDs supported [$C1 - $E0]",
0xC3: "Fuel Level Input A/B",
0xC4: "Exhaust Particulate Control System Diagnostic Time/Count",
0xC5: "Fuel Pressure A and B",
0xC6: "Multiple system counters",
0xC7: "Distance Since Reflash or Module Replacement",
0xC8: "NOx Control Diagnostic (NCD) and Particulate Control Diagnostic (PCD) Warning Lamp status",
},
}
type OBD2PID struct {
ID uint16
Name string
}
func (p OBD2PID) String() string {
if p.Name != "" {
return p.Name
}
return fmt.Sprintf("pid 0x%d", p.ID)
}
func lookupPID(svcID uint8, data []uint8) OBD2PID {
if len(data) == 1 {
data = []byte{
0x00,
data[0],
}
}
pid := OBD2PID{
ID: binary.BigEndian.Uint16(data),
}
// resolve service
if svc, found := servicePIDS[svcID]; found {
// resolve PID name
if name, found := svc[pid.ID]; found {
pid.Name = name
}
}
return pid
}
func (msg *OBD2Message) ParseRequest(frame can.Frame) bool {
svcID := frame.Data[1]
// validate service / mode
if svcID > 0x0a {
return false
}
msgSize := frame.Data[0]
// validate data size
if msgSize > 6 {
return false
}
data := frame.Data[2 : 1+msgSize]
msg.PID = lookupPID(svcID, data)
msg.Type = OBD2MessageTypeRequest
msg.ECU = 0xff // broadcast
msg.Size = msgSize - 1
msg.Service = OBD2Service(svcID)
msg.Data = data
return true
}