From 95c47f6174a3bede237dc7d437008b191c9805e1 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 31 Oct 2022 14:51:10 +0100 Subject: [PATCH 1/2] Add new pv to get timestamp from EVR --- ADHamaApp/Db/hama.template | 44 +++++++++++++++++++++---------- ADHamaApp/src/hama.cpp | 53 +++++++++++++++++++++++++------------- cmds/st.cmd | 2 +- 3 files changed, 67 insertions(+), 32 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index b3afdd4..f487022 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -92,9 +92,21 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") { record(longin, "$(P)$(R)ArrayCounter_RBV") { - field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER") - field(SCAN, "I/O Intr") + field(FLNK, "$(P)$(R)#EVRTimeProc.PROC") +} + +record(ai, "$(P)$(R)#EVRTimeProc") { + field(DESC, "Start proce the EVRTime record") + field(TSEL, "$(EVR):Evt$(E)Cnt-I.TIME") + field(DTYP, "Soft Timestamp") + field(FLNK, "$(P)$(R)EVRTime-R.PROC") +} + +record(calc, "$(P)$(R)EVRTime-R") { + field(DESC, "EPICS epoch EVRTime timestamp") + field(CALC, "a+b") + field(INPA, "631152001") + field(INPB, "$(P)$(R)#EVRTimeProc") } ########################################################################## @@ -610,7 +622,7 @@ record(mbbo, "$(P)$(R)Binning-S") { # field(DRVL, "1") # field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") - field(VAL, "1") + field(VAL, "0") } record(mbbi, "$(P)$(R)Binning-RB") { @@ -640,8 +652,8 @@ record(mbbo, "$(P)$(R)SubarrayMode-S") { field(ZRST, "OFF") field(ONVL, "2") field(ONST, "ON") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") - field(VAL, "1") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SUBARRAY_MODE") + field(VAL, "0") } record(mbbi, "$(P)$(R)SubarrayMode-RB") { @@ -651,7 +663,7 @@ record(mbbi, "$(P)$(R)SubarrayMode-RB") { field(ZRST, "OFF") field(ONVL, "2") field(ONST, "ON") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SUBARRAY_MODE") field(SCAN, "I/O Intr") } @@ -1453,12 +1465,18 @@ record(ai, "$(P)$(R)ImagePixelNumVert-R") { } record(mbbi, "$(P)$(R)TimeStampProd-R") { - field(DESC,"") + field(DESC, "Timestamp produced source") field(DTYP, "asynInt32") - field(ZRVL, "2") - field(ZRST, "TimeStamp DCAM Module") - field(ONVL, "5") - field(ONST, "TimeStamp Image Dev") + field(ZRVL, "1") + field(ZRST, "None") + field(ONVL, "2") + field(ONST, "DCAM Module") + field(TWVL, "3") + field(TWST, "Kernel Driver") + field(THVL, "4") + field(THST, "Frame Grabber") + field(FRVL, "5") + field(FRST, "Camera") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TIMESTAMP_PRODUCER") field(SCAN, "I/O Intr") } @@ -1472,4 +1490,4 @@ record(mbbi, "$(P)$(R)FrameStampProd-R") { field(ONST, "FrameStamp Image Dev") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_FRAMESTAMP_PRODUCER") field(SCAN, "I/O Intr") -} \ No newline at end of file +} diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 5202e82..f045b08 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -254,6 +254,7 @@ int Hama::initCamera(){ err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); + err |= getParameter(DCAM_IDPROP_TIMESTAMP_PRODUCER); if(err){ // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", @@ -478,7 +479,12 @@ int Hama::getParameter(int propertyID){ status = setIntegerParam(hInternalTriggerHandling, value_d); //printf("The INTERNAL TRIGGE HANDLING = %f\n", value_d); break; - + + case DCAM_IDPROP_TIMESTAMP_PRODUCER: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &value_d); + status = setIntegerParam(hTimeStampProducer, value_d); + break; + default: printf("The init parameter not recognised.... = %d\n", propertyID); break; @@ -660,11 +666,13 @@ void Hama::imageTask(){ memset(image, 0, width * 2 * height); count++; + setIntegerParam(NDArrayCounter, count); int32 ts_sec = 0, ts_microsec = 0; accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, width * 2, width, height, ts_sec, ts_microsec); + // printf("Timestamp from camera: %d\n", ts_sec + ts_microsec); getIntegerParam(NDArrayCallbacks, &callback); if(callback) { @@ -784,8 +792,8 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[DEBUG]::function ADImageMode\n"); } else if (index == ADNumExposures) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); + //camprop_setvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, value); + //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); printf("[DEBUG]::function ADNumExposures\n"); } else if (index == ADMinX) { @@ -1243,6 +1251,7 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + /* else if (index == hExposureTime) { printf("[DEBUG]::function ADImageMode %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); @@ -1250,6 +1259,11 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } +<<<<<<< HEAD +======= + */ + +>>>>>>> Add new pv to get timestamp from EVR else if (index == hTimingReadoutTime) { printf("[DEBUG]::function TimingReadoutTime %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &dvalue); @@ -1405,16 +1419,20 @@ int Hama::updateSensorSize(){ status |= getIntegerParam(ADSizeY, &sizeV); status |= getIntegerParam(hBinning, &binning); - printf("minH = %d\n", minH); + printf("minH = %d\nminV = %d\nSizeV = %d\nSizeH = %d\n", minH, minV, sizeV, sizeH); - - m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, 2); - if( failed(m_err) ) - printError( m_hdcam, m_err, "dcambuf_release()" ); + double value = 0; + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING_INDEPENDENT, &value); + printf("DCAM_IDPROP_BINNING_INDEPENDENT: %d\n", value); + + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &value); + printf("DCAM_IDPROP_SUBARRAYMODE: %d\n", value); + + // set subarray mode off. This setting is not mandatory, + // but you have to control the setting order of offset and size when mode is on. + m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, DCAMPROP_MODE__OFF); m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, minH); - sleep(1); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &v1); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &v1); if( failed(m_err) ) printError( m_hdcam, m_err, "dcambuf_release()" ); @@ -1435,24 +1453,19 @@ int Hama::updateSensorSize(){ if( failed(m_err) ) printError( m_hdcam, m_err, "dcambuf_release()" ); + // set subarray mode on. The combination of offset and size is checked on this timing. + m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, DCAMPROP_MODE__ON); + m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BINNING, (double)binning); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &b1); if( failed(m_err) ) printError( m_hdcam, m_err, "dcambuf_release()" ); -/* - for(int i =0; i < 5; i++){ - printf("sleep %d\n", i); - sleep(1); - } - */ dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &a1); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &a2); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &a3); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &a4); - //setIntegerParam(hSubarrayMode, 2); - printf(".... callParamCallback ...\n"); status = (asynStatus) callParamCallbacks(); printf("status = %d\n", status); @@ -1765,6 +1778,10 @@ asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, return asynError; } + // Get timestamp from the the frame + ts_sec = bufframe.timestamp.sec; + ts_microsec = bufframe.timestamp.microsec; + // copy target ROI int32 copyrowbytes = cx * 2; char* pSrc = (char*)bufframe.buf; diff --git a/cmds/st.cmd b/cmds/st.cmd index 5a39edf..f055f2d 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -17,7 +17,7 @@ epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "64000000") devHamamatsuConfig("$(PORT)", $(CAMERA), 0, 0, 0, 0, 10) -dbLoadRecords("$(adhama_DIR)db/hama.db","P=$(PREFIX),R=cam1:,PORT=$(PORT),ADDR=0,TIMEOUT=1") +dbLoadRecords("$(adhama_DIR)db/hama.db","P=$(PREFIX),R=cam1:,EVR=LabS-Utgard-VIP:TS-EVR-3,E=F,PORT=$(PORT),ADDR=0,TIMEOUT=1") asynSetTraceMask("$(PORT)",-1,0x9) asynSetTraceIOMask("$(PORT)",-1,0x2) From 8a6cae46d41b3a23f7e0ef6ba22fd05523e2c997 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Fri, 4 Nov 2022 08:46:36 +0100 Subject: [PATCH 2/2] Fix EPICS epoch offset --- ADHamaApp/Db/hama.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index f487022..1db9f4e 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -105,7 +105,7 @@ record(ai, "$(P)$(R)#EVRTimeProc") { record(calc, "$(P)$(R)EVRTime-R") { field(DESC, "EPICS epoch EVRTime timestamp") field(CALC, "a+b") - field(INPA, "631152001") + field(INPA, "631152000") field(INPB, "$(P)$(R)#EVRTimeProc") }