Mode-stirred chamber ==================== The ``MSC`` class supports calibration, EUT calibration, emission, and immunity measurements in a mode-stirred chamber. The individual stages do not produce isolated result files. Each stage loads the preceding ``MSC`` instance, appends measurement and evaluation data, and writes a new history pickle. Measurement sequence -------------------- Main calibration characterizes the empty chamber and is repeated only after relevant changes to the measurement environment. ``EUTCal`` then determines the influence of the specific equipment under test. Emission and immunity measurements build on these data: .. code-block:: text MainCal -> EUTCal -> Immunity MainCal -> EUTCal -> Emission MainCal -> EUTCal -> Immunity -> Emission A later stage receives the preceding pickle through ``pickle_input_filename``. The new pickle continues to contain the complete history. Virtual workflow ---------------- Run a complete hardware-independent immunity chain from the repository root: .. code-block:: console python script/msc-maincal.py \ script/conf/msc-immunity-virtual/conf.py python script/msc-eutcal.py \ script/conf/msc-immunity-virtual/conf-eutcal.py python script/msc-immunity.py \ script/conf/msc-immunity-virtual/conf-immunity.py A subsequent emission measurement uses the accumulated history: .. code-block:: console python script/msc-emission.py \ script/conf/msc-emission-virtual/conf-after-immunity.py The configuration files already connect the pickle paths for this sequence. When running an individual stage, its expected input pickle must therefore exist. Outputs and resume ------------------ Each script typically writes: * a final history pickle; * an autosave pickle during the measurement; * raw and evaluated data in DAT format; * a text log. When a valid autosave exists, the script resumes the interrupted measurement routine at its recorded position. It does not acquire already completed points again. The autosave is removed after successful completion. Operator interfaces ------------------- All four text scripts have Qt variants with the ``-qt`` suffix. Both interfaces use the same measurement classes and configuration files. RF-off and abort handling remain part of the measurement logic and must not depend solely on the user interface. EUT monitoring -------------- The standard MSC immunity measurement and the threshold search use structured EUT events. Manual intervention through the keyboard or a GUI always remains active. ``eut_monitor`` may add one automatic monitor or a sequence of monitors, for example for communication traffic, camera evaluation, or test-level supervision. Blocking hardware access belongs in a ``ThreadedEUTMonitor``. ``performance_criterion`` selects performance criterion ``A``, ``B``, or ``C``. For B and C, ``post_exposure_timeout`` can open an observation phase after RF is switched off so that recovery and functional state can be recorded. Independently, ``eut_event_policy`` determines whether an event continues, retries, or stops the measurement. An event requesting ``safety_action="rf_off"`` switches RF off immediately. Measurement and evaluation store the information at: * ``rawData_Immunity[description]["performance_criterion"]``; * ``rawData_Immunity[description]["eutstatus"][...]["eut_event"]``; * ``processedData_Immunity[description]["performance_assessment"]``; * ``processedData_Immunity[description]["performance_assessment_by_exposure"]``; * ``processedData_Immunity[description]["performance_assessment_by_frequency"]``. Historical text statuses remain evaluable. New measurements always store the structured event in addition to the compact text status. Events from different tuner positions are evaluated separately before they are aggregated; recovery at one position therefore cannot make another exposure pass retroactively. The task-oriented :doc:`EUT monitoring guide <../framework/eut-monitoring>` provides complete parameter and implementation examples. Threshold search ---------------- ``ImmunityThresholdKernel`` increases the electric field step by step until EUT monitoring reports an impairment or the largest configured field is reached. The kernel owns neither devices nor a measurement graph. It only emits commands; ``Measure_Immunity`` executes them and immediately switches RF off when an EUT event requests ``safety_action="rf_off"``. A runnable virtual configuration is available at ``script/conf/msc-immunity-virtual/conf-immunity-threshold.py``. Run it after MainCal and EUTCal: .. code-block:: console python script/msc-immunity.py \ script/conf/msc-immunity-virtual/conf-immunity-threshold.py The main kernel parameters are: ``field_levels`` Strictly increasing field strengths expressed as ``Quantity(EFIELD, ...)``. Plain numbers are interpreted as V/m. ``backtrack_levels`` Number of field-level entries by which the next frequency starts below the last tested level. ``dwell`` EUT observation time for each field level and tuner position. ``eut_monitor`` Optional automatic monitoring. Manual intervention through ``keylist`` remains available independently of automatic monitors. Structured results are stored in the history pickle at ``rawData_Immunity[description]["threshold_search"][frequency]``. Each entry contains at least ``status``, ``field``, ``level_index``, ``tuner_position``, and, when applicable, the triggering ``eut_event``. Autosave and resume work on frequency, tuner-position, and field-level combinations; completed exposures are not repeated.