def light_clb(data): data = bytes_to_int(data.messages[0].data[3:]) if (lightBeam.bitSelect & data): if (lightBeam.isPressing is False): lightBeam.isPressing = True lightBeam.ModeNight() elif (lightBeam.isPressing is True): lightBeam.isPressing = False lightBeam.ModeDay() return
def vin(messages): """VIN decoder.""" d = messages[0].data if len(d) == 0: return None else: vin_str = "" for v in range(16, 33): vin_str = vin_str + chr(bytes_to_int(d[v:v + 1])) return dict(vin=vin_str)
def rev_clb(data): data = bytes_to_int(data.messages[0].data[3:]) if (revGear.bitSelect & data): if (revGear.isPressing is False): revGear.isPressing = True revGear.revCamOn() elif (revGear.isPressing is True): revGear.isPressing = False revGear.revCamOff() return
def bms_2101(messages): """BMS 2101 decoder.""" d = messages[0].data if len(d) == 0: return None else: charging_bits = d[11] charging = 1 if charging_bits & 0x80 else 0 # 8th bit is 1 battery_current = bytes_to_int_signed(d[12:14]) / 10.0 battery_voltage = bytes_to_int(d[14:16]) / 10.0 return dict(socBms=d[6] / 2.0, # % bmsIgnition=1 if d[52] & 0x4 else 0, # 3rd bit is 1 bmsMainRelay=1 if charging_bits & 0x1 else 0, # 1st bit is 1 auxBatteryVoltage=d[31] / 10.0, # V charging=charging, normalChargePort=1 if charging_bits & 0x20 else 0, # 6th bit is 1 rapidChargePort=1 if charging_bits & 0x40 else 0, # 7th bit is 1 fanStatus=d[29], # Hz fanFeedback=d[30], cumulativeEnergyCharged=bytes_to_int(d[40:44]) / 10.0, # kWh cumulativeEnergyDischarged=bytes_to_int(d[44:48]) / 10.0, # kWh cumulativeChargeCurrent=bytes_to_int(d[32:36]) / 10.0, # A cumulativeDischargeCurrent=bytes_to_int(d[36:40]) / 10.0, # A cumulativeOperatingTime=bytes_to_int(d[48:52]), # seconds availableChargePower=bytes_to_int(d[7:9]) / 100.0, # kW availableDischargePower=bytes_to_int(d[9:11]) / 100.0, # kW dcBatteryInletTemperature=bytes_to_int_signed(d[22:23]), # C dcBatteryMaxTemperature=bytes_to_int_signed(d[16:17]), # C dcBatteryMinTemperature=bytes_to_int_signed(d[17:18]), # C dcBatteryCellMaxVoltage=d[25] / 50, # V dcBatteryCellNoMaxVoltage=d[26], dcBatteryCellMinVoltage=d[27] / 50, # V dcBatteryCellNoMinVoltage=d[28], dcBatteryCurrent=battery_current, # A dcBatteryPower=round(battery_current * battery_voltage / 1000.0, 3), # kW dcBatteryVoltage=battery_voltage, # V driveMotorSpeed=bytes_to_int_signed(d[55:57]), # RPM dcBatteryModuleTemp01=bytes_to_int_signed(d[18:19]), # C dcBatteryModuleTemp02=bytes_to_int_signed(d[19:20]), # C dcBatteryModuleTemp03=bytes_to_int_signed(d[20:21]), # C dcBatteryModuleTemp04=bytes_to_int_signed(d[21:22]), # C dcBatteryModuleTemp05=bytes_to_int_signed(d[22:23]), # C )
def key_clb(data): data = bytes_to_int(data.messages[0].data[3:]) for c, keyButton in enumerate(keyButtons, 1): if (keyButton.bitSelect & data): if (keyButton.isPressing is False): keyButton.isPressing = True keyButton.pressButton() elif (keyButton.isPressing is True): keyButton.isPressing = False keyButton.releaseButton() return
def odometer(messages): """Odometer decoder.""" d = messages[0].data if len(d) == 0: return None else: v = bytes_to_int(d[9:12]) if v == 0: return None else: return dict(odometer=v) # Km
def bms_2105(messages): """BMS 2105 decoder.""" d = messages[0].data if len(d) == 0: return None else: return dict(soh=bytes_to_int(d[27:29]) / 10.0, # % dcBatteryCellMaxDeterioration=bytes_to_int(d[27:29]) / 10.0, # % dcBatteryCellMinDeterioration=bytes_to_int(d[30:32]) / 10.0, # % socDisplay=int(d[33] / 2.0), # % dcBatteryModuleTemp06=bytes_to_int_signed(d[11:12]), # C dcBatteryModuleTemp07=bytes_to_int_signed(d[12:13]), # C dcBatteryModuleTemp08=bytes_to_int_signed(d[13:14]), # C dcBatteryModuleTemp09=bytes_to_int_signed(d[14:15]), # C dcBatteryModuleTemp10=bytes_to_int_signed(d[15:16]), # C dcBatteryModuleTemp11=bytes_to_int_signed(d[16:17]), # C dcBatteryModuleTemp12=bytes_to_int_signed(d[17:18]), # C dcBatteryCellVoltageDeviation=d[22] / 50, # V dcBatteryHeater1Temperature=float(d[25]), # C dcBatteryHeater2Temperature=float(d[26]), # C dcBatteryCellNoMaxDeterioration=int(d[29]), dcBatteryCellNoMinDeterioration=int(d[32]), )
def dpad_clb(data): try: data = bytes_to_int(data.messages[0].data[3:]) for c, dpadButton in enumerate(dpadButtons, 1): if (dpadButton.bitSelect & data): if (dpadButton.isPressing is False): dpadButton.isPressing = True dpadButton.pressButton() elif (dpadButton.isPressing is True): dpadButton.isPressing = False dpadButton.releaseButton() except: pass return
def temperature(messages): # "(((A*256)+B)/100)-40)" d = messages[0].data v = (bytes_to_int(d) / 100) - 40 # helper function for converting byte arrays to ints return (v, Unit.TEMP)
def fuel(messages): d = messages[0].data v = bytes_to_int(d) / 4.0 return v
def decoder(self, messages): d = messages[0].data d = d[2:] v = bytes_to_int(d) / 4.0 return v
def rpm(messages): """ decoder for RPM messages """ d = messages[0].data v = bytes_to_int(d) / 4.0 return v * Unit.RPM
def engine_load(messages): d = messages[0].data v = bytes_to_int(d) / 2.55 return v
def distance_w_mil(messages): d = messages[0].data v = bytes_to_int(d) return v
def control_module_vtg(messages): d = messages[0].data v = bytes_to_int(d) / 1000 return v
def engine_temp(messages): d = messages[0].data v = bytes_to_int(d) - 40 return v
def vin(messages): """ Decoder for VIN messages """ data = messages[0].data data = data[2:] v = bytes_to_int(data) / 4.0 return v * OBD.Unit.VIN
def speed(messages): d = messages[0].data v = bytes_to_int(d) return v