diff --git a/BmsApp.py b/BmsApp.py index c6f80f8..679ff8e 100644 --- a/BmsApp.py +++ b/BmsApp.py @@ -41,7 +41,7 @@ BMS_MSG_CAT = Enum( 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: return BMS_MSG_CAT.ERROR @@ -85,6 +85,7 @@ class BmsListener (can.Listener): def on_message_received(self, msg): print("{:#X}".format(msg.arbitration_id)) + self.parent.process_message(msg) class Controller: @@ -92,21 +93,25 @@ class Controller: self.view = v self.model = m - pub.subscribe(self.model.start_can, "model.start") - pub.subscribe(self.model.stop_can, "model.stop") + pub.subscribe(self.model.start_can, "view.start") + pub.subscribe(self.model.stop_can, "view.stop") -class Model: - def __init__(self): +class PmgrowBms: + def __init__(self, add_printer=True): self.battery_module_state = [{} for i in range(nModule)] self.bus = None self.notifier = None - self.listen_bms = can.Printer() - #self.listen_bms = BmsListener(self) + self.listeners = [can.Printer()] if add_printer else [] + self.listeners.append(BmsListener(self)) + + @property + def bms_id (self): + return self._bms_id def start_can(self): 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): self.notifier.stop() @@ -114,86 +119,14 @@ class Model: self.notifier = 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): imodule = dmsg['BatS_Cell_ModuleNo'] for k in dmsg: self.battery_module_state[imodule][k] = dmsg[k] - 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 OnTimer(self, event): - # print("Read CAN Message!") - msg = self.bus.recv(timeout=1.) - full_id = msg.arbitration_id + def process_message(self, msg): 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) id_chosen = int(self.choice_1.GetStringSelection(), 16) @@ -206,8 +139,11 @@ class BmsMonitorView(BmsMonitorFrame): print(key, " does not exist") else: 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: + pass + ''' try: print("bmsprofile message raw", db_msg.name, msg.data, msg.data.decode()) except UnicodeDecodeError: @@ -215,7 +151,10 @@ class BmsMonitorView(BmsMonitorFrame): if self.property_grid_page_info.GetProperty(db_msg.name): self.property_grid_page_info.SetPropertyValue(db_msg.name, msg.data.decode()) + ''' else: + pass + ''' decoded = db.decode_message(msg.arbitration_id, msg.data) for isig, signal in enumerate(db_msg.signals): plabel = str_hex(msg_type) + signal.name @@ -229,15 +168,71 @@ class BmsMonitorView(BmsMonitorFrame): else: pass # 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() - module_dict = self.battery_module_state[i_module] + module_dict = self.state[i_module] voltages = self.GetModuleVoltage(module_dict) bal_states = self.GetModuleBalState(module_dict) for i in range(nCell): self.grid_1.SetCellValue(i, 0, str(voltages[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() @@ -245,7 +240,7 @@ class BmsMonitorView(BmsMonitorFrame): class BmsApp(wx.App): def OnInit(self): - self.bms = Model() + self.bms = PmgrowBms() self.frame = BmsMonitorView(None, wx.ID_ANY, "") self.bms_controller = Controller(self.bms, self.frame) self.SetTopWindow(self.frame)