Model parse can messages and trigger ui update
This commit is contained in:
parent
c8982ab630
commit
ac36ef74a8
1 changed files with 79 additions and 84 deletions
163
BmsApp.py
163
BmsApp.py
|
|
@ -41,7 +41,7 @@ BMS_MSG_CAT = Enum(
|
||||||
|
|
||||||
|
|
||||||
def find_category(imsg, isignal):
|
def find_category(imsg, isignal):
|
||||||
msg_prefix, master_id, msg_type = parse_can_id(imsg)
|
msg_prefix, master_id, msg_type = imsg
|
||||||
|
|
||||||
if msg_prefix != 0x14180:
|
if msg_prefix != 0x14180:
|
||||||
return BMS_MSG_CAT.ERROR
|
return BMS_MSG_CAT.ERROR
|
||||||
|
|
@ -85,6 +85,7 @@ class BmsListener (can.Listener):
|
||||||
|
|
||||||
def on_message_received(self, msg):
|
def on_message_received(self, msg):
|
||||||
print("{:#X}".format(msg.arbitration_id))
|
print("{:#X}".format(msg.arbitration_id))
|
||||||
|
self.parent.process_message(msg)
|
||||||
|
|
||||||
|
|
||||||
class Controller:
|
class Controller:
|
||||||
|
|
@ -92,21 +93,25 @@ class Controller:
|
||||||
self.view = v
|
self.view = v
|
||||||
self.model = m
|
self.model = m
|
||||||
|
|
||||||
pub.subscribe(self.model.start_can, "model.start")
|
pub.subscribe(self.model.start_can, "view.start")
|
||||||
pub.subscribe(self.model.stop_can, "model.stop")
|
pub.subscribe(self.model.stop_can, "view.stop")
|
||||||
|
|
||||||
|
|
||||||
class Model:
|
class PmgrowBms:
|
||||||
def __init__(self):
|
def __init__(self, add_printer=True):
|
||||||
self.battery_module_state = [{} for i in range(nModule)]
|
self.battery_module_state = [{} for i in range(nModule)]
|
||||||
self.bus = None
|
self.bus = None
|
||||||
self.notifier = None
|
self.notifier = None
|
||||||
self.listen_bms = can.Printer()
|
self.listeners = [can.Printer()] if add_printer else []
|
||||||
#self.listen_bms = BmsListener(self)
|
self.listeners.append(BmsListener(self))
|
||||||
|
|
||||||
|
@property
|
||||||
|
def bms_id (self):
|
||||||
|
return self._bms_id
|
||||||
|
|
||||||
def start_can(self):
|
def start_can(self):
|
||||||
self.bus = can.Bus()
|
self.bus = can.Bus()
|
||||||
self.notifier = can.Notifier(self.bus, [self.listen_bms])
|
self.notifier = can.Notifier(self.bus, self.listeners)
|
||||||
|
|
||||||
def stop_can(self):
|
def stop_can(self):
|
||||||
self.notifier.stop()
|
self.notifier.stop()
|
||||||
|
|
@ -114,86 +119,14 @@ class Model:
|
||||||
self.notifier = None
|
self.notifier = None
|
||||||
self.bus = None
|
self.bus = None
|
||||||
|
|
||||||
def process_message(self, msg):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class BmsMonitorView(BmsMonitorFrame):
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwds):
|
|
||||||
BmsMonitorFrame.__init__(self, *args, **kwds)
|
|
||||||
|
|
||||||
self.battery_module_state = [{} for i in range(nModule)]
|
|
||||||
|
|
||||||
self.timer = wx.Timer(self)
|
|
||||||
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
|
|
||||||
|
|
||||||
self.property_grid_page_info = self.property_grid_1.AddPage("Info")
|
|
||||||
|
|
||||||
for c in pgrid_category:
|
|
||||||
cat_name = c.name
|
|
||||||
cat = wx.propgrid.PropertyCategory(label=cat_name)
|
|
||||||
self.property_grid_page_info.Append(cat)
|
|
||||||
|
|
||||||
# bms_model = wx.propgrid.StringProperty(label="Model", name="bms_model", value="B3DWER32EW")
|
|
||||||
# self.property_grid_page_info.AppendIn("packdata", bms_model)
|
|
||||||
|
|
||||||
for msg in db.messages:
|
|
||||||
prefix, id, type = parse_can_id(msg.frame_id)
|
|
||||||
|
|
||||||
if id == 0x02:
|
|
||||||
|
|
||||||
if find_category(msg.frame_id, 0) == BMS_MSG_CAT.BMS_PROFILE:
|
|
||||||
prop = wx.propgrid.StringProperty(label=msg.name)
|
|
||||||
self.property_grid_page_info.AppendIn(BMS_MSG_CAT.BMS_PROFILE.name, prop)
|
|
||||||
|
|
||||||
for isig, signal in enumerate(msg.signals):
|
|
||||||
plabel = str_hex(type) + signal.name
|
|
||||||
prop = wx.propgrid.StringProperty(label=plabel)
|
|
||||||
prop.SetHelpString(signal.comment)
|
|
||||||
|
|
||||||
cat = find_category(msg.frame_id, isig)
|
|
||||||
|
|
||||||
if cat in pgrid_category:
|
|
||||||
self.property_grid_page_info.AppendIn(cat.name, prop)
|
|
||||||
|
|
||||||
|
|
||||||
def OnToggle(self, event):
|
|
||||||
btnLabel = self.button_1.GetLabel()
|
|
||||||
if self.button_1.Value:
|
|
||||||
# self.bus = can.Bus()
|
|
||||||
|
|
||||||
# self.timer.Start(10)
|
|
||||||
pub.sendMessage ("model.start")
|
|
||||||
self.button_1.SetLabel("Stop")
|
|
||||||
else:
|
|
||||||
# self.bus.shutdown()
|
|
||||||
# self.bus = None
|
|
||||||
|
|
||||||
# self.timer.Stop()
|
|
||||||
pub.sendMessage ("model.stop")
|
|
||||||
self.button_1.SetLabel("Start")
|
|
||||||
|
|
||||||
event.Skip()
|
|
||||||
|
|
||||||
def __update_bm_state(self, dmsg):
|
def __update_bm_state(self, dmsg):
|
||||||
imodule = dmsg['BatS_Cell_ModuleNo']
|
imodule = dmsg['BatS_Cell_ModuleNo']
|
||||||
for k in dmsg:
|
for k in dmsg:
|
||||||
self.battery_module_state[imodule][k] = dmsg[k]
|
self.battery_module_state[imodule][k] = dmsg[k]
|
||||||
|
|
||||||
def GetModuleVoltage(self, module_dict):
|
def process_message(self, msg):
|
||||||
keyString = 'BatS_Cell{}_V'
|
|
||||||
return [module_dict.get(keyString.format(x), -1) for x in range(nCell)]
|
|
||||||
|
|
||||||
def GetModuleBalState(self, module_dict):
|
|
||||||
keyString = 'BatS_Cell{}_BalState'
|
|
||||||
return [module_dict.get(keyString.format(x), -1) for x in range(nCell)]
|
|
||||||
|
|
||||||
def OnTimer(self, event):
|
|
||||||
# print("Read CAN Message!")
|
|
||||||
msg = self.bus.recv(timeout=1.)
|
|
||||||
full_id = msg.arbitration_id
|
|
||||||
msg_prefix, master_id, msg_type = parse_can_id(msg.arbitration_id)
|
msg_prefix, master_id, msg_type = parse_can_id(msg.arbitration_id)
|
||||||
|
full_id = (msg_prefix, master_id, msg_type)
|
||||||
db_msg = db.get_message_by_frame_id(msg.arbitration_id)
|
db_msg = db.get_message_by_frame_id(msg.arbitration_id)
|
||||||
|
|
||||||
id_chosen = int(self.choice_1.GetStringSelection(), 16)
|
id_chosen = int(self.choice_1.GetStringSelection(), 16)
|
||||||
|
|
@ -206,8 +139,11 @@ class BmsMonitorView(BmsMonitorFrame):
|
||||||
print(key, " does not exist")
|
print(key, " does not exist")
|
||||||
else:
|
else:
|
||||||
self.__update_bm_state(decoded)
|
self.__update_bm_state(decoded)
|
||||||
|
pub.sendMessage("bms.module.update", state=self.battery_module_state)
|
||||||
|
|
||||||
elif find_category(full_id, 0) == BMS_MSG_CAT.BMS_PROFILE:
|
elif find_category(full_id, 0) == BMS_MSG_CAT.BMS_PROFILE:
|
||||||
|
pass
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
print("bmsprofile message raw", db_msg.name, msg.data, msg.data.decode())
|
print("bmsprofile message raw", db_msg.name, msg.data, msg.data.decode())
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
|
|
@ -215,7 +151,10 @@ class BmsMonitorView(BmsMonitorFrame):
|
||||||
|
|
||||||
if self.property_grid_page_info.GetProperty(db_msg.name):
|
if self.property_grid_page_info.GetProperty(db_msg.name):
|
||||||
self.property_grid_page_info.SetPropertyValue(db_msg.name, msg.data.decode())
|
self.property_grid_page_info.SetPropertyValue(db_msg.name, msg.data.decode())
|
||||||
|
'''
|
||||||
else:
|
else:
|
||||||
|
pass
|
||||||
|
'''
|
||||||
decoded = db.decode_message(msg.arbitration_id, msg.data)
|
decoded = db.decode_message(msg.arbitration_id, msg.data)
|
||||||
for isig, signal in enumerate(db_msg.signals):
|
for isig, signal in enumerate(db_msg.signals):
|
||||||
plabel = str_hex(msg_type) + signal.name
|
plabel = str_hex(msg_type) + signal.name
|
||||||
|
|
@ -229,15 +168,71 @@ class BmsMonitorView(BmsMonitorFrame):
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
# print (plabel, " is Not Available")
|
# print (plabel, " is Not Available")
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
class BmsMonitorView(BmsMonitorFrame):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwds):
|
||||||
|
BmsMonitorFrame.__init__(self, *args, **kwds)
|
||||||
|
|
||||||
|
self.property_grid_page_info = self.property_grid_1.AddPage("Info")
|
||||||
|
|
||||||
|
for c in pgrid_category:
|
||||||
|
cat_name = c.name
|
||||||
|
cat = wx.propgrid.PropertyCategory(label=cat_name)
|
||||||
|
self.property_grid_page_info.Append(cat)
|
||||||
|
|
||||||
|
# bms_model = wx.propgrid.StringProperty(label="Model", name="bms_model", value="B3DWER32EW")
|
||||||
|
# self.property_grid_page_info.AppendIn("packdata", bms_model)
|
||||||
|
|
||||||
|
for msg in db.messages:
|
||||||
|
prefix, id, type = parse_can_id(msg.frame_id)
|
||||||
|
id_tuple = prefix, id, type
|
||||||
|
|
||||||
|
if id == 0x02:
|
||||||
|
|
||||||
|
if find_category(id_tuple, 0) == BMS_MSG_CAT.BMS_PROFILE:
|
||||||
|
prop = wx.propgrid.StringProperty(label=msg.name)
|
||||||
|
self.property_grid_page_info.AppendIn(BMS_MSG_CAT.BMS_PROFILE.name, prop)
|
||||||
|
|
||||||
|
for isig, signal in enumerate(msg.signals):
|
||||||
|
plabel = str_hex(type) + signal.name
|
||||||
|
prop = wx.propgrid.StringProperty(label=plabel)
|
||||||
|
prop.SetHelpString(signal.comment)
|
||||||
|
|
||||||
|
cat = find_category(id_tuple, isig)
|
||||||
|
|
||||||
|
if cat in pgrid_category:
|
||||||
|
self.property_grid_page_info.AppendIn(cat.name, prop)
|
||||||
|
|
||||||
|
pub.subscribe (self.update_battery_module_grid, "bms.module.update")
|
||||||
|
|
||||||
|
def GetModuleVoltage(self, module_dict):
|
||||||
|
keyString = 'BatS_Cell{}_V'
|
||||||
|
return [module_dict.get(keyString.format(x), -1) for x in range(nCell)]
|
||||||
|
|
||||||
|
def GetModuleBalState(self, module_dict):
|
||||||
|
keyString = 'BatS_Cell{}_BalState'
|
||||||
|
return [module_dict.get(keyString.format(x), -1) for x in range(nCell)]
|
||||||
|
|
||||||
|
def update_battery_module_grid(self, state):
|
||||||
i_module = self.spin_ctrl_1.GetValue()
|
i_module = self.spin_ctrl_1.GetValue()
|
||||||
module_dict = self.battery_module_state[i_module]
|
module_dict = self.state[i_module]
|
||||||
voltages = self.GetModuleVoltage(module_dict)
|
voltages = self.GetModuleVoltage(module_dict)
|
||||||
bal_states = self.GetModuleBalState(module_dict)
|
bal_states = self.GetModuleBalState(module_dict)
|
||||||
for i in range(nCell):
|
for i in range(nCell):
|
||||||
self.grid_1.SetCellValue(i, 0, str(voltages[i]))
|
self.grid_1.SetCellValue(i, 0, str(voltages[i]))
|
||||||
self.grid_1.SetCellValue(i, 2, str(bal_states[i]))
|
self.grid_1.SetCellValue(i, 2, str(bal_states[i]))
|
||||||
|
|
||||||
|
def OnToggle(self, event):
|
||||||
|
if self.button_1.Value:
|
||||||
|
pub.sendMessage("view.start")
|
||||||
|
self.button_1.SetLabel("Stop")
|
||||||
|
else:
|
||||||
|
pub.sendMessage("view.stop")
|
||||||
|
self.button_1.SetLabel("Start")
|
||||||
|
|
||||||
event.Skip()
|
event.Skip()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -245,7 +240,7 @@ class BmsMonitorView(BmsMonitorFrame):
|
||||||
|
|
||||||
class BmsApp(wx.App):
|
class BmsApp(wx.App):
|
||||||
def OnInit(self):
|
def OnInit(self):
|
||||||
self.bms = Model()
|
self.bms = PmgrowBms()
|
||||||
self.frame = BmsMonitorView(None, wx.ID_ANY, "")
|
self.frame = BmsMonitorView(None, wx.ID_ANY, "")
|
||||||
self.bms_controller = Controller(self.bms, self.frame)
|
self.bms_controller = Controller(self.bms, self.frame)
|
||||||
self.SetTopWindow(self.frame)
|
self.SetTopWindow(self.frame)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue