diff --git a/iocBoot/iocimagedemo/Makefile b/iocBoot/iocimagedemo/Makefile new file mode 100644 index 0000000..89d66d0 --- /dev/null +++ b/iocBoot/iocimagedemo/Makefile @@ -0,0 +1,5 @@ +TOP = ../.. +include $(TOP)/configure/CONFIG +ARCH = linux-x86_64-debug +TARGETS = envPaths +include $(TOP)/configure/RULES.ioc diff --git a/iocBoot/iocimagedemo/image.db b/iocBoot/iocimagedemo/image.db new file mode 100644 index 0000000..a89670a --- /dev/null +++ b/iocBoot/iocimagedemo/image.db @@ -0,0 +1,40 @@ + + +record(longout, "$(N):ArraySize0_RBV") { + info(Q:group, { + "$(N):Array":{ + "foo.dimension[0].size":{+channel:"VAL", +type:"existing"} + } + }) + field(FLNK, "$(N):ArraySize1_RBV") +} + +record(longout, "$(N):ArraySize1_RBV") { + info(Q:group, { + "$(N):Array":{ + "foo.dimension[1].size":{+channel:"VAL", +type:"existing"} + } + }) + field(FLNK, "$(N):ArrayData_") +} + +record(aSub, "$(N):ArrayData_") { + field(SNAM, "QSRV_image_demo") + field(FTA, "ULONG") + field(FTB, "ULONG") + field(FTVA, "USHORT") + field(NOVA, "262144") # eg. 512x512 + field(INPA, "$(N):ArraySize0_RBV NPP MSI") + field(INPB, "$(N):ArraySize1_RBV NPP MSI") + field(OUTA, "$(N):ArrayData PP MSI") +} + +record(waveform, "$(N):ArrayData") { + field(FTVL, "UCHAR") + field(NELM, "256") + info(Q:group, { + "$(N):Array":{ + "foo":{+type:"NTNDArray", +channel:"VAL", +trigger:"*"} + } + }) +} diff --git a/iocBoot/iocimagedemo/st.cmd b/iocBoot/iocimagedemo/st.cmd new file mode 100755 index 0000000..851efa9 --- /dev/null +++ b/iocBoot/iocimagedemo/st.cmd @@ -0,0 +1,5 @@ +#!../../bin/linux-x86_64-debug/softIocPVA + +dbLoadRecords("image.db","N=TST:image1") + +iocInit() diff --git a/iocBoot/iocwfdemo/iq.db b/iocBoot/iocwfdemo/iq.db index b0d6219..73895f0 100644 --- a/iocBoot/iocwfdemo/iq.db +++ b/iocBoot/iocwfdemo/iq.db @@ -38,7 +38,7 @@ record(calc, "$(N)Phase:Q") { } record(waveform, "$(N)I") { - field(DTYP, "PDB Demo") + field(DTYP, "QSRV Demo") field( INP, "$(N)Phase:I") field(FTVL, "DOUBLE") field(NELM, "500") @@ -49,7 +49,7 @@ record(waveform, "$(N)I") { } record(waveform, "$(N)Q") { - field(DTYP, "PDB Demo") + field(DTYP, "QSRV Demo") field( INP, "$(N)Phase:Q") field(FTVL, "DOUBLE") field(NELM, "500") diff --git a/pdbApp/Makefile b/pdbApp/Makefile index 04215f5..40bbef1 100644 --- a/pdbApp/Makefile +++ b/pdbApp/Makefile @@ -15,6 +15,7 @@ qsrv_SRCS += pdb.cpp qsrv_SRCS += pdbsingle.cpp #qsrv_SRCS += pvalink.cpp qsrv_SRCS += demo.cpp +qsrv_SRCS += imagedemo.c ifdef BASE_3_16 qsrv_SRCS += pdbgroup.cpp diff --git a/pdbApp/demo.cpp b/pdbApp/demo.cpp index bdb2f80..1e634a4 100644 --- a/pdbApp/demo.cpp +++ b/pdbApp/demo.cpp @@ -26,6 +26,11 @@ long init_spin(waveformRecord *prec) long process_spin(waveformRecord *prec) { + if(prec->dpvt != &dummy) { + (void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM); + return 0; + } + const double freq = 360.0*pi_180/100; // rad/sample double phase = 0; double *val = static_cast(prec->bptr); diff --git a/pdbApp/imagedemo.c b/pdbApp/imagedemo.c new file mode 100644 index 0000000..a7684a9 --- /dev/null +++ b/pdbApp/imagedemo.c @@ -0,0 +1,50 @@ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +/** Generate a test pattern + * + * A - width (ULONG) + * B - height (ULONG) + * VALA - pixel array (USHORT) + */ +static +long QSRV_image_demo(aSubRecord *prec) +{ + epicsUInt32 W = *(epicsUInt32*)prec->a, + H = *(epicsUInt32*)prec->b; + epicsUInt16 *I = (epicsUInt16*)prec->vala; + epicsUInt32 i, j; + epicsUInt16 phase; + + if(W*H>prec->nova) { + (void)recGblSetSevr(prec, READ_ALARM, INVALID_ALARM); + return 0; + } + + for(i=0; ineva = W*H; + return 0; +} + +epicsRegisterFunction(QSRV_image_demo); diff --git a/pdbApp/qsrv.dbd b/pdbApp/qsrv.dbd index 58329a5..c2a4db3 100644 --- a/pdbApp/qsrv.dbd +++ b/pdbApp/qsrv.dbd @@ -3,4 +3,6 @@ registrar(QSRVRegistrar) #link("pva", "lsetPVA") # from demo.cpp -device(waveform, CONSTANT, devWfPDBDemo, "PDB Demo") +device(waveform, CONSTANT, devWfPDBDemo, "QSRV Demo") +# from imagedemo.c +function(QSRV_image_demo)