Skip to content

Commit 38b6214

Browse files
authored
Merge pull request #156 from sandialabs/driver_readonly_property
feat: add read-only driver property to add_driver_property
2 parents c17d887 + a9b991c commit 38b6214

File tree

1 file changed

+35
-6
lines changed

1 file changed

+35
-6
lines changed

pyscan/drivers/instrument_driver.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ def add_device_property(self, settings):
8686
Parameters
8787
----------
8888
settings : dict
89-
dict containing settings for property. Must have the key "values", "range", or "indexed_values".
89+
dict containing settings for property. Must have:
90+
- the key "values", "range", or "indexed_values", or "dict_values"
91+
- "write_string" and/or "query_string" to communication with instrument
92+
- "return_type" is a function that converts the return string to a python type
9093
9194
Returns
9295
-------
@@ -95,6 +98,16 @@ def add_device_property(self, settings):
9598

9699
self['_{}_settings'.format(settings['name'])] = settings
97100

101+
command_strings = ['write_string', 'query_string']
102+
if not any(string in settings for string in command_strings):
103+
assert False, "'write_string' and/or 'query_string' must be in settings"
104+
105+
# read_only properties do not need to have a required key in setting,
106+
# but for the docstring to work a read_only property is created.
107+
if 'write_string' not in settings:
108+
if 'read_only' not in settings:
109+
settings['read_only'] = settings['return_type'].__name__
110+
98111
prop_type = ''
99112
if 'values' in settings:
100113
set_function = self.set_values_property
@@ -110,16 +123,32 @@ def add_device_property(self, settings):
110123
elif 'dict_values' in settings:
111124
set_function = self.set_dict_values_property
112125
prop_type = 'dict_values'
126+
elif 'read_only' in settings:
127+
prop_type = 'read_only'
113128
else:
114-
assert False, "key used but not allowed"
129+
assert False, "Key 'values', 'range', indexed_values', 'read_only', or 'dict_values' must be in settings."
115130

116131
doc_string = "{} : {}\n {}: {}".format(settings['name'], settings['return_type'].__name__,
117132
prop_type, settings[prop_type])
118133

119-
property_definition = property(
120-
fget=lambda obj: self.get_instrument_property(obj, settings),
121-
fset=lambda obj, new_value: set_function(obj, new_value, settings),
122-
doc=doc_string)
134+
# read-only
135+
if 'write_string' not in settings:
136+
property_definition = property(
137+
fget=lambda obj: self.get_instrument_property(obj, settings),
138+
fset=None,
139+
doc=doc_string)
140+
# write-only
141+
elif 'query_string' not in settings:
142+
property_definition = property(
143+
fget=None,
144+
fset=lambda obj, new_value: set_function(obj, new_value, settings),
145+
doc=doc_string)
146+
else:
147+
property_definition = property(
148+
fget=lambda obj: self.get_instrument_property(obj, settings),
149+
fset=lambda obj, new_value: set_function(obj, new_value, settings),
150+
doc=doc_string,
151+
)
123152

124153
setattr(self.__class__, settings['name'], property_definition)
125154

0 commit comments

Comments
 (0)