Feb-09-2024, 03:22 PM
Hello,
I'm doing a can logger/can translator and I have two issues:
1. GUI is showing only when I will terminate process (ctrl +c )
2. How to get and use signals and singal values from decoded frames?
My code:
I'm doing a can logger/can translator and I have two issues:
1. GUI is showing only when I will terminate process (ctrl +c )
2. How to get and use signals and singal values from decoded frames?
My code:
from tkinter import * from PIL import Image from PIL import ImageTk import os import sys import RPi.GPIO as GPIO import can import time import datetime import cantools from pprint import pprint root = Tk() #root.geometry("800x600") #root.attributes('-type', 'dock') #root.focus_force() GPIO.setmode(GPIO.BCM) os.system('sudo ifconfig can0 down') os.system('sudo ip link set can0 type can bitrate 250000') os.system('sudo ifconfig can0 up') os.system('sudo ifconfig can1 down') os.system('sudo ip link set can1 type can bitrate 500000') os.system('sudo ifconfig can1 up') can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan') can1 = can.interface.Bus(channel = 'can1', bustype = 'socketcan') root.geometry("700x610") root.title("Volvo PowerPack Tester") root.resizable(False, False) db1 = cantools.database.load_file('/home/pi/BBCOM.dbc') db2 = cantools.database.load_file('/home/pi/ENERGY.dbc') if os.environ.get('DISPLAY','') == '': print('no display found. Using :0.0') os.environ.__setitem__('DISPLAY', ':0.0') GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) def Create_label(): global entry1 global entry2 global entry3 global entry4 global entry5 global entry6 global entry7 global entry8 global entry9 root.status = LabelFrame(root, text='CAN net Status', relief=GROOVE, bd=2) root.status.place(width=370, height=65, x=10, y=10) root.log = LabelFrame(root, text='CAN LOG', relief=GROOVE, bd=2) root.log.place(width=370, height=525, x=10, y=75) root.sender = LabelFrame(root, text='Send Frame', relief=GROOVE, bd=2) root.sender.place(width=290, height=145, x=385, y=10) root.log.textbox = Text(root.log, width=44, height=30) root.log.textbox.grid(row=1, column=1, sticky="nesw", ) can0_label = Label(root.status, text="CAN0") can0_label.grid(row=1, column=1, sticky="nsw", ) can1_label = Label(root.status, text="CAN1") can1_label.grid(row=2, column=1, sticky="nsw", ) root.log.textbox = Text(root.log, width=44, height=30) root.log.textbox.grid(row=1, column=1, sticky="nesw", ) can0_stat_label = Label(root.status) can0_stat_label.grid(row=1, column=2, sticky="nsw", ) can1_stat_label = Label(root.status) can1_stat_label.grid(row=2, column=2, sticky="nsw", ) entry1 = Entry(root.sender, width = 8 ) entry1.grid(row=1, column=1, sticky="nsw",) entry2 = Entry(root.sender, width = 2 ) entry2.grid(row=1, column=2, sticky="nsw",) entry3 = Entry(root.sender, width = 2 ) entry3.grid(row=1, column=3, sticky="nsw",) entry4 = Entry(root.sender, width = 2 ) entry4.grid(row=1, column=4, sticky="nsw",) entry5 = Entry(root.sender, width = 2 ) entry5.grid(row=1, column=5, sticky="nsw",) entry6 = Entry(root.sender, width = 2 ) entry6.grid(row=1, column=6, sticky="nsw",) entry7 = Entry(root.sender, width = 2 ) entry7.grid(row=1, column=7, sticky="nsw",) entry8 = Entry(root.sender, width = 2 ) entry8.grid(row=1, column=8, sticky="nsw",) entry9 = Entry(root.sender, width = 2 ) entry9.grid(row=1, column=9, sticky="nsw",) can1_label = Label(root.sender, text="Send to:") can1_label.grid(row=2, column=1, sticky="nsw", ) send_button = Button(root.sender, text ="CAN0", width = 6, command = senddata_can0) send_button.grid(row=4, column=1, sticky="nsw", ) send_button = Button(root.sender, text ="CAN1", width = 6, command = senddata_can1) send_button.grid(row=5, column=1, sticky="nsw", ) Change() def can_read(): msg0 = can0.recv() msg1 = can1.recv() return msg0, msg1 def senddata_can0(): global data_snd date = datetime.datetime.now() ent1 = entry1.get() ent2 = entry2.get() ent3 = entry3.get() ent4 = entry4.get() ent5 = entry5.get() ent6 = entry6.get() ent7 = entry7.get() ent8 = entry8.get() ent9 = entry9.get() arb_id = int(ent1, 16) data_snd0 = int(ent2, 16) data_snd1 = int(ent3, 16) data_snd2 = int(ent4, 16) data_snd3 = int(ent5, 16) data_snd4 = int(ent6, 16) data_snd5 = int(ent7, 16) data_snd6 = int(ent8, 16) data_snd7 = int(ent9, 16) msg = can.Message(arbitration_id=arb_id, data=[data_snd0, data_snd1, data_snd2, data_snd3, data_snd4, data_snd5, data_snd6, data_snd7], extended_id=True) try: can0.send(msg) root.log.textbox.insert(END, "SEND, CAN0, ") root.log.textbox.insert(END, "%s" % date) root.log.textbox.insert(END, ",") root.log.textbox.insert(END, "%s" % ent1) root.log.textbox.insert(END, "%s %s %s %s %s %s %s %s" % ( ent2, ent3, ent4, ent5, ent6, ent7, ent8, ent9)) root.log.textbox.insert(END, " \n") with open("/home/pi/canlog.txt", 'a') as f: f.write("\n") f.write("SEND, CAN0, ") f.write("%s" %date) f.write(",") f.write(" %s" % ent1) f.write(" %s %s %s %s %s %s %s %s" % ( ent2, ent3, ent4, ent5, ent6, ent7, ent8, ent9)) except can.CanError: root.log.textbox.insert(END, "\n") root.log.textbox.insert(END, "%s" % date) root.log.textbox.insert(END, "CAN0 SEND ERROR ") with open("/home/pi/canlog.txt", 'a') as f: f.write("\n") f.write("%s" % date) f.write("CAN0 SEND ERROR ") def senddata_can1(): global data_snd date = datetime.datetime.now() ent1 = entry1.get() ent2 = entry2.get() ent3 = entry3.get() ent4 = entry4.get() ent5 = entry5.get() ent6 = entry6.get() ent7 = entry7.get() ent8 = entry8.get() ent9 = entry9.get() arb_id = int(ent1, 16) data_snd0 = int(ent2, 16) data_snd1 = int(ent3, 16) data_snd2 = int(ent4, 16) data_snd3 = int(ent5, 16) data_snd4 = int(ent6, 16) data_snd5 = int(ent7, 16) data_snd6 = int(ent8, 16) data_snd7 = int(ent9, 16) msg = can.Message(arbitration_id=arb_id, data=[data_snd0, data_snd1, data_snd2, data_snd3, data_snd4, data_snd5, data_snd6, data_snd7], extended_id=True) try: can1.send(msg) root.log.textbox.insert(END, "SEND, CAN1, ") root.log.textbox.insert(END, "%s" % date) root.log.textbox.insert(END, ",") root.log.textbox.insert(END, "%s" % ent1) root.log.textbox.insert(END, "%s %s %s %s %s %s %s %s" % (ent2, ent3, ent4, ent5, ent6, ent7, ent8, ent9)) root.log.textbox.insert(END, " \n") with open("/home/pi/canlog.txt", 'a') as f: f.write("\n") f.write("SEND, CAN1, ") f.write("%s" % date) f.write(",") f.write(" %s" % ent1) f.write(" %s %s %s %s %s %s %s %s" % (ent2, ent3, ent4, ent5, ent6, ent7, ent8, ent9)) except can.CanError: root.log.textbox.insert(END, "\n") root.log.textbox.insert(END, "%s" % date) root.log.textbox.insert(END, "CAN1 SEND ERROR ") with open("/home/pi/canlog.txt", 'a') as f: f.write("\n") f.write("%s" % date) f.write("CAN1 SEND ERROR ") def Create_view(): Create_label() root.mainloop() def Change(): msg0, msg1 = can_read() if (msg0 is not None): try: messages = db2.decode_message(msg0.arbitration_id, msg0.data) for message in messages: root.log.textbox.insert(END, '\n') root.log.textbox.insert(END, message) root.log.textbox.insert(END, ":") root.log.textbox.insert(END, message.frame_id()) except: pass #with open("/home/pi/canlog.txt", 'a') as f: # date = datetime.datetime.now() # f.write("\n") # f.write("RECEIVED, CAN0, ") # f.write("%s" % date) # f.write(",") # f.write("%s" % msg0.arbitration_id) #f.write("%s,%s,%s,%s,%s,%s,%s,%s," % (msg0.data[0], msg0.data[1],msg0.data[1],msg0.data[3],msg0.data[4],msg0.data[5],msg0.data[6],msg0.data[7]) ) if (msg1 is not None): try: messages = db1.decode_message(msg1.arbitration_id, msg1.data) #print(message) for message in messages: root.log.textbox.insert(END, '\n') root.log.textbox.insert(END, message) root.log.textbox.insert(END, ":") root.log.textbox.insert(END, message.frame_id()) except: pass #with open("/home/pi/canlog.txt", 'a') as f: # date = datetime.datetime.now() # f.write("\n") # f.write("RECEIVED, CAN1, ") # f.write("%s" % date) # f.write(",") # f.write("%s" %msg1.arbitration_id) root.after(0, Change) # Recurent loop Create_view() #Change() root.mainloop() GPIO.cleanup()