profiler desktop second

desktop
esea_info 2 years ago
parent 5a22a4b130
commit 9df4b523e8
  1. 9
      app.py
  2. 2
      app.spec
  3. 0
      calfile/profiler/Back_SAM_852F.dat
  4. 0
      calfile/profiler/Back_SAM_859F.dat
  5. 0
      calfile/profiler/Back_SAM_85B5.dat
  6. 0
      calfile/profiler/CalAQ_SAM_852F.dat
  7. 0
      calfile/profiler/CalAQ_SAM_859F.dat
  8. 0
      calfile/profiler/CalAQ_SAM_85B5.dat
  9. 0
      calfile/profiler/Cal_SAM_852F.dat
  10. 0
      calfile/profiler/Cal_SAM_859F.dat
  11. 0
      calfile/profiler/Cal_SAM_85B5.dat
  12. 0
      calfile/profiler/SAMIP_50ED_ALL.ini
  13. 0
      calfile/profiler/SAM_852F.ini
  14. 0
      calfile/profiler/SAM_859F.ini
  15. 0
      calfile/profiler/SAM_85B5.ini
  16. 20
      config.yml
  17. 7
      configuration.py
  18. BIN
      data/2023_07/07/info/12_22_14
  19. BIN
      data/2023_07/07/sensor/12_22_14
  20. 0
      data/2023_07/10/info/13_27_47
  21. 0
      data/2023_07/10/info/13_46_36
  22. BIN
      data/2023_07/10/info/14_13_01
  23. BIN
      data/2023_07/10/info/14_15_22
  24. BIN
      data/2023_07/10/info/14_19_36
  25. 0
      data/2023_07/10/sensor/13_46_36
  26. BIN
      data/2023_07/10/sensor/14_13_01
  27. BIN
      data/2023_07/10/sensor/14_15_22
  28. BIN
      data/2023_07/10/sensor/14_19_36
  29. 66
      myRamses.py
  30. 7
      myconfig.py
  31. 3
      mythread.py
  32. 784
      profiler.py
  33. 3
      retrieve.yml
  34. 77
      yiwinframe.py

@ -2,10 +2,9 @@
# -*- encoding: utf-8 -*-
'''
@File : app.py
@Time : 2021/09/12 12:38:46
@Time : 2022/09/12 12:38:46
@Author : Jim
@Version : 1.0
'''
# 在设备上的数据文件格式
import wx
@ -16,15 +15,15 @@ from myconfig import VERSION,LASTDATE,COMPANY
class YiwinApp(wx.App):
def OnInit(self):
self.myframe = YiwinFrame( u'Handheld Offline Software', parent=None)
self.myframe = YiwinFrame( u'奕枫仪器剖面光谱测量分析软件 Ver1.0', parent=None)
self.myframe.statusBar.SetStatusText( u" 版权所有 " + COMPANY
+" Version "+ VERSION
+" Ver "+ VERSION
+ " "+ LASTDATE, 1 ) #给状态栏设文字
self.myframe.Show(True)
return True
if __name__ == "__main__":
log.info(f"******** Shanghai Yiwin Instrument@Equipment Company *********", __name__, "", "")
log.info(f"******** Handheld Software for Dealing RAMSES Raw data *********", __name__, "", "")
log.info(f"******** Profiler Software for Dealing RAMSES Raw data *********", __name__, "", "")
app = YiwinApp( )
app.MainLoop()

@ -1,9 +1,7 @@
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['app.py'],
pathex=[],

@ -1,20 +1,10 @@
2:
1:
FUNC: Lsky
SN: 85B5
FUNC: Ed
SN: '50ED'
2:
FUNC: Esky
SN: 50ED
SN: '85B5'
3:
FUNC: Lwater
SN: 852F
3:
1:
FUNC: Lsky
SN: 85B5
2:
FUNC: Esky
SN: 50ED
3:
FUNC: Lwater
SN: 852F
FUNC: Lu
SN: '852F'

@ -1,8 +1,6 @@
from pathlib import Path, PurePath
from tools.mylogger import log
from readcal import ReadCal
from myconfig import CAL_DIR, DATA_DIR, FILE_MARK, DeviceType, RamsesFunc
@ -14,15 +12,13 @@ class Configuration:
self.cal_configuration = {}
pass
def setDeviceType(self, device_type:str) -> None:
self.device_type = device_type.lower()
pass
def setSystemCfgDict(self, cfg:dict) -> None:
self.configuration = cfg
log.info(f"self.configuration : {self.configuration} ", __name__, "", "")
log.info(f"self.configuration : {self.configuration} ", __name__, "setSystemCfgDict", "")
pass
def getCalConfiguration(self) -> None:
@ -46,7 +42,6 @@ class Configuration:
pass
def __init_configuration_basic(self ) -> None:
# self.cfgtool = Config()
for k in self.cal_configuration.keys():
sn = self.cal_configuration[k]["SN"]
if self.__isSamIniExisted(sn):

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -157,8 +157,10 @@ class RamsesCal(object):
self.b1: List[float] = [float(i) for i in ramsescal['b1'] ]
self.cal: List[float] = [float(i) for i in ramsescal['cal'] ]
self.calaq: List[float] = [float(i) for i in ramsescal['calaq'] ]
# 设置sam_cal
self.samcal: SamCal = SamCal( SAMSN=self.samsn )
self.samcal.set_samcal(ramsescal )
# 设置ip_cal
if self.typ == RamsesType.SAMIP:
self.ipcal: IPCal = IPCal( )
self.ipcal.set_ipcal_from_dict( ramsescal )
@ -266,7 +268,7 @@ class RamsesFactory(object):
def set_data_raw_ip_raw(self, byt: bytes ):
''' byt 含 data_raw ip_raw '''
assert isinstance(byt, bytes)
assert isinstance(byt, bytes), f"arg byt is not byte type"
num = 0
buf = byt
for i in range(50):
@ -282,7 +284,7 @@ class RamsesFactory(object):
兼容 传入前分不出byte ip
ip_byt: 判断是否含IP数据
'''
assert isinstance(byt, bytes)
assert isinstance(byt, bytes), f"arg byt is not byte type"
self.data_raw = byt
def set_ip_raw(self, byt: bytes ):
@ -290,7 +292,7 @@ class RamsesFactory(object):
兼容 传入前分不出byte ip
ip_byt: 判断是否含IP数据
'''
assert isinstance(byt, bytes)
assert isinstance(byt, bytes), f"arg byt is not byte type"
self.ip_raw = byt
def set_ip_buf(self, byt: bytes ):
@ -315,10 +317,12 @@ class RamsesFactory(object):
''' 兼容 SAM 576, SAMIP 的IP数据单独传进来
去掉 23 00 00 00 00 00 00 ...... 01
'''
assert self.data_after_remove_mask != None, "please remove mask in advance"
assert (self.data_after_remove_mask != None), "please remove mask in advance"
res = {}
buf = self.data_after_remove_mask
len_ = len(buf)
# log.warning( f"valid buf: {buf.hex()}")
# log.warning( f"len: {len_}")
# print( f" head tail, {len_}")
# print( self.data_after_remove_mask)
@ -329,7 +333,7 @@ class RamsesFactory(object):
# # self.ip = self.decode_ip_buf(self.buf_ip, self.cal_cfg)
# # self.buf = self.buf[26:]
# len_ = len_ - 26
assert len_ == 576, "SAM sensor , wrong the num of bytes"
assert (len_ == 576), "SAM sensor , wrong the num of bytes"
for i in range(576):
res.update({i+1: {}})
@ -350,7 +354,7 @@ class RamsesFactory(object):
assert self.data_valid_buf != None, "please remove frame head and tail"
# print( f" == {len(self.data_valid_buf)}= {self.data_valid_buf} ")
# log.warning( f"valid buf: {self.data_valid_buf.hex()}")
self.integratedTime = 2 << int(self.data_valid_buf[0]) # integrated time
# print(f"===============it {self.integratedTime}")
@ -428,10 +432,6 @@ class RamsesFactory(object):
# offset: {Offset} \r\n\
# ")
def getOffset(self, data: np.ndarray, start: int, stop: int):
''' 计算光谱时候的 offset '''
ret = 0.0
@ -488,29 +488,24 @@ class RamsesFactory(object):
pass
def decode_ip_buf(self, buf):
assert self.typ == RamsesType.SAMIP
assert self.typ == RamsesType.SAMIP ,f"no samip sensor!"
tmpbuf = buf
if len(tmpbuf) == 26 and tmpbuf[0] == 0x13:
tmpbuf = tmpbuf[2:]
# Incl_XGain = float(ip_cal['Incl_XOffset'] )
# Incl_XOffset = float(ip_cal['Incl_XOffset'] )
# Incl_YGain = float(ip_cal['Incl_YGain'] )
# Incl_YOffset = float(ip_cal['Incl_YOffset'] )
Incl_XGain = self.RamsesCalData.ipcal.Incl_Xgain
Incl_XOffset = self.RamsesCalData.ipcal.Incl_Xoffset
Incl_YGain = self.RamsesCalData.ipcal.Incl_Ygain
Incl_YOffset = self.RamsesCalData.ipcal.Incl_Yoffset
Incl_XGain = self.ipcal.Incl_XGain
Incl_XOffset = self.ipcal.Incl_XOffset
Incl_YGain = self.ipcal.Incl_YGain
Incl_YOffset = self.ipcal.Incl_YOffset
Incl_KRef = self.RamsesCalData.ipcal.Incl_Kref
Press_Sens_mV_bar_1mA = self.RamsesCalData.ipcal.Press_Sens_mV_bar_1mA
Incl_KBG = self.RamsesCalData.ipcal.Incl_KBG
Press_Sens_mV_bar_4mA = self.RamsesCalData.ipcal.Press_Sens_mV_bar_4mA
Press_Gain = self.RamsesCalData.ipcal.Press_Gain
Press_Surface_bar = self.RamsesCalData.ipcal.Press_Surface_bar
Incl_KRef = self.ipcal.Incl_KRef
Press_Sens_mV_bar_1mA = self.ipcal.Press_Sens_mV_bar_1mA
Incl_KBG = self.ipcal.Incl_KBG
Press_Sens_mV_bar_4mA = self.ipcal.Press_Sens_mV_bar_4mA
Press_Gain = self.ipcal.Press_Gain
Press_Surface_bar = self.ipcal.Press_Surface_bar
ip_info = struct.unpack("<BBBBBBBBBBBBBBBBBBBBBBBB", buf)
ip_info = struct.unpack("<BBBBBBBBBBBBBBBBBBBBBBBB", tmpbuf)
byte11 = ip_info[11]
byte12 = ip_info[12]
byte13 = ip_info[13]
@ -538,7 +533,7 @@ class RamsesFactory(object):
p_bar = 1000 * VPress / (press_sens * Press_Gain)
press_delta = p_bar - 1.021
depth_m = press_delta * 10
return [depth_m, X, Y]
return depth_m, X, Y
pass
pass
@ -630,10 +625,15 @@ class RamsesFactoryHandle(object):
def set_air_water(self, airwater = AirWater.Air):
self.rf.airwater = airwater
def deal_raw_data(self, data:bytes) -> np.ndarray:
''' ( 26 +3*sensor) removeMask get_valid_buf'''
def deal_raw_data(self, data:bytes, mode:int=1) -> np.ndarray:
'''处理raw 数据 8*72 = 576
mode =0, 无需remmoveMask
'''
self.rf.set_data_raw(data) # 同时传入 IPbuf
if mode == 1:
self.rf.removeMask()
else:
self.rf.data_after_remove_mask = self.rf.data_raw
self.rf.get_data_valid_buf( )
self.rf.process_from_hex_2_int()
self.rf.calibrate_data()
@ -663,6 +663,12 @@ class RamsesFactoryHandle(object):
log.info(" 处理 ip_data:list ",__name__, "deal_raw_ip_list")
pass
def deal_raw_ip_buf(self, ip_buf:bytes) -> tuple:
''' ip_raw'''
log.debug(" args: ip_buf ",__class__, "deal_raw_ip_buf")
return self.rf.decode_ip_buf(ip_buf)
pass
def deal_data_valid_buf(self, data:bytes):
''' 去 23 00 00 00 .....01后的数据, 64*8=512 '''
self.rf.set_data_valid_buf(data)

@ -12,8 +12,8 @@
import yaml
from enum import Enum
from pathlib import Path
VERSION = "3.3.5"
LASTDATE = "2023-03-09"
VERSION = "1.0"
LASTDATE = "2023-07-09"
COMPANY = u"奕枫仪器"
DEVICE_ID = [2]
@ -32,11 +32,12 @@ SEPARATOR = ";"
TOKEN = ";"
NEWLINE = "\n"
ROWFACTOR = 0.026
NT2FACTOR = 0.543
class DeviceType(Enum) :
AWRAMS = 1
SURFACE = 2
PROFILE = 3
PROFILER = 3
class RamsesFunc(Enum):
Lsky = 1

@ -19,8 +19,7 @@ class Mythead(threading.Thread):
self.func( )
class Multithread(threading.Thread):
'''
多线程
''' 多线程
子线程.join() -> ( 设置在start之后, 等所有阻塞线程运行完, 再运行主线程 )
子线程.setDaemon(True) -> 设置子线程A为守护线程, 主线程所在的进程内所有非守护线程统统运行完毕,
无论子线程A有没有结束, 程序都结束

File diff suppressed because one or more lines are too long

@ -1,6 +1,5 @@
LineBegin: 1
LineInterval: 1
beginWL: 350
endWL: 950
interval: 1
rowFactor: 0.026
n_t_square: 0.543

@ -27,6 +27,7 @@ from tools.myexception import MyException
from tools.mylogger import log
from awrams import AwramsHandle,HandheldHandle
from profiler import ProfilerHandle
# -定义菜单ID,关联Event-------------------------
ID_MEASURE = 1
@ -172,7 +173,7 @@ class YiwinFrame(wx.Frame):
pass
def updateDisplay(self, msg):
log.warning(f" updateDisplay 。。 {msg['data']}")
log.warning(f" updateDisplay .. {msg['data']}",__name__,"updateDisplay","")
if msg['flag'] == "notice":
self.__update_notice(msg['data'])
pass
@ -223,17 +224,17 @@ class YiwinFrame(wx.Frame):
self.mycfg.setDeviceType(DeviceType.SURFACE)
self.sensor_cfg = self.mycfg.read_yaml()
def OnDealData(self, e)-> None:
def OnDealData(self, e) -> None:
''' SD卡的文件结构 '''
log.info(f"OnDealData: 处理测量数据", __name__, "", "")
log.info(f"OnDealData: 处理测量数据", __name__, "OnDealData", "")
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:HandheldHandle = self.handheld_handle[self.device_id]
# 调用 ProfilerHandle 的函数
self.myhandle:ProfilerHandle = self.profiler_handle.get(self.device_id )
# 处理数据
self.alterStatus_0(" 正在处理数据...." )
@ -241,7 +242,7 @@ class YiwinFrame(wx.Frame):
self.mythread.set_task( self.read_folders_from_sd )
self.mythread.start()
except Exception as e:
log.error(e)
log.error(e,__name__,"OnDealData")
pass
def read_folders_from_sd(self,):
@ -250,84 +251,58 @@ class YiwinFrame(wx.Frame):
pass
# def OnDealData2(self, e)-> None:
# 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
# self.hh.getDataFileList()
# self.hh.setDeviceID(self.device_id)
# self.hh.setRetrieve(self.retrieve)
# if self.syscfg != {}:
# self.hh.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.hh.dealAllMeasurements )
# self.mythread.start()
# except Exception as e:
# log.error(e)
# pass
def OnCalInfo(self,e):
'''依据传感器获取标定文件信息'''
#######################################
self.onNotify("正在获取标定信息")
self.device_type = DeviceType.SURFACE.name
self.device_type = DeviceType.PROFILER.name
self.mycfg = MyConfig() # 传入 cfg retrieve 的yml文件
# 配置反演需要的参数 波长 间隔 , rowFactor
self.retrieve = self.mycfg.get_retrieve() # 读retrieve.yml
self.retrieve = self.mycfg.read_rtv_yaml() # 读retrieve.yml
log.info(f"Retrieve: {self.retrieve}", __name__, "", "")
# log.info(f"syscfg: {device}", __name__, "", "")
self.mycfg.setDeviceType( DeviceType.SURFACE )
self.mycfg.setDeviceType( DeviceType.PROFILER )
self.sensor_cfg = self.mycfg.read_yaml() # 读config.yml, 多个device_id 配置
log.info(f"Current Device: {self.device_type} ", __name__, "", "")
log.info(f"Sensor cfg: {self.sensor_cfg}", __name__, "", "")
log.info(f"Current Device: {self.device_type} ", __name__, "OnCalInfo", "")
log.info(f"Sensor cfg: {self.sensor_cfg}", __name__, "OnCalInfo", "")
self.cal_cfg = {}
cfgr = Configuration( )
cfgr.setDeviceType(self.device_type)
cfgr.setSystemCfgDict(self.sensor_cfg)
# 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__, "", "" )
log.error(f"读取配置文件失败. \n {e}",__name__, "OnCalInfo", "" )
raise
log.info(f"v: {cfgr.configuration}", __name__, "", "")
log.info(f"v: {cfgr.configuration}", __name__, "OnCalInfo", "")
self.cal_cfg.update({k:cfgr.cal_configuration})
log.debug(f"cal_cfg: {self.cal_cfg}", __name__, "", "")
log.warning(f"cal_cfg 2: {self.cal_cfg[2].keys()}", __name__, "", "")
log.debug(f"cal_cfg: {self.cal_cfg}", __name__, "OnCalInfo", "")
log.warning(f"cal_cfg 2: {self.cal_cfg[2].keys()}", __name__, "OnCalInfo", "")
# log.warning(f"cal_cfg 3: {self.cal_cfg[3].keys()}", __name__, "", "")
self.init_data_process()
log.info(f"传感器配置文件读取成功", __name__, "", "")
# 配置初始化 ProfilerHandle
self.init_data_process()
self.calinfo_is_ok =True
pass
def init_data_process(self, mode = 0):
''' 多个handle '''
self.handheld_handle = { }
log.info(f" 配置设备处理数据... ", __name__, "init_data_process", "")
self.profiler_handle = { }
for k,v in self.cal_cfg.items():
ah = HandheldHandle( deviceid=k, cfg=self.sensor_cfg[k], calcfg=v, rtv=self.retrieve)
self.handheld_handle.update( {k:ah } )
cal_cfg = v
ph = ProfilerHandle( deviceid=k, cfg=self.sensor_cfg, calcfg=cal_cfg, rtv=self.retrieve )
self.profiler_handle.update( {k:ph} )
def alterStatus_0(self,msg):
self.statusBar.SetStatusText( msg, 0 )

Loading…
Cancel
Save