Skip to content

Commit 3a940c1

Browse files
committed
Add newer format "advanced" to HyperBB
- distinguish advanced and legacy data formats for HyperBB (difference of one column), this is due to a change in HyperBB firmware. - HyperBB now supports three data formats: - legacy - advanced - simple
1 parent aef7321 commit 3a940c1

File tree

2 files changed

+41
-14
lines changed

2 files changed

+41
-14
lines changed

inlinino/instruments/hyperbb.py

+33-14
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ def parse(self, packet):
8484
self.signal.packet_corrupted.emit()
8585
if self.invalid_packet_alarm_triggered is False:
8686
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".')
8990
return data
9091

9192
def handle_data(self, raw, timestamp):
@@ -137,26 +138,28 @@ def update_active_timeseries_variables(self, name, state):
137138
['beta(%d)' % wl for wl in self._parser.wavelength[self.active_timeseries_wavelength]]
138139

139140

141+
LEGACY_DATA_FORMAT = 0
140142
ADVANCED_DATA_FORMAT = 1
141143
LIGHT_DATA_FORMAT = 2
142144

143145
class HyperBBParser():
144146
def __init__(self, plaque_cal_file, temperature_cal_file, data_format='advanced'):
145147
# 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':
147151
self.data_format = ADVANCED_DATA_FORMAT
148152
elif data_format.lower() == 'light':
149153
self.data_format = LIGHT_DATA_FORMAT
150154
else:
151155
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
160163
self.FRAME_TYPES = [int, int, str, str, int, int, int, int, int,
161164
float, float, float, float, float, float, float,
162165
float, float, float, float, float, float, float,
@@ -168,10 +171,26 @@ def __init__(self, plaque_cal_file, temperature_cal_file, data_format='advanced'
168171
self.FRAME_PRECISIONS = ['%s'] * len(self.FRAME_VARIABLES)
169172
for x in self.FRAME_VARIABLES:
170173
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))
171190
elif self.data_format == LIGHT_DATA_FORMAT:
172191
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']
175194
self.FRAME_TYPES = [int, str, str, int, int,
176195
float, float, float, float, float,
177196
float, float, float, float, int]
@@ -268,7 +287,7 @@ def calibrate(self, raw):
268287
raw = np.delete(raw, sel, axis=0)
269288
# Shortcuts
270289
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:
272291
# Remove saturated reading
273292
raw[raw[:, self.idx_SigOn1] > self.saturation_level, self.idx_SigOn1] = np.nan
274293
raw[raw[:, self.idx_SigOn2] > self.saturation_level, self.idx_SigOn2] = np.nan

inlinino/resources/setup_hyperbb.ui

+8
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@
275275
<layout class="QHBoxLayout" name="horizontalLayout_3">
276276
<item>
277277
<widget class="QComboBox" name="combobox_data_format">
278+
<property name="currentText">
279+
<string>advanced</string>
280+
</property>
278281
<item>
279282
<property name="text">
280283
<string>light</string>
@@ -285,6 +288,11 @@
285288
<string>advanced</string>
286289
</property>
287290
</item>
291+
<item>
292+
<property name="text">
293+
<string>legacy</string>
294+
</property>
295+
</item>
288296
</widget>
289297
</item>
290298
<item>

0 commit comments

Comments
 (0)