Compare commits

...

4 Commits

  1. 28
      README.md
  2. 286
      Ramses.py
  3. 29
      app.py
  4. 43
      app.spec
  5. 769
      awrams.py
  6. 297
      calfile/profiler/Back_SAM_852F.dat
  7. 297
      calfile/profiler/Back_SAM_859F.dat
  8. 297
      calfile/profiler/Back_SAM_85B5.dat
  9. 297
      calfile/profiler/CalAQ_SAM_852F.dat
  10. 297
      calfile/profiler/CalAQ_SAM_859F.dat
  11. 297
      calfile/profiler/CalAQ_SAM_85B5.dat
  12. 297
      calfile/profiler/Cal_SAM_852F.dat
  13. 297
      calfile/profiler/Cal_SAM_859F.dat
  14. 297
      calfile/profiler/Cal_SAM_85B5.dat
  15. 81
      calfile/profiler/SAMIP_50ED_ALL.ini
  16. 32
      calfile/profiler/SAM_852F.ini
  17. 30
      calfile/profiler/SAM_859F.ini
  18. 30
      calfile/profiler/SAM_85B5.ini
  19. 63
      calfile/profiler/immersion_factors_Lu.dat
  20. 4
      config.ini
  21. 18
      config.yml
  22. 232
      configuration.py
  23. BIN
      data/2023_07/07/info/12_22_14
  24. BIN
      data/2023_07/07/sensor/12_22_14
  25. 0
      data/2023_07/10/info/13_27_47
  26. 0
      data/2023_07/10/info/13_46_36
  27. BIN
      data/2023_07/10/info/14_13_01
  28. BIN
      data/2023_07/10/info/14_15_22
  29. BIN
      data/2023_07/10/info/14_19_36
  30. 0
      data/2023_07/10/sensor/13_46_36
  31. BIN
      data/2023_07/10/sensor/14_13_01
  32. BIN
      data/2023_07/10/sensor/14_15_22
  33. BIN
      data/2023_07/10/sensor/14_19_36
  34. 237
      dataplot.py
  35. 109
      gatherdata.py
  36. 951
      handheld.py
  37. 32
      listctrl.py
  38. 795
      myRamses.py
  39. 330
      myconfig.py
  40. 144
      mypanel.py
  41. 125
      mythread.py
  42. 822
      profiler.py
  43. 1008
      readcal.py
  44. 1
      retrieve.yml
  45. 0
      tools/__init__.py
  46. 11
      tools/myexception.py
  47. 285
      tools/mylogger.py
  48. 265
      tools/mypath.py
  49. 66
      tools/mytime.py
  50. 100
      uiconfig/ui_plot_setting.py
  51. 60
      uiconfig/uiabout.py
  52. 58
      uiconfig/uihelp.py
  53. 124
      uiconfig/uisensor.py
  54. 386
      yiwinframe.py

@ -0,0 +1,28 @@
# 手持式桌面数据处理
数据处理不需要ID, 默认值为100
# 数据目录格式
info 和sensor文件分别在不同目录,对应的文件名一样
data/2023_01/11/info
data/2023_01/11/sensor
# 输出目录
data/output
格式
信息
抬头
数据(时间--值)
# issue
桌面版 id 不能改
如何展示数据,综合处理数据,得到所有的Rs Lw
## 错误
pyinstaller -F -i icon.ico app.py
pyinstaller -F -w -i icon.ico app.py
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
pip install setuptools --upgrade
app.spec
hiddenimports=['pkg_resources.py2_warn'],

@ -0,0 +1,286 @@
#! python3
# -*- encoding: utf-8 -*-
'''
@File : Ramses.py
@Time : 2023/03/03 11:09:50
@Author : Jim @ Yiwin
@Version : 1.0
@Contact : jim@yi-win.com
@Desc :
@para : 23 ..07 .... 06 05 04 03 02 01 00
ip信息不包含
'''
import struct
import numpy as np
from pathlib import Path
from tools.mylogger import log
from myconfig import RamsesAWRAMS, RamsesSURFACE, RamsesPROFILE, DeviceType
class Ramses(object):
def __init__(self,):
"""
@description :处理Ramses的数据标定 Hex -- realWavelength Intensity
@param : 23 ..07 .... 06 05 04 03 02 01 00
ip信息不包含
@Returns : realWavelength Intensity
"""
self.buf = b''
self.mode = 0 # 默认0 空气中,1:水中
self.buf_ip = b''
self.it = None
self.light_int = None # 未标定的整数值
self.spectrum = None # 光谱强度
self.ip = []
# self.current_buf = ""
# self.current_buf_seq = 0
# self.current_it_int = {"it": 0, "light_int": []} # 积分时间及换算的整数值
# self.res = {"wavelength": [], "light": []}
self.cal_cfg = {}
# self.current_cal = {} # 当前传感器的序列号
pass
def setBuf( self, buf: bytes ):
self.buf = buf
pass
def setMode( self, mode = 1 ):
self.mode = mode
pass
def setCalCfg(self, d: dict):
self.cal_cfg = d
pass
def getRealWavelength(self, d: dict):
self.cal_cfg = d
pass
def getSpectrum(self):
return self.spectrum
def resetPara(self, ):
self.buf = b''
self.it = None
self.light_int = None
self.spectrum = None # 光谱强度
self.cal_cfg = {}
pass
def resetItSpectrum(self, ):
self.it = None
self.spectrum = None # 光谱强度
pass
def printPara(self, ):
print(f"**************Ramses printPara*******************")
print(f"{self.buf}")
print(f"{self.cal_cfg}")
print(f"{self.it}")
print(f"{self.light_int}")
print(f"{self.spectrum}")
print(f"**************Ramses printPara*******************")
pass
def dealBuf(self, ip_included:bool=False):
"""多个传感器的数据处理, 头部是否包含Ip帧的信息"""
log.info(f" dealBuf ", __name__)
res = {}
len_ = len(self.buf)
if len_ < 576:
return
if ip_included:
self.buf_ip = self.buf[:26]
self.ip = self.decode_ip_buf(self.buf_ip, self.cal_cfg)
self.buf = self.buf[26:]
len_ = len_ - 26
if len_ % 576 != 0:
return
for i in range( int(len_/576) ):
res.update( {i+1: {}} )
temp_buf = self.buf[7:71] + self.buf[79:143] + \
self.buf[151:215] + self.buf[223:287] + \
self.buf[295:359] + self.buf[367:431] + \
self.buf[439:503] + self.buf[511:575]
self.ConvertAndCalibrate( temp_buf )
# print(len(temp_buf))
# temp = self.__ConvertBytesToInt(temp_buf)
# res.update( { i+1: temp } )
# print(res)
pass
def ConvertAndCalibrate(self,) -> None:
'''单个成功数据转化 标定'''
log.debug(f" ConvertAndCalibrate ", __name__)
temp = self.__ConvertBytesToInt( )
# print( f"int : {self.it} {temp}" )
self.__CalibrateSpectrumData( )
pass
# 转换一个传感器的部分
def __ConvertBytesToInt(self ) -> None:
res = {}
d = [] # List [ Tuple[ it:int, sing_set:tuple[int] ] ]
# self.it = 2 << int(self.buf[1]) # integrated time
self.it = 2 << int(self.buf[0]) # integrated time
self.light_int = struct.unpack(
"<HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH \
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH \
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH \
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", self.buf[2:])
print( self.light_int )
def __CalibrateSpectrumData(self ,) :
t0 = 8092
log.debug(f" __CalibrateSpectrumData ..... ", __name__)
raw = np.asarray(self.light_int, dtype=float)
B0 = np.asarray(self.cal_cfg["b0"], dtype=float)
B1 = np.asarray(self.cal_cfg["b1"], dtype=float)
Mn = raw/65535
Bn = B0 + B1 * ( self.it/t0 )
Cn = Mn-Bn
Offset = self.getOffset(
Cn, int(self.cal_cfg['DarkPixelStart']), int(self.cal_cfg['DarkPixelStop']))
Dn = Cn - Offset
En = Dn * ( t0/self.it )
if self.mode == 0:
Fn = En/np.asarray(self.cal_cfg["cal"], dtype=float) # 空气的标定文件
else:
Fn = En/np.asarray(self.cal_cfg["calaq"], dtype=float) # 水中的标定文件
# Fn = En/np.asarray(self.cal_cfg["cal"], dtype=float) # 空气或水中的标定文件
self.spectrum = Fn
# print(self.spectrum)
def getOffset(self, data: np.ndarray, start: int, stop: int):
ret = 0.0
for i in range(start-1, stop, 1):
ret = ret + data[i]
return ret / (stop - start + 1)
def removeMask(self, buf:bytes ) -> bytes:
'''去除遮罩 0x64 0x65 0x66 0x67'''
ret = b''
flag = False
blen = len(buf)
for i in range(blen):
if flag == False and buf[i] == 64 :
flag = True
continue
if flag == False and buf[i] != 64 :
ret = ret + buf[i].to_bytes( 1, byteorder = 'big' )
continue
if flag == True and buf[i] == 100:
ret = ret + b'\x40'
flag = False
continue
if flag == True and buf[i] == 101:
ret = ret + b'\x23'
flag = False
continue
if flag == True and buf[i] == 102:
ret = ret + b'\x11'
flag = False
continue
if flag == True and buf[i] == 103:
ret = ret + b'\x13'
flag = False
continue
return ret
pass
def decode_ip_buf(self, buf, ip_cal:dict):
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_KRef = float(ip_cal['Incl_KRef'] )
Press_Sens_mV_bar_1mA = float(ip_cal['Press_Sens_mV_bar_1mA'] )
Incl_KBG = float(ip_cal['Incl_KBG'] )
Press_Sens_mV_bar_4mA = float(ip_cal['Press_Sens_mV_bar_4mA'] )
Press_Gain = float(ip_cal['Press_Gain'] )
Press_Surface_bar = float(ip_cal['Press_Surface_bar'] )
ip_info = struct.unpack("<BBBBBBBBBBBBBBBBBBBBBBBB", buf)
byte11 = ip_info[11]
byte12 = ip_info[12]
byte13 = ip_info[13]
byte14 = ip_info[14]
byte15 = ip_info[15]
byte16 = ip_info[16]
byte17 = ip_info[17]
byte18 = ip_info[18]
byte19 = ip_info[19]
byte20 = ip_info[20]
byte21 = ip_info[21]
byte22 = ip_info[22]
X = (byte11 -Incl_XOffset) / Incl_XGain # 单位 度
Y = (byte12 - Incl_YOffset ) / Incl_YGain # 单位 度
npress = byte14 *256 + byte13
nbg = byte18 * 256 + byte17
nrefh = byte20 * 256 + byte19
nrefl = byte22 * 256 + byte21
noffset = nrefl - ( Incl_KRef * (nrefh-nrefl))
VPress = Incl_KBG * (npress-noffset) / (nbg- noffset) #电压值
press_sens = Press_Sens_mV_bar_4mA
if press_sens <= 0:
press_sens = 4* Press_Sens_mV_bar_1mA
p_bar = 1000 * VPress / (press_sens * Press_Gain )
press_delta = p_bar - 1.021
depth_m = press_delta * 10
return [depth_m,X,Y]
pass
if __name__ == "__main__":
log.info(f"******** Awarms server initiate *********", __name__, "", "")
r = Ramses()
buf_str = "\
23a0000007fefe0a0781067d067d068e0693069c069c06b006b506cb06e40619076607e1076c081509cd09bb0a7d0bee0b1d0c6d0cca0ca40ddc0f30135b18b4224d320e43f852c8\
23a0000006fefe17639c71c97c9484bb89358be98e5d98b1a37eadccb66abd26be31b97db124aa18a3f29c0499349735968e93a48eea8a028bc28cec8d048f1c92c096de9ab99d43\
23a0000005fefee0a157a9ecb1b1b97dc034c507c741c7d2c65ec550c20dbde9b535ae56a60a9e2296cd8ee887278129798170c669b16503632e61605f3a5def5a8e5862561154be\
23a0000004fefe3c51f54dda4a0c48634595426a3f5a3cc539903767362b36cc351f356634b633fc32c4310630fb2ec32fe63199349037e03ac03dc03eae3c303a9639d13a413da7\
23a0000003fefe97412746bc49404caa4dc54d374ca646d63bde326b332739e43c503d2b3c363aca37ef342d32c22f782d1d2bd328ec250222101e691b2b1a7119d3184018fa174d\
23a0000002fefed3177a17e3160616f81423149313f11233126711d8103b10a40f160f8a0efb0d580d660c6f0bd80aa10a580a000ab4099b0994097109e2082c087a0736072c077d\
23a0000001fefe2a071e071607140718071e073c074d076a076e076b076007670763076c0760075c073d07350724071207fb06ef06d706cc06b706a506960684067b0672066306a2\
23a0000000fefe58065406500642064e064306470642063f064806410644064306430641064206460640063c063e063e063d064406430644063c063c063c063c06400640064906ed\
23a0000007fefe0a071b071c07260737073e0749075907650774078b07c0072c08e3082b0ada0be80d9c107b147318931ae51add1a271a77192f1bfb1d99207c265c30c738f03d53\
23a0000006fefe07438f489d4d8452d957945cff639171a5832a97deab7fbe09c86cc5acb9d5ab299e90915287de7f8b7ae275ed6f056aff664f662665bc63936335655767926879\
23a0000005fefec269206d3e724377fe7b7a8050831f85b68637881689e4884787008580823d7f887bee773d7496702a6cde654c5f895a1f570d5416514d4e9d4bde4897468c44c3\
23a0000004fefe71421640db3dc83bbb39533777346c31b92e912c152b5b2aff292129e727cb26d925fd249223b4214020da1fe91ff41f28209420dc201520071e671c221c8d1cfe\
23a0000003fefecd1dd31fe72164235924cb24b924f72331211e1ca018ef19221d121f621fe91e081ed51c761b311a2f193c18651788166015a013de11d1106e1041101810e80f2e\
23a0000002fefee50fd90fbc0f6d0ff70e610ee00d930d460de40c900c450c010cbd0b7c0b480bfc0aab0a2c0a9e094d092b09fb08d008a208990881087d083908e6078d07660747\
23a0000001fefe5b075a07500751074d074e0751075d076807730788077e077c077c07810777077a076c0765075c075607480740073607270723070d070d070b07ff06fd06f0062f\
23a0000000fefef606f106ed06f506ef06eb06f106ec06f006e906e806ed06e606ef06e506ea06ec06ee06eb06e906ee06f006ef06ea06e906e606e606e606ec06ea06ea06f506f2\
23a0000007fefe0605830479047d047e04810482048204850487048b048c04850487048c049304950498049c04a804a904b604b804c604d004e104f104190546059805ff059a06bb\
23a0000006fefe90073209ea0b7610c117cc22b2324a487b645e8798acf2c927d28dc1f2a1ac809664804e543d7a308327a321d81dab1b0f1bca1bb41dba2098243329382e773335\
23a0000005fefeca38213e544329486f4c1c500653335592564f577d573b57a556b4557e540a534451424f004d714a9b47994458410e3e9c3af8368c33b630982eca2c052b3429ae\
23a0000004fefe632763255a234821321f0e1d061b291983171e16d814a91379124b1138104b0f610e990dd80c240c880bfc0a7b0af8097709020990082508de07c507ba07a50762\
23a0000003fefe950781076407460727070007d306ab066e06270605060d0614061306fe05e805d105b405a00586057105630549053d0528051105fd04f304ee04e404dc04dd04c3\
23a0000002fefed804d904d004c604bf04b904b904b104a804a604a6049d04980496048f04970491048c04880486047e0484047a047d047b047c0478047a04760476047004700430\
23a0000001fefe6f0474046c046d0472046d047304750470046e04760472046f047604700473046f04730470047504700470046d046b047004710470046e046d046a046b046904e4\
23a0000000fefe690470046e046b046c04680468046e0466046a046a0469046b046d04640466046c046c046b046a04660466046b046c046a046a0468046f046804740471048d0417\
"
buf = bytearray.fromhex(buf_str)
one_senor = buf[:576]
r.setHex(one_senor)
r.ConvertBytesToInt()
# print(len(buf))
# # print(buf[:576])
# print(buf[:576].hex())
# print(buf[576:578].hex() )

@ -0,0 +1,29 @@
#! python3
# -*- encoding: utf-8 -*-
'''
@File : app.py
@Time : 2022/09/12 12:38:46
@Author : Jim
@Version : 1.0
'''
# 在设备上的数据文件格式
import wx
from yiwinframe import YiwinFrame
from tools.mylogger import log
from myconfig import VERSION,LASTDATE,COMPANY
class YiwinApp(wx.App):
def OnInit(self):
self.myframe = YiwinFrame( u'奕枫仪器剖面光谱测量分析软件 Ver1.0', parent=None)
self.myframe.statusBar.SetStatusText( u" 版权所有 " + COMPANY
+" 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"******** Profiler Software for Dealing RAMSES Raw data *********", __name__, "", "")
app = YiwinApp( )
app.MainLoop()

@ -0,0 +1,43 @@
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['app.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='app',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='icon.ico',
)

File diff suppressed because one or more lines are too long

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = DLAB_2016-11-29_14-47-59_729_812
IDDevice = SAM_852F
IDDataType = SPECTRUM
IDDataTypeSub1 = BACK
IDDataTypeSub2 =
IDDataTypeSub3 =
DateTime = 2016-11-29 14:41:43
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType = SAM Calibration Station
MethodName = SAM_Calibration_Station
Mission =
MissionSub = 0
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack =
IDDataCal =
IntegrationTime = 8192
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $03 $05 Intensity counts
Unit3 = $03 $05 Intensity counts
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 12 0 0
1 0.0181271394490075 0.0246216519286131 0
2 0.0179948670252732 0.024510637261161 0
3 0.0180195207374602 0.0246496004937187 0
4 0.0181005261905924 0.0246158903420498 0
5 0.018089553708784 0.0244170047588795 0
6 0.0180460947386496 0.0245126709060577 0
7 0.0180426749981038 0.0246256846551714 0
8 0.0180534564280807 0.0247016785610073 0
9 0.0180790359128869 0.0245795106168697 0
10 0.0180635226786445 0.024601391414026 0
11 0.0180649523395645 0.0247430929974417 0
12 0.0180630058790784 0.0246690990460763 0
13 0.0180600544336154 0.0246595979967682 0
14 0.0180597668962471 0.024549218035998 0
15 0.0180588020408788 0.0245417076893854 0
16 0.0180498552319141 0.0249321420235364 0
17 0.0180704773142647 0.0245095865737246 0
18 0.0180562171706652 0.0245109975567032 0
19 0.0180717635554537 0.0246271043662396 0
20 0.0180430410499234 0.0249088567021879 0
21 0.0180523488508876 0.0244657876231882 0
22 0.0180618142041841 0.0248177038501861 0
23 0.0180579205853055 0.0247746806522609 0
24 0.0180626933915622 0.0246467759093347 0
25 0.0180613022899616 0.0244827044066167 0
26 0.0180574472304024 0.0246539416709665 0
27 0.0180710633810246 0.024721638131062 0
28 0.0180638238251844 0.0244816703025508 0
29 0.0180615148024098 0.0248143197952532 0
30 0.0180669541091198 0.0247325126325631 0
31 0.0180750465063777 0.0245241834309148 0
32 0.0180621163975833 0.0244880571694591 0
33 0.0180742925931686 0.0247891481591618 0
34 0.0180599654505706 0.0245174540737672 0
35 0.0180625609638543 0.0248839095525633 0
36 0.018079003460247 0.0244844522938572 0
37 0.0180789446616468 0.024819053561975 0
38 0.0180641596925595 0.0246153722426461 0
39 0.0180789860125912 0.0244569738236619 0
40 0.0180726758933779 0.024594164032081 0
41 0.0180883707577176 0.024739169721128 0
42 0.0180761767655234 0.0246157473759408 0
43 0.0180788425928601 0.0245033974853286 0
44 0.0180748167207502 0.0247480762129667 0
45 0.018087924097728 0.0246028704761041 0
46 0.0180769134055532 0.0245055458173238 0
47 0.0180908061015206 0.02469614722145 0
48 0.0180821035597377 0.0244073975760008 0
49 0.0180826006434528 0.0245040215437411 0
50 0.0180812086694694 0.0244248794159556 0
51 0.0180992416941691 0.0244697287048048 0
52 0.0180889166948691 0.0246472875499521 0
53 0.0180883470289057 0.0246650067939463 0
54 0.0180961206574913 0.0244401485106133 0
55 0.0180961166445305 0.0243791267698239 0
56 0.0180882432153534 0.0246499286698909 0
57 0.0180960383045557 0.0243780806209942 0
58 0.0180981065496797 0.0247780093711051 0
59 0.0180892262162838 0.0247202135322636 0
60 0.018090062656905 0.0245516643449751 0
61 0.0181151497688632 0.0244492274695042 0
62 0.0180994168686337 0.0246700816544131 0
63 0.0180945880554018 0.0246774251199509 0
64 0.0181024354875717 0.0245070955769284 0
65 0.0180812022138367 0.0246320020464858 0
66 0.018095840622615 0.0244041100537399 0
67 0.0181047246200187 0.0245954472358265 0
68 0.0180913783846324 0.0243854736620815 0
69 0.0181042299789754 0.0245493665880845 0
70 0.018097802960468 0.0247136054955626 0
71 0.0180910716548426 0.0246331129577409 0
72 0.0181013286082848 0.0247415952572516 0
73 0.0180952437383085 0.0248944354541623 0
74 0.0181025522123893 0.0247328998106215 0
75 0.0180982995207534 0.0246575704615342 0
76 0.0180837411967154 0.0247710366748172 0
77 0.0181112380044225 0.0247250916615888 0
78 0.0181073538072781 0.0247268100478861 0
79 0.018103745283096 0.0248027810861271 0
80 0.0180962696604722 0.0248363912138882 0
81 0.0181080471771214 0.0249100102065207 0
82 0.0180900361364681 0.0245452771289432 0
83 0.0181011494208593 0.0246815472221476 0
84 0.0181086649986149 0.0246684887780455 0
85 0.0181182547536976 0.0248864084046402 0
86 0.0181057997445719 0.024731509076811 0
87 0.0181089392757648 0.0246692868745663 0
88 0.0181055429150778 0.0245807166643024 0
89 0.0181146218027973 0.0247555966841634 0
90 0.0181128730242519 0.024710914276389 0
91 0.0181162224507446 0.0247437058838994 0
92 0.018127437978399 0.0247758020372237 0
93 0.0181252793544177 0.0244627418690115 0
94 0.0181109518628667 0.0246814871728906 0
95 0.0181264111838525 0.0246144002825787 0
96 0.018109165222908 0.0247326369205602 0
97 0.0181143328696165 0.0247778595970861 0
98 0.0181233651720949 0.0250858798171903 0
99 0.0181237422159377 0.02491093660596 0
100 0.0181142894249535 0.0248098248290651 0
101 0.0181268594141312 0.0248231980080813 0
102 0.0181223244194237 0.0247223508668658 0
103 0.0181331201564784 0.0247285340201608 0
104 0.0181055589669212 0.0245271073409594 0
105 0.0181385395728607 0.0246145044959695 0
106 0.0181050559510032 0.0247301532553592 0
107 0.0181237826944993 0.0247854968501228 0
108 0.0181113664191696 0.0249164176717207 0
109 0.0181140599882791 0.0248323871154641 0
110 0.0181137768128247 0.0245063201734407 0
111 0.0181257021111189 0.0249895534773082 0
112 0.0181361358093148 0.0247316035147414 0
113 0.0181222916178307 0.0250480786353239 0
114 0.0181118017381829 0.0245604978699841 0
115 0.0181256476744327 0.0248995078707639 0
116 0.0181248496186543 0.0247918838915929 0
117 0.0181254770363585 0.0246323141629729 0
118 0.0181331583668447 0.0246174315481265 0
119 0.0181230066227672 0.0245240120112333 0
120 0.0181144363342157 0.0247643169185683 0
121 0.0181321676889458 0.0246655463644507 0
122 0.0181179351126425 0.024543567994421 0
123 0.0181364284065034 0.0246558676112366 0
124 0.0181453949313192 0.0245943996905025 0
125 0.0181325621804444 0.0250753080058395 0
126 0.0181156688366246 0.0250045579362867 0
127 0.0181297948077507 0.0246554029277417 0
128 0.0181383919656923 0.0250264155167244 0
129 0.0181374979478067 0.0246469593737799 0
130 0.0181199012889798 0.024665052703698 0
131 0.0181422937849691 0.0248279473108028 0
132 0.0181196791803209 0.0246961217354281 0
133 0.0181355928382649 0.0245553355540586 0
134 0.0181084210803862 0.0245557204628138 0
135 0.018133168137532 0.0247270518159704 0
136 0.0181404589894803 0.0247966155635732 0
137 0.0181418954549861 0.0247140158903397 0
138 0.0181177946590129 0.0247626610253931 0
139 0.0181147076452641 0.0248185803249523 0
140 0.0181089181641013 0.024609407466155 0
141 0.0181443674388664 0.0247364268316634 0
142 0.0181377502409103 0.0246575409605911 0
143 0.0181289850620429 0.0248112543155938 0
144 0.0181158340659255 0.0245781406559126 0
145 0.0181305586661236 0.0247824863574285 0
146 0.0181270701818138 0.0246500847281345 0
147 0.0181084884283378 0.0247009649523946 0
148 0.0181265399475526 0.0248219430833464 0
149 0.0181359089897888 0.024708337569752 0
150 0.0181099418180697 0.0246372621170157 0
151 0.0181312042293899 0.0247286281089676 0
152 0.0181193782082575 0.0245687148427376 0
153 0.0181291396482737 0.0244441117615777 0
154 0.0181114958807759 0.0246077550642157 0
155 0.018131541667054 0.0247010606122576 0
156 0.0181167600130213 0.0247215691791535 0
157 0.018133784563213 0.0245714196777312 0
158 0.01811013496362 0.024795434478477 0
159 0.018139256671516 0.0244320022353862 0
160 0.0181215378790981 0.0247462735133231 0
161 0.0181241962039428 0.0246903013215404 0
162 0.0181255386265836 0.0245514873393163 0
163 0.0181152391008612 0.0245751469211505 0
164 0.0181239868320727 0.0246573018109337 0
165 0.018128921378099 0.0244665511564739 0
166 0.0181191986718789 0.0246441606245413 0
167 0.0181302022105147 0.0244944379267046 0
168 0.0181156925654366 0.0247590790173862 0
169 0.018128299020215 0.0244953459971555 0
170 0.0181149622065629 0.0247222716158114 0
171 0.0181265924649967 0.0246553421802375 0
172 0.0181200464534764 0.0246119307568831 0
173 0.018134817115486 0.0246354342804737 0
174 0.0181138528846042 0.0243070187840778 0
175 0.0181302275096157 0.0247393772751007 0
176 0.0181219730236349 0.0245134415963769 0
177 0.0181227435121171 0.0247120136665658 0
178 0.0181128882037125 0.0245733489346753 0
179 0.0181298839652721 0.0244120664057354 0
180 0.0181217728990224 0.0245414062211677 0
181 0.0181271213034454 0.0248899691161084 0
182 0.0181002302783493 0.0246153303478156 0
183 0.0181198512142075 0.0247247613906751 0
184 0.0181077788321745 0.0246353044064992 0
185 0.0181113704321304 0.0248533992931349 0
186 0.0181110165936699 0.0244737232023303 0
187 0.0181200574454996 0.0247406206787574 0
188 0.0181026958065969 0.0245452593236402 0
189 0.0181267051768535 0.0245186117675831 0
190 0.018099050467861 0.024411721471631 0
191 0.0181217983725999 0.0246871115538839 0
192 0.0181250125797599 0.0245525059073826 0
193 0.018113538826799 0.0247245782753535 0
194 0.0181123129544992 0.0246827284818056 0
195 0.0181229691103072 0.0247343388980489 0
196 0.0181081715789076 0.0248475752134495 0
197 0.0181231769118883 0.024459163701364 0
198 0.0181145502674084 0.0247058137553385 0
199 0.0181123405217955 0.0246986457244034 0
200 0.0181137211548025 0.024567998615698 0
201 0.0181167594895916 0.0243962081650239 0
202 0.0181050918931742 0.02490341386546 0
203 0.0181182652222911 0.024537072550077 0
204 0.0181006336681525 0.0244906673919604 0
205 0.0181259247432075 0.0245997164936153 0
206 0.018101253059935 0.0246575069210413 0
207 0.018119688602055 0.0242198948182748 0
208 0.018109630726366 0.024409780344485 0
209 0.0181146952574284 0.0242338197871209 0
210 0.0181041917686091 0.0244076180475463 0
211 0.0181114787820732 0.0245564188845504 0
212 0.0181135109105496 0.0246008453847352 0
213 0.0181156468525783 0.0245239058776628 0
214 0.0180992396004504 0.0246243248187984 0
215 0.0181260718269463 0.0246248141155061 0
216 0.0181003136781442 0.0243052663582307 0
217 0.0181070481243477 0.0245985008452839 0
218 0.0181074850136501 0.0243217586073769 0
219 0.0181076732738566 0.0246622282938758 0
220 0.0181037805273608 0.0246268287331674 0
221 0.0181054610855719 0.0244327690853459 0
222 0.0180953817492662 0.0245608707339754 0
223 0.0181251186615074 0.0244063069139137 0
224 0.0181015350140535 0.0246343666605434 0
225 0.0181170220768121 0.0244305303303416 0
226 0.0180958751689736 0.0247014261446536 0
227 0.0181153706561862 0.0246118652962104 0
228 0.0181087792807607 0.0246281107149804 0
229 0.0181190203568361 0.0246470772029907 0
230 0.0181090340165361 0.0247607972291217 0
231 0.0181264401469612 0.0247295342592388 0
232 0.0181213607853913 0.0246461279359564 0
233 0.0181053968781984 0.0245565616760977 0
234 0.0181112694102031 0.0244480411475541 0
235 0.0181143349633352 0.0245717391258137 0
236 0.0181028416689998 0.0246028116487796 0
237 0.0181058145750794 0.0248620650642601 0
238 0.018112246653407 0.0244563693161703 0
239 0.018102646778684 0.0245400739655581 0
240 0.0181018787328736 0.024658254394642 0
241 0.0181089858610059 0.0247536939606119 0
242 0.0181129695097887 0.024581995678565 0
243 0.0181304682872664 0.024518225986019 0
244 0.0181118867082669 0.0249431329577538 0
245 0.0181302966023328 0.024793957860264 0
246 0.0181224601621861 0.0246779200026361 0
247 0.0181439211278299 0.0246277942344484 0
248 0.0181333813478864 0.0245882612250266 0
249 0.0181515932110585 0.0245443142460891 0
250 0.0181361972250634 0.0244427728726199 0
251 0.0181645852590311 0.0245225095578749 0
252 0.018168622995547 0.0246755827947801 0
253 0.0182029242145575 0.0244593372157869 0
254 0.01826668143855 0.0246154502717679 0
255 0.0187321041138753 0.0255941653568822 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = DLAB_2018-05-04_11-56-28_529_586
IDDevice = SAM_859F
IDDataType = SPECTRUM
IDDataTypeSub1 = BACK
IDDataTypeSub2 =
IDDataTypeSub3 =
DateTime = 2018-05-04 11:50:12
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType = SAM Calibration Station
MethodName = SAM_Calibration_Station
Mission =
MissionSub = 0
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack =
IDDataCal =
IntegrationTime = 8192
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $03 $05 Intensity counts
Unit3 = $03 $05 Intensity counts
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 12 0 0
1 0.0165892037855774 0.018605511502516 0
2 0.0165122714877024 0.0184837131056956 0
3 0.0164973019224162 0.0183851120510798 0
4 0.0166164505683762 0.0184840774161591 0
5 0.0165490556826164 0.0185292503425739 0
6 0.0165598147795938 0.0186302980552904 0
7 0.0164974439463348 0.0183759157866635 0
8 0.0165638938670541 0.0186312056020559 0
9 0.0165295399561229 0.0185970883722841 0
10 0.0165679375357729 0.018610557385725 0
11 0.0165135498774463 0.018696732782741 0
12 0.0165496044113927 0.0185527901750176 0
13 0.0165162233817516 0.0184841121539561 0
14 0.0165748471564411 0.0185602766066645 0
15 0.0165168071803162 0.0183555554227304 0
16 0.016561615028724 0.0185179326286786 0
17 0.0165228899565738 0.0185996666499772 0
18 0.0165630265440819 0.0186817794703681 0
19 0.0165138880130166 0.0184706934143117 0
20 0.016557182975186 0.0185104139030999 0
21 0.0165155392591658 0.0185717901788923 0
22 0.0165657065040199 0.0185864488309574 0
23 0.016518681058554 0.0184904599190226 0
24 0.0165595148543898 0.0185467707606851 0
25 0.0165168741793146 0.0185513739551852 0
26 0.0165713147040385 0.0186439978394227 0
27 0.0165192898072665 0.0185915799003217 0
28 0.0165624174464164 0.0186942077463949 0
29 0.0165336104942318 0.0186620183770728 0
30 0.0165711529642688 0.0186390987626822 0
31 0.0165277786152653 0.0185678106936811 0
32 0.0165778362888406 0.0186122998615499 0
33 0.0165368341231259 0.0184338018739524 0
34 0.0165763434674064 0.0186563994074951 0
35 0.0165347332508855 0.0186582494133848 0
36 0.0165844704110229 0.0184381484626158 0
37 0.0165276158286362 0.0187957369005385 0
38 0.016561547855249 0.0184585601477162 0
39 0.0165227810832013 0.018382363401076 0
40 0.0165862270410135 0.0185619393077496 0
41 0.0165383602695828 0.0188072553604966 0
42 0.0165776928691096 0.018482204891798 0
43 0.0165375732058275 0.0185649745882186 0
44 0.0165658438170714 0.0189122127337069 0
45 0.0165459794864142 0.0186279875553889 0
46 0.0165800024153139 0.0184615582465232 0
47 0.0165525603932462 0.0185698745377681 0
48 0.0165907623846741 0.0185120261558266 0
49 0.0165508449397234 0.0184379972921025 0
50 0.0165903560287695 0.0185804266236362 0
51 0.0165476473078365 0.0185466583428899 0
52 0.0165857165226035 0.0185885491584593 0
53 0.0165481178711146 0.0184078979511364 0
54 0.0165957271151451 0.0184049089295427 0
55 0.0165507685189908 0.0184970417714545 0
56 0.0165883062781607 0.0184417327399261 0
57 0.0165548565047555 0.0183843069720872 0
58 0.0166030835702795 0.0185357707492544 0
59 0.0165500053585241 0.018271672720313 0
60 0.0165961038100348 0.018684147226538 0
61 0.0165517131350783 0.0187957920620654 0
62 0.0166133108627067 0.0182829548236024 0
63 0.0165473248751564 0.0184118543941909 0
64 0.0165983146025071 0.0184413151881155 0
65 0.0165525591719102 0.0184057733595452 0
66 0.0166064242729443 0.0182871827102461 0
67 0.0165435383848847 0.0183972310036081 0
68 0.0165950365369267 0.0185852110132782 0
69 0.0165586482293239 0.0183187237570663 0
70 0.0166092385798323 0.0184794824260633 0
71 0.0165697841956677 0.0185034061198914 0
72 0.0165967129077004 0.0181402547467266 0
73 0.0165732545344154 0.0184165518520597 0
74 0.0166026855892496 0.0183788985240326 0
75 0.0165687354170748 0.0181609569026518 0
76 0.0166129015407006 0.0186252303518572 0
77 0.0165534954131229 0.0183105499010758 0
78 0.0166168593669527 0.0181418076484435 0
79 0.0165646865140591 0.0183057028437498 0
80 0.0166018156491291 0.018502016957137 0
81 0.0165586096700045 0.0184040678908206 0
82 0.0166129247460829 0.0184980723842845 0
83 0.0165712166482126 0.0184303921584359 0
84 0.0166143243970348 0.0185389638335849 0
85 0.0165701301826831 0.0182085812003356 0
86 0.0166189659969196 0.0184602108040376 0
87 0.0165676643054824 0.0184275042081207 0
88 0.0166299271377517 0.0185323186152219 0
89 0.0165751742999882 0.0182322636497648 0
90 0.0166072596667062 0.0183371464850892 0
91 0.0165629157514673 0.0182259586523378 0
92 0.0166089130065742 0.018483065481441 0
93 0.0165693558557167 0.0182905728748417 0
94 0.0166203017894511 0.0184016187888549 0
95 0.0165698981288603 0.0183132295991711 0
96 0.0166107804291794 0.0181924879994499 0
97 0.0165637935430329 0.0184099916452902 0
98 0.0166245248200721 0.0187024550929006 0
99 0.0165754381085446 0.0183715293979111 0
100 0.0166166770389491 0.0183022039271567 0
101 0.01656780789969 0.0184077949596782 0
102 0.0166270111110302 0.0183611756142407 0
103 0.0165662229546329 0.018411879705651 0
104 0.0166136421936913 0.0183403743072167 0
105 0.0165698424708382 0.0184016243748323 0
106 0.0166173691874565 0.0184520221102946 0
107 0.0165821997730911 0.0183486391099018 0
108 0.0166164975025705 0.01861046347148 0
109 0.0165739878593907 0.0185649627180167 0
110 0.016623824645643 0.0184582639163523 0
111 0.0165631308810639 0.0186787228933602 0
112 0.0166247172677161 0.0185190477294169 0
113 0.0165669479047333 0.0186510274428554 0
114 0.0166042075482691 0.0186025957968757 0
115 0.0165806895040011 0.0183767100428249 0
116 0.0166075213815439 0.0183237705130843 0
117 0.0165708319274012 0.0183277608211268 0
118 0.0166233251192561 0.0185572685578353 0
119 0.0165772010196913 0.0184446809140601 0
120 0.016621139974838 0.0186042166031303 0
121 0.0165690780890356 0.0186733833972142 0
122 0.0166295818486425 0.0186773335560441 0
123 0.0165801878838955 0.0184308924525366 0
124 0.0166132293821539 0.0186073100126766 0
125 0.0165742146789166 0.0183468275076066 0
126 0.0166257485986531 0.0185506345114271 0
127 0.0165839324997932 0.0186062746866781 0
128 0.0166274820232614 0.0184876664066378 0
129 0.0165711257459257 0.0182968567502917 0
130 0.0166118375826471 0.0184814123812545 0
131 0.0165702390560556 0.0186338901878814 0
132 0.0166138555785223 0.0185727479994544 0
133 0.0165495885340259 0.0184737700659259 0
134 0.0166076853895089 0.0185519168423637 0
135 0.0165715106412136 0.0184109360245942 0
136 0.0165914878582042 0.0186137698464147 0
137 0.0165708420470416 0.0184927182249478 0
138 0.0166090042578143 0.0183322589294271 0
139 0.0165677817282062 0.0184634239629744 0
140 0.0166140523880802 0.0185381407747276 0
141 0.0165772907006423 0.0183129747389523 0
142 0.0166172060518744 0.018566407740545 0
143 0.0165733789362016 0.0184619363473684 0
144 0.0166208616847272 0.0185385801467623 0
145 0.0165699940909675 0.0184219012982279 0
146 0.0166094990733341 0.0184126872285087 0
147 0.0165568282643426 0.0186440826764544 0
148 0.0166152531357555 0.0184714934310123 0
149 0.0165675189665092 0.0186275679088368 0
150 0.0166057366608274 0.0184197444127049 0
151 0.0165695308557048 0.0184460824707018 0
152 0.0165973481768498 0.018243945325 0
153 0.0165636400036615 0.018415498022511 0
154 0.0166118299056785 0.0184500097619367 0
155 0.0165665354421491 0.0185133976878398 0
156 0.0165949780872796 0.0184093356420695 0
157 0.0165594520428288 0.0185570035730324 0
158 0.0166050473039449 0.0186677780434563 0
159 0.0165700478297475 0.0187476308123041 0
160 0.0166062033856213 0.0184833070749635 0
161 0.0165620390067611 0.0183987680202018 0
162 0.0165990297819202 0.0183971864903508 0
163 0.016574294763657 0.0184699862644854 0
164 0.0165960321001693 0.0186248246702486 0
165 0.016567221483977 0.0185793174579989 0
166 0.0166072507684017 0.0187341727962561 0
167 0.0165554031398131 0.0185118727160099 0
168 0.0166002793830319 0.0185141533658448 0
169 0.0165516576515327 0.0185683596905223 0
170 0.0166026362123836 0.0185158860662092 0
171 0.0165560230550254 0.0183562021741761 0
172 0.0166113124082061 0.018351702145696 0
173 0.0165672890064051 0.0183285858001638 0
174 0.016604050693843 0.0184325741808572 0
175 0.0165640243755198 0.0182299784613234 0
176 0.0166057021144688 0.0183180300484981 0
177 0.0165508046356384 0.0186951084852505 0
178 0.0165935180674385 0.0184788363728647 0
179 0.0165675029146658 0.0183958849576168 0
180 0.0165893028882626 0.0184240855899527 0
181 0.0165492090475113 0.0185323332784126 0
182 0.0165956159735774 0.0186074587393249 0
183 0.0165528561310127 0.0186410439047495 0
184 0.0166073952349921 0.0184129410413568 0
185 0.0165463099450159 0.0183934452819879 0
186 0.0166001891786512 0.0185733495393955 0
187 0.0165482056328235 0.0185109349700541 0
188 0.0165952621351168 0.0185722325184776 0
189 0.0165536456374398 0.0184577447695778 0
190 0.0165997360630289 0.0184457087339014 0
191 0.0165524916494821 0.0183168259212451 0
192 0.0165986206343906 0.0184703884548581 0
193 0.0165521507222869 0.0184217183574681 0
194 0.016599824522644 0.0185029386434078 0
195 0.0165434263709342 0.0186379566048659 0
196 0.0166010940140834 0.018342027581965 0
197 0.0165431388335659 0.0184254820843023 0
198 0.0165863373101985 0.0186074793376165 0
199 0.0165434326520903 0.0184241568111645 0
200 0.0166064767903884 0.0182465302360413 0
201 0.016561522556148 0.0184340305499022 0
202 0.0165987263671851 0.0186743681002925 0
203 0.0165499257972134 0.0184118549178763 0
204 0.0165839637310972 0.0184971573313619 0
205 0.0165457994266058 0.0183981095731159 0
206 0.0165795458101604 0.018496162154576 0
207 0.0165524665248577 0.0184611797965545 0
208 0.016595737060309 0.0186299800037023 0
209 0.0165466772181714 0.018466689839573 0
210 0.0165879578484734 0.0186946017323634 0
211 0.0165430683450362 0.0185245357776493 0
212 0.0165948067512992 0.018476103782546 0
213 0.0165396531408809 0.0182796915654308 0
214 0.0165652856665609 0.0185767679830018 0
215 0.0165523227561735 0.0183549425362727 0
216 0.0165783818770389 0.0183019200896801 0
217 0.0165503544861175 0.0185407187032971 0
218 0.016572293692008 0.0184576592342989 0
219 0.0165450638334354 0.0184396004676159 0
220 0.0165749698134617 0.0183728665412509 0
221 0.01655305398743 0.018711382183031 0
222 0.0165967214570518 0.0185027394684012 0
223 0.0165454616399886 0.0184419015411806 0
224 0.0165946692637712 0.0184852501222893 0
225 0.0165392806334286 0.0186597281263393 0
226 0.0165890797327443 0.0187948452388963 0
227 0.0165355112418597 0.0182642088071376 0
228 0.0165804930433963 0.0186078693086637 0
229 0.0165460245013662 0.0186437127800135 0
230 0.0165847202614547 0.0185804302894338 0
231 0.0165448417247764 0.0185832597615481 0
232 0.0165611542361331 0.0185230038233477 0
233 0.0165515342966058 0.0187595940557125 0
234 0.0165765880835414 0.0185726041605364 0
235 0.0165339756736686 0.018819251596084 0
236 0.0165878632821788 0.0186927800054842 0
237 0.0165440089481629 0.0187059691963698 0
238 0.0165963711081224 0.0186125063681518 0
239 0.0165516928957975 0.0187091867193515 0
240 0.0165934388550809 0.0187669087185543 0
241 0.0165544309564294 0.0187420275532877 0
242 0.0165877533619469 0.0185165169325316 0
243 0.0165399865655842 0.0184496782690904 0
244 0.0165907330726123 0.0184827699483242 0
245 0.016550628937744 0.0184833114390083 0
246 0.0166034288593887 0.0188096297500146 0
247 0.0165659505967252 0.0186457825592016 0
248 0.0166105647761531 0.0186986550572133 0
249 0.0165655829746165 0.018635516056428 0
250 0.0166172674676229 0.0185666859920442 0
251 0.0165796119367761 0.0185794000257273 0
252 0.0166424952076873 0.0185533461543306 0
253 0.0166246136286404 0.0186423201260233 0
254 0.0167334388455894 0.0186220849228963 0
255 0.0171297295465388 0.0196555486961812 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = DLAB_2018-06-11_15-23-57_730_586
IDDevice = SAM_85B5
IDDataType = SPECTRUM
IDDataTypeSub1 = BACK
IDDataTypeSub2 =
IDDataTypeSub3 =
DateTime = 2018-06-11 15:17:40
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType = SAM Calibration Station
MethodName = SAM_Calibration_Station
Mission =
MissionSub = 0
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack =
IDDataCal =
IntegrationTime = 8192
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $03 $05 Intensity counts
Unit3 = $03 $05 Intensity counts
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 12 0 0
1 0.0164817607719245 0.0184759992200316 0
2 0.0163219290778752 0.018442149942613 0
3 0.0163731972698131 0.0187318928446685 0
4 0.0164399246082603 0.0186864332877884 0
5 0.0164430241843214 0.0188479230215774 0
6 0.0163983356778795 0.0188454845678811 0
7 0.0163990512062458 0.0188404723750983 0
8 0.0163901000353671 0.0187262068433619 0
9 0.0164207307910173 0.0187526368954241 0
10 0.0164008709967505 0.018602897614217 0
11 0.0164082743860791 0.0187456469175185 0
12 0.0163908071888585 0.0186707166166917 0
13 0.0164252516531235 0.0185607140585195 0
14 0.0163975419840151 0.0187588039890341 0
15 0.0164170151382283 0.0188965777575295 0
16 0.0163836419600322 0.0187075898280626 0
17 0.0164195574361616 0.0187674584136427 0
18 0.0163940245365965 0.0186381709667486 0
19 0.0164118187028877 0.0186427120172502 0
20 0.016392199511795 0.0187927918685168 0
21 0.0164065571877907 0.0186624507666358 0
22 0.0163945228416475 0.0187624519813991 0
23 0.0164219489863484 0.0187392302005435 0
24 0.0163932453242865 0.0185522851677484 0
25 0.0164305632429927 0.0186472895511667 0
26 0.0163847816409121 0.018535703368402 0
27 0.0164318688510797 0.0186348291557698 0
28 0.0164176912348923 0.0186553691437886 0
29 0.0164202520273408 0.0187121064399131 0
30 0.0164088639423701 0.0186093935822463 0
31 0.0164306347783817 0.0187113848014579 0
32 0.0164189001829659 0.0186487433017847 0
33 0.0164341838060573 0.0187725126758178 0
34 0.0164138319878957 0.0187999361590481 0
35 0.0164304957205646 0.0187205484228188 0
36 0.016429661373662 0.0188728539369552 0
37 0.0164248637917341 0.0187682175828836 0
38 0.0164295341802509 0.0187626176405413 0
39 0.0164375396881828 0.0188624825225437 0
40 0.0164033339078497 0.0187837980957813 0
41 0.0164426914575244 0.0188658971257905 0
42 0.0164161851532397 0.0186604942780519 0
43 0.0164508810382254 0.0189255700275998 0
44 0.0164265781983975 0.0186329430155887 0
45 0.0164319475400075 0.0188553270600577 0
46 0.016422878946405 0.0187585744402754 0
47 0.0164658096015204 0.0188853157288465 0
48 0.016435585550728 0.0188095644639038 0
49 0.016451332060129 0.0189702224107457 0
50 0.0164379950720003 0.0190654765920908 0
51 0.0164365183024095 0.0188298321355244 0
52 0.0164243435026367 0.0189752702141345 0
53 0.0164365261538547 0.0190654219542494 0
54 0.0164254425304785 0.0188267308706973 0
55 0.0164527732365019 0.0190373731906741 0
56 0.0164500622197366 0.0189250398834323 0
57 0.0164541095524632 0.0189864086530676 0
58 0.0164375095037381 0.0190345625712336 0
59 0.0164747180256422 0.0188082665969675 0
60 0.0164484643634142 0.0190122781872102 0
61 0.0164537975883766 0.0188972889222771 0
62 0.0164461544682567 0.0185940174812091 0
63 0.0164698387886849 0.0187732280300485 0
64 0.0164431478882013 0.0188341576022108 0
65 0.0164654240083262 0.0188008229329601 0
66 0.0164472887403633 0.0188143481552986 0
67 0.0164750846008916 0.0188958311567378 0
68 0.016451503570586 0.0186248391588775 0
69 0.0164619681511328 0.0188025980518404 0
70 0.0164507452954629 0.0189280180821948 0
71 0.0164756266995587 0.0188994067059584 0
72 0.0164519861727467 0.0187979548826894 0
73 0.0164677262265151 0.0188527726973303 0
74 0.0164529956941139 0.0189566842708345 0
75 0.0164743584294553 0.0188313071826812 0
76 0.0164623034950781 0.0188952770976046 0
77 0.0164737165301967 0.0189118414407716 0
78 0.0164694078315855 0.0185289364804688 0
79 0.0164841373171273 0.0186616668096203 0
80 0.0164653304888909 0.0188390641851084 0
81 0.0164847460658397 0.0188772853626504 0
82 0.0164548329322745 0.0188133788136582 0
83 0.0164595881163988 0.019095000402823 0
84 0.016470273409792 0.0189106139222383 0
85 0.0164793578807614 0.0190673035558238 0
86 0.0164794932745707 0.0189999768176074 0
87 0.0164779744561293 0.0188888352437313 0
88 0.0164553809631447 0.0191460724704944 0
89 0.0164876681992408 0.0188107766209993 0
90 0.0164698851994495 0.0192259407753418 0
91 0.0164899871671793 0.0189064331672789 0
92 0.0164501525985938 0.0190127816234232 0
93 0.0164753983097437 0.0187168141969277 0
94 0.0164809215396783 0.0190825361670666 0
95 0.0164902986078362 0.0190127334443682 0
96 0.0164763052388946 0.0191085322585096 0
97 0.0164924607213486 0.0188582193744177 0
98 0.0164652690731423 0.0188903102908881 0
99 0.0164867010756773 0.0189330562846849 0
100 0.0164660367699995 0.0190078099289766 0
101 0.0164911903575265 0.0189027331554994 0
102 0.0164677717648968 0.0189810824236179 0
103 0.0165022066329511 0.0189551510946003 0
104 0.0164662370690886 0.0189044651576166 0
105 0.016489524978776 0.0187674423539577 0
106 0.0164685029961533 0.0189472727717265 0
107 0.0164921269476923 0.0189907035714401 0
108 0.0164558499561338 0.019064578646224 0
109 0.0164738716398572 0.0188920054604669 0
110 0.0164762743565437 0.0190449437611056 0
111 0.0164791764251406 0.018889919447032 0
112 0.0164705429760749 0.0187988736014097 0
113 0.0164789927013245 0.0192020416947266 0
114 0.016473611669785 0.0188233049209339 0
115 0.0164614993326202 0.0187371501222097 0
116 0.0164598238342293 0.0189721827396891 0
117 0.0164727508024456 0.0188261000043749 0
118 0.0164582863467961 0.0186942695412699 0
119 0.0164685862214717 0.0189034198815958 0
120 0.0164525792185689 0.0187198665844525 0
121 0.0164773030703324 0.0186137942850658 0
122 0.0164670838038268 0.0189533499660128 0
123 0.0164831073820027 0.0187808211189513 0
124 0.0164667688736388 0.0188594921044556 0
125 0.0164761180255473 0.0188539249797306 0
126 0.0164464892887724 0.0188040633235368 0
127 0.0164720077067831 0.0187732121449252 0
128 0.0164452072350208 0.018962250173627 0
129 0.0164870899839261 0.0190127418233343 0
130 0.016459772189168 0.0191750319229475 0
131 0.0164701266750064 0.0189599365316131 0
132 0.0164611727125027 0.0190203120446422 0
133 0.0164680781457335 0.0190216017071741 0
134 0.0164568425532749 0.0186128352425711 0
135 0.0164788192716254 0.019228758377254 0
136 0.0164516724638946 0.0189206767113985 0
137 0.016478949431138 0.0188962342199195 0
138 0.0164561298165336 0.0191006190232771 0
139 0.0164755542917869 0.0190500058785614 0
140 0.0164556124935377 0.0187485043195198 0
141 0.0164507196474088 0.0190170367417068 0
142 0.0164471687004911 0.0188547895842948 0
143 0.0164601098013086 0.0188974739577785 0
144 0.0164608579567913 0.0189445812034293 0
145 0.0164729301643477 0.0189157249169963 0
146 0.0164409632672129 0.0191215468876016 0
147 0.0164714560119053 0.0187773754437052 0
148 0.016453806137728 0.0190317306552542 0
149 0.016458409701723 0.0190325910703354 0
150 0.016446300156183 0.0190408668704134 0
151 0.0164759950195736 0.0189401984804746 0
152 0.0164447300416335 0.0190495591749313 0
153 0.0164623949207948 0.0187950388279255 0
154 0.0164359400870948 0.0189297027780659 0
155 0.0164562215912033 0.0189593482583683 0
156 0.0164493753055259 0.0190509148218212 0
157 0.0164598233107996 0.0188672314761416 0
158 0.0164437951962332 0.0189148159737365 0
159 0.0164648208428636 0.0191385526975449 0
160 0.0164373709693507 0.0190494453606418 0
161 0.0164554146371204 0.0190579196374793 0
162 0.0164451486108972 0.019121285044911 0
163 0.0164645650602289 0.019044043895059 0
164 0.0164504392635794 0.0186976181601587 0
165 0.0164504671798287 0.0189873739797868 0
166 0.0164356687760464 0.0191378319318987 0
167 0.0164534369453303 0.0190663267080262 0
168 0.0164388145883954 0.0190936695437077 0
169 0.0164527186253391 0.0191095358142617 0
170 0.0164332435518838 0.0189574708462769 0
171 0.0164442846029797 0.0187806189763942 0
172 0.0164340580084587 0.0189485074472935 0
173 0.0164485673045837 0.0187745148995917 0
174 0.0164290273258486 0.018830215822347 0
175 0.016450102349345 0.0188787988134019 0
176 0.0164311430285965 0.0189920377472294 0
177 0.0164412099770665 0.0188564391932454 0
178 0.0164335047432918 0.0190900863137682 0
179 0.0164442961184326 0.0189570108759505 0
180 0.0164228450979527 0.0190537807773504 0
181 0.016437492579512 0.0188639551258354 0
182 0.0164196870722445 0.0189272838752905 0
183 0.016438840061973 0.0189407244351591 0
184 0.0164283787964808 0.0191445909645512 0
185 0.0164416083070495 0.0190009035661702 0
186 0.016412027202375 0.0190382999392369 0
187 0.016431280341648 0.0191088417565699 0
188 0.0164384511537241 0.0189974830278224 0
189 0.0164345854510949 0.0189503359820826 0
190 0.0164129589071972 0.0189001894410414 0
191 0.0164313105260926 0.0186533777428459 0
192 0.0164068407121982 0.0188463448084005 0
193 0.0164422922551586 0.0188216286040289 0
194 0.0164141230147952 0.0190486301570651 0
195 0.0164350718917399 0.0189039538661228 0
196 0.0163981727167739 0.018976088908947 0
197 0.0164302013786105 0.0186541344682217 0
198 0.0164117635682952 0.0187053388537327 0
199 0.0164348827591505 0.0188468777455567 0
200 0.0164084963202615 0.0189798348304782 0
201 0.0164184283983518 0.0190289182901957 0
202 0.0164093013551022 0.0189938748355464 0
203 0.0164248964188505 0.0188985777120001 0
204 0.0163861197016389 0.0189140892729893 0
205 0.0164414938504271 0.0189945299659582 0
206 0.0163912936295035 0.0190288961208479 0
207 0.0164153211453222 0.0188169428418004 0
208 0.0164085420331198 0.0190174979339657 0
209 0.0164144138672182 0.0187582286333621 0
210 0.0163877472189763 0.0188360660863014 0
211 0.016438808830669 0.0188666440757058 0
212 0.0163928122734684 0.018693495185153 0
213 0.016421485227656 0.0187786836097873 0
214 0.0164041312657219 0.0186433495169208 0
215 0.0164178255818423 0.0188323175463432 0
216 0.0163971898903201 0.018976409578962 0
217 0.0164201696744052 0.0187435457172076 0
218 0.0163995320636409 0.018987845122068 0
219 0.0164209146893099 0.0186761889543627 0
220 0.0164032430055628 0.0190061624147675 0
221 0.0164164507065617 0.0187835201934057 0
222 0.0163974777766416 0.0188749633416704 0
223 0.0164176661102679 0.0189686084124011 0
224 0.0163930417101427 0.0188226435062976 0
225 0.0164141233637484 0.0187423426373254 0
226 0.01640118889304 0.018996327428748 0
227 0.0164288055661428 0.0186609085131884 0
228 0.0164032700494293 0.0187348848338127 0
229 0.0164078024269885 0.0187956862776184 0
230 0.0163929630212149 0.0190963977699816 0
231 0.0164272534226787 0.0185138758125928 0
232 0.0163858681064416 0.0187250730645117 0
233 0.0164185958958479 0.0188906307863414 0
234 0.0164030676566215 0.0188630606712045 0
235 0.0164018004333774 0.0188464739841278 0
236 0.0163995488133905 0.0189781192371696 0
237 0.0164085041717066 0.0187965507076208 0
238 0.0163987202242144 0.0186990834318551 0
239 0.0164206611748704 0.0186847039040981 0
240 0.0164022528510935 0.0187928330651002 0
241 0.0164241117977671 0.0187593187717638 0
242 0.016396216660077 0.0188783466983562 0
243 0.0164233505565425 0.0187352552539389 0
244 0.0164139434784166 0.0188740873905896 0
245 0.0164194745597963 0.0187454707846687 0
246 0.0163983088084895 0.0189869951806945 0
247 0.016435900480916 0.0189396802065091 0
248 0.0164233186273323 0.0187842685398153 0
249 0.0164390513530853 0.0186674191444085 0
250 0.0164271529241811 0.0189300391586424 0
251 0.0164633723384753 0.0190247289817084 0
252 0.016452145295368 0.01897844723878 0
253 0.0165066871909724 0.0188266460336656 0
254 0.0165379624630295 0.019144633383067 0
255 0.0170330815720343 0.0204797029287844 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = AquaDLAB_2016-12-07_12-02-43_591_545
IDDevice = SAM_852F
IDDataType = SPECTRUM
IDDataTypeSub1 = CAL
IDDataTypeSub2 = Aqua
IDDataTypeSub3 =
DateTime = 2016-12-07 12:01:43
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType =
MethodName =
Mission = No Mission
MissionSub = 1
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack = DLAB_2016-11-29_14-47-59_729_812
IDDataCal =
IntegrationTime = 256
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $04 $09 1/Intensity (m^2 nm)/mW
Unit3 = $04 $09 1/Intensity (m^2 nm)/mW
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 7 0 0
1 +NAN 0 0
2 +NAN 0 0
3 +NAN 0 0
4 +NAN 0 0
5 0.0757791569140749 0 0
6 0.0831133762408903 0 0
7 0.0873256015093429 0 0
8 0.088798490578607 0 0
9 0.0893180250587088 0 0
10 0.0912184306930603 0 0
11 0.0934315009445713 0 0
12 0.0978927038642625 0 0
13 0.10316713605413 0 0
14 0.111042352696646 0 0
15 0.119482024262908 0 0
16 0.129446496806651 0 0
17 0.140324929207819 0 0
18 0.149929004563169 0 0
19 0.157951375798488 0 0
20 0.163167079267684 0 0
21 0.163684554455683 0 0
22 0.161710955408623 0 0
23 0.158158176144384 0 0
24 0.153120816765498 0 0
25 0.149159625705894 0 0
26 0.146361065436421 0 0
27 0.144318454214309 0 0
28 0.144129633718655 0 0
29 0.144738939517372 0 0
30 0.146583353055999 0 0
31 0.149927549178646 0 0
32 0.154781330782628 0 0
33 0.161281049713208 0 0
34 0.169324782015295 0 0
35 0.178566729488516 0 0
36 0.188750791302883 0 0
37 0.199826540979236 0 0
38 0.211193704798505 0 0
39 0.222305048038871 0 0
40 0.232787040612667 0 0
41 0.242185638548782 0 0
42 0.249199329450493 0 0
43 0.253905646769863 0 0
44 0.255480704613068 0 0
45 0.254086308176615 0 0
46 0.250712203525897 0 0
47 0.245637528877396 0 0
48 0.239859851966525 0 0
49 0.233843628655063 0 0
50 0.228059104546805 0 0
51 0.222661940533832 0 0
52 0.218199567518201 0 0
53 0.214240155949967 0 0
54 0.21061280671042 0 0
55 0.206823867975479 0 0
56 0.202504211638902 0 0
57 0.198378089686984 0 0
58 0.195008429198418 0 0
59 0.192596053511712 0 0
60 0.1913409806608 0 0
61 0.191204589224151 0 0
62 0.191982450755957 0 0
63 0.193875999271111 0 0
64 0.196568015329539 0 0
65 0.200197325412529 0 0
66 0.204781342874412 0 0
67 0.210052890237844 0 0
68 0.215505542064364 0 0
69 0.22102191587617 0 0
70 0.225647984382987 0 0
71 0.229501509141454 0 0
72 0.232213608637945 0 0
73 0.233859853462842 0 0
74 0.234864695710533 0 0
75 0.235347731196379 0 0
76 0.235169523165461 0 0
77 0.2348286160222 0 0
78 0.23395735104209 0 0
79 0.232593294508701 0 0
80 0.230910869907075 0 0
81 0.228844605598996 0 0
82 0.226021135136259 0 0
83 0.222713212172475 0 0
84 0.218813740820075 0 0
85 0.214437631947854 0 0
86 0.20945948892298 0 0
87 0.203847193841702 0 0
88 0.197707092492944 0 0
89 0.191556734852924 0 0
90 0.18600061167507 0 0
91 0.181873354953207 0 0
92 0.178782316057322 0 0
93 0.176167924779435 0 0
94 0.174141863608666 0 0
95 0.172744990342331 0 0
96 0.171801376758966 0 0
97 0.170954015345458 0 0
98 0.169960140045412 0 0
99 0.168049955384139 0 0
100 0.165224777136175 0 0
101 0.161531979240228 0 0
102 0.157405412608478 0 0
103 0.153570487964493 0 0
104 0.150141271545146 0 0
105 0.14725256652001 0 0
106 0.144660342475923 0 0
107 0.142269456600007 0 0
108 0.139762314536934 0 0
109 0.136963054606891 0 0
110 0.133984343960448 0 0
111 0.131197679174342 0 0
112 0.129003116254732 0 0
113 0.127069994503092 0 0
114 0.125436648144931 0 0
115 0.12397269238396 0 0
116 0.122419985358787 0 0
117 0.120693422850158 0 0
118 0.118931546980571 0 0
119 0.117166660339047 0 0
120 0.115631793601506 0 0
121 0.114393230429202 0 0
122 0.113425752529033 0 0
123 0.112707849783804 0 0
124 0.112359222280159 0 0
125 0.11219082672674 0 0
126 0.112343608199868 0 0
127 0.112664705152637 0 0
128 0.112877954686814 0 0
129 0.112998494144185 0 0
130 0.112887922565457 0 0
131 0.11253063359053 0 0
132 0.111841159102354 0 0
133 0.110997003525569 0 0
134 0.109948198155768 0 0
135 0.108874849717231 0 0
136 0.107795318097265 0 0
137 0.106637360724801 0 0
138 0.105678694194695 0 0
139 0.104756017092462 0 0
140 0.103825430274706 0 0
141 0.102939456306441 0 0
142 0.102001186921616 0 0
143 0.100737446991222 0 0
144 0.0991453606719906 0 0
145 0.0971498679860747 0 0
146 0.0948117209915638 0 0
147 0.0924075366042346 0 0
148 0.0899484551808979 0 0
149 0.0873520434504222 0 0
150 0.0848497958878303 0 0
151 0.0823900490277647 0 0
152 0.0799786063537234 0 0
153 0.0776610830064481 0 0
154 0.0752837851752474 0 0
155 0.0729604964467151 0 0
156 0.0707262742573907 0 0
157 0.0684046065784823 0 0
158 0.0660274200992436 0 0
159 0.0636252573638505 0 0
160 0.0612270512870042 0 0
161 0.0587905905539405 0 0
162 0.0563195707029216 0 0
163 0.0538582650571118 0 0
164 0.0514203967394221 0 0
165 0.0490721477077881 0 0
166 0.0468328465329872 0 0
167 0.044723244642693 0 0
168 0.0427398639178554 0 0
169 0.0408841538190041 0 0
170 0.0391762093418711 0 0
171 0.0375882143782858 0 0
172 0.0361234008364646 0 0
173 0.0347811387811729 0 0
174 0.0335210387242261 0 0
175 0.0323747022105674 0 0
176 0.0312594345687719 0 0
177 0.030174948252246 0 0
178 0.0291339080526091 0 0
179 0.0281312995576928 0 0
180 0.027138393963344 0 0
181 0.0260756668210364 0 0
182 0.0250906058668046 0 0
183 0.0240551778532538 0 0
184 0.0230712653382013 0 0
185 0.0221310389230639 0 0
186 0.0211757703478467 0 0
187 0.0202209094313405 0 0
188 0.0192572613107586 0 0
189 0.0182920464007378 0 0
190 0.0172950661682144 0 0
191 0.0163207919630062 0 0
192 0.0153269728531649 0 0
193 0.0143853788804443 0 0
194 0.0135213976548868 0 0
195 0.0127456574145877 0 0
196 0.0120278700767597 0 0
197 +NAN 0 0
198 +NAN 0 0
199 +NAN 0 0
200 +NAN 0 0
201 +NAN 0 0
202 +NAN 0 0
203 +NAN 0 0
204 +NAN 0 0
205 +NAN 0 0
206 +NAN 0 0
207 +NAN 0 0
208 +NAN 0 0
209 +NAN 0 0
210 +NAN 0 0
211 +NAN 0 0
212 +NAN 0 0
213 +NAN 0 0
214 +NAN 0 0
215 +NAN 0 0
216 +NAN 0 0
217 +NAN 0 0
218 +NAN 0 0
219 +NAN 0 0
220 +NAN 0 0
221 +NAN 0 0
222 +NAN 0 0
223 +NAN 0 0
224 +NAN 0 0
225 +NAN 0 0
226 +NAN 0 0
227 +NAN 0 0
228 +NAN 0 0
229 +NAN 0 0
230 +NAN 0 0
231 +NAN 0 0
232 +NAN 0 0
233 +NAN 0 0
234 +NAN 0 0
235 +NAN 0 0
236 +NAN 0 0
237 +NAN 0 0
238 +NAN 0 0
239 +NAN 0 0
240 +NAN 0 0
241 +NAN 0 0
242 +NAN 0 0
243 +NAN 0 0
244 +NAN 0 0
245 +NAN 0 0
246 +NAN 0 0
247 +NAN 0 0
248 +NAN 0 0
249 +NAN 0 0
250 +NAN 0 0
251 +NAN 0 0
252 +NAN 0 0
253 +NAN 0 0
254 +NAN 0 0
255 +NAN 0 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = DLAB_2018-05-24_13-29-21_895_177
IDDevice = SAM_859F
IDDataType = SPECTRUM
IDDataTypeSub1 = CAL
IDDataTypeSub2 = Aqua
IDDataTypeSub3 =
DateTime = 2018-05-24 13:29:21
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType =
MethodName =
Mission = No Mission
MissionSub = 1
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack = DLAB_2018-05-04_11-56-28_529_586
IDDataCal =
IntegrationTime = 64
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit3 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 5 0 0
1 +NAN 0 0
2 +NAN 0 0
3 +NAN 0 0
4 +NAN 0 0
5 0.308009257704273 0 0
6 0.348985396550329 0 0
7 0.39611199753429 0 0
8 0.43986968240828 0 0
9 0.477232425339663 0 0
10 0.536318311921194 0 0
11 0.599255756896796 0 0
12 0.660195405447511 0 0
13 0.721940911560072 0 0
14 0.778381764258939 0 0
15 0.806518994572799 0 0
16 0.812862184246214 0 0
17 0.800779958731845 0 0
18 0.768238986615194 0 0
19 0.729324871828135 0 0
20 0.701235591002145 0 0
21 0.674572715683613 0 0
22 0.663056816542841 0 0
23 0.662699926877705 0 0
24 0.669382520005193 0 0
25 0.684772623825422 0 0
26 0.710275115045633 0 0
27 0.74145572495904 0 0
28 0.783988164111933 0 0
29 0.834525694448954 0 0
30 0.886966821712609 0 0
31 0.949247521262016 0 0
32 1.01565043430167 0 0
33 1.07897249264832 0 0
34 1.14377888540009 0 0
35 1.19997013476615 0 0
36 1.24429313837597 0 0
37 1.2763795229717 0 0
38 1.29391228294411 0 0
39 1.29587029284695 0 0
40 1.29012478792631 0 0
41 1.27276079346714 0 0
42 1.2450982196578 0 0
43 1.21375364521069 0 0
44 1.17906121512383 0 0
45 1.14422362714978 0 0
46 1.11315509839511 0 0
47 1.08731507394343 0 0
48 1.06746197368796 0 0
49 1.05494171300318 0 0
50 1.04869254224893 0 0
51 1.04747349722362 0 0
52 1.04822757370139 0 0
53 1.04856210675178 0 0
54 1.04679141002185 0 0
55 1.04513065036628 0 0
56 1.04725995618916 0 0
57 1.0535067386541 0 0
58 1.06471361999517 0 0
59 1.08034380002613 0 0
60 1.10113009018595 0 0
61 1.12455239246124 0 0
62 1.15132895471663 0 0
63 1.1795169782144 0 0
64 1.20798673857183 0 0
65 1.23708055274173 0 0
66 1.26532262623006 0 0
67 1.29064822236823 0 0
68 1.31210337451311 0 0
69 1.32736540301797 0 0
70 1.33430139824988 0 0
71 1.33335932325033 0 0
72 1.32335113190924 0 0
73 1.30558590461423 0 0
74 1.28227321775146 0 0
75 1.25498704776805 0 0
76 1.22525023251367 0 0
77 1.19392661641762 0 0
78 1.16317225749886 0 0
79 1.13207700011805 0 0
80 1.10111674556499 0 0
81 1.07075040366943 0 0
82 1.03893893539784 0 0
83 1.0081446443131 0 0
84 0.97774721715577 0 0
85 0.947774052897518 0 0
86 0.919152947182789 0 0
87 0.894963764571428 0 0
88 0.87836395884067 0 0
89 0.867156996532193 0 0
90 0.858153034494107 0 0
91 0.851906778357719 0 0
92 0.847981268808314 0 0
93 0.844919850173329 0 0
94 0.841944554421527 0 0
95 0.83721825473176 0 0
96 0.828398944802337 0 0
97 0.815351600734525 0 0
98 0.799543228463232 0 0
99 0.782489183888857 0 0
100 0.765962841341892 0 0
101 0.751320667184625 0 0
102 0.737812095757199 0 0
103 0.725090001717255 0 0
104 0.712873061263532 0 0
105 0.698758948036327 0 0
106 0.683766639638848 0 0
107 0.672493396285743 0 0
108 0.664610527729123 0 0
109 0.658092136872804 0 0
110 0.652228157780532 0 0
111 0.645754399378545 0 0
112 0.639368207275896 0 0
113 0.633138158063289 0 0
114 0.628392493836991 0 0
115 0.626088937445665 0 0
116 0.625599854321674 0 0
117 0.627001238574581 0 0
118 0.630202545823175 0 0
119 0.632703647598273 0 0
120 0.633210363154327 0 0
121 0.63123164301687 0 0
122 0.626485370072314 0 0
123 0.618891745640103 0 0
124 0.609361448964366 0 0
125 0.598872648152344 0 0
126 0.58927447780469 0 0
127 0.580815044730471 0 0
128 0.573341941514821 0 0
129 0.567484926926375 0 0
130 0.562800136636572 0 0
131 0.558223116403165 0 0
132 0.553158922485434 0 0
133 0.547084299354418 0 0
134 0.539847820827437 0 0
135 0.531432360197925 0 0
136 0.521203701656628 0 0
137 0.509855867118928 0 0
138 0.498554054755033 0 0
139 0.487573187562371 0 0
140 0.476425489189536 0 0
141 0.466415695619565 0 0
142 0.456641365086098 0 0
143 0.446540473657011 0 0
144 0.436135290849149 0 0
145 0.424928637592468 0 0
146 0.412541586513936 0 0
147 0.399056656796071 0 0
148 0.384717912438278 0 0
149 0.369579305401316 0 0
150 0.353784632326527 0 0
151 0.337380068381195 0 0
152 0.321095903578543 0 0
153 0.305495669126019 0 0
154 0.290421643260465 0 0
155 0.276140762920409 0 0
156 0.262854333224098 0 0
157 0.250936131068681 0 0
158 0.240006392992584 0 0
159 0.229965608856624 0 0
160 0.220954309792884 0 0
161 0.212487857424938 0 0
162 0.204661532835082 0 0
163 0.197216204057537 0 0
164 0.189605277840326 0 0
165 0.182475141050851 0 0
166 0.175121099828465 0 0
167 0.167843462384963 0 0
168 0.160673785509465 0 0
169 0.153434661065448 0 0
170 0.146286002352245 0 0
171 0.139523451810534 0 0
172 0.133107862589632 0 0
173 0.126994143420237 0 0
174 0.121367561058691 0 0
175 0.116037239577153 0 0
176 0.111252442566666 0 0
177 0.106669531239736 0 0
178 0.102319284531729 0 0
179 0.098450973344807 0 0
180 0.0947593486764351 0 0
181 0.0911919684356708 0 0
182 0.0879361030612687 0 0
183 0.0844573547823388 0 0
184 0.0813058869947144 0 0
185 0.0782782092672921 0 0
186 0.0751117681314502 0 0
187 0.0722888539254525 0 0
188 0.0693076153913147 0 0
189 0.0660732713239472 0 0
190 0.0627758734115707 0 0
191 0.0592551057473219 0 0
192 0.0560010918166818 0 0
193 0.0532135140872552 0 0
194 0.0505779890461858 0 0
195 0.0480767985810033 0 0
196 +NAN 0 0
197 +NAN 0 0
198 +NAN 0 0
199 +NAN 0 0
200 +NAN 0 0
201 +NAN 0 0
202 +NAN 0 0
203 +NAN 0 0
204 +NAN 0 0
205 +NAN 0 0
206 +NAN 0 0
207 +NAN 0 0
208 +NAN 0 0
209 +NAN 0 0
210 +NAN 0 0
211 +NAN 0 0
212 +NAN 0 0
213 +NAN 0 0
214 +NAN 0 0
215 +NAN 0 0
216 +NAN 0 0
217 +NAN 0 0
218 +NAN 0 0
219 +NAN 0 0
220 +NAN 0 0
221 +NAN 0 0
222 +NAN 0 0
223 +NAN 0 0
224 +NAN 0 0
225 +NAN 0 0
226 +NAN 0 0
227 +NAN 0 0
228 +NAN 0 0
229 +NAN 0 0
230 +NAN 0 0
231 +NAN 0 0
232 +NAN 0 0
233 +NAN 0 0
234 +NAN 0 0
235 +NAN 0 0
236 +NAN 0 0
237 +NAN 0 0
238 +NAN 0 0
239 +NAN 0 0
240 +NAN 0 0
241 +NAN 0 0
242 +NAN 0 0
243 +NAN 0 0
244 +NAN 0 0
245 +NAN 0 0
246 +NAN 0 0
247 +NAN 0 0
248 +NAN 0 0
249 +NAN 0 0
250 +NAN 0 0
251 +NAN 0 0
252 +NAN 0 0
253 +NAN 0 0
254 +NAN 0 0
255 +NAN 0 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = DLAB_2018-06-13_11-58-21_312_112
IDDevice = SAM_85B5
IDDataType = SPECTRUM
IDDataTypeSub1 = CAL
IDDataTypeSub2 = Aqua
IDDataTypeSub3 =
DateTime = 2018-06-13 11:58:21
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType =
MethodName =
Mission = No Mission
MissionSub = 1
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack = DLAB_2018-06-11_15-23-57_730_586
IDDataCal =
IntegrationTime = 64
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit3 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 5 0 0
1 +NAN 0 0
2 +NAN 0 0
3 +NAN 0 0
4 0.213368170535889 0 0
5 0.269708461889978 0 0
6 0.323681305990691 0 0
7 0.361686162925288 0 0
8 0.399727885563257 0 0
9 0.426595980991839 0 0
10 0.455395402116462 0 0
11 0.489873358069589 0 0
12 0.521706723967902 0 0
13 0.569424753191682 0 0
14 0.613678281579101 0 0
15 0.668568867138568 0 0
16 0.729648774358889 0 0
17 0.791588424733509 0 0
18 0.846278067578305 0 0
19 0.889326585618736 0 0
20 0.912464300651466 0 0
21 0.912041091772509 0 0
22 0.896201537846271 0 0
23 0.875528861051999 0 0
24 0.850358796139941 0 0
25 0.830813460904554 0 0
26 0.816907084374381 0 0
27 0.809230927534884 0 0
28 0.809079793968319 0 0
29 0.815347896421343 0 0
30 0.825892411944005 0 0
31 0.84503183706585 0 0
32 0.873670658313288 0 0
33 0.907826486501149 0 0
34 0.950360287322641 0 0
35 1.00114116281862 0 0
36 1.05504053595122 0 0
37 1.11205216981838 0 0
38 1.17221784963607 0 0
39 1.22975299376536 0 0
40 1.2826684244193 0 0
41 1.32878263374036 0 0
42 1.35908629098684 0 0
43 1.37850707003827 0 0
44 1.38104038663283 0 0
45 1.36883708486346 0 0
46 1.34742818899357 0 0
47 1.31902470629713 0 0
48 1.28498732451399 0 0
49 1.25220172471482 0 0
50 1.22068349763187 0 0
51 1.1925789464318 0 0
52 1.16935370804616 0 0
53 1.14646179324841 0 0
54 1.12109994325093 0 0
55 1.09422415317439 0 0
56 1.06828767805555 0 0
57 1.04445396328421 0 0
58 1.02753751191562 0 0
59 1.01678817181089 0 0
60 1.01144651696064 0 0
61 1.01173798764201 0 0
62 1.0164772818471 0 0
63 1.02628160092791 0 0
64 1.04098599390468 0 0
65 1.05940120890642 0 0
66 1.08286747681355 0 0
67 1.10823034660724 0 0
68 1.13310605067389 0 0
69 1.1547273364889 0 0
70 1.17166412724341 0 0
71 1.183983471337 0 0
72 1.19136561427902 0 0
73 1.19606418873222 0 0
74 1.19672161290192 0 0
75 1.19671286046196 0 0
76 1.19421014531398 0 0
77 1.18916801665381 0 0
78 1.18305692745573 0 0
79 1.17490571141989 0 0
80 1.16334076115534 0 0
81 1.14948755782896 0 0
82 1.13252619591223 0 0
83 1.11230773028189 0 0
84 1.09067725991727 0 0
85 1.06664792919033 0 0
86 1.03995448729021 0 0
87 1.01197155529512 0 0
88 0.982502268789757 0 0
89 0.950934147643801 0 0
90 0.921876981717461 0 0
91 0.899503833526815 0 0
92 0.884246887000271 0 0
93 0.871798641947689 0 0
94 0.860748919530635 0 0
95 0.851106201938694 0 0
96 0.841814387319495 0 0
97 0.830400473286421 0 0
98 0.814782119978127 0 0
99 0.796371468702983 0 0
100 0.774800085650998 0 0
101 0.751694156127581 0 0
102 0.729723545880894 0 0
103 0.70902256138046 0 0
104 0.69215621992056 0 0
105 0.678393548274155 0 0
106 0.667293944696908 0 0
107 0.65649797079901 0 0
108 0.6446860376968 0 0
109 0.629464240966416 0 0
110 0.615183928901848 0 0
111 0.602591773736883 0 0
112 0.590820336228123 0 0
113 0.580150915843665 0 0
114 0.571621329022329 0 0
115 0.563766808252911 0 0
116 0.556883367165026 0 0
117 0.549917569359012 0 0
118 0.542933812612894 0 0
119 0.535932724580549 0 0
120 0.528043359268253 0 0
121 0.520231538772767 0 0
122 0.513331529426342 0 0
123 0.507286194391832 0 0
124 0.502222099629004 0 0
125 0.498298138845332 0 0
126 0.496514280280116 0 0
127 0.495442722847893 0 0
128 0.494658216836534 0 0
129 0.494062920786886 0 0
130 0.492582820232232 0 0
131 0.490091285479962 0 0
132 0.485745623273317 0 0
133 0.480328740541132 0 0
134 0.473945880321646 0 0
135 0.466683779528739 0 0
136 0.458932848241851 0 0
137 0.451064706693729 0 0
138 0.443865689279125 0 0
139 0.437073402888952 0 0
140 0.430871678484112 0 0
141 0.424656716266769 0 0
142 0.418021794802865 0 0
143 0.410821018781503 0 0
144 0.402243888142941 0 0
145 0.392571430814996 0 0
146 0.381881477324506 0 0
147 0.36994612437875 0 0
148 0.35763078427341 0 0
149 0.344551257226534 0 0
150 0.332004497779552 0 0
151 0.319784344441634 0 0
152 0.307705241065949 0 0
153 0.296024637721301 0 0
154 0.285201831804588 0 0
155 0.27477331903475 0 0
156 0.2649271655017 0 0
157 0.255311286750044 0 0
158 0.245955888598912 0 0
159 0.237139128199368 0 0
160 0.228125758026999 0 0
161 0.218973368669899 0 0
162 0.210024147431339 0 0
163 0.201001563461602 0 0
164 0.192143502318544 0 0
165 0.183367668918973 0 0
166 0.17479218252589 0 0
167 0.166354193257315 0 0
168 0.158270839921817 0 0
169 0.15057933833141 0 0
170 0.14334907901495 0 0
171 0.136492914420144 0 0
172 0.130248971747009 0 0
173 0.124351585245978 0 0
174 0.119145124817533 0 0
175 0.114204124468303 0 0
176 0.10955932586493 0 0
177 0.105201972954921 0 0
178 0.100976345428583 0 0
179 0.0970301944120184 0 0
180 0.0930794320815323 0 0
181 0.0893096045786908 0 0
182 0.0855242301014967 0 0
183 0.0818515687486457 0 0
184 0.0783728272346642 0 0
185 0.0747373637294556 0 0
186 0.0714485344156491 0 0
187 0.0680790457826121 0 0
188 0.0647379875159452 0 0
189 0.0614749247480892 0 0
190 0.0581599202112611 0 0
191 0.0547153945113677 0 0
192 0.0515011739034831 0 0
193 0.0485390098580295 0 0
194 0.045947792932824 0 0
195 0.0435560478479539 0 0
196 0.0413612446534424 0 0
197 +NAN 0 0
198 +NAN 0 0
199 +NAN 0 0
200 +NAN 0 0
201 +NAN 0 0
202 +NAN 0 0
203 +NAN 0 0
204 +NAN 0 0
205 +NAN 0 0
206 +NAN 0 0
207 +NAN 0 0
208 +NAN 0 0
209 +NAN 0 0
210 +NAN 0 0
211 +NAN 0 0
212 +NAN 0 0
213 +NAN 0 0
214 +NAN 0 0
215 +NAN 0 0
216 +NAN 0 0
217 +NAN 0 0
218 +NAN 0 0
219 +NAN 0 0
220 +NAN 0 0
221 +NAN 0 0
222 +NAN 0 0
223 +NAN 0 0
224 +NAN 0 0
225 +NAN 0 0
226 +NAN 0 0
227 +NAN 0 0
228 +NAN 0 0
229 +NAN 0 0
230 +NAN 0 0
231 +NAN 0 0
232 +NAN 0 0
233 +NAN 0 0
234 +NAN 0 0
235 +NAN 0 0
236 +NAN 0 0
237 +NAN 0 0
238 +NAN 0 0
239 +NAN 0 0
240 +NAN 0 0
241 +NAN 0 0
242 +NAN 0 0
243 +NAN 0 0
244 +NAN 0 0
245 +NAN 0 0
246 +NAN 0 0
247 +NAN 0 0
248 +NAN 0 0
249 +NAN 0 0
250 +NAN 0 0
251 +NAN 0 0
252 +NAN 0 0
253 +NAN 0 0
254 +NAN 0 0
255 +NAN 0 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = AirDLAB_2016-12-07_12-00-24_364_510
IDDevice = SAM_852F
IDDataType = SPECTRUM
IDDataTypeSub1 = CAL
IDDataTypeSub2 = Air
IDDataTypeSub3 =
DateTime = 2016-12-07 11:59:26
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType =
MethodName =
Mission = No Mission
MissionSub = 1
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack = DLAB_2016-11-29_14-47-59_729_812
IDDataCal =
IntegrationTime = 128
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $04 $09 1/Intensity (m^2 nm)/mW
Unit3 = $04 $09 1/Intensity (m^2 nm)/mW
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 6 0 0
1 +NAN 0 0
2 +NAN 0 0
3 +NAN 0 0
4 +NAN 0 0
5 0.099081925071204 0 0
6 0.107353085872454 0 0
7 0.113070264290883 0 0
8 0.114376499819276 0 0
9 0.116544285861757 0 0
10 0.1185169696214 0 0
11 0.121561138979849 0 0
12 0.126964155564462 0 0
13 0.134364254054539 0 0
14 0.144053858633949 0 0
15 0.154882735476408 0 0
16 0.16719673162462 0 0
17 0.181437615712041 0 0
18 0.194237970806716 0 0
19 0.20386154720656 0 0
20 0.211556336359081 0 0
21 0.211417859085921 0 0
22 0.208790218500257 0 0
23 0.20437467341685 0 0
24 0.198246352046376 0 0
25 0.192966396099738 0 0
26 0.18897229193584 0 0
27 0.186243043953596 0 0
28 0.18578727224224 0 0
29 0.187114583931684 0 0
30 0.189090911319999 0 0
31 0.193600418301244 0 0
32 0.200054490546523 0 0
33 0.208072057884887 0 0
34 0.218285958582262 0 0
35 0.230634876630779 0 0
36 0.243459214546046 0 0
37 0.257752719558026 0 0
38 0.272580246630834 0 0
39 0.286712281491418 0 0
40 0.300342726342385 0 0
41 0.312249154496702 0 0
42 0.321331680226083 0 0
43 0.327112591435919 0 0
44 0.329469692698771 0 0
45 0.327542874308678 0 0
46 0.322985767437387 0 0
47 0.316224456423823 0 0
48 0.308782990589082 0 0
49 0.301183418606427 0 0
50 0.293575702556702 0 0
51 0.286696408065096 0 0
52 0.280798842600295 0 0
53 0.275808444038661 0 0
54 0.271299340181449 0 0
55 0.266225534078626 0 0
56 0.260785177597799 0 0
57 0.255342424416527 0 0
58 0.250947812402455 0 0
59 0.24777514930692 0 0
60 0.246247860756574 0 0
61 0.246092032695547 0 0
62 0.247219177075727 0 0
63 0.249675195006791 0 0
64 0.253195744885965 0 0
65 0.257788026175471 0 0
66 0.26369589320837 0 0
67 0.270555680751329 0 0
68 0.277823002163503 0 0
69 0.284937579021833 0 0
70 0.291097253127256 0 0
71 0.296043211270752 0 0
72 0.299540235735164 0 0
73 0.301795150475552 0 0
74 0.303069111244916 0 0
75 0.30355995799167 0 0
76 0.303606664702465 0 0
77 0.303007474849756 0 0
78 0.302001653949665 0 0
79 0.300361927400822 0 0
80 0.297986890885497 0 0
81 0.295325565249305 0 0
82 0.291656567474701 0 0
83 0.287335862742648 0 0
84 0.282306131698578 0 0
85 0.276702242286357 0 0
86 0.270280607979823 0 0
87 0.263050805729498 0 0
88 0.255009286552014 0 0
89 0.247098798503932 0 0
90 0.2398191835424 0 0
91 0.23466817932016 0 0
92 0.230585310303585 0 0
93 0.227279061892254 0 0
94 0.224693206022759 0 0
95 0.222993136629962 0 0
96 0.221791418806722 0 0
97 0.220695274517678 0 0
98 0.219442816624831 0 0
99 0.217000405185694 0 0
100 0.213283732282521 0 0
101 0.208384750595562 0 0
102 0.202985389753009 0 0
103 0.197924660371165 0 0
104 0.193409646692029 0 0
105 0.189628652821804 0 0
106 0.186318519164064 0 0
107 0.183315563032657 0 0
108 0.180098687261504 0 0
109 0.176492614557115 0 0
110 0.172650422408531 0 0
111 0.168979191040057 0 0
112 0.166106531649937 0 0
113 0.163622827054655 0 0
114 0.161570328667133 0 0
115 0.159693607722301 0 0
116 0.157690305409947 0 0
117 0.15544650006387 0 0
118 0.153185383511044 0 0
119 0.150954772341381 0 0
120 0.148960802743881 0 0
121 0.147350785081686 0 0
122 0.146182367433256 0 0
123 0.145312879880878 0 0
124 0.144781245193999 0 0
125 0.14473607505965 0 0
126 0.144976432177203 0 0
127 0.145464936657928 0 0
128 0.145889790468872 0 0
129 0.146174517595681 0 0
130 0.14615421098877 0 0
131 0.145743119998859 0 0
132 0.144922809795091 0 0
133 0.143805231938307 0 0
134 0.142492952453543 0 0
135 0.141053445832183 0 0
136 0.139720571628269 0 0
137 0.138186469198598 0 0
138 0.136919534961634 0 0
139 0.135732624874463 0 0
140 0.134597268963386 0 0
141 0.133432724955799 0 0
142 0.13211501546202 0 0
143 0.130478475600008 0 0
144 0.128290801143951 0 0
145 0.125726707508103 0 0
146 0.122634784100445 0 0
147 0.119472073398083 0 0
148 0.116199128230447 0 0
149 0.112813911251756 0 0
150 0.109547291781198 0 0
151 0.106268392530964 0 0
152 0.10313443150471 0 0
153 0.100113578226984 0 0
154 0.097073834113113 0 0
155 0.0941199411272616 0 0
156 0.0911853891891621 0 0
157 0.0882319764053268 0 0
158 0.085267274530049 0 0
159 0.0822333903307463 0 0
160 0.0792187073154596 0 0
161 0.0760907077820793 0 0
162 0.0728848234132589 0 0
163 0.0697048920692252 0 0
164 0.0665600438164166 0 0
165 0.0635411651500916 0 0
166 0.0606319242880778 0 0
167 0.0578670530064308 0 0
168 0.0553155735461356 0 0
169 0.0529193006810867 0 0
170 0.050722718025932 0 0
171 0.0486788470977319 0 0
172 0.0467747209472673 0 0
173 0.0450423813898501 0 0
174 0.0434307741189043 0 0
175 0.041915712424757 0 0
176 0.0405250313895705 0 0
177 0.0390895391040532 0 0
178 0.0377897158697839 0 0
179 0.0365016922380464 0 0
180 0.0351788001916396 0 0
181 0.0338645937424847 0 0
182 0.0325302009051183 0 0
183 0.0312848146149282 0 0
184 0.0300375958148976 0 0
185 0.0288302935207691 0 0
186 0.027652203865544 0 0
187 0.0264621566936286 0 0
188 0.0252688692008588 0 0
189 0.0241226625595337 0 0
190 0.0229255436965288 0 0
191 0.0217207281738409 0 0
192 0.0205701146867025 0 0
193 0.0193892949195812 0 0
194 0.0183936626191952 0 0
195 0.017494647116465 0 0
196 0.0167605279940225 0 0
197 +NAN 0 0
198 +NAN 0 0
199 +NAN 0 0
200 +NAN 0 0
201 +NAN 0 0
202 +NAN 0 0
203 +NAN 0 0
204 +NAN 0 0
205 +NAN 0 0
206 +NAN 0 0
207 +NAN 0 0
208 +NAN 0 0
209 +NAN 0 0
210 +NAN 0 0
211 +NAN 0 0
212 +NAN 0 0
213 +NAN 0 0
214 +NAN 0 0
215 +NAN 0 0
216 +NAN 0 0
217 +NAN 0 0
218 +NAN 0 0
219 +NAN 0 0
220 +NAN 0 0
221 +NAN 0 0
222 +NAN 0 0
223 +NAN 0 0
224 +NAN 0 0
225 +NAN 0 0
226 +NAN 0 0
227 +NAN 0 0
228 +NAN 0 0
229 +NAN 0 0
230 +NAN 0 0
231 +NAN 0 0
232 +NAN 0 0
233 +NAN 0 0
234 +NAN 0 0
235 +NAN 0 0
236 +NAN 0 0
237 +NAN 0 0
238 +NAN 0 0
239 +NAN 0 0
240 +NAN 0 0
241 +NAN 0 0
242 +NAN 0 0
243 +NAN 0 0
244 +NAN 0 0
245 +NAN 0 0
246 +NAN 0 0
247 +NAN 0 0
248 +NAN 0 0
249 +NAN 0 0
250 +NAN 0 0
251 +NAN 0 0
252 +NAN 0 0
253 +NAN 0 0
254 +NAN 0 0
255 +NAN 0 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = DLAB_2018-05-24_13-29-20_305_176
IDDevice = SAM_859F
IDDataType = SPECTRUM
IDDataTypeSub1 = CAL
IDDataTypeSub2 = Air
IDDataTypeSub3 =
DateTime = 2018-05-24 13:28:25
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType =
MethodName =
Mission = No Mission
MissionSub = 1
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack = DLAB_2018-05-04_11-56-28_529_586
IDDataCal =
IntegrationTime = 64
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit3 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 5 0 0
1 +NAN 0 0
2 +NAN 0 0
3 +NAN 0 0
4 +NAN 0 0
5 0.549282530081406 0 0
6 0.621825635483575 0 0
7 0.705214779700439 0 0
8 0.782494923890489 0 0
9 0.848306874043027 0 0
10 0.952625287085828 0 0
11 1.06364941208026 0 0
12 1.17099618224932 0 0
13 1.27964867192574 0 0
14 1.37878597375063 0 0
15 1.42771820575638 0 0
16 1.4380590385421 0 0
17 1.41583530083466 0 0
18 1.35751030831315 0 0
19 1.28801896577964 0 0
20 1.23773169248486 0 0
21 1.19003370359023 0 0
22 1.16911032524399 0 0
23 1.16789019991587 0 0
24 1.17908641221467 0 0
25 1.20561721452238 0 0
26 1.24993325867368 0 0
27 1.3042108426727 0 0
28 1.37841324495146 0 0
29 1.46663415660191 0 0
30 1.55813913029349 0 0
31 1.66686169700722 0 0
32 1.78274771118438 0 0
33 1.89315285694338 0 0
34 2.00609300108623 0 0
35 2.10386062632617 0 0
36 2.18077321675475 0 0
37 2.23620955735442 0 0
38 2.266135432154 0 0
39 2.26878990322214 0 0
40 2.25797663538301 0 0
41 2.22685859649013 0 0
42 2.17776313289299 0 0
43 2.1222752364519 0 0
44 2.06098344374156 0 0
45 1.99948809108821 0 0
46 1.94462577242816 0 0
47 1.8989381397134 0 0
48 1.8637403074385 0 0
49 1.84137175128878 0 0
50 1.82996842025894 0 0
51 1.82735603324287 0 0
52 1.82819560800875 0 0
53 1.82831225824908 0 0
54 1.82476779554239 0 0
55 1.82142520789599 0 0
56 1.82469614734563 0 0
57 1.83514598035505 0 0
58 1.85423698694933 0 0
59 1.88102853388183 0 0
60 1.91679111910883 0 0
61 1.95713305118927 0 0
62 2.0033013266641 0 0
63 2.05191276620812 0 0
64 2.10100127704333 0 0
65 2.15116215495783 0 0
66 2.19982933350689 0 0
67 2.24341508467426 0 0
68 2.28026480621138 0 0
69 2.30634686430023 0 0
70 2.31796219508283 0 0
71 2.31589695847203 0 0
72 2.29809543158409 0 0
73 2.2668387918562 0 0
74 2.22596956700897 0 0
75 2.17822422289454 0 0
76 2.1262484698939 0 0
77 2.07154274835781 0 0
78 2.01784816285075 0 0
79 1.9635850159156 0 0
80 1.90957838150673 0 0
81 1.85662335754133 0 0
82 1.80118393109592 0 0
83 1.74752896056537 0 0
84 1.69458207285898 0 0
85 1.64238998731142 0 0
86 1.59255947952261 0 0
87 1.55042463825823 0 0
88 1.52145095482736 0 0
89 1.50182839545807 0 0
90 1.48602912306116 0 0
91 1.47501182897849 0 0
92 1.46801797625318 0 0
93 1.46252443118698 0 0
94 1.4571840542778 0 0
95 1.44881752975571 0 0
96 1.433373570625 0 0
97 1.4106211402034 0 0
98 1.38310053980989 0 0
99 1.35343439202405 0 0
100 1.32469024445085 0 0
101 1.29921323938482 0 0
102 1.2757042981125 0 0
103 1.25356245928469 0 0
104 1.23230080447944 0 0
105 1.20776661327865 0 0
106 1.18172190161938 0 0
107 1.16211138784545 0 0
108 1.14836490545677 0 0
109 1.13698033747357 0 0
110 1.12673020620722 0 0
111 1.115430409999 0 0
112 1.10428562795353 0 0
113 1.0934141739792 0 0
114 1.0851095103506 0 0
115 1.08102444265095 0 0
116 1.08007408967758 0 0
117 1.08238869164072 0 0
118 1.08781099449618 0 0
119 1.09202496629142 0 0
120 1.09279743926351 0 0
121 1.08928198225434 0 0
122 1.08099296127192 0 0
123 1.06779395728469 0 0
124 1.05125732218958 0 0
125 1.03307124483462 0 0
126 1.01642561672595 0 0
127 1.0017478853335 0 0
128 0.98877464388953 0 0
129 0.978591382441999 0 0
130 0.970432000434175 0 0
131 0.962460675619692 0 0
132 0.953651636148435 0 0
133 0.943103023421902 0 0
134 0.930554197290447 0 0
135 0.915976069829803 0 0
136 0.89827602173614 0 0
137 0.878650755188226 0 0
138 0.859108524352699 0 0
139 0.840122962860222 0 0
140 0.820853477964574 0 0
141 0.803547895709764 0 0
142 0.786651104537257 0 0
143 0.769194844035412 0 0
144 0.751217544779413 0 0
145 0.731862968408631 0 0
146 0.710478767970412 0 0
147 0.687207420135085 0 0
148 0.662469528888512 0 0
149 0.636358233772055 0 0
150 0.609121332586544 0 0
151 0.580838486227566 0 0
152 0.552767035926316 0 0
153 0.525876935395925 0 0
154 0.499896413074609 0 0
155 0.475284681533185 0 0
156 0.452387885405863 0 0
157 0.431848904268036 0 0
158 0.413013739466993 0 0
159 0.395710805209202 0 0
160 0.380181587532903 0 0
161 0.365591896979342 0 0
162 0.352105459639395 0 0
163 0.339276260510366 0 0
164 0.32616389487977 0 0
165 0.313880254968568 0 0
166 0.301213081346406 0 0
167 0.28867892621412 0 0
168 0.276332017077307 0 0
169 0.263867205519659 0 0
170 0.251559483539307 0 0
171 0.239917175566115 0 0
172 0.228872841726392 0 0
173 0.218348838385983 0 0
174 0.208663588155861 0 0
175 0.199488791575245 0 0
176 0.191252859631973 0 0
177 0.183364916996847 0 0
178 0.175877803627425 0 0
179 0.169219899131997 0 0
180 0.162866423884395 0 0
181 0.156727192611269 0 0
182 0.151124000714184 0 0
183 0.145138407523578 0 0
184 0.13971586046093 0 0
185 0.134506608902369 0 0
186 0.129059486722317 0 0
187 0.124203168251957 0 0
188 0.119075347065844 0 0
189 0.113513221481262 0 0
190 0.107843336832916 0 0
191 0.101790305051534 0 0
192 0.0961960826886135 0 0
193 0.0914035900672732 0 0
194 0.0868727278958915 0 0
195 0.082573024301116 0 0
196 +NAN 0 0
197 +NAN 0 0
198 +NAN 0 0
199 +NAN 0 0
200 +NAN 0 0
201 +NAN 0 0
202 +NAN 0 0
203 +NAN 0 0
204 +NAN 0 0
205 +NAN 0 0
206 +NAN 0 0
207 +NAN 0 0
208 +NAN 0 0
209 +NAN 0 0
210 +NAN 0 0
211 +NAN 0 0
212 +NAN 0 0
213 +NAN 0 0
214 +NAN 0 0
215 +NAN 0 0
216 +NAN 0 0
217 +NAN 0 0
218 +NAN 0 0
219 +NAN 0 0
220 +NAN 0 0
221 +NAN 0 0
222 +NAN 0 0
223 +NAN 0 0
224 +NAN 0 0
225 +NAN 0 0
226 +NAN 0 0
227 +NAN 0 0
228 +NAN 0 0
229 +NAN 0 0
230 +NAN 0 0
231 +NAN 0 0
232 +NAN 0 0
233 +NAN 0 0
234 +NAN 0 0
235 +NAN 0 0
236 +NAN 0 0
237 +NAN 0 0
238 +NAN 0 0
239 +NAN 0 0
240 +NAN 0 0
241 +NAN 0 0
242 +NAN 0 0
243 +NAN 0 0
244 +NAN 0 0
245 +NAN 0 0
246 +NAN 0 0
247 +NAN 0 0
248 +NAN 0 0
249 +NAN 0 0
250 +NAN 0 0
251 +NAN 0 0
252 +NAN 0 0
253 +NAN 0 0
254 +NAN 0 0
255 +NAN 0 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,297 @@
[Spectrum]
Version = 1
IDData = DLAB_2018-06-13_11-56-08_604_111
IDDevice = SAM_85B5
IDDataType = SPECTRUM
IDDataTypeSub1 = CAL
IDDataTypeSub2 = Air
IDDataTypeSub3 =
DateTime = 2018-06-13 11:54:51
PositionLatitude = 0
PositionLongitude = 0
Comment =
CommentSub1 =
CommentSub2 =
CommentSub3 =
IDMethodType =
MethodName =
Mission = No Mission
MissionSub = 1
RecordType = 0
[Attributes]
CalFactor = 1
IDBasisSpec =
IDDataBack = DLAB_2018-06-11_15-23-57_730_586
IDDataCal =
IntegrationTime = 64
P31 = -1
P31e = 0
PathLength = +INF
RAWDynamic = 65535
Temperature = +NAN
Unit1 = $05 $00 Pixel
Unit2 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit3 = $04 $04 1/Intensity (m^2 nm Sr)/mW
Unit4 = $f1 $00 Status
[END] of [Attributes]
[DATA]
0 5 0 0
1 +NAN 0 0
2 +NAN 0 0
3 +NAN 0 0
4 0.380824258865919 0 0
5 0.480956813156357 0 0
6 0.57671205380196 0 0
7 0.643896236957154 0 0
8 0.711054782209677 0 0
9 0.758265752350778 0 0
10 0.808854255795615 0 0
11 0.869466331079482 0 0
12 0.925321324749243 0 0
13 1.00927399148091 0 0
14 1.08699883630787 0 0
15 1.18347377446848 0 0
16 1.29079925777138 0 0
17 1.39953731633192 0 0
18 1.49536024576308 0 0
19 1.57053962346542 0 0
20 1.61051680455964 0 0
21 1.60891142181803 0 0
22 1.58014917632373 0 0
23 1.54292073894688 0 0
24 1.49782795775685 0 0
25 1.46270054563491 0 0
26 1.43754722159869 0 0
27 1.42339247548624 0 0
28 1.42249669690879 0 0
29 1.43289834559721 0 0
30 1.45081833970432 0 0
31 1.48383024473758 0 0
32 1.53350351710437 0 0
33 1.59283171118034 0 0
34 1.66682243068085 0 0
35 1.75523084376357 0 0
36 1.8490542829721 0 0
37 1.94827772413977 0 0
38 2.05297044933559 0 0
39 2.15300125225733 0 0
40 2.24489521732098 0 0
41 2.32484518002751 0 0
42 2.37710624055378 0 0
43 2.41032149129472 0 0
44 2.41401311078449 0 0
45 2.39196623346607 0 0
46 2.35386541795861 0 0
47 2.30358502851024 0 0
48 2.24350994611066 0 0
49 2.18566570348128 0 0
50 2.13007635400607 0 0
51 2.08048312730197 0 0
52 2.03943635277338 0 0
53 1.9990019487276 0 0
54 1.9542919602901 0 0
55 1.90697476815729 0 0
56 1.86132580586718 0 0
57 1.81936966943287 0 0
58 1.78948757961567 0 0
59 1.77036444175303 0 0
60 1.76067051308416 0 0
61 1.76079151769139 0 0
62 1.76865840458355 0 0
63 1.78533977613825 0 0
64 1.81054315659671 0 0
65 1.84219534093402 0 0
66 1.88262260694772 0 0
67 1.92633682221336 0 0
68 1.96919363361994 0 0
69 2.00638558730966 0 0
70 2.03543177536163 0 0
71 2.05645335730185 0 0
72 2.06889953924594 0 0
73 2.07668786673546 0 0
74 2.07746404954558 0 0
75 2.07708946852551 0 0
76 2.07239270419962 0 0
77 2.06329693588947 0 0
78 2.05235510505223 0 0
79 2.03788342455449 0 0
80 2.01750123705209 0 0
81 1.99316265318269 0 0
82 1.96344779927853 0 0
83 1.92810068074762 0 0
84 1.89032139564187 0 0
85 1.84840056738145 0 0
86 1.80188008685176 0 0
87 1.7531429855323 0 0
88 1.70184883503381 0 0
89 1.64693756964496 0 0
90 1.59639297188055 0 0
91 1.55743828612696 0 0
92 1.53081670223502 0 0
93 1.509066853406 0 0
94 1.48974595694359 0 0
95 1.47286758281018 0 0
96 1.45660325947575 0 0
97 1.43667408186819 0 0
98 1.40947906533906 0 0
99 1.37746325817173 0 0
100 1.3399910234164 0 0
101 1.29987620320872 0 0
102 1.26173586555032 0 0
103 1.22580130202006 0 0
104 1.19650560480134 0 0
105 1.17258287879559 0 0
106 1.15326969493003 0 0
107 1.13448708666807 0 0
108 1.11395465030131 0 0
109 1.08753684763482 0 0
110 1.06275254011917 0 0
111 1.0408908566722 0 0
112 1.02045255259373 0 0
113 1.00192289281247 0 0
114 0.987093337695555 0 0
115 0.973433543184599 0 0
116 0.961454156421677 0 0
117 0.949336048850277 0 0
118 0.937190359719721 0 0
119 0.925018119816345 0 0
120 0.911316167695048 0 0
121 0.897751565127677 0 0
122 0.885763756400802 0 0
123 0.875253674622747 0 0
124 0.866439225407856 0 0
125 0.859594015285511 0 0
126 0.856442344648432 0 0
127 0.854520610650332 0 0
128 0.853095084706978 0 0
129 0.851996897997662 0 0
130 0.849373999218705 0 0
131 0.845008414644852 0 0
132 0.837447706997702 0 0
133 0.828042280687475 0 0
134 0.816973957953628 0 0
135 0.804392597259629 0 0
136 0.790971383923797 0 0
137 0.777350907812577 0 0
138 0.764886212005326 0 0
139 0.753124860834896 0 0
140 0.74238339492221 0 0
141 0.731621293455726 0 0
142 0.720137856580817 0 0
143 0.707681887074656 0 0
144 0.692857487682284 0 0
145 0.676149155140644 0 0
146 0.657691286728854 0 0
147 0.637091724889135 0 0
148 0.615841105000382 0 0
149 0.593277961352052 0 0
150 0.571635565839856 0 0
151 0.550558744253774 0 0
152 0.529727893337181 0 0
153 0.50958610090654 0 0
154 0.490923786532866 0 0
155 0.472942835508178 0 0
156 0.455966760194577 0 0
157 0.439389399108222 0 0
158 0.42326262400571 0 0
159 0.408064966451864 0 0
160 0.392531100434587 0 0
161 0.376760145430696 0 0
162 0.361340837642809 0 0
163 0.345797349215964 0 0
164 0.330538900755072 0 0
165 0.315423852713651 0 0
166 0.300655326757946 0 0
167 0.286125136929255 0 0
168 0.27220666979537 0 0
169 0.258963801456755 0 0
170 0.246515726736969 0 0
171 0.23471243489257 0 0
172 0.223963260764627 0 0
173 0.213811227531161 0 0
174 0.204848303945938 0 0
175 0.196342813423038 0 0
176 0.188347519381911 0 0
177 0.180847277367304 0 0
178 0.173574321958823 0 0
179 0.166782572540461 0 0
180 0.159983659268987 0 0
181 0.153496471427164 0 0
182 0.146983276179518 0 0
183 0.140664487031456 0 0
184 0.134679615950644 0 0
185 0.128426075217298 0 0
186 0.122768803469292 0 0
187 0.116973531179931 0 0
188 0.111227699506044 0 0
189 0.10561644888568 0 0
190 0.0999165260100575 0 0
191 0.09399466356358 0 0
192 0.0884689961099718 0 0
193 0.0833768260697751 0 0
194 0.0789223013382674 0 0
195 0.0748108094846383 0 0
196 0.0710379549143775 0 0
197 +NAN 0 0
198 +NAN 0 0
199 +NAN 0 0
200 +NAN 0 0
201 +NAN 0 0
202 +NAN 0 0
203 +NAN 0 0
204 +NAN 0 0
205 +NAN 0 0
206 +NAN 0 0
207 +NAN 0 0
208 +NAN 0 0
209 +NAN 0 0
210 +NAN 0 0
211 +NAN 0 0
212 +NAN 0 0
213 +NAN 0 0
214 +NAN 0 0
215 +NAN 0 0
216 +NAN 0 0
217 +NAN 0 0
218 +NAN 0 0
219 +NAN 0 0
220 +NAN 0 0
221 +NAN 0 0
222 +NAN 0 0
223 +NAN 0 0
224 +NAN 0 0
225 +NAN 0 0
226 +NAN 0 0
227 +NAN 0 0
228 +NAN 0 0
229 +NAN 0 0
230 +NAN 0 0
231 +NAN 0 0
232 +NAN 0 0
233 +NAN 0 0
234 +NAN 0 0
235 +NAN 0 0
236 +NAN 0 0
237 +NAN 0 0
238 +NAN 0 0
239 +NAN 0 0
240 +NAN 0 0
241 +NAN 0 0
242 +NAN 0 0
243 +NAN 0 0
244 +NAN 0 0
245 +NAN 0 0
246 +NAN 0 0
247 +NAN 0 0
248 +NAN 0 0
249 +NAN 0 0
250 +NAN 0 0
251 +NAN 0 0
252 +NAN 0 0
253 +NAN 0 0
254 +NAN 0 0
255 +NAN 0 0
[END] of [DATA]
[END] of [Spectrum]

@ -0,0 +1,81 @@
[DEVICE]
Version = 0
IDDevice = SAMIP_50ED
IDDeviceType = SAMIP
IDDeviceTypeSub1 = ACC-2
IDDeviceTypeSub2 = VIS
IDDeviceTypeSub3 =
DateTime = 2018-06-19 12:08:40
Comment =
RecordType = 0
IDDeviceMaster =
[ATTRIBUTES]
IDDeviceSAM = SAM_859F
IDDeviceIP = IP_C121
[END] of [ATTRIBUTES]
[END] of [DEVICE]
[DEVICE]
Version = 0
IDDevice = IP_C121
IDDeviceType = IP
IDDeviceTypeSub1 =
IDDeviceTypeSub2 =
IDDeviceTypeSub3 =
DateTime = 2018-06-19 12:01:08
Comment =
RecordType = 0
IDDeviceMaster = SAMIP_50ED
[ATTRIBUTES]
Incl_Orientation = up
Incl_Xgain = 1.0
Incl_Xoffset = 125
Incl_Ygain = 0.9375
Incl_Yoffset = 126
Incl_KBG = 1.2073
Incl_Kref = 0.1275
Press_Current_mA = 1.08
Press_Surface_bar = 5.57
Press_Gain = 2.7
WithIncl = 1
WithPress = 1
Press_Sens_mV_bar_4mA = 71.36
Press_Sens_mV_bar_1mA = 17.84
Press_Type = PA-10/TAB/10bar
CalibrationDate = 08.06.2018
[END] of [ATTRIBUTES]
[END] of [DEVICE]
[DEVICE]
Version = 0
IDDevice = SAM_859F
IDDeviceType = SAM
IDDeviceTypeSub1 = ACC-2
IDDeviceTypeSub2 = VIS
IDDeviceTypeSub3 =
DateTime = 2018-05-30 12:14:10
Comment =
RecordType = 0
IDDeviceMaster = SAMIP_50ED
[ATTRIBUTES]
c0s = +3.019290000E+02
c1s = +3.345130000E+00
c2s = +2.651460000E-04
c3s = -1.753680000E-06
DarkPixelStart = 237
DarkPixelStop = 254
Reverse = 0
c4s = +0.000000000E+00
IDDataCal = DLAB_2019-08-28_14-44-55_098_198
IDDataBack = DLAB_2019-08-28_12-24-09_763_812
IDDataCalAQ = DLAB_2019-08-28_14-47-19_914_233
Firmware = 2.06
[END] of [ATTRIBUTES]
[END] of [DEVICE]

@ -0,0 +1,32 @@
[Device]
Version = 0
IDDevice = SAM_852F
IDDeviceType = SAM
IDDeviceTypeSub1 = ACC-2
IDDeviceTypeSub2 = VIS
IDDeviceTypeSub3 =
RecordType = 0
DateTime = 2016-12-07 12:03:12
IDDeviceMaster =
Comment =
[Attributes]
DarkPixelStart = 237
DarkPixelStop = 254
Firmware = 2.06
IDDataBack = DLAB_2016-11-29_14-47-59_729_812
IDDataCal = DLAB_2016-12-07_12-00-24_364_510
IDDataCalAQ = DLAB_2016-12-07_12-02-43_591_545
IntegrationTime = 0
Reverse = 0
SerialNo_MMS = 103307
WavelengthRange = 310..1100
c0s = 299.895
c1s = 3.31161
c2s = 0.00031652
c3s = -1.73194e-06
c4s = +0.000000000E+00
cs = 102842
[END] of [Attributes]
[END] of [Device]

@ -0,0 +1,30 @@
[Device]
Version = 0
IDDevice = SAM_859F
IDDeviceType = SAM
IDDeviceTypeSub1 = ARC
IDDeviceTypeSub2 = VIS
IDDeviceTypeSub3 =
RecordType = 0
DateTime = 2018-05-24 13:30:20
IDDeviceMaster =
Comment = ARC VIS
[Attributes]
DarkPixelStart = 237
DarkPixelStop = 254
Firmware = 2.06
IDDataBack = DLAB_2018-05-04_11-56-28_529_586
IDDataCal = DLAB_2018-05-24_13-29-20_305_176
IDDataCalAQ = DLAB_2018-05-24_13-29-21_895_177
IntegrationTime = 0
Reverse = 0
SerialNo_MMS =
c0s = 299.971
c1s = 3.32431
c2s = 0.000391882
c3s = -1.91435e-06
c4s = +0.000000000E+00
[END] of [Attributes]
[END] of [Device]

@ -0,0 +1,30 @@
[Device]
Version = 0
IDDevice = SAM_85B5
IDDeviceType = SAM
IDDeviceTypeSub1 = ARC
IDDeviceTypeSub2 = VIS
IDDeviceTypeSub3 =
RecordType = 0
DateTime = 2018-06-13 11:58:48
IDDeviceMaster =
Comment = ARC VIS
[Attributes]
DarkPixelStart = 237
DarkPixelStop = 254
Firmware = 2.06
IDDataBack = DLAB_2018-06-11_15-23-57_730_586
IDDataCal = DLAB_2018-06-13_11-56-08_604_111
IDDataCalAQ = DLAB_2018-06-13_11-58-21_312_112
IntegrationTime = 0
Reverse = 0
SerialNo_MMS =
c0s = 300.14
c1s = 3.3268
c2s = 0.000314225
c3s = -1.90331e-06
c4s = +0.000000000E+00
[END] of [Attributes]
[END] of [Device]

@ -0,0 +1,63 @@
;immersion factors for TriOS radiance
;wavelength(nm) factors
350 1.7743
360 1.7710
370 1.7681
380 1.7653
390 1.7628
400 1.7604
410 1.7583
420 1.7563
430 1.7544
440 1.7526
450 1.7510
460 1.7494
470 1.7480
480 1.7466
490 1.7454
500 1.7441
510 1.7430
520 1.7419
530 1.7409
540 1.7399
550 1.7390
560 1.7381
570 1.7372
580 1.7364
590 1.7356
600 1.7349
610 1.7342
620 1.7335
630 1.7328
640 1.7322
650 1.7316
660 1.7310
670 1.7305
680 1.7299
690 1.7294
700 1.7289
710 1.7284
720 1.7280
730 1.7275
740 1.7271
750 1.7267
760 1.7263
770 1.7259
780 1.7255
790 1.7251
800 1.7248
810 1.7244
820 1.7241
830 1.7238
840 1.7235
850 1.7232
860 1.7229
870 1.7226
880 1.7223
890 1.7220
900 1.7217
910 1.7215
920 1.7212
930 1.7210
940 1.7207
950 1.7205

@ -0,0 +1,4 @@
[SENSOR]
Lsky = 85B5
Esky = 50ED
Lwater = 852F

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

@ -0,0 +1,232 @@
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
class Configuration:
def __init__(self, ) -> None:
log.info(f"ConfigAWRAMS init: ", __name__, "", "")
self.device_type = None
self.configuration =None
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__, "setSystemCfgDict", "")
pass
def getCalConfiguration(self) -> None:
if self.device_type == None:
self.cal_configuration = None
if self.configuration == None:
self.cal_configuration =None
for k,v in self.configuration.items():
if v["SN"] == "" or v['FUNC']=="":
pass
else:
self.cal_configuration.update( {v["FUNC"]:{}} )
self.cal_configuration[v["FUNC"]].update( {"SN":v['SN']} )
self.cal_configuration[v["FUNC"]].update( {"FUNC":v['FUNC']} )
self.__init_configuration_basic()
self.__init_configuration_cal()
self.__init_configuration_IP_SAM()
pass
def __init_configuration_basic(self ) -> None:
for k in self.cal_configuration.keys():
sn = self.cal_configuration[k]["SN"]
if self.__isSamIniExisted(sn):
self.cal_configuration[k].update({ "TYPE" : "SAM" })
self.cal_configuration[k].update({ "samsn" : sn })
self.cal_configuration[k].update({ "inifile" : "SAM_"+sn+".ini" })
self.cal_configuration[k].update({ "calfile" : "Cal_SAM_"+sn+".dat" })
self.cal_configuration[k].update({ "calaqfile" : "CalAQ_SAM_"+sn+".dat" })
self.cal_configuration[k].update({ "backfile" : "Back_SAM_"+sn+".dat" })
if self.__isSamIPIniExisted(sn):
self.cal_configuration[k].update({ "TYPE" : "SAMIP" })
samsn = self.__getSAMSN(sn)
if samsn== None:
log.warning(f"Cannot get samsn from Sensor: {sn}", __name__, "", "" )
raise Exception(f"Cannot get samsn from Sensor: {sn}")
self.cal_configuration[k].update({ "samsn" : samsn })
self.cal_configuration[k].update({ "inifile" : "SAMIP_"+sn+"_ALL.ini" })
self.cal_configuration[k].update({ "calfile" : "Cal_SAM_"+samsn+".dat" })
self.cal_configuration[k].update({ "calaqfile" : "CalAQ_SAM_"+samsn+".dat" })
self.cal_configuration[k].update({ "backfile" : "Back_SAM_"+samsn+".dat" })
if not self.__isSamIniExisted(sn) and not self.__isSamIPIniExisted(sn):
log.warning(f"Cannot find ini file for Sensor: {sn}", __name__, "", "" )
raise Exception(f"Cannot find ini file for Sensor: {sn}")
pass
def __init_configuration_cal(self ) -> None:
# self.cfgtool = Config()
for k in self.cal_configuration.keys():
sn = self.cal_configuration[k]["SN"]
# Device File
calpath = CAL_DIR.joinpath(self.device_type, self.cal_configuration[k]["calfile"])
if calpath.exists( ):
res = ReadCal.read_columns_set_by_mark( calpath, FILE_MARK, 1 )
self.cal_configuration[k].update({ "cal" : res[1][0] })
calaqpath = CAL_DIR.joinpath(self.device_type, self.cal_configuration[k]["calaqfile"])
if calaqpath.exists( ):
res = ReadCal.read_columns_set_by_mark( calaqpath, FILE_MARK, 1 )
self.cal_configuration[k].update({ "calaq" : res[1][0] })
backpath = CAL_DIR.joinpath(self.device_type, self.cal_configuration[k]["backfile"])
if calaqpath.exists( ):
res = ReadCal.read_columns_set_by_mark( backpath, FILE_MARK, 1,2 )
self.cal_configuration[k].update({ "b0" : res[1][0] })
self.cal_configuration[k].update({ "b1" : res[1][1] })
pass
def __init_configuration_IP_SAM(self ) -> None:
# self.cfgtool = Config()
for j in self.cal_configuration.keys():
# log.debug(f"__init_configuration_IP_SAM {j}", __name__, "", "" )
inipath = CAL_DIR.joinpath(self.device_type, self.cal_configuration[j]["inifile"])
# log.debug(f"__init_configuration_IP_SAM {inipath}", __name__, "", "" )
sam = ReadCal.readSAMCalFromIni(inipath)
# log.debug(f"__init_configuration_IP_SAM {sam}", __name__, "", "" )
for k,v in sam.items():
self.cal_configuration[j].update({ k : v })
if self.cal_configuration[j]["TYPE"] == "SAMIP":
ip = ReadCal.readIPCalFromIni(inipath)
for k,v in ip.items():
self.cal_configuration[j].update({ k : v })
def __isSamIniExisted(self,sn) ->bool:
sn_0 = "SAM_"+str(sn)+".ini"
path_ = CAL_DIR.joinpath(self.device_type.lower(), sn_0)
if path_.exists():
return True
return False
def __isSamIPIniExisted(self,sn) ->bool:
sn_0 = "SAMIP_"+str(sn)+"_ALL.ini"
path_ = CAL_DIR.joinpath(self.device_type.lower(), sn_0)
if path_.exists():
return True
return False
def __getSAMSN(self,sn) -> None:
sn_0 = "SAMIP_"+str(sn)+"_ALL.ini"
path_ = CAL_DIR.joinpath(self.device_type.lower(), sn_0)
# path_ = DATA_DIR.joinpath(self.device.lower(), CAL_DIR, sn_0)
samsn = ReadCal.readSamSNFromIni( path_ )
if samsn == None:
return None
return samsn
pass
# def __init2__(self, device:str, **kwargs) -> None:
# """
# get cal parameter for every sensor
# para : {"1":{"SN":"85B5","FUNC","Lsky"},"2":{},"3":{}}
# """
# # log.info(f"ProcessAWRAMS kwargs: {kwargs}", __name__, "", "")
# # log.info(f"len: { len(kwargs)}", __name__, "", "")
# if len(kwargs) != 3:
# log.warning(f" pass a wrong para to ProcessAWRAMS {kwargs}", __name__, "", "")
# self.device = device.lower() # surface profile awrams
# self.ramses = {}
# # 生成标定文件 { }
# for k,v in kwargs.items():
# self.ramses.update( {v["FUNC"]:{}} )
# self.ramses[v["FUNC"]].update( {"SN":v['SN']} )
# self.ramses[v["FUNC"]].update( {"FUNC":v['FUNC']} )
# pass
# log.debug(f" ===== {self.ramses}",__name__, "", "" )
# # if kwargs.__contains__("1"):
# # self.ramses.append( self.cfgtool.getDictByAttr("ramses"))
# # self.cfgtool.set_attr(self.ramses[1],kwargs['1']"SN",kwargs['1'])
# # if kwargs.__contains__("2"):
# # self.ramses.append( self.cfgtool.getDictByAttr("ramses"))
# # self.cfgtool.set_attr(self.ramses[2],"SN",kwargs['1'])
# # if kwargs.__contains__("3"):
# # self.ramses.append( self.cfgtool.getDictByAttr("ramses"))
# # self.cfgtool.set_attr(self.ramses[3],"SN",kwargs['1'])
# self.__init_configuration_basic()
# self.__init_configuration_cal()
# self.__init_configuration_IP_SAM()
# # log.info(f"ProcessAWRAMS after initiate: {kwargs}", __name__, "", "")
# def __init_configuration_basic2(self ) -> None:
# # self.cfgtool = Config()
# for k in self.ramses.keys():
# sn = self.ramses[k]["SN"]
# if self.__isSamIniExisted(sn):
# self.ramses[k].update({ "TYPE" : "SAM" })
# self.ramses[k].update({ "samsn" : sn })
# self.ramses[k].update({ "inifile" : "SAM_"+sn+".ini" })
# self.ramses[k].update({ "calfile" : "Cal_SAM_"+sn+".dat" })
# self.ramses[k].update({ "calaqfile" : "CalAQ_SAM_"+sn+".dat" })
# self.ramses[k].update({ "backfile" : "Back_SAM_"+sn+".dat" })
# if self.__isSamIPIniExisted(sn):
# self.ramses[k].update({ "TYPE" : "SAMIP" })
# samsn = self.__getSAMSN(sn)
# if samsn== None:
# log.warning(f"Cannot get samsn from Sensor: {sn}", __name__, "", "" )
# raise Exception(f"Cannot get samsn from Sensor: {sn}")
# self.ramses[k].update({ "samsn" : samsn })
# self.ramses[k].update({ "inifile" : "SAMIP_"+sn+"_ALL.ini" })
# self.ramses[k].update({ "calfile" : "Cal_SAM_"+samsn+".dat" })
# self.ramses[k].update({ "calaqfile" : "CalAQ_SAM_"+samsn+".dat" })
# self.ramses[k].update({ "backfile" : "Back_SAM_"+samsn+".dat" })
# if not self.__isSamIniExisted(sn) and not self.__isSamIPIniExisted(sn):
# log.warning(f"Cannot find ini file for Sensor: {sn}", __name__, "", "" )
# raise Exception(f"Cannot find ini file for Sensor: {sn}")
# pass
# def __init_configuration_cal2(self ) -> None:
# # self.cfgtool = Config()
# for k in self.ramses.keys():
# sn = self.ramses[k]["SN"]
# # Device File
# calpath = CAL_DIR.joinpath(self.device, self.ramses[k]["calfile"])
# if calpath.exists( ):
# res = Readfile.read_columns_set_by_mark( calpath, FILE_MARK, 1 )
# self.ramses[k].update({ "cal" : res[1][0] })
# calaqpath = CAL_DIR.joinpath(self.device, self.ramses[k]["calaqfile"])
# if calaqpath.exists( ):
# res = Readfile.read_columns_set_by_mark( calaqpath, FILE_MARK, 1 )
# self.ramses[k].update({ "calaq" : res[1][0] })
# backpath = CAL_DIR.joinpath(self.device, self.ramses[k]["backfile"])
# if calaqpath.exists( ):
# res = Readfile.read_columns_set_by_mark( backpath, FILE_MARK, 1,2 )
# self.ramses[k].update({ "b0" : res[1][0] })
# self.ramses[k].update({ "b1" : res[1][1] })
# pass
# def __init_configuration_IP_SAM2(self ) -> None:
# # self.cfgtool = Config()
# for j in self.ramses.keys():
# # log.debug(f"__init_configuration_IP_SAM {j}", __name__, "", "" )
# inipath = CAL_DIR.joinpath(self.device, self.ramses[j]["inifile"])
# # log.debug(f"__init_configuration_IP_SAM {inipath}", __name__, "", "" )
# sam = Readfile.readSAMCalFromIni(inipath)
# # log.debug(f"__init_configuration_IP_SAM {sam}", __name__, "", "" )
# for k,v in sam.items():
# self.ramses[j].update({ k : v })
# if self.ramses[j]["TYPE"] == "SAMIP":
# ip = Readfile.readIPCalFromIni(inipath)
# for k,v in ip.items():
# self.ramses[j].update({ k : v })

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.

@ -0,0 +1,237 @@
# import numpy as np
from pathlib import Path
class DataPlot():
'''
从文件读取数据出来成待显示数据
'''
# def __init__(self, mypanel, ):
def __init__(self, ):
# self.mypanel = mypanel
# self.__eventManager = eventManger
# self.dataSaveFile = DATA_FNAME_WITHOUT_WATER
# self.axes_title = "Water Attenuation Coefficient"
# self.axes_xlabel = "Wavelength (nm)"
# self.axes_ylabel = "Attenuation Coefficient m(-1)"
# self.axes_title = "Attenuation Coefficient Demo"
self.demo_time = ''
self.demo_wl = [] # 纯水
self.demo_data = [] # 纯水
self.wavelength = None
self.data_one = None
self.data_multi = None
# self.mode = "one" # multi
# self.begin_line = None
# self.line_interval = None
self.fpath :Path = Path()
self.total_lines = 0
self.token = ";"
# self.MPL = myPanel.MPL_Panel(self) # 调用自己建立的 panel 类
# self.Figure = self.MPL.Figure
# self.axes = self.MPL.axes
# self.FigureCanvas = self.MPL.FigureCanvas
def set_file_path( self, fpath:Path ):
self.fpath = fpath
pass
def set_wavelength(self):
pass
# def set_mode(self, mode ="one"):
# self.mode = mode
# pass
def set_token(self, token =";"):
self.token = token
pass
def set_begin_line( self, lineno = 0 ):
self.begin_line = lineno
pass
def set_line_interval( self, line_interval = 0 ):
self.line_interval = line_interval
pass
def get_total_lines( self, ):
''' 大文件 '''
count = 0
thefile = open( self.fpath, 'rb')
while True:
buffer = thefile.read(8192*1024)
if not buffer:
break
count += buffer.count(b'\n')
self.total_lines = count + 1
def get_wavelength_from_file( self, ):
tmp = self.get_first_line()
self.wavelength = tmp.split(self.token)[1:]
pass
def get_reverse_x_lineno( self, x ):
line = self.__get_reverse_x_lineno(x)
line = line.split(self.token)
return line[0], line[1:]
pass
def get_multi_by_x_m_n( self, x,m,n ):
# res_time = []
# res_lines = []
lines = self.__get_reverse_x_m_n_line(x,m,n)
# print(f'+++++ {lines}')
# for i in range(len(lines)):
# ln =
# res_time.append( lines[i] [0] )
# res_lines.append( lines[i][1:] )
# return res_time, res_lines
return lines
pass
def __get_reverse_x_lineno(self, x):
"""
获得倒数第x行
"""
try:
# filesize = os.path.getsize(self.fpath)
filesize = self.fpath.stat().st_size
if filesize == 0:
return None
else:
with open(self.fpath, 'rb') as fp: # to use seek from end, must use mode 'rb'
offset = -8 # initialize offset
while -offset < filesize: # offset cannot exceed file size
fp.seek(offset, 2) # read # offset chars from eof(represent by number '2')
lines = fp.readlines() # read from fp to eof
if len(lines) >= x+1: # if contains at least 2 lines
return lines[-1*x] # then last line is totally included
else:
offset *= 2 # enlarge offset
fp.seek(0)
lines = fp.readlines()
if len(lines) < x:
raise Exception("行数有误,请重试")
return lines[-1*x]
except FileNotFoundError:
print(self.fpath.name + ' not found!')
return None
def __get_reverse_x_m_n_line(self, x, m=1, n=1):
"""
获得倒数第x行, 间隔m行, 共取n个行
"""
print(f'__get_reverse_x_m_n_line {x} {self.fpath}')
min_lines = x + m*n
res_lines = []
try:
# filesize = os.path.getsize(self.fpath)
filesize = self.fpath.stat().st_size
if filesize == 0:
return None
else:
with open(self.fpath, 'rb') as fp: # to use seek from end, must use mode 'rb'x
offset = -8 # initialize offset
while -offset < filesize: # offset cannot exceed file size
fp.seek( offset, 2 ) # read # offset chars from eof(represent by number '2')
lines = fp.readlines() # read from fp to eof
if len(lines) >= min_lines+1 :
for i in range(n):
res_lines.append( lines[-1*(x+m*i)].decode())
return res_lines
else:
offset *= 2 # enlarge offset
fp.seek( 0 )
lines = fp.readlines( )
if len(lines) < min_lines:
raise Exception("行数有误,请重试")
for i in range(n):
res_lines.append( lines[-1*(x+m*i)].decode())
return res_lines
print(res_lines)
except FileNotFoundError:
print(self.fpath.name + ' not found!')
return None
def get_first_line(self, ):
firstline = ''
with open(self.fpath, 'rb') as fp: # to use seek from end, must use mode 'rb'x
firstline = fp.readline()
return firstline.decode()
def get_last_line(self,filename:Path):
"""
获得最后一行
:param filename: file name
:return: last line or None for empty file
"""
try:
filesize = filename.stat().st_size
if filesize == 0:
return None
else:
with open(filename, 'rb') as fp: # to use seek from end, must use mode 'rb'
offset = -8 # initialize offset
while -offset < filesize: # offset cannot exceed file size
fp.seek(offset, 2) # read # offset chars from eof(represent by number '2')
lines = fp.readlines() # read from fp to eof
if len(lines) >= 2: # if contains at least 2 lines
return lines[-1] # then last line is totally included
else:
offset *= 2 # enlarge offset
fp.seek(0)
lines = fp.readlines()
return lines[-1]
except FileNotFoundError:
print(filename + ' not found!')
return None
def tail(file, taillines=500, return_str=True, avg_line_length=None):
"""
大文件的尾行小文件会导致报错
taillines : 读取尾部多少行
avg_line_length:每行字符平均数,
return_str:返回类型默认为字符串False为列表
offset:每次循环相对文件末尾指针偏移数
f.tell() 当前指针位置
f.seek(a,b) a 偏移量 b:0 1 2 文件头 当前位置 文件尾部
"""
with open(file, errors='ignore') as f:
if not avg_line_length:
f.seek(0, 2)
f.seek(f.tell() - 3000)
avg_line_length = int(3000 / len(f.readlines())) + 10
f.seek(0, 2)
end_pointer = f.tell()
offset = taillines * avg_line_length
if offset > end_pointer:
f.seek(0, 0)
lines = f.readlines()[-taillines:]
return "".join(lines) if return_str else lines
offset_init = offset
i = 1
while len(f.readlines()) < taillines:
location = f.tell() - offset
f.seek(location)
i += 1
offset = i * offset_init
if f.tell() - offset < 0:
f.seek(0, 0)
break
else:
f.seek(end_pointer - offset)
lines = f.readlines()
if len(lines) >= taillines:
lines = lines[-taillines:]
return "".join(lines) if return_str else lines
if __name__ == "__main__":
d = DataPlot()

@ -0,0 +1,109 @@
import numpy as np
from myconfig import OUTPUT_DIR
from tools.mylogger import log
from pathlib import Path
# from handheld import HandHeldPath
class GatherData(object):
"""对数据进行汇总后分析 csv"""
def __init__(self, ):
super(GatherData, self).__init__()
self.dir = OUTPUT_DIR
self.extname = ".csv"
def setDir(self, fpath):
self.dir = fpath
pass
def setExtname(self, extname):
self.extname = extname
pass
def getChildDirs(self, ):
'''
按时间排放每个目录下有五个文件 Esky....Rs
文件直接保存到 output下的五个文件 Esky ..... Rs
'''
childdirs = []
for path in Path(self.dir).iterdir():
# if path.is_dir():
# print(path)
if not path.is_dir():
continue
childdirs.append(path)
return childdirs
pass
def gather_handheld(self, ):
log.info(f" ",__name__,'gather_handheld')
childDirs = self.getChildDirs()
for cdir in childDirs:
tmp_path:Path = cdir.joinpath("Lw"+self.extname)
self.transfer_data(tmp_path)
tmp_path:Path = cdir.joinpath("Rs"+self.extname)
self.transfer_data(tmp_path)
pass
def transfer_data(self, fpath:Path):
log.info(f" ",__name__,'transfer_data')
log.info(fpath)
old_path:Path = fpath
new_path:Path = self.dir.joinpath( old_path.stem + self.extname)
if not new_path.exists():
new_path.touch()
if old_path.exists():
count = 0
with open( new_path, "a" ) as fnew:
with open( old_path, "r" ) as f:
while True:
line = f.readline()
if not line :
break
if count != 0:
fnew.write(line)
count+=1
def gather_awrams(self, ):
'''
一个文件包含 Esky .....Rs 五组数据
获得csv文件,转移不同的行到不同文件
第一列要转为时间
'''
# ret = []
fs = None
self.filelist = []
fs = self.dir.glob( "*/*/*/*.csv" )
for f in fs:
print(f)
tmp = np.loadtxt( fs, dtype=str, delimiter=';',skiprows=1 )
self.addNdarray2File(tmp[0])
def addNdarray2File( self, data:np.ndarray ):
pass
# def transfer_line_without_firstline(self, oldpath:Path, newPath:Path):
# count = 0
# with open( newPath, "a" ) as fnew:
# with open( oldpath, "r" ) as f:
# line = f.readline()
# if count != 0:
# fnew.write(line)
# pass
# pass
def getFileList_awrams(self, ):
'''
一个文件包含 Esky .....Rs 五组数据
获得csv文件,转移不同的行到不同文件
'''
# ret = []
fs = None
self.filelist = []
fs = self.dir.glob( "*/*.csv" )
pass
if __name__ == "__main__":
gd = GatherData()
gd.gather_handheld()

@ -0,0 +1,951 @@
#! python3
# -*- encoding: utf-8 -*-
'''
@File : handheld.py
@Time : 2023/02/24 17:20:59
@Author : Jim @ Yiwin
@Version : 1.0
@Contact : jim@yi-win.com
'''
CUR_TIME_STR_FMT = "%Y-%m-%d %H:%M:%S"
import time
import locale
import struct
import numpy as np
from pathlib import PurePath,Path
from pubsub import pub
from myconfig import CURRENT_DIR,DATA_DIR,OUTPUT_DIR,NEWLINE,ROWFACTOR,SAVE_EXT_NAME,TOKEN
from myconfig import DeviceType,RamsesSURFACE,RamsesAWRAMS,RamsesPROFILE
from tools.mylogger import log
from tools.myexception import MyException
from tools.mytime import MyTime
from tools.mypath import MyDir
from Ramses import Ramses
class HandHeldBuf:
def __init__(self,) -> None:
self.__buf = b''
self.__head = {}
self.__begin_sign = b'\x23'
self.__end_sign = b'\x0D'
self.data_ip = b''
self.measure_group = {
"Lsky": b'',
"Esky": b'',
"Lwater": b'',
}
self.one_group_data= b''
self.state = 0
def readFile2Buf(self, fpath) -> None:
with open(fpath,"rb") as f:
self.__buf = f.read()
pass
pass
def read_buf(self, size: int) -> bytes:
if size > self.__buf.__len__():
return b''
ret = self.__buf[0:size]
self.__buf = self.__buf[size:]
return ret
def write_buf(self, buf: bytes) -> None:
id = self.id
len = buf.__len__()
# logging.info(f'Received ID:{id} Size:{len}')
self.__buf = self.__buf+buf
def get_buf_size(self) -> int:
return self.__buf.__len__()
def back_bytes(self, buf: bytes) -> None:
self.__buf = buf+self.__buf
def reset_head(self) -> None:
self.__head = {}
def reset_buf(self) -> None:
self.__buf = b''
def getResult(self) -> str:
return self.res
def resetMeasureGroup(self) -> None:
self.measure_group['Lsky'] = b''
self.measure_group['Esky'] = b''
self.measure_group['Lwater'] = b''
def getMeasureGroup(self) -> dict:
return self.measure_group
def decode_handheld(self) -> bool:
'''以26个字节开始,一般26个00 ,然后23... 07.... '''
if self.get_buf_size() < 1754:
self.__buf = b''
return False
self.data_ip = self.read_buf(26)
Lsky = self.read_buf(576)
Esky = self.read_buf(576)
Lwater = self.read_buf(576)
self.measure_group['Lsky'] = self.deal_576_to_512(Lsky)
self.measure_group['Esky'] = self.deal_576_to_512(Esky)
self.measure_group['Lwater'] = self.deal_576_to_512(Lwater)
if self.measure_group['Lsky'] == b'' \
or self.measure_group['Esky'] == b'' \
or self.measure_group['Lwater'] == b'' :
return False
return True
def decode_one_group_handheld(self) -> bool:
'''以26个字节开始,一般26个00 ,然后23... 07.... '''
if self.get_buf_size() < 1754:
self.__buf = b''
return False
self.data_ip = self.read_buf(26)
self.one_group_data = self.read_buf(1728)
return True
def deal_576_to_512(self,data:bytes) -> bytes:
''' 576字节校验,拆分成字典 23... 07.... ,然后254*2'''
ret = {}
index = 72
for i in range(8):
temp = data[i*index : i*index+index]
# print( temp.hex())
if temp[0] != 35 and temp[0]<8 and temp>0 :
return b''
pass
ret.update( { temp[4]: temp} )
if len(ret) != 8:
return b''
ret_byte = ret[7][7:71]+ ret[6][7:71]+ ret[5][7:71]+ ret[4][7:71] \
+ ret[3][7:71]+ ret[2][7:71]+ ret[1][7:71]+ ret[0][7:71]
return ret_byte
def decode(self) -> str:
ret = ''
temp_buf = b''
token = ";"
if TOKEN:
token = TOKEN
if self.state == 0:
while self.get_buf_size() >= 1:
if self.read_buf(1) != self.__end_sign:
continue
self.state = 1
break
if self.state == 1:
while self.get_buf_size() >= 1:
buf = self.read_buf(1)
if buf != self.__end_sign:
temp_buf += buf
if buf == self.__end_sign:
ret = temp_buf[0:20].decode(
'utf-8').strip(" ") + token + temp_buf[-9:-1].decode('utf-8').strip(" ")
log.info(f"decode : {ret}")
temp_buf = b''
self.back_bytes(temp_buf) # 写回临时buf到
self.res = ret
return ret
pass
class HandHeldPath(object):
'''处理一次测量'''
def __init__(self, ):
self.mode = 0
self.cfg ={}
self.mydir = MyDir()
self.base_path:Path = Path()
self.output_path:Path = Path()
self.data_path:Path = Path()
self.filelist = []
self.error_result = []
pass
def setMode( self, mode:int = 0 ):
self.mode = mode
pass
def setBasePath( self, fpath:Path ):
self.base_path = fpath
pass
def setDataPath( self, fpath:Path ):
self.data_path = fpath
pass
def setOutputPath( self, fpath:Path ):
self.output_path = fpath
pass
def getSensorPathFromInfoPath( self, info_path:Path, ) -> Path:
# 服务器上转移后的模式
if self.mode == 1:
sensor_path = self.base_path.joinpath(
info_path.parent,
"sensor.bin"
)
elif self.mode == 0:
sensor_path = self.base_path.joinpath(
"data",
info_path.parts[1][:4] + "_" + info_path.parts[1][-2:],
info_path.parts[2],
"sensor",
info_path.name
)
else:
sensor_path = None
return sensor_path
pass
def getOutputPathFromSensorPath(self,sensor_path:Path ) -> Path:
if self.mode == 1:
output_path = self.output_path.joinpath(
self.info_dict['year'] + "_" + self.info_dict['month']
+ "_" + self.info_dict['day'] + "_" + self.info_dict['hour']
+ "_" + self.info_dict['minute'] + "_" + self.info_dict['second']
)
elif self.mode == 0:
output_path = self.output_path.joinpath(
sensor_path.parts[1][:4] + "_" + sensor_path.parts[1][-2:]
+ "_" +sensor_path.parts[2] + "_" +sensor_path.name
)
else:
output_path = None
return output_path
pass
def getCurrentMeasureTimeFromPath(self,fpath:Path ) -> str:
ret = ''
if self.mode == 1: # 读信息txt获得时间
txt_path = fpath.parent.glob("*.txt")
txt_stem = txt_path[0].stem
ret = fpath.parts[1][:4]+"-"+fpath.parts[1][-2:]+"-"+fpath.parts[2]+" " \
+ txt_stem[-9:-7] + ":" + txt_stem[-6:-4] + ":" + txt_stem[-3:-1]
pass
elif self.mode == 0:
ret = fpath.parts[1][:4]+"-"+fpath.parts[1][-2:]+"-"+fpath.parts[2]+" " \
+ fpath.name[0:2] + ":" + fpath.name[3:5] + ":" + fpath.name[6:8]
else:
pass
return ret
pass
def getDataFileList(self, ):
'''
获得成对的info sensor 文件
[目录名文件名年月日时间, measure_id]
'''
# ret = []
fs = None
self.filelist = []
if self.mode == 1:
fs = self.data_path.glob( "*/*/*/*/info.bin" )
else:
fs = self.data_path.glob( "*/*/info/*" )
for f in fs:
error_file = {}
if f.stat().st_size==0:
error_file.update( {"path": f } )
error_file.update( {"error":"info file size is zero"} )
self.error_result.append(error_file)
continue
# self.info_path_fname = f
sensor_path = self.getSensorPathFromInfoPath(f)
# sensor_path = Path(sensor_purepath)
# sensor 文件不存在
if not sensor_path.exists():
error_file.update( {"path":f} )
error_file.update( {"error":"cannot find the sensor file "} )
self.error_result.append(error_file)
continue
# sensor文件大小为0
if sensor_path.stat().st_size==0:
error_file.update( {"path":sensor_path} )
error_file.update( {"error":"sensor file size of the sensor is zero' "} )
self.error_result.append(error_file)
continue
self.setFilelist(f,sensor_path )
pass
# def getDataFileList_SD(self, mode:int = 0 ):
# '''
# 获得成对的info sensor 文件
# [目录名,文件名,年月日,时间]
# '''
# # ret = []
# fs = self.data_path.glob( "*/*/info/*" )
# for f in fs:
# error_file = {}
# if f.stat().st_size==0:
# error_file.update( {"path": f.name } )
# error_file.update( {"error":"info file size is zero"} )
# self.error_result.append(error_file)
# continue
# self.info_path_fname = f
# sensor_path = self.getSensorPathFromInfoPath( f )
# # sensor_path = Path(sensor_purepath)
# # sensor 文件不存在
# if not sensor_path.exists():
# error_file.update( { "path" : f } )
# error_file.update( {"error":"cannot find the sensor file "} )
# self.error_result.append(error_file)
# continue
# # sensor文件大小为0
# if sensor_path.stat().st_size==0:
# error_file.update( { "path" : f } )
# error_file.update( {"error" : "the file size of the sensor is zero' "} )
# self.error_result.append(error_file)
# continue
# self.setFilelist(f,sensor_path,mode=mode)
# # print(self.filelist)
# pass
def setFilelist(self, info_path:Path, sensor_path:Path):
temp = {}
temp.update( {"info_path" : info_path } )
temp.update( {"name" : info_path.name} )
temp.update( {"parent" : info_path.parent} )
if self.mode==1: # 服务器转移后目录
temp.update( {"year" : info_path.parts[-5] } )
temp.update( {"month" :info_path.parts[-4] } )
temp.update( {"day" :info_path.parts[-3] } )
temp.update( {"year" : info_path.parts[1][:4] } )
temp.update( {"month" :info_path.parts[1][-2:] } )
temp.update( {"day" :info_path.parts[2] } )
temp.update( { "sensor_path" :sensor_path } )
self.filelist.append(temp)
def getFilelist(self, ):
return self.filelist
def printTest(self,d,sleep_time:int=5):
log.info( f"***** : I am testing from HandheldPath ********", __name__ )
print(d)
log.info( f"***** : Ending testing from HandheldPath ********", __name__ )
time.sleep(sleep_time)
pass
class HandHeld(object):
def __init__(self, ):
"""
@description : 手持数据初始化,桌面端
入口 dealAllMeasurements()
dealOneHandheldMeasurement() 处理一次测量
保存 一次测量多组不同时间的 Lsky ,只能分文件保存
分文件保存优点一次拿到全部Rs. 服务器端
"""
self.device_type = DeviceType.SURFACE.name
self.device_enum = None
self.device_id = {}
self.syscfg = {}
self.retrieve ={}
self.error_result=[]
self.mode = 0 # 0:默认SD数据, 1:服务器数据
self.base_path = CURRENT_DIR
self.current_path = CURRENT_DIR
self.data_path = DATA_DIR
self.output_path = OUTPUT_DIR
self.info_path_fname:Path = self.base_path
self.sensor_path_fname:Path = self.base_path
self.filelist = [] # 包含了全部路径信息
self.intensity_before_avg = None
self.intensity_after_avg = {} # 最终结果{lsky: esky: lwater: }
self.intensity_after_interpo = {} # 最终结果{lsky: esky: lwater: }
self.one_group_result = {} # 手持式 多次间隔
self.wavelength = np.array([])
self.real_wavelength = {} # 最终结果{lsky: esky: lwater: }
self.current_filepath = '' # 不含后缀
self.current_measure_time = None # 当前测量时间
self.current_group_num = 0
self.measurement_interval = 0
self.measurement_repeat = 1
# self.sl2f = SaveList2File()
self.mydir = MyDir()
self.my_time = MyTime()
self.hhb = HandHeldBuf()
self.hhp = HandHeldPath()
self.ramses = Ramses()
self.info_dict = {}
self.res = {} # 最终结果{lsky: esky: lwater: Lw: Rs:}
# 方法
self.setDeviceEnum()
self.setMode()
self.set_hhp_path()
pass
def setMode(self,mode=0 ):
self.hhp.setMode (mode) # 0 :读SD卡 1:读服务器数据
def set_hhp_path(self, ):
self.hhp.setBasePath (self.base_path)
self.hhp.setDataPath (self.data_path)
self.hhp.setOutputPath (self.output_path)
def setDeviceEnum(self, ):
if self.device_type == DeviceType.SURFACE.name:
self.device_enum = RamsesSURFACE
if self.device_type == DeviceType.AWRAMS.name:
self.device_enum = RamsesAWRAMS
if self.device_type == DeviceType.PROFILE.name:
self.device_enum = RamsesPROFILE
def __set_msg(self, flag, d):
self.msg = {}
self.msg.update( {"flag":flag} )
self.msg.update( {"data":d} )
pass
def getDataFileList(self, ):
self.hhp.getDataFileList()
self.filelist = self.hhp.getFilelist()
# self.printTest(self.filelist)
pass
def resetCurrentTime(self, num):
if self.current_measure_time == "":
return None
self.my_time.setCurrentTimeStr(self.current_measure_time)
self.my_time.timeDelta( seconds= self.measurement_interval * num)
self.current_measure_time = self.my_time.cur_time_str
pass
def dealAllMeasurements(self, ):
log.info(f" 所有测量文件", __name__, "dealAllMeasurements", )
if len(self.filelist)<1:
pass
# 前面已经考虑各种文件错误
for df in self.filelist:
# 处理信息帧
self.info_dict = {}
self.info_path_fname:Path = df["info_path"]
self.sensor_path_fname:Path = df["sensor_path"]
hex_info = self.read_bin( self.info_path_fname )
try:
self.info_dict = self.decode_info( hex_info )
except:
log.error( f"处理信息文件"
+ "/" +self.info_path_fname.stem
+ "出现错误", __name__, "dealAllMeasurements" )
raise MyException( "处理文件"+ self.info_path_fname + "出现错误")
pass
try:
# self.dealOneMeasurement(self.sensor_path_fname )
# 手持测量 需要分组
self.measurement_interval = int(self.info_dict['Measure_Interval'])
self.measurement_repeat = int(self.info_dict['Measure_Repeat'])
self.dealOneHandheldMeasurement(self.sensor_path_fname )
except Exception as e:
log.error( "处理传感器文件" + self.sensor_path_fname.name + "出现错误",__name__,"dealAllMeasurements")
raise MyException( "处理传感器文件" + self.sensor_path_fname.name + "出现错误" )
pass
self.__set_msg('notice', '处理文件完成')
pub.sendMessage('update' , msg=self.msg)
log.info(f"Finished !! ", __name__, "dealAllMeasurements")
return True,self.error_result
pass
def dealOneHandheldMeasurement(self, fpath:Path):
'''handheld一次测量包含多组数据'''
# 调用handheldbuf 处理,将一组数据提交出来
log.info(f" 处理一个文件,多组测量数据", __name__, "dealOneHandheldMeasurement")
if len(self.filelist)<1:
pass
# 当前文件名
self.output_path = OUTPUT_DIR
self.current_filepath = fpath
self.current_measure_time = self.hhp.getCurrentMeasureTimeFromPath(fpath)
self.get_ymdhms()
self.output_path = self.output_path.joinpath( self.ymdhms )
log.debug(f"current_measure_time: {self.current_measure_time}", __name__, "dealOneHandheldMeasurement")
self.hhb.readFile2Buf(fpath)
log.debug(f"buf: {self.hhb.get_buf_size()}", __name__, "dealOneHandheldMeasurement")
self.decode_sensor_buf()
# 解析Buf, 对buf分组,获得[{lsky: esky : lwater} .... ]
len_total = len(self.intensity_before_avg)
if len_total%self.measurement_repeat != 0:
self.res = {}
return # 返回退出
# 依据总的次数 除重复次数,获得总的测了多少组数据
group_num = int(len_total/self.measurement_repeat)
log.info(f"group_num -> {group_num}, ervery group -> {self.measurement_repeat} ", __name__, "dealOneHandheldMeasurement")
self.real_wavelength = self.getWavelenthDict()
# if group_num == 1:
# self.dealOneGroup() # self.intensity_before_avg
# return
self.dealMultiGroup(group_num)
def dealMultiGroup(self, group_num:int ):
log.info(f"group_num: {group_num}", __name__, "dealMultiGroup")
# 分组进行处理
for i in range(group_num):
self.current_group_num = i
# 重设当前测量时间 ?????????
locale.setlocale(locale.LC_ALL, '')
self.real_time = self.get_current_time_by_i_interval(i,self.measurement_interval)
self.res = {}
tmp_before_avg = []
for j in range( self.measurement_repeat ):
tmp_before_avg.append( self.intensity_before_avg[j+i*self.measurement_repeat] )
pass
self.getAvg(tmp_before_avg)
self.__do_sensor_dict_interpo()
# 选择追加保存, 一个Lsky 可能多组文件,只能单独保存为 Lsky Esky ..Rs
# self.appendSave()
self.getLwRs()
self.checkAndSaveData( )
path_info_txt = self.output_path.joinpath( "info.txt" )
self.save_dict_to_file( self.info_dict, path_info_txt )
def get_current_time_by_i_interval(self, i, interval):
self.my_time.setCurrentTimeStr(self.current_measure_time)
self.my_time.timeDelta(seconds=i*interval)
return self.my_time.cur_time_str
pass
# def dealOneGroup(self, ):
# # 分组,并获得平均值, 255个未插值结果 (依据 measurement_interval measurement_repeat)
# self.output_path = OUTPUT_DIR
# self.getAvg( self.intensity_before_avg )
# # 插值
# self.real_wavelength = self.getWavelenthDict()
# self.__do_sensor_dict_interpo()
# self.ymdhms = "20"+ str(self.info_dict['year']) + '_' \
# + str(self.info_dict['month']) + '_' \
# + str(self.info_dict['day']) + '_' \
# + str(self.info_dict['hour']) + '_' \
# + str(self.info_dict['minute']) + '_' \
# + str(self.info_dict['second'])
# self.output_path = self.output_path.joinpath( self.ymdhms )
# self.appendSave()
# # self.checkAndSaveData( )
# # self.getLwRsAndSave()
# # path_info_txt = self.output_path.joinpath( "info.txt" )
# # self.save_dict_to_file( self.info_dict, path_info_txt )
# def dealOneMeasurement(self, fpath:Path):
# '''handheld一次测量包含多组数据'''
# # 调用handheldbuf 处理,将一组数据提交出来
# log.info(f"dealOneMeasurement: 一组测量数据", __name__, "dealOneMeasurement")
# if len(self.filelist)<1:
# pass
# # 当前文件名
# self.current_filepath = fpath
# self.current_measure_time = self.hhp.getCurrentMeasureTimeFromPath(fpath) # ??
# self.hhb.readFile2Buf(fpath)
# self.decode_sensor_buf()
# self.real_wavelength = self.getWavelenthDict()
# self.dealOneGroup()
def decode_sensor_buf(self,) :
# 处理Buf,对多组数据取平均
self.intensity_before_avg = []
# res_before_avg = []
self.clearRes() # 清空数据
while True:
## 以下代码已经处理了 ip的数据帧
if not self.hhb.decode_one_group_handheld() :
break # 清空数据
res = {}
## 上方代码已经处理了 ip的数据帧
buf = self.hhb.one_group_data
# buf = self.hhb.one_group_data[26:]
for i in range( 1, 4, 1 ):
site = ( i - 1 ) * 576
temp_buf = buf[7+site:71+site] + buf[79+site:143+site] + \
buf[151+site:215+site] + buf[223+site:287+site] + \
buf[295+site:359+site] + buf[367+site:431+site] + \
buf[439+site:503+site] + buf[511+site:575+site]
# Ramses类 标定处理,设置buf 标定文件
self.ramses.setBuf(temp_buf)
func = self.getFuncBySeq(i)
cfg = self.getCfgByFunc( func)
self.ramses.setCalCfg(cfg)
self.ramses.resetItSpectrum()
self.ramses.ConvertAndCalibrate()
res.update( { func : self.ramses.spectrum } )
self.intensity_before_avg.append( res )
pass
def getAvg( self, d:list) :
log.info(f"getAvg: 平均多组数据", __name__, "getAvg")
data = d
ret = {}
len_result = len(data)
if len_result == 0:
self.intensity_after_avg ={}
return None
if len_result == 1:
self.intensity_after_avg = data[0]
return None
ret = data[0]
res_dict = self.getRetDict()
for k in res_dict.keys():
for i in range(1,len_result,1):
data[0][k] = data[0][k] + data[i][k]
ret = data[0][k]/len_result
self.intensity_after_avg.update( { k : ret } )
log.debug(f"getAvg: {self.intensity_after_avg}", __name__, "getAvg")
pass
def getRetDict(self,) :
ret_dict = { }
ret_dict.update( {self.device_enum(1).name:np.array([])} )
ret_dict.update( {self.device_enum(2).name:np.array([])} )
ret_dict.update( {self.device_enum(3).name:np.array([])} )
# self.one_group_result = ret_dict
return ret_dict
def __do_sensor_dict_interpo(self,) :
log.info( f"同步处理多个个插值 ", __name__, "__do_sensor_dict_interpo" )
self.clearRes()
for k in self.intensity_after_avg.keys():
tmp = np.interp( self.wavelength, self.real_wavelength[k], self.intensity_after_avg[k] )
self.res.update( { k : tmp } )
def getCfgByDid(self, func:str) :
cfg_id:dict = self.cfg.get(int(self.device_id))
cfg_sensor = cfg_id.get( func)
return cfg_sensor
pass
def getFuncBySeq(self, seq:int) :
func = ""
if self.device_type == DeviceType.AWRAMS.name:
func = RamsesAWRAMS(seq).name
if self.device_type == DeviceType.SURFACE.name:
func = RamsesAWRAMS(seq).name
if self.device_type == DeviceType.PROFILE.name:
func = RamsesAWRAMS(seq).name
return func
def getCfgByFunc(self, func:str) :
cfg_id:dict = self.syscfg.get(int(self.device_id))
cfg_sensor = cfg_id.get( func)
return cfg_sensor
pass
def getCfgBySeq(self, seq:int) :
func = ""
if self.device_type == DeviceType.AWRAMS.name:
func = RamsesAWRAMS(seq).name
if self.device_type == DeviceType.SURFACE.name:
func = RamsesAWRAMS(seq).name
if self.device_type == DeviceType.PROFILE.name:
func = RamsesAWRAMS(seq).name
cfg_id:dict = self.syscfg.get(int(self.device_id))
cfg_sensor = cfg_id.get( func)
return cfg_sensor
pass
def appendSave(self, ) -> bool:
self.checkAndSaveData( )
self.getLwRsAndSave()
path_info_txt = self.output_path.joinpath( "info.txt" )
self.save_dict_to_file( self.info_dict, path_info_txt )
def checkAndSaveData(self, ) -> bool:
"""
check self.Lsky Esky Lwater and Save
处理self.res 的数据
"""
log.info(f"checkAndSaveData: {self.output_path.parts}", __name__)
self.mydir.setBaseDir(self.output_path) #基路径
self.mydir.setHeader( self.wavelength.tolist(), TOKEN, "device_id_"+str(self.device_id) )
# print(f"header_str : {self.mydir.header_str[-1:]}")
if self.current_group_num == 0: # 当前组号为0 新建否则追加
self.newFileByFunc( self.device_enum(1).name )
self.newFileByFunc( self.device_enum(2).name )
self.newFileByFunc( self.device_enum(3).name )
self.newFileByFunc( self.device_enum(4).name )
self.newFileByFunc( self.device_enum(5).name )
pass
self.appendFileByFunc( self.device_enum(1).name )
self.appendFileByFunc( self.device_enum(2).name )
self.appendFileByFunc( self.device_enum(3).name )
self.appendFileByFunc( self.device_enum(4).name )
self.appendFileByFunc( self.device_enum(5).name )
def newFileByFunc(self, func:str) -> None:
self.mydir.newFileIfNot( func+SAVE_EXT_NAME)
if self.mydir.checkHeader() == -1:
log.error(f"请备份文件:{self.mydir.current_filepath.parent} {self.mydir.current_filepath.name}, 并删除文件后再试!", __name__)
raise MyException( f"请备份文件:{self.mydir.current_filepath.parent} {self.mydir.current_filepath.name}, 并删除文件后再试!" )
return False
if self.mydir.checkHeader() == 1:
pass
if self.mydir.checkHeader() == 0:
self.mydir.writeHeader()
pass
# 写入数据content
self.mydir.setContent(self.res[func].tolist(), TOKEN, self.real_time)
self.mydir.writeContent()
def appendFileByFunc(self, func:str) -> None:
# 追加写入数据content
self.mydir.setContent(self.res[func].tolist(), TOKEN, self.real_time)
self.mydir.writeContent()
def clearRes(self, ) -> None:
self.res = { }
def getLwRs(self, ) -> bool:
"""
并计算Lw Rs并保存
"""
Lw = self.res["Lwater"] - ROWFACTOR * self.res["Lsky"]
self.res.update({ self.device_enum(4).name : Lw })
Rs = self.res["Lw"] / self.res["Esky"]
self.res.update({ self.device_enum(5).name : Rs })
return True
def get_ymdhms(self, ):
self.ymdhms = "20"+ f"{self.info_dict['year']:02d}" + '_' \
+ f"{self.info_dict['month']:02d}" + '_' \
+ f"{self.info_dict['day']:02d}" + '_' \
+ f"{self.info_dict['hour']:02d}" + '_' \
+ f"{self.info_dict['minute']:02d}" + '_' \
+ f"{self.info_dict['second']:02d}"
# def getLwRsAndSave(self, ) -> bool:
# """
# 并计算Lw Rs并保存
# """
# Lw = self.res["Lwater"] - ROWFACTOR * self.res["Lsky"]
# self.res.update({ "Lw" : Lw })
# Rs = self.res["Lw"] / self.res["Esky"]
# self.res.update({ "Rs" : Rs })
# self.mydir.setBaseDir(self.output_path) #基路径
# # 保存
# if self.current_group_num == 0:
# self.newFileByFunc( "Lw" )
# self.newFileByFunc( "Rs" )
# pass
# self.appendFileByFunc( "Lw" )
# self.appendFileByFunc( "Rs" )
return True
def read_bin(self,fpath: Path):
log.debug(f" readbin: ", __name__, "", "" )
ret = None
if not fpath.exists() :
log.info(f"not find file: {fpath} ")
return ret
with open(fpath, 'rb') as file:
ret = file.read()
return ret
log.debug(f" readbin: {ret} ", __name__, "", "" )
return ret
pass
def decode_info( self,info: bytes ) -> dict:
ret = {}
# 剖面型加了1311+24个字节共26个字节
# 保留字节有所变化,改为序列号,每个序列号两个字节
try:
temp = struct.unpack("<BBBBBBHHHHHHIIHHHHHBBBHHIfff \
HHHBHBHHHHH",
info)
except Exception as e:
return ret
log.debug(temp,__name__,"decode_info")
time_ = "20"+str(temp[0]) + "-" + str(temp[1]) + "-" + str(temp[2]) + " " \
+ str(temp[3]) + ":" + str(temp[4]) + ":" + str(temp[5])
ret.update({"time": time_})
ret.update({"year": temp[0]})
ret.update({"month": temp[1]})
ret.update({"day": temp[2]})
ret.update({"hour": temp[3]})
ret.update({"minute": temp[4]})
ret.update({"second": temp[5]})
ret.update({"Roll": temp[6]})
ret.update({"Pitch": temp[7]})
ret.update({"Yaw": temp[8]})
ret.update({"Hx": temp[9]})
ret.update({"Hy": temp[10]})
ret.update({"Hz": temp[11]})
ret.update({"lon": temp[12]})
ret.update({"lat": temp[13]})
ret.update({"satelite_num": temp[14]})
ret.update({"PDOP": temp[15]})
ret.update({"HDOP": temp[16]})
ret.update({"VDOP": temp[17]})
ret.update({"Temperature": temp[18]})
ret.update({"Humidity": temp[19]})
ret.update({"Battery": temp[20]})
ret.update({"ErrorCode": temp[21]})
ret.update({"Azimuth": temp[22]})
ret.update({"RunAngle": temp[23]})
ret.update({"MeasuyeGroupNum": temp[24]})
ret.update({"Tiltx": temp[25]})
ret.update({"Tilty": temp[26]})
ret.update({"Depth": temp[27]})
ret.update({"Sensor1": hex(temp[28])[2:].upper()}) # 28 27 转16进制
ret.update({"Sensor2": hex(temp[29])[2:].upper()}) # 30 29
ret.update({"Sensor3": hex(temp[30])[2:].upper()}) # 32 31
ret.update({"Measure_Num": temp[31]}) # 33
ret.update({"Measure_Interval": temp[32]}) # 34
ret.update({"Measure_Repeat": temp[33]}) # 35
# ret.update({"Byte11": temp[46]}) # 46
# ret.update({"Byte12": temp[47]}) # 47
# ret.update({"Byte13": temp[48]}) # 48
# ret.update({"Byte14": temp[49]}) # 49
# ret.update({"Byte15": temp[50]}) # 50
# ret.update({"Byte16": temp[51]}) # 51
# ret.update({"Byte17": temp[52]}) # 52
# ret.update({"Byte18": temp[53]}) # 53
# ret.update({"Byte19": temp[54]}) # 54
# ret.update({"Byte20": temp[55]}) # 55
# ret.update({"Byte21": temp[56]}) # 56
# ret.update({"Byte22": temp[57]}) # 57
# ret.update({"Byte23": temp[58]}) # 58
self.info_dict = ret
return ret
pass
def save_dict_to_file(self,info_dict: dict, fpath: Path) -> None:
temp_str = ""
for key, value in info_dict.items():
temp_str = temp_str + key + " : " + str(value) + "\n"
with open(fpath, "w+") as f:
f.write(temp_str)
def save_error_to_file(self, errlist: list, fpath: Path) -> None:
temp_str = ""
if len(errlist) <1:
return None
for errdict in errlist:
temp_str = temp_str + errdict["path"] +" : "+ errdict["error"] + "\n"
pass
with open(fpath, "w+") as f:
f.write(temp_str)
return None
pass
def getWavelenthDict( self, ) -> dict:
ret_dict = self.getRetDict()
cfg_id:dict = self.syscfg.get( int(self.device_id))
for k in ret_dict.keys():
tmp = self.getWavelength( cfg_id.get(k) )
ret_dict.update({ k : tmp })
return ret_dict
def getWavelength(self,ramsesdict:dict) -> np.ndarray:
ret = []
for i in range(1,256):
tmp = float(ramsesdict['c0s']) + float(ramsesdict['c1s'])*i \
+ float(ramsesdict['c2s'])*i*i + float(ramsesdict['c3s'])*i*i*i
ret.append(tmp)
pass
return np.array(ret)
def setSyscfg(self, syscfg:dict):
self.syscfg = syscfg
def setRetrieve(self, retrieve:dict):
log.debug( f"setRetrieve : {retrieve}......", __name__ )
self.retrieve = retrieve
self.setNewWavelength()
# self.wavelength:np.ndarray = np.arange ( self.retrieve['beginWL'], self.retrieve['endWL'], self.retrieve['interval'] )
def setNewWavelength(self, ):
self.wavelength:np.ndarray = np.arange (
self.retrieve['beginWL'], self.retrieve['endWL'], self.retrieve['interval'] )
def setDeviceID(self, did:int):
self.device_id = did
def setDeviceType(self, device_type):
self.device_type = device_type
def getErrorInfoDict(self, ):
return self.error_result
def printResult(self,):
log.info( f"***** : Print Lsky Esky Lwater Lw Rs......", __name__ )
print(self.res[self.device_enum(1)])
print(self.res[self.device_enum(2)])
print(self.res[self.device_enum(3)])
print(self.res[self.device_enum(4)])
print(self.res[self.device_enum(5)])
pass
def printTest(self,d,sleep_time:int=5):
log.info( f"***** : I am testing ********", __name__ ,"printTest")
print(d)
log.info( f"***** : Ending testing ********", __name__ ,"printTest")
time.sleep(sleep_time)
pass
if __name__ == "__main__":
# hh = HandHeld()
# hh.getDataFileList()
# hh.dealAllMeasurements()
# data/2023_02/07/sensor/14_02_46
# hhb= HandHeldBuf()
# hhb.readFile2Buf("data/2023_02/07/sensor/14_02_46")
# hhb.decode_handheld()
# print(hh.error_result)
# print("======")
# print(hh.filelist)
# print( hh.getDataFname() )
# t = b'\x07'
# print( int(t[0]))
# print( 2 << int(t[0]))
pass

@ -0,0 +1,32 @@
from myconfig import TOKEN
import wx
class Listctrl(wx.Panel):
'''
# 需要在 Frame 实例化一个实例
# 改变需要对实例化后的进行操作
'''
def __init__(self, parent ):
'''
* panel 初始化后的样子
'''
# self.para_setting = para
super(Listctrl,self).__init__(parent)
self.locale = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED)
self.SetBackgroundColour('lightgrey')
self.box = wx.BoxSizer(wx.HORIZONTAL)
self.list_ctrl = wx.ListCtrl(self, -1, style = wx.LC_REPORT | wx.LC_SORT_DESCENDING)
self.list_ctrl.SetBackgroundColour( 'lightgrey' )
self.list_ctrl.InsertColumn(0, u'测量时间', width = 180)
self.list_ctrl.InsertColumn(1, u'花粉_Pollen', width = 180)
i = 1
self.list_ctrl.SetFont( wx.Font( 11, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False ) )
self.box.Add(self.list_ctrl,1,wx.EXPAND)
self.SetSizer(self.box)
self.Fit()

File diff suppressed because one or more lines are too long

@ -0,0 +1,330 @@
#! python3
# -*- encoding: utf-8 -*-
'''
@File : myconfig.py
@Time : 2023/03/01 15:28:20
@Author : Jim @ Yiwin
@Version : 1.0
@Contact : jim@yi-win.com
@Descrip : SysConfig
'''
import yaml
from enum import Enum
from pathlib import Path
VERSION = "1.0"
LASTDATE = "2023-07-09"
COMPANY = u"奕枫仪器"
DEVICE_ID = [2]
CURRENT_DIR = Path()
DATA_DIR = Path("data")
CAL_DIR = Path("calfile")
OUTPUT_DIR = Path("data", "output")
YAML_FILE_NAME = "config.yml"
RETRIEVE_CFG_FILE = "retrieve.yml"
FILE_MARK = ['Spectrum', 'DATA']
BEGIN_WAVELENGTH = 350
END_WAVELENGTH = 950
SAVE_EXT_NAME = ".csv"
INTERVAL = 1.0
SEPARATOR = ";"
TOKEN = ";"
NEWLINE = "\n"
ROWFACTOR = 0.026
NT2FACTOR = 0.543
class DeviceType(Enum) :
AWRAMS = 1
SURFACE = 2
PROFILER = 3
class RamsesFunc(Enum):
Lsky = 1
Esky = 2
Lwater = 3
Lw = 4
Rs = 5
class RamsesAWRAMS(Enum):
Lsky = 1
Esky = 2
Lwater = 3
Lw = 4
Rs = 5
class RamsesSURFACE(Enum):
Lsky = 1
Esky = 2
Lwater = 3
Lw = 4
Rs = 5
class RamsesPROFILE(Enum):
Ed = 1
Esky = 2
Lu = 3 #upwelling
Lw = 4
Rs = 5
IP_CAL = {
"Incl_Orientation": "up",
"Incl_Xgain": 1.0,
"Incl_Xoffset": 125,
"Incl_Ygain": 0.9375,
"Incl_Yoffset": 126,
"Incl_KBG": 1.2073,
"Incl_Kref": 0.1275,
"Press_Current_mA": 1.08,
"Press_Surface_bar": 5.57,
"Press_Gain": 2.7,
"WithIncl": 1,
"WithPress": 1,
"Press_Sens_mV_bar_4mA": 71.36,
"Press_Sens_mV_bar_1mA": 17.84,
"Press_Type": "PA-10/TAB/10bar",
"CalibrationDate": "08.06.2018",
}
RAMSES_CAL = {
"SN": "",
"TYPE": "SAM", # SAMIP or SAM
"FUNC": "Lsky",
"inifile": "",
"calfile": "",
"calaqfile": "",
"backfile": "",
"samsn": "",
"b0": [],
"b1": [],
"cal": [],
"calaq": [],
"DarkPixelStart": 237,
"DarkPixelStop": 254,
"Firmware": 2.06,
"IDDataBack": "DLAB_2016-11-29_14-47-59_729_812",
"IDDataCal": "DLAB_2016-12-07_12-00-24_364_510",
"IDDataCalAQ": "DLAB_2016-12-07_12-02-43_591_545",
"IntegrationTime": 0,
"Reverse": 0,
"SerialNo_MMS": 103307,
"WavelengthRange": "310..1100",
"c0s": 299.895,
"c1s": 3.31161,
"c2s": 0.00031652,
"c3s": -1.73194e-06,
"c4s": +0.000000000E+00,
"cs": 102842,
"savefile": ""
}
class MyConfig(object):
"""
设置 ID对应的传感器
"""
def __init__(self) -> None:
self.device_id = []
self.device_type = None
self.current_device_id = None
self.system_cfg = {}
self.cfg_path = Path()
self.yml_cfg_file = YAML_FILE_NAME
self.retrieve_cfg_file = Path(RETRIEVE_CFG_FILE)
self.system_cal_cfg = {}
self.validate = { }
def addDeviceID(self, id:int) -> None: #
self.device_id.append(id)
pass
def setDeviceID(self, id:int) -> bool: #
if id in self.device_id:
self.current_device_id = id
return True
else:
self.current_device_id = None
return False
pass
def setDeviceType(self, device_type:DeviceType) -> None:
self.device_type = device_type
pass
def setRetrieveCfg(self, rtv_yml:str="") -> None:
if rtv_yml =="":
return None
self.retrieve_cfg_file = Path(rtv_yml)
pass
def getSystemCfg(self,)->None:
'''
不同系统修改此函数或添加函数 getSystemCfg***()供调用
'''
if self.current_device_id == None:
self.system_cfg = None
if self.device_type == None:
self.system_cfg = None
temp_cfg = {}
if self.device_type == DeviceType.AWRAMS:
temp_cfg = {
1: {"SN": "85B5", "FUNC": RamsesAWRAMS(1).name},
2: {"SN": "50ED", "FUNC": RamsesAWRAMS(2).name},
3: {"SN": "852F", "FUNC": RamsesAWRAMS(3).name}
}
if self.device_type == DeviceType.SURFACE:
temp_cfg = {
1: {"SN": "85B5", "FUNC": RamsesSURFACE(1).name},
2: {"SN": "50ED", "FUNC": RamsesSURFACE(2).name},
3: {"SN": "852F", "FUNC": RamsesSURFACE(3).name}
}
if self.device_type == DeviceType.PROFILE:
temp_cfg = {
1: {"SN": "85B5", "FUNC": RamsesPROFILE(1).name},
2: {"SN": "50ED", "FUNC": RamsesPROFILE(2).name},
3: {"SN": "852F", "FUNC": RamsesPROFILE(3).name}
}
self.system_cfg.update( { self.current_device_id : temp_cfg } )
pass
def setCfgRamsesSN(self, sn_cfg: dict)->None:
if len(sn_cfg) == 0:
return None
for k in self.system_cfg[self.current_device_id].keys():
if str(k) in sn_cfg.keys() :
self.system_cfg[self.current_device_id][k]["SN"] = sn_cfg[str(k)]
else:
self.system_cfg[self.current_device_id][k]["SN"] = None
# if k in sn_cfg.keys() :
# self.system_cfg[self.current_device_id][k]["SN"] = sn_cfg[k]
pass
def setSystemCalCfg(self, sn_cfg: dict)->None:
if len(sn_cfg) == 0:
pass
def getDictByAttr(self, *args) -> dict:
ret = {}
if len(args) == 0:
return ret
if len(args) == 1:
if not hasattr(self, args[0]):
return ret
tmp = getattr(self, args[0])
if isinstance(tmp, dict):
ret.update(tmp)
return ret
if len(args) == 2:
if not hasattr(self, args[0]):
return ret
if not isinstance(getattr(self, args[0]), dict):
return ret
tmp: dict = getattr(self, args[0])
if not tmp.__contains__(args[1]):
# print(f"------------{args[1]}")
return ret
tmp2 = tmp[args[1]]
if isinstance(tmp2, dict):
ret.update(tmp2)
return ret
if len(args) > 2:
return ret
pass
# 设置字典对应的键值
def set_attr(self, d: dict, k, v) -> bool:
if d.__contains__(k):
d.update({k: v})
return True
return False
def write_yaml(self, d: dict):
with open(self.yml_cfg_file, "w", encoding="utf-8") as f:
yaml.dump(d, f)
def read_yaml(self ) -> dict:
with open(self.yml_cfg_file, "r", encoding="utf-8") as f:
content = f.read() # conent 读出来是字符串
d = yaml.load(content, Loader=yaml.FullLoader) # 用load方法转字典
return d
def write_rtv_yaml(self, d: dict):
with open(self.retrieve_cfg_file, "w", encoding="utf-8") as f:
yaml.dump(d, f)
def read_rtv_yaml(self ) -> dict:
with open(self.retrieve_cfg_file, "r", encoding="utf-8") as f:
content = f.read() # conent 读出来是字符串
d = yaml.load(content, Loader=yaml.FullLoader) # 用load方法转字典
return d
def get_retrieve(self) -> dict:
retrieve = {}
retrieve.update({"beginWL": BEGIN_WAVELENGTH})
retrieve.update({"endWL": END_WAVELENGTH})
retrieve.update({"interval": INTERVAL})
retrieve.update({"rowFactor": ROWFACTOR})
return retrieve
pass
ramses_buf_str= "\
23a0000007fefe0a0781067d067d068e0693069c069c06b006b506cb06e40619076607e1076c081509cd09bb0a7d0bee0b1d0c6d0cca0ca40ddc0f30135b18b4224d320e43f852c8\
23a0000006fefe17639c71c97c9484bb89358be98e5d98b1a37eadccb66abd26be31b97db124aa18a3f29c0499349735968e93a48eea8a028bc28cec8d048f1c92c096de9ab99d43\
23a0000005fefee0a157a9ecb1b1b97dc034c507c741c7d2c65ec550c20dbde9b535ae56a60a9e2296cd8ee887278129798170c669b16503632e61605f3a5def5a8e5862561154be\
23a0000004fefe3c51f54dda4a0c48634595426a3f5a3cc539903767362b36cc351f356634b633fc32c4310630fb2ec32fe63199349037e03ac03dc03eae3c303a9639d13a413da7\
23a0000003fefe97412746bc49404caa4dc54d374ca646d63bde326b332739e43c503d2b3c363aca37ef342d32c22f782d1d2bd328ec250222101e691b2b1a7119d3184018fa174d\
23a0000002fefed3177a17e3160616f81423149313f11233126711d8103b10a40f160f8a0efb0d580d660c6f0bd80aa10a580a000ab4099b0994097109e2082c087a0736072c077d\
23a0000001fefe2a071e071607140718071e073c074d076a076e076b076007670763076c0760075c073d07350724071207fb06ef06d706cc06b706a506960684067b0672066306a2\
23a0000000fefe58065406500642064e064306470642063f064806410644064306430641064206460640063c063e063e063d064406430644063c063c063c063c06400640064906ed\
23a0000007fefe0a071b071c07260737073e0749075907650774078b07c0072c08e3082b0ada0be80d9c107b147318931ae51add1a271a77192f1bfb1d99207c265c30c738f03d53\
23a0000006fefe07438f489d4d8452d957945cff639171a5832a97deab7fbe09c86cc5acb9d5ab299e90915287de7f8b7ae275ed6f056aff664f662665bc63936335655767926879\
23a0000005fefec269206d3e724377fe7b7a8050831f85b68637881689e4884787008580823d7f887bee773d7496702a6cde654c5f895a1f570d5416514d4e9d4bde4897468c44c3\
23a0000004fefe71421640db3dc83bbb39533777346c31b92e912c152b5b2aff292129e727cb26d925fd249223b4214020da1fe91ff41f28209420dc201520071e671c221c8d1cfe\
23a0000003fefecd1dd31fe72164235924cb24b924f72331211e1ca018ef19221d121f621fe91e081ed51c761b311a2f193c18651788166015a013de11d1106e1041101810e80f2e\
23a0000002fefee50fd90fbc0f6d0ff70e610ee00d930d460de40c900c450c010cbd0b7c0b480bfc0aab0a2c0a9e094d092b09fb08d008a208990881087d083908e6078d07660747\
23a0000001fefe5b075a07500751074d074e0751075d076807730788077e077c077c07810777077a076c0765075c075607480740073607270723070d070d070b07ff06fd06f0062f\
23a0000000fefef606f106ed06f506ef06eb06f106ec06f006e906e806ed06e606ef06e506ea06ec06ee06eb06e906ee06f006ef06ea06e906e606e606e606ec06ea06ea06f506f2\
23a0000007fefe0605830479047d047e04810482048204850487048b048c04850487048c049304950498049c04a804a904b604b804c604d004e104f104190546059805ff059a06bb\
23a0000006fefe90073209ea0b7610c117cc22b2324a487b645e8798acf2c927d28dc1f2a1ac809664804e543d7a308327a321d81dab1b0f1bca1bb41dba2098243329382e773335\
23a0000005fefeca38213e544329486f4c1c500653335592564f577d573b57a556b4557e540a534451424f004d714a9b47994458410e3e9c3af8368c33b630982eca2c052b3429ae\
23a0000004fefe632763255a234821321f0e1d061b291983171e16d814a91379124b1138104b0f610e990dd80c240c880bfc0a7b0af8097709020990082508de07c507ba07a50762\
23a0000003fefe950781076407460727070007d306ab066e06270605060d0614061306fe05e805d105b405a00586057105630549053d0528051105fd04f304ee04e404dc04dd04c3\
23a0000002fefed804d904d004c604bf04b904b904b104a804a604a6049d04980496048f04970491048c04880486047e0484047a047d047b047c0478047a04760476047004700430\
23a0000001fefe6f0474046c046d0472046d047304750470046e04760472046f047604700473046f04730470047504700470046d046b047004710470046e046d046a046b046904e4\
23a0000000fefe690470046e046b046c04680468046e0466046a046a0469046b046d04640466046c046c046b046a04660466046b046c046a046a0468046f046804740471048d0417\
"
if __name__ == "__main__":
s = RamsesPROFILE
print(s(1))
print(s(2))
cfg = MyConfig()
cfg.addDeviceID(2)
cfg.addDeviceID(3)
cfg.setDeviceType(DeviceType.AWRAMS)
cfg.setDeviceID(2)
cfg.getSystemCfg()
print(cfg.system_cfg)
d = {"1":"8888","2":["7777"],"3":["9999"]}
cfg.setCfgRamsesSN(d)
print("修改后。。。。。\n")
print(cfg.system_cfg)
# cfg.write_yaml( cfg.system_cfg)
dd = cfg.read_yaml()
# dd 作为cfg.system_cfg 使用
for k,v in dd.items():
print(k)
print(type(k))
retrieve = {
"beginWL": 350,
"endWL": 950,
"interval": 1,
"rowFactor": 0.026
}

@ -0,0 +1,144 @@
import wx
import numpy as np
from enum import Enum
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas #FigureCanvasWxAgg
# from matplotlib.backends.backend_wx import NavigationToolbar2Wx as NavigationToolbar # FIgure 导航
from matplotlib.figure import Figure
class LineColor(Enum):
RED = 0
ORANGE = 1
YELLOW = 2
GREEN = 3
CYAN = 4
BLUE = 5
PURPLE = 6
class Plot(wx.Panel):
'''
# 需要在 Frame 实例化一个实例
# 改变需要对实例化后的进行操作
'''
'''
Matplotlib Panel 单独拿出来画图
可以 __do_layout
可以 __add_widgets
可以 button事件
可以鼠标事件
'''
def __init__(self,parent):
'''
* panel 初始化后的样子
'''
super(Plot,self).__init__(parent)
# 本地化语言
self.locale = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED)
self.Figure = Figure(figsize=(4,3)) # 4,3 为英寸
self.axes = self.Figure.add_axes([0.1,0.1,0.8,0.8],facecolor="lightgray") # 坐标系起始位置
self.FigureCanvas = FigureCanvas(self,-1,self.Figure)
#继承鼠标移动显示鼠标处坐标的事件
# self.FigureCanvas.mpl_connect('motion_notify_event',self.MPLOnMouseMove)
# self.NavigationToolbar = NavigationToolbar(self.FigureCanvas)
# self.StaticText = wx.StaticText(self,-1,label=u'坐标信息')
# self.SubBoxSizer = wx.BoxSizer(wx.HORIZONTAL)
# self.SubBoxSizer.Add(self.NavigationToolbar,proportion =0, border = 2,flag = wx.ALL | wx.EXPAND)
# self.SubBoxSizer.Add(self.StaticText,proportion =-1, border = 2,flag = wx.ALL | wx.EXPAND)
self.TopBoxSizer = wx.BoxSizer(wx.VERTICAL)
# self.TopBoxSizer.Add(self.SubBoxSizer,proportion =-1, border = 2,flag = wx.ALL | wx.EXPAND)
self.TopBoxSizer.Add(self.FigureCanvas,proportion =-10, border = 2,flag = wx.ALL | wx.EXPAND)
self.SetSizer(self.TopBoxSizer)
self.purewater_legend = (" Rs"
,"Wavelength (nm)"
," Rs " )
self.measure_legend = (" Rs"
,"Wavelength (nm)"
," Rs" )
def set_axes_title(self,title):
self.axes.set_title(title)
def set_axes_xlabel(self,x):
self.axes.set_xlabel(x)
def set_axes_ylable(self,y):
self.axes.set_ylabel(y)
def set_title_x_y(self,title, x, y):
self.axes.set_title(title)
self.axes.set_xlabel(x)
self.axes.set_ylabel(y)
def plot_one( self, time_, wavelength:np.ndarray, data:np.ndarray, color="green" ):
self.axes.plot(wavelength, data, color=color, linewidth=0.5 , label=time_ )
self.axes.legend( )
self.axes.grid( True )
self.FigureCanvas.draw()
def plot_multi( self, tm, wavelength:np.ndarray, data:np.ndarray ):
len_ = len(data)
for i in range(len_):
self.axes.plot(wavelength, data[i], color=LineColor(i).name.lower(), linewidth=0.5 , label=tm[i] )
self.axes.legend( )
self.axes.grid(True)
self.FigureCanvas.draw()
def clear_past( self, ):
self.axes.clear()
class MyPanel(wx.Panel):
"""docstring for MyPanel."""
def __init__(self, *arg, **kwarg):
super(MyPanel, self).__init__( *arg,**kwarg)
self.SetBackgroundColour("#F2F2F2")
self.sb = wx.StaticBox( self, label='系统信息', pos = (30,30) )
self.sbs = wx.StaticBoxSizer( self.sb, orient=wx.VERTICAL )
self.vbox1 = wx.BoxSizer(wx.VERTICAL)
self.staticText0 = wx.StaticText(self , label='',size=(60, 30), style=wx.ALIGN_CENTRE_VERTICAL )
self.staticText1 = wx.StaticText(self, -1,size=(600, -1),
label='''\n上海奕枫仪器设备有限公司
\n电话: 021-54270075
\n网站: http://www.yi-win.com
\n邮件: sales@yi-win.com
\n描述: 手持式数据处理 ''' )
self.vbox1.Add(self.staticText0, flag=wx.TOP|wx.LEFT, border=5)
self.vbox1.Add(self.staticText1, flag=wx.TOP|wx.LEFT, border=5)
# self.hbox1.Add(self.staticText1, flag=wx.TOP|wx.LEFT, border=5)
# self.hbox1.Add(self.textCtrl1, flag=wx.TOP|wx.LEFT, border=5)
self.sbs.Add(self.vbox1, flag=wx.TOP|wx.LEFT, border= 5)
self.SetSizer(self.sbs)
# self.SetBackgroundColour("#F2F2F2")
# self.vbox = wx.BoxSizer(wx.VERTICAL)
# # self.vbox.Add(num1, proportion=0, border=8, flag=wx.LEFT)
# self.sb = wx.StaticBox(self, label='信息')
# self.sbs = wx.StaticBoxSizer(self.sb, orient=wx.VERTICAL)
# self.staticText1 = wx.StaticText(self, -1,
# label='''\n上海奕枫仪器设备有限公司
# \n电话: 021-54270075
# \n网站: http://www.yi-win.com
# \n邮件: sales@yi-win.com ''' )
# self.vbox.Add(self.sbs)
# self.sbs.Add(self.vbox)
# self.SetSizer(self.vbox)
def setStaticText(self, msg:str):
self.staticText1.SetLabel(msg)

@ -0,0 +1,125 @@
import threading
import time
class Mythead(threading.Thread):
'''线程守护'''
def __init__(self ):
super(Mythead, self).__init__()
pass
def set_task(self, func, *args):
self.func = func
self.args = args
def run(self):
# print(f" --- {len(self.args)}")
if len(self.args) > 0:
self.func(self.args)
else:
self.func( )
class Multithread(threading.Thread):
''' 多线程
子线程.join() -> ( 设置在start之后, 等所有阻塞线程运行完, 再运行主线程 )
子线程.setDaemon(True) -> 设置子线程A为守护线程, 主线程所在的进程内所有非守护线程统统运行完毕,
无论子线程A有没有结束, 程序都结束
Method:
'''
def __init__(self):
super(Multithread, self).__init__()
self.__tasks = []
self.act = []
# self.__block = False
pass
# def set_task( self, tasks ):
# self.__tasks = tasks
def add_task(self, func, daemon=False, join=True,args=()):
tmp_dict = {}
tmp_dict.update( {"func" : func})
if daemon == True:
tmp_dict.update( {"daemon" : True})
else:
tmp_dict.update( {"daemon" : False})
if join == True:
tmp_dict.update( {"join" : True})
else:
tmp_dict.update( {"join" : False})
if args == ():
tmp_dict.update( {"args" : ()})
else:
tmp_dict.update( {"args" : args})
self.__tasks.append( tmp_dict )
def remove_tasks(self, ):
self.__tasks = []
self.act = []
def add_task_2_act(self, task):
t = threading.Thread( target = task['func'], args = task['args'] )
self.act.append(t)
t.start()
def execute_one_act(self,i):
if self.__tasks[i]['join']:
self.act[i].join() # 子线程阻塞完毕再运行主线程
pass
def prepare_tasks(self):
self.act = []
for task in self.__tasks:
self.add_task_2_act(task)
def execute_tasks(self):
try:
for i in range( len(self.act) ):
self.execute_one_act( i )
pass
except Exception as e:
print(e)
def prepare_tasks(self):
self.act = []
for task in self.__tasks:
t = threading.Thread( target = task['func'], args = task['args'] )
self.act.append(t)
t.start()
def simultaneously_execute_tasks(self):
self.prepare_tasks()
self.execute_tasks()
def sequently_execute_tasks(self):
for task in self.__tasks:
t = threading.Thread( target = task['func'], args = task['args'] )
t.start()
t.join()
def t1(self):
print("thread1...")
time.sleep(10)
print("thread1... after sleep...")
def t2(self):
print("thread2...")
time.sleep(5)
print("thread2... after sleep...")
def t3(self):
print("thread3...")
time.sleep(3)
print("thread3... after sleep...")
if __name__ == '__main__':
mt = Multithread()
mt.add_task(mt.t1)
mt.add_task(mt.t2)
mt.add_task(mt.t3)
# mt.prepare_tasks() # 线程同步运行
# mt.execute_tasks()
# mt.simultaneously_execute_tasks()
mt.sequently_execute_tasks()

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -2,3 +2,4 @@ beginWL: 350
endWL: 950
interval: 1
rowFactor: 0.026
n_t_square: 0.543

@ -0,0 +1,11 @@
class TCPIPException(Exception):
def __init__(self, message="TCPIP 自定义异常"):
self.message = "TCPIP exception : " + message
class SerialException(Exception):
def __init__(self, message="Serial 自定义异常"):
self.message = "serial exception : " + message
class MyException(Exception):
def __init__(self, message=" 自定义异常"):
self.message = "自定义异常: " + message

@ -0,0 +1,285 @@
# coding=utf-8
'''
单例模式日志 -- 使用一次关闭 handler
这种方法优缺点
缺点 输出的format 需要自己定义 并过滤
过滤要看是否以什么开头或包含什么
优点 不占用文件资源占用系统资源小
调用 log.info( ) log.error()
'''
import logging
import logging.handlers
import os
import time
import threading
# from config import LOG_PATH,LOG_LEVEL,LOG_ENABLED,LOG_FORMAT, \
# LOG_TO_CONSOLE,LOG_TO_FILE
MY_LOGGER_NAME = "DefaultLogger"
LOG_ENABLED = True # 是否启用日志
LOG_TO_CONSOLE = True # 是否启用控制台输出日志
LOG_TO_FILE = False # 是否启用文件输出
LOG_COLOR_ENABLE = True # 是否启用颜色日志
LOGGER_DIR = "logs"
LOGGER_PATH = os.path.join( os.path.dirname(__file__), LOGGER_DIR )
LOGGER_FILENAME = os.path.join( LOGGER_PATH, 'logs.log' )
"""
logging.INFO , logging.DEBUG , logging.WARNING , logging.ERROR ,
"""
LOG_LEVEL = logging.INFO # 日志等级DEBUG INFO WARNIG ERROR
# LOG_LEVEL = logging.DEBUG
# LOG_LEVEL = logging.WARNING
"""
# LOG_FORMAT = " %(name)s - %(module)s - %(filename)s - %(lineno)d | %(levelname)s : %(message)s"
# LOG_FORMAT = "%(levelname)s - %(asctime)s - process: %(process)d - threadname: %(thread)s " \
# "- %(filename)s - %(funcName)s - %(lineno)d - %(module)s " \
# "- %(message)s "
# LOG_FORMAT = "%(asctime)s - %(thread)s " \
# "- %(levelname)s ::: %(message)s "
# '[%(asctime)s] |%(thread)s| %(levelname)-6s: %(message)s'
# fm = '%(levelname):%(levelno)s:%(name)s:%(funcName)s:%(asctime):%(pathname):%(filename):%(module):%(thread):%(threadName)'
# 此处日志颜色,修改日志颜色是通过 Filter实现的
"""
LOG_FORMAT = '%(levelname)s\t[%(asctime)s] %(package)s:%(classname)s:%(funcname)s \t>> %(message)s'
"""
# 此处日志颜色,修改日志颜色是通过 Filter实现的
"""
LOG_FORMAT_COLOR_DICT = {
'ERROR' : "\033[31mERROR\033[0m",
'INFO' : "\033[36mINFO\033[0m",
'DEBUG' : "\033[1mDEBUG\033[0m",
'WARN' : "\033[33mWARN\033[0m",
'WARNING' : "\033[33mWARNING\033[0m",
'CRITICAL': "\033[35mCRITICAL\033[0m",
}
"""
# Filter 用法, 以package class function 过滤 __package__ __class__
# log.error( f"{__package__}::{__class__.__name__}::{sys._getframe().f_code.co_name} >> ")
# log.error( f"PacakgeName::ClassName::FunctionName:: ")
# LOGGER_FILTER_PACKAGE=[] 为空, 则Filter不起作用
# 不为空,则只显示定义的报名
# LOGGER_FILTER_CLASS=[] 为空, 则Filter不起作用
# 不为空,则只显示定义的类或
# LOGGER_FILTER_FUNCNAME=[] 为空, 则Filter不起作用
# 不为空,则只显示定义的函数
"""
# LOGGER_FILTER_PACKAGE = [ "test_logger" ] # 包名,文件名去 .py??
LOGGER_FILTER_PACKAGE = [ ]
LOGGER_FILTER_CLASS = [ ] # 类名,文件名去 .py??
# LOGGER_FILTER_CLASS = [ "LogTest" ]
# LOGGER_FILTER_FUNCNAME = [ "test1","test" ] # 函数名
LOGGER_FILTER_FUNCNAME = [ ]
LOGGER_FILTER_LEVELNAME = [ ] # INFO DEBUG WARNING
class PackageFilter(logging.Filter):
def __init__(self, filter_word:list = []):
self.filter_word = filter_word
pass
def filter(self, record: logging.LogRecord) -> bool:
if self.filter_word is not None:
return record.package in self.filter_word
class ClassFilter(logging.Filter):
def __init__(self, filter_word:list = []):
self.filter_word = filter_word
pass
def filter(self, record: logging.LogRecord) -> bool:
if self.filter_word is not None:
return record.classname in self.filter_word
pass
class FunctionFilter(logging.Filter):
def __init__(self, filter_word:list = []):
self.filter_word = filter_word
pass
def filter(self, record:logging.LogRecord) -> bool:
if self.filter_word is not None:
return record.funcname in self.filter_word
class LevelNameFilter(logging.Filter):
def __init__(self, filter_word:list = []):
self.filter_word = filter_word
pass
def filter(self, record:logging.LogRecord) -> bool:
if self.filter_word is not None:
return record.levelname in self.filter_word
class ColorFilter(logging.Filter):
def __init__(self,):
pass
def filter(self, record: logging.LogRecord) -> bool:
record.levelname = LOG_FORMAT_COLOR_DICT.get(record.levelname)
return True
class Log(object):
_instance_lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if not hasattr(Log, "_instance"):
with Log._instance_lock:
if not hasattr(Log, "_instance"):
Log._instance = object.__new__(cls)
return Log._instance
def __init__(self, loggername = "DefaultLog" ):
# 文件命名 os.path.join(): 将多个路径组合后返回
self.logger_filepath = LOGGER_FILENAME
self.loggername = loggername
self.level = LOG_LEVEL
# 日志输出格式
fm = LOG_FORMAT
self.formatter = logging.Formatter( fm )
# 生成记录器对象
self.logger = logging.getLogger( self.loggername )
self.logger.setLevel(LOG_LEVEL)
# 日志过滤
self.__add_filter()
def __console(self, level, message, extra={} ):
# 添加 handler
self.__add_handler()
# 判断日志级别
if level == logging.INFO:
self.logger.info( message, extra=extra)
elif level == logging.DEBUG:
self.logger.debug(message,extra=extra)
elif level == logging.WARNING:
self.logger.warning(message,extra=extra)
elif level == logging.ERROR:
self.logger.error(message,extra=extra)
# removeHandler在记录日志之后移除句柄,避免日志输出重复问题
self.__remove_handler()
# if LOG_TO_FILE and self.file_handler:
# self.logger.removeHandler(self.file_handler)
# # 关闭打开的文件
# self.file_handler.close()
# if LOG_TO_CONSOLE and self.stream_handler:
# self.logger.removeHandler(self.stream_handler)
# # 关闭打开的文件
# self.stream_handler.close()
pass
# debug < info< warning< error< critical
# debug模式
def debug(self, message, package="Unknown", classname="Unknown", funcname="Unknown" ):
self.__console(logging.DEBUG, message, extra={"package":package, "classname":classname, "funcname":funcname} )
# self.__remove_handler()
# info模式
def info(self, message, package="Unknown", classname="Unknown", funcname="Unknown" ):
self.__console(logging.INFO, message, extra={"package":package, "classname":classname, "funcname":funcname} )
# self.__remove_handler()
# warning模式
def warning(self, message, package="Unknown", classname="Unknown", funcname="Unknown"):
self.__console(logging.WARNING, message, extra={"package":package, "classname":classname, "funcname":funcname} )
# self.__remove_handler()
# error模式
def error(self, message, package="Unknown", classname="Unknown", funcname="Unknown"):
self.__console(logging.ERROR, message, extra={"package":package, "classname":classname, "funcname":funcname} )
# self.__remove_handler()
def __add_filter(self ):
if len( LOGGER_FILTER_PACKAGE ) > 0 :
self.logger.addFilter( PackageFilter( filter_word=LOGGER_FILTER_PACKAGE ) )
if len( LOGGER_FILTER_CLASS ) > 0 :
self.logger.addFilter( ClassFilter( filter_word=LOGGER_FILTER_CLASS ) )
if len( LOGGER_FILTER_FUNCNAME ) > 0 :
self.logger.addFilter( FunctionFilter( filter_word=LOGGER_FILTER_FUNCNAME ) )
if len(LOGGER_FILTER_LEVELNAME) > 0 :
self.logger.addFilter( LevelNameFilter( filter_word=LOGGER_FILTER_LEVELNAME ) )
def __add_handler(self ):
if LOG_ENABLED and LOG_TO_FILE:
# 考虑使用 RotatingFileHandler TimedRotatingFileHandler防止日志过大
# RotatingFileHandler("test", "a", 4096, 2, "utf-8")
# TimedRotatingFileHandler(filename=LOG_PATH+"thread_", when="D", interval=1, backupCount=7)
self.file_handler = logging.handlers.TimedRotatingFileHandler(filename=self.logger_filepath, when='D', interval=1, backupCount=30, encoding='utf-8')
# self.file_handler = logging.FileHandler( self.logger_filepath, encoding='utf-8' )
self.file_handler.setFormatter( self.formatter )
# self.file_handler.setLevel( LOG_LEVEL )
# if LOG_COLOR_ENABLE: # 文件日志无需加彩色
# self.file_handler.addFilter( ColorFilter( ) )
self.logger.addHandler(self.file_handler)
if LOG_ENABLED and LOG_TO_CONSOLE:
# 创建一个StreamHandler,用于输出到控制台
self.stream_handler = logging.StreamHandler()
self.stream_handler.setFormatter(self.formatter)
# self.stream_handler.setLevel( LOG_LEVEL )
if LOG_COLOR_ENABLE:
self.stream_handler.addFilter( ColorFilter( ) )
self.logger.addHandler(self.stream_handler)
def __remove_handler(self ):
if LOG_TO_FILE and self.file_handler:
self.logger.removeHandler(self.file_handler)
if len(self.logger.handlers)>0:
self.logger.handlers.pop()
# 关闭打开的文件
self.file_handler.close()
if LOG_TO_CONSOLE and self.stream_handler:
self.logger.removeHandler(self.stream_handler)
if len(self.logger.handlers)>0:
self.logger.handlers.pop()
# 关闭控制台
self.stream_handler.close()
def __remove_handler2(self ):
if LOG_ENABLED and LOG_TO_CONSOLE:
self.logger.removeHandler(self.stream_handler)
self.logger.handlers.pop()
# 关闭控制台
self.stream_handler.close()
if LOG_ENABLED and LOG_TO_FILE:
self.logger.removeHandler(self.file_handler)
self.logger.handlers.pop()
# 关闭打开的文件
self.file_handler.close()
log = Log( loggername = "DefaultLog")
"""
filename: 指定日志文件名
filemode: 和file函数意义相同指定日志文件的打开模式wa
format: 指定输出的格式和内容format可以输出很多有用信息显示的条目可以是以下内容
%(levelname) 日志级别的名字格式
%(levelno)s 日志级别的数字表示
%(name)s 日志名字 loggername
%(funcName)s 函数名字
%(asctime) 日志时间可以使用datefmt去定义时间格式如上图
%(pathname) 脚本的绝对路径
%(filename) 脚本的名字
%(module) 模块的名字
%(thread): thread id
%(threadName) 线程的名字
"""
"""
文件名行号 函数名, 要在调用的时候想办法了
# 绝对路径
print( __file__ )
print( sys.argv[0] )
# 文件名
print( os.path.basename(__file__) )
print( os.path.basename(sys.argv[0]) )
self.__class__.__name__
self.__class__.__name__, get_current_function_name()
logger名 __name__
"""

@ -0,0 +1,265 @@
from pathlib import PurePath, Path
# from myconfig import NEWLINE,TOKEN,SEPARATOR
"""
"""
class MyDir(object):
"""
操作方法:设置base tuple_dir header
设置的是路径, 文件名要 ifNotNewFile 传入
"""
def __init__(self) -> None:
self.base_dir = Path()
self.dir_tuple = ()
self.header = []
self.header_str = ""
self.content = []
self.content_str = ""
self.current_dir = None
self.current_filepath = None
pass
def getDir(self,):
return self.current_dir
pass
def setBaseDir(self, dir: Path):
self.base_dir = dir
self.current_dir = self.base_dir
pass
def setDir(self, t:tuple=()):
self.dir_tuple = t
if len(self.dir_tuple) == 0 :
self.current_dir = self.base_dir
else:
self.current_dir = self.base_dir.joinpath( *t )
pass
def getDirFromBaseAndTuple(self, base_dir:Path, dir_tuple: tuple):
'''外部调用返回路径'''
ret_path = base_dir
t = dir_tuple
if len(t) == 0 :
ret_path = ret_path
else:
ret_path = ret_path.joinpath( *t )
return ret_path
pass
def setHeader(self, headerlist:list, headerSeperator: str = ";", headerinfo: str = None):
header_str = ""
if len(headerlist) == 0:
return
if headerinfo != None:
header_str = headerinfo + headerSeperator
for hl in headerlist:
header_str = header_str + str(hl) + headerSeperator
self.header_str = header_str[:-1]
pass
def setContent(self, contentlist: list, contentSeperator: str = ";", contentinfo: str = None):
content_str = ""
if len(contentlist) == 0:
return
if contentinfo != None:
content_str = contentinfo + contentSeperator
tmp_str = ""
for cl in contentlist:
tmp_str = tmp_str + str(cl) + contentSeperator
self.content_str = content_str + tmp_str[:-1]
pass
def newDirIfNot(self,) -> None:
# self.current_path = self.base_path.joinpath(self.path_tuple)
self.current_dir.mkdir(parents=True, exist_ok=True)
pass
def newFileIfNot(self, fname: str) -> None:
self.newDirIfNot()
self.current_filepath = self.current_dir.joinpath(fname)
if not self.current_filepath.exists():
with open(self.current_filepath, 'a') as f:
pass
return
pass
def getCurrentFileSize(self,):
return self.current_filepath.stat().st_size
def getFirstline(self,):
first_line = ""
with open(self.current_filepath, 'r') as f: # 打开文件
first_line = f.readline() # 取第一行
return first_line.strip('\n').strip('\r')
def checkHeader(self,) -> int:
'''
返回:
0 : 文件为空,可以直接写header
1 : header对应上 无需处理
-1: 需要提醒用户保存数据后,删除文件后再处理
'''
if self.getCurrentFileSize() == 0:
return 0
first_line = self.getFirstline()
# print(f"firstline: {first_line}" )
# print(f"header_str: {self.header_str}" )
if first_line == self.header_str:
return 1
return -1
pass
def writeHeader(self,) -> None:
with open(self.current_filepath, "a") as f:
f.write(self.header_str)
return None
pass
def writeContent(self,new_line="\n") -> None:
with open(self.current_filepath, "a") as f:
f.write(new_line+self.content_str)
return None
pass
def is_dir_empty(self, ):
'''文件夹是否为空'''
has_next = next(self.current_dir.iterdir(), None)
if has_next is None:
return True
return False
def is_file_empty(self,):
'''文件是否为空'''
if self.current_dir.stat().st_size ==0:
return True
return False
def deleteDir(self,):
'''文件夹是否为空'''
try:
if self.current_dir.exists():
self.current_dir.rmdir()
except OSError as e:
raise Exception(e)
return True
## 其他需求
def get_child_dir(self,) -> list:
ret = []
tmp_dir = self.current_dir.glob("**/")
for td in tmp_dir:
if td.is_dir():
ret.append(td.relative_to(self.current_dir))
return ret
pass
def get_child_dir_only(self,) -> list:
ret = []
for d in self.current_dir.iterdir():
if d.is_dir():
ret.append(d.relative_to(self.current_dir))
return ret
pass
def get_files_from_currentdir(self, fmt:str="*/*" ) -> list:
'''fmt: * */* */*/*'''
ret = []
tmp_dir = self.current_dir.glob(fmt)
print(tmp_dir)
for td in tmp_dir:
if td.is_file():
ret.append(td)
return ret
pass
def sort_dir_and_check( self, dirs:list ):
'''相对目录排序,目录最后一级'''
ret = []
if len(dirs) == 0:
return ret
tmp = {}
tmp_lst = []
for d in dirs:
last:str = d.parts[-1]
if last.isdigit() :
tmp.update( {last:d} )
tmp_lst.append(int(last))
pass
tmp_lst.sort()
for t in tmp:
ret.append(tmp.get(str(t)))
pass
return ret
def sort_filepath_and_check(self, path_files:list):
'''相对目录排序,目录最后一级'''
ret = []
if len(path_files) == 0:
return ret
tmp = {}
tmp_lst = []
for d in path_files:
last:str = d.stem
if last.isdigit() :
tmp.update( {last:d} )
tmp_lst.append(int(last))
pass
tmp_lst.sort()
for t in tmp:
ret.append(tmp.get(str(t)))
pass
return ret
def group_and_sort_filepath(self,path_files:list):
ret = {}
# dirs_lst = []
# len_files = len(path_files)
# if len_files == 0:
# return False
# for pf in path_files:
# pf_dir:str = pf.parts[-2]
# if pf_dir.isdigit() and int(pf_dir) not in dirs_lst:
# dirs_lst.append( int(pf_dir) )
# dirs_lst.sort()
def check_dirs(self, dirs:list, begin:int =0, step:int=1):
'''检查目录是否从begin开始递增'''
len_dirs = len(dirs)
if len_dirs == 0:
return False
for i in range(begin,len_dirs,step) :
if dirs[i].parts[-1] != str(i) :
return False
return True
def check_path_files(self,path_files:list,begin:int =0, step:int=1):
'''检查文件名从begin开始递增'''
len_files = len(path_files)
if len_files == 0:
return False
for i in range(begin,len_files,step) :
if path_files[i].stem != str(i) :
return False
return True
if __name__ == "__main__":
mp = MyDir()
mp.setBaseDir(Path())
print(mp.current_dir)
# t = ("test_dir","1","11")
t = ("test_dir", )
mp.setDir( t )
print(mp.current_dir)
cd = mp.get_child_dir_only()
c = mp.sort_dir_and_check(cd)
print(cd )
print(c )

@ -0,0 +1,66 @@
from datetime import datetime, timedelta
# import locale
# locale.setlocale(locale.LC_ALL, '')
TIME_STR = "2022-06-10 16:16:16"
STD_TIME_STR_FMT = "%Y-%m-%d %H:%M:%S" # 小写y是两位年份
CUR_TIME_STR_FMT = "%Y-%m-%d %H:%M:%S"
class MyTime(object):
"""
操作方法:设置base tuple_path header
"""
def __init__(self) -> None:
self.cur_time_str_fmt = "%Y-%m-%d %H:%M:%S"
self.std_time_str_fmt = "%Y-%m-%d %H:%M:%S"
self.cur_time_str = ""
self.std_time_str = ""
self.cur_datetime = ""
pass
def setCurrentTimeStrFmt(self, s):
self.cur_time_str_fmt = s
pass
def setStdTimeStrFmt(self, s):
self.std_time_str_fmt = s
pass
def setCurrentTimeStr(self, s):
self.cur_time_str = s
self.cur_datetime = datetime.strptime(self.cur_time_str, self.cur_time_str_fmt)
pass
def setStdTimeStr(self, s):
self.std_time_str = s
self.cur_datetime = datetime.strptime(
self.std_time_str, STD_TIME_STR_FMT)
pass
def Current2STD(self):
# self.cur_datetime = datetime.strptime(self.cur_time_str , CUR_TIME_STR_FMT)
self.std_time_str = datetime.strftime(
self.cur_datetime, STD_TIME_STR_FMT)
pass
def STD2Current(self, format: str):
# self.cur_datetime = datetime.strptime(self.std_time_str , STD_TIME_STR_FMT)
self.cur_time_str = datetime.strftime(
self.cur_datetime, CUR_TIME_STR_FMT)
pass
def timeDelta(self, days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0):
self.cur_datetime = self.cur_datetime + \
timedelta(days=0, seconds=0, microseconds=0,
milliseconds=0, minutes=0, hours=0, weeks=0)
pass
if __name__ == "__main__":
s = "2023-02-07 14:02:46"
mt = MyTime()
mt.setCurrentTimeStr(s)
print(mt.cur_datetime)
pass

@ -0,0 +1,100 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import wx
# from configobj import ConfigObj
from myconfig import MyConfig
from myconfig import YAML_FILE_NAME
class UI_Plot_Setting(wx.Dialog):
"""
@description : 绘图 配置
"""
def __init__(self, parent, id):
# 串口页面配置
super(UI_Plot_Setting, self).__init__( parent ,id = id )
self.config = MyConfig()
self.InitUI()
self.SetSize((400, 400))
self.SetTitle(" 绘图 序列号 ")
def InitUI(self):
self.config_yml = self.config.read_rtv_yaml()
self.panel = wx.Panel(self)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.sb = wx.StaticBox(self.panel, label='指定绘图设置 ')
self.sbs = wx.StaticBoxSizer(self.sb, orient=wx.VERTICAL)
self.hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.staticText1 = wx.StaticText(self.panel, label='起始行号 ',size=(60, -1), style=wx.ALIGN_CENTRE_VERTICAL )
self.textCtrl1 = wx.TextCtrl(self.panel, value="",size=(250,25) )
tmp = self.get_str_from_config( "LineBegin" )
if tmp is not None:
self.textCtrl1.SetValue(tmp)
self.hbox1.Add(self.staticText1, flag=wx.TOP|wx.LEFT, border=5)
self.hbox1.Add(self.textCtrl1, flag=wx.TOP|wx.LEFT, border=5)
self.sbs.Add(self.hbox1, flag=wx.TOP|wx.LEFT, border= 5)
self.hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.staticText2 = wx.StaticText(self.panel, label='间隔行号: ' ,size=(60, -1))
# self.staticText2_1 = wx.StaticText(self.panel, label='分钟 ' ,size=(60, -1))
self.textCtrl2 = wx.TextCtrl(self.panel, value="",size=(250,25))
tmp = self.get_str_from_config( "LineInterval" )
if tmp is not None:
self.textCtrl2.SetValue(tmp)
self.hbox2.Add(self.staticText2, flag=wx.TOP|wx.LEFT, border=5)
self.hbox2.Add(self.textCtrl2,flag=wx.TOP|wx.LEFT, border=5)
# self.hbox2.Add(self.staticText2_1, flag=wx.TOP|wx.LEFT, border=5)
self.sbs.Add(self.hbox2, flag=wx.TOP|wx.LEFT, border=5)
self.panel.SetSizer(self.sbs)
self.hbox_0 = wx.BoxSizer(wx.HORIZONTAL)
self.okButton = wx.Button(self, label=u'保存配置')
self.closeButton = wx.Button(self, label='Close')
self.hbox_0.Add(self.okButton)
self.hbox_0.Add(self.closeButton, flag = wx.LEFT, border=5)
# 添加 vbox 到panel
self.vbox.Add(self.panel, proportion=1,
flag=wx.ALL | wx.EXPAND, border=5)
self.vbox.Add(self.hbox_0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizer(self.vbox)
self.okButton.Bind(wx.EVT_BUTTON, self.OnSave)
self.closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
def get_str_from_config( self, key ):
return str(self.config_yml[key])
pass
def set_config_by_key_val( self, key, val ):
# print(f" {key} current type {type( self.config_yml[section][key] )}")
if type( self.config_yml [key] ) == int:
self.config_yml [key] = int(val)
elif type( self.config_yml [key] ) == float:
self.config_yml [key] = float(val)
else:
self.config_yml[key] = val
pass
def saveData(self, e):
pass
def OnClose(self, e):
self.Destroy()
def OnSave(self, e):
success = True
# 赋值字典,写入文件
self.set_config_by_key_val( "LineBegin",self.textCtrl1.GetValue( ))
self.set_config_by_key_val( "LineInterval",self.textCtrl2.GetValue( ))
self.config.write_rtv_yaml(self.config_yml)
del self.config
if success:
self.EndModal(wx.ID_OK)

@ -0,0 +1,60 @@
import wx
# 设置串口参数的对话框类
class About(wx.Dialog):
def __init__(self, *args, **kwds):
# 参数调入后初始化
super(About, self).__init__(*args, **kwds)
self.InitUI()
self.SetSize((400, 400))
self.SetTitle("使用帮助")
def InitUI(self):
self.panel = wx.Panel(self)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.sb = wx.StaticBox(self.panel, label='使用帮助')
self.sbs = wx.StaticBoxSizer(self.sb, orient=wx.VERTICAL)
self.hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.staticText1 = wx.StaticText(self.panel,
label='''\n上海奕枫仪器设备有限公司
电话: 021-54270075
网站: http://www.yi-win.com
邮件: sales@yi-win.com ''' )
self.hbox1.Add(self.staticText1)
self.sbs.Add(self.hbox1)
self.panel.SetSizer(self.sbs)
self.hbox_0 = wx.BoxSizer(wx.HORIZONTAL)
self.okButton = wx.Button(self, label=u'确认')
self.closeButton = wx.Button(self, label='关闭')
self.hbox_0.Add(self.okButton)
self.hbox_0.Add(self.closeButton, flag=wx.LEFT, border=5)
self.vbox.Add(self.panel, proportion=1,
flag=wx.ALL | wx.EXPAND, border=5)
self.vbox.Add(self.hbox_0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizer(self.vbox)
self.okButton.Bind(wx.EVT_BUTTON, self.OnSave)
self.closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
def saveData(self, e):
pass
def OnClose(self, e):
self.Destroy()
def OnSave(self, e):
self.EndModal(wx.ID_OK)

@ -0,0 +1,58 @@
import wx
# 设置串口参数的对话框类
class Help(wx.Dialog):
def __init__(self, *args, **kwds):
# 参数调入后初始化
super(Help, self).__init__(*args, **kwds)
self.InitUI()
self.SetSize((400, 400))
self.SetTitle("使用帮助")
def InitUI(self):
self.panel = wx.Panel(self)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.sb = wx.StaticBox(self.panel, label='使用帮助')
self.sbs = wx.StaticBoxSizer(self.sb, orient=wx.VERTICAL)
self.hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.staticText1 = wx.StaticText(self.panel,
label='''\n上海奕枫仪器设备有限公司
电话: 021-54270075
网站: http://www.yi-win.com
邮件: sales@yi-win.com ''' )
self.hbox1.Add(self.staticText1)
self.sbs.Add(self.hbox1)
self.panel.SetSizer(self.sbs)
self.hbox_0 = wx.BoxSizer(wx.HORIZONTAL)
self.okButton = wx.Button(self, label=u'确认')
self.closeButton = wx.Button(self, label='关闭')
self.hbox_0.Add(self.okButton)
self.hbox_0.Add(self.closeButton, flag=wx.LEFT, border=5)
self.vbox.Add(self.panel, proportion=1,
flag=wx.ALL | wx.EXPAND, border=5)
self.vbox.Add(self.hbox_0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizer(self.vbox)
self.okButton.Bind(wx.EVT_BUTTON, self.OnSave)
self.closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
def saveData(self, e):
pass
def OnClose(self, e):
self.Destroy()
def OnSave(self, e):
self.EndModal(wx.ID_OK)

@ -0,0 +1,124 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import wx
# from configobj import ConfigObj
from myconfig import MyConfig,RamsesSURFACE
from myconfig import YAML_FILE_NAME
class UISensor(wx.Dialog):
"""
@description : Sensor 配置
"""
def __init__(self, parent, id, did):
# 参数调入后初始化
self.did = did
super(UISensor, self).__init__( parent, id=id )
self.config = MyConfig()
self.InitUI()
self.SetSize((400, 400))
self.SetTitle(" 设置页面 串口 采集间隔 ")
def InitUI(self):
self.config_sensor = self.config.read_yaml()
# self.sensor = self.config_sensor.get(self.did)
# print(self.config_sensor)
# print(self.sensor)
self.panel = wx.Panel(self)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.sb = wx.StaticBox(self.panel, label='设置页面')
self.sbs = wx.StaticBoxSizer(self.sb, orient=wx.VERTICAL)
self.hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.staticText1 = wx.StaticText(self.panel, label='Lsky: ',size=(60, -1), style=wx.ALIGN_CENTRE_VERTICAL )
self.textCtrl1 = wx.TextCtrl(self.panel, value="",size=(250,25) )
tmp = self.getSnByDidAndFunc("Lsky",self.did)
if tmp is not None:
self.textCtrl1.SetValue(tmp)
self.hbox1.Add(self.staticText1, flag=wx.TOP|wx.LEFT, border=5)
self.hbox1.Add(self.textCtrl1, flag=wx.TOP|wx.LEFT, border=5)
self.sbs.Add(self.hbox1, flag=wx.TOP|wx.LEFT, border= 5)
self.hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.staticText2 = wx.StaticText(self.panel, label='Esky: ' ,size=(60, -1))
# self.staticText2_1 = wx.StaticText(self.panel, label='分钟 ' ,size=(60, -1))
self.textCtrl2 = wx.TextCtrl(self.panel, value="",size=(250,25))
tmp = self.getSnByDidAndFunc("Esky",self.did)
if tmp is not None:
self.textCtrl2.SetValue(tmp)
self.hbox2.Add(self.staticText2, flag=wx.TOP|wx.LEFT, border=5)
self.hbox2.Add(self.textCtrl2,flag=wx.TOP|wx.LEFT, border=5)
# self.hbox2.Add(self.staticText2_1, flag=wx.TOP|wx.LEFT, border=5)
self.sbs.Add(self.hbox2, flag=wx.TOP|wx.LEFT, border=5)
self.hbox3 = wx.BoxSizer(wx.HORIZONTAL)
self.staticText3 = wx.StaticText(self.panel, label='Lwater: ' ,size=(60, -1))
# self.staticText3_1 = wx.StaticText(self.panel, label='分钟 ' ,size=(60, -1))
self.textCtrl3 = wx.TextCtrl(self.panel, value="",size=(250,25))
tmp = self.getSnByDidAndFunc("Lwater",self.did)
if tmp is not None:
self.textCtrl3.SetValue(tmp)
self.hbox3.Add(self.staticText3, flag=wx.TOP|wx.LEFT, border=5)
self.hbox3.Add(self.textCtrl3,flag=wx.TOP|wx.LEFT, border=5)
# self.hbox3.Add(self.staticText3_1, flag=wx.TOP|wx.LEFT, border=5)
self.sbs.Add(self.hbox3, flag=wx.TOP|wx.LEFT, border=5)
self.panel.SetSizer(self.sbs)
self.hbox_0 = wx.BoxSizer(wx.HORIZONTAL)
self.okButton = wx.Button(self, label=u'保存配置')
self.closeButton = wx.Button(self, label='Close')
self.hbox_0.Add(self.okButton)
self.hbox_0.Add(self.closeButton, flag = wx.LEFT, border=5)
# 添加 vbox 到panel
self.vbox.Add(self.panel, proportion=1,
flag=wx.ALL | wx.EXPAND, border=5)
self.vbox.Add(self.hbox_0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizer(self.vbox)
self.okButton.Bind(wx.EVT_BUTTON, self.OnSave)
self.closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
def getSnByDidAndFunc(self,func,did):
temp:dict = self.config_sensor.get(did)
for v in temp.values():
if v["FUNC"] == func:
return v["SN"]
return None
pass
def setSnByDidAndFunc(self,func,did,val):
temp:dict = self.config_sensor.get(did)
for k,v in temp.items():
if v["FUNC"] == func:
temp[k]['SN'] =val
self.config_sensor.update({did:temp})
pass
def saveData(self, e):
pass
def OnClose(self, e):
self.Destroy()
def OnSave(self, e):
success = True
# 赋值字典,写入文件
self.setSnByDidAndFunc('Lsky',self.did,self.textCtrl1.GetValue( ))
self.setSnByDidAndFunc('Esky',self.did,self.textCtrl2.GetValue( ))
self.setSnByDidAndFunc('Lwater',self.did,self.textCtrl3.GetValue( ))
print(self.textCtrl3.GetValue( ))
print(self.config_sensor)
self.config.write_yaml(self.config_sensor)
del self.config
if success:
self.EndModal(wx.ID_OK)

@ -0,0 +1,386 @@
import wx
import os
import time
import threading
from pathlib import PurePath,Path
from pubsub import pub
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 handheld import HandHeld,HandHeldBuf
from gatherdata import GatherData
from tools.myexception import MyException
from tools.mylogger import log
from awrams import AwramsHandle,HandheldHandle
from profiler import ProfilerHandle
# -定义菜单ID,关联Event-------------------------
ID_MEASURE = 1
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_GATHER_DATA = 19
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.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.hh = HandHeld()
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_LOGGING_SETTING, 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'&指定设置', ' ')
plotMenu.AppendSeparator()
plotMenu.Append(ID_GATHER_DATA, 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.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.OnGatherData, id=ID_GATHER_DATA)
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" updateDisplay .. {msg['data']}",__name__,"updateDisplay","")
if msg['flag'] == "notice":
self.__update_notice(msg['data'])
pass
if msg['flag'] == "data":
# log.info(f" ... update .{msg['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 )
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__, "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
# 调用 ProfilerHandle 的函数
self.myhandle:ProfilerHandle = self.profiler_handle.get(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,__name__,"OnDealData")
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 OnCalInfo(self,e):
'''依据传感器获取标定文件信息'''
#######################################
self.onNotify("正在获取标定信息")
self.device_type = DeviceType.PROFILER.name
self.mycfg = MyConfig() # 传入 cfg retrieve 的yml文件
# 配置反演需要的参数 波长 间隔 , rowFactor
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.PROFILER )
self.sensor_cfg = self.mycfg.read_yaml() # 读config.yml, 多个device_id 配置
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)
for k,v in self.sensor_cfg.items():
cfgr.setSystemCfgDict(v)
try:
cfgr.getCalConfiguration()
except Exception as e:
log.error(f"读取配置文件失败. \n {e}",__name__, "OnCalInfo", "" )
raise
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__, "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__, "", "")
log.info(f"传感器配置文件读取成功", __name__, "", "")
# 配置初始化 ProfilerHandle
self.init_data_process()
self.calinfo_is_ok =True
pass
def init_data_process(self, mode = 0):
''' 多个handle '''
log.info(f" 配置设备处理数据... ", __name__, "init_data_process", "")
self.profiler_handle = { }
for k,v in self.cal_cfg.items():
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 )
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 OnGatherData(self,e):
gd = GatherData()
gd.gather_handheld()
self.alterStatus_0(" 数据汇总完成")
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()
Loading…
Cancel
Save