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
), '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', 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, ), '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'), }
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
ca.ChannelInteger( value=96, units="doodles", ), "int3": 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, ), "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"), "waveform":