def curio_server(): caget_pvdb = { 'pi': ca.ChannelDouble(value=3.14, lower_disp_limit=3.13, upper_disp_limit=3.15, lower_alarm_limit=3.12, upper_alarm_limit=3.16, lower_warning_limit=3.11, upper_warning_limit=3.17, lower_ctrl_limit=3.10, upper_ctrl_limit=3.18, precision=5, units='doodles', ), 'enum': ca.ChannelEnum(value='b', enum_strings=['a', 'b', 'c', 'd'], ), 'int': ca.ChannelInteger(value=33, units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'char': ca.ChannelChar(value=b'3', units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'str': ca.ChannelString(value='hello', alarm=str_alarm_status, reported_record_type='caproto'), } async def run_server(): port = find_next_tcp_port(host=SERVER_HOST) print('Server will be on', (SERVER_HOST, port)) ctx = server.Context(SERVER_HOST, port, caget_pvdb, log_level='DEBUG') try: await ctx.run() except Exception as ex: print('Server failed', ex) raise finally: print('Server exiting') return run_server, caget_pvdb
ca.ChannelDouble( value=3.14, lower_disp_limit=3.13, upper_disp_limit=3.15, lower_alarm_limit=3.12, upper_alarm_limit=3.16, lower_warning_limit=3.11, upper_warning_limit=3.17, lower_ctrl_limit=3.10, upper_ctrl_limit=3.18, precision=5, units='doodles', ), 'enum': ca.ChannelEnum( value='b', enum_strings=['a', 'b', 'c', 'd'], ), 'int': ca.ChannelInteger( value=33, units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'char':
def curio_server(prefix): str_alarm_status = ca.ChannelAlarm( status=ca.AlarmStatus.READ, severity=ca.AlarmSeverity.MINOR_ALARM, alarm_string='alarm string', ) caget_pvdb = { 'pi': ca.ChannelDouble( value=3.14, lower_disp_limit=3.13, upper_disp_limit=3.15, lower_alarm_limit=3.12, upper_alarm_limit=3.16, lower_warning_limit=3.11, upper_warning_limit=3.17, lower_ctrl_limit=3.10, upper_ctrl_limit=3.18, precision=5, units='doodles', ), 'enum': ca.ChannelEnum( value='b', enum_strings=['a', 'b', 'c', 'd'], ), 'int': ca.ChannelInteger( value=33, units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'char': ca.ChannelByte( value=b'3', units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'str': ca.ChannelString(value='hello', alarm=str_alarm_status, reported_record_type='caproto'), } # tack on a unique prefix caget_pvdb = {prefix + key: value for key, value in caget_pvdb.items()} # Hide these imports so that the other fixtures are usable by other # libraries (e.g. ophyd) without the experimental dependencies. import curio import caproto.curio async def _server(pvdb): ctx = caproto.curio.server.Context(pvdb) try: await ctx.run() except caproto.curio.server.ServerExit: logger.info('ServerExit caught; exiting') except Exception as ex: logger.error('Server failed: %s %s', type(ex), ex) raise async def run_server(client, *, pvdb=caget_pvdb): server_task = await curio.spawn(_server, pvdb, daemon=True) try: await client() except caproto.curio.server.ServerExit: ... finally: await server_task.cancel() return run_server, prefix, caget_pvdb
def pvdb_from_server_example(): alarm = ca.ChannelAlarm( status=ca.AlarmStatus.READ, severity=ca.AlarmSeverity.MINOR_ALARM, alarm_string='alarm string', ) pvdb = { 'pi': ca.ChannelDouble( value=3.14, lower_disp_limit=3.13, upper_disp_limit=3.15, lower_alarm_limit=3.12, upper_alarm_limit=3.16, lower_warning_limit=3.11, upper_warning_limit=3.17, lower_ctrl_limit=3.10, upper_ctrl_limit=3.18, precision=5, units='doodles', alarm=alarm, ), 'enum': ca.ChannelEnum( value='b', enum_strings=['a', 'b', 'c', 'd'], ), 'enum2': ca.ChannelEnum( value='bb', enum_strings=['aa', 'bb', 'cc', 'dd'], ), 'int': ca.ChannelInteger( value=96, units='doodles', ), 'char': ca.ChannelByte( value=b'3', units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'bytearray': ca.ChannelByte(value=b'1234567890' * 2), 'chararray': ca.ChannelChar(value=b'1234567890' * 2), 'str': ca.ChannelString(value='hello', string_encoding='latin-1', alarm=alarm), 'str2': ca.ChannelString(value='hello', string_encoding='latin-1', alarm=alarm), 'stra': ca.ChannelString(value=['hello', 'how is it', 'going'], string_encoding='latin-1'), } return pvdb
def curio_server(prefix): str_alarm_status = ca.ChannelAlarm( status=ca.AlarmStatus.READ, severity=ca.AlarmSeverity.MINOR_ALARM, alarm_string='alarm string', ) caget_pvdb = { 'pi': ca.ChannelDouble( value=3.14, lower_disp_limit=3.13, upper_disp_limit=3.15, lower_alarm_limit=3.12, upper_alarm_limit=3.16, lower_warning_limit=3.11, upper_warning_limit=3.17, lower_ctrl_limit=3.10, upper_ctrl_limit=3.18, precision=5, units='doodles', ), 'enum': ca.ChannelEnum( value='b', enum_strings=['a', 'b', 'c', 'd'], ), 'int': ca.ChannelInteger( value=33, units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'char': ca.ChannelByte( value=b'3', units='poodles', lower_disp_limit=33, upper_disp_limit=35, lower_alarm_limit=32, upper_alarm_limit=36, lower_warning_limit=31, upper_warning_limit=37, lower_ctrl_limit=30, upper_ctrl_limit=38, ), 'str': ca.ChannelString(value='hello', alarm=str_alarm_status, reported_record_type='caproto'), } # tack on a unique prefix caget_pvdb = {prefix + key: value for key, value in caget_pvdb.items()} async def _server(pvdb): ctx = caproto.curio.server.Context(pvdb) try: await ctx.run() except caproto.curio.server.ServerExit: logger.info('ServerExit caught; exiting') except Exception as ex: logger.exception('Server failed') raise async def run_server(client, *, pvdb=caget_pvdb): server_task = await curio.spawn(_server, pvdb, daemon=True) try: if hasattr(client, 'wait'): # NOTE: wrapped by threaded_in_curio_wrapper await curio.run_in_thread(client) await client.wait() else: await client() except caproto.curio.server.ServerExit: ... finally: await server_task.cancel() return run_server, prefix, caget_pvdb
), 'fib': ca.ChannelDouble(value=[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], lower_disp_limit=3.13, upper_disp_limit=3.15, lower_alarm_limit=3.12, upper_alarm_limit=3.16, lower_warning_limit=3.11, upper_warning_limit=3.17, lower_ctrl_limit=3.10, upper_ctrl_limit=3.18, precision=5, units='doodles', alarm=alarm, ), 'enum': ca.ChannelEnum(value='b', enum_strings=['a', 'b', 'c', 'd'], ), 'enum2': ca.ChannelEnum(value='bb', enum_strings=['aa', 'bb', 'cc', 'dd'], ), 'int': ca.ChannelInteger(value=96, units='doodles', ), 'int2': ca.ChannelInteger(value=96, units='doodles', ), 'int3': ca.ChannelInteger(value=96, units='doodles', ), 'char': ca.ChannelByte(value=b'3', units='poodles',
value=[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], lower_disp_limit=3.13, upper_disp_limit=3.15, lower_alarm_limit=3.12, upper_alarm_limit=3.16, lower_warning_limit=3.11, upper_warning_limit=3.17, lower_ctrl_limit=3.10, upper_ctrl_limit=3.18, precision=5, units="doodles", alarm=alarm, ), "enum": ca.ChannelEnum( value="b", enum_strings=["a", "b", "c", "d"], ), "enum2": ca.ChannelEnum( value="bb", enum_strings=["aa", "bb", "cc", "dd"], ), "int": ca.ChannelInteger( value=96, units="doodles", ), "int2": ca.ChannelInteger( value=96, units="doodles",
def test_enum_too_many(): with pytest.raises(ValueError, match='The maximum number of enum states is'): ca.ChannelEnum(enum_strings='a' * 17)
def test_enum_too_long(): with pytest.raises(ValueError, match='The maximum enum string length is'): ca.ChannelEnum(enum_strings=('a' * 28,))