Skip to content

Commit

Permalink
Simplify metadata handling
Browse files Browse the repository at this point in the history
  • Loading branch information
DiamondJoseph committed Mar 11, 2024
1 parent c43b321 commit ff0cfb7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 24 deletions.
30 changes: 11 additions & 19 deletions src/ophyd_async/epics/_backend/_aioca.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@
dbr.DBR_DOUBLE: "number",
dbr.DBR_ENUM: "string",
}
_number_dbr = {dbr.DBR_SHORT, dbr.DBR_CHAR, dbr.DBR_LONG, dbr.DBR_FLOAT, dbr.DBR_DOUBLE}
_floating_dbr = {dbr.DBR_FLOAT, dbr.DBR_DOUBLE}
_number_meta = {
_common_meta = {
"units",
"lower_alarm_limit",
"upper_alarm_limit",
Expand All @@ -50,20 +48,18 @@
"upper_disp_limit",
"lower_warning_limit",
"upper_warning_limit",
"precision",
"timestamp",
}


def _if_has_meta_add_meta(
d: Dict[str, Any], value: AugmentedValue, key: Union[str, Set[str]]
):
if isinstance(key, str):
key = {key}
for k in key:
if not hasattr(value, k):
def _if_has_meta_add_meta(d: Dict[str, Any], value: AugmentedValue, keys: Set[str]):
for key in keys:
if not hasattr(value, key):
continue
attr = getattr(value, k)
attr = getattr(value, key)
if isinstance(attr, str) or not isnan(attr):
d[k] = attr
d[key] = attr


def _data_key_from_augmented_value(value: AugmentedValue, **kwargs) -> Descriptor:
Expand All @@ -83,22 +79,18 @@ def _data_key_from_augmented_value(value: AugmentedValue, **kwargs) -> Descripto
assert value.ok, f"Error reading {source}: {value}"

scalar = value.element_count == 1
dtype = dbr_to_dtype[value.datatype]

d = Descriptor(
source=source,
dtype=dbr_to_dtype[value.datatype] if scalar else "array",
dtype=dtype if scalar else "array",
# strictly value.element_count >= len(value)
shape=[] if scalar else [len(value)],
)

if value.datatype in _number_dbr:
_if_has_meta_add_meta(d, value, _number_meta)
if value.datatype in _floating_dbr:
_if_has_meta_add_meta(d, value, "precision")
_if_has_meta_add_meta(d, value, _common_meta)
if value.datatype is dbr.DBR_ENUM:
d["choices"] = value.enums
if value.datatype is dbr.DBR_STRING:
_if_has_meta_add_meta(d, value, "timestamp")
d.update(kwargs)

return d
Expand Down
10 changes: 5 additions & 5 deletions tests/epics/test_signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,10 @@ class MyEnum(str, Enum):
}

_int_metadata = {
"lower_alarm_limit": 0,
"lower_warning_limit": 0,
"upper_alarm_limit": 0,
"upper_warning_limit": 0,
"lower_alarm_limit": ANY,
"lower_warning_limit": ANY,
"upper_alarm_limit": ANY,
"upper_warning_limit": ANY,
}

_metadata: Dict[str, Dict[str, Any]] = {
Expand All @@ -171,7 +171,7 @@ class MyEnum(str, Enum):

def descriptor(protocol: str, suffix: str, value=None) -> Descriptor:
def get_internal_dtype(suffix: str) -> str:
# uint32, int64, uint64 all backed by DBR_DOUBLE which has precision
# uint32, [u]int64 backed by DBR_DOUBLE, have precision
if "float" in suffix or "uint32" in suffix or "int64" in suffix:
return "number"
if "int" in suffix or "bool" in suffix:
Expand Down

0 comments on commit ff0cfb7

Please sign in to comment.