I am trying to connect to the CAN-bus of my car. The connection is working and the data is printing to the terminal without any problems.
bus = can.interface.Bus("can0", bustype="socketcan")
notifier = can.Notifier(bus, [can.Printer()])
I am using Python Can 2.2 and python 3.7.
I want to add a new listener with some sort of switch-case statement on the can.dlc. Would the pseudocode below be the best way to do that?
import can
def parse_data(can):
SingleCanFrame = can.Message
print(SingleCanFrame)
if SingleCanFrame.arbitration_id == 304: #car voltage
#convert data
#save to DB table 1
elif SingleCanFrame.arbitration_id == 400: #car speed
#convert data
#save to DB table 2
elif SingleCanFrame.arbitration_id == 401: #car tachometer
#convert data
#save to DB table 3
else:
#save to DB errorlog
bus = can.interface.Bus("can0", bustype="socketcan")
notifier = can.Notifier(bus, [parse_data(can)])
Edit 1:
forgot the parameter: def parse_data(can)
Edit 2:
New code
import can
CAR = {"voltage": 304, "speed": 400, "tachometer": 401}
def cellvoltage(SingleCanFrame, MyDB):
#convert data
#save to DB table 1
def packcurrent(SingleCanFrame, MyDB):
#convert data
#save to DB table 2
def tachometer(SingleCanFrame, MyDB):
#convert data
#save to DB table 3
def parse_data(can):
SingleCanFrame = can.Message
MyDB = SomeDB.Connect()
print(SingleCanFrame)
if SingleCanFrame.arbitration_id == CAR["voltage"]: #car voltage
cellvoltage(SingleCanFrame, MyDB)
elif SingleCanFrame.arbitration_id == CAR["speed"]: #car speed
packcurrent(SingleCanFrame, MyDB)
elif SingleCanFrame.arbitration_id == CAR["tachometer"]: #car tachometer
tachometer(SingleCanFrame, MyDB)
else:
#save to DB errorlog
bus = can.interface.Bus("can0", bustype="socketcan")
notifier = can.Notifier(bus, [parse_data(can)])