From c08586118e5a0b610646d7863e842387251d3b2a Mon Sep 17 00:00:00 2001 From: esea_info Date: Sat, 17 Jun 2023 15:01:33 +0800 Subject: [PATCH] device log --- __pycache__/myconfig.cpython-38.pyc | Bin 4539 -> 4564 bytes __pycache__/yiwinframe.cpython-38.pyc | Bin 19821 -> 21272 bytes data/output/A05D.csv | 4 + myViper.py | 103 ++++--- myconfig.py | 1 + yiwinframe.py | 378 +++++++++----------------- 6 files changed, 190 insertions(+), 296 deletions(-) diff --git a/__pycache__/myconfig.cpython-38.pyc b/__pycache__/myconfig.cpython-38.pyc index 6e2cc5806b374b9259d9b2845e840c8b079abe87..40582b8d097dc1ea397a32e3034efc38459fb4b8 100644 GIT binary patch delta 1370 zcmZvc&u<$=6vs2(wY~n8)TmA3wrPGiBym%c5-1!B2~K0c;M&D@(qw_I)}D#k#@;ov z6C)!;4{$|FHG)ecxS&ey2`NYZ0`5J{nFHK7AwV2>Z`}xL;gvu8=FPnCdoypeKW3j~ zQ`@Ojd<1^qzxx%f+)quBzwa-1?$NX6_**0N93B61gpM=q3(cIM6LgYhjzi`oJx?#t zi*$-!qSIi_97oLzouza1EX~5){BhVkPoD>C0ajmtH=&DQU4%D2OUIfyMRW8r%q)X_ ziC&>EIK-TWj4N~%GLEgX8Av(H=IGUf5dY(3j@%^SUk#{JdZD988VsJ6VQuYP49qP2 z{RqGyIy^ikOWJe-xRxUAD zjovP8vXwF3anYqs(ASSn_iKWmuNuI>NG=CqGAGBxT0i zUdv}fIBv_7e?{lXikvofGuJTU*;xKE_zq5vjCC?NgM@q%TP?qivPls1Twyz|Z&|r8 ze+8Yo&0D_GI1@?}ovx_^)`mn?s>Q^X(-fQiyb!!E-;3{(EAnx?c{vFIuRHWqDl<{1I@1l1g&7tvpPkx)6T*LkH4*)8P=fGSMR6Cp_h9NnM-e%_#)WKaGu^Uz68UZ7BoZ|)k3{mEbJ6`3%#L1zYXX#cUX@N zXG&swPA7kmdt)n33gY-EVho_7mPNg$W${$ z_;+uCg?F7V1MbM*#-=9F!mHnb3kvr$%R4x~C+E*pW>oY>zGQ6`t14dEuHV|Oqs_14 zf;9}2^31J!X8O%iC11Cyg<7GyQ?NFRb&g*MzK+;HY$D!3v;6A&DJ%D@dZGS86-($B|R(M^v!<&yeL|s delta 1374 zcmZuw&2Jk;6whSW>-E~ZIH*aQGoG;0qtKv?g$|y5btdgpcY>Fx4)V9-tT?P>`#Rs z3TDMLjSl#I-#bU=pPD)H`_swB{>=`0j&^_ELA#mqSh0I(5ACJr4?68$+DH581v)@; zG!Ja>AZeecLv)yq&;r;l9wh8OdI{Jlc=yAb&@o^a;Em7tfnpEPBAo!sB=8)aqSGF+ z^N?|d&O*jnHuyNL*h6fXzV@(_|9Uh^-Y4===MyapW%8`Fl-Ij;pd;`PH2|Hc@NivL zl)-x`bV>spV_U}w0B;W5y*XGHlXfPoyDjEY%2^oNneC=u6JFrg0?O>v`s%`|A+f$% zV!mx{mKNEL=bvrMAC5p$xsBl zRZnn3j;TW=I$BnLBV<@!)1LI5Gz4P23l(+8@qAA>PW9*)Ek(@8s0TYC6TT_uO=4v7KGrBWW~5k3i4ZH<&Eo@4TXv-pGLlnqU2#jT5Ux{Iuz@;5dTb0rAJkC zlv(pV`E`2a@;FARdv2p1skGVHJyiayw%smed<@fL4*EZrf2Kd%U&YjG07VjMrNE_( z7d8F??w&|1K)Nfk(Orz44Y?=Yy~;D)GTZdUiQmWF&Uo^X z&Y9pIYq9oB89c@_<9BlFm6`nv#BmeB0*I21LxY;*@EP2~yT=z1ZlY1G20@+Q!u1^l z2jM<~i@*^6?JZ_qxQE{}HXfb>fNxs0bjz{^vYMslt)!(|TI_?nuAV2xzm;t||}{a=FztA;0Ll^*1cTMpgg- diff --git a/__pycache__/yiwinframe.cpython-38.pyc b/__pycache__/yiwinframe.cpython-38.pyc index 231960e7abc5fd5ffd9215f85494e0763533405a..eee0e44d245e1ffb365941476b74bd4491371596 100644 GIT binary patch delta 7425 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 None: + res = [] + len_ = len(buff) + if len_%4 != 0: + return res + if byteOrder == "big": + for i in range( int(len_/4) ): + tmp = struct.unpack(">f", buff[i*4: i*4+4] ) + res.append( round(tmp[0],bit) ) + else: + for i in range( int(len_/4) ): + tmp = struct.unpack(">f", buff[i*4: i*4+4] ) + res.append(round(tmp[0],bit)) + return res + pass + + def convert_str_2_float_list(self, lst )-> None: + res = [] + for l in lst: + res.append(float(l)) + return res pass \ No newline at end of file diff --git a/myconfig.py b/myconfig.py index aa77446..1d615d5 100644 --- a/myconfig.py +++ b/myconfig.py @@ -29,6 +29,7 @@ INTERVAL = 1.0 SEPARATOR = ";" TOKEN = ";" NEWLINE = "\n" +FLOAT_RESERVE_BIT = 8 class DeviceType(Enum) : diff --git a/yiwinframe.py b/yiwinframe.py index 329f6ae..77f6610 100644 --- a/yiwinframe.py +++ b/yiwinframe.py @@ -29,7 +29,7 @@ from configuration import Configuration from myexception import MyException from mylogger import log from mypath import MyDir -from mythread import Mythead +from mythread import Mythead,Multithread from readcal import ReadCal from uart import Uart # from viper import Viper @@ -58,6 +58,8 @@ ID_LOG_SETTING = 10 ID_DEVICE_STOP = 11 +ID_OPEN_SERIAL = 12 + ID_PLOT_ONE = 15 ID_PLOT_SEVEN = 16 ID_PLOT_RULE = 17 @@ -159,8 +161,10 @@ class YiwinFrame( wx.Frame ): self.menubar.Append(fileMenu, u'&文件 ') deviceMenu = wx.Menu() - deviceMenu.Append(ID_DEVICE_SN, u'&序列号', '...') + deviceMenu.Append(ID_OPEN_SERIAL, u'&打开串口', '...') deviceMenu.AppendSeparator() + deviceMenu.Append(ID_DEVICE_SN, u'&序列号', '...') + deviceMenu.AppendSeparator() deviceMenu.Append(ID_DEVICE_WL, u'&波长', '...') deviceMenu.AppendSeparator() deviceMenu.Append(ID_DEVICE_LOG, u'&采集数据', '...') @@ -210,6 +214,7 @@ class YiwinFrame( wx.Frame ): ''' self.Bind(wx.EVT_MENU, self.OnDealFile, id = ID_DEAL_FILE) + self.Bind(wx.EVT_MENU, self.OnOpenSerial, id = ID_OPEN_SERIAL) self.Bind(wx.EVT_MENU, self.OnDeviceSN, id = ID_DEVICE_SN) self.Bind(wx.EVT_MENU, self.OnDeviceWL, id = ID_DEVICE_WL) self.Bind(wx.EVT_MENU, self.OnDeviceLog, id = ID_DEVICE_LOG) @@ -385,63 +390,100 @@ class YiwinFrame( wx.Frame ): fl, FILE_MARK, self.myviper.deal_measure_time_data, 1) + def OnOpenSerial(self, e)-> None: + self.myviper.set_mode(mode = WorkMode.DEVICEMODE) + self.uart = Uart() + self.uart.set_serial_para( + self.myviper.viper.serailPort.port + ,self.myviper.viper.serailPort.baudrate + ,self.myviper.viper.serailPort.bytesize + ,self.myviper.viper.serailPort.parity + ,self.myviper.viper.serailPort.stopbit + ) + if not self.uart.connect(): + raise MyException(f" 串口不可用 ") + if self.uart.IsOpen(): + self.uart.disconnect() + self.uart_thread = Multithread() + pass + def OnDeviceSN(self, e)-> None: self.__OnDeviceStop() log.info(f"OnDeviceSN: 获取device sn ", __name__, "", "") - # self.mt = Mythead() - self.viper.set_cfg(self.syscfg) - self.viper.set_serial() - # self.viper.set_modbus(self.syscfg['register']['SNAddress'], self.syscfg['register']['SNLen']) - try: - self.viper.sn_uart_thread( self.get_device_sn ) - except Exception as e: - self.alterStatus_0(e ) - self.popDialog( e ) - self.alterStatus_0(" SN 匹配一致" ) + self.alterStatus_0( "正在获取 SN....") + if self.myviper.viper.register is None: + raise MyException(f" 请先打开串口,再试") + + self.myviper.viper.rawWavelength =None + + self.uart.set_modbus( + self.myviper.viper.register.slaveaddress + ,self.myviper.viper.register.functioncode + ,self.myviper.viper.register.SNAddress + ,self.myviper.viper.register.SNLen) + self.uart_thread.remove_tasks() + self.uart_thread.add_task( self.__device_sn, args=() ) + self.uart_thread.sequently_execute_tasks() + self.myviper.viper.register.snBuf = self.res + self.myviper.get_device_sn_from_buf() + self.alterStatus_0( f" SN : {self.myviper.viper.deviceSN} ") pass - - def get_device_sn(self,sn): - self.device_sn = sn - if self.device_sn != self.ui_sn: - log.error( " 设备SN 与系统设置不一致 错误 " ) - pass - else: - log.info(" sn 匹配成功 ! ") - pass + + def __device_sn(self)-> None: + self.res =b'' + self.uart.disconnect() + self.uart.connect() + self.uart.write() + self.res = self.uart.OneMeasure() + def OnDeviceWL(self, e)-> None: self.__OnDeviceStop() log.info(f"OnDeviceWL: 获得device wavelength ... ", __name__, "", "") - if self.device_sn != '': - self.viper.set_cfg( self.syscfg ) - self.viper.set_serial() - try: - self.viper.wl_uart_thread( self.get_device_wl ) - except Exception as e: - self.alterStatus_0(e ) - self.popDialog( e ) - self.alterStatus_0(" 获取波长成功!" ) - else: - self.popDialog('请获取设备序列号SN信息再试') - pass + self.alterStatus_0( "正在获取波长....") + if self.myviper.viper.register is None: + raise MyException(f" 请先打开串口,再试") + if not self.myviper.devicesn_ok: + raise MyException(f"设备SN {self.myviper.viper.deviceSN} 与系统SN {self.myviper.viper.SN} 不匹配") + + self.uart_thread.remove_tasks() + + self.res = b'' + for i in range(self.myviper.viper.register.count): + log.debug(f" -> i {i}", __name__,"OnDeviceWL") + self.uart.set_modbus( self.myviper.viper.register.slaveaddress,self.myviper.viper.register.functioncode + ,self.myviper.viper.register.WLBeginAddress + i*122, 122 ) + log.debug(f" command -> {self.uart.command.hex()} ") + self.uart_thread.add_task( self.__device_wl, args=() ) + self.uart_thread.sequently_execute_tasks() + # 处理self.res, 将self.res 返回 myviper + self.myviper.viper.register.wavelengthBuf = self.res + self.myviper.get_raw_wavelength_from_buf() + + def __device_wl(self, )-> None: + self.uart.disconnect() + self.uart.connect() + self.uart.write() + tmp = self.uart.OneMeasure() + self.res = self.res + tmp[3:len(tmp)-2] - def get_device_wl(self, wl_buf): - if len(wl_buf) != 0: - self.output_wavelength = wl_buf - self.output_wl_ndarray = np.array(self.output_wavelength) - else: - log.error( " 获取设备波长出错 " ) - raise MyException( " 获取设备波长出错 " ) - pass def OnDeviceLog(self, e)-> None: self.__OnDeviceStop() log.info( f"OnDeviceLog: 采集数据 定时器采集", __name__, "", "" ) - # !!!! 判断是否有波长和sn - if self.output_wavelength == []: - self.alterStatus_0( " 没有设备波长信息,请获取设备波长") - self.popDialog( " 没有设备波长信息,请获取设备波长") - raise MyException(" 没有设备波长信息,请获取设备波长") + self.alterStatus_0( "开始采集数据....") + if self.myviper.viper.register is None: + self.alterStatus_0( " 请先打开串口,再试") + raise MyException(f" 请先打开串口,再试") + if not self.myviper.devicesn_ok: + self.alterStatus_0( " 设备SN 与系统不匹配") + raise MyException(f"设备SN 与系统不匹配") + if self.myviper.viper.rawWavelength is None: + raise MyException(f"没有波长信息") + + ## 获取纯水标定文件 + self.__read_cal_file() + self.__OnDeviceLog() # 如何整点获取,如何快速获取 @@ -449,30 +491,42 @@ class YiwinFrame( wx.Frame ): pass def __OnDeviceLog(self,)-> None: - self.device_data = b'' - self.mt = Mythead() - self.viper.set_cfg( self.syscfg ) - self.viper.set_serial() - try: - self.viper.log_uart_thread( self.get_device_data ) - except Exception as e: - self.alterStatus_0(e ) - self.popDialog( e ) - pass - - def get_device_data( self,tm, data_buf ): - if len(data_buf) != 0: - self.device_data = self.viper.convert_buf_2_float( data_buf,8 ) - self.plotpanel.clear_past() - self.plotpanel.plot_one( - tm - , self.output_wl_ndarray - ,np.array(data_buf) - ) - else: - log.error( " 采集设备数据出错 " ) - raise MyException(" 采集设备数据出错 ") - pass + self.uart_thread.remove_tasks() + + self.res = b'' + for i in range(self.myviper.viper.register.count): + log.debug(f" -> i {i}", __name__,"OnDeviceWL") + self.uart.set_modbus( self.myviper.viper.register.slaveaddress,self.myviper.viper.register.functioncode + ,self.myviper.viper.register.DataBeginAddress + i*122, 122 ) + log.debug(f" command -> {self.uart.command.hex()} ") + self.uart_thread.add_task( self.__device_log, args=() ) + self.uart_thread.sequently_execute_tasks() + # 处理self.res, 将self.res 返回 myviper + self.myviper.viper.register.intensityBuf = self.res + self.myviper.get_raw_intensity_from_buf() + + + def __device_log(self, )-> None: + # self.res =b'' + self.uart.disconnect() + self.uart.connect() + self.uart.write() + tmp = self.uart.OneMeasure() + self.res = self.res + tmp[3:len(tmp)-2] + + # def get_device_data( self,tm, data_buf ): + # if len(data_buf) != 0: + # self.device_data = self.viper.convert_buf_2_float( data_buf,8 ) + # self.plotpanel.clear_past() + # self.plotpanel.plot_one( + # tm + # , self.output_wl_ndarray + # ,np.array(data_buf) + # ) + # else: + # log.error( " 采集设备数据出错 " ) + # raise MyException(" 采集设备数据出错 ") + # pass def OnDeviceStop(self, e)-> None: self.__OnDeviceStop() @@ -680,186 +734,4 @@ class YiwinFrame( wx.Frame ): with wx.MessageDialog( self, msg, msg_type, wx.OK )as dlg: dlg.ShowModal() - - - -# class SerialThread(threading.Thread): -# """进度条类 """ -# def __init__(self, parent): -# """ -# :param parent: 主线程UI -# """ -# super(SerialThread, self).__init__() # 继承 -# self.parent = parent -# # log.info(f"SerialThread ... {self.parent.kh}") -# self.start() -# self.join() -# # self.setDaemon(True) # 设置为守护线程, 即子线程是守护进程,主线程结束子线程也随之结束。 - - -# def stop(self): -# self.parent.kh.disconnect() -# log.info(" Serial stop.... ") -# pass - - # def run(self): - # log.info(" Serial run.... ") - # wx.CallAfter(self.parent.OnRcv) - - # wx.CallAfter(self.parent.update_process_bar, count) # 调用parent的函数 - # wx.CallAfter(self.parent.close_process_bar) # destroy进度条 - - # def OnSerialThreadStart(self): - # self.m = SerialThread(self) - # pass - - # def OnSerialThreadStop(self): - # self.m.stop() - # pass - - # def OnDisplaySave(self): - # ''' - # 保存数据 self.result - # ''' - # log.info(f"OnDisplaySave ....") - # # self.m = SerialThread(self) - # # self.kh.flush() - # self.OnSerialThreadStart() - - - # def OnRcv( self ): - # log.info(f"OnRcv....") - # self.kh.setPort(self.port) - # if not self.OnDetectPort: - # MyException(f"Can not find port : {self.port}") - # log.info(f"{self.port} ok!") - # # if not self.kh: - # # self.kh = KH3000(self.port) - # # self.result = self.kh.OneMeasure() - # log.info( f"OnRcv success {self.result}", __class__.__name__ ) - # self.OnSave() - # self.OnDisplay() - # pass - - - # def __get_data_files(self,) -> list: - # # 读取配置文件 - # file_lst = [] - # self.mydir.setBaseDir( Path(self.datadir) ) - # file_lst = self.mydir.get_files_from_currentdir(fmt= "*/*.DAT") - # return file_lst - - # def __check_sn_from_datafile(self,fpath) -> bool: - # # 读取配置文件 - # sn = ReadCal.readFileSNbyIDDevice(fpath) - # if sn == self.ui_sn: - # return True - # return False - - # def __get_raw_wl_from_datafile(self,fpath) -> list: - # # 读取配置文件 - # _,raw_wl = ReadCal.read_columns_set_by_mark(fpath, FILE_MARK,0) - # return raw_wl - - # def __deal_file_lst(self,file_lst): - - # for fl in file_lst: - # # 判断序列号是否一致file_lst - # if not self.__check_sn_from_datafile(fl): - # self.onNotify("文件的序列号和系统设置不一致" ) - # self.popDialog(" 文件的序列号和系统设置不一致") - # raise MyException("文件的序列号和系统设置不一致") - - # # 判断原始波长是否为空 - # if self.raw_wavelength == []: - # res = self.__get_raw_wl_from_datafile(file_lst[0]) - # self.raw_wavelength = res[0] - - # # 处理输出文件 - # self.mydir.setBaseDir(self.output_dir) - # self.mydir.newDirIfNot() - # self.mydir.newFileIfNot(self.ui_sn+SAVE_EXT_NAME) - # if self.syscfg['retrieve']['enable'] == 0: - # self.mydir.setHeader(self.raw_wavelength,TOKEN,self.ui_sn) - # if self.mydir.checkHeader()==0: - # self.mydir.writeHeader() - # if self.mydir.checkHeader()==-1: - # self.popDialog(" 文件头不一致, 请备份到其他目录,并在该目录下删除") - # raise MyException(" 文件头不一致, 请备份到其他目录,并在该目录下删除") - # res_time,res_data = ReadCal.read_columns_sets_by_mark( fl, FILE_MARK, 1 ) - # for i in range( len(res_time) ): - # self.__deal_one_measure_time_data(res_time[i], res_data[i]) - # pass - # pass - # # 需要插值处理波长 - # if self.syscfg['retrieve']['enable'] == 1: - # self.mydir.setHeader(self.new_wavelength.tolist(),TOKEN,self.ui_sn) - # if self.mydir.checkHeader()==0: - # self.mydir.writeHeader() - # if self.mydir.checkHeader()==-1: - # self.popDialog(" 文件头不一致, 请备份到其他目录,并在该目录下删除") - # raise MyException(" 文件头不一致, 请备份到其他目录,并在该目录下删除") - - # # res_data 不用带回调的函数callback 会导致多组数据拼接?? - # res_time,res_data = ReadCal.read_columns_sets_by_mark( fl, FILE_MARK, 1 ) - - # log.warning(f" ==== {len(res_time)}" ) - # log.warning(res_time) - # log.warning(f" ==== {len(res_data[0])}" ) - # log.warning(f" ==== { res_data[0] }" ) - - # for i in range( len(res_time) ): - # self.__deal_one_measure_time_data(res_time[i], res_data[0][i]) - # pass - # pass - - # def __deal_one_measure_time_data(self,res_time,res_data): - # if self.syscfg['retrieve']['enable'] == 0: - # self.mydir.setContent(res_data ,TOKEN,res_time ) - # self.mydir.writeContent() - # # 插值处理 - # if self.syscfg['retrieve']['enable'] == 1: - # # tmp_data = np.interp( self.new_wavelength, np.array(self.raw_wavelength) , np.array(res_data) ) - - # x = self.new_wavelength - # xp = np.array(self.raw_wavelength).astype(np.float32) - # fp = np.array(res_data).astype(np.float32) - # log.warning(f" {x}") - # log.warning(f" {xp.shape }") - # log.warning(f" { fp.shape }") - # tmp_data = np.interp( x, xp , fp ) - # # tmp_data = np.interp( self.new_wavelength.tolist(), self.raw_wavelength , res_data[0] ) - # self.mydir.setContent( tmp_data ,TOKEN, res_time ) - # self.mydir.writeContent() - # pass - - - # def __deal_one_file(self,fpath): - # res_time,res_data = ReadCal.read_columns_sets_by_mark( fpath, FILE_MARK, 1 ) - # for i in range( len(res_time) ): - # if self.syscfg['retrieve']['enable'] == 0: - # self.mydir.setContent(res_data[i],TOKEN,res_time[i]) - # self.mydir.writeContent() - # # 插值处理 - # if self.syscfg['retrieve']['enable'] == 1: - # self.mydir.setContent(res_data[i],TOKEN,res_time[i]) - # self.mydir.writeContent() - # pass - # pass - - # def __set_serial(self, )-> None: - # self.uart.set_serial_para( - # self.syscfg['comsetting']['port'] - # ,self.syscfg['comsetting']['baudrate'] - # ,self.syscfg['comsetting']['bytesize'] - # ,self.syscfg['comsetting']['parity'] - # ,self.syscfg['comsetting']['stopbit'] - # ) - - # def __set_modbus(self, beginaddress, step)-> None: - # self.uart.set_modbus( - # self.syscfg['register']['slaveadress'] - # ,self.syscfg['register']['functioncode'] - # ,beginaddress - # ,step - # ) \ No newline at end of file + \ No newline at end of file