import wx import os import time import threading from pathlib import PurePath,Path from pubsub import pub # from configobj import ConfigObj from listctrl import Listctrl from mypanel import MyPanel,Plot,LineColor from uiconfig.uisensor import UISensor # from uiconfig.uilogging import UILogging from uiconfig.uiabout import About from uiconfig.uihelp import Help from uiconfig.ui_plot_setting import UI_Plot_Setting from myconfig import TOKEN,DeviceType,YAML_FILE_NAME,RETRIEVE_CFG_FILE,DATA_DIR from myconfig import MyConfig,RamsesFunc from mythread import Mythead from configuration import Configuration # from awrams import AWRAMS,HandHeldBuf from awrams import AWRAMS,AwramsHandle from tools.myexception import MyException from tools.mylogger import log # -定义菜单ID,关联Event------------------------- ID_MEASURE = 1 ID_DEAL_SERVER = 2 ID_SENSOR_SETTING = 11 ID_LOGGING_SETTING = 12 ID_CAL_INFO = 13 ID_DISPLAY_PARA = 14 ID_PLOT_LAST = 15 ID_PLOT_LAST_7 = 16 ID_PLOT_7 = 17 ID_PLOT_SETTING = 18 ID_HELP = 21 ID_ABOUT = 22 class YiwinFrame(wx.Frame): '''将buf类传进来''' def __init__(self, title, parent, size=(900, 750)): self.device_id = 2 self.device_type = DeviceType.SURFACE.name self.syscfg = {} self.sensor_cfg = {} self.retrieve = {} self.calinfo_is_ok = False self.title = title self.path = PurePath() # self.save_fname:Path = Path(self.path.joinpath(DATA_FNAME)) self.error_result = [] self.result = '' self.displayData:list =[] self.interval = 0 super(YiwinFrame, self).__init__( parent, title=self.title, size = size ) self.BoxSizer = wx.BoxSizer(wx.HORIZONTAL) # 建立一个Boxsizer self.SetSizer(self.BoxSizer) self.Centre(wx.BOTH) # 建立 listctrl panel 放到BoxSizer self.listctrl_panel = Listctrl( self ) # 调用自己建立的 Listctrl panel 类 self.BoxSizer.Add( self.listctrl_panel, proportion =-10, border = 2, flag = wx.ALL | wx.EXPAND) self.list_ctrl = self.listctrl_panel.list_ctrl # 隐藏 等待show self.listctrl_panel.Hide() self.mypanel = MyPanel( self ) # 调用自己建立的 Listctrl panel 类 self.BoxSizer.Add( self.mypanel, proportion =-10, border = 0, flag = wx.ALL | wx.EXPAND) self.static_text = self.mypanel.staticText1 # 隐藏 等待show self.mypanel.Hide() self.plotpanel = Plot( self ) # 调用自己建立的 Listctrl panel 类 self.BoxSizer.Add( self.plotpanel, proportion =-10, border = 0, flag = wx.ALL | wx.EXPAND) self.plotpanel.set_title_x_y(*self.plotpanel.purewater_legend) self.plotpanel.Show() self.statusBar = self.CreateStatusBar() # 创建状态栏 self.statusBar.SetFieldsCount(2) # 状态栏分成3个区域 self.statusBar.SetStatusWidths([-1, -1]) # 区域宽度比列,用负数 self.statusBar.SetStatusText(u" 等待接收消息......", 0) self.__set_menu() # 添加菜单 self.__attach_events() # 菜单事件 self.__set_properties() # self.__read_config() self.__setTimer() log.info(f"system init....",__name__, "__init__") self.mycfg = MyConfig() # self.awrams = AWRAMS() self.mythread = Mythead() pub.subscribe( self.updateDisplay, "update") pass def __set_menu(self): ''' # 设置菜单 ''' self.menubar = wx.MenuBar() settingMenu = wx.Menu() settingMenu.Append(ID_SENSOR_SETTING, u'&设置', '...') settingMenu.AppendSeparator() settingMenu.Append(ID_CAL_INFO, u'&获取标定信息', ' ') settingMenu.AppendSeparator() settingMenu.Append(ID_MEASURE, u'&处理数据', ' ') settingMenu.AppendSeparator() settingMenu.Append(ID_DEAL_SERVER, u'&处理服务器数据', ' ') self.menubar.Append(settingMenu, u'&系统 ') plotMenu = wx.Menu() plotMenu.Append(ID_PLOT_LAST, u'&最后一条', '...') plotMenu.AppendSeparator() plotMenu.Append(ID_PLOT_LAST_7, u'&最后七条', ' ') plotMenu.AppendSeparator() plotMenu.Append(ID_PLOT_7, u'&指定七条', ' ') plotMenu.AppendSeparator() plotMenu.Append(ID_PLOT_SETTING, u'&指定设置', ' ') self.menubar.Append(plotMenu, u'&绘图 ') aboutMenu = wx.Menu() aboutMenu.Append(ID_HELP, u'&帮助', 'help...') aboutMenu.AppendSeparator() aboutMenu.Append(ID_ABOUT, u'&关于我们', '关于我们...') self.menubar.Append(aboutMenu, u'&帮助 ') self.SetMenuBar(self.menubar) pass def __set_properties(self): self.SetSize((800, 600)) # self.SetTitle(u'传感器数据采集--上海奕枫仪器设备有限公司') self.Centre() def __attach_events(self): ''' # 绑定菜单事件 ''' self.Bind(wx.EVT_MENU, self.OnSensorSetting, id=ID_SENSOR_SETTING ) self.Bind(wx.EVT_MENU, self.OnCalInfo, id=ID_CAL_INFO ) # self.Bind(wx.EVT_MENU, self.OnStart, id=ID_MEASURE) self.Bind(wx.EVT_MENU, self.OnDealData, id=ID_MEASURE) self.Bind(wx.EVT_MENU, self.OnDealServer, id=ID_DEAL_SERVER) # self.Bind(wx.EVT_MENU, self.OnLoggingSetting, id=ID_LOGGING_SETTING) self.Bind(wx.EVT_MENU, self.OnPlotLast, id=ID_PLOT_LAST ) self.Bind(wx.EVT_MENU, self.OnPlotLast7, id=ID_PLOT_LAST_7 ) self.Bind(wx.EVT_MENU, self.OnPlot7, id=ID_PLOT_7) self.Bind(wx.EVT_MENU, self.OnPlotSetting, id=ID_PLOT_SETTING) self.Bind(wx.EVT_MENU, self.OnHelpConfig, id=ID_HELP) self.Bind(wx.EVT_MENU, self.OnAboutConfig, id=ID_ABOUT) pass def __setTimer(self): self.timer = wx.Timer(self) #创建定时器,菜单以后 self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) #绑定一个定时器事件 pass def updateDisplay(self, msg): log.warning(f" msg : {msg['data']}",__name__,"updateDisplay") if msg['flag'] == "notice": self.__update_notice(msg['data']) pass if msg['flag'] == "data": self.__update_data(msg['data']) pass pass def __update_notice( self, msg ): log.info(f" .......{msg}... ",__name__,'__update_notice') self.alterStatus_0( msg ) # self.popDialog( msg ) pass def __update_data(self,data ): log.info(f" .......... ", __name__, '__update_data') self.plotpanel.set_axes_title( data[0]) self.plotpanel.clear_past() self.plotpanel.plot_one( "Rs", data[1], data[2], color= LineColor(1).name ) # for display in RamsesFunc: # self.plotpanel.plot_one(display.name, x, res[display.name],color= LineColor(display.value).name ) # pass pass def OnStart( self, event ): log.info(f"OnStart....interval: {self.interval} min, port: {self.port}") # self.m = SerialThread() interval_ms = int(self.interval) * 10 * 1000 self.timer.Start( interval_ms ) def OnStop( self ,event ): # self.kh.disconnect() # self.timer.Stop() pass def OnTimer(self, event): ''' 定时器实现 ''' # log.info( f"OnTimer...." ) # self.OnDisplaySave() pass def onNotify(self, msg:str): self.mypanel.setStaticText(msg) pass def __read_config(self,): # 读取配置文件 self.mycfg.setDeviceType(DeviceType.SURFACE) self.sensor_cfg = self.mycfg.read_yaml() def OnDealData(self, e)-> None: ''' SD卡的文件结构 ''' log.info(f"OnDealData: 处理测量数据", __name__, "", "") if not self.calinfo_is_ok: self.onNotify("Pls get the cal info, and try again" ) log.warning(f"Pls get the cal info, and try again", __name__, "OnDealData") self.statusBar.SetStatusText("Pls get the cal info, and try again",0) pass ## 调用 AwramsHandle 的函数 self.myhandle:AwramsHandle = self.awrams_handle[self.device_id] # 处理数据 self.alterStatus_0(" 正在处理数据...." ) try: self.mythread.set_task( self.read_folders_from_sd ) self.mythread.start() except Exception as e: log.error(e) pass def read_folders_from_sd(self,): # myhandle:AwramsHandle = self.awrams_handle[self.device_id] self.myhandle.read_folders_from_SD( DATA_DIR ) pass def OnDealServer(self, e)-> None: '''对服务器数据进行再次处理,''' log.info(f"OnDealServer: 处理服务器数据", __name__, "", "") # if not self.calinfo_is_ok: # self.onNotify("Pls get the cal info, and try again" ) # log.warning(f"Pls get the cal info, and try again", __name__, "OnDealData") # self.statusBar.SetStatusText("Pls get the cal info, and try again",0) # pass # self.awrams.getDataFiles_server( ) # self.awrams.setDeviceID(self.device_id) # self.awrams.setRetrieve(self.retrieve) # if self.syscfg != {}: # self.awrams.setSyscfg(self.syscfg) # else: # log.warning(f"Pls get the cal info, and try again", __name__, "OnDealData","setCfg") # MyException( f"System Configuration is empty." ) # pass # # 处理数据 # self.alterStatus_0(" 正在处理数据...." ) # try: # self.mythread.set_task( self.awrams.dealAllMeasurements_Server ) # self.mythread.start() # except Exception as e: # log.error(e) # pass # pass def OnCalInfo(self,e): '''依据传感器获取标定文件信息''' ####################################### self.onNotify("正在获取标定信息") device_id = self.device_id # 多个设备 device_type = DeviceType.SURFACE.name self.mycfg = MyConfig() self.mycfg.setDeviceType(DeviceType.SURFACE) # 检查配置文件是否存在,不存在报错 config.yml retrieve.yml if not self.mycfg.check_config_yml(): self.popDialog("没有发现config.yml文件") pass if not self.mycfg.check_retrieve_yml(): self.popDialog("没有发现retrieve.yml文件") pass self.sensor_cfg = self.mycfg.read_yaml() log.info(f"Current Device: {device_type} ", __name__, "", "") log.info(f"Sensor: {self.sensor_cfg}", __name__, "", "") # 配置反演需要的参数 波长 间隔 self.retrieve = self.mycfg.get_retrieve() log.warning(f"Retrieve: {self.retrieve}", __name__, "", "") self.cal_cfg = {} cfgr = Configuration( ) cfgr.setDeviceType(device_type) cfgr.setSystemCfgDict(self.sensor_cfg) for k,v in self.sensor_cfg.items(): cfgr.setSystemCfgDict(v) try: cfgr.getCalConfiguration() except Exception as e: log.error(f"读取配置文件失败. \n {e}",__name__, "", "" ) raise log.info(f"v: {cfgr.configuration}", __name__, "", "") self.cal_cfg.update({k:cfgr.cal_configuration}) # log.warning(f"self.cal_cfg: {self.cal_cfg}", __name__, "", "") log.warning(f"self.syscfg 2: {self.cal_cfg[2].keys()}", __name__, "", "") # log.warning(f"self.cal_cfg 3: {self.cal_cfg[3].keys()}", __name__, "", "") log.info(f"传感器配置文件读取成功", __name__, "", "") self.alterStatus_0("传感器配置文件读取成功") self.onNotify("获取标定信息成功") self.calinfo_is_ok = True self.__init_data_process() pass def __init_data_process(self, mode = 0): ''' 多个handle AwramsHandle''' self.awrams_handle = { } for k,v in self.cal_cfg.items(): ah = AwramsHandle( deviceid=k, cfg=self.sensor_cfg[k], calcfg=v, rtv=self.retrieve) self.awrams_handle.update( {k:ah } ) # def OnCalInfo(self,e): # '''依据传感器获取标定文件信息''' # ####################################### # self.onNotify("正在获取标定信息") # device_id = self.device_id # 多个设备 # device_type = DeviceType.SURFACE.name # self.mycfg = MyConfig() # self.mycfg.setDeviceType(DeviceType.SURFACE) # # 检查配置文件是否存在,不存在报错 config.yml retrieve.yml # if not self.mycfg.check_config_yml(): # self.popDialog("没有发现config.yml文件") # pass # if not self.mycfg.check_retrieve_yml(): # self.popDialog("没有发现retrieve.yml文件") # pass # init_para = self.mycfg.read_yaml() # log.info(f"Current Device: {device_type} ", __name__, "", "") # log.info(f"Sensor: {init_para}", __name__, "", "") # # 配置反演需要的参数 波长 间隔 # self.retrieve = self.mycfg.get_retrieve() # log.warning(f"Retrieve: {self.retrieve}", __name__, "", "") # self.syscfg = {} # cfgr = Configuration( ) # cfgr.setDeviceType(device_type) # cfgr.setSystemCfgDict(init_para) # for k,v in init_para.items(): # cfgr.setSystemCfgDict(v) # try: # cfgr.getCalConfiguration() # except Exception as e: # log.error(f"读取配置文件失败. \n {e}",__name__, "", "" ) # raise # log.info(f"v: {cfgr.configuration}", __name__, "", "") # self.syscfg.update({k:cfgr.cal_configuration}) # # log.warning(f"self.syscfg: {self.syscfg}", __name__, "", "") # log.warning(f"self.syscfg 2: {self.syscfg[2].keys()}", __name__, "", "") # # log.warning(f"self.syscfg 3: {self.syscfg[3].keys()}", __name__, "", "") # log.info(f"传感器配置文件读取成功", __name__, "", "") # self.alterStatus_0("传感器配置文件读取成功") # self.onNotify("获取标定信息成功") # self.calinfo_is_ok = True # pass def alterStatus_0(self,msg): self.statusBar.SetStatusText( msg, 0 ) def popDialog(self, msg, msg_type=u"错误提示"): with wx.MessageDialog( self, msg, msg_type, wx.OK )as dlg: dlg.ShowModal() def OnPlotLast(self,e): # 如何取数据 需要先合并数据? self.popDialog(" 功能开发中...") pass def OnPlotLast7(self,e): self.popDialog(" 功能开发中...") pass def OnPlot7(self,e): self.popDialog(" 功能开发中...") pass def OnPlotSetting(self,e): with UI_Plot_Setting( self, -1 ) as Dialog_Sensor_Setting: Dialog_Sensor_Setting.CenterOnParent() resultLog = Dialog_Sensor_Setting.ShowModal() if resultLog == wx.ID_OK: log.info( " Plot config dialog confirm, call back " ) self.__read_config() pass def OnSensorSetting(self,e): with UISensor( self, -1 , did = self.device_id ) as Dialog_Sensor_Setting: Dialog_Sensor_Setting.CenterOnParent() resultLog = Dialog_Sensor_Setting.ShowModal() if resultLog == wx.ID_OK: print( " Sensor config dialog confirm, call back " ) self.__read_config() pass def OnHelpConfig(self, e): with Help( self, -1, "") as Dialog_Help: resultLog = Dialog_Help.ShowModal() if resultLog == wx.ID_OK: print("Help info") pass def OnAboutConfig(self, e): with About( self, -1, "") as Dialog_About: resultLog = Dialog_About.ShowModal() if resultLog == wx.ID_OK: print("Aboutus") pass def OnQuit(self, e): self.Close()