diff --git a/ADOrca.Makefile b/ADOrca.Makefile index 9c85548..5d63f25 100644 --- a/ADOrca.Makefile +++ b/ADOrca.Makefile @@ -69,8 +69,6 @@ APPCMDS := $(APP)/cmds TEMPLATES += $(wildcard $(APPDB)/*.db) TEMPLATES += $(wildcard $(ADCORE_DIR)/*.db) -# TEMPLATES += $(wildcard $(APPDB)/*.proto) -TEMPLATES += $(wildcard $(APPDB)/*.template) # USR_INCLUDES += -I$(where_am_I)$(APPSRC) # USR_INCLUDES += -I $(E3_ADCORE_LOCATION)/ADCore/ADApp/ADSrc diff --git a/ADOrcaApp/Db/orca.template b/ADOrcaApp/Db/orca.template index acf8c1e..bfaf218 100644 --- a/ADOrcaApp/Db/orca.template +++ b/ADOrcaApp/Db/orca.template @@ -251,6 +251,19 @@ record(ao, "$(P)$(R)#EVRCounts") { field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_COUNTS") } +record(longin, "$(P)$(R)#TriggerSinceStart") { + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_TRIGGERS_SINCE_ACQ_START") + field(SCAN, "I/O Intr") +} + +record(longin, "$(P)$(R)TriggerDropped-RB") { + field(DESC, "Counter with EVR trigger dropped") + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_TRIGGER_DROPPED") + field(SCAN, "I/O Intr") +} + ########################################################################## # General properties # ########################################################################## diff --git a/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp index abf5042..0556dfa 100644 --- a/ADOrcaApp/src/orca.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -184,6 +184,8 @@ Orca::Orca(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam(evrTimeStampString, asynParamOctet, &evrTimeStamp); createParam(evrCountString, asynParamInt32, &evrCounts); + createParam(evrCountSinceAcqStartString, asynParamInt32, &evrCountsSinceAcqStart); + createParam(evrTriggerDroppedString, asynParamInt32, &evrTriggerDropped); createParam(hAcqControlString, asynParamInt32, &hAcqControl); setIntegerParam(NDArrayCallbacks, 1); @@ -773,10 +775,17 @@ void Orca::imageTask(){ //int acquireStatusError = 0; int imageMode=0; int totalImages=0; + int initial_evr_counters = 0; + int evr_counts_since_last_start = 0; + int evr_counts_since_last_start_previous = 0; + int evr_trigger_dropped = 0; uint64_t prevAcquisitionCount = 0; DCAMCAP_TRANSFERINFO captransferinfo; epicsTimeStamp prevAcqTime, currentAcqTime; + epicsTimeStamp prev_trigger_time, current_trigger_time; double elapsedTime; + int evr_counts = 0; + double exposure_time, readout_time; int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; @@ -801,10 +810,16 @@ void Orca::imageTask(){ epicsThreadSleep(.1); } else { + getIntegerParam(ADNumImages, &totalImages); + getIntegerParam(ADImageMode, &imageMode); setIntegerParam(ADStatus, ADStatusAcquire); acquire = 1; prevAcquisitionCount = 0; + evr_trigger_dropped = 0; setIntegerParam(ADNumImagesCounter, 0); + getIntegerParam(evrCounts, &initial_evr_counters); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &readout_time); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &exposure_time); } } @@ -842,16 +857,17 @@ void Orca::imageTask(){ accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, width * 2, width, height, ts_sec, ts_microsec); - double exposure_time, readout_time, timestamp; - - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &readout_time); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &exposure_time); + double timestamp; getIntegerParam(hTriggerSource, &triggerMode); if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { - int evr_counts = 0; getIntegerParam(evrCounts, &evr_counts); + evr_counts_since_last_start = evr_counts - initial_evr_counters; + evr_trigger_dropped = evr_counts_since_last_start - captransferinfo.nFrameCount; printf("EVR event count: %d\n", evr_counts); + printf("evr_counts_since_last_start: %d\n", evr_counts_since_last_start); + setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start); + setIntegerParam(evrTriggerDropped, evr_trigger_dropped); char buf[256]; getStringParam(evrTimeStamp, 256, buf); @@ -899,10 +915,25 @@ void Orca::imageTask(){ delete[] image; } - getIntegerParam(ADNumImages, &totalImages); - getIntegerParam(ADImageMode, &imageMode); setIntegerParam(ADNumImagesCounter, captransferinfo.nFrameCount); + getIntegerParam(evrCounts, &evr_counts); + evr_counts_since_last_start = evr_counts - initial_evr_counters; + if (evr_counts_since_last_start != evr_counts_since_last_start_previous) { + setIntegerParam(evrCountsSinceAcqStart, evr_counts_since_last_start); + epicsTimeGetCurrent(&prev_trigger_time); + evr_counts_since_last_start_previous = evr_counts_since_last_start; + } + + epicsTimeGetCurrent(¤t_trigger_time); + + if (epicsTimeDiffInSeconds(¤t_trigger_time, &prev_trigger_time) > (exposure_time + readout_time)) { + if ((evr_counts_since_last_start) > captransferinfo.nFrameCount ) { + evr_trigger_dropped = evr_counts_since_last_start - captransferinfo.nFrameCount; + setIntegerParam(evrTriggerDropped, evr_trigger_dropped); + } + } + if ((imageMode == ADImageMultiple && totalImages == captransferinfo.nFrameCount) || (imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) { setShutter(0); diff --git a/ADOrcaApp/src/orca.h b/ADOrcaApp/src/orca.h index 79a01a8..1c1ab60 100644 --- a/ADOrcaApp/src/orca.h +++ b/ADOrcaApp/src/orca.h @@ -131,6 +131,8 @@ #define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ #define evrTimeStampString "EVR_TIMESTAMP" #define evrCountString "EVR_COUNTS" +#define evrCountSinceAcqStartString "EVR_TRIGGERS_SINCE_ACQ_START" +#define evrTriggerDroppedString "EVR_TRIGGER_DROPPED" #define hAcqControlString "H_ACQ_CONTROL" // For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h @@ -267,6 +269,8 @@ protected: int hTimeStampProducer; int hFrameStampProducer; int evrCounts; + int evrCountsSinceAcqStart; + int evrTriggerDropped; int hAcqControl; int evrTimeStamp; //---- diff --git a/cmds/st.cmd b/cmds/st.cmd index a109039..d830eb8 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -14,7 +14,7 @@ epicsEnvSet("NELEMENTS", "4194304") epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "64000000") #EVR settings -epicsEnvSet("EVR", "Labs-ECDC:TS-EVR-11") +epicsEnvSet("EVR", "LabS-NIDO:Ctrl-EVR-01") epicsEnvSet("EVR_EVENT", "B") # iocshLoad("$(adorca_DIR)ADOrca.iocsh") @@ -45,9 +45,9 @@ dbLoadRecords("NDStdArrays.template", "P=$(PREFIX),R=image1:,PORT=Image1,ADDR=0, epicsEnvSet("KFK_TOPIC", "nido_camera") # Kafka plugin -epicsEnvSet("KFK_CONFIG_FILE_PATH", "/home/iocuser/git/adorca/cmds/kafka.conf") +epicsEnvSet("KFK_CONFIG_FILE_PATH", "/home/iocuser/git/adhama/cmds/kafka.conf") -KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_TOPIC)", "orca_source","$(KFK_CONFIG_FILE_PATH)") +KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_TOPIC)", "hama_kfk1","$(KFK_CONFIG_FILE_PATH)") dbLoadRecords("$(adpluginkafka_DIR)db/adpluginkafka.db", "P=$(PREFIX), R=Kfk1:, PORT=KFK1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)") startPVAServer