pyvisa / pyvisa-sim

A PyVISA backend that simulates a large part of the "Virtual Instrument Software Architecture" (VISA_)
https://pyvisa-sim.readthedocs.io/en/latest/
MIT License
69 stars 39 forks source link

Multiple getters and setters for a property? #69

Open dougthor42 opened 1 year ago

dougthor42 commented 1 year ago

The Keysight and Agilent instrument lines typically implement commands that can have various forms. For example, all of these are the same command:

# Definition:
[:SOURce[c]]:FUNCtion[:SHAPe] shape
shape: PULSe|DC

# Accepted:
:SOURCE1:FUNCTION:SHAPE DC
:SOURCE1:FUNC:SHAP PULS
:SOURCE:FUNC:SHAPE PULSE
:FUNCTION dc
:func:shape pulse
... and many more.

Is there support for multiple getters and setters for a property? A naive implementation would allow just repeating the property name:

properties:
  source_function_shape:
    getter:
      q: ":SOURCE:FUNCTION:SHAPE?"
      r: {}
    setter:
      q: ":SOURCE:FUCTION:SHAPE {}"
    valid: ["DC", "PULS", "PULSE"]
  source_function_shape:  # same property name so that ":SOUR:FUNC:SHAP?" returns the same as ":SOURCE:FUNCTION:SHAPE?"
    getter:
      q: ":SOUR:FUNC:SHAP?"
      r: {}
    setter:
      q: ":SOUR:FUCN:SHAP {}"
    valid: ["DC", "PULS", "PULSE"]

But this ends up being very verbose.

Can regex be used for getter and setter commands?

properties:
  source_function_shape:
    getter:
      q: ':(SOUR(CE)?\d?)?:FUNC(TION)?:SHAPE?\?'
      r: {}
    setter:
      q: ':(SOUR(CE)?\d?)?:FUNC(TION)?:SHAP(E)? \{\}'
    valid: ["DC", "PULS", "PULSE"]
MatthieuDartiailh commented 1 year ago

Technically we need is to generate a SCPI parser for such cases. The best would be to simply generate the regex from a SCPI string internally but we would need a way to opt in/out of this mechanism. I won't have time to look into this but I will make time to review a PR if you feel like addressing the issue.