Create a function `initialize_instruments(context)` that uses **PyVISA** to initialize and configure lab instruments as defined in `context["instrument_config"]`.
---
### 🔍 Function Behavior
- Use `pyvisa.ResourceManager()` to establish a VISA session. - Iterate through each instrument in `context["instrument_config"]`. Each config entry must contain:
- A unique instrument key (e.g., `"psu"`, `"dmm"`, `"eload"`)
- A VISA resource address (e.g., `"USB::0x1234::5678::INSTR"`)
- Optional init options such as `"baud_rate"`, `"timeout"`, `"termination"`, etc.
- Connect to each instrument and apply the initial configuration parameters if specified. - Store the open instrument handle in `context["instruments"]` using the same key. - Ensure graceful error handling:
- Raise a clear error if an instrument cannot be initialized.
- Optionally log or print status messages for each step.
- Do **not** include any measurement, stimulus, or sweeping logic. - Return the updated `context` with connected instrument handles.
---
### 📦 Example `context["instrument_config"]`
```python {
"psu": {
"address": "USB0::0x1AB1::0x0E11::DP832::INSTR",
"timeout": 5000,
"termination": "\n"
},
"dmm": {
"address": "GPIB0::22::INSTR",
"timeout": 3000
}
} ```
### Example Output
```python context["instruments"] = {
"psu": <pyvisa.resources.Resource>,
"dmm": <pyvisa.resources.Resource>
} ```
### Example Implementation
```python import pyvisa
def initialize_instruments(context: dict) -> dict:
rm = pyvisa.ResourceManager()
instrument_handles = {}
for name, config in context.get("instrument_config", {}).items():
try:
instr = rm.open_resource(config["address"])
if "timeout" in config:
instr.timeout = config["timeout"]
if "termination" in config:
instr.write_termination = config["termination"]
instr.read_termination = config["termination"]
instrument_handles[name] = instr
except Exception as e:
raise RuntimeError(f"Failed to initialize {name}: {e}")
context["instruments"] = instrument_handles
return context
```