#!/usr/bin/env python # -*- coding: UTF-8 -*- # # generated by wxGlade 0.9.5 on Mon Feb 3 15:18:49 2020 # import wx import wx.propgrid # begin wxGlade: dependencies import gettext # end wxGlade import can import cantools # begin wxGlade: extracode # end wxGlade class MyFrame(wx.Frame): def __init__(self, *args, **kwds): # begin wxGlade: MyFrame.__init__ kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.SetSize((400, 300)) self.counter = 0 self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) self.property_grid_1 = wx.propgrid.PropertyGrid(self, wx.ID_ANY) #cat1 = wx.propgrid.PropertyCategory("Message 1") #self.property_grid_1.Append(cat1) #self.property_grid_1.AppendIn(wx.propgrid.PGPropArgCls(cat1), wx.propgrid.StringProperty(label="sp1", name="test_string", value="some string value")) self.property_grid_1.Append(wx.propgrid.StringProperty(label="sp1", value="some string value")) self.button_1 = wx.ToggleButton(self, wx.ID_ANY, _("Start")) self.__set_properties() self.__do_layout() self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleCAN, self.button_1) # end wxGlade self.candb = cantools.database.load_file('res/EBUS_Host.dbc') self.battery_module_state = [{} for i in range(18)] def __set_properties(self): # begin wxGlade: MyFrame.__set_properties self.SetTitle(_("frame")) # end wxGlade def __do_layout(self): # begin wxGlade: MyFrame.__do_layout sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_1.Add(self.property_grid_1, 1, wx.EXPAND, 0) sizer_1.Add(self.button_1, 0, 0, 0) self.SetSizer(sizer_1) self.Layout() # end wxGlade def ToggleCAN(self, event): # wxGlade: MyFrame. btnLabel = self.button_1.GetLabel() if self.button_1.Value: print ("starting timer...") self.bus = can.Bus() self.timer.Start(10) self.button_1.SetLabel("Stop") else: print ( "timer stopped!" ) self.bus.shutdown() self.bus = None self.timer.Stop() self.button_1.SetLabel("Start") event.Skip() def OnTimer(self, event): # wxGlade: MyFrame. # print("Read CAN Message!") msg = self.bus.recv(timeout=1.) islave = (msg.arbitration_id & (~0xfffff0ff)) mtag = (msg.arbitration_id & 0xfffff000) >> 12 mid = (msg.arbitration_id & 0xf00) >> 8 mtype = msg.arbitration_id & 0xff if 0x07 <= mtype <= 0x0b: try: dmsg = self.candb.decode_message(msg.arbitration_id, msg.data) except KeyError as key: print(key, " does not exist") else: print(hex(mtag), hex(mid), hex(mtype), msg.data, dmsg) self.__update_bm_state(dmsg) for k in self.battery_module_state[0]: if self.property_grid_1.GetProperty(k): self.property_grid_1.SetPropertyValue(k, self.battery_module_state[0][k]) else: self.property_grid_1.Append(wx.propgrid.StringProperty(label=k, value=str(self.battery_module_state[0][k]))) event.Skip() def __update_bm_state(self, dmsg): imodule = dmsg['BatS_Cell_ModuleNo'] for k in dmsg: self.battery_module_state[imodule][k] = dmsg[k] # end of class MyFrame class MyApp(wx.App): def OnInit(self): self.frame = MyFrame(None, wx.ID_ANY, "") self.SetTopWindow(self.frame) self.frame.Show() return True # end of class MyApp if __name__ == "__main__": gettext.install("app") # replace with the appropriate catalog name app = MyApp(0) app.MainLoop()