|
ENLIGHTEN
Cross-platform desktop GUI for Wasatch Photonics spectrometers
|
Main application controller class for ENLIGHTEN. More...
Public Member Functions | |
| __init__ (self, app, log_queue, log_level="INFO", max_memory_growth=0, max_thumbnails=500, run_sec=0, serial_number=None, stylesheet_path=None, set_all_dfu=False, form=None, splash=None, window_state=None, start_batch=False, plugin=None, password=None) | |
| All of the parameters are normally set via command-line arguments in Enlighten.py. | |
| AcquiredReading | acquire_reading (self, Spectrometer spec) |
| Poll the spectrometer thread (WasatchDeviceWrapper) for a SpectrometerResponse. | |
| app_state (self) | |
| None | attempt_reading (self, spec) |
| Attempt to acquire a reading from the thread response queue, process and render data in the GUI. | |
| bind_gui_signals (self) | |
| bind_shortcuts (self) | |
| Set up application-wide shortcut keys (called AFTER business object creation). | |
| check_ready_initialize (self) | |
| Check if an identified spectrometer succeeded in returning settings With this complete, initialize and start operating the spec. | |
| clear_response_errors (self, spec) | |
| Reset the cached errors for a connected spec. | |
| close (self, event_arg_str) | |
| configure_control_palette (self) | |
| This is an experiment to see if we can easily add "collapse/expand" button to each widget in the Control Palette. | |
| connect_new (self, other_device_id=None) | |
| If there are any visible spectrometers that ENLIGHTEN has not yet connected to, try to connect to them. | |
| create_signals (self) | |
| Add Qt signal handlers to the Controller instance. | |
| current_spectrometer (self) | |
| disconnect_device (self, spec=None, closing=False) | |
| disconnect_features (self) | |
| tell any features supporting disconnect events that we have disconnected the current spectrometer | |
| bool | display_response_error (self, Spectrometer spec, str response_error) |
| generate_x_axis (self, spec=None, settings=None, unit=None, cropped=True) | |
| Graph.current_x_axis is not per-spectrometer, therefore: | |
| get_last_processed_reading (self) | |
| graph_alternating_pixels_callback (self) | |
| header (self, s) | |
| can't be in LoggingFeature unless log was a parameter... | |
| initialize_new_device (self, device) | |
| This method is called in two very different circumstances: | |
| open_log (self) | |
| perform_fpga_reset (self, spec=None) | |
| populate_thumbnail_column (self) | |
| Create the required widget and layout configuration for adding newly saved entries from the scope capture interface. | |
| process_hardware_strip (self) | |
| process_hardware_strip_reading (self, spec, reading) | |
| process_reading (self, reading, spec=None, dark=None, ref=None, settings=None) | |
| process_status_message (self, msg, spec) | |
| Used to handle StatusMessage objects received from spectrometer threads (as opposed to the Readings we normally receive). | |
| refresh_scope_graphs (self) | |
| reprocess (self, measurement) | |
| Called by Measurements.create_from_file if save_options.load_raw. | |
| save_current_spectra (self, label=None) | |
| This is a GUI method (used as a callback) to generate one Measurement from the most-recent ProcessedReading of EACH connected spectrometer. | |
| set_curve_data (self, curve, y, x=None, label=None) | |
| Lightweight wrapper over pyqtgraph.PlotCurveItem.setData. | |
| set_from_ini_file (self) | |
| Load per-spectrometer settings keyed on serial_number (not general ENLIGHTEN settings like sound). | |
| setup_bus_listener (self) | |
| Poll the USB bus periodically for new connection events (including devices connected at application launch). | |
| setup_hardware_strip_listener (self) | |
| setup_main_event_loops (self) | |
| Create and start the timer to tick our event loop. | |
| swap_alternating_pixels_callback (self) | |
| Doesn't seem any point in tracking state on this? | |
| tick_acquisition (self) | |
| This polls every spectrometer's worker thread at 10Hz (or less) to receive the latest Reading from their Queue. | |
| tick_bus_listener (self) | |
| If a device is listed on the bus, and it is not currently connected, attempt to make a connection. | |
| tick_status (self) | |
| update_checkBox (self, sn, widget, name) | |
| update_doubleSpinBox (self, sn, widget, name) | |
| update_feature_visibility (self) | |
| Something has occurred which prompts us to update any Business Object whose visibility / exposed features depends on global application state (including whether we're in Expert mode or not). | |
| update_gain_and_offset (self, force=False) | |
| update_hardware_window (self) | |
| update_lineEdit (self, sn, widget, name) | |
| We're reading (not loading, but getting values from) a newly-connected spectrometer's portion of the .ini file so that local user configuration can override the EEPROM etc. | |
| update_scope_graphs (self, reading=None) | |
| update_spinBox (self, sn, widget, name) | |
| update_wavecal (self, coeffs=None) | |
| This gets called if the user has edited the EEPROM fields (coeff or excitation). | |
Public Attributes | |
| accessory_control = True) if hotplug else feature.display() | |
| Business Objects. | |
| acquisition_timer | |
| ambient_temperature | |
| app = app | |
| area_scan | |
| Business Objects. | |
| auto_raman | |
| Business Objects. | |
| baseline_correction | |
| batch_collection = True | |
| boxcar | |
| Business Objects. | |
| bus = WasatchBus() | |
| bus_timer | |
| business_objects = BusinessObjects(self) | |
| close | |
| control_exit_signal = ControlClose() | |
| creating control_exit_signal as a QObject with an "exit" signal | |
| dark_feature = False | |
| Business Objects. | |
| detector_temperature | |
| bool | dialog_open = False |
| edc | |
| Business Objects. | |
| int | exit_code = 0 |
| confirm we have no runaway resources | |
| external_trigger | |
| Business Objects. | |
| form = form | |
| gain_db_feature | |
| Business Objects. | |
| graph | |
| Business Objects. | |
| graph_alternating_pixels_callback | |
| move to StripChartFeature | |
| hard_strip_timer = QtCore.QTimer() | |
| bool | has_connected = False |
| Business Objects. | |
| high_gain_mode | |
| Business Objects. | |
| horiz_roi | |
| integration_time_feature = 2000) | |
| backup eeprom | |
| kia_feature | |
| laser_control | |
| Business Objects. | |
| laser_temperature | |
| Business Objects. | |
| laser_watchdog | |
| Business Objects. | |
| log_level = log_level | |
| log_queue = log_queue | |
| logging_feature | |
| max_memory_growth = max_memory_growth | |
| max_thumbnails = max_thumbnails | |
| other_device_ids = set() | |
| Populate Placeholders. | |
| password = password | |
| perform_fpga_reset | |
| pixel_calibration | |
| plugin = plugin | |
| Business Objects. | |
| plugin_controller | |
| Business Objects. | |
| process_hardware_strip | |
| raman_intensity_correction | |
| Business Objects. | |
| raman_shift_correction | |
| Business Objects. | |
| reference_feature | |
| Business Objects. | |
| richardson_lucy | |
| Business Objects. | |
| run_sec = run_sec | |
| seen_errors = defaultdict(lambda: defaultdict(int)) | |
| Create startup Business Objects. | |
| serial_number_desired = serial_number | |
| set_all_dfu = set_all_dfu | |
| dict | shortcuts = {} |
| bool | shutting_down = False |
| Lifecycle. | |
| int | spec_timeout = 30 |
| splash = splash | |
| bool | start_batch = start_batch |
| Business Objects. | |
| start_time = datetime.datetime.now() | |
| status_indicators | |
| Business Objects. | |
| status_timer | |
| stylesheet_path = stylesheet_path | |
| swap_alternating_pixels_callback | |
| move to StripChartFeature | |
| thumbnail_render_curve | |
| thumbnail_render_graph = pyqtgraph.PlotWidget(name="Measurement Thumbnail Renderer") | |
| tick_acquisition = QtCore.QTimer() | |
| tick_bus_listener = QtCore.QTimer() | |
| tick_status = QtCore.QTimer() | |
| update_hardware_window | |
| move to StripChartFeature | |
| vcr_controls | |
| Business Objects. | |
| str | window_state = window_state |
Static Public Attributes | |
| int | ACQUISITION_TIMER_SLEEP_MS = 100 |
| int | BUS_TIMER_SLEEP_MS = 1000 |
| attempt connection to the first untried (not connected, not in-process) device on the list | |
| int | MAX_MISSED_READINGS = 2 |
| int | SPEC_ERROR_MAX_RETRY = 3 |
| int | SPEC_RESET_MAX_RETRY = 3 |
| int | STATUS_TIMER_SLEEP_MS = 250 |
| Tick laser status. | |
| bool | USE_ERROR_DIALOG = False |
Main application controller class for ENLIGHTEN.
This class is still way bigger than it should be, but it's gradually coming under control.
| enlighten.Controller.Controller.__init__ | ( | self, | |
| app, | |||
| log_queue, | |||
| log_level = "INFO", | |||
| max_memory_growth = 0, | |||
| max_thumbnails = 500, | |||
| run_sec = 0, | |||
| serial_number = None, | |||
| stylesheet_path = None, | |||
| set_all_dfu = False, | |||
| form = None, | |||
| splash = None, | |||
| window_state = None, | |||
| start_batch = False, | |||
| plugin = None, | |||
| password = None ) |
All of the parameters are normally set via command-line arguments in Enlighten.py.
| AcquiredReading enlighten.Controller.Controller.acquire_reading | ( | self, | |
| Spectrometer | spec ) |
Poll the spectrometer thread (WasatchDeviceWrapper) for a SpectrometerResponse.
| enlighten.Controller.Controller.app_state | ( | self | ) |
| None enlighten.Controller.Controller.attempt_reading | ( | self, | |
| spec ) |
Attempt to acquire a reading from the thread response queue, process and render data in the GUI.
| enlighten.Controller.Controller.bind_gui_signals | ( | self | ) |
| enlighten.Controller.Controller.bind_shortcuts | ( | self | ) |
Set up application-wide shortcut keys (called AFTER business object creation).
Normally the assignment of widget callbacks are encapsulated within associated Business Objects (e.g. Ctrl-D within DarkFeature). However, it seems helpful to have all of these consolidated in one place to ensure uniqueness.
Note the "Help" for this feature is currently in ui.HelpFeature.
| enlighten.Controller.Controller.check_ready_initialize | ( | self | ) |
Check if an identified spectrometer succeeded in returning settings With this complete, initialize and start operating the spec.
| enlighten.Controller.Controller.clear_response_errors | ( | self, | |
| spec ) |
Reset the cached errors for a connected spec.
Right now this is only called by eeprom editor after writing a new eeprom.
| enlighten.Controller.Controller.close | ( | self, | |
| event_arg_str ) |
| enlighten.Controller.Controller.configure_control_palette | ( | self | ) |
This is an experiment to see if we can easily add "collapse/expand" button to each widget in the Control Palette.
If it worked, we'd move it to a ui.ControlPalette class.
<widget class="QScrollArea" name="controlWidget_scrollArea"> <widget class="QWidget" name="controlWidget_inner"> <layout class="QVBoxLayout" name="controlWidget_inner_vbox"> /* iterate this */
<widget class="QFrame" name="frame_FactoryMode_Options"> /* finding these */ <layout class="QVBoxLayout" name="verticalLayout_24"> <widget class="QLabel" name="label_hardware_capture_control"> /* place button to right of these */ <property name="text"> <string>Hardware Capture Control</string>
</property>
| enlighten.Controller.Controller.connect_new | ( | self, | |
| other_device_id = None ) |
If there are any visible spectrometers that ENLIGHTEN has not yet connected to, try to connect to them.
Only connect one device per pass; let bus_listener kick-off and call connect_new() again if more remain.
Note that this method gets called whether there are any spectrometers on the bus or not, and whether any or all of them have already connected or not.
| other_device_id | can point to a BLEDevice from BLEManager, TCPDevice from Network.WISP plugin, etc |
| enlighten.Controller.Controller.create_signals | ( | self | ) |
Add Qt signal handlers to the Controller instance.
| enlighten.Controller.Controller.current_spectrometer | ( | self | ) |
| enlighten.Controller.Controller.disconnect_device | ( | self, | |
| spec = None, | |||
| closing = False ) |
| enlighten.Controller.Controller.disconnect_features | ( | self | ) |
tell any features supporting disconnect events that we have disconnected the current spectrometer
| bool enlighten.Controller.Controller.display_response_error | ( | self, | |
| Spectrometer | spec, | ||
| str | response_error ) |
| enlighten.Controller.Controller.generate_x_axis | ( | self, | |
| spec = None, | |||
| settings = None, | |||
| unit = None, | |||
| cropped = True ) |
Graph.current_x_axis is not per-spectrometer, therefore:
wavenumbers: mostly-overlapped, jagged left-edge
If you pass in a specific spectrometer, it uses the settings (wavecal & excitation) from THAT spectrometer. Otherwise, if you pass in a specific SpectrometerSettings object (say from a saved/loaded Measurement), it uses that. Otherwise it uses the current spectrometer.
This function ONLY crops the x-axis if specifically asked to (and able to).
| enlighten.Controller.Controller.get_last_processed_reading | ( | self | ) |
| enlighten.Controller.Controller.graph_alternating_pixels_callback | ( | self | ) |
| enlighten.Controller.Controller.header | ( | self, | |
| s ) |
can't be in LoggingFeature unless log was a parameter...
| enlighten.Controller.Controller.initialize_new_device | ( | self, | |
| device ) |
This method is called in two very different circumstances:
The method itself determines the calling case by inferring a "hotplug" variable from whether the passed device was already connected or not.
Probably we should split this function into two:
| enlighten.Controller.Controller.open_log | ( | self | ) |
| enlighten.Controller.Controller.perform_fpga_reset | ( | self, | |
| spec = None ) |
| enlighten.Controller.Controller.populate_thumbnail_column | ( | self | ) |
Create the required widget and layout configuration for adding newly saved entries from the scope capture interface.
This generates a HIDDEN graph (it'll be "underneath" the displayed stackedWidget of saved spectra), which is nonetheless actively used when generating thumbnails of new traces.
This could probably be moved into MeasurementFactory, the sole user of these widgets.
| enlighten.Controller.Controller.process_hardware_strip | ( | self | ) |
So, it's worth noting that the data we collect for the Factory view seems to be coming from here, which only updates from the "latest" reading at 1Hz, regardless of integration time or incoming data rate.
We could probably be more event-driven and "timely" than this, but on the other hand these metrics probably don't need to be updated at especially high frequencies...this seems okay for now.
| enlighten.Controller.Controller.process_hardware_strip_reading | ( | self, | |
| spec, | |||
| reading ) |
| enlighten.Controller.Controller.process_reading | ( | self, | |
| reading, | |||
| spec = None, | |||
| dark = None, | |||
| ref = None, | |||
| settings = None ) |
Requested order of operations, per Michael Matthews:
If no Spectrometer is passed in, use the current one. Therefore, reprocessed spectra will use the SpectrometerState and SpectrometerApplicationState associated with the current Spectrometer. However, we do try to re-use the SpectrometerSettings instantiated when we reloaded the measurement.
Of particular note are dark and reference, which can be manually passed-in for reprocessed measurements if found in input file. Likewise, we pass in the loaded Settings object so that the x-axis can be generated from the correct wavecal, pixel count, as well as the correct cropped ROI.
Keywords to help people find this function:
| enlighten.Controller.Controller.process_status_message | ( | self, | |
| msg, | |||
| spec ) |
Used to handle StatusMessage objects received from spectrometer threads (as opposed to the Readings we normally receive).
These are not common in the current architecture. These were used initially to provide progress updates to the GUI when loading long series of I2C overrides to the IMX before firmware encapsulated sensor control.
| msg | - presumably a StatusMessage from a spectrometer process |
| enlighten.Controller.Controller.refresh_scope_graphs | ( | self | ) |
| enlighten.Controller.Controller.reprocess | ( | self, | |
| measurement ) |
Called by Measurements.create_from_file if save_options.load_raw.
This takes the loaded raw, dark and reference, and re-feeds them back through process_reading, along with the loaded Settings object containing wavecal, pixel count etc. This will display the re-processed spectrum on screen, then return the new ProcessedReading object. We pass that back to the caller, who will update the new ProcessedReading into the originally loaded Measurement, update the measurement_id / timestamps, generate the thumbnail and re-save.
| measurement | (Input) Measurement |
| enlighten.Controller.Controller.save_current_spectra | ( | self, | |
| label = None ) |
This is a GUI method (used as a callback) to generate one Measurement from the most-recent ProcessedReading of EACH connected spectrometer.
Originally there was no thought of Measurements "knowing" what view was in use when they were created. However, we (currently) only want the ID button to show up on Raman measurements, so...let's see where this goes.
| enlighten.Controller.Controller.set_curve_data | ( | self, | |
| curve, | |||
| y, | |||
| x = None, | |||
| label = None ) |
Lightweight wrapper over pyqtgraph.PlotCurveItem.setData.
Checks for case where x[0] is higher than x[1] (happens with a default wavecal of [0, 1, 0, 0] and positive excitation in wavenumber space). Also traps for unequal array lengths, etc.
| enlighten.Controller.Controller.set_from_ini_file | ( | self | ) |
Load per-spectrometer settings keyed on serial_number (not general ENLIGHTEN settings like sound).
called from initialize_new_device
| enlighten.Controller.Controller.setup_bus_listener | ( | self | ) |
Poll the USB bus periodically for new connection events (including devices connected at application launch).
| enlighten.Controller.Controller.setup_hardware_strip_listener | ( | self | ) |
| enlighten.Controller.Controller.setup_main_event_loops | ( | self | ) |
Create and start the timer to tick our event loop.
| enlighten.Controller.Controller.swap_alternating_pixels_callback | ( | self | ) |
Doesn't seem any point in tracking state on this?
| enlighten.Controller.Controller.tick_acquisition | ( | self | ) |
This polls every spectrometer's worker thread at 10Hz (or less) to receive the latest Reading from their Queue.
To be clear, that means that ENLIGHTEN cannot read more than 10 spectra per second from a spectrometer, even though Wasatch spectrometers have "scan rates" many times that.
This is because ENLIGHTEN was designed as a real-time data VIEWING program, not a real-time DATA ANALYSIS or COLLECTION program. For data analysis, in which you are generating statistics on every spectra generated by the spectrometer, you would need to run at a faster rate.
In this case, all we're trying to do is graph "the latest" spectrum from the spectrometer, and for that 10Hz seems fine.
Note that when multiple spectrometers are connected, we actually poll a little slower.
Also note that we're still not really polling at 10Hz...we're starting each new polling cycle 100ms after the last one finished, and it's possible that some cycles (especially if using blocking plugins) may take many milliseconds to complete.
| enlighten.Controller.Controller.tick_bus_listener | ( | self | ) |
If a device is listed on the bus, and it is not currently connected, attempt to make a connection.
| enlighten.Controller.Controller.tick_status | ( | self | ) |
| enlighten.Controller.Controller.update_checkBox | ( | self, | |
| sn, | |||
| widget, | |||
| name ) |
| enlighten.Controller.Controller.update_doubleSpinBox | ( | self, | |
| sn, | |||
| widget, | |||
| name ) |
| enlighten.Controller.Controller.update_feature_visibility | ( | self | ) |
Something has occurred which prompts us to update any Business Object whose visibility / exposed features depends on global application state (including whether we're in Expert mode or not).
This is called by PageNavigation.set_view_common, for instance when changing Operation Mode (Ranam, Non-Raman, Expert) or View (Scope, Settings, Hardware, Logging, Factory) or Technique (Raman, Emission, Absorbance, Transmission/Reflectance), etc.
This is also called when connecting / disconnecting spectrometers.
It also helps to "re-hide" pyqtgraph curves which had been previously hidden, but then erroneously re-show themselves when a curve is removed from the chart. (I'm assuming that pyqtgraph bug hasn't been fixed?)
IMHO we should give self.bus_obj an iterable list of all business objects, all of which should extend EnlightenBusinessObject or whatever, with overridable methods update_visibility, post_init (to be fired after all Business Objects are instantiated), etc.
| enlighten.Controller.Controller.update_gain_and_offset | ( | self, | |
| force = False ) |
| force | There was a time when production FID spectrometers were not being assigned gain and offset values in their EEPROMs. Therefore EEPROM values were considered suspicious (offset in particular was unreliable). So we don't want to just push possibly-invalid EEPROM defaults downstream. However, we do want to allow explicit changes via the EEPROMEditor and .ini files to be pushed down. So the EEPROMEditor sends the "force" parameter. |
| enlighten.Controller.Controller.update_hardware_window | ( | self | ) |
| enlighten.Controller.Controller.update_lineEdit | ( | self, | |
| sn, | |||
| widget, | |||
| name ) |
We're reading (not loading, but getting values from) a newly-connected spectrometer's portion of the .ini file so that local user configuration can override the EEPROM etc.
As we read in values, we update the associated widget on the EEPROMEditor.
Normally, calling setText() on a QLineEdit would trigger a textChanged event, such that follow-through actions would automatically follow (like updating the associated EEPROM field, recalculating the wavecal, etc).
However, we have deliberately DISABLED the textChanged event on lineEdit widgets in the EEPROMEditor, because they have a nasty habit of responding to EVERY KEYPRESS when editing coefficients (creating bizarre behavior and errors on typos).
Therefore, for now, we hacked EEPROMEditor.bind_lineEdit such that it stores a reference to each lineEdit widget's EEPROMEditor callback function in the widget itself, in an attribute called enlighten_trigger.
We can assume that the EEPROMEditor itself was instantiated and bound at application startup time, long before any spectrometer connected and caused us to parse its .ini settings, so we can safely assume that this trigger callback is available to this function.
So in conclusion, after an outside agency (like this .ini function) reaches into the EEPROMEditor and changes the values of lineEdit widgets owned by it, we then call that widget's enlighten_trigger() callback to tell the EEPROMEditor to "do whatever you would normally do after a user manually edited that field and pressed return."
| enlighten.Controller.Controller.update_scope_graphs | ( | self, | |
| reading = None ) |
| enlighten.Controller.Controller.update_spinBox | ( | self, | |
| sn, | |||
| widget, | |||
| name ) |
| enlighten.Controller.Controller.update_wavecal | ( | self, | |
| coeffs = None ) |
This gets called if the user has edited the EEPROM fields (coeff or excitation).
Basically, update the Settings object if new versions were passed; then recompute wavelengths and wavenumbers no matter what, and sync excitations.
| enlighten.Controller.Controller.accessory_control = True) if hotplug else feature.display() |
Business Objects.
| enlighten.Controller.Controller.acquisition_timer |
|
static |
| enlighten.Controller.Controller.ambient_temperature |
| enlighten.Controller.Controller.app = app |
| enlighten.Controller.Controller.area_scan |
Business Objects.
| enlighten.Controller.Controller.auto_raman |
Business Objects.
| enlighten.Controller.Controller.baseline_correction |
| enlighten.Controller.Controller.batch_collection = True |
| enlighten.Controller.Controller.boxcar |
Business Objects.
| enlighten.Controller.Controller.bus = WasatchBus() |
| enlighten.Controller.Controller.bus_timer |
|
static |
attempt connection to the first untried (not connected, not in-process) device on the list
| enlighten.Controller.Controller.business_objects = BusinessObjects(self) |
| enlighten.Controller.Controller.close |
| enlighten.Controller.Controller.control_exit_signal = ControlClose() |
creating control_exit_signal as a QObject with an "exit" signal
| enlighten.Controller.Controller.dark_feature = False |
Business Objects.
| enlighten.Controller.Controller.detector_temperature |
| bool enlighten.Controller.Controller.dialog_open = False |
| enlighten.Controller.Controller.edc |
Business Objects.
| enlighten.Controller.Controller.exit_code = 0 |
confirm we have no runaway resources
| enlighten.Controller.Controller.external_trigger |
Business Objects.
| enlighten.Controller.Controller.form = form |
| enlighten.Controller.Controller.gain_db_feature |
Business Objects.
| enlighten.Controller.Controller.graph |
Business Objects.
| enlighten.Controller.Controller.graph_alternating_pixels_callback |
move to StripChartFeature
| enlighten.Controller.Controller.hard_strip_timer = QtCore.QTimer() |
| bool enlighten.Controller.Controller.has_connected = False |
Business Objects.
Change to Raman if first connected device is Raman
| enlighten.Controller.Controller.high_gain_mode |
Business Objects.
| enlighten.Controller.Controller.horiz_roi |
| enlighten.Controller.Controller.integration_time_feature = 2000) |
backup eeprom
display firmware
update EEPROM Editor
update integration time & gain
| enlighten.Controller.Controller.kia_feature |
| enlighten.Controller.Controller.laser_control |
Business Objects.
| enlighten.Controller.Controller.laser_temperature |
Business Objects.
| enlighten.Controller.Controller.laser_watchdog |
Business Objects.
| enlighten.Controller.Controller.log_level = log_level |
| enlighten.Controller.Controller.log_queue = log_queue |
| enlighten.Controller.Controller.logging_feature |
| enlighten.Controller.Controller.max_memory_growth = max_memory_growth |
|
static |
| enlighten.Controller.Controller.max_thumbnails = max_thumbnails |
| enlighten.Controller.Controller.other_device_ids = set() |
Populate Placeholders.
Events and Timers
Application Business Objects
| enlighten.Controller.Controller.password = password |
| enlighten.Controller.Controller.perform_fpga_reset |
| enlighten.Controller.Controller.pixel_calibration |
| enlighten.Controller.Controller.plugin = plugin |
Business Objects.
Change to Raman if first connected device is Raman
Batch Collection should kick-off on the FIRST connected spectrometer
Connect to plugin if requested (first connected spectrometer only)
| enlighten.Controller.Controller.plugin_controller |
Business Objects.
| enlighten.Controller.Controller.process_hardware_strip |
| enlighten.Controller.Controller.raman_intensity_correction |
Business Objects.
| enlighten.Controller.Controller.raman_shift_correction |
Business Objects.
| enlighten.Controller.Controller.reference_feature |
Business Objects.
| enlighten.Controller.Controller.richardson_lucy |
Business Objects.
| enlighten.Controller.Controller.run_sec = run_sec |
| enlighten.Controller.Controller.seen_errors = defaultdict(lambda: defaultdict(int)) |
Create startup Business Objects.
| enlighten.Controller.Controller.serial_number_desired = serial_number |
| enlighten.Controller.Controller.set_all_dfu = set_all_dfu |
| dict enlighten.Controller.Controller.shortcuts = {} |
| bool enlighten.Controller.Controller.shutting_down = False |
Lifecycle.
Tick plug-ins
Tick KIA
|
static |
|
static |
| int enlighten.Controller.Controller.spec_timeout = 30 |
| enlighten.Controller.Controller.splash = splash |
| bool enlighten.Controller.Controller.start_batch = start_batch |
Business Objects.
Change to Raman if first connected device is Raman
Batch Collection should kick-off on the FIRST connected spectrometer
| enlighten.Controller.Controller.start_time = datetime.datetime.now() |
| enlighten.Controller.Controller.status_indicators |
Business Objects.
| enlighten.Controller.Controller.status_timer |
|
static |
Tick laser status.
Tick plug-ins
Tick KIA
| enlighten.Controller.Controller.stylesheet_path = stylesheet_path |
| enlighten.Controller.Controller.swap_alternating_pixels_callback |
move to StripChartFeature
| enlighten.Controller.Controller.thumbnail_render_curve |
| enlighten.Controller.Controller.thumbnail_render_graph = pyqtgraph.PlotWidget(name="Measurement Thumbnail Renderer") |
| enlighten.Controller.Controller.tick_acquisition = QtCore.QTimer() |
| enlighten.Controller.Controller.tick_bus_listener = QtCore.QTimer() |
| enlighten.Controller.Controller.tick_status = QtCore.QTimer() |
| enlighten.Controller.Controller.update_hardware_window |
move to StripChartFeature
|
static |
| enlighten.Controller.Controller.vcr_controls |
Business Objects.
| str enlighten.Controller.Controller.window_state = window_state |