async def _test(pvdb=None): logger.setLevel('DEBUG') if pvdb is None: pvdb = { 'pi': 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': ChannelEnum( value='b', enum_strings=['a', 'b', 'c', 'd'], ), 'enum2': ChannelEnum( value='bb', enum_strings=['aa', 'bb', 'cc', 'dd'], ), 'int': ChannelInteger( value=96, units='doodles', ), '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, ), 'chararray': ca.ChannelChar(value=b'1234567890' * 2), 'str': ca.ChannelString(value='hello', string_encoding='latin-1'), 'stra': ca.ChannelString(value=['hello', 'how is it', 'going'], string_encoding='latin-1'), } pvdb['pi'].alarm.alarm_string = 'delicious' ctx = Context('0.0.0.0', find_next_tcp_port(), pvdb) logger.info('Server starting up on %s:%d', ctx.host, ctx.port) return await ctx.run()
def __init__(self, *, fs): self._fs = fs # this assumes a sub-class creates self.zclient and then calls # super() self.frametime_channel = ChannelGeRMFrameTime( value=1, zclient=self.zclient) # limited length, but works! self.filepath_channel = ca.ChannelString( value=b'/tmp/test', string_encoding='latin-1') self.last_file_channel = ca.ChannelString( value=b'null', string_encoding='latin-1') self.count_channel = ca.ChannelInteger(value=0) self.overfill_channel = ca.ChannelInteger(value=0) self.last_frame_channel = ca.ChannelInteger(value=0) self.uid_chip_channel = ca.ChannelString( value=b'null', string_encoding='latin-1') self.uid_chan_channel = ca.ChannelString( value=b'null', string_encoding='latin-1') self.uid_td_channel = ca.ChannelString( value=b'null', string_encoding='latin-1') self.uid_pd_channel = ca.ChannelString( value=b'null', string_encoding='latin-1') self.uid_ts_channel = ca.ChannelString( value=b'null', string_encoding='latin-1')
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
'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_status=str_alarm_status, reported_record_type='caproto'), } @pytest.fixture(scope='function') def curio_server(): 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
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
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 main(): ioc_options, run_options = ioc_arg_parser( default_prefix='type_varieties:', desc='Run an IOC with PVs of various data types.') prefix = ioc_options['prefix'] prefixed_pvdb = {prefix + key: value for key, value in pvdb.items()}
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": ca.ChannelData(value=np.random.poisson(100, 4000)), "empty_string": ca.ChannelString(value="", string_encoding="latin-1"), "empty_bytes": ca.ChannelByte(value=b""), "empty_char": ca.ChannelChar(value=b""), "empty_float": ca.ChannelDouble(value=[], max_length=2),