bms-can-ui/hello.py
2020-02-10 12:17:43 -08:00

128 lines
3.9 KiB
Python

#!/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.<event_handler>
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.<event_handler>
# 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(msg.arbitration_id), hex(mtag), hex(mid), hex(mtype), 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()