Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
CANtool + tkinter
#1
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:

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()
Reply
#2
root.mainloop() is what runs the GUI. Anything that blocks mainloop() stops the GUI. You must have something at the start of your program that blocks until you press ctrl+c

This is not going to be simple. You need to start simple and build up from there. I would start by forgetting that there is a can1 or a GUI. I would read one message on can0 and print to stdout. Next, I would write one message to and read one message from can0, printing the read response to stdout.. Have you done that?
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020