dummy model and controller
This commit is contained in:
parent
5e109268db
commit
6cbc6b6158
1 changed files with 53 additions and 39 deletions
92
BmsApp.py
92
BmsApp.py
|
|
@ -20,12 +20,14 @@ nCell = 12
|
|||
|
||||
from BmsView import BmsMonitorFrame
|
||||
|
||||
def parse_can_id (arbitration_id):
|
||||
|
||||
def parse_can_id(arbitration_id):
|
||||
mtag = (arbitration_id & 0xfffff000) >> 12
|
||||
mid = (arbitration_id & 0xf00) >> 8
|
||||
mtype = arbitration_id & 0xff
|
||||
return mtag, mid, mtype
|
||||
|
||||
|
||||
BMS_MSG_CAT = Enum(
|
||||
"BMS_MSG_CAT",
|
||||
"BMS_PROFILE "
|
||||
|
|
@ -37,7 +39,8 @@ BMS_MSG_CAT = Enum(
|
|||
"ERROR "
|
||||
)
|
||||
|
||||
def findCategory (imsg, isignal):
|
||||
|
||||
def findCategory(imsg, isignal):
|
||||
tag, id, type = parse_can_id(imsg)
|
||||
|
||||
if tag != 0x14180:
|
||||
|
|
@ -45,34 +48,28 @@ def findCategory (imsg, isignal):
|
|||
|
||||
if 0x00 <= type <= 0x06:
|
||||
return BMS_MSG_CAT.BMS_PROFILE
|
||||
|
||||
elif type == 0x11:
|
||||
return BMS_MSG_CAT.PACK_PROFILE
|
||||
|
||||
elif 0x07 <= type <= 0x0B:
|
||||
return BMS_MSG_CAT.MODULE_DATA
|
||||
elif type == 0x10:
|
||||
if isignal < 4:
|
||||
return BMS_MSG_CAT.PACK_PROFILE
|
||||
else:
|
||||
return BMS_MSG_CAT.PACK_ALARM
|
||||
|
||||
elif type == 0x11:
|
||||
return BMS_MSG_CAT.PACK_PROFILE
|
||||
elif type == 0x14:
|
||||
return BMS_MSG_CAT.PACK_DATA
|
||||
elif type == 0x15:
|
||||
if isignal < 3:
|
||||
return BMS_MSG_CAT.PACK_DATA
|
||||
else:
|
||||
return BMS_MSG_CAT.PACK_ALARM
|
||||
|
||||
elif type == 0x14:
|
||||
return BMS_MSG_CAT.PACK_DATA
|
||||
|
||||
elif 0x16 <= type <= 0x20:
|
||||
return BMS_MSG_CAT.PACK_DATA
|
||||
|
||||
elif 0x07 <= type <= 0x0B:
|
||||
return BMS_MSG_CAT.MODULE_DATA
|
||||
|
||||
else:
|
||||
return BMS_MSG_CAT.UNDEFINED
|
||||
|
||||
|
||||
cat_propgrid = [
|
||||
BMS_MSG_CAT.BMS_PROFILE,
|
||||
BMS_MSG_CAT.PACK_PROFILE,
|
||||
|
|
@ -82,6 +79,23 @@ cat_propgrid = [
|
|||
|
||||
tohex = "{:#04X}-".format
|
||||
|
||||
|
||||
class Controller:
|
||||
def __init__(self, m, v):
|
||||
self.view = v
|
||||
self.model = m
|
||||
|
||||
pub.subscribe(lambda: "dummy function", "dummy message")
|
||||
|
||||
|
||||
class Model:
|
||||
def __init__(self):
|
||||
self.battery_module_state = [{} for i in range(nModule)]
|
||||
|
||||
def process_message(self, msg):
|
||||
pass
|
||||
|
||||
|
||||
class BmsMonitorView(BmsMonitorFrame):
|
||||
|
||||
def __init__(self, *args, **kwds):
|
||||
|
|
@ -112,7 +126,7 @@ class BmsMonitorView(BmsMonitorFrame):
|
|||
self.property_grid_page_info.AppendIn(BMS_MSG_CAT.BMS_PROFILE.name, prop)
|
||||
|
||||
for isig, signal in enumerate(msg.signals):
|
||||
plabel = tohex(type)+signal.name
|
||||
plabel = tohex(type) + signal.name
|
||||
prop = wx.propgrid.StringProperty(label=plabel)
|
||||
prop.SetHelpString(signal.comment)
|
||||
|
||||
|
|
@ -132,13 +146,13 @@ class BmsMonitorView(BmsMonitorFrame):
|
|||
def OnToggle(self, event):
|
||||
btnLabel = self.button_1.GetLabel()
|
||||
if self.button_1.Value:
|
||||
print ("starting timer...")
|
||||
print("starting timer...")
|
||||
self.bus = can.Bus()
|
||||
|
||||
self.timer.Start(10)
|
||||
self.button_1.SetLabel("Stop")
|
||||
else:
|
||||
print ( "timer stopped!" )
|
||||
print("timer stopped!")
|
||||
self.bus.shutdown()
|
||||
self.bus = None
|
||||
|
||||
|
|
@ -153,58 +167,55 @@ class BmsMonitorView(BmsMonitorFrame):
|
|||
self.battery_module_state[imodule][k] = dmsg[k]
|
||||
|
||||
def GetModuleVoltage(self, module_dict):
|
||||
keyString='BatS_Cell{}_V'
|
||||
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'
|
||||
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.)
|
||||
fullid = msg.arbitration_id
|
||||
full_id = msg.arbitration_id
|
||||
mtag, mid, mtype = parse_can_id(msg.arbitration_id)
|
||||
dbmsg = db.get_message_by_frame_id(msg.arbitration_id)
|
||||
db_msg = db.get_message_by_frame_id(msg.arbitration_id)
|
||||
|
||||
master_id = int(self.choice_1.GetStringSelection(), 16)
|
||||
|
||||
if mid == master_id:
|
||||
if findCategory(fullid, 0) == BMS_MSG_CAT.MODULE_DATA:
|
||||
if findCategory(full_id, 0) == BMS_MSG_CAT.MODULE_DATA:
|
||||
try:
|
||||
dmsg = db.decode_message(msg.arbitration_id, msg.data)
|
||||
decoded = db.decode_message(msg.arbitration_id, msg.data)
|
||||
except KeyError as key:
|
||||
print(key, " does not exist")
|
||||
else:
|
||||
self.__update_bm_state(dmsg)
|
||||
self.__update_bm_state(decoded)
|
||||
|
||||
elif findCategory(fullid, 0) == BMS_MSG_CAT.BMS_PROFILE:
|
||||
elif findCategory(full_id, 0) == BMS_MSG_CAT.BMS_PROFILE:
|
||||
try:
|
||||
print ("bmsprofile message raw", (dbmsg.name), msg.data, msg.data.decode())
|
||||
print("bmsprofile message raw", db_msg.name, msg.data, msg.data.decode())
|
||||
except UnicodeDecodeError:
|
||||
print ("bmsprofile message raw", (dbmsg.name), msg.data, int.from_bytes(msg.data, byteorder="big"))
|
||||
print("bmsprofile message raw", db_msg.name, msg.data, int.from_bytes(msg.data, byteorder="big"))
|
||||
|
||||
if self.property_grid_page_info.GetProperty(dbmsg.name):
|
||||
self.property_grid_page_info.SetPropertyValue(dbmsg.name, msg.data.decode())
|
||||
if self.property_grid_page_info.GetProperty(db_msg.name):
|
||||
self.property_grid_page_info.SetPropertyValue(db_msg.name, msg.data.decode())
|
||||
else:
|
||||
dmsg = db.decode_message(msg.arbitration_id, msg.data)
|
||||
for isig, signal in enumerate(dbmsg.signals):
|
||||
decoded = db.decode_message(msg.arbitration_id, msg.data)
|
||||
for isig, signal in enumerate(db_msg.signals):
|
||||
plabel = tohex(mtype) + signal.name
|
||||
cat = findCategory(fullid, isig)
|
||||
cat = findCategory(full_id, isig)
|
||||
|
||||
if cat in cat_propgrid:
|
||||
if self.property_grid_page_info.GetProperty(plabel):
|
||||
# print (plabel, dmsg[signal.name])
|
||||
value = float(dmsg[signal.name]) if signal.is_float else dmsg[signal.name]
|
||||
# print (plabel, decoded[signal.name])
|
||||
value = float(decoded[signal.name]) if signal.is_float else decoded[signal.name]
|
||||
self.property_grid_page_info.SetPropertyValue(plabel, value)
|
||||
else:
|
||||
pass
|
||||
# print (plabel, " is Not Available")
|
||||
|
||||
'''
|
||||
if tag == 0x14180 and id == 0x2 and 0x00 <= type <= 0x06: # BMS Profile
|
||||
self.property_grid_page_info.AppendIn(BMS_MSG_CAT.BMS_PROFILE, prop)
|
||||
|
||||
if tag == 0x14180 and id == 0x2 and 0x10 <= type <= 0x20: # Pack Profile and Data
|
||||
self.property_grid_page_info.AppendIn("packdata", prop)
|
||||
'''
|
||||
|
|
@ -224,15 +235,18 @@ class BmsMonitorView(BmsMonitorFrame):
|
|||
|
||||
class BmsApp(wx.App):
|
||||
def OnInit(self):
|
||||
self.bms = Model()
|
||||
self.frame = BmsMonitorView(None, wx.ID_ANY, "")
|
||||
self.bms_controller = Controller(self.bms, self.frame)
|
||||
self.SetTopWindow(self.frame)
|
||||
self.frame.Show()
|
||||
return True
|
||||
|
||||
|
||||
# end of class BmsApp
|
||||
|
||||
if __name__ == "__main__":
|
||||
gettext.install("app") # replace with the appropriate catalog name
|
||||
gettext.install("app") # replace with the appropriate catalog name
|
||||
|
||||
app = BmsApp(0)
|
||||
app.MainLoop()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue