@@ -84,8 +84,9 @@ def parse(self, packet):
84
84
self .signal .packet_corrupted .emit ()
85
85
if self .invalid_packet_alarm_triggered is False :
86
86
self .invalid_packet_alarm_triggered = True
87
- self .logger .warning ('Unable to parse frame. Check data format.' )
88
- self .signal .alarm_custom .emit ('Unable to parse frame.' , 'Check HyperBB data format in "Setup".' )
87
+ self .logger .warning ('Unable to parse frame.' )
88
+ self .signal .alarm_custom .emit ('Unable to parse frame.' ,
89
+ 'If all frames are like this, check HyperBB data format in "Setup".' )
89
90
return data
90
91
91
92
def handle_data (self , raw , timestamp ):
@@ -137,26 +138,28 @@ def update_active_timeseries_variables(self, name, state):
137
138
['beta(%d)' % wl for wl in self ._parser .wavelength [self .active_timeseries_wavelength ]]
138
139
139
140
141
+ LEGACY_DATA_FORMAT = 0
140
142
ADVANCED_DATA_FORMAT = 1
141
143
LIGHT_DATA_FORMAT = 2
142
144
143
145
class HyperBBParser ():
144
146
def __init__ (self , plaque_cal_file , temperature_cal_file , data_format = 'advanced' ):
145
147
# Frame Parser
146
- if data_format .lower () == 'advanced' :
148
+ if data_format .lower () == 'legacy' :
149
+ self .data_format = LEGACY_DATA_FORMAT
150
+ elif data_format .lower () == 'advanced' :
147
151
self .data_format = ADVANCED_DATA_FORMAT
148
152
elif data_format .lower () == 'light' :
149
153
self .data_format = LIGHT_DATA_FORMAT
150
154
else :
151
155
raise ValueError ('Data format not recognized.' )
152
- if self .data_format == ADVANCED_DATA_FORMAT :
153
- # The advanced output contains extra parameters:
154
- # - The standard deviation can be used as a proxy for particle size.
155
- # - The stepper position can be used to determine wavelength registration in case of instrument issues.
156
- self .FRAME_VARIABLES = ['ScanIdx' , 'DataIdx' , 'Date' , 'Time' , 'StepPos' , 'wl' , 'LedPwr' , 'PmtGain' , 'NetSig1' ,
157
- 'SigOn1' , 'SigOn1Std' , 'RefOn' , 'RefOnStd' , 'SigOff1' , 'SigOff1Std' , 'RefOff' ,
158
- 'RefOffStd' , 'SigOn2' , 'SigOn2Std' , 'SigOn3' , 'SigOn3Std' , 'SigOff2' , 'SigOff2Std' ,
159
- 'SigOff3' , 'SigOff3Std' , 'LedTemp' , 'WaterTemp' , 'Depth' , 'Debug1' , 'zDistance' ]
156
+ if self .data_format == LEGACY_DATA_FORMAT : # Manual version 1.2
157
+ self .FRAME_VARIABLES = ['ScanIdx' , 'DataIdx' , 'Date' , 'Time' , 'StepPos' , 'wl' , 'LedPwr' , 'PmtGain' ,
158
+ 'NetSig1' , 'SigOn1' , 'SigOn1Std' , 'RefOn' , 'RefOnStd' , 'SigOff1' , 'SigOff1Std' ,
159
+ 'RefOff' , 'RefOffStd' , 'SigOn2' , 'SigOn2Std' , 'SigOn3' , 'SigOn3Std' , 'SigOff2' ,
160
+ 'SigOff2Std' , 'SigOff3' , 'SigOff3Std' , 'LedTemp' , 'WaterTemp' ,
161
+ 'Depth' , 'Saturation' , 'CalPlaqueDist' ]
162
+ # Channel "Saturation" might be "Debug1" depending on firmware version
160
163
self .FRAME_TYPES = [int , int , str , str , int , int , int , int , int ,
161
164
float , float , float , float , float , float , float ,
162
165
float , float , float , float , float , float , float ,
@@ -168,10 +171,26 @@ def __init__(self, plaque_cal_file, temperature_cal_file, data_format='advanced'
168
171
self .FRAME_PRECISIONS = ['%s' ] * len (self .FRAME_VARIABLES )
169
172
for x in self .FRAME_VARIABLES :
170
173
setattr (self , f'idx_{ x } ' , self .FRAME_VARIABLES .index (x ))
174
+ elif self .data_format == ADVANCED_DATA_FORMAT : # Firmware version >= 1.68 or Manual version 1.3
175
+ # The advanced output contains extra parameters:
176
+ # - The standard deviation can be used as a proxy for particle size.
177
+ # - The stepper position can be used to determine wavelength registration in case of instrument issues.
178
+ self .FRAME_VARIABLES = ['ScanIdx' , 'DataIdx' , 'Date' , 'Time' , 'StepPos' , 'wl' , 'LedPwr' , 'PmtGain' ,
179
+ 'NetSig1' , 'SigOn1' , 'SigOn1Std' , 'RefOn' , 'RefOnStd' , 'SigOff1' , 'SigOff1Std' ,
180
+ 'RefOff' , 'RefOffStd' , 'SigOn2' , 'SigOn2Std' , 'SigOn3' , 'SigOn3Std' ,
181
+ 'SigOff2' , 'SigOff2Std' , 'SigOff3' , 'SigOff3Std' , 'LedTemp' , 'WaterTemp' ,
182
+ 'Depth' , 'SupplyVolt' , 'Saturation' , 'CalPlaqueDist' ]
183
+ self .FRAME_TYPES = [int , int , str , str , int , int , int , int , int ,
184
+ float , float , float , float , float , float , float ,
185
+ float , float , float , float , float , float , float ,
186
+ float , float , float , float , float , float , int , int ]
187
+ self .FRAME_PRECISIONS = ['%s' ] * len (self .FRAME_VARIABLES )
188
+ for x in self .FRAME_VARIABLES :
189
+ setattr (self , f'idx_{ x } ' , self .FRAME_VARIABLES .index (x ))
171
190
elif self .data_format == LIGHT_DATA_FORMAT :
172
191
self .FRAME_VARIABLES = ['ScanIdx' , 'Date' , 'Time' , 'wl' , 'PmtGain' ,
173
- 'NetRef' , 'NetSig1' , 'NetSig2' , 'NetSig3' ,
174
- 'LedTemp' , 'WaterTemp' , 'Depth' , 'SupplyVolt' , 'ChSaturated' ]
192
+ 'NetRef' , 'NetSig1' , 'NetSig2' , 'NetSig3' ,
193
+ 'LedTemp' , 'WaterTemp' , 'Depth' , 'SupplyVolt' , 'ChSaturated' ]
175
194
self .FRAME_TYPES = [int , str , str , int , int ,
176
195
float , float , float , float , float ,
177
196
float , float , float , float , int ]
@@ -268,7 +287,7 @@ def calibrate(self, raw):
268
287
raw = np .delete (raw , sel , axis = 0 )
269
288
# Shortcuts
270
289
wl = raw [:, self .idx_wl ]
271
- if self .data_format == ADVANCED_DATA_FORMAT :
290
+ if self .data_format == ADVANCED_DATA_FORMAT or self . data_format == LEGACY_DATA_FORMAT :
272
291
# Remove saturated reading
273
292
raw [raw [:, self .idx_SigOn1 ] > self .saturation_level , self .idx_SigOn1 ] = np .nan
274
293
raw [raw [:, self .idx_SigOn2 ] > self .saturation_level , self .idx_SigOn2 ] = np .nan
0 commit comments