Pids   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 33
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 6
c 1
b 0
f 0
dl 0
loc 33
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 3 1
A set_mode() 0 8 1
A __getitem__() 0 14 4
1
# Information about OBD-II PIDs
2
# http://en.wikipedia.org/wiki/OBD-II_PIDs
3
4
# PID hex codes
5
PIDS_SUPPORTED_00_20 = "00"
6
MONITOR_STATUS_SINCE_DTC_CLEARED = "01"
7
FREEZE_DTC = "02"
8
VEHICLE_IDENTIFICATION_NUMBER = "02"
9
FUEL_SYSTEM_STATUS = "03"
10
CALCULATED_ENGINE_LOAD = "04"
11
ENGINE_COOLANT_TEMPERATURE = "05"
12
SHORT_TERM_FUEL_TRIM_BANK_1 = "06"
13
LONG_TERM_FUEL_TRIM_BANK_1 = "07"
14
SHORT_TERM_FUEL_TRIM_BANK_2 = "08"
15
LONG_TERM_FUEL_TRIM_BANK_2 = "09"
16
FUEL_PRESSURE = "0A"
17
ECU_NAME = "0A"
18
INTAKE_MANIFOLD_PRESSURE = "0B"
19
ENGINE_RPM = "0C"
20
VEHICLE_SPEED = "0D"
21
TIMING_ADVANCE = "0E"
22
INTAKE_AIR_TEMPERATURE = "0F"
23
MAF_AIR_FLOW = "10"
24
THROTTLE_POSITION = "11"
25
26
# TODO: Oxygen sensors
27
28
AUXILIARY_INPUT_STATUS = "1E"
29
ENGINE_RUN_TIME_SINCE_START = "1F"
30
PIDS_SUPPORTED_21_40 = "20"
31
DISTANCE_TRAVELED_WITH_MIL_ON = "21"
32
33
FUEL_RAIL_PRESSURE = "23"
34
35
COMMANDED_EGR = "2C"
36
EGR_ERROR = "2D"
37
COMMANDED_EVAPORATIVE_PURGE = "2E"
38
FUEL_LEVEL_INPUT = "2F"
39
DISTANCE_TRAVELED_SINCE_CODES_CLEARED = "31"
40
EVAP_SYSTEM_VAPOR_PRESSURE = "32"
41
BAROMETRIC_PRESSURE = "33"
42
43
PIDS_SUPPORTED_41_60 = "40"
44
CONTROL_MODULE_VOLTAGE = "41"
45
ABSOLUTE_LOAD_VALUE = "42"
46
AMBIENT_AIR_TEMPERATURE = "46"
47
48
TIME_RUN_WITH_MIL_ON = "4D"
49
TIME_SINCE_TROUBLE_CODES_CLEARED = "4E"
50
51
FUEL_TYPE = "51"
52
ETHANOL_FUEL_PERCENTAGE = "52"
53
54
RELATIVE_ACCELERATOR_PEDAL_POSITION = "5A"
55
HYBRID_BATTERY_PACK_REMAINING_LIFE = "5B"
56
ENGINE_OIL_TEMPERATURE = "5C"
57
FUEL_INJECTION_TIMING = "5D"
58
ENGINE_FUEL_RATE = "5E"
59
60
PIDS_SUPPORTED_61_80 = "60"
61
ENGINE_PERCENT_TORQUE = "64"
62
63
# TODO: remaining PIDs
64
65
# Mode 01 PID 51 returns a value for the vehicle's fuel type
66
67
FUEL_TYPE_DESCRIPTION = (
68
    'Not Available',
69
    'Gasoline',
70
    'Methanol',
71
    'Ethanol',
72
    'Diesel',
73
    'Liquefied petroleum gas (LPG)',
74
    'Compressed natural gas (CNG)',
75
    'Propane',
76
    'Electric',
77
    'Bifuel running Gasoline',
78
    'Bifuel running Methanol',
79
    'Bifuel running Ethanol',
80
    'Bifuel running Liquefied petroleum gas (LPG)',
81
    'Bifuel running Compressed natural gas (CNG)',
82
    'Bifuel running Propane',
83
    'Bifuel running Electricity',
84
    'Bifuel running electric and combustion engine',
85
    'Hybrid gasoline',
86
    'Hybrid Ethanol',
87
    'Hybrid Diesel',
88
    'Hybrid Electric',
89
    'Hybrid running electric and combustion engine',
90
    'Hybrid Regenerative',
91
    'Bifuel running diesel'
92
)
93
94
FUEL_SYSTEM_STATUS_DESC = {
95
    0: 'No fuel system available',
96
    1: 'Open loop due to insufficient engine temperature',
97
    2: 'Closed loop, using oxygen sensor feedback to determine fuel mix',
98
    4: 'Open loop due to engine load OR fuel cut to deceleration',
99
    8: 'Open loop due to system failure',
100
    16: 'Closed loop, using at least one oxygen sensor but there is a fault in the feedback system'
101
}
102
103
# Mode 01 PID 12 returns a single byte of data which describes the
104
# secondary air status.
105
SECONDARY_AIR_STATUS = {
106
    1: 'Upstream',
107
    2: 'Downstream of catalytic converter',
108
    4: 'From the outside atmosphere or off',
109
    8: 'Pump commanded on for diagnostics',
110
}
111
112
# Mode 01 PID 1C returns a single byte of data which describes which OBD
113
# standards.
114
OBD_STANDARDS = (
115
    None,
116
    'OBD-II as defined by the CARB',
117
    'OBD as defined by the EPA',
118
    'OBD and OBD-II',
119
    'OBD-I',
120
    'Not OBD compliant',
121
    'EOBD (Europe)',
122
    'EOBD and OBD-II',
123
    'EOBD and OBD',
124
    'EOBD, OBD and OBD II',
125
    'JOBD (Japan)',
126
    'JOBD and OBD II',
127
    'JOBD and EOBD',
128
    'JOBD, EOBD, and OBD II',
129
    'Reserved',
130
    'Reserved',
131
    'Reserved',
132
    'Engine Manufacturer Diagnostics (EMD)',
133
    'Engine Manufacturer Diagnostics Enhanced (EMD+)',
134
    'Heavy Duty On-Board Diagnostics (Child/Partial) (HD OBD-C)',
135
    'Heavy Duty On-Board Diagnostics (HD OBD)',
136
    'World Wide Harmonized OBD (WWH OBD)',
137
    'Reserved',
138
    'Heavy Duty Euro OBD Stage I without NOx control (HD EOBD-I)',
139
    'Heavy Duty Euro OBD Stage I with NOx control (HD EOBD-I N)',
140
    'Heavy Duty Euro OBD Stage II without NOx control (HD EOBD-II)',
141
    'Heavy Duty Euro OBD Stage II with NOx control (HD EOBD-II N)',
142
    'Reserved',
143
    'Brazil OBD Phase 1 (OBDBr-1)',
144
    'Brazil OBD Phase 2 (OBDBr-2)',
145
    'Korean OBD (KOBD)',
146
    'India OBD I (IOBD I)',
147
    'India OBD II (IOBD II)',
148
    'Heavy Duty Euro OBD Stage VI (HD EOBD-IV)'
149
)
150
151
DTCs_table = {
152
    '0': 'P0',
153
    '1': 'P1',
154
    '2': 'P2',
155
    '3': 'P3',
156
    '4': 'C0',
157
    '5': 'C1',
158
    '6': 'C2',
159
    '7': 'C3',
160
    '8': 'B0',
161
    '9': 'B1',
162
    'A': 'B2',
163
    'B': 'B3',
164
    'C': 'U0',
165
    'D': 'U1',
166
    'E': 'U2',
167
    'F': 'U3'
168
169
}
170
171
from obdlib.utils import *
172
173
174
class Pids(object):
175
    """
176
        Retrieves pid info from the mode file
177
        gets a necessary pid only
178
    """
179
180
    def __init__(self):
181
        self.mode = 0
182
        self.command_path = "obdlib/obd/commands/pids.{}"
183
184
    def set_mode(self, mode):
185
        """
186
            Sets the current mode
187
            :param mode: integer - current mode
188
            :return self
189
        """
190
        self.mode = mode
191
        return self
192
193
    def __getitem__(self, item):
194
        """
195
            Gets one pid only
196
            :param item: integer - the pid number
197
            :return pid: tuple - params about pid
198
        """
199
        pid = ()
200
        with open(self.command_path.format(self.mode)) as pids:
201
            for index, value in enumerate(pids):
202
                if index == item:
203
                    pid = eval(value)
204
                    break
205
206
        return pid