From 2a41d2906299abf1bed5067f9f5e9cf1086c6379 Mon Sep 17 00:00:00 2001 From: Tom Cobb Date: Tue, 4 Jul 2023 14:33:53 +0000 Subject: [PATCH] Use pvxslibs instead of qsrv --- pyproject.toml | 2 +- setup.py | 5 +---- softioc/__init__.py | 12 +++++++++--- softioc/builder.py | 11 +++++++---- tests/expected_records.db | 20 +++++++++++++++----- tests/sim_records.py | 6 +++++- tests/test_asyncio.py | 6 ++++++ 7 files changed, 44 insertions(+), 18 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 24ab8bae..325848e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,3 @@ [build-system] -requires = ["setuptools", "wheel", "setuptools_dso>=2.1", "epicscorelibs>=7.0.7.99.0.0"] +requires = ["setuptools", "wheel", "setuptools_dso>=2.1", "epicscorelibs>=7.0.7.99.0.2"] build-backend = "setuptools.build_meta:__legacy__" diff --git a/setup.py b/setup.py index 34157bce..2f436ccf 100644 --- a/setup.py +++ b/setup.py @@ -61,10 +61,6 @@ devIocStats_src, devIocStats_os, devIocStats_default ], dsos = [ - 'epicscorelibs.lib.qsrv', - 'epicscorelibs.lib.pvAccessIOC', - 'epicscorelibs.lib.pvAccess', - 'epicscorelibs.lib.pvData', 'epicscorelibs.lib.dbRecStd', 'epicscorelibs.lib.dbCore', 'epicscorelibs.lib.ca', @@ -95,6 +91,7 @@ def install_for_development(self): install_requires = [ # Dependency version declared in pyproject.toml epicscorelibs.version.abi_requires(), + "pvxslibs>=1.2.2", "numpy", "epicsdbbuilder>=1.4" ], diff --git a/softioc/__init__.py b/softioc/__init__.py index 2fb60947..5eabe59f 100644 --- a/softioc/__init__.py +++ b/softioc/__init__.py @@ -1,7 +1,10 @@ '''Python soft IOC module.''' import os +import ctypes -from epicscorelibs import path +from setuptools_dso.runtime import find_dso +import epicscorelibs.path +import pvxslibs.path from epicscorelibs.ioc import \ iocshRegisterCommon, registerRecordDeviceDriver, pdbbase @@ -17,11 +20,14 @@ # Need to do this before calling anything in device.py iocshRegisterCommon() -for dbd in ('base.dbd', 'PVAServerRegister.dbd', 'qsrv.dbd'): - dbLoadDatabase(dbd, os.path.join(path.base_path, 'dbd'), None) +base_dbd_path = os.path.join(epicscorelibs.path.base_path, 'dbd') +dbLoadDatabase('base.dbd', base_dbd_path, None) +dbLoadDatabase('pvxsIoc.dbd', pvxslibs.path.dbd_path, None) iocStats = os.path.join(os.path.dirname(__file__), "iocStats", "devIocStats") dbLoadDatabase('devIocStats.dbd', iocStats, None) +ctypes.CDLL(find_dso('pvxslibs.lib.pvxsIoc'), ctypes.RTLD_GLOBAL) +os.environ.setdefault('PVXS_QSRV_ENABLE', 'YES') if registerRecordDeviceDriver(pdbbase): raise RuntimeError('Error registering') diff --git a/softioc/builder.py b/softioc/builder.py index 70ae8a1c..a71745fa 100644 --- a/softioc/builder.py +++ b/softioc/builder.py @@ -261,20 +261,23 @@ def _long_string(fields): fields.setdefault('initial_value', '') fields['_wf_nelm'] = length - fields['_wf_dtype'] = numpy.dtype('uint8') + fields['_wf_dtype'] = numpy.dtype('int8') fields['NELM'] = length - fields['FTVL'] = 'UCHAR' + fields['FTVL'] = 'CHAR' +def qform_string(rec): + rec.add_info("Q:form", "String") + return rec def longStringIn(name, **fields): _long_string(fields) _set_in_defaults(fields) - return PythonDevice.long_stringin(name, **fields) + return qform_string(PythonDevice.long_stringin(name, **fields)) def longStringOut(name, **fields): _long_string(fields) - return PythonDevice.long_stringout(name, **fields) + return qform_string(PythonDevice.long_stringout(name, **fields)) diff --git a/tests/expected_records.db b/tests/expected_records.db index f9faaccb..4b93fe50 100644 --- a/tests/expected_records.db +++ b/tests/expected_records.db @@ -14,6 +14,18 @@ record(ao, "TS-DI-TEST-01:AO") field(OUT, "@TS-DI-TEST-01:AO") } +record(waveform, "TS-DI-TEST-01:AVERYLONGRECORDSUFFIXTOMAKELONGPV") +{ + field(DISP, "1") + field(DTYP, "PythonLongStringIn") + field(FTVL, "CHAR") + field(INP, "@TS-DI-TEST-01:AVERYLONGRECORDSUFFIXTOMAKELONGPV") + field(NELM, "51") + field(PINI, "YES") + field(SCAN, "I/O Intr") + info(Q:form, "String") +} + record(bi, "TS-DI-TEST-01:BOOLIN") { field(DISP, "1") @@ -53,13 +65,11 @@ record(longout, "TS-DI-TEST-01:LONGOUT") record(waveform, "TS-DI-TEST-01:LONGSTRING") { - field(DISP, "1") - field(DTYP, "PythonLongStringIn") - field(FTVL, "UCHAR") + field(DTYP, "PythonLongStringOut") + field(FTVL, "CHAR") field(INP, "@TS-DI-TEST-01:LONGSTRING") field(NELM, "256") - field(PINI, "YES") - field(SCAN, "I/O Intr") + info(Q:form, "String") } record(mbbi, "TS-DI-TEST-01:MBBI") diff --git a/tests/sim_records.py b/tests/sim_records.py index ee712601..b882d58e 100644 --- a/tests/sim_records.py +++ b/tests/sim_records.py @@ -63,7 +63,11 @@ def update_sin_wf(value): WaveformOut('WAVEFORM_OUT', wf, on_update = on_update) Waveform('WAVEFORM2', length = 10) - longStringIn('LONGSTRING', length = 256) + longStringOut('LONGSTRING', length = 256) + longStringIn( + 'AVERYLONGRECORDSUFFIXTOMAKELONGPV', + initial_value="A long string that is more than 40 characters long" + ) create_records() diff --git a/tests/test_asyncio.py b/tests/test_asyncio.py index 7a794b28..326ee1ff 100644 --- a/tests/test_asyncio.py +++ b/tests/test_asyncio.py @@ -52,6 +52,12 @@ async def test_asyncio_ioc(asyncio_ioc): from p4p.client.asyncio import Context with Context("pva") as ctx: assert await ctx.get(pre + ":AI") == 23.45 + long_pv = pre + ":AVERYLONGRECORDSUFFIXTOMAKELONGPV" + long_str = "A long string that is more than 40 characters long" + assert await ctx.get(long_pv) == long_str + assert await ctx.get(long_pv + ".NAME") == long_pv + await ctx.put(pre + ":LONGSTRING", long_str) + assert await ctx.get(pre + ":LONGSTRING") == long_str conn.send("D") # "Done" select_and_recv(conn, "D") # "Done"