#!/usr/bin/env python3
import enum
from textwrap import dedent
from caproto import ChannelType
from caproto.server import PVGroup, ioc_arg_parser, pvproperty, run
class MyEnum(enum.IntEnum):
off = 0
on = 1
unknown = 2
[docs]class EnumIOC(PVGroup):
"""
An IOC with some enums.
Each property here presents itself as a record with the expected fields
over Channel Access.
For ``bi`` and ``bo``, the ZNAM and ONAM fields hold the string equivalent
values for 0 and 1. These are derived from the ``enum_strings`` keyword
argument.
That is, ``bo.ZNAM`` is "Zero Value", ``bo.ONAM`` is ``"One Value"``, such
that ``caput bo 1`` would show it being set to ``"One Value"``.
For the mbbi record, the ``ZRST`` (zero string) field, ``ONST`` (one
string) field, and so on (up to 15), are similarly respected and mapped
from the ``enum_strings`` keyword argument.
Scalar PVs
----------
bo (enum) - a binary output (bo) record
bi (enum) - a binary input (bi) record
mbbi (enum) - a multi-bit binary input (mbbi) record
"""
bo = pvproperty(value='One Value',
enum_strings=['Zero Value', 'One Value'],
record='bo',
dtype=ChannelType.ENUM)
bi = pvproperty(value='a',
enum_strings=['a', 'b'],
record='bi',
dtype=ChannelType.ENUM)
mbbi = pvproperty(value='one',
enum_strings=['zero',
'one',
'two',
'three',
'four'],
record='mbbi',
dtype=ChannelType.ENUM
)
# A new, easier syntax:
enum_class = pvproperty(
value=MyEnum.on,
record='mbbi',
)
if __name__ == '__main__':
ioc_options, run_options = ioc_arg_parser(
default_prefix='enum:',
desc=dedent(EnumIOC.__doc__))
ioc = EnumIOC(**ioc_options)
run(ioc.pvdb, **run_options)