Уведомление шины CAN Python

Пытаюсь подключиться к CAN-шине своего автомобиля. Соединение работает, и данные печатаются на терминал без проблем.

bus = can.interface.Bus("can0", bustype="socketcan")
notifier = can.Notifier(bus, [can.Printer()])

Я использую Pyhton Can 2.2 и Python 3.7.

Я хочу добавить нового слушателя с каким-то оператором switch-case в файле can.dlc. Будет ли приведенный ниже псевдокод лучшим способом сделать это?

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)]) 

Редактировать 1:

забыл параметр: def parse_data(can)

Редактировать 2:

Новый код

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)]) 

person Mindfuucker    schedule 13.08.2018    source источник
comment
dlc — это код длины данных от 0 до 8. См. здесь.   -  person yegorich    schedule 21.08.2018
comment
Извините, я имел в виду арбитраж_идентификатор   -  person Mindfuucker    schedule 21.08.2018


Ответы (1)


По сути, это был бы прекрасный способ сделать это.

Однако, если вы хотите более четко выразить свое намерение, словарь будет полезен:

CAR = {"voltage": 304, "speed": 400, "tachometer": 401} # capital var name as this a constant var

Тогда вы можете просто ссылаться на значения как if SingleCanFrame.dlc == CAR["voltage"]:, что менее подвержено ошибкам.

person RealPawPaw    schedule 13.08.2018
comment
Словарь действительно был бы отличным способом сделать это. Есть ли смысл дальше разбивать функционал на функции? - person Mindfuucker; 13.08.2018
comment
Мне нужно больше контекста, чтобы говорить об этом о «функциональности» и «функциях». Хотя эмпирическое правило заключается в том, что любой код, который можно использовать повторно или который будет повторно использоваться с небольшими изменениями, должен быть помещен в функцию, кандидатами на которую могут быть преобразование данных и сохранение в таблицу БД. - person RealPawPaw; 13.08.2018