From ab61e952e19e4e49e9b45975a11edb4a043ecaa0 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 14 Sep 2022 10:30:57 +0200 Subject: [PATCH 01/66] Add mutex control --- ADHamaApp/src/hama.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index c492afe..bb07622 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -496,12 +496,17 @@ epicsTimeStamp imageStamp; //static const char *functionName = "imageTask"; + lock(); + while(1) { getIntegerParam(ADAcquire, &acquire); if(!acquire) { - puts("Waitng start"); + puts("Waiting start"); + + unlock(); status = epicsEventWait(startAcquireEventId_); puts("Starting request received"); + lock(); /* We are acquiring. */ //acquireStatusError = 0; @@ -520,7 +525,7 @@ epicsTimeStamp imageStamp; epicsTimeGetCurrent(&startTime); prevAcquisitionCount = 0; } - } + } eventStatus = epicsEventWaitWithTimeout(this->stopAcquireEventId_, 0); /* Stop event detected */ @@ -536,7 +541,9 @@ epicsTimeStamp imageStamp; epicsThreadSleep(0.001); // get image transfer status. + unlock(); imageTransferStatus(m_hdcam, captransferinfo); + lock(); if (prevAcquisitionCount < captransferinfo.nFrameCount) { //printf("nFrameCount: %d, nNewestFrameIndex: %d\n", captransferinfo.nFrameCount, captransferinfo.nNewestFrameIndex); From 1a87d62bc5e996a9fed67f8bd9d2d7aee161cdf7 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 14 Sep 2022 16:33:03 +0200 Subject: [PATCH 02/66] Remove stopEvent signal, because the mutex lock control the acq thread loop --- ADHamaApp/src/hama.cpp | 29 +++++------------------------ ADHamaApp/src/hama.h | 3 +-- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index bb07622..e5c3c92 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -52,20 +52,13 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, stopThread = 0; /* Create the epicsEvents for signaling to task when acquisition starts and stops */ - startAcquireEventId_ = epicsEventCreate(epicsEventEmpty); - if (!startAcquireEventId_) { + startEvent_ = epicsEventCreate(epicsEventEmpty); + if (!startEvent_) { printf("%s:%s epicsEventCreate failure for acquire start event\n", driverName, functionName); return; } - stopAcquireEventId_ = epicsEventCreate(epicsEventEmpty); - if (!stopAcquireEventId_) { - printf("%s:%s epicsEventCreate failure for acquire stop event\n", - driverName, functionName); - return; - } - //General createParam( HamaName, asynParamOctet, &hHamaName); @@ -504,7 +497,7 @@ epicsTimeStamp imageStamp; puts("Waiting start"); unlock(); - status = epicsEventWait(startAcquireEventId_); + status = epicsEventWait(startEvent_); puts("Starting request received"); lock(); @@ -515,7 +508,6 @@ epicsTimeStamp imageStamp; status = startAcquire(); printf("Status: %d\n", status); if (status != asynSuccess) { - epicsEventSignal(this->stopAcquireEventId_); acquireStatusError = 1; epicsThreadSleep(.1); } @@ -525,16 +517,6 @@ epicsTimeStamp imageStamp; epicsTimeGetCurrent(&startTime); prevAcquisitionCount = 0; } - } - - eventStatus = epicsEventWaitWithTimeout(this->stopAcquireEventId_, 0); - /* Stop event detected */ - if (eventStatus == epicsEventWaitOK) { - setShutter(0); - setIntegerParam(ADAcquire, 0); - acquire=0; - callParamCallbacks(); - continue; } /* Added this delay for the thread not to hog the processor. No need to run on full speed. */ @@ -660,12 +642,11 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ if (value) { /* Send an event to wake up the acq task.*/ puts("Requested acquire start event. Sending acquire start event signal to thread"); - epicsEventSignal(this->startAcquireEventId_); + epicsEventSignal(this->startEvent_); } else if (!value && (adstatus == ADStatusAcquire || adstatus == ADStatusError)) { /* This was a command to stop acquisition */ - puts("Requested acquire stop event. Sending acquire stop event signal to thread"); - epicsEventSignal(this->stopAcquireEventId_); + setShutter(0); stopAcquire(); } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index b403794..a336d4c 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -264,8 +264,7 @@ private: int m_id; int stopThread; - epicsEventId startAcquireEventId_; - epicsEventId stopAcquireEventId_; + epicsEventId startEvent_; asynStatus startAcquire(void); asynStatus stopAcquire(void); From 68caae571b99b3fccb0dcec354ad297fc7b20ec6 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Fri, 16 Sep 2022 12:07:20 +0200 Subject: [PATCH 03/66] Collect timestamping from camera frames --- .gitignore | 4 +++- ADHamaApp/src/hama.cpp | 21 +++++++++++++-------- ADHamaApp/src/hama.h | 2 +- cmds/st.cmd | 2 ++ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 2a69982..fd9f6c6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ O.* /dbd .cvsignore *.db -*.db.* \ No newline at end of file +*.db.* +pv.list +core.* \ No newline at end of file diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index e5c3c92..4aaf202 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -473,7 +473,6 @@ return 0; } //============================================================================ void Hama::imageTask(){ -epicsTimeStamp imageStamp; int status; unsigned char *image; int acquire; @@ -484,7 +483,6 @@ epicsTimeStamp imageStamp; int imageMode=0; int totalImages=0; uint64_t prevAcquisitionCount = 0; - epicsTimeStamp startTime; // endTime; DCAMCAP_TRANSFERINFO captransferinfo; //static const char *functionName = "imageTask"; @@ -514,13 +512,12 @@ epicsTimeStamp imageStamp; else { acquire = 1; /* Get the current time */ - epicsTimeGetCurrent(&startTime); prevAcquisitionCount = 0; } } /* Added this delay for the thread not to hog the processor. No need to run on full speed. */ - epicsThreadSleep(0.001); + //epicsThreadSleep(0.001); // get image transfer status. unlock(); @@ -549,7 +546,10 @@ epicsTimeStamp imageStamp; memset(image, 0, width * 2 * height); count++; - accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, width * 2, width, height); + + int32 ts_sec = 0, ts_microsec = 0; + accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, + width * 2, width, height, ts_sec, ts_microsec); getIntegerParam(NDArrayCallbacks, &callback); if(callback) { @@ -564,8 +564,7 @@ epicsTimeStamp imageStamp; if(pImage) { pImage->uniqueId = count; - pImage->timeStamp = imageStamp.secPastEpoch + - (imageStamp.nsec / 1.0e9); + pImage->timeStamp = ts_sec + (ts_microsec / 1.0e6); updateTimeStamp(&pImage->epicsTS); memcpy(pImage->pData, (epicsUInt16 *)image, pImage->dataSize); @@ -1052,7 +1051,9 @@ inline void* memcpy_s( void* dst, size_t dstsize, const void* src, size_t srclen return memcpy( dst, src, srclen ); } -asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy ) +asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, + int32 rowbytes, int32 cx, int32 cy, + int32& ts_sec, int32& ts_microsec) { DCAMERR err; @@ -1074,6 +1075,10 @@ asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 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/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index a336d4c..0e5c94e 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -269,7 +269,7 @@ private: asynStatus startAcquire(void); asynStatus stopAcquire(void); void getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes); - asynStatus accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy); + asynStatus accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy, int32& ts_sec, int32& ts_microsec); asynStatus imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo); diff --git a/cmds/st.cmd b/cmds/st.cmd index ba9cb96..5a39edf 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -44,3 +44,5 @@ dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 epicsThreadSleep(1.0) + +dbl > pv.list From 05471689f654768ace51f3357936ae96b817baac Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 28 Sep 2022 11:56:43 +0200 Subject: [PATCH 04/66] Add all parameters to writeInt32 and writeFloat64 functions --- ADHamaApp/src/hama.cpp | 369 ++++++++++++++++++++++++++++++++++++++--- ADHamaApp/src/hama.h | 8 +- 2 files changed, 353 insertions(+), 24 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 4aaf202..61ad70a 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -111,7 +111,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hExtractionModeString, asynParamInt32, &hExtractionMode); //output trigger - createParam( hNrOutputTriggerConnectorsString, asynParamInt32, &hNrOutputTriggerConnectors); + createParam( hNumberOutputTriggerConnectorString, asynParamInt32, &hNumberOutputTriggerConnector); createParam( hOutputTriggerSource0String, asynParamInt32, &hOutputTriggerSource0), createParam( hOutputTriggerSource1String, asynParamInt32, &hOutputTriggerSource1); createParam( hOutputTriggerSource2String, asynParamInt32, &hOutputTriggerSource2); @@ -133,7 +133,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hOutputTriggerBaseSensor0String, asynParamInt32, &hOutputTriggerBaseSensor0); createParam( hOutputTriggerBaseSensor1String, asynParamInt32, &hOutputTriggerBaseSensor1); createParam( hOutputTriggerBaseSensor2String, asynParamInt32, &hOutputTriggerBaseSensor2); - createParam( hOutTriggerPreHsyncCountString, asynParamInt32, &hOutTriggerPreHsyncCount); + createParam( hOutputTriggerPreHsyncCountString, asynParamInt32, &hOutputTriggerPreHsyncCount); //Master Puls createParam( hMasterPulseModeString, asynParamInt32, &hMasterPulseMode); @@ -476,10 +476,9 @@ void Hama::imageTask(){ int status; unsigned char *image; int acquire; - int count; + int count = 0; int callback; int acquireStatusError = 0; - int eventStatus=0; int imageMode=0; int totalImages=0; uint64_t prevAcquisitionCount = 0; @@ -594,7 +593,7 @@ void Hama::imageTask(){ //============================================================================ void Hama::temperatureTask(){ static const char *functionName = "tempTask"; - asynStatus status = asynSuccess; +// asynStatus status = asynSuccess; double value = 0; while( !stopThread ) { @@ -610,7 +609,7 @@ void Hama::temperatureTask(){ //printf("Temperature = %f\n",value); } - status = (asynStatus) callParamCallbacks(); + callParamCallbacks(); epicsThreadSleep(1.0); } @@ -651,41 +650,64 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } else if (index == ADImageMode) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("function ADImageMode\n"); } else if (index == ADNumExposures) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("function ADNumExposures\n"); } else if (index == ADMinX) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("function ADMinX\n"); } else if (index == ADMinY) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("function ADMinY\n"); } else if (index == ADSizeX) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("function ADSizeX\n"); } else if (index == ADSizeY) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("function ADSizeY\n"); } else if (index == ADReadStatus) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("function ADReadStatus\n"); } else if (index == hSensorMode) { - setIntegerParam(index, value); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value_d); printf("function SensorMode\n"); } else if (index == hReadoutSpeed) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value_d); printf("function ReadoutSpeed\n"); } else if (index == hReadoutDirection) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value_d); printf("function ReadoutDirection\n"); } else if (index == hColorType) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &value_d); printf("function ColorType\n"); } else if (index == hBitPerChannel) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &value_d); printf("function BitPerChannel\n"); } else if (index == hTriggerSource) { @@ -719,6 +741,216 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ else if (index == hInternalTriggerHandling) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value_d); + } + else if (index == hSensorCoolerStatus) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hDefectCorrectMode) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hHotPixelCorrectLevel) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hBinning) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BINNING, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hSubarrayHPos) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hSubarrayHSize) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hSubarrayVPos) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hSubarrayVSize) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hSubarrayMode) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hIntensityLutMode) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hIntensityLutPage) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hExtractionMode) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hTimingExposure) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImageWidth) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImageHeight) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImageRowbytes) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImageFramebytes) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImageTopOffsetBytes) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImagePixelType) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hBufferRowbytes) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hBufferFramebytes) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hBufferTopOffsetBytes) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hBufferPixelType) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hRecordFixedBytesPerFile) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hRecordFixedBytesPerSession) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hRecordFixedBytesPerFrame) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hNumberOutputTriggerConnector) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hOutputTriggerSource0) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hOutputTriggerPolarity0) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hOutputTriggerActive0) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hOutputTriggerKind0) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hOutputTriggerBaseSensor0) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hOutputTriggerPreHsyncCount) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hMasterPulseMode) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hMasterPulseTriggerSource) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hMasterPulseBurstTimes) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hSystemAlive) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hNumberOfView) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImageDetectorPixelNumHorz) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hImageDetectorPixelNumVert) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hTimeStampProducer) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &value_d); + printf("function BitPerChannel\n"); + } + else if (index == hFrameStampProducer) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &value_d); + printf("function BitPerChannel\n"); } else{ printf("function ELSE.... \n"); @@ -751,17 +983,118 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ const char* functionName = "writeFloat64"; const char* paramName; - int function = pasynUser->reason; - double value_from_device = 0; + int index = pasynUser->reason; - getParamName(function, ¶mName); + double value_d = 0; - setDoubleParam(function, value); + getParamName(index, ¶mName); - if(function == ADAcquireTime) { + setDoubleParam(index, value); + + if(index == ADAcquireTime) { status = (asynStatus)setFeature(DCAM_IDPROP_EXPOSURETIME, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_from_device); - printf("Exposure Time from camera: %f\n", value_from_device); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); + printf("Exposure Time from camera: %f\n", value_d); + } + else if (index == hTriggerDelay) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hExposureTime) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); + + // status = if value_d != value = + // status = error + + printf("function ADImageMode\n"); + } + + else if (index == hTimingReadoutTime) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hTimingCyclicTriggerPeriod) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hTimingMinTriggerBlanking) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hTimingMinTriggerInterval) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hTimingGlobalExposureDelay) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hTimingInvalidExposurePeriod) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hInternalFrameRate) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hInternalFrameInterval) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hInternalLineSpeed) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hInternalLineInterval) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hOutputTriggerDelay0) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hOutputTriggerPeriod0) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hMasterPulseInterval) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hConversionFactorCoeff) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hConversionFactorOffset) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hImageDetectorPixelWidth) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &value_d); + printf("function ADImageMode\n"); + } + else if (index == hImageDetectorPixelHeight) { + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &value_d); + printf("function ADImageMode\n"); } status = (asynStatus) callParamCallbacks(); @@ -769,11 +1102,11 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ if (status) asynPrint(pasynUser, ASYN_TRACE_ERROR, "%s:%s: error, status=%d function=%d, paramName=%s, value=%f\n", - driverName, functionName, status, function, paramName, value); + driverName, functionName, status, index, paramName, value); else asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: function=%d, paramName=%s, value=%f\n", - driverName, functionName, function, paramName, value); + driverName, functionName, index, paramName, value); @@ -1075,10 +1408,6 @@ 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/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 0e5c94e..7973e5b 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -59,7 +59,7 @@ #define hExtractionModeString "H_EXTRACTION_MODE" /* asynInt32 ro */ // output trigger -#define hNrOutputTriggerConnectorsString "H_NR_OUTPUT_TRIGGER_CONNECTORS" /* asynInt32 ro */ +#define hNumberOutputTriggerConnectorString "H_NUMBER_OUTPUT_TRIGGER_CONNECTOR" /* asynInt32 ro */ #define hOutputTriggerSource0String "H_OUTPUT_TRIGGER_SOURCE0" /* asynInt32 rw */ #define hOutputTriggerSource1String "H_OUTPUT_TRIGGER_SOURCE1" /* asynInt32 rw */ #define hOutputTriggerSource2String "H_OUTPUT_TRIGGER_SOURCE2" /* asynInt32 rw */ @@ -81,7 +81,7 @@ #define hOutputTriggerBaseSensor0String "H_OUTPUT_TRIGGER_BASE_SENSOR0" /* asynInt32 rw */ #define hOutputTriggerBaseSensor1String "H_OUTPUT_TRIGGER_BASE_SENSOR1" /* asynInt32 rw */ #define hOutputTriggerBaseSensor2String "H_OUTPUT_TRIGGER_BASE_SENSOR2" /* asynInt32 rw */ -#define hOutTriggerPreHsyncCountString "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT" /* asynInt32 rw */ +#define hOutputTriggerPreHsyncCountString "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT" /* asynInt32 rw */ // Master Puls #define hMasterPulseModeString "H_MASTERPULSE_MODE" /* asynInt32 rw */ @@ -211,7 +211,7 @@ protected: int hRecordFixedBytesPerFile; int hRecordFixedBytesPerSession; int hRecordFixedBytesPerFrame; - int hNrOutputTriggerConnectors; + int hNumberOutputTriggerConnector; int hOutputTriggerSource0; int hOutputTriggerSource1; int hOutputTriggerSource2; @@ -233,7 +233,7 @@ protected: int hOutputTriggerBaseSensor0; int hOutputTriggerBaseSensor1; int hOutputTriggerBaseSensor2; - int hOutTriggerPreHsyncCount; + int hOutputTriggerPreHsyncCount; int hMasterPulseMode; int hMasterPulseTriggerSource; int hMasterPulseInterval; From 51f6cdab4077456c73a4000d0e4f289efe7261ef Mon Sep 17 00:00:00 2001 From: Iocuser Date: Thu, 29 Sep 2022 17:26:58 +0200 Subject: [PATCH 05/66] Add printf functions to every if in writeInit32 --- ADHamaApp/src/hama.cpp | 110 ++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 51 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 61ad70a..aeb4833 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -625,17 +625,17 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ const char* paramName; int index = pasynUser->reason; - int adstatus; + int adstatus; getParamName(index, ¶mName); - /* Ensure that ADStatus is set correctly before we set ADAcquire.*/ - getIntegerParam(ADStatus, &adstatus); + /* Ensure that ADStatus is set correctly before we set ADAcquire.*/ + getIntegerParam(ADStatus, &adstatus); double value_d = 0; //getIntegerParam(index, &value); - if (index == ADAcquire) { + if (index == ADAcquire) { printf("function ADAcquire\n"); if (value) { /* Send an event to wake up the acq task.*/ @@ -687,270 +687,278 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ else if (index == hSensorMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value_d); - printf("function SensorMode\n"); + printf("function SensorMode %d\n", value); } else if (index == hReadoutSpeed) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value_d); - printf("function ReadoutSpeed\n"); + printf("function ReadoutSpeed %d\n", value); } else if (index == hReadoutDirection) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value_d); - printf("function ReadoutDirection\n"); + printf("function ReadoutDirection %d\n", value); } else if (index == hColorType) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &value_d); - printf("function ColorType\n"); + printf("function ColorType %d\n", value); } else if (index == hBitPerChannel) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &value_d); - printf("function BitPerChannel\n"); + printf("function BitPerChannel %d\n", value); } else if (index == hTriggerSource) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value_d); + printf("function TriggerSource %d\n", value); } else if (index == hTriggerMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value_d); + printf("function TriggerMode %d\n", value); } else if (index == hTriggerActive) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value_d); + printf("function TriggerActive %d\n", value); } else if (index == hTriggerGlobalExposure) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value_d); + printf("function TriggerGlobalExposure %d\n, value"); } else if (index == hTriggerPolarity) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &value_d); + printf("function TriggerPolarity %d\n", value); } else if (index == hTriggerConnector) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value_d); + printf("function TriggerConnector %d\n", value); } else if (index == hTriggerTimes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value_d); + printf("function TriggerTimes %d\n", value); } else if (index == hInternalTriggerHandling) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value_d); + printf("function TriggerHandling %d\n", value); } else if (index == hSensorCoolerStatus) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &value_d); - printf("function BitPerChannel\n"); + printf("function SensorCoolerStatus %d\n, value"); } else if (index == hDefectCorrectMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &value_d); - printf("function BitPerChannel\n"); + printf("function DefectCorrerMode %d\n", value); } else if (index == hHotPixelCorrectLevel) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &value_d); - printf("function BitPerChannel\n"); + printf("function HotPixelCorrectLevel %d\n", value); } else if (index == hBinning) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BINNING, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &value_d); - printf("function BitPerChannel\n"); + printf("function Binning %d\n", value); } else if (index == hSubarrayHPos) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); - printf("function BitPerChannel\n"); + printf("function SubArrayHPos %d\n", value); } else if (index == hSubarrayHSize) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); - printf("function BitPerChannel\n"); + printf("function SubarrayHSize %d\n", value); } else if (index == hSubarrayVPos) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); - printf("function BitPerChannel\n"); + printf("function SubarrayVPos %d\n", value); } else if (index == hSubarrayVSize) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); - printf("function BitPerChannel\n"); + printf("function SubarrayVSize %d\n", value); } else if (index == hSubarrayMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &value_d); - printf("function BitPerChannel\n"); + printf("function SubarrayMode %d\n", value); } else if (index == hIntensityLutMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &value_d); - printf("function BitPerChannel\n"); + printf("function IntensityLutMode %d\n", value); } else if (index == hIntensityLutPage) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &value_d); - printf("function BitPerChannel\n"); + printf("function IntensityLutPage %d\n", value); } else if (index == hExtractionMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &value_d); - printf("function BitPerChannel\n"); + printf("function ExtractionMode %d\n", value); } else if (index == hTimingExposure) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &value_d); - printf("function BitPerChannel\n"); + printf("function TimingExposure %d\n", value); } else if (index == hImageWidth) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value_d); - printf("function BitPerChannel\n"); + printf("function ImageWidth %d\n", value); } else if (index == hImageHeight) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value_d); - printf("function BitPerChannel\n"); + printf("function ImageHeight %d\n", value); } else if (index == hImageRowbytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value_d); - printf("function BitPerChannel\n"); + printf("function ImageRowBytes %d\n", value); } else if (index == hImageFramebytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value_d); - printf("function BitPerChannel\n"); + printf("function ImageFramBytes %d\n", value); } else if (index == hImageTopOffsetBytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &value_d); - printf("function BitPerChannel\n"); + printf("function ImageTopOffsetBytes %d\n", value); } else if (index == hImagePixelType) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value_d); - printf("function BitPerChannel\n"); + printf("function ImagePixelType %d\n", value); } else if (index == hBufferRowbytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &value_d); - printf("function BitPerChannel\n"); + printf("function BufferRowBytes %d\n", value); } else if (index == hBufferFramebytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &value_d); - printf("function BitPerChannel\n"); + printf("function BufferFrameBytes %d\n", value); } else if (index == hBufferTopOffsetBytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &value_d); - printf("function BitPerChannel\n"); + printf("function BufferTopOffsetBytes %d\n", value); } else if (index == hBufferPixelType) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &value_d); - printf("function BitPerChannel\n"); + printf("function BufferPixelType %d\n", value); } else if (index == hRecordFixedBytesPerFile) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &value_d); - printf("function BitPerChannel\n"); + printf("function ecordFixedBytesPerFile %d\n", value); } else if (index == hRecordFixedBytesPerSession) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &value_d); - printf("function BitPerChannel\n"); + printf("function RecordFixedBytesPerSesion %d\n", value); } else if (index == hRecordFixedBytesPerFrame) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &value_d); - printf("function BitPerChannel\n"); + printf("function RecordFixedBytesPerFrame %d\n", value); } else if (index == hNumberOutputTriggerConnector) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &value_d); - printf("function BitPerChannel\n"); + printf("function NumberOutputTriggerConnector %d\n", value); } else if (index == hOutputTriggerSource0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &value_d); - printf("function BitPerChannel\n"); + printf("function OutputTriggerSource0 %d\n", value); } else if (index == hOutputTriggerPolarity0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &value_d); - printf("function BitPerChannel\n"); + printf("function OutputTriggerPolaroty0 %d\n", value); } else if (index == hOutputTriggerActive0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &value_d); - printf("function BitPerChannel\n"); + printf("function OutputTriggerActive0 %d\n", value); } else if (index == hOutputTriggerKind0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &value_d); - printf("function BitPerChannel\n"); + printf("function OutputTriggerKind0 %d\n", value); } else if (index == hOutputTriggerBaseSensor0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &value_d); - printf("function BitPerChannel\n"); + printf("function OutputTriggerBaseSensor0 %d\n", value); } else if (index == hOutputTriggerPreHsyncCount) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &value_d); - printf("function BitPerChannel\n"); + printf("function OutputTriggerPreHsynCount %d\n", value); } else if (index == hMasterPulseMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &value_d); - printf("function BitPerChannel\n"); + printf("function MasterPulseMode %d\n", value); } else if (index == hMasterPulseTriggerSource) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &value_d); - printf("function BitPerChannel\n"); + printf("function MasterPulseTriggerSource %d\n", value); } else if (index == hMasterPulseBurstTimes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &value_d); - printf("function BitPerChannel\n"); + printf("function MasterPulseBurstTimes %d\n", value); } else if (index == hSystemAlive) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &value_d); - printf("function BitPerChannel\n"); + printf("function SystemAlive %d\n", value); } else if (index == hNumberOfView) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &value_d); - printf("function BitPerChannel\n"); + printf("function NumberOfView %d\n", value); } else if (index == hImageDetectorPixelNumHorz) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &value_d); - printf("function BitPerChannel\n"); + printf("function ImageDetectorPixelNumHorz %d\n", value); } else if (index == hImageDetectorPixelNumVert) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &value_d); - printf("function BitPerChannel\n"); + printf("function ImageDetectorPixelNumVert %d\n", value); } else if (index == hTimeStampProducer) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &value_d); - printf("function BitPerChannel\n"); + printf("function TimeStampProducer %d\n", value); } else if (index == hFrameStampProducer) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &value_d); - printf("function BitPerChannel\n"); + printf("function FrameStampProducer %d\n", value); } else{ printf("function ELSE.... \n"); From 4380d0a04b62815cb356b2946746c2ec18c5fae4 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 14 Oct 2022 19:42:32 +0200 Subject: [PATCH 06/66] Add sensor pixel number --- ADHamaApp/Db/hama.template | 11 +- ADHamaApp/src/hama.cpp | 252 +++++++++++++++++++++---------------- ADHamaApp/src/hama.h | 4 +- 3 files changed, 157 insertions(+), 110 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 7eda79e..4eda989 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -102,42 +102,49 @@ record(longin, "$(P)$(R)ArrayCounter_RBV") ########################################################################## record(stringin, "$(P)$(R)Vendor-RB"){ field(DESC, "") + field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_VENDOR") } record(stringin, "$(P)$(R)Model-RB"){ field(DESC, "") + field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MODEL") } record(stringin, "$(P)$(R)CameraID-RB"){ field(DESC, "") + field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CAMERAID") } record(stringin, "$(P)$(R)Bus-RB"){ field(DESC, "") + field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BUS") } record(stringin, "$(P)$(R)CameraVersion-RB"){ field(DESC, "") + field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CAMERA_VERSION") } record(stringin, "$(P)$(R)DriverVersion-RB"){ field(DESC, "") + field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DRIVER_VERSION") } record(stringin, "$(P)$(R)ModuleVersion-RB"){ field(DESC, "") + field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MODULE_VERSION") } @@ -695,10 +702,10 @@ record(ai, "$(P)$(R)ExtractionMode-RB") { # Output Trigger # ########################################################################## #Output Trigger Connector -record(ai, "$(P)$(R)OutputTriggerConnector-R") { +record(ai, "$(P)$(R)NumberOfOutputTriggerConnector-R") { field(DESC,"") field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_NR_OUTPUT_TRIGGER_CONNECTORS") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_NUMBEROF_OUTPUTTRIGGERCONNECTOR") field(SCAN, "I/O Intr") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index aeb4833..8487c1c 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -111,7 +111,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hExtractionModeString, asynParamInt32, &hExtractionMode); //output trigger - createParam( hNumberOutputTriggerConnectorString, asynParamInt32, &hNumberOutputTriggerConnector); + createParam( hNumberOfOutputTriggerConnectorString, asynParamInt32, &hNumberOfOutputTriggerConnector); createParam( hOutputTriggerSource0String, asynParamInt32, &hOutputTriggerSource0), createParam( hOutputTriggerSource1String, asynParamInt32, &hOutputTriggerSource1); createParam( hOutputTriggerSource2String, asynParamInt32, &hOutputTriggerSource2); @@ -205,6 +205,12 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, */ +#define DETECTOR_PIXEL_NUM_HORZ 0x00420830 +#define DETECTOR_PIXEL_NUM_VERT 0x00420840 + + err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); + err |= getParameter(DETECTOR_PIXEL_NUM_VERT); + err |= getParameterStr(DCAM_IDSTR_VENDOR); err |= getParameterStr(DCAM_IDSTR_MODEL); err |= getParameterStr(DCAM_IDSTR_CAMERAID); @@ -310,12 +316,32 @@ return int(status); } //============================================================================ int Hama::getParameter(int propertyID){ - printf("\n[DEBUG] Function:getProperty\n"); + printf("\n[DEBUG] *** Function:getProperty\n"); + + + asynStatus status = asynSuccess; double value = 0; + /* dcamprop_getvalue(m_hdcam, propertyID, &value); + setIntegerParameter(ADMaxSizeX, value); + printf("PropertyID = %f\n", value); +*/ + switch (propertyID){ + case DETECTOR_PIXEL_NUM_HORZ: + dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &value); + status = setIntegerParam(ADMaxSizeX, value); + printf("SENSOR SIZE_X = %f\n", value); + break; + + case DETECTOR_PIXEL_NUM_VERT: + dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &value); + status = setIntegerParam(ADMaxSizeY, value); + printf("SENSOR SIZE_Y = %f\n", value); + break; + case DCAM_IDPROP_SENSORMODE: printf("The SENSOR MODE = %f\n", value); break; @@ -367,12 +393,11 @@ int Hama::getParameter(int propertyID){ default: printf("The = %f\n", value); break; - - - } -return 0; + /* Do callbacks so higher layers see any changes */ + status = (asynStatus) callParamCallbacks(); +return int(status); } //============================================================================ @@ -395,6 +420,7 @@ int Hama::setParameter(int paramIndex){ return 0; } +//============================================================================ int Hama::setFeature(int featureIndex, double value) { DCAMERR err; err = dcamprop_setvalue(m_hdcam, featureIndex, value); @@ -478,7 +504,7 @@ void Hama::imageTask(){ int acquire; int count = 0; int callback; - int acquireStatusError = 0; + //int acquireStatusError = 0; int imageMode=0; int totalImages=0; uint64_t prevAcquisitionCount = 0; @@ -505,7 +531,7 @@ void Hama::imageTask(){ status = startAcquire(); printf("Status: %d\n", status); if (status != asynSuccess) { - acquireStatusError = 1; + //acquireStatusError = 1; epicsThreadSleep(.1); } else { @@ -523,7 +549,7 @@ void Hama::imageTask(){ imageTransferStatus(m_hdcam, captransferinfo); lock(); - if (prevAcquisitionCount < captransferinfo.nFrameCount) { + if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { //printf("nFrameCount: %d, nNewestFrameIndex: %d\n", captransferinfo.nFrameCount, captransferinfo.nNewestFrameIndex); prevAcquisitionCount = captransferinfo.nFrameCount; @@ -619,6 +645,7 @@ void Hama::temperatureTask(){ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ + printf("[DEBUG]::writeInt32\t"); asynStatus status = asynSuccess; const char* functionName = "writeInt32"; @@ -636,7 +663,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ //getIntegerParam(index, &value); if (index == ADAcquire) { - printf("function ADAcquire\n"); + printf("[DEBUG]::function ADAcquire\n"); if (value) { /* Send an event to wake up the acq task.*/ puts("Requested acquire start event. Sending acquire start event signal to thread"); @@ -647,322 +674,332 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ setShutter(0); stopAcquire(); } - } + /* + else if (index == ADMaxSizeX_RBV) { + dcamprop_setvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, value); + dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &value_d); + printf("[DEBUG]::function ADNumExposures\n"); + } + else if (index == ADMaxSizeY_RBV) { + dcamprop_setvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, value); + dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &value_d); + printf("[DEBUG]::function ADMinX\n"); + } + */ else if (index == ADImageMode) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function ADImageMode\n"); } else if (index == ADNumExposures) { - // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); - // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("function ADNumExposures\n"); + dcamprop_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) { - // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); - // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("function ADMinX\n"); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); + printf("[DEBUG]::function ADMinX\n"); } else if (index == ADMinY) { - // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); - // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("function ADMinY\n"); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); + printf("[DEBUG]::function ADMinY\n"); } else if (index == ADSizeX) { - // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); - // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("function ADSizeX\n"); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); + printf("[DEBUG]::function ADSizeX\n"); } else if (index == ADSizeY) { - // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); - // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("function ADSizeY\n"); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); + printf("[DEBUG]::function ADSizeY\n"); } else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("function ADReadStatus\n"); + printf("[DEBUG]::function ADReadStatus\n"); } else if (index == hSensorMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value_d); - printf("function SensorMode %d\n", value); + printf("[DEBUG]::function SensorMode %d\n", value); } else if (index == hReadoutSpeed) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value_d); - printf("function ReadoutSpeed %d\n", value); + printf("[DEBUG]::function ReadoutSpeed %d\n", value); } else if (index == hReadoutDirection) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value_d); - printf("function ReadoutDirection %d\n", value); + printf("[DEBUG]::function ReadoutDirection %d\n", value); } else if (index == hColorType) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &value_d); - printf("function ColorType %d\n", value); + printf("[DEBUG]::function ColorType %d\n", value); } else if (index == hBitPerChannel) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &value_d); - printf("function BitPerChannel %d\n", value); + printf("[DEBUG]::function BitPerChannel %d\n", value); } else if (index == hTriggerSource) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value_d); - printf("function TriggerSource %d\n", value); + printf("[DEBUG]::function TriggerSource %d\n", value); } else if (index == hTriggerMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value_d); - printf("function TriggerMode %d\n", value); + printf("[DEBUG]::function TriggerMode %d\n", value); } else if (index == hTriggerActive) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value_d); - printf("function TriggerActive %d\n", value); + printf("[DEBUG]::function TriggerActive %d\n", value); } else if (index == hTriggerGlobalExposure) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value_d); - printf("function TriggerGlobalExposure %d\n, value"); + printf("[DEBUG]::function TriggerGlobalExposure %d\n", value); } else if (index == hTriggerPolarity) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &value_d); - printf("function TriggerPolarity %d\n", value); + printf("[DEBUG]::function TriggerPolarity %d\n", value); } else if (index == hTriggerConnector) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value_d); - printf("function TriggerConnector %d\n", value); + printf("[DEBUG]::function TriggerConnector %d\n", value); } else if (index == hTriggerTimes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value_d); - printf("function TriggerTimes %d\n", value); + printf("[DEBUG]::function TriggerTimes %d\n", value); } else if (index == hInternalTriggerHandling) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value_d); - printf("function TriggerHandling %d\n", value); + printf("[DEBUG]::function TriggerHandling %d\n", value); } else if (index == hSensorCoolerStatus) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &value_d); - printf("function SensorCoolerStatus %d\n, value"); + printf("[DEBUG]::function SensorCoolerStatus %d\n", value); } else if (index == hDefectCorrectMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &value_d); - printf("function DefectCorrerMode %d\n", value); + printf("[DEBUG]::function DefectCorrerMode %d\n", value); } else if (index == hHotPixelCorrectLevel) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &value_d); - printf("function HotPixelCorrectLevel %d\n", value); + printf("[DEBUG]::function HotPixelCorrectLevel %d\n", value); } else if (index == hBinning) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BINNING, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &value_d); - printf("function Binning %d\n", value); + printf("[DEBUG]::function Binning %d\n", value); } else if (index == hSubarrayHPos) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); - printf("function SubArrayHPos %d\n", value); + printf("[DEBUG]::function SubArrayHPos %d\n", value); } else if (index == hSubarrayHSize) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); - printf("function SubarrayHSize %d\n", value); + printf("[DEBUG]::function SubarrayHSize %d\n", value); } else if (index == hSubarrayVPos) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); - printf("function SubarrayVPos %d\n", value); + printf("[DEBUG]::function SubarrayVPos %d\n", value); } else if (index == hSubarrayVSize) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); - printf("function SubarrayVSize %d\n", value); + printf("[DEBUG]::function SubarrayVSize %d\n", value); } else if (index == hSubarrayMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &value_d); - printf("function SubarrayMode %d\n", value); + printf("[DEBUG]::function SubarrayMode %d\n", value); } else if (index == hIntensityLutMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &value_d); - printf("function IntensityLutMode %d\n", value); + printf("[DEBUG]::function IntensityLutMode %d\n", value); } else if (index == hIntensityLutPage) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &value_d); - printf("function IntensityLutPage %d\n", value); + printf("[DEBUG]::function IntensityLutPage %d\n", value); } else if (index == hExtractionMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &value_d); - printf("function ExtractionMode %d\n", value); + printf("[DEBUG]::function ExtractionMode %d\n", value); } else if (index == hTimingExposure) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &value_d); - printf("function TimingExposure %d\n", value); + printf("[DEBUG]::function TimingExposure %d\n", value); } else if (index == hImageWidth) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value_d); - printf("function ImageWidth %d\n", value); + printf("[DEBUG]::function ImageWidth %d\n", value); } else if (index == hImageHeight) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value_d); - printf("function ImageHeight %d\n", value); + printf("[DEBUG]::function ImageHeight %d\n", value); } else if (index == hImageRowbytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value_d); - printf("function ImageRowBytes %d\n", value); + printf("[DEBUG]::function ImageRowBytes %d\n", value); } else if (index == hImageFramebytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value_d); - printf("function ImageFramBytes %d\n", value); + printf("[DEBUG]::function ImageFramBytes %d\n", value); } else if (index == hImageTopOffsetBytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &value_d); - printf("function ImageTopOffsetBytes %d\n", value); + printf("[DEBUG]::function ImageTopOffsetBytes %d\n", value); } else if (index == hImagePixelType) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value_d); - printf("function ImagePixelType %d\n", value); + printf("[DEBUG]::function ImagePixelType %d\n", value); } else if (index == hBufferRowbytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &value_d); - printf("function BufferRowBytes %d\n", value); + printf("[DEBUG]::function BufferRowBytes %d\n", value); } else if (index == hBufferFramebytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &value_d); - printf("function BufferFrameBytes %d\n", value); + printf("[DEBUG]::function BufferFrameBytes %d\n", value); } else if (index == hBufferTopOffsetBytes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &value_d); - printf("function BufferTopOffsetBytes %d\n", value); + printf("[DEBUG]::function BufferTopOffsetBytes %d\n", value); } else if (index == hBufferPixelType) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &value_d); - printf("function BufferPixelType %d\n", value); + printf("[DEBUG]::function BufferPixelType %d\n", value); } else if (index == hRecordFixedBytesPerFile) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &value_d); - printf("function ecordFixedBytesPerFile %d\n", value); + printf("[DEBUG]::function ecordFixedBytesPerFile %d\n", value); } else if (index == hRecordFixedBytesPerSession) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &value_d); - printf("function RecordFixedBytesPerSesion %d\n", value); + printf("[DEBUG]::function RecordFixedBytesPerSesion %d\n", value); } else if (index == hRecordFixedBytesPerFrame) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &value_d); - printf("function RecordFixedBytesPerFrame %d\n", value); + printf("[DEBUG]::function RecordFixedBytesPerFrame %d\n", value); } - else if (index == hNumberOutputTriggerConnector) { + else if (index == hNumberOfOutputTriggerConnector) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &value_d); - printf("function NumberOutputTriggerConnector %d\n", value); + printf("[DEBUG]::function NumberOutputTriggerConnector %d\n", value); } else if (index == hOutputTriggerSource0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &value_d); - printf("function OutputTriggerSource0 %d\n", value); + printf("[DEBUG]::function OutputTriggerSource0 %d\n", value); } else if (index == hOutputTriggerPolarity0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &value_d); - printf("function OutputTriggerPolaroty0 %d\n", value); + printf("[DEBUG]::function OutputTriggerPolaroty0 %d\n", value); } else if (index == hOutputTriggerActive0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &value_d); - printf("function OutputTriggerActive0 %d\n", value); + printf("[DEBUG]::function OutputTriggerActive0 %d\n", value); } else if (index == hOutputTriggerKind0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &value_d); - printf("function OutputTriggerKind0 %d\n", value); + printf("[DEBUG]::function OutputTriggerKind0 %d\n", value); } else if (index == hOutputTriggerBaseSensor0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &value_d); - printf("function OutputTriggerBaseSensor0 %d\n", value); + printf("[DEBUG]::function OutputTriggerBaseSensor0 %d\n", value); } else if (index == hOutputTriggerPreHsyncCount) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &value_d); - printf("function OutputTriggerPreHsynCount %d\n", value); + printf("[DEBUG]::function OutputTriggerPreHsynCount %d\n", value); } else if (index == hMasterPulseMode) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &value_d); - printf("function MasterPulseMode %d\n", value); + printf("[DEBUG]::function MasterPulseMode %d\n", value); } else if (index == hMasterPulseTriggerSource) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &value_d); - printf("function MasterPulseTriggerSource %d\n", value); + printf("[DEBUG]::function MasterPulseTriggerSource %d\n", value); } else if (index == hMasterPulseBurstTimes) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &value_d); - printf("function MasterPulseBurstTimes %d\n", value); + printf("[DEBUG]::function MasterPulseBurstTimes %d\n", value); } else if (index == hSystemAlive) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &value_d); - printf("function SystemAlive %d\n", value); + printf("[DEBUG]::function SystemAlive %d\n", value); } else if (index == hNumberOfView) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &value_d); - printf("function NumberOfView %d\n", value); + printf("[DEBUG]::function NumberOfView %d\n", value); } else if (index == hImageDetectorPixelNumHorz) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &value_d); - printf("function ImageDetectorPixelNumHorz %d\n", value); + printf("[DEBUG]::function ImageDetectorPixelNumHorz %d\n", value); } else if (index == hImageDetectorPixelNumVert) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &value_d); - printf("function ImageDetectorPixelNumVert %d\n", value); + printf("[DEBUG]::function ImageDetectorPixelNumVert %d\n", value); } else if (index == hTimeStampProducer) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &value_d); - printf("function TimeStampProducer %d\n", value); + printf("[DEBUG]::function TimeStampProducer %d\n", value); } else if (index == hFrameStampProducer) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &value_d); - printf("function FrameStampProducer %d\n", value); + printf("[DEBUG]::function FrameStampProducer %d\n", value); } else{ - printf("function ELSE.... \n"); - + printf("[DEBUG]::function writeInt32 did not find a parameter\n"); } setIntegerParam(index, value); @@ -1002,12 +1039,12 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ if(index == ADAcquireTime) { status = (asynStatus)setFeature(DCAM_IDPROP_EXPOSURETIME, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); - printf("Exposure Time from camera: %f\n", value_d); + printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value_d); } else if (index == hTriggerDelay) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function TriggerDelay %f\n", value_d); } else if (index == hExposureTime) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, value); @@ -1016,93 +1053,96 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ // status = if value_d != value = // status = error - printf("function ADImageMode\n"); + printf("[DEBUG]::function ADImageMode\n"); } else if (index == hTimingReadoutTime) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function TimingReadoutTime %f\n", value_d); } else if (index == hTimingCyclicTriggerPeriod) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function TimingCyclicTriggerPeriod %f\n", value_d); } else if (index == hTimingMinTriggerBlanking) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function TimingMinTriggerBlanking %f\n", value_d); } else if (index == hTimingMinTriggerInterval) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function TimingMinTriggerInterval %f\n", value_d); } else if (index == hTimingGlobalExposureDelay) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function TimingGlobalExposureDelay %f\n", value_d); } else if (index == hTimingInvalidExposurePeriod) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function TimingEnvalidExposurePeriod %f\n", value_d); } else if (index == hInternalFrameRate) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function InternalFrameRate %f\n", value_d); } else if (index == hInternalFrameInterval) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function InternalFrameRate %f\n", value_d); } else if (index == hInternalLineSpeed) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function InternalLineSpeed %f\n", value_d); } else if (index == hInternalLineInterval) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function InternalLineInterupt %f\n", value_d); } else if (index == hOutputTriggerDelay0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function OutputTriggerDelay0 %f\n", value_d); } else if (index == hOutputTriggerPeriod0) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function OutputTriggerPeriod0 %f\n", value_d); } else if (index == hMasterPulseInterval) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function MasterPulseInterval %f\n", value_d); } else if (index == hConversionFactorCoeff) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function ConversionFactorCoeff %f\n", value_d); } else if (index == hConversionFactorOffset) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function ConversionFactorOffset %f\n", value_d); } else if (index == hImageDetectorPixelWidth) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function ImageDetectorPixelWidth %f\n", value_d); } else if (index == hImageDetectorPixelHeight) { dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &value_d); - printf("function ADImageMode\n"); + printf("[DEBUG]::function ImageDetectorPixelHeight %f\n", value_d); + } + else{ + printf("[DEBUG]::function writeFloat64 did not find a parameter\n"); } status = (asynStatus) callParamCallbacks(); diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 7973e5b..93bfd8a 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -59,7 +59,7 @@ #define hExtractionModeString "H_EXTRACTION_MODE" /* asynInt32 ro */ // output trigger -#define hNumberOutputTriggerConnectorString "H_NUMBER_OUTPUT_TRIGGER_CONNECTOR" /* asynInt32 ro */ +#define hNumberOfOutputTriggerConnectorString "H_NUMBEROF_OUTPUTTRIGGERCONNECTOR" /* asynInt32 ro */ #define hOutputTriggerSource0String "H_OUTPUT_TRIGGER_SOURCE0" /* asynInt32 rw */ #define hOutputTriggerSource1String "H_OUTPUT_TRIGGER_SOURCE1" /* asynInt32 rw */ #define hOutputTriggerSource2String "H_OUTPUT_TRIGGER_SOURCE2" /* asynInt32 rw */ @@ -211,7 +211,7 @@ protected: int hRecordFixedBytesPerFile; int hRecordFixedBytesPerSession; int hRecordFixedBytesPerFrame; - int hNumberOutputTriggerConnector; + int hNumberOfOutputTriggerConnector; int hOutputTriggerSource0; int hOutputTriggerSource1; int hOutputTriggerSource2; From c1699dbf3d9f81922a3bc14390e800406df1cdd2 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 19 Oct 2022 10:00:45 +0200 Subject: [PATCH 07/66] update DRVL, DRVH in the Db --- .vscode/c_cpp_properties.json | 18 ++++ ADHamaApp/Db/hama.template | 173 ++++++++++++++++++++++++---------- 2 files changed, 143 insertions(+), 48 deletions(-) create mode 100644 .vscode/c_cpp_properties.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..b374b9b --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/ADHamaApp/src/**", + "/home/iocuser/.conda/envs/hama/epics/include" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c89", + "cppStandard": "c++14", + "intelliSenseMode": "linux-gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 4eda989..4173172 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -165,16 +165,18 @@ record(mbbo, "$(P)$(R)SensorMode-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") - field(ZRVL, "0") - field(ZRST, "Area") field(ZRVL, "1") + field(ZRST, "Area") + field(ZRVL, "2") field(ZRST, "Progressive") - field(TWVL, "2") + field(TWVL, "3") field(TWST, "Splitview") - field(THVL, "3") + field(THVL, "4") field(THST, "Duallightsheet") + field(DRVL, "1") + field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") - field(VAL, "0") + field(VAL, "1") } record(mbbi, "$(P)$(R)SensorMode-RB") { @@ -198,6 +200,8 @@ record(ao, "$(P)$(R)ReadoutSpeed-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") + field(DRVL, "1") + field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_READOUT_SPEED") field(VAL, "2") } @@ -215,14 +219,12 @@ record(mbbo, "$(P)$(R)ReadoutDirection-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") - field(ZRVL, "0") + field(ZRVL, "5") field(ZRST, "Diverge") - field(ONVL, "1") - field(ONST, "Forward") - field(TWVL, "2") - field(TWST, "Backward") + field(DRVL, "5") + field(DRVH, "5") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_READOUT_DIRECTION") - field(VAL, "1") + field(VAL, "5") } record(mbbi, "$(P)$(R)ReadoutDirection-RB") { @@ -238,6 +240,58 @@ record(mbbi, "$(P)$(R)ReadoutDirection-RB") { field(SCAN, "I/O Intr") } + + + +record(mbbo, "$(P)$(R)ColorType-S") { + field(DESC,"") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "B/W") + field(DRVL, "1") + field(DRVH, "1") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_COLOR_TYPE") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)ColorType-RB") { + field(DESC,"") + field(ZRVL, "1") + field(ZRST, "B/W") + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_COLOR_TYPE") + field(SCAN, "I/O Intr") +} + +record(mbbo, "$(P)$(R)BitPerChannel-S") { + field(DESC,"") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "12") + field(ZRST, "12 bits") + field(ONVL, "16") + field(ONST, "16 bits") + field(DRVL, "12") + field(DRVH, "16") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") + field(VAL, "16") +} + +record(mbbi, "$(P)$(R)BitPerChannel-RB") { + field(DESC,"") + field(ZRVL, "12") + field(ZRST, "12 bits") + field(ONVL, "16") + field(ONST, "16 bits") + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") + field(SCAN, "I/O Intr") +} + + + + ########################################################################## # Trigger # ########################################################################## @@ -254,8 +308,10 @@ record(mbbo, "$(P)$(R)TriggerSource-S") { field(TWST, "Software") field(THVL, "4") field(THST, "Master Pulse") + field(DRVL, "1") + field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_SOURCE") - field(VAL, "0") + field(VAL, "1") } record(mbbi, "$(P)$(R)TriggerSource-RB") { @@ -280,8 +336,10 @@ record(mbbo, "$(P)$(R)TriggerMode-S") { field(DTYP, "asynInt32") field(ZRVL, "1") field(ZRST, "Normal") - field(ONVL, "6") + field(ONVL, "2") field(ONST, "Start") + field(DRVL, "1") + field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_MODE") field(VAL, "1") } @@ -308,6 +366,8 @@ record(mbbo, "$(P)$(R)TriggerActive-S") { field(ONST, "Level") field(TWVL, "3") field(TWST, "Sync Readout") + field(DRVL, "1") + field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_ACTIVE") field(VAL, "1") } @@ -326,6 +386,12 @@ record(mbbi, "$(P)$(R)TriggerActive-RB") { } ########################################################################## # Trigger Global Exposure (mode 2) +# SOME ERROR either in the API or documentation. +# API function returns min:3 +# max:5 +# defaults:3 +# But API function support only 1 - Delay +# 2 - Global Reset record(mbbo, "$(P)$(R)TriggerGlobalExposure-S") { field(DESC,"") field(PINI, "YES") @@ -334,6 +400,8 @@ record(mbbo, "$(P)$(R)TriggerGlobalExposure-S") { field(ZRST, "Delay") field(ONVL, "5") field(ONST, "Reset") + field(DRVL, "3") + field(DRVH, "5") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_GLOBAL_EXPOSURE") field(VAL, "3") } @@ -358,6 +426,8 @@ record(mbbo, "$(P)$(R)TriggerPolarity-S") { field(ZRST, "Negative") field(ONVL, "2") field(ONST, "Positive") + field(DRVL, "1") + field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_POLARITY") field(VAL, "1") } @@ -382,9 +452,10 @@ record(mbbo, "$(P)$(R)TriggerConnector-S") { field(ZRST, "Interface") field(ONVL, "2") field(ONST, "BNC") + field(DRVL, "1") + field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_CONNECTOR") - field(VAL, "1") - field(TPRO, "1") + field(VAL, "2") } record(mbbi, "$(P)$(R)TriggerConnector-RB") { @@ -471,30 +542,30 @@ record(ai, "$(P)$(R)Temperature-R") { field(TPRO, "1") } -record(mbbo, "$(P)$(R)Cooler-S") { - field(DESC, "") - field(ZRVL, "0") - field(ZRST, "OFF") - field(ONVL, "1") - field(ONST, "ON") - field(TWVL, "2") - field(TWST, "MAX") - field(DTYP, "asynInt32") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_COOLER") -} - -record(mbbi, "$(P)$(R)Cooler-RB") { - field(DESC, "") - field(ZRVL, "0") - field(ZRST, "OFF") - field(ONVL, "1") - field(ONST, "ON") - field(TWVL, "2") - field(TWST, "MAX") - field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_COOLER") - field(SCAN, "I/O Intr") -} +# record(mbbo, "$(P)$(R)Cooler-S") { +# field(DESC, "") +# field(ZRVL, "0") +# field(ZRST, "OFF") +# field(ONVL, "1") +# field(ONST, "ON") +# field(TWVL, "2") +# field(TWST, "MAX") +# field(DTYP, "asynInt32") +# field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_COOLER") +#} +# +#record(mbbi, "$(P)$(R)Cooler-RB") { +# field(DESC, "") +# field(ZRVL, "0") +# field(ZRST, "OFF") +# field(ONVL, "1") +# field(ONST, "ON") +# field(TWVL, "2") +# field(TWST, "MAX") +# field(DTYP, "asynInt32") +# field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_COOLER") +# field(SCAN, "I/O Intr") +#} record(mbbi, "$(P)$(R)CoolerStatus-R") { field(DESC, "") @@ -519,13 +590,15 @@ record(mbbo, "$(P)$(R)Binning-S") { field(PINI, "YES") field(DTYP, "asynInt32") field(ZRVL, "1") - field(ZRST, "1") + field(ZRST, "1x1") field(ONVL, "2") - field(ONST, "2") - field(TWVL, "4") - field(TWST, "4") + field(ONST, "2x2") + field(TWVL, "3") + field(TWST, "4x4") + field(DRVL, "1") + field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") - field(VAL, "0") + field(VAL, "1") } record(mbbi, "$(P)$(R)Binning-RB") { @@ -535,7 +608,7 @@ record(mbbi, "$(P)$(R)Binning-RB") { field(ZRST, "1x1") field(ONVL, "2") field(ONST, "2x2") - field(TWVL, "4") + field(TWVL, "3") field(TWST, "4x4") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") field(SCAN, "I/O Intr") @@ -578,10 +651,10 @@ record(ao, "$(P)$(R)ExposureTime-S") { field(DESC, "") field(PINI, "YES") field(DTYP, "asynFloat64") - field(DRVL, "0") + field(DRVL, "0.001004") field(DRVH, "10.0") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_EXPOSURE_TIME") - field(VAL, "0") + field(VAL, "0.009998") } record(ai, "$(P)$(R)ExposureTime-RB") { @@ -603,8 +676,10 @@ record(mbbo, "$(P)$(R)DefectCorrectMode-S") { field(ZRST, "OFF") field(ONVL, "2") field(ONST, "ON") + field(DRVL, "1") + field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DEFECTCORRECT_MODE") - field(VAL, "1") + field(VAL, "2") } record(mbbi, "$(P)$(R)DefectCorrectMode-RB") { @@ -630,6 +705,8 @@ record(mbbo, "$(P)$(R)HotPixelCorrectLevel-S") { field(ONST, "Minimum") field(TWVL, "3") field(TWST, "Aggressive") + field(DRVL, "1") + field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_HOT_PIXEL_CORRECT_LEVEL") field(VAL, "1") } From 5a2535bb99007c3f7f66cbbf106c5d0131db6402 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 21 Oct 2022 17:33:35 +0200 Subject: [PATCH 08/66] add function initCamera --- ADHamaApp/Db/hama.template | 94 ++++++++++++++---------- ADHamaApp/src/hama.cpp | 147 +++++++++++++++++++++++++++++++------ ADHamaApp/src/hama.h | 9 ++- 3 files changed, 186 insertions(+), 64 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 4173172..d18f0e4 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -173,8 +173,8 @@ record(mbbo, "$(P)$(R)SensorMode-S") { field(TWST, "Splitview") field(THVL, "4") field(THST, "Duallightsheet") - field(DRVL, "1") - field(DRVH, "4") +# field(DRVL, "1") +# field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") field(VAL, "1") } @@ -221,8 +221,8 @@ record(mbbo, "$(P)$(R)ReadoutDirection-S") { field(DTYP, "asynInt32") field(ZRVL, "5") field(ZRST, "Diverge") - field(DRVL, "5") - field(DRVH, "5") +# field(DRVL, "5") +# field(DRVH, "5") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_READOUT_DIRECTION") field(VAL, "5") } @@ -249,8 +249,8 @@ record(mbbo, "$(P)$(R)ColorType-S") { field(DTYP, "asynInt32") field(ZRVL, "1") field(ZRST, "B/W") - field(DRVL, "1") - field(DRVH, "1") +# field(DRVL, "1") +# field(DRVH, "1") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_COLOR_TYPE") field(VAL, "1") } @@ -272,8 +272,8 @@ record(mbbo, "$(P)$(R)BitPerChannel-S") { field(ZRST, "12 bits") field(ONVL, "16") field(ONST, "16 bits") - field(DRVL, "12") - field(DRVH, "16") +# field(DRVL, "12") +# field(DRVH, "16") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") field(VAL, "16") } @@ -308,8 +308,8 @@ record(mbbo, "$(P)$(R)TriggerSource-S") { field(TWST, "Software") field(THVL, "4") field(THST, "Master Pulse") - field(DRVL, "1") - field(DRVH, "4") +# field(DRVL, "1") +# field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_SOURCE") field(VAL, "1") } @@ -338,8 +338,8 @@ record(mbbo, "$(P)$(R)TriggerMode-S") { field(ZRST, "Normal") field(ONVL, "2") field(ONST, "Start") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_MODE") field(VAL, "1") } @@ -366,8 +366,8 @@ record(mbbo, "$(P)$(R)TriggerActive-S") { field(ONST, "Level") field(TWVL, "3") field(TWST, "Sync Readout") - field(DRVL, "1") - field(DRVH, "3") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_ACTIVE") field(VAL, "1") } @@ -397,11 +397,11 @@ record(mbbo, "$(P)$(R)TriggerGlobalExposure-S") { field(PINI, "YES") field(DTYP, "asynInt32") field(ZRVL, "3") - field(ZRST, "Delay") + field(ZRST, "Delayed") field(ONVL, "5") - field(ONST, "Reset") - field(DRVL, "3") - field(DRVH, "5") + field(ONST, "Global Reset") +# field(DRVL, "3") +# field(DRVH, "5") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_GLOBAL_EXPOSURE") field(VAL, "3") } @@ -410,9 +410,9 @@ record(mbbi, "$(P)$(R)TriggerGlobalExposure-RB") { field(DESC, "") field(DTYP, "asynInt32") field(ZRVL, "3") - field(ZRST, "Delay") + field(ZRST, "Delayed") field(ONVL, "5") - field(ONST, "Reset") + field(ONST, "Global Reset") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_GLOBAL_EXPOSURE") field(SCAN, "I/O Intr") } @@ -426,8 +426,8 @@ record(mbbo, "$(P)$(R)TriggerPolarity-S") { field(ZRST, "Negative") field(ONVL, "2") field(ONST, "Positive") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_POLARITY") field(VAL, "1") } @@ -452,8 +452,8 @@ record(mbbo, "$(P)$(R)TriggerConnector-S") { field(ZRST, "Interface") field(ONVL, "2") field(ONST, "BNC") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_CONNECTOR") field(VAL, "2") } @@ -595,8 +595,8 @@ record(mbbo, "$(P)$(R)Binning-S") { field(ONST, "2x2") field(TWVL, "3") field(TWST, "4x4") - field(DRVL, "1") - field(DRVH, "3") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") field(VAL, "1") } @@ -676,8 +676,8 @@ record(mbbo, "$(P)$(R)DefectCorrectMode-S") { field(ZRST, "OFF") field(ONVL, "2") field(ONST, "ON") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DEFECTCORRECT_MODE") field(VAL, "2") } @@ -705,8 +705,8 @@ record(mbbo, "$(P)$(R)HotPixelCorrectLevel-S") { field(ONST, "Minimum") field(TWVL, "3") field(TWST, "Aggressive") - field(DRVL, "1") - field(DRVH, "3") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_HOT_PIXEL_CORRECT_LEVEL") field(VAL, "1") } @@ -734,6 +734,8 @@ record(mbbo, "$(P)$(R)IntensityLutMode-S") { field(ZRST, "Through") field(ONVL, "2") field(ONST, "Page") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTENSITY_LUT_MODE") field(VAL, "1") } @@ -755,6 +757,8 @@ record(ao, "$(P)$(R)IntensityLutPage-S") { field(DESC, "") field(PINI, "YES") field(DTYP, "asynInt32") + field(DRVL, "1") + field(DRVH, "1") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTENSITY_LUT_PAGE") field(VAL, "1") } @@ -800,6 +804,8 @@ record(mbbo, "$(P)$(R)OutputTriggerSource0-S") { field(TWST, "HSync") field(THVL, "6") field(THST, "Trigger") +# field(DRVL, "2") +# field(DRVH, "6") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") field(VAL, "2") } @@ -829,6 +835,8 @@ record(mbbo, "$(P)$(R)OutputTriggerPolarity0-S") { field(ZRST, "Negative") field(ONVL, "2") field(ONST, "Positive") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY0") field(VAL, "1") } @@ -851,6 +859,8 @@ record(mbbo, "$(P)$(R)OutputTriggerActive0-S") { field(PINI, "YES") field(ZRVL, "1") field(ZRST, "Edge") +# field(DRVL, "1") +# field(DRVH, "1") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE0") field(VAL, "1") } @@ -920,6 +930,8 @@ record(mbbo, "$(P)$(R)OutputTriggerKind0-S") { field(FRST, "High") field(FVVL, "6") field(FVST, "Any Row Exposure") +# field(DRVL, "1") +# field(DRVH, "6") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_KIND0") field(VAL, "1") } @@ -976,6 +988,8 @@ record(mbbo, "$(P)$(R)OutputTriggerBaseSensor0-S") { field(TWST, "Any View") field(THVL, "16") field(THST, "All Views") +# field(DRVL, "1") +# field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_BASE_SENSOR0") field(VAL, "1") } @@ -1009,6 +1023,8 @@ record(mbbo, "$(P)$(R)MasterPulseMode-S") { field(ONST, "Start") field(TWVL, "3") field(THST, "Burst") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_MODE") field(VAL, "1") } @@ -1036,6 +1052,8 @@ record(mbbo, "$(P)$(R)MasterPulseTriggerSource-S") { field(ZRST, "External") field(ONVL, "2") field(ONST, "Software") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_TRIGGER_SOURCE") field(VAL, "1") } @@ -1157,8 +1175,8 @@ record(mbbi, "$(P)$(R)TimingInvalidExposurePeriod-RB") { record(ao, "$(P)$(R)InternalFrameRate-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "20.035817413") - field(DRVH, "49.865614232") + field(DRVL, "0.1") + field(DRVH, "100.022862") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_RATE") field(EGU, "Hz") } @@ -1176,8 +1194,8 @@ record(ai, "$(P)$(R)InternalFrameRate-RB") { record(ao, "$(P)$(R)InternalFrameInternal-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") + field(DRVL, "0.00998") + field(DRVH, "10.0") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_INTERVAL") field(EGU, "Sec") } @@ -1195,8 +1213,8 @@ record(ai, "$(P)$(R)InternalFrameInternal-RB") { record(ao, "$(P)$(R)InternalLineSpeed-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") + field(DRVL, "0.667052") + field(DRVH, "0.667052") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_SPEED") field(EGU, "m/s") } @@ -1214,8 +1232,8 @@ record(ai, "$(P)$(R)InternalLineSpeed-RB") { record(ao, "$(P)$(R)InternalLineInterval-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") + field(DRVL, "0.00001") + field(DRVH, "0.00001") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_INTERVAL") field(EGU, "Sec") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 8487c1c..eb46644 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -187,8 +187,6 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, connectCamera(); - int err = 0; - /* err |= getParameter(DCAM_IDPROP_SENSORMODE); err |= getParameter(DCAM_IDPROP_READOUTSPEED); @@ -205,24 +203,9 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, */ -#define DETECTOR_PIXEL_NUM_HORZ 0x00420830 -#define DETECTOR_PIXEL_NUM_VERT 0x00420840 - err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); - err |= getParameter(DETECTOR_PIXEL_NUM_VERT); - err |= getParameterStr(DCAM_IDSTR_VENDOR); - err |= getParameterStr(DCAM_IDSTR_MODEL); - err |= getParameterStr(DCAM_IDSTR_CAMERAID); - err |= getParameterStr(DCAM_IDSTR_BUS); - err |= getParameterStr(DCAM_IDSTR_CAMERAVERSION); - err |= getParameterStr(DCAM_IDSTR_DRIVERVERSION); - err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); - err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); - - if(err){ - printf("[DEBUG] Error = %d\n", err); - } + initCamera(); /* launch image read task */ epicsThreadCreate("HamaImageTask", @@ -247,6 +230,55 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, // printf("[DEBUG] === Destructor ADHama ===\n"); //} +//======================================================================================================== +int Hama::initCamera(){ + + int err = 0; + + err |= getParameterStr(DCAM_IDSTR_VENDOR); + err |= getParameterStr(DCAM_IDSTR_MODEL); + err |= getParameterStr(DCAM_IDSTR_CAMERAID); + err |= getParameterStr(DCAM_IDSTR_BUS); + err |= getParameterStr(DCAM_IDSTR_CAMERAVERSION); + err |= getParameterStr(DCAM_IDSTR_DRIVERVERSION); + err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); + err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); + + err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); + err |= getParameter(DETECTOR_PIXEL_NUM_VERT); + + err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); + err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); + err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); + err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); + err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); + err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); + err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); + err |= getParameter( DCAM_IDPROP_SUBARRAYHSIZE); + err |= getParameter( DCAM_IDPROP_SUBARRAYVSIZE); + + + err |= getParameter(DCAM_IDPROP_SENSORMODE); + err |= getParameter(DCAM_IDPROP_READOUTSPEED); + err |= getParameter(DCAM_IDPROP_READOUT_DIRECTION); + err |= getParameter(DCAM_IDPROP_TRIGGERSOURCE); + err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); + err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); + err |= getParameter(DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE); + err |= getParameter(DCAM_IDPROP_OUTPUTTRIGGER_POLARITY); + err |= getParameter(DCAM_IDPROP_TRIGGER_CONNECTOR); + err |= getParameter(DCAM_IDPROP_TRIGGERTIMES); + err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); + err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); + + + if(err){ + // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", + // driverName, functionName, this->portName, value, (int)status); + } +return err; +} + //============================================================================ int Hama::getParameterStr(int propertyID){ @@ -306,10 +338,6 @@ int Hama::getParameterStr(int propertyID){ break; } - - /* Do callbacks so higher layers see any changes */ - status = (asynStatus) callParamCallbacks(); - // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", // driverName, functionName, this->portName, value, (int)status); return int(status); @@ -341,57 +369,126 @@ int Hama::getParameter(int propertyID){ status = setIntegerParam(ADMaxSizeY, value); printf("SENSOR SIZE_Y = %f\n", value); break; + + case DCAM_IDPROP_IMAGE_PIXELTYPE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value); + status = setIntegerParam(hImagePixelType, value); + break; + + case DCAM_IDPROP_IMAGE_WIDTH: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value); + status = setIntegerParam(hImageWidth, value); + break; + + case DCAM_IDPROP_IMAGE_HEIGHT: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value); + status = setIntegerParam(hImageHeight, value); + break; + + case DCAM_IDPROP_IMAGE_ROWBYTES: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value); + status = setIntegerParam(hImageRowbytes, value); + break; + + case DCAM_IDPROP_IMAGE_FRAMEBYTES: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value); + status = setIntegerParam(hImageFramebytes, value); + break; + + case DCAM_IDPROP_SUBARRAYHSIZE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value); + status = setIntegerParam(ADMinX, value); + break; + + case DCAM_IDPROP_SUBARRAYVSIZE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value); + status = setIntegerParam(ADMinY, value); + break; + + case DCAM_IDPROP_SUBARRAYHPOS: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value); + status = setIntegerParam(ADSizeX, value); + break; + + case DCAM_IDPROP_SUBARRAYVPOS: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value); + status = setIntegerParam(ADSizeY, value); + break; case DCAM_IDPROP_SENSORMODE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value); + status = setIntegerParam(hSensorMode, value); printf("The SENSOR MODE = %f\n", value); break; case DCAM_IDPROP_READOUTSPEED: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value); + status = setIntegerParam(hReadoutSpeed, value); printf("The READOUT SPEED = %f\n", value); break; case DCAM_IDPROP_READOUT_DIRECTION: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value); + status = setIntegerParam(hReadoutDirection, value); printf("The READOUT DIRECTION = %f\n", value); break; case DCAM_IDPROP_TRIGGERSOURCE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value); + status = setIntegerParam(hTriggerSource, value); printf("The = TRIGGER SOURCE = %f\n", value); break; case DCAM_IDPROP_TRIGGER_MODE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value); + status = setIntegerParam(hTriggerMode, value); printf("The TRIGGER MODE = %f\n", value); break; case DCAM_IDPROP_TRIGGERACTIVE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value); + status = setIntegerParam(hTriggerActive, value); printf("The TRIGGER ACTIVE = %f\n", value); break; case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value); + status = setIntegerParam(hTriggerGlobalExposure, value); printf("The TRIGGER GLOBAL EXPOSURE = %f\n", value); break; case DCAM_IDPROP_TRIGGERPOLARITY: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &value); + status = setIntegerParam(hTriggerPolarity, value); printf("The TRIGGER POLARITY = %f\n", value); break; case DCAM_IDPROP_TRIGGER_CONNECTOR: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value); + status = setIntegerParam(hTriggerConnector, value); printf("The TRIGGER CONNECTOR = %f\n", value); break; case DCAM_IDPROP_TRIGGERTIMES: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value); + status = setIntegerParam(hTriggerTimes, value); printf("The TRIGGER TIMES = %f\n", value); break; case DCAM_IDPROP_TRIGGERDELAY: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value); + status = setIntegerParam(hTriggerDelay, value); printf("The TRIGGER DELAY = %f\n", value); break; case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value); + status = setIntegerParam(hInternalTriggerHandling, value); printf("The INTERNAL TRIGGE HANDLING = %f\n", value); break; default: - printf("The = %f\n", value); + printf("The init parameter not recognised.... = %f\n", value); break; } @@ -1470,6 +1567,10 @@ asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, return asynSuccess; } + +//======================================================================================================== + + void Hama::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes) { DCAMERR err; diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 93bfd8a..7da1cef 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -128,9 +128,10 @@ #define hImageDetectorPixelNumVertString "H_IMAGE_DETECTOR_PIXEL_NUM_VERT" /* asynInt32 ro */ #define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ #define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ - - +// For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h +#define DETECTOR_PIXEL_NUM_HORZ 0x00420830 +#define DETECTOR_PIXEL_NUM_VERT 0x00420840 class Hama : public ADDriver { @@ -279,7 +280,9 @@ private: int connectCamera(); int disconnectCamera(); - + int initCamera(); + + // helper functions for dcamapi void printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt=NULL, ...); void printInfo(HDCAM hdcam); From 2aeba5fe53e4f50486368a60ccc90f1c11a7c44c Mon Sep 17 00:00:00 2001 From: Iocuser Date: Tue, 25 Oct 2022 17:37:33 +0200 Subject: [PATCH 09/66] update posX, posY, sizeX, sizeY --- ADHamaApp/src/hama.cpp | 226 ++++++++++++++++++++++++----------------- ADHamaApp/src/hama.h | 3 +- 2 files changed, 136 insertions(+), 93 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index eb46644..c8c7b3c 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -186,25 +186,6 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, callParamCallbacks(); connectCamera(); - -/* - err |= getParameter(DCAM_IDPROP_SENSORMODE); - err |= getParameter(DCAM_IDPROP_READOUTSPEED); - err |= getParameter(DCAM_IDPROP_READOUT_DIRECTION); - err |= getParameter(DCAM_IDPROP_TRIGGERSOURCE); - err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); - err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); - err |= getParameter(DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE); - err |= getParameter(DCAM_IDPROP_TRIGGERPOLARITY); - err |= getParameter(DCAM_IDPROP_TRIGGER_CONNECTOR); - err |= getParameter(DCAM_IDPROP_TRIGGERTIMES); - err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); - err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); - */ - - - - initCamera(); /* launch image read task */ @@ -251,6 +232,7 @@ int Hama::initCamera(){ err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); + err |= getParameter( DCAM_IDPROP_BINNING); err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); @@ -349,7 +331,7 @@ int Hama::getParameter(int propertyID){ asynStatus status = asynSuccess; - double value = 0; + double value_d = 0; /* dcamprop_getvalue(m_hdcam, propertyID, &value); setIntegerParameter(ADMaxSizeX, value); @@ -359,136 +341,145 @@ int Hama::getParameter(int propertyID){ switch (propertyID){ case DETECTOR_PIXEL_NUM_HORZ: - dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &value); - status = setIntegerParam(ADMaxSizeX, value); - printf("SENSOR SIZE_X = %f\n", value); + dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &value_d); + status = setIntegerParam(ADMaxSizeX, value_d); + printf("SENSOR SIZE_X = %f\n", value_d); break; case DETECTOR_PIXEL_NUM_VERT: - dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &value); - status = setIntegerParam(ADMaxSizeY, value); - printf("SENSOR SIZE_Y = %f\n", value); + dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &value_d); + status = setIntegerParam(ADMaxSizeY, value_d); + printf("SENSOR SIZE_Y = %f\n", value_d); break; case DCAM_IDPROP_IMAGE_PIXELTYPE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value); - status = setIntegerParam(hImagePixelType, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value_d); + status = setIntegerParam(hImagePixelType, value_d); + printf("The PIXELTYPE = %f\n", value_d); break; case DCAM_IDPROP_IMAGE_WIDTH: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value); - status = setIntegerParam(hImageWidth, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value_d); + status = setIntegerParam(hImageWidth, value_d); + printf("The IMAGE_WIDTH = %f\n", value_d); break; case DCAM_IDPROP_IMAGE_HEIGHT: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value); - status = setIntegerParam(hImageHeight, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value_d); + status = setIntegerParam(hImageHeight, value_d); + printf("The IMAGE_HEIGHT = %f\n", value_d); break; case DCAM_IDPROP_IMAGE_ROWBYTES: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value); - status = setIntegerParam(hImageRowbytes, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value_d); + status = setIntegerParam(hImageRowbytes, value_d); + printf("The IMAGE_ROWBYTES = %f\n", value_d); break; case DCAM_IDPROP_IMAGE_FRAMEBYTES: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value); - status = setIntegerParam(hImageFramebytes, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value_d); + status = setIntegerParam(hImageFramebytes, value_d); + printf("The IMAGE FRAMEBYTES = %f\n", value_d); break; case DCAM_IDPROP_SUBARRAYHSIZE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value); - status = setIntegerParam(ADMinX, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); + status = setIntegerParam(ADSizeX, value_d); + printf("The SENSOR HSIZE = %f\n", value_d); break; case DCAM_IDPROP_SUBARRAYVSIZE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value); - status = setIntegerParam(ADMinY, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); + status = setIntegerParam(ADSizeY, value_d); + printf("The SENSOR VSIZE = %f\n", value_d); break; case DCAM_IDPROP_SUBARRAYHPOS: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value); - status = setIntegerParam(ADSizeX, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); + status = setIntegerParam(ADMinX, value_d); + printf("The SENSOR HPOS = %f\n", value_d); break; case DCAM_IDPROP_SUBARRAYVPOS: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value); - status = setIntegerParam(ADSizeY, value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); + status = setIntegerParam(ADMinY, value_d); + printf("The SENSOR VPOS = %f\n", value_d); break; case DCAM_IDPROP_SENSORMODE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value); - status = setIntegerParam(hSensorMode, value); - printf("The SENSOR MODE = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value_d); + status = setIntegerParam(hSensorMode, value_d); + //printf("The SENSOR MODE = %f\n", value_d); break; case DCAM_IDPROP_READOUTSPEED: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value); - status = setIntegerParam(hReadoutSpeed, value); - printf("The READOUT SPEED = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value_d); + status = setIntegerParam(hReadoutSpeed, value_d); + //printf("The READOUT SPEED = %f\n", value_d); break; case DCAM_IDPROP_READOUT_DIRECTION: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value); - status = setIntegerParam(hReadoutDirection, value); - printf("The READOUT DIRECTION = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value_d); + status = setIntegerParam(hReadoutDirection, value_d); + //printf("The READOUT DIRECTION = %f\n", value_d); break; case DCAM_IDPROP_TRIGGERSOURCE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value); - status = setIntegerParam(hTriggerSource, value); - printf("The = TRIGGER SOURCE = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value_d); + status = setIntegerParam(hTriggerSource, value_d); + //printf("The = TRIGGER SOURCE = %f\n", value_d); break; case DCAM_IDPROP_TRIGGER_MODE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value); - status = setIntegerParam(hTriggerMode, value); - printf("The TRIGGER MODE = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value_d); + status = setIntegerParam(hTriggerMode, value_d); + //printf("The TRIGGER MODE = %f\n", value_d); break; case DCAM_IDPROP_TRIGGERACTIVE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value); - status = setIntegerParam(hTriggerActive, value); - printf("The TRIGGER ACTIVE = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value_d); + status = setIntegerParam(hTriggerActive, value_d); + //printf("The TRIGGER ACTIVE = %f\n", value_d); break; case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value); - status = setIntegerParam(hTriggerGlobalExposure, value); - printf("The TRIGGER GLOBAL EXPOSURE = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value_d); + status = setIntegerParam(hTriggerGlobalExposure, value_d); + //printf("The TRIGGER GLOBAL EXPOSURE = %f\n", value_d); break; case DCAM_IDPROP_TRIGGERPOLARITY: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &value); - status = setIntegerParam(hTriggerPolarity, value); - printf("The TRIGGER POLARITY = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &value_d); + status = setIntegerParam(hTriggerPolarity, value_d); + //printf("The TRIGGER POLARITY = %f\n", value_d); break; case DCAM_IDPROP_TRIGGER_CONNECTOR: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value); - status = setIntegerParam(hTriggerConnector, value); - printf("The TRIGGER CONNECTOR = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value_d); + status = setIntegerParam(hTriggerConnector, value_d); + //printf("The TRIGGER CONNECTOR = %f\n", value_d); break; case DCAM_IDPROP_TRIGGERTIMES: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value); - status = setIntegerParam(hTriggerTimes, value); - printf("The TRIGGER TIMES = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value_d); + status = setIntegerParam(hTriggerTimes, value_d); + //printf("The TRIGGER TIMES = %f\n", value_d); break; case DCAM_IDPROP_TRIGGERDELAY: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value); - status = setIntegerParam(hTriggerDelay, value); - printf("The TRIGGER DELAY = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value_d); + status = setDoubleParam(hTriggerDelay, value_d); + //printf("The TRIGGER DELAY = %f\n", value_d); break; case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value); - status = setIntegerParam(hInternalTriggerHandling, value); - printf("The INTERNAL TRIGGE HANDLING = %f\n", value); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value_d); + status = setIntegerParam(hInternalTriggerHandling, value_d); + //printf("The INTERNAL TRIGGE HANDLING = %f\n", value_d); break; default: - printf("The init parameter not recognised.... = %f\n", value); + printf("The init parameter not recognised.... = %d\n", propertyID); break; } @@ -795,23 +786,19 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[DEBUG]::function ADNumExposures\n"); } else if (index == ADMinX) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); + updateSensorSize(); printf("[DEBUG]::function ADMinX\n"); } else if (index == ADMinY) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); + updateSensorSize(); printf("[DEBUG]::function ADMinY\n"); } else if (index == ADSizeX) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); + updateSensorSize(); printf("[DEBUG]::function ADSizeX\n"); } else if (index == ADSizeY) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); + updateSensorSize(); printf("[DEBUG]::function ADSizeY\n"); } else if (index == ADReadStatus) { @@ -901,8 +888,9 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[DEBUG]::function HotPixelCorrectLevel %d\n", value); } else if (index == hBinning) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BINNING, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &value_d); + updateSensorSize(); + //dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BINNING, value); + //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &value_d); printf("[DEBUG]::function Binning %d\n", value); } else if (index == hSubarrayHPos) { @@ -1131,7 +1119,6 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ getParamName(index, ¶mName); - setDoubleParam(index, value); if(index == ADAcquireTime) { status = (asynStatus)setFeature(DCAM_IDPROP_EXPOSURETIME, value); @@ -1242,6 +1229,7 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ printf("[DEBUG]::function writeFloat64 did not find a parameter\n"); } + setDoubleParam(index, value); status = (asynStatus) callParamCallbacks(); if (status) @@ -1258,6 +1246,60 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ return(asynSuccess); } +//============================================================================ +int Hama::updateSensorSize(){ + + int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; + int status = 0; + + double v1,v2,v3,v4,b1; + double a1,a2,a3,a4,a5; + + status |= getIntegerParam(ADMinX, &minH); + status |= getIntegerParam(ADMinY, &minV); + status |= getIntegerParam(ADSizeX, &sizeH); + status |= getIntegerParam(ADSizeY, &sizeV); + status |= getIntegerParam(hBinning, &binning); + + printf("minH = %d\n", minH); + + + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, 2); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, minH); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, minV); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, sizeH); + dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, sizeV); + //dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, sizeV); + + + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &v1); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &v2); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &v3); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &v4); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &b1); + + 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); + status = (asynStatus) callParamCallbacks(); + + printf("\n"); + printf("updateSensorSize, hPos = %d\n", int(v1) ); + printf("updateSensorSize, hSize = %d\n", int(v3) ); + printf("updateSensorSize, vPos = %d\n", int(v2) ); + printf("updateSensorSize, vSize = %d\n", int(v4) ); + printf("updateSensorSize, binning = %d\n", int(b1) ); + printf("updateSensorSize, imageSizeH = %d\n", int(a1) ); + printf("updateSensorSize, imageSizeV = %d\n", int(a2) ); + printf("updateSensorSize, imageSize = %d\n", int(a1*a2) ); + printf("updateSensorSize, rowBytes = %d\n", int(a3) ); + printf("updateSensorSize, frameBytes = %d\n", int(a4) ); +return 0; +} + //============================================================================ /* asynStatus Hama::readEnum(asynUser *pasynUser, char *strings[], int values[], diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 7da1cef..3ce2ee9 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -280,7 +280,8 @@ private: int connectCamera(); int disconnectCamera(); - int initCamera(); + int initCamera(); + int updateSensorSize(); // helper functions for dcamapi From d5831a6dc862a213cc1e4790a8fb2c1080aafd5f Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 26 Oct 2022 17:21:45 +0200 Subject: [PATCH 10/66] Add setIntegerParam in writeInt32 --- ADHamaApp/src/hama.cpp | 63 ++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index c8c7b3c..ecb4215 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -16,6 +16,7 @@ // --- includes from DCMAPI ---- #include "dcamprop.h" // +#include #define NUM_HAMA_PARAMS ((int)(&LAST_HAMA_PARAM - &FIRST_HAMA_PARAM + 1)) @@ -749,7 +750,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ double value_d = 0; //getIntegerParam(index, &value); - + status = setIntegerParam(index, value); if (index == ADAcquire) { printf("[DEBUG]::function ADAcquire\n"); if (value) { @@ -1090,7 +1091,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ setIntegerParam(index, value); /* Do callbacks so higher layers see any changes */ - status = (asynStatus) callParamCallbacks(); + //status = (asynStatus) callParamCallbacks(); if (status) asynPrint(pasynUser, ASYN_TRACE_ERROR, @@ -1253,7 +1254,7 @@ int Hama::updateSensorSize(){ int status = 0; double v1,v2,v3,v4,b1; - double a1,a2,a3,a4,a5; + double a1,a2,a3,a4; status |= getIntegerParam(ADMinX, &minH); status |= getIntegerParam(ADMinY, &minV); @@ -1264,27 +1265,53 @@ int Hama::updateSensorSize(){ printf("minH = %d\n", minH); - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, 2); - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, minH); - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, minV); - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, sizeH); - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, sizeV); - //dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, sizeV); + m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, 2); + if( failed(m_err) ) + printError( m_hdcam, m_err, "dcambuf_release()" ); + + 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()" ); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &v1); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &v2); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &v3); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &v4); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &b1); + m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, minV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &v2); + if( failed(m_err) ) + printError( m_hdcam, m_err, "dcambuf_release()" ); - 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); + m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, sizeH); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &v3); + if( failed(m_err) ) + printError( m_hdcam, m_err, "dcambuf_release()" ); + + m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, sizeV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &v4); + if( failed(m_err) ) + printError( m_hdcam, m_err, "dcambuf_release()" ); + + 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); + //setIntegerParam(hSubarrayMode, 2); + printf(".... callParamCallback ...\n"); status = (asynStatus) callParamCallbacks(); + printf("status = %d\n", status); printf("\n"); printf("updateSensorSize, hPos = %d\n", int(v1) ); From 5e9f6dfcfe8efb44dc955f5ec0f328b0ebb47297 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 28 Oct 2022 09:07:55 +0200 Subject: [PATCH 11/66] Update gitignore --- .gitignore | 3 ++- .vscode/c_cpp_properties.json | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index fd9f6c6..fbd322a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ O.* *.db *.db.* pv.list -core.* \ No newline at end of file +core.* +.vscode \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index b374b9b..ead342c 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -5,7 +5,12 @@ "includePath": [ "${workspaceFolder}/**", "${workspaceFolder}/ADHamaApp/src/**", - "/home/iocuser/.conda/envs/hama/epics/include" + "${workspaceFolder}/ADHamaApp/src/", + "/home/iocuser/.conda/envs/hama/epics/include/**", + "/home/iocuser/.conda/envs/hama/epics/include/", + "/home/iocuser/.conda/envs/hama/modules/adcore/3.10.0/include/", + "/home/iocuser/.conda/envs/hama/modules/**", + "/home/iocuser/.conda/envs/hama/epics/include/os/Linux" ], "defines": [], "compilerPath": "/usr/bin/gcc", From 1e6f05da04c0428bd5e4cba6526d250417c4980c Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 4 Nov 2022 08:42:51 +0100 Subject: [PATCH 12/66] Add check validation in the write functions and update some items in the mbbi/o pvs --- ADHamaApp/Db/hama.template | 45 ++-- ADHamaApp/src/hama.cpp | 505 ++++++++++++++++++++++++------------- 2 files changed, 352 insertions(+), 198 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index d18f0e4..b3afdd4 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -167,8 +167,8 @@ record(mbbo, "$(P)$(R)SensorMode-S") { field(DTYP, "asynInt32") field(ZRVL, "1") field(ZRST, "Area") - field(ZRVL, "2") - field(ZRST, "Progressive") + field(ONVL, "2") + field(ONST, "Progressive") field(TWVL, "3") field(TWST, "Splitview") field(THVL, "4") @@ -182,13 +182,13 @@ record(mbbo, "$(P)$(R)SensorMode-S") { record(mbbi, "$(P)$(R)SensorMode-RB") { field(DESC,"") field(DTYP, "asynInt32") - field(ZRVL, "0") - field(ZRST, "Area") field(ZRVL, "1") - field(ZRST, "Progressive") - field(TWVL, "2") + field(ZRST, "Area") + field(ONVL, "2") + field(ONST, "Progressive") + field(TWVL, "3") field(TWST, "Splitview") - field(THVL, "3") + field(THVL, "4") field(THST, "Duallightsheet") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") field(SCAN, "I/O Intr") @@ -196,18 +196,26 @@ record(mbbi, "$(P)$(R)SensorMode-RB") { ########################################################################## # Readout Speed (long) -record(ao, "$(P)$(R)ReadoutSpeed-S") { +record(mbbo, "$(P)$(R)ReadoutSpeed-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") - field(DRVL, "1") - field(DRVH, "2") + field(ZRVL, "1") + field(ZRST, "1") + field(ONVL, "2") + field(ONST, "2") + #field(DRVL, "1") + #field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_READOUT_SPEED") field(VAL, "2") } -record(ai, "$(P)$(R)ReadoutSpeed-RB") { +record(mbbi, "$(P)$(R)ReadoutSpeed-RB") { field(DESC,"") + field(ZRVL, "1") + field(ZRST, "1") + field(ONVL, "2") + field(ONST, "2") field(DTYP, "asynInt32") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_READOUT_SPEED") field(SCAN, "I/O Intr") @@ -215,21 +223,25 @@ record(ai, "$(P)$(R)ReadoutSpeed-RB") { ########################################################################## # Readout Direction (mode 3) +# API shows there are only one posssible value... 5 +# Documentation shows 3 different record(mbbo, "$(P)$(R)ReadoutDirection-S") { field(DESC,"") field(PINI, "YES") - field(DTYP, "asynInt32") field(ZRVL, "5") field(ZRST, "Diverge") -# field(DRVL, "5") -# field(DRVH, "5") + field(ONVL, "1") + field(ONST, "Forward") + field(TWVL, "2") + field(TWST, "Backward") + field(DTYP, "asynInt32") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_READOUT_DIRECTION") field(VAL, "5") } record(mbbi, "$(P)$(R)ReadoutDirection-RB") { field(DESC,"") - field(ZRVL, "0") + field(ZRVL, "5") field(ZRST, "Diverge") field(ONVL, "1") field(ONST, "Forward") @@ -1460,5 +1472,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 ecb4215..5202e82 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -742,15 +742,17 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ int index = pasynUser->reason; int adstatus; + // the setget function required double parameter + double dvalue = double(value); + double value_d = 0; getParamName(index, ¶mName); /* Ensure that ADStatus is set correctly before we set ADAcquire.*/ getIntegerParam(ADStatus, &adstatus); - double value_d = 0; - //getIntegerParam(index, &value); - status = setIntegerParam(index, value); + status = setIntegerParam(index, value); + if (index == ADAcquire) { printf("[DEBUG]::function ADAcquire\n"); if (value) { @@ -808,281 +810,387 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[DEBUG]::function ADReadStatus\n"); } else if (index == hSensorMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value_d); printf("[DEBUG]::function SensorMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hReadoutSpeed) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value_d); printf("[DEBUG]::function ReadoutSpeed %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hReadoutDirection) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value_d); printf("[DEBUG]::function ReadoutDirection %d\n", value); - } + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue, 0); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } else if (index == hColorType) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &value_d); - printf("[DEBUG]::function ColorType %d\n", value); + printf("[DEBUG]::function ColorType %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hBitPerChannel) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &value_d); printf("[DEBUG]::function BitPerChannel %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTriggerSource) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value_d); printf("[DEBUG]::function TriggerSource %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } + } else if (index == hTriggerMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value_d); printf("[DEBUG]::function TriggerMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTriggerActive) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value_d); printf("[DEBUG]::function TriggerActive %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTriggerGlobalExposure) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value_d); printf("[DEBUG]::function TriggerGlobalExposure %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTriggerPolarity) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &value_d); printf("[DEBUG]::function TriggerPolarity %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTriggerConnector) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value_d); printf("[DEBUG]::function TriggerConnector %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTriggerTimes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value_d); printf("[DEBUG]::function TriggerTimes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hInternalTriggerHandling) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value_d); printf("[DEBUG]::function TriggerHandling %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hSensorCoolerStatus) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &value_d); printf("[DEBUG]::function SensorCoolerStatus %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hDefectCorrectMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &value_d); printf("[DEBUG]::function DefectCorrerMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hHotPixelCorrectLevel) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &value_d); printf("[DEBUG]::function HotPixelCorrectLevel %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hBinning) { updateSensorSize(); - //dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BINNING, value); - //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &value_d); printf("[DEBUG]::function Binning %d\n", value); } else if (index == hSubarrayHPos) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); printf("[DEBUG]::function SubArrayHPos %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hSubarrayHSize) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); printf("[DEBUG]::function SubarrayHSize %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hSubarrayVPos) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); printf("[DEBUG]::function SubarrayVPos %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hSubarrayVSize) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); printf("[DEBUG]::function SubarrayVSize %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hSubarrayMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &value_d); printf("[DEBUG]::function SubarrayMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hIntensityLutMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &value_d); printf("[DEBUG]::function IntensityLutMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hIntensityLutPage) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &value_d); printf("[DEBUG]::function IntensityLutPage %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hExtractionMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &value_d); printf("[DEBUG]::function ExtractionMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTimingExposure) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &value_d); printf("[DEBUG]::function TimingExposure %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageWidth) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value_d); printf("[DEBUG]::function ImageWidth %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageHeight) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value_d); printf("[DEBUG]::function ImageHeight %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageRowbytes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value_d); printf("[DEBUG]::function ImageRowBytes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageFramebytes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value_d); printf("[DEBUG]::function ImageFramBytes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageTopOffsetBytes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &value_d); printf("[DEBUG]::function ImageTopOffsetBytes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImagePixelType) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value_d); printf("[DEBUG]::function ImagePixelType %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hBufferRowbytes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &value_d); printf("[DEBUG]::function BufferRowBytes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hBufferFramebytes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &value_d); printf("[DEBUG]::function BufferFrameBytes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hBufferTopOffsetBytes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &value_d); printf("[DEBUG]::function BufferTopOffsetBytes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hBufferPixelType) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &value_d); printf("[DEBUG]::function BufferPixelType %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hRecordFixedBytesPerFile) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &value_d); printf("[DEBUG]::function ecordFixedBytesPerFile %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hRecordFixedBytesPerSession) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &value_d); printf("[DEBUG]::function RecordFixedBytesPerSesion %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hRecordFixedBytesPerFrame) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &value_d); printf("[DEBUG]::function RecordFixedBytesPerFrame %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hNumberOfOutputTriggerConnector) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &value_d); printf("[DEBUG]::function NumberOutputTriggerConnector %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerSource0) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &value_d); printf("[DEBUG]::function OutputTriggerSource0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerPolarity0) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &value_d); printf("[DEBUG]::function OutputTriggerPolaroty0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerActive0) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &value_d); printf("[DEBUG]::function OutputTriggerActive0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerKind0) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &value_d); printf("[DEBUG]::function OutputTriggerKind0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerBaseSensor0) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &value_d); printf("[DEBUG]::function OutputTriggerBaseSensor0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerPreHsyncCount) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &value_d); printf("[DEBUG]::function OutputTriggerPreHsynCount %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hMasterPulseMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &value_d); printf("[DEBUG]::function MasterPulseMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hMasterPulseTriggerSource) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &value_d); printf("[DEBUG]::function MasterPulseTriggerSource %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hMasterPulseBurstTimes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &value_d); printf("[DEBUG]::function MasterPulseBurstTimes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hSystemAlive) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &value_d); printf("[DEBUG]::function SystemAlive %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hNumberOfView) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &value_d); printf("[DEBUG]::function NumberOfView %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageDetectorPixelNumHorz) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &value_d); printf("[DEBUG]::function ImageDetectorPixelNumHorz %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageDetectorPixelNumVert) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &value_d); printf("[DEBUG]::function ImageDetectorPixelNumVert %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTimeStampProducer) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &value_d); printf("[DEBUG]::function TimeStampProducer %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hFrameStampProducer) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &value_d); printf("[DEBUG]::function FrameStampProducer %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else{ printf("[DEBUG]::function writeInt32 did not find a parameter\n"); @@ -1109,122 +1217,157 @@ return status; asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ -// printf("[DEBUG]::writeFloat64\t"); asynStatus status = asynSuccess; const char* functionName = "writeFloat64"; const char* paramName; int index = pasynUser->reason; - double value_d = 0; + double dvalue = value; getParamName(index, ¶mName); if(index == ADAcquireTime) { + printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); status = (asynStatus)setFeature(DCAM_IDPROP_EXPOSURETIME, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); - printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value_d); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTriggerDelay) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value_d); - printf("[DEBUG]::function TriggerDelay %f\n", value_d); + printf("[DEBUG]::function TriggerDelay %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hExposureTime) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); - - // status = if value_d != value = - // status = error - - printf("[DEBUG]::function ADImageMode\n"); + printf("[DEBUG]::function ADImageMode %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } - else if (index == hTimingReadoutTime) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &value_d); - printf("[DEBUG]::function TimingReadoutTime %f\n", value_d); + printf("[DEBUG]::function TimingReadoutTime %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTimingCyclicTriggerPeriod) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &value_d); - printf("[DEBUG]::function TimingCyclicTriggerPeriod %f\n", value_d); + printf("[DEBUG]::function TimingCyclicTriggerPeriod %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTimingMinTriggerBlanking) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &value_d); - printf("[DEBUG]::function TimingMinTriggerBlanking %f\n", value_d); + printf("[DEBUG]::function TimingMinTriggerBlanking %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTimingMinTriggerInterval) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, &value_d); - printf("[DEBUG]::function TimingMinTriggerInterval %f\n", value_d); + printf("[DEBUG]::function TimingMinTriggerInterval %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTimingGlobalExposureDelay) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, &value_d); - printf("[DEBUG]::function TimingGlobalExposureDelay %f\n", value_d); + printf("[DEBUG]::function TimingGlobalExposureDelay %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hTimingInvalidExposurePeriod) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, &value_d); - printf("[DEBUG]::function TimingEnvalidExposurePeriod %f\n", value_d); + printf("[DEBUG]::function TimingEnvalidExposurePeriod %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hInternalFrameRate) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &value_d); - printf("[DEBUG]::function InternalFrameRate %f\n", value_d); + printf("[DEBUG]::function InternalFrameRate %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hInternalFrameInterval) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &value_d); - printf("[DEBUG]::function InternalFrameRate %f\n", value_d); + printf("[DEBUG]::function InternalFrameRate %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hInternalLineSpeed) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, &value_d); - printf("[DEBUG]::function InternalLineSpeed %f\n", value_d); + printf("[DEBUG]::function InternalLineSpeed %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hInternalLineInterval) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, &value_d); - printf("[DEBUG]::function InternalLineInterupt %f\n", value_d); + printf("[DEBUG]::function InternalLineInterupt %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerDelay0) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, &value_d); - printf("[DEBUG]::function OutputTriggerDelay0 %f\n", value_d); + printf("[DEBUG]::function OutputTriggerDelay0 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hOutputTriggerPeriod0) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &value_d); - printf("[DEBUG]::function OutputTriggerPeriod0 %f\n", value_d); + printf("[DEBUG]::function OutputTriggerPeriod0 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hMasterPulseInterval) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &value_d); - printf("[DEBUG]::function MasterPulseInterval %f\n", value_d); + printf("[DEBUG]::function MasterPulseInterval %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hConversionFactorCoeff) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &value_d); - printf("[DEBUG]::function ConversionFactorCoeff %f\n", value_d); + printf("[DEBUG]::function ConversionFactorCoeff %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hConversionFactorOffset) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, &value_d); - printf("[DEBUG]::function ConversionFactorOffset %f\n", value_d); + printf("[DEBUG]::function ConversionFactorOffset %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageDetectorPixelWidth) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &value_d); - printf("[DEBUG]::function ImageDetectorPixelWidth %f\n", value_d); + printf("[DEBUG]::function ImageDetectorPixelWidth %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else if (index == hImageDetectorPixelHeight) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &value_d); - printf("[DEBUG]::function ImageDetectorPixelHeight %f\n", value_d); + printf("[DEBUG]::function ImageDetectorPixelHeight %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } } else{ printf("[DEBUG]::function writeFloat64 did not find a parameter\n"); From 95c47f6174a3bede237dc7d437008b191c9805e1 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 31 Oct 2022 14:51:10 +0100 Subject: [PATCH 13/66] 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 14/66] 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") } From c1904c4dbad4721e3ed1a4ae01704ece334b7991 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 4 Nov 2022 09:31:21 +0100 Subject: [PATCH 15/66] Remove rebase tags --- ADHamaApp/src/hama.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index f045b08..ccbfa43 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -1259,11 +1259,8 @@ 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); From 8bd5b0970ed63c0a56de38840fe1d995bd3d4f4b Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 7 Nov 2022 12:30:20 +0100 Subject: [PATCH 16/66] Add TimeStamp PV collect from camera removing the exp_time + readoutTime --- ADHamaApp/Db/hama.template | 9 +++++++++ ADHamaApp/src/hama.cpp | 11 ++++++++++- ADHamaApp/src/hama.h | 4 +++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 1db9f4e..e4deaf2 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -109,6 +109,15 @@ record(calc, "$(P)$(R)EVRTime-R") { field(INPB, "$(P)$(R)#EVRTimeProc") } +record(ai, "$(P)$(R)TimeStamp-RB") { + field(DESC, "DCAM Timestamp when trigger received") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TIMESTAMP") + field(PREC, "3") + field(SCAN, "I/O Intr") + field(PINI, "YES") +} + ########################################################################## # General properties # ########################################################################## diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index ccbfa43..d216d21 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -181,6 +181,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hImageDetectorPixelNumVertString, asynParamInt32, &hImageDetectorPixelNumVert); createParam( hTimeStampProducerString, asynParamInt32, &hTimeStampProducer); createParam( hFrameStampProducerString, asynParamInt32, &hFrameStampProducer); + createParam( hTimeStampString, asynParamFloat64, &hTimeStamp); setIntegerParam(NDArrayCallbacks, 1); @@ -672,7 +673,15 @@ void Hama::imageTask(){ accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, width * 2, width, height, ts_sec, ts_microsec); - // printf("Timestamp from camera: %d\n", 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); + timestamp = (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); + status = setDoubleParam(hTimeStamp, timestamp); + + //printf("Timestamp from camera: %f\n", (ts_sec + ts_microsec / 1.0e6)); + //printf("Timestamp from camera with correction: %f\n", timestamp); + getIntegerParam(NDArrayCallbacks, &callback); if(callback) { diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 3ce2ee9..a5b09a5 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -128,6 +128,7 @@ #define hImageDetectorPixelNumVertString "H_IMAGE_DETECTOR_PIXEL_NUM_VERT" /* asynInt32 ro */ #define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ #define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ +#define hTimeStampString "H_TIMESTAMP" /* asynFloat64 ro */ // For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h #define DETECTOR_PIXEL_NUM_HORZ 0x00420830 @@ -249,7 +250,8 @@ protected: int hImageDetectorPixelNumVert; int hTimeStampProducer; int hFrameStampProducer; - #define LAST_HAMA_PARAM hFrameStampProducer + int hTimeStamp; + #define LAST_HAMA_PARAM hTimeStamp private: From 97a79d1cdf022fda20816caf9deb388bbd87ce46 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Mon, 7 Nov 2022 17:29:44 +0100 Subject: [PATCH 17/66] Update two functions: getParameter and sensorSize --- ADHamaApp/src/hama.cpp | 206 +++++++++++++++++++++-------------------- 1 file changed, 105 insertions(+), 101 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index d216d21..33b3451 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -205,7 +205,8 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, /* shutdown on exit */ //epicsAtExit(c_shutdown, this); - printf("[DEBUG] === END Constructor ADHama ===\n"); + printf("\n\n=== END Constructor ADHama ===\n"); + printf("===================================================================\n"); } //============================================================================ //Hama::~Hama(){ @@ -249,7 +250,7 @@ int Hama::initCamera(){ err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); err |= getParameter(DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE); - err |= getParameter(DCAM_IDPROP_OUTPUTTRIGGER_POLARITY); + err |= getParameter(DCAM_IDPROP_TRIGGERPOLARITY); err |= getParameter(DCAM_IDPROP_TRIGGER_CONNECTOR); err |= getParameter(DCAM_IDPROP_TRIGGERTIMES); err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); @@ -331,166 +332,149 @@ return int(status); int Hama::getParameter(int propertyID){ printf("\n[DEBUG] *** Function:getProperty\n"); - asynStatus status = asynSuccess; - - double value_d = 0; - /* - dcamprop_getvalue(m_hdcam, propertyID, &value); - setIntegerParameter(ADMaxSizeX, value); - printf("PropertyID = %f\n", value); -*/ + double dvalue = 0; switch (propertyID){ case DETECTOR_PIXEL_NUM_HORZ: - dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &value_d); - status = setIntegerParam(ADMaxSizeX, value_d); - printf("SENSOR SIZE_X = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); + status = setIntegerParam(ADMaxSizeX, dvalue); break; case DETECTOR_PIXEL_NUM_VERT: - dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &value_d); - status = setIntegerParam(ADMaxSizeY, value_d); - printf("SENSOR SIZE_Y = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &dvalue); + status = setIntegerParam(ADMaxSizeY, dvalue); break; case DCAM_IDPROP_IMAGE_PIXELTYPE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value_d); - status = setIntegerParam(hImagePixelType, value_d); - printf("The PIXELTYPE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); + status = setIntegerParam(hImagePixelType, dvalue); break; case DCAM_IDPROP_IMAGE_WIDTH: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value_d); - status = setIntegerParam(hImageWidth, value_d); - printf("The IMAGE_WIDTH = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + status = setIntegerParam(hImageWidth, dvalue); break; case DCAM_IDPROP_IMAGE_HEIGHT: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value_d); - status = setIntegerParam(hImageHeight, value_d); - printf("The IMAGE_HEIGHT = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + status = setIntegerParam(hImageHeight, dvalue); break; case DCAM_IDPROP_IMAGE_ROWBYTES: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value_d); - status = setIntegerParam(hImageRowbytes, value_d); - printf("The IMAGE_ROWBYTES = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); + status = setIntegerParam(hImageRowbytes, dvalue); break; case DCAM_IDPROP_IMAGE_FRAMEBYTES: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value_d); - status = setIntegerParam(hImageFramebytes, value_d); - printf("The IMAGE FRAMEBYTES = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); + status = setIntegerParam(hImageFramebytes, dvalue); + break; + + case DCAM_IDPROP_BINNING: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &dvalue); + status = setIntegerParam(hBinning, dvalue); break; case DCAM_IDPROP_SUBARRAYHSIZE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value_d); - status = setIntegerParam(ADSizeX, value_d); - printf("The SENSOR HSIZE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dvalue); + status = setIntegerParam(ADSizeX, dvalue); break; case DCAM_IDPROP_SUBARRAYVSIZE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value_d); - status = setIntegerParam(ADSizeY, value_d); - printf("The SENSOR VSIZE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dvalue); + status = setIntegerParam(ADSizeY, dvalue); break; case DCAM_IDPROP_SUBARRAYHPOS: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value_d); - status = setIntegerParam(ADMinX, value_d); - printf("The SENSOR HPOS = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dvalue); + status = setIntegerParam(ADMinX, dvalue); break; case DCAM_IDPROP_SUBARRAYVPOS: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value_d); - status = setIntegerParam(ADMinY, value_d); - printf("The SENSOR VPOS = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dvalue); + status = setIntegerParam(ADMinY, dvalue); break; case DCAM_IDPROP_SENSORMODE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value_d); - status = setIntegerParam(hSensorMode, value_d); - //printf("The SENSOR MODE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); + status = setIntegerParam(hSensorMode, dvalue); break; case DCAM_IDPROP_READOUTSPEED: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value_d); - status = setIntegerParam(hReadoutSpeed, value_d); - //printf("The READOUT SPEED = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); + status = setIntegerParam(hReadoutSpeed, dvalue); break; case DCAM_IDPROP_READOUT_DIRECTION: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value_d); - status = setIntegerParam(hReadoutDirection, value_d); - //printf("The READOUT DIRECTION = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); + status = setIntegerParam(hReadoutDirection, dvalue); break; case DCAM_IDPROP_TRIGGERSOURCE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value_d); - status = setIntegerParam(hTriggerSource, value_d); - //printf("The = TRIGGER SOURCE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); + status = setIntegerParam(hTriggerSource, dvalue); break; case DCAM_IDPROP_TRIGGER_MODE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value_d); - status = setIntegerParam(hTriggerMode, value_d); - //printf("The TRIGGER MODE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); + status = setIntegerParam(hTriggerMode, dvalue); break; case DCAM_IDPROP_TRIGGERACTIVE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value_d); - status = setIntegerParam(hTriggerActive, value_d); - //printf("The TRIGGER ACTIVE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &dvalue); + status = setIntegerParam(hTriggerActive, dvalue); break; case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value_d); - status = setIntegerParam(hTriggerGlobalExposure, value_d); - //printf("The TRIGGER GLOBAL EXPOSURE = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); + status = setIntegerParam(hTriggerGlobalExposure, dvalue); break; case DCAM_IDPROP_TRIGGERPOLARITY: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &value_d); - status = setIntegerParam(hTriggerPolarity, value_d); - //printf("The TRIGGER POLARITY = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &dvalue); + status = setIntegerParam(hTriggerPolarity, dvalue); break; case DCAM_IDPROP_TRIGGER_CONNECTOR: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value_d); - status = setIntegerParam(hTriggerConnector, value_d); - //printf("The TRIGGER CONNECTOR = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); + status = setIntegerParam(hTriggerConnector, dvalue); break; case DCAM_IDPROP_TRIGGERTIMES: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value_d); - status = setIntegerParam(hTriggerTimes, value_d); - //printf("The TRIGGER TIMES = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); + status = setIntegerParam(hTriggerTimes, dvalue); break; case DCAM_IDPROP_TRIGGERDELAY: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value_d); - status = setDoubleParam(hTriggerDelay, value_d); - //printf("The TRIGGER DELAY = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &dvalue); + status = setDoubleParam(hTriggerDelay, dvalue); break; case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value_d); - status = setIntegerParam(hInternalTriggerHandling, value_d); - //printf("The INTERNAL TRIGGE HANDLING = %f\n", value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); + status = setIntegerParam(hInternalTriggerHandling, dvalue); break; case DCAM_IDPROP_TIMESTAMP_PRODUCER: - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &value_d); - status = setIntegerParam(hTimeStampProducer, value_d); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); + status = setIntegerParam(hTimeStampProducer, dvalue); break; default: - printf("The init parameter not recognised.... = %d\n", propertyID); + char text[256]; + dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); + printf("Parameter not recognised, IDPROP:0x%08x, NAME:%s\n", propertyID, text); break; } + if(failed(m_err)) { + char text[256]; + dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); + printError(m_hdcam, m_err, "dcamprop_getvalue()", "IDPROP:0x%08x, VALUE:%s\n", propertyID, text); + } + /* Do callbacks so higher layers see any changes */ status = (asynStatus) callParamCallbacks(); return int(status); @@ -761,7 +745,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ int adstatus; // the setget function required double parameter double dvalue = double(value); - double value_d = 0; getParamName(index, ¶mName); @@ -1414,10 +1397,11 @@ return(asynSuccess); int Hama::updateSensorSize(){ int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; + double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; int status = 0; - double v1,v2,v3,v4,b1; - double a1,a2,a3,a4; + //double v1,v2,v3,v4,b1; + //double a1,a2,a3,a4; status |= getIntegerParam(ADMinX, &minH); status |= getIntegerParam(ADMinY, &minV); @@ -1426,13 +1410,29 @@ int Hama::updateSensorSize(){ status |= getIntegerParam(hBinning, &binning); printf("minH = %d\nminV = %d\nSizeV = %d\nSizeH = %d\n", minH, minV, sizeV, sizeH); + + dbinning = binning; + dminH = minH; + dminV = minV; + dsizeH = sizeH; + dsizeV = sizeV; + double mode = DCAMPROP_MODE__ON; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &mode); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + + +/* double value = 0; dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING_INDEPENDENT, &value); - printf("DCAM_IDPROP_BINNING_INDEPENDENT: %d\n", value); + printf("DCAM_IDPROP_BINNING_INDEPENDENT: %d\n", (int)value); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &value); - printf("DCAM_IDPROP_SUBARRAYMODE: %d\n", value); + printf("DCAM_IDPROP_SUBARRAYMODE: %d\n", (int)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. @@ -1467,25 +1467,24 @@ int Hama::updateSensorSize(){ if( failed(m_err) ) printError( m_hdcam, m_err, "dcambuf_release()" ); - 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); +*/ status = (asynStatus) callParamCallbacks(); + //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); + printf("status = %d\n", status); + printf("\n"); - printf("updateSensorSize, hPos = %d\n", int(v1) ); - printf("updateSensorSize, hSize = %d\n", int(v3) ); - printf("updateSensorSize, vPos = %d\n", int(v2) ); - printf("updateSensorSize, vSize = %d\n", int(v4) ); - printf("updateSensorSize, binning = %d\n", int(b1) ); - printf("updateSensorSize, imageSizeH = %d\n", int(a1) ); - printf("updateSensorSize, imageSizeV = %d\n", int(a2) ); - printf("updateSensorSize, imageSize = %d\n", int(a1*a2) ); - printf("updateSensorSize, rowBytes = %d\n", int(a3) ); - printf("updateSensorSize, frameBytes = %d\n", int(a4) ); + printf("updateSensorSize, hPos = %d\n", int(minH) ); + printf("updateSensorSize, hSize = %d\n", int(sizeH) ); + printf("updateSensorSize, vPos = %d\n", int(minV) ); + printf("updateSensorSize, vSize = %d\n", int(sizeV) ); + printf("updateSensorSize, binning = %d\n", int(binning) ); + printf("updateSensorSize, frameBytes = %d\n", int(sizeH*sizeV) ); return 0; } @@ -1710,6 +1709,7 @@ int Hama::freeBuffers(){ return 0; } +//============================================================================ asynStatus Hama::stopAcquire(void) { asynStatus status = asynSuccess; @@ -1718,6 +1718,7 @@ asynStatus Hama::stopAcquire(void) return status; } +//============================================================================ asynStatus Hama::startAcquire(void) { asynStatus status = asynSuccess; @@ -1752,6 +1753,7 @@ asynStatus Hama::startAcquire(void) return status; } +//============================================================================ inline void* memcpy_s( void* dst, size_t dstsize, const void* src, size_t srclen ) { if( dstsize < srclen ) @@ -1760,6 +1762,7 @@ inline void* memcpy_s( void* dst, size_t dstsize, const void* src, size_t srclen return memcpy( dst, src, srclen ); } +//============================================================================ asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy, int32& ts_sec, int32& ts_microsec) @@ -1863,6 +1866,7 @@ void Hama::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int3 framebytes = (int32)property_value; } +//============================================================================ asynStatus Hama::imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo) { DCAMERR err; From a9d35e911cdb2affc84f0405ad3784b2e2c16238 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Tue, 8 Nov 2022 17:31:25 +0100 Subject: [PATCH 18/66] save 2022-11-08 readout parameters still does not work... --- ADHamaApp/src/hama.cpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 33b3451..58e9230 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -330,21 +330,32 @@ return int(status); } //============================================================================ int Hama::getParameter(int propertyID){ - printf("\n[DEBUG] *** Function:getProperty\n"); asynStatus status = asynSuccess; double dvalue = 0; + // status |= getIntegerParam(ADMinX, &minH); + // m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + + switch (propertyID){ case DETECTOR_PIXEL_NUM_HORZ: m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } status = setIntegerParam(ADMaxSizeX, dvalue); + printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DETECTOR_PIXEL_NUM_VERT: m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } status = setIntegerParam(ADMaxSizeY, dvalue); + printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DCAM_IDPROP_IMAGE_PIXELTYPE: @@ -354,12 +365,20 @@ int Hama::getParameter(int propertyID){ case DCAM_IDPROP_IMAGE_WIDTH: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } status = setIntegerParam(hImageWidth, dvalue); + printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DCAM_IDPROP_IMAGE_HEIGHT: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } status = setIntegerParam(hImageHeight, dvalue); + printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DCAM_IDPROP_IMAGE_ROWBYTES: @@ -475,6 +494,9 @@ int Hama::getParameter(int propertyID){ printError(m_hdcam, m_err, "dcamprop_getvalue()", "IDPROP:0x%08x, VALUE:%s\n", propertyID, text); } + + printf("---------------------------------------STATUS: %d\n", status); + status = setIntegerParam(propertyID, dvalue); /* Do callbacks so higher layers see any changes */ status = (asynStatus) callParamCallbacks(); return int(status); @@ -727,7 +749,6 @@ void Hama::temperatureTask(){ callParamCallbacks(); epicsThreadSleep(1.0); - } } @@ -1416,14 +1437,16 @@ int Hama::updateSensorSize(){ dminV = minV; dsizeH = sizeH; dsizeV = sizeV; - double mode = DCAMPROP_MODE__ON; + double modeON = DCAMPROP_MODE__ON; + double modeOFF = DCAMPROP_MODE__OFF; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &mode); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); /* From 2c4bc518e0ba20a10637ac3527df5d9ac73d1e8d Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 11 Nov 2022 08:49:56 +0100 Subject: [PATCH 19/66] Fix imagewidth and imageheight asyn index --- ADHama.Makefile | 5 +- ADHamaApp/Db/hama.template | 8 +- ADHamaApp/src/hama.cpp | 200 ++++++++----------------------------- ADHamaApp/src/hama.h | 4 +- 4 files changed, 50 insertions(+), 167 deletions(-) diff --git a/ADHama.Makefile b/ADHama.Makefile index 3600418..1cee485 100644 --- a/ADHama.Makefile +++ b/ADHama.Makefile @@ -79,6 +79,7 @@ TEMPLATES += $(wildcard $(APPDB)/*.template) # USR_INCLUDES += -DLINUX -I/home/iocuser/dcamsdk4/inc/ USR_INCLUDES += -DLINUX -I ../support/dcamsdk4/inc/ +# USR_INCLUDES += -I ../support/dcamsdk4/misc/ ############################################################################ # @@ -87,8 +88,8 @@ USR_INCLUDES += -DLINUX -I ../support/dcamsdk4/inc/ ############################################################################ # SOURCES += $(APPSRC)/ADHamaMain.cpp -SOURCES += $(APPSRC)/hama.cpp - +SOURCES += $(APPSRC)/hama.cpp +# SOURCES += support/dcamsdk4/misc/common.cpp ############################################################################ # diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index e4deaf2..ddd7195 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -1445,16 +1445,16 @@ record(ai, "$(P)$(R)NumberOfView-R") { field(SCAN, "I/O Intr") } -record(ai, "$(P)$(R)ImageWidth-R") { +record(ai, "$(P)$(R)ImageDetectorWidth-R") { field(DESC,"") - field(DTYP, "asynFloat64") + field(DTYP, "asynInt32") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_IMAGE_DETECTOR_PIXEL_WIDTH") field(SCAN, "I/O Intr") } -record(ai, "$(P)$(R)ImageHeight-R") { +record(ai, "$(P)$(R)ImageDetectorHeight-R") { field(DESC,"") - field(DTYP, "asynFloat64") + field(DTYP, "asynInt32") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_IMAGE_DETECTOR_PIXEL_HEIGHT") field(SCAN, "I/O Intr") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 58e9230..b4b9ae9 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -188,8 +188,17 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, callParamCallbacks(); connectCamera(); + printf("\n\n============================ Init Camera =========================\n"); initCamera(); + + + // printf("\n\n============================ Info Camera =========================\n"); + //dcamcon_show_dcamdev_info( m_hdcam ); + //printf("\n\n============================ Info Camera Details =================\n"); + //dcamcon_show_dcamdev_info_detail( m_hdcam ) + + printf("\n\n============================ Start Threads =======================\n"); /* launch image read task */ epicsThreadCreate("HamaImageTask", epicsThreadPriorityMedium, @@ -231,11 +240,12 @@ int Hama::initCamera(){ err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); err |= getParameter(DETECTOR_PIXEL_NUM_VERT); - err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); + +// err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); - err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); +// err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); - err |= getParameter( DCAM_IDPROP_BINNING); +/* err |= getParameter( DCAM_IDPROP_BINNING); err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); @@ -257,7 +267,7 @@ int Hama::initCamera(){ 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", // driverName, functionName, this->portName, value, (int)status); @@ -329,12 +339,11 @@ int Hama::getParameterStr(int propertyID){ return int(status); } //============================================================================ -int Hama::getParameter(int propertyID){ +asynStatus Hama::getParameter(int propertyID){ asynStatus status = asynSuccess; double dvalue = 0; - // status |= getIntegerParam(ADMinX, &minH); // m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); @@ -346,7 +355,8 @@ int Hama::getParameter(int propertyID){ printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } status = setIntegerParam(ADMaxSizeX, dvalue); - printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); + printf("+++status = %d, %f\n", status, dvalue); + //printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DETECTOR_PIXEL_NUM_VERT: @@ -355,7 +365,8 @@ int Hama::getParameter(int propertyID){ printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } status = setIntegerParam(ADMaxSizeY, dvalue); - printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); + printf("+++status = %d, %f\n", status, dvalue); + //printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DCAM_IDPROP_IMAGE_PIXELTYPE: @@ -369,7 +380,8 @@ int Hama::getParameter(int propertyID){ printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } status = setIntegerParam(hImageWidth, dvalue); - printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); + printf("+++status = %d, %f\n", status, dvalue); + //printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DCAM_IDPROP_IMAGE_HEIGHT: @@ -377,10 +389,11 @@ int Hama::getParameter(int propertyID){ if(failed(m_err)) { printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } - status = setIntegerParam(hImageHeight, dvalue); - printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); + status = setIntegerParam(hImageHeight, (int)dvalue); + printf("+++status = %d, %f\n", status, dvalue); + //printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; - +/* case DCAM_IDPROP_IMAGE_ROWBYTES: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); status = setIntegerParam(hImageRowbytes, dvalue); @@ -480,7 +493,7 @@ int Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); status = setIntegerParam(hTimeStampProducer, dvalue); break; - +*/ default: char text[256]; dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); @@ -491,15 +504,13 @@ int Hama::getParameter(int propertyID){ if(failed(m_err)) { char text[256]; dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); - printError(m_hdcam, m_err, "dcamprop_getvalue()", "IDPROP:0x%08x, VALUE:%s\n", propertyID, text); + printError(m_hdcam, m_err, "+dcamprop_getvalue()", "IDPROP:0x%08x, VALUE:%s\n", propertyID, text); } - - printf("---------------------------------------STATUS: %d\n", status); - status = setIntegerParam(propertyID, dvalue); /* Do callbacks so higher layers see any changes */ - status = (asynStatus) callParamCallbacks(); -return int(status); + status = callParamCallbacks(); + +return status; } //============================================================================ @@ -1415,22 +1426,20 @@ return(asynSuccess); } //============================================================================ -int Hama::updateSensorSize(){ +asynStatus Hama::updateSensorSize(){ + + + asynStatus status = asynSuccess; int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; - int status = 0; - //double v1,v2,v3,v4,b1; - //double a1,a2,a3,a4; + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeX, &sizeH); + getIntegerParam(ADSizeY, &sizeV); + getIntegerParam(hBinning, &binning); - status |= getIntegerParam(ADMinX, &minH); - status |= getIntegerParam(ADMinY, &minV); - status |= getIntegerParam(ADSizeX, &sizeH); - status |= getIntegerParam(ADSizeY, &sizeV); - status |= getIntegerParam(hBinning, &binning); - - printf("minH = %d\nminV = %d\nSizeV = %d\nSizeH = %d\n", minH, minV, sizeV, sizeH); dbinning = binning; dminH = minH; @@ -1449,66 +1458,9 @@ int Hama::updateSensorSize(){ m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); -/* - double value = 0; - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING_INDEPENDENT, &value); - printf("DCAM_IDPROP_BINNING_INDEPENDENT: %d\n", (int)value); - - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &value); - printf("DCAM_IDPROP_SUBARRAYMODE: %d\n", (int)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); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &v1); - if( failed(m_err) ) - printError( m_hdcam, m_err, "dcambuf_release()" ); - - - m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, minV); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &v2); - if( failed(m_err) ) - printError( m_hdcam, m_err, "dcambuf_release()" ); - - m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, sizeH); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &v3); - if( failed(m_err) ) - printError( m_hdcam, m_err, "dcambuf_release()" ); + callParamCallbacks(); - m_err = dcamprop_setvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, sizeV); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &v4); - 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()" ); - -*/ - - status = (asynStatus) callParamCallbacks(); - //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); - - printf("status = %d\n", status); - - - printf("\n"); - printf("updateSensorSize, hPos = %d\n", int(minH) ); - printf("updateSensorSize, hSize = %d\n", int(sizeH) ); - printf("updateSensorSize, vPos = %d\n", int(minV) ); - printf("updateSensorSize, vSize = %d\n", int(sizeV) ); - printf("updateSensorSize, binning = %d\n", int(binning) ); - printf("updateSensorSize, frameBytes = %d\n", int(sizeH*sizeV) ); -return 0; +return status; } //============================================================================ @@ -1528,77 +1480,7 @@ asynStatus Hama::readEnum(asynUser *pasynUser, char *strings[], int values[], double value = 0; - dcamprop_getvalue(m_hdcam, function, &value); -// dcamprop_setvalue(m_hdcam, function, value); - - if (function == hSensorMode) { - printf("function Sensor Mode\n"); - } - else if (function == hReadoutDirection) { - printf("function Readout Direction\n"); - } - else if (function == hTriggerSource) { - printf("function Trigger Source\n"); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value); - setIntegerParam(function, value); - - } - else if (function == hTriggerMode) { - printf("function Trigger Mode\n"); - } - else if (function == hTriggerActive) { - printf("function Trigger Active\n"); - } - else if (function == hTriggerGlobalExposure) { - printf("function Trigger Global Exposure\n"); - } - else if (function == hTriggerPolarity) { - printf("function Trigger Polarity\n"); - } - else if (function == hTriggerConnector) { - printf("function TriggerConnector\n"); - } - else if (function == hInternalTriggerHandling) { - printf("function Internal Trigger Handling\n"); - } - else if (function == hSensorCooler) { - printf("function Sensor Cooler\n"); - } - else if (function == hSensorCoolerStatus){ - printf("function Sensor Cooler Status\n"); - } - /////////////////////////////////////////////////////////////////// - else if (function == hColorType) { - printf("function Color Type\n"); - } - else if (function == hImagePixelType) { - printf("function Image Pixel Type\n"); - } - else if (function == hBufferPixelType) { - printf("function Buffer Pixel Type\n"); - } - else if (function == hSystemAlive) { - printf("function System Alive\n"); - } - else if (function == hTimeStampProducer) { - printf("function Time Stamp Producer\n"); - } - else if (function == hFrameStampProducer) { - printf("function Frame Stamp producer\n"); - } -// else if (function == ) { -// printf("function \n"); -// } -// else if (function == ) { -// printf("function \n"); -// } -// else if (function == ) { -// printf("function \n"); -// } - else { - printf("function ELSE....\n"); - } *nIn = 0; status = (asynStatus) callParamCallbacks(); diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index a5b09a5..b0cd0cc 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -283,7 +283,8 @@ private: int connectCamera(); int disconnectCamera(); int initCamera(); - int updateSensorSize(); + asynStatus updateSensorSize(); + asynStatus getParameter(int paramIndex); // helper functions for dcamapi @@ -291,7 +292,6 @@ private: void printInfo(HDCAM hdcam); int dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, int32 textbytes ); int setParameter(int paramIndex); - int getParameter(int paramIndex); int getParameterStr(int paramIndex); int getProperties(); int setFeature(int featureIndex, double value); From edd41054e492ecb4561f9858d6102b672effa2d3 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Mon, 14 Nov 2022 18:07:01 +0100 Subject: [PATCH 20/66] Fix BINX, BINY, PixelWidth, PixelHeight and all pixel related PVs --- ADHamaApp/Db/hama.template | 74 +++++------ ADHamaApp/src/hama.cpp | 254 +++++++++++++++++++++---------------- ADHamaApp/src/hama.h | 11 +- cmds/st.cmd | 14 +- 4 files changed, 199 insertions(+), 154 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index ddd7195..469bdd5 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -123,56 +123,56 @@ record(ai, "$(P)$(R)TimeStamp-RB") { ########################################################################## record(stringin, "$(P)$(R)Vendor-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_VENDOR") } record(stringin, "$(P)$(R)Model-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MODEL") } record(stringin, "$(P)$(R)CameraID-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CAMERAID") } record(stringin, "$(P)$(R)Bus-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BUS") } record(stringin, "$(P)$(R)CameraVersion-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CAMERA_VERSION") } record(stringin, "$(P)$(R)DriverVersion-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DRIVER_VERSION") } record(stringin, "$(P)$(R)ModuleVersion-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MODULE_VERSION") } record(stringin, "$(P)$(R)DcamApiVersion-RB"){ field(DESC, "") - field(PINI, "YES") +# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DCAM_API_VERSION") } @@ -182,35 +182,27 @@ record(stringin, "$(P)$(R)DcamApiVersion-RB"){ # Sensor Mode and Speed # ########################################################################## # Sensor Mode (mode 4) -record(mbbo, "$(P)$(R)SensorMode-S") { +# record(mbbo, "$(P)$(R)SensorMode-S") { +record(longout, "$(P)$(R)SensorMode-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") - field(ZRVL, "1") - field(ZRST, "Area") - field(ONVL, "2") - field(ONST, "Progressive") - field(TWVL, "3") - field(TWST, "Splitview") - field(THVL, "4") - field(THST, "Duallightsheet") -# field(DRVL, "1") -# field(DRVH, "4") + #field(ZRVL, "1") field(ZRST, "Area") + #field(ONVL, "12") field(ONST, "Progressive") + #field(TWVL, "14") field(TWST, "Splitview") + #field(THVL, "16") field(THST, "Duallightsheet") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") field(VAL, "1") } -record(mbbi, "$(P)$(R)SensorMode-RB") { +#record(mbbi, "$(P)$(R)SensorMode-RB") { +record(longin, "$(P)$(R)SensorMode-RB") { field(DESC,"") field(DTYP, "asynInt32") - field(ZRVL, "1") - field(ZRST, "Area") - field(ONVL, "2") - field(ONST, "Progressive") - field(TWVL, "3") - field(TWST, "Splitview") - field(THVL, "4") - field(THST, "Duallightsheet") + #field(ZRVL, "1") field(ZRST, "Area") + #field(ONVL, "12") field(ONST, "Progressive") + #field(TWVL, "14") field(TWST, "Splitview") + #field(THVL, "16") field(THST, "Duallightsheet") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") field(SCAN, "I/O Intr") } @@ -1299,19 +1291,21 @@ record(ai, "$(P)$(R)BitsPerChannel-R") { field(SCAN, "I/O Intr") } -record(ai, "$(P)$(R)ImageWidth-R") { - field(DESC,"") - field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_IMAGE_WIDTH") - field(SCAN, "I/O Intr") -} +# implemented in ADBase as BINX_RBV +#record(ai, "$(P)$(R)ImageWidth-R") { +# field(DESC,"") +# field(DTYP, "asynInt32") +# field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_IMAGE_WIDTH") +# field(SCAN, "I/O Intr") +#} -record(ai, "$(P)$(R)ImageHeight-R") { - field(DESC,"") - field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_IMAGE_HEIGHT") - field(SCAN, "I/O Intr") -} +# implemented in ADBase as BINY_RBV +#record(ai, "$(P)$(R)ImageHeight-R") { +# field(DESC,"") +# field(DTYP, "asynInt32") +# field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_IMAGE_HEIGHT") +# field(SCAN, "I/O Intr") +#} record(ai, "$(P)$(R)RowBytes-R") { field(DESC,"") diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index b4b9ae9..b14e0aa 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -158,8 +158,8 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, //System Information createParam( hColorTypeString, asynParamInt32, &hColorType); createParam( hBitPerChannelString, asynParamInt32, &hBitPerChannel); - createParam( hImageWidthString, asynParamInt32, &hImageWidth); - createParam( hImageHeightString, asynParamInt32, &hImageHeight); + //createParam( hImageWidthString, asynParamInt32, &hImageWidth); + //createParam( hImageHeightString, asynParamInt32, &hImageHeight); createParam( hImageRowBytesString, asynParamInt32, &hImageRowbytes); createParam( hImageFrameBytesString, asynParamInt32, &hImageFramebytes); createParam( hImageTopOffsetBytesString, asynParamInt32, &hImageTopOffsetBytes); @@ -237,15 +237,16 @@ int Hama::initCamera(){ err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); + err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); err |= getParameter(DETECTOR_PIXEL_NUM_VERT); -// err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); + err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); -// err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); + err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); -/* err |= getParameter( DCAM_IDPROP_BINNING); + err |= getParameter( DCAM_IDPROP_BINNING); err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); @@ -267,7 +268,10 @@ int Hama::initCamera(){ err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); err |= getParameter(DCAM_IDPROP_TIMESTAMP_PRODUCER); -*/ + + + + callParamCallbacks(); if(err){ // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", // driverName, functionName, this->portName, value, (int)status); @@ -333,9 +337,9 @@ int Hama::getParameterStr(int propertyID){ printf("[DEBUG]::NOT SUPPORTED\n"); break; - } - // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", - // driverName, functionName, this->portName, value, (int)status); + } + + return int(status); } //============================================================================ @@ -355,8 +359,6 @@ asynStatus Hama::getParameter(int propertyID){ printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } status = setIntegerParam(ADMaxSizeX, dvalue); - printf("+++status = %d, %f\n", status, dvalue); - //printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DETECTOR_PIXEL_NUM_VERT: @@ -365,8 +367,6 @@ asynStatus Hama::getParameter(int propertyID){ printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } status = setIntegerParam(ADMaxSizeY, dvalue); - printf("+++status = %d, %f\n", status, dvalue); - //printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); break; case DCAM_IDPROP_IMAGE_PIXELTYPE: @@ -379,9 +379,7 @@ asynStatus Hama::getParameter(int propertyID){ if(failed(m_err)) { printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } - status = setIntegerParam(hImageWidth, dvalue); - printf("+++status = %d, %f\n", status, dvalue); - //printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); + status = setIntegerParam(ADBinX, dvalue); break; case DCAM_IDPROP_IMAGE_HEIGHT: @@ -389,11 +387,9 @@ asynStatus Hama::getParameter(int propertyID){ if(failed(m_err)) { printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } - status = setIntegerParam(hImageHeight, (int)dvalue); - printf("+++status = %d, %f\n", status, dvalue); - //printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, dVALUE:%f, status:%d\n", propertyID, dvalue, status); + status = setIntegerParam(ADBinY, (int)dvalue); break; -/* + case DCAM_IDPROP_IMAGE_ROWBYTES: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); status = setIntegerParam(hImageRowbytes, dvalue); @@ -431,16 +427,19 @@ asynStatus Hama::getParameter(int propertyID){ case DCAM_IDPROP_SENSORMODE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); + printError(m_hdcam, m_err, "SENSOR MODE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); status = setIntegerParam(hSensorMode, dvalue); break; case DCAM_IDPROP_READOUTSPEED: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); + printError(m_hdcam, m_err, "READOUT SPEED", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); status = setIntegerParam(hReadoutSpeed, dvalue); break; case DCAM_IDPROP_READOUT_DIRECTION: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); + printError(m_hdcam, m_err, "R DIRECTION", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); status = setIntegerParam(hReadoutDirection, dvalue); break; @@ -493,7 +492,7 @@ asynStatus Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); status = setIntegerParam(hTimeStampProducer, dvalue); break; -*/ + default: char text[256]; dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); @@ -533,83 +532,6 @@ int Hama::setParameter(int paramIndex){ return 0; } -//============================================================================ -int Hama::setFeature(int featureIndex, double value) { - DCAMERR err; - err = dcamprop_setvalue(m_hdcam, featureIndex, value); - if(failed(err)) { - printError(m_hdcam, err, "dcamprop_setvalue()", "IDPROP:0x%08x, VALUE:%f\n", featureIndex, value); - return asynError; - } - return asynSuccess; -} - -//============================================================================ -int Hama::getProperties(){ - printf("\n[DEBUG] Function:getProperties\n"); - - int32 iProp = 0; // property IDs - - double value = 50; - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORTEMPERATURE, &value); - printf("The SENSOR TEMPERATURE = %f\n", value); - - DCAMERR err; - err = dcamprop_getnextid( m_hdcam, &iProp, DCAMPROP_OPTION_SUPPORT ); - if( failed(err) ) { - printError( m_hdcam, err, "dcamprop_getnextid()", "IDPROP:0x%08x, OPTION:SUPPORT", 0 ); - return err; - } - - do{ - // get property name - char text[ 64 ]; - err = dcamprop_getname( m_hdcam, iProp, text, sizeof(text) ); - if( failed(err) ) { - printError( m_hdcam, err, "dcamprop_getname()", "IDPROP:0x%08x", iProp ); - return err; - } - - printf( "0x%08x: %s\n", iProp, text ); - - // get property attribute - DCAMPROP_ATTR basepropattr; - memset( &basepropattr, 0, sizeof(basepropattr) ); - basepropattr.cbSize = sizeof(basepropattr); - basepropattr.iProp = iProp; - - err = dcamprop_getattr( m_hdcam, &basepropattr ); - if( !failed(err) ) { - - #if SHOW_PROPERTY_ATTRIBUTE - // show property attribute - //dcamcon_show_propertyattr( basepropattr ); - #endif - - #if SHOW_PROPERTY_MODEVALUELIST - // show mode value list of property - //if( (basepropattr.attribute & DCAMPROP_TYPE_MASK) == DCAMPROP_TYPE_MODE ) - // dcamcon_show_supportmodevalues( m_hdcam, iProp, basepropattr.valuemin ); - #endif - - #if SHOW_PROPERTY_ARRAYELEMENT - // show array element - //if( basepropattr.attribute2 & DCAMPROP_ATTR2_ARRAYBASE ) - // dcamcon_show_arrayelement( m_hdcam, basepropattr ); - #endif - } - - // get next property id - err = dcamprop_getnextid( m_hdcam, &iProp, DCAMPROP_OPTION_SUPPORT ); - if( failed(err) ) { - // no more supported property id - return err; - } - - } while( iProp != 0 ); - -return 0; -} //============================================================================ void Hama::imageTask(){ int status; @@ -764,6 +686,32 @@ void Hama::temperatureTask(){ } //============================================================================ +/* +asynStatus Hama::getBounds(asynUser *pasynUser, epicsInt32 *low, epicsInt32 *high){ + + asynStatus status = asynSuccess; + const char* functionName = "getBounds"; + const char* paramName; + + int index = pasynUser->reason; + + getParamName(index, ¶mName); + + if(index == hSensorMode){ + *low = 0; + *high = 10; + } + else{ + ADDriver::getBounds(pasynUser, low, high); + + } + + + +return status; +} +*/ +//============================================================================ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ @@ -822,19 +770,15 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } else if (index == ADMinX) { updateSensorSize(); - printf("[DEBUG]::function ADMinX\n"); } else if (index == ADMinY) { updateSensorSize(); - printf("[DEBUG]::function ADMinY\n"); } else if (index == ADSizeX) { updateSensorSize(); - printf("[DEBUG]::function ADSizeX\n"); } else if (index == ADSizeY) { updateSensorSize(); - printf("[DEBUG]::function ADSizeY\n"); } else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); @@ -1021,16 +965,16 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hImageWidth) { + else if (index == ADBinX) { printf("[DEBUG]::function ImageWidth %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hImageHeight) { + else if (index == ADBinY) { printf("[DEBUG]::function ImageHeight %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } @@ -1225,7 +1169,17 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } } else{ - printf("[DEBUG]::function writeInt32 did not find a parameter\n"); + if(index < FIRST_HAMA_PARAM){ + printf("[DEBUG]::function writeInt32 did not find a parameter, call ADDriver::writeInit32 %s\n", paramName); + printf("[DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", + FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); + ADDriver::writeInt32(pasynUser, value); + } + else{ + printf("[DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); + printf("[DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", + FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); + } } setIntegerParam(index, value); @@ -1433,6 +1387,7 @@ asynStatus Hama::updateSensorSize(){ int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; + double dvalue = 0; getIntegerParam(ADMinX, &minH); getIntegerParam(ADMinY, &minV); @@ -1455,6 +1410,11 @@ asynStatus Hama::updateSensorSize(){ m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + status = setIntegerParam(ADBinX, dvalue); + status = setIntegerParam(ADBinY, dvalue); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); @@ -1856,6 +1816,86 @@ int Hama::dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, in return ! failed( err ); } +//============================================================================ +int Hama::setFeature(int featureIndex, double value) { + DCAMERR err; + err = dcamprop_setvalue(m_hdcam, featureIndex, value); + if(failed(err)) { + printError(m_hdcam, err, "dcamprop_setvalue()", "IDPROP:0x%08x, VALUE:%f\n", featureIndex, value); + return asynError; + } + return asynSuccess; +} + +//============================================================================ +int Hama::getProperties(){ + printf("\n[DEBUG] Function:getProperties\n"); + + int32 iProp = 0; // property IDs + + double value = 50; + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORTEMPERATURE, &value); + printf("The SENSOR TEMPERATURE = %f\n", value); + + DCAMERR err; + err = dcamprop_getnextid( m_hdcam, &iProp, DCAMPROP_OPTION_SUPPORT ); + if( failed(err) ) { + printError( m_hdcam, err, "dcamprop_getnextid()", "IDPROP:0x%08x, OPTION:SUPPORT", 0 ); + return err; + } + + do{ + // get property name + char text[ 64 ]; + err = dcamprop_getname( m_hdcam, iProp, text, sizeof(text) ); + if( failed(err) ) { + printError( m_hdcam, err, "dcamprop_getname()", "IDPROP:0x%08x", iProp ); + return err; + } + + printf( "0x%08x: %s\n", iProp, text ); + + // get property attribute + DCAMPROP_ATTR basepropattr; + memset( &basepropattr, 0, sizeof(basepropattr) ); + basepropattr.cbSize = sizeof(basepropattr); + basepropattr.iProp = iProp; + + err = dcamprop_getattr( m_hdcam, &basepropattr ); + if( !failed(err) ) { + + #if SHOW_PROPERTY_ATTRIBUTE + // show property attribute + //dcamcon_show_propertyattr( basepropattr ); + #endif + + #if SHOW_PROPERTY_MODEVALUELIST + // show mode value list of property + //if( (basepropattr.attribute & DCAMPROP_TYPE_MASK) == DCAMPROP_TYPE_MODE ) + // dcamcon_show_supportmodevalues( m_hdcam, iProp, basepropattr.valuemin ); + #endif + + #if SHOW_PROPERTY_ARRAYELEMENT + // show array element + //if( basepropattr.attribute2 & DCAMPROP_ATTR2_ARRAYBASE ) + // dcamcon_show_arrayelement( m_hdcam, basepropattr ); + #endif + } + + // get next property id + err = dcamprop_getnextid( m_hdcam, &iProp, DCAMPROP_OPTION_SUPPORT ); + if( failed(err) ) { + // no more supported property id + return err; + } + + } while( iProp != 0 ); + +return 0; +} + + + //============================================================================ //============================================================================ /* Code for iocsh registration */ diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index b0cd0cc..17dfff2 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -105,8 +105,8 @@ // System information #define hColorTypeString "H_COLOR_TYPE" /* asynInt32 ro */ #define hBitPerChannelString "H_BIT_PER_CHANNEL" /* asynInt32 rw */ -#define hImageWidthString "H_IMAGE_WIDTH" /* asynInt32 ro */ -#define hImageHeightString "H_IMAGE_HEIGHT" /* asynInt32 ro */ +//#define hImageWidthString "H_IMAGE_WIDTH" /* asynInt32 ro */ +//#define hImageHeightString "H_IMAGE_HEIGHT" /* asynInt32 ro */ #define hImageRowBytesString "H_IMAGE_ROWBYTES" /* asynInt32 ro */ #define hImageFrameBytesString "H_IMAGE_FRAMEBYTES" /* asynInt32 ro */ #define hImageTopOffsetBytesString "H_IMAGE_TOP_OFFSETBYTES" /* asynInt32 ro */ @@ -142,6 +142,8 @@ public: /* override ADDriver methods */ virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); + +// virtual asynStatus getBounds(asynUser *, epicsInt32 *low, epicsInt32 *high); //virtual asynStatus readEnum(asynUser *pasynUser, char *strings[], int values[], // int severities[], size_t nElements, size_t *nIn); virtual void report(FILE *fp, int details); @@ -200,8 +202,8 @@ protected: int hInternalFrameInterval; int hInternalLineSpeed; int hInternalLineInterval; - int hImageWidth; - int hImageHeight; + // int hImageWidth; + // int hImageHeight; int hImageRowbytes; int hImageFramebytes; int hImageTopOffsetBytes; @@ -275,7 +277,6 @@ private: asynStatus accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy, int32& ts_sec, int32& ts_microsec); asynStatus imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo); - // wrapper functions for dcamapi int allocateBuffers(unsigned int); int freeBuffers(); diff --git a/cmds/st.cmd b/cmds/st.cmd index f055f2d..ac29702 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -19,8 +19,8 @@ devHamamatsuConfig("$(PORT)", $(CAMERA), 0, 0, 0, 0, 10) 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) +#asynSetTraceMask("$(PORT)",-1,0x9) +#asynSetTraceIOMask("$(PORT)",-1,0x2) # ========================================================================================================= @@ -38,7 +38,14 @@ dbLoadRecords("NDStdArrays.template", "P=$(PREFIX),R=image1:,PORT=Image1,ADDR=0, startPVAServer +# +# +# Start iocInit function=================================================================================== +# iocInit() +# +# End iocInit function ==================================================================================== +# dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 @@ -46,3 +53,6 @@ dbpf Hama:image1:EnableCallbacks 1 epicsThreadSleep(1.0) dbl > pv.list +# +# END of st.cmd +# From 71f12cfdcf179160fdf428ae1c34e682bd73b52d Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 23 Nov 2022 16:49:52 +0100 Subject: [PATCH 21/66] update --- ADHamaApp/src/hama.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index b14e0aa..5139f53 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -237,6 +237,9 @@ int Hama::initCamera(){ err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); + err |= getParameter(DCAM_IDPROP_SENSORMODE); + err |= getParameter(DCAM_IDPROP_READOUTSPEED); + err |= getParameter(DCAM_IDPROP_READOUT_DIRECTION); err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); err |= getParameter(DETECTOR_PIXEL_NUM_VERT); @@ -254,9 +257,6 @@ int Hama::initCamera(){ err |= getParameter( DCAM_IDPROP_SUBARRAYVSIZE); - err |= getParameter(DCAM_IDPROP_SENSORMODE); - err |= getParameter(DCAM_IDPROP_READOUTSPEED); - err |= getParameter(DCAM_IDPROP_READOUT_DIRECTION); err |= getParameter(DCAM_IDPROP_TRIGGERSOURCE); err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); @@ -427,19 +427,25 @@ asynStatus Hama::getParameter(int propertyID){ case DCAM_IDPROP_SENSORMODE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); - printError(m_hdcam, m_err, "SENSOR MODE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "SENSOR MODE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } status = setIntegerParam(hSensorMode, dvalue); break; case DCAM_IDPROP_READOUTSPEED: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); - printError(m_hdcam, m_err, "READOUT SPEED", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "READOUT SPEED", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } status = setIntegerParam(hReadoutSpeed, dvalue); break; case DCAM_IDPROP_READOUT_DIRECTION: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); - printError(m_hdcam, m_err, "R DIRECTION", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "R DIRECTION", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } status = setIntegerParam(hReadoutDirection, dvalue); break; @@ -1762,7 +1768,7 @@ void Hama::printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const cha DCAMERR err; dcamdev_string( err, hdcam, errid, errtext, sizeof(errtext) ); - printf( "-[ERROR]- (DCAMERR) 0x%08X %s @ %s\n", errid, errtext, apiname ); + printf( "-[ERROR]- -(DCAMERR)- -0x%08X- -%s- -%s-\n", errid, errtext, apiname ); if( fmt != NULL ) { printf( " : " ); From 3db0cf6913d7bf331ed8e56a55364e0b4f7b4cba Mon Sep 17 00:00:00 2001 From: Iocuser Date: Tue, 29 Nov 2022 17:37:05 +0100 Subject: [PATCH 22/66] fix some errors, add ADDriver::writeInt32, ADDriver::writeFloat64 --- ADHamaApp/Db/hama.template | 78 ++++++++++++++++++------------- ADHamaApp/src/hama.cpp | 96 ++++++++++++++++++++++++++++++++------ ADHamaApp/src/hama.h | 50 ++++++++++---------- 3 files changed, 152 insertions(+), 72 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 469bdd5..42b71a8 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -123,58 +123,58 @@ record(ai, "$(P)$(R)TimeStamp-RB") { ########################################################################## record(stringin, "$(P)$(R)Vendor-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_VENDOR") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)Model-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MODEL") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)CameraID-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CAMERAID") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)Bus-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BUS") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)CameraVersion-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CAMERA_VERSION") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)DriverVersion-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DRIVER_VERSION") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)ModuleVersion-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MODULE_VERSION") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)DcamApiVersion-RB"){ field(DESC, "") -# field(PINI, "YES") field(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DCAM_API_VERSION") + field(SCAN, "I/O Intr") } @@ -182,27 +182,27 @@ record(stringin, "$(P)$(R)DcamApiVersion-RB"){ # Sensor Mode and Speed # ########################################################################## # Sensor Mode (mode 4) -# record(mbbo, "$(P)$(R)SensorMode-S") { -record(longout, "$(P)$(R)SensorMode-S") { +#record(longout, "$(P)$(R)SensorMode-S") { + record(mbbo, "$(P)$(R)SensorMode-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") - #field(ZRVL, "1") field(ZRST, "Area") - #field(ONVL, "12") field(ONST, "Progressive") - #field(TWVL, "14") field(TWST, "Splitview") - #field(THVL, "16") field(THST, "Duallightsheet") + field(ZRVL, "1") field(ZRST, "Area") + field(ONVL, "12") field(ONST, "Progressive") + field(TWVL, "14") field(TWST, "Splitview") + field(THVL, "16") field(THST, "Duallightsheet") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") field(VAL, "1") } -#record(mbbi, "$(P)$(R)SensorMode-RB") { -record(longin, "$(P)$(R)SensorMode-RB") { +#record(longin, "$(P)$(R)SensorMode-RB") { +record(mbbi, "$(P)$(R)SensorMode-RB") { field(DESC,"") field(DTYP, "asynInt32") - #field(ZRVL, "1") field(ZRST, "Area") - #field(ONVL, "12") field(ONST, "Progressive") - #field(TWVL, "14") field(TWST, "Splitview") - #field(THVL, "16") field(THST, "Duallightsheet") + field(ZRVL, "1") field(ZRST, "Area") + field(ONVL, "12") field(ONST, "Progressive") + field(TWVL, "14") field(TWST, "Splitview") + field(THVL, "16") field(THST, "Duallightsheet") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") field(SCAN, "I/O Intr") } @@ -1284,13 +1284,27 @@ record(mbbi, "$(P)$(R)ColorType-R") { field(SCAN, "I/O Intr") } -record(ai, "$(P)$(R)BitsPerChannel-R") { +record(mbbo, "$(P)$(R)BitsPerChannel-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "12") + field(ZRST, "12 bits") + field(ONVL, "16") + field(ONST, "16 bits") + field(VAL, "16") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") +} +record(mbbi, "$(P)$(R)BitsPerChannel-R") { field(DESC,"") - field(DTYP, "asynInt32") + field(DTYP, "asynInt32") + field(ZRVL, "12") + field(ZRST, "12 bits") + field(ONVL, "16") + field(ONST, "16 bits") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") field(SCAN, "I/O Intr") } - # implemented in ADBase as BINX_RBV #record(ai, "$(P)$(R)ImageWidth-R") { # field(DESC,"") @@ -1376,11 +1390,11 @@ record(ai, "$(P)$(R)BufTopOffsetBytes-R") { record(mbbi, "$(P)$(R)BufPixelType-R") { field(DESC,"") field(DTYP, "asynInt32") - field(ZRVL, "0") + field(ZRVL, "1") field(ZRST, "MONO8") - field(ONVL, "1") + field(ONVL, "2") field(ONST, "MONO16") - field(TWVL, "2") + field(TWVL, "3") field(TWST, "MONO12") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BUFFER_PIXEL_TYPE") field(SCAN, "I/O Intr") @@ -1410,25 +1424,25 @@ record(ai, "$(P)$(R)RecBytesPerFrame-R") { record(mbbi, "$(P)$(R)SystemAlive-R") { field(DESC,"") field(DTYP, "asynInt32") - field(ZRVL, "0") + field(ZRVL, "1") field(ZRST, "OFFLINE") - field(ONVL, "1") + field(ONVL, "2") field(ONST, "ONLINE") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SYSTEM_ALIVE") field(SCAN, "I/O Intr") } -record(ai, "$(P)$(R)ConversionOffset-R") { +record(ai, "$(P)$(R)ConversionFactorOffset-R") { field(DESC,"") field(DTYP, "asynFloat64") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CONVERSION_FACTOR_OFFSET") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CONVERSIONFACTOR_OFFSET") field(SCAN, "I/O Intr") } -record(ai, "$(P)$(R)ConversionCoef-R") { +record(ai, "$(P)$(R)ConversionFactorCoeff-R") { field(DESC,"") field(DTYP, "asynFloat64") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CONVERSION_FACTOR_COEF") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CONVERSIONFACTOR_COEFF") field(SCAN, "I/O Intr") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 5139f53..508e6d2 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -244,7 +244,6 @@ int Hama::initCamera(){ err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); err |= getParameter(DETECTOR_PIXEL_NUM_VERT); - err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); @@ -256,7 +255,6 @@ int Hama::initCamera(){ err |= getParameter( DCAM_IDPROP_SUBARRAYHSIZE); err |= getParameter( DCAM_IDPROP_SUBARRAYVSIZE); - err |= getParameter(DCAM_IDPROP_TRIGGERSOURCE); err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); @@ -267,11 +265,23 @@ int Hama::initCamera(){ err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); - err |= getParameter(DCAM_IDPROP_TIMESTAMP_PRODUCER); + err |= getParameter(DCAM_IDPROP_IMAGE_TOPOFFSETBYTES); + err |= getParameter(DCAM_IDPROP_BUFFER_ROWBYTES); + err |= getParameter(DCAM_IDPROP_BUFFER_FRAMEBYTES); + err |= getParameter(DCAM_IDPROP_BUFFER_TOPOFFSETBYTES); + err |= getParameter(DCAM_IDPROP_BUFFER_PIXELTYPE); + err |= getParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE); + err |= getParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION); + err |= getParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME); + err |= getParameter(DCAM_IDPROP_SYSTEM_ALIVE); + err |= getParameter(DCAM_IDPROP_CONVERSIONFACTOR_COEFF); + err |= getParameter(DCAM_IDPROP_CONVERSIONFACTOR_OFFSET); + err |= getParameter(DCAM_IDPROP_NUMBEROF_VIEW); + err |= getParameter(DCAM_IDPROP_TIMESTAMP_PRODUCER); + err |= getParameter(DCAM_IDPROP_FRAMESTAMP_PRODUCER); - callParamCallbacks(); if(err){ // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", // driverName, functionName, this->portName, value, (int)status); @@ -339,6 +349,7 @@ int Hama::getParameterStr(int propertyID){ } + callParamCallbacks(); return int(status); } @@ -494,10 +505,67 @@ asynStatus Hama::getParameter(int propertyID){ status = setIntegerParam(hInternalTriggerHandling, dvalue); break; - case DCAM_IDPROP_TIMESTAMP_PRODUCER: + case DCAM_IDPROP_COLORTYPE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &dvalue); + status = setIntegerParam(hColorType, dvalue); + break; + + case DCAM_IDPROP_IMAGE_TOPOFFSETBYTES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &dvalue); + status = setIntegerParam(hImageTopOffsetBytes, dvalue); + break; + case DCAM_IDPROP_BUFFER_ROWBYTES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); + status = setIntegerParam(hBufferRowbytes, dvalue); + break; + case DCAM_IDPROP_BUFFER_FRAMEBYTES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &dvalue); + status = setIntegerParam(hBufferFramebytes, dvalue); + break; + case DCAM_IDPROP_BUFFER_TOPOFFSETBYTES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &dvalue); + status = setIntegerParam(hBufferTopOffsetBytes, dvalue); + break; + case DCAM_IDPROP_BUFFER_PIXELTYPE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &dvalue); + status = setIntegerParam(hBufferPixelType, dvalue); + break; + case DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &dvalue); + status = setIntegerParam(hRecordFixedBytesPerFile, dvalue); + break; + case DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &dvalue); + status = setIntegerParam(hRecordFixedBytesPerSession, dvalue); + break; + case DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &dvalue); + status = setIntegerParam(hRecordFixedBytesPerFrame, dvalue); + break; + case DCAM_IDPROP_SYSTEM_ALIVE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &dvalue); + status = setIntegerParam(hSystemAlive, dvalue); + break; + case DCAM_IDPROP_CONVERSIONFACTOR_COEFF: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &dvalue); + status = setDoubleParam(hConversionFactorCoeff, dvalue); + break; + case DCAM_IDPROP_CONVERSIONFACTOR_OFFSET: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, &dvalue); + status = setDoubleParam(hConversionFactorOffset, dvalue); + break; + case DCAM_IDPROP_NUMBEROF_VIEW: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &dvalue); + status = setIntegerParam(hNumberOfView, dvalue); + break; + case DCAM_IDPROP_TIMESTAMP_PRODUCER: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); - status = setIntegerParam(hTimeStampProducer, dvalue); - break; + status = setIntegerParam(hTimeStampProducer, dvalue); + break; + case DCAM_IDPROP_FRAMESTAMP_PRODUCER: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &dvalue); + status = setIntegerParam(hFrameStampProducer, dvalue); + break; default: char text[256]; @@ -813,13 +881,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hColorType) { - printf("[DEBUG]::function ColorType %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } + else if (index == hBitPerChannel) { printf("[DEBUG]::function BitPerChannel %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); @@ -891,8 +953,8 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } } else if (index == hDefectCorrectMode) { - printf("[DEBUG]::function DefectCorrerMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); + printf("[DEBUG]::function DefectCorrerMode %f\n", dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } @@ -1176,6 +1238,8 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } else{ if(index < FIRST_HAMA_PARAM){ + status = ADDriver::writeInt32(pasynUser, value); + printf("Call function ADDriver::writeInt32\n"); printf("[DEBUG]::function writeInt32 did not find a parameter, call ADDriver::writeInit32 %s\n", paramName); printf("[DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); @@ -1365,6 +1429,8 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } } else{ + status = ADDriver::writeFloat64(pasynUser, value); + printf("Call function ADDriver::writeFloat64\n"); printf("[DEBUG]::function writeFloat64 did not find a parameter\n"); } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 17dfff2..f2bb217 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -103,31 +103,31 @@ #define hInternalLineIntervalString "H_INTERNAL_LINE_INTERVAL" /* asynFloat64 rw */ // System information -#define hColorTypeString "H_COLOR_TYPE" /* asynInt32 ro */ -#define hBitPerChannelString "H_BIT_PER_CHANNEL" /* asynInt32 rw */ -//#define hImageWidthString "H_IMAGE_WIDTH" /* asynInt32 ro */ -//#define hImageHeightString "H_IMAGE_HEIGHT" /* asynInt32 ro */ -#define hImageRowBytesString "H_IMAGE_ROWBYTES" /* asynInt32 ro */ -#define hImageFrameBytesString "H_IMAGE_FRAMEBYTES" /* asynInt32 ro */ -#define hImageTopOffsetBytesString "H_IMAGE_TOP_OFFSETBYTES" /* asynInt32 ro */ -#define hImagePixelTypeString "H_IMAGE_PIXEL_TYPE" /* asynInt32 rw */ -#define hBufferRowbytesString "H_BUFFER_ROWBYTES" /* asynInt32 ro */ -#define hBufferFramebytesString "H_BUFFER_FRAMEBYTES" /* asynInt32 ro */ -#define hBufferTopOffsetBytesString "H_BUFFER_TOP_OFFSETBYTES" /* asynInt32 ro */ -#define hBufferPixelTypeString "H_BUFFER_PIXEL_TYPE" /* asynInt32 ro */ -#define hRecordFixedBytesPerFileString "H_RECORD_FIXED_BYTES_PER_FILE" /* asynInt32 ro */ -#define hRecordFixedBytesPerSessionString "H_RECORD_FIXED_BYTES_PER_SESION" /* asynInt32 ro */ -#define hRecordFixedBytesPerFrameString "H_RECORD_FIXED_BYTES_PER_FRAME" /* asynInt32 ro */ -#define hSystemAliveString "H_SYSTEM_ALIVE" /* asynInt32 ro */ -#define hConversionFactorCoeffString "H_CONVERSION_FACTOR_COEF" /* asynFloat64 ro */ -#define hConversionFactorOffsetString "H_CONVERSION_FACTOR_OFFSET"/* asynFloat64 ro */ -#define hNumberOfViewString "H_NUMBER_OF_VIEW" /* asynInt32 ro */ -#define hImageDetectorPixelWidthString "H_IMAGE_DETECTOR_PIXEL_WIDTH" /* asynFloat64 ro */ -#define hImageDetectorPixelHeightString "H_IMAGE_DETECTOR_PIXEL_HEIGHT" /* asynFloat64 ro */ -#define hImageDetectorPixelNumHorzString "H_IMAGE_DETECTOR_PIXEL_NUM_HORZ" /* asynInt32 ro */ -#define hImageDetectorPixelNumVertString "H_IMAGE_DETECTOR_PIXEL_NUM_VERT" /* asynInt32 ro */ -#define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ -#define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ +#define hColorTypeString "H_COLOR_TYPE" /* asynInt32 ro */ +#define hBitPerChannelString "H_BIT_PER_CHANNEL" /* asynInt32 rw */ +//#define hImageWidthString "H_IMAGE_WIDTH" /* asynInt32 ro */ +//#define hImageHeightString "H_IMAGE_HEIGHT" /* asynInt32 ro */ +#define hImageRowBytesString "H_IMAGE_ROWBYTES" /* asynInt32 ro */ +#define hImageFrameBytesString "H_IMAGE_FRAMEBYTES" /* asynInt32 ro */ +#define hImageTopOffsetBytesString "H_IMAGE_TOP_OFFSETBYTES" /* asynInt32 ro */ +#define hImagePixelTypeString "H_IMAGE_PIXEL_TYPE" /* asynInt32 rw */ +#define hBufferRowbytesString "H_BUFFER_ROWBYTES" /* asynInt32 ro */ +#define hBufferFramebytesString "H_BUFFER_FRAMEBYTES" /* asynInt32 ro */ +#define hBufferTopOffsetBytesString "H_BUFFER_TOP_OFFSETBYTES" /* asynInt32 ro */ +#define hBufferPixelTypeString "H_BUFFER_PIXEL_TYPE" /* asynInt32 ro */ +#define hRecordFixedBytesPerFileString "H_RECORD_FIXED_BYTES_PER_FILE" /* asynInt32 ro */ +#define hRecordFixedBytesPerSessionString "H_RECORD_FIXED_BYTES_PER_SESION" /* asynInt32 ro */ +#define hRecordFixedBytesPerFrameString "H_RECORD_FIXED_BYTES_PER_FRAME" /* asynInt32 ro */ +#define hSystemAliveString "H_SYSTEM_ALIVE" /* asynInt32 ro */ +#define hConversionFactorCoeffString "H_CONVERSIONFACTOR_COEFF" /* asynFloat64 ro */ +#define hConversionFactorOffsetString "H_CONVERSIONFACTOR_OFFSET" /* asynFloat64 ro */ +#define hNumberOfViewString "H_NUMBER_OF_VIEW" /* asynInt32 ro */ +#define hImageDetectorPixelWidthString "H_IMAGE_DETECTOR_PIXEL_WIDTH" /* asynFloat64 ro */ +#define hImageDetectorPixelHeightString "H_IMAGE_DETECTOR_PIXEL_HEIGHT" /* asynFloat64 ro */ +#define hImageDetectorPixelNumHorzString "H_IMAGE_DETECTOR_PIXEL_NUM_HORZ" /* asynInt32 ro */ +#define hImageDetectorPixelNumVertString "H_IMAGE_DETECTOR_PIXEL_NUM_VERT" /* asynInt32 ro */ +#define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ +#define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ #define hTimeStampString "H_TIMESTAMP" /* asynFloat64 ro */ // For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h From 312b5a9ff17ebd8a577e4263ef08cf609d8e884c Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 30 Nov 2022 22:07:44 +0100 Subject: [PATCH 23/66] fix bug in parameter library, fix some small bugs --- ADHamaApp/Db/hama.template | 2 + ADHamaApp/src/hama.cpp | 84 ++++++++++++++++++++++++++------------ ADHamaApp/src/hama.h | 9 ++-- 3 files changed, 63 insertions(+), 32 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 42b71a8..1c400aa 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -1292,6 +1292,8 @@ record(mbbo, "$(P)$(R)BitsPerChannel-S") { field(ZRST, "12 bits") field(ONVL, "16") field(ONST, "16 bits") + field(DRVL, "12") + field(DRVH, "16") field(VAL, "16") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 508e6d2..6aecca7 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -19,7 +19,7 @@ #include -#define NUM_HAMA_PARAMS ((int)(&LAST_HAMA_PARAM - &FIRST_HAMA_PARAM + 1)) +//#define NUM_HAMA_PARAMS ((int)(&LAST_HAMA_PARAM - &FIRST_HAMA_PARAM + 1)) static const char *driverName="drvHama"; @@ -37,7 +37,7 @@ static void c_temperaturetask(void *arg) { //============================================================================ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, int priority, int stackSize, int maxFrames) - : ADDriver(portName, 1, NUM_HAMA_PARAMS, maxBuffers, maxMemory, + : ADDriver(portName, 1, 0, maxBuffers, maxMemory, asynEnumMask, asynEnumMask, ASYN_CANBLOCK, /* ASYN_CANBLOCK=1 ASYN_MULTIDEVICE=0 */ 1, /* autoConnect=1 */ @@ -62,7 +62,8 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, //General - createParam( HamaName, asynParamOctet, &hHamaName); + createParam( hFrameRateString, asynParamOctet, &hFrameRate); + createParam( hHamaNameString, asynParamOctet, &hHamaName); createParam( hVendorString, asynParamOctet, &hVendor); createParam( hModelString, asynParamOctet, &hModel); createParam( hCameraIDString, asynParamOctet, &hCameraID); @@ -192,6 +193,9 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, initCamera(); + printf("[DEBUG]:: FIRST_HAMA_PARAM = %d \n", FIRST_HAMA_PARAM); + //printf("[-DEBUG]:: FIRST_HAMA_PARAM = %d / LAST_HAMA_PARAM = %d, %d)\n", + //FIRST_HAMA_PARAM, LAST_HAMA_PARAM, NUM_HAMA_PARAMS); // printf("\n\n============================ Info Camera =========================\n"); //dcamcon_show_dcamdev_info( m_hdcam ); @@ -237,24 +241,12 @@ int Hama::initCamera(){ err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); + // SENSOR MODE AND SPEED ------------------------ err |= getParameter(DCAM_IDPROP_SENSORMODE); err |= getParameter(DCAM_IDPROP_READOUTSPEED); err |= getParameter(DCAM_IDPROP_READOUT_DIRECTION); - err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); - err |= getParameter(DETECTOR_PIXEL_NUM_VERT); - - err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); - err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); - err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); - err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); - err |= getParameter( DCAM_IDPROP_BINNING); - err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); - err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); - err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); - err |= getParameter( DCAM_IDPROP_SUBARRAYHSIZE); - err |= getParameter( DCAM_IDPROP_SUBARRAYVSIZE); - + // TRIGGER -------------------------------------- err |= getParameter(DCAM_IDPROP_TRIGGERSOURCE); err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); @@ -265,6 +257,35 @@ int Hama::initCamera(){ err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); + // BINNING AND ROI ------------------------------ + err |= getParameter( DCAM_IDPROP_BINNING); + err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); + err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); + err |= getParameter( DCAM_IDPROP_SUBARRAYHSIZE); + err |= getParameter( DCAM_IDPROP_SUBARRAYVSIZE); + err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); + err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); + err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); + err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); + err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); + //SUBARRAYMODE + + // FEATURE ----------------------------------------------- + //EXPOSURETIME + + // ALU --------------------------------------------------- + err |= getParameter( DCAM_IDPROP_DEFECTCORRECT_MODE); + //HOTPIXEL + //INTENSITYLUT_MODE + //INTENSITYLUT_PAGE + //EXTRAXTIONMODE + + // OUTPUT TRIGGER ---------------------------------------- + + // MASTER PULSE ------------------------------------------ + // SYNCHRONOUS TIMING ------------------------------------ + // SYSTEM INFORMATION ------------------------------------ + err |= getParameter(DCAM_IDPROP_BITSPERCHANNEL); err |= getParameter(DCAM_IDPROP_IMAGE_TOPOFFSETBYTES); err |= getParameter(DCAM_IDPROP_BUFFER_ROWBYTES); err |= getParameter(DCAM_IDPROP_BUFFER_FRAMEBYTES); @@ -280,6 +301,8 @@ int Hama::initCamera(){ err |= getParameter(DCAM_IDPROP_TIMESTAMP_PRODUCER); err |= getParameter(DCAM_IDPROP_FRAMESTAMP_PRODUCER); + err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); + err |= getParameter(DETECTOR_PIXEL_NUM_VERT); if(err){ @@ -359,10 +382,6 @@ asynStatus Hama::getParameter(int propertyID){ asynStatus status = asynSuccess; double dvalue = 0; - // status |= getIntegerParam(ADMinX, &minH); - // m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - - switch (propertyID){ case DETECTOR_PIXEL_NUM_HORZ: m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); @@ -436,6 +455,12 @@ asynStatus Hama::getParameter(int propertyID){ status = setIntegerParam(ADMinY, dvalue); break; + // ALU -------------------------------------- + case DCAM_IDPROP_DEFECTCORRECT_MODE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); + status = setIntegerParam(hDefectCorrectMode, dvalue); + break; + case DCAM_IDPROP_SENSORMODE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); if(failed(m_err)) { @@ -505,6 +530,11 @@ asynStatus Hama::getParameter(int propertyID){ status = setIntegerParam(hInternalTriggerHandling, dvalue); break; + case DCAM_IDPROP_BITSPERCHANNEL: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); + status = setIntegerParam(hBitPerChannel, dvalue); + break; + case DCAM_IDPROP_COLORTYPE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &dvalue); status = setIntegerParam(hColorType, dvalue); @@ -1240,15 +1270,15 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ if(index < FIRST_HAMA_PARAM){ status = ADDriver::writeInt32(pasynUser, value); printf("Call function ADDriver::writeInt32\n"); - printf("[DEBUG]::function writeInt32 did not find a parameter, call ADDriver::writeInit32 %s\n", paramName); - printf("[DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", - FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); + printf("[+DEBUG]::function writeInt32 did not find a parameter, call ADDriver::writeInit32 %s\n", paramName); + //printf("[DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", + //FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); ADDriver::writeInt32(pasynUser, value); } else{ - printf("[DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); - printf("[DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", - FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); + printf("[-DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); + //printf("[-DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", + //FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); } } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index f2bb217..b1cf0b7 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -7,7 +7,7 @@ #define MAX_FEATURE_NAME_LEN 64 #define hFrameRateString "H_FRAME_RATE" /* asynOctet ro */ -#define HamaName "Name" /* asynOctet ro */ +#define hHamaNameString "H_HAMA_NAME" /* asynOctet ro */ #define hVendorString "H_VENDOR" /* asynOctet ro */ #define hModelString "H_MODEL" /* asynOctet ro */ #define hCameraIDString "H_CAMERAID" /* asynOctet ro */ @@ -134,7 +134,7 @@ #define DETECTOR_PIXEL_NUM_HORZ 0x00420830 #define DETECTOR_PIXEL_NUM_VERT 0x00420840 -class Hama : public ADDriver { +class epicsShareClass Hama : public ADDriver { public: Hama(const char*, int, int, size_t, int, int, int); @@ -166,7 +166,7 @@ protected: int hReadoutSpeed; int hReadoutDirection; int hColorType; - int hBitPerChannel; + int hBitPerChannel; //----------------- int hTriggerSource; int hTriggerMode; int hTriggerActive; @@ -253,11 +253,10 @@ protected: int hTimeStampProducer; int hFrameStampProducer; int hTimeStamp; - #define LAST_HAMA_PARAM hTimeStamp + //#define LAST_HAMA_PARAM hTimeStamp private: - HDCAM m_hdcam; DCAMAPI_INIT m_apiInit; From 5ac4f0223a844de1ebad3eed134b7eb6a9cc3704 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Thu, 1 Dec 2022 22:02:14 +0100 Subject: [PATCH 24/66] some bug fixes --- ADHamaApp/Db/hama.template | 31 ++--- ADHamaApp/src/hama.cpp | 241 ++++++++++++++++++------------------- ADHamaApp/src/hama.h | 75 +++++++----- 3 files changed, 180 insertions(+), 167 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 1c400aa..609f66b 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -121,6 +121,13 @@ record(ai, "$(P)$(R)TimeStamp-RB") { ########################################################################## # General properties # ########################################################################## +record(stringout, "$(P)$(R)EPICSName-RB"){ + field(DESC, "") + field(DTYP, "asynOctetWrite") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_VENDOR") + field(VAL, "$(P)$(R)") +} + record(stringin, "$(P)$(R)Vendor-RB"){ field(DESC, "") field(DTYP, "asynOctetRead") @@ -701,8 +708,6 @@ record(mbbo, "$(P)$(R)DefectCorrectMode-S") { field(ZRST, "OFF") field(ONVL, "2") field(ONST, "ON") -# field(DRVL, "1") -# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DEFECTCORRECT_MODE") field(VAL, "2") } @@ -759,8 +764,6 @@ record(mbbo, "$(P)$(R)IntensityLutMode-S") { field(ZRST, "Through") field(ONVL, "2") field(ONST, "Page") -# field(DRVL, "1") -# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTENSITY_LUT_MODE") field(VAL, "1") } @@ -778,15 +781,15 @@ record(mbbi, "$(P)$(R)IntensityLutMode-RB") { ########################################################################## # Intensity Lut Page -record(ao, "$(P)$(R)IntensityLutPage-S") { - field(DESC, "") - field(PINI, "YES") - field(DTYP, "asynInt32") - field(DRVL, "1") - field(DRVH, "1") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTENSITY_LUT_PAGE") - field(VAL, "1") -} +#record(ao, "$(P)$(R)IntensityLutPage-S") { +# field(DESC, "") +# field(PINI, "YES") +# field(DTYP, "asynInt32") +# field(DRVL, "1") +# field(DRVH, "1") +# field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTENSITY_LUT_PAGE") +# field(VAL, "1") +#} record(ai, "$(P)$(R)IntensityLutPage-RB") { field(DESC, "") @@ -1292,8 +1295,6 @@ record(mbbo, "$(P)$(R)BitsPerChannel-S") { field(ZRST, "12 bits") field(ONVL, "16") field(ONST, "16 bits") - field(DRVL, "12") - field(DRVH, "16") field(VAL, "16") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 6aecca7..2f92730 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -61,7 +61,6 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, } //General - createParam( hFrameRateString, asynParamOctet, &hFrameRate); createParam( hHamaNameString, asynParamOctet, &hHamaName); createParam( hVendorString, asynParamOctet, &hVendor); @@ -79,8 +78,8 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hReadoutDirectionString, asynParamInt32, &hReadoutDirection); //Trigger - createParam( hTriggerModeString, asynParamInt32, &hTriggerMode); createParam( hTriggerSourceString, asynParamInt32, &hTriggerSource); + createParam( hTriggerModeString, asynParamInt32, &hTriggerMode); createParam( hTriggerActiveString, asynParamInt32, &hTriggerActive); createParam( hTriggerGlobalExposureString, asynParamInt32, &hTriggerGlobalExposure); createParam( hTriggerPolarityString, asynParamInt32, &hTriggerPolarity); @@ -135,7 +134,9 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hOutputTriggerBaseSensor0String, asynParamInt32, &hOutputTriggerBaseSensor0); createParam( hOutputTriggerBaseSensor1String, asynParamInt32, &hOutputTriggerBaseSensor1); createParam( hOutputTriggerBaseSensor2String, asynParamInt32, &hOutputTriggerBaseSensor2); - createParam( hOutputTriggerPreHsyncCountString, asynParamInt32, &hOutputTriggerPreHsyncCount); + createParam( hOutputTriggerPreHsyncCount0String, asynParamInt32, &hOutputTriggerPreHsyncCount0); + createParam( hOutputTriggerPreHsyncCount1String, asynParamInt32, &hOutputTriggerPreHsyncCount1); + createParam( hOutputTriggerPreHsyncCount2String, asynParamInt32, &hOutputTriggerPreHsyncCount2); //Master Puls createParam( hMasterPulseModeString, asynParamInt32, &hMasterPulseMode); @@ -383,53 +384,71 @@ asynStatus Hama::getParameter(int propertyID){ double dvalue = 0; switch (propertyID){ - case DETECTOR_PIXEL_NUM_HORZ: - m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); + // - sensor mode and speed + case DCAM_IDPROP_SENSORMODE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); if(failed(m_err)) { - printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + printError(m_hdcam, m_err, "SENSOR MODE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } - status = setIntegerParam(ADMaxSizeX, dvalue); - break; - - case DETECTOR_PIXEL_NUM_VERT: - m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &dvalue); + status = setIntegerParam(hSensorMode, dvalue); + break; + case DCAM_IDPROP_READOUTSPEED: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); if(failed(m_err)) { - printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + printError(m_hdcam, m_err, "READOUT SPEED", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } - status = setIntegerParam(ADMaxSizeY, dvalue); + status = setIntegerParam(hReadoutSpeed, dvalue); break; - - case DCAM_IDPROP_IMAGE_PIXELTYPE: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); - status = setIntegerParam(hImagePixelType, dvalue); - break; - - case DCAM_IDPROP_IMAGE_WIDTH: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + case DCAM_IDPROP_READOUT_DIRECTION: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); if(failed(m_err)) { - printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + printError(m_hdcam, m_err, "R DIRECTION", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } - status = setIntegerParam(ADBinX, dvalue); + status = setIntegerParam(hReadoutDirection, dvalue); break; - - case DCAM_IDPROP_IMAGE_HEIGHT: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } - status = setIntegerParam(ADBinY, (int)dvalue); + // - trigger + case DCAM_IDPROP_TRIGGERSOURCE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); + status = setIntegerParam(hTriggerSource, dvalue); break; - - case DCAM_IDPROP_IMAGE_ROWBYTES: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); - status = setIntegerParam(hImageRowbytes, dvalue); + case DCAM_IDPROP_TRIGGER_MODE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); + status = setIntegerParam(hTriggerMode, dvalue); break; - - case DCAM_IDPROP_IMAGE_FRAMEBYTES: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); - status = setIntegerParam(hImageFramebytes, dvalue); + case DCAM_IDPROP_TRIGGERACTIVE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &dvalue); + status = setIntegerParam(hTriggerActive, dvalue); break; - + case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); + status = setIntegerParam(hTriggerGlobalExposure, dvalue); + break; + case DCAM_IDPROP_TRIGGERPOLARITY: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &dvalue); + status = setIntegerParam(hTriggerPolarity, dvalue); + break; + case DCAM_IDPROP_TRIGGER_CONNECTOR: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); + status = setIntegerParam(hTriggerConnector, dvalue); + break; + case DCAM_IDPROP_TRIGGERTIMES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); + status = setIntegerParam(hTriggerTimes, dvalue); + break; + case DCAM_IDPROP_TRIGGERDELAY: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &dvalue); + status = setDoubleParam(hTriggerDelay, dvalue); + break; + case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); + status = setIntegerParam(hInternalTriggerHandling, dvalue); + break; + // - sensor cooler + case DCAM_IDPROP_SENSORCOOLERSTATUS: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); + status = setIntegerParam(hSensorCoolerStatus, dvalue); + break; + // - binning and roi case DCAM_IDPROP_BINNING: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &dvalue); status = setIntegerParam(hBinning, dvalue); @@ -454,96 +473,52 @@ asynStatus Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dvalue); status = setIntegerParam(ADMinY, dvalue); break; + // - feature - // ALU -------------------------------------- + // - alu case DCAM_IDPROP_DEFECTCORRECT_MODE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); status = setIntegerParam(hDefectCorrectMode, dvalue); break; + case DCAM_IDPROP_INTENSITYLUT_PAGE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &dvalue); + status = setIntegerParam(hIntensityLutPage, dvalue); + break; + case DCAM_IDPROP_INTENSITYLUT_MODE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); + status = setIntegerParam(hIntensityLutMode, dvalue); + break; + // - output trigger - case DCAM_IDPROP_SENSORMODE: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "SENSOR MODE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } - status = setIntegerParam(hSensorMode, dvalue); - break; - - case DCAM_IDPROP_READOUTSPEED: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "READOUT SPEED", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } - status = setIntegerParam(hReadoutSpeed, dvalue); - break; - - case DCAM_IDPROP_READOUT_DIRECTION: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "R DIRECTION", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } - status = setIntegerParam(hReadoutDirection, dvalue); - break; - - case DCAM_IDPROP_TRIGGERSOURCE: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); - status = setIntegerParam(hTriggerSource, dvalue); - break; + // - master pulse - case DCAM_IDPROP_TRIGGER_MODE: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); - status = setIntegerParam(hTriggerMode, dvalue); - break; - - case DCAM_IDPROP_TRIGGERACTIVE: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &dvalue); - status = setIntegerParam(hTriggerActive, dvalue); - break; - - case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); - status = setIntegerParam(hTriggerGlobalExposure, dvalue); - break; - - case DCAM_IDPROP_TRIGGERPOLARITY: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &dvalue); - status = setIntegerParam(hTriggerPolarity, dvalue); - break; - - case DCAM_IDPROP_TRIGGER_CONNECTOR: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); - status = setIntegerParam(hTriggerConnector, dvalue); - break; - - case DCAM_IDPROP_TRIGGERTIMES: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); - status = setIntegerParam(hTriggerTimes, dvalue); - break; - - case DCAM_IDPROP_TRIGGERDELAY: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &dvalue); - status = setDoubleParam(hTriggerDelay, dvalue); - break; - - case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); - status = setIntegerParam(hInternalTriggerHandling, dvalue); - break; - - case DCAM_IDPROP_BITSPERCHANNEL: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); - status = setIntegerParam(hBitPerChannel, dvalue); - break; + // - synchronous timing + // - system information case DCAM_IDPROP_COLORTYPE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &dvalue); status = setIntegerParam(hColorType, dvalue); break; - - case DCAM_IDPROP_IMAGE_TOPOFFSETBYTES: + case DCAM_IDPROP_BITSPERCHANNEL: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); + status = setIntegerParam(hBitPerChannel, dvalue); + break; + case DCAM_IDPROP_IMAGE_ROWBYTES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); + status = setIntegerParam(hImageRowbytes, dvalue); + break; + case DCAM_IDPROP_IMAGE_FRAMEBYTES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); + status = setIntegerParam(hImageFramebytes, dvalue); + break; + case DCAM_IDPROP_IMAGE_TOPOFFSETBYTES: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &dvalue); status = setIntegerParam(hImageTopOffsetBytes, dvalue); break; + case DCAM_IDPROP_IMAGE_PIXELTYPE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); + status = setIntegerParam(hImagePixelType, dvalue); + break; case DCAM_IDPROP_BUFFER_ROWBYTES: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); status = setIntegerParam(hBufferRowbytes, dvalue); @@ -588,6 +563,34 @@ asynStatus Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &dvalue); status = setIntegerParam(hNumberOfView, dvalue); break; + case DCAM_IDPROP_IMAGE_WIDTH: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } + status = setIntegerParam(ADBinX, dvalue); + break; + case DCAM_IDPROP_IMAGE_HEIGHT: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } + status = setIntegerParam(ADBinY, (int)dvalue); + break; + case DETECTOR_PIXEL_NUM_HORZ: + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } + status = setIntegerParam(ADMaxSizeX, dvalue); + break; + case DETECTOR_PIXEL_NUM_VERT: + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + } + status = setIntegerParam(ADMaxSizeY, dvalue); + break; case DCAM_IDPROP_TIMESTAMP_PRODUCER: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); status = setIntegerParam(hTimeStampProducer, dvalue); @@ -596,7 +599,6 @@ asynStatus Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &dvalue); status = setIntegerParam(hFrameStampProducer, dvalue); break; - default: char text[256]; dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); @@ -1035,6 +1037,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + /* else if (index == hIntensityLutMode) { printf("[DEBUG]::function IntensityLutMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); @@ -1049,6 +1052,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + */ else if (index == hExtractionMode) { printf("[DEBUG]::function ExtractionMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); @@ -1196,7 +1200,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hOutputTriggerPreHsyncCount) { + else if (index == hOutputTriggerPreHsyncCount0) { printf("[DEBUG]::function OutputTriggerPreHsynCount %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); if(failed(m_err)) { @@ -1269,16 +1273,11 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ else{ if(index < FIRST_HAMA_PARAM){ status = ADDriver::writeInt32(pasynUser, value); - printf("Call function ADDriver::writeInt32\n"); printf("[+DEBUG]::function writeInt32 did not find a parameter, call ADDriver::writeInit32 %s\n", paramName); - //printf("[DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", - //FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); ADDriver::writeInt32(pasynUser, value); } else{ printf("[-DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); - //printf("[-DEBUG]::function writeInt32 FIRST = %d / LAST = %d, %d)\n", - //FIRST_HAMA_PARAM, LAST_HAMA_PARAM, LAST_HAMA_PARAM-FIRST_HAMA_PARAM); } } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index b1cf0b7..68ecbbc 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -81,7 +81,9 @@ #define hOutputTriggerBaseSensor0String "H_OUTPUT_TRIGGER_BASE_SENSOR0" /* asynInt32 rw */ #define hOutputTriggerBaseSensor1String "H_OUTPUT_TRIGGER_BASE_SENSOR1" /* asynInt32 rw */ #define hOutputTriggerBaseSensor2String "H_OUTPUT_TRIGGER_BASE_SENSOR2" /* asynInt32 rw */ -#define hOutputTriggerPreHsyncCountString "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT" /* asynInt32 rw */ +#define hOutputTriggerPreHsyncCount0String "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT0" /* asynInt32 rw */ +#define hOutputTriggerPreHsyncCount1String "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT1" /* asynInt32 rw */ +#define hOutputTriggerPreHsyncCount2String "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT2" /* asynInt32 rw */ // Master Puls #define hMasterPulseModeString "H_MASTERPULSE_MODE" /* asynInt32 rw */ @@ -162,11 +164,11 @@ protected: int hDriverVersion; int hModuleVersion; int hDcamApiVersion; + // - sensor mode and speed int hSensorMode; int hReadoutSpeed; int hReadoutDirection; - int hColorType; - int hBitPerChannel; //----------------- + // - trigger int hTriggerSource; int hTriggerMode; int hTriggerActive; @@ -176,45 +178,26 @@ protected: int hTriggerTimes; int hTriggerDelay; int hInternalTriggerHandling; + // - sensor cooler int hSensorTemperature; int hSensorCooler; int hSensorCoolerStatus; - int hExposureTime; - int hDefectCorrectMode; - int hHotPixelCorrectLevel; + // - binning and roi int hBinning; int hSubarrayHPos; int hSubarrayHSize; int hSubarrayVPos; int hSubarrayVSize; int hSubarrayMode; + // - feature + int hExposureTime; + // - alu + int hDefectCorrectMode; + int hHotPixelCorrectLevel; int hIntensityLutMode; int hIntensityLutPage; int hExtractionMode; - int hTimingReadoutTime; - int hTimingCyclicTriggerPeriod; - int hTimingMinTriggerBlanking; - int hTimingMinTriggerInterval; - int hTimingGlobalExposureDelay; - int hTimingExposure; - int hTimingInvalidExposurePeriod; - int hInternalFrameRate; - int hInternalFrameInterval; - int hInternalLineSpeed; - int hInternalLineInterval; - // int hImageWidth; - // int hImageHeight; - int hImageRowbytes; - int hImageFramebytes; - int hImageTopOffsetBytes; - int hImagePixelType; - int hBufferRowbytes; - int hBufferFramebytes; - int hBufferTopOffsetBytes; - int hBufferPixelType; - int hRecordFixedBytesPerFile; - int hRecordFixedBytesPerSession; - int hRecordFixedBytesPerFrame; + // - output trigger int hNumberOfOutputTriggerConnector; int hOutputTriggerSource0; int hOutputTriggerSource1; @@ -237,11 +220,40 @@ protected: int hOutputTriggerBaseSensor0; int hOutputTriggerBaseSensor1; int hOutputTriggerBaseSensor2; - int hOutputTriggerPreHsyncCount; + int hOutputTriggerPreHsyncCount0; + int hOutputTriggerPreHsyncCount1; + int hOutputTriggerPreHsyncCount2; + // - master pulse int hMasterPulseMode; int hMasterPulseTriggerSource; int hMasterPulseInterval; int hMasterPulseBurstTimes; + // - symchronous timing + int hTimingReadoutTime; + int hTimingCyclicTriggerPeriod; + int hTimingMinTriggerBlanking; + int hTimingMinTriggerInterval; + int hTimingGlobalExposureDelay; + int hTimingExposure; + int hTimingInvalidExposurePeriod; + int hInternalFrameRate; + int hInternalFrameInterval; + int hInternalLineSpeed; + int hInternalLineInterval; + // - system information + int hColorType; + int hBitPerChannel; + int hImageRowbytes; + int hImageFramebytes; + int hImageTopOffsetBytes; + int hImagePixelType; + int hBufferRowbytes; + int hBufferFramebytes; + int hBufferTopOffsetBytes; + int hBufferPixelType; + int hRecordFixedBytesPerFile; + int hRecordFixedBytesPerSession; + int hRecordFixedBytesPerFrame; int hSystemAlive; int hConversionFactorCoeff; int hConversionFactorOffset; @@ -252,6 +264,7 @@ protected: int hImageDetectorPixelNumVert; int hTimeStampProducer; int hFrameStampProducer; + //---- int hTimeStamp; //#define LAST_HAMA_PARAM hTimeStamp From a97e2b8a1e7024516603f28446b24ea6abda953d Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 2 Dec 2022 15:28:22 +0100 Subject: [PATCH 25/66] test with Douglas in B02 --- ADHamaApp/Db/hama.template | 23 ----- ADHamaApp/src/hama.cpp | 184 ++++++++++++++++++++++++------------- 2 files changed, 119 insertions(+), 88 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 609f66b..99b983b 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -273,29 +273,6 @@ record(mbbi, "$(P)$(R)ReadoutDirection-RB") { } - - -record(mbbo, "$(P)$(R)ColorType-S") { - field(DESC,"") - field(PINI, "YES") - field(DTYP, "asynInt32") - field(ZRVL, "1") - field(ZRST, "B/W") -# field(DRVL, "1") -# field(DRVH, "1") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_COLOR_TYPE") - field(VAL, "1") -} - -record(mbbi, "$(P)$(R)ColorType-RB") { - field(DESC,"") - field(ZRVL, "1") - field(ZRST, "B/W") - field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_COLOR_TYPE") - field(SCAN, "I/O Intr") -} - record(mbbo, "$(P)$(R)BitPerChannel-S") { field(DESC,"") field(PINI, "YES") diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 2f92730..8fc606c 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -276,16 +276,17 @@ int Hama::initCamera(){ // ALU --------------------------------------------------- err |= getParameter( DCAM_IDPROP_DEFECTCORRECT_MODE); - //HOTPIXEL - //INTENSITYLUT_MODE - //INTENSITYLUT_PAGE - //EXTRAXTIONMODE + err |= getParameter( DCAM_IDPROP_HOTPIXELCORRECT_LEVEL); + err |= getParameter( DCAM_IDPROP_INTENSITYLUT_MODE); + err |= getParameter( DCAM_IDPROP_INTENSITYLUT_PAGE); + err |= getParameter( DCAM_IDPROP_EXTRACTION_MODE); // OUTPUT TRIGGER ---------------------------------------- // MASTER PULSE ------------------------------------------ // SYNCHRONOUS TIMING ------------------------------------ // SYSTEM INFORMATION ------------------------------------ + err |= getParameter(DCAM_IDPROP_COLORTYPE); err |= getParameter(DCAM_IDPROP_BITSPERCHANNEL); err |= getParameter(DCAM_IDPROP_IMAGE_TOPOFFSETBYTES); err |= getParameter(DCAM_IDPROP_BUFFER_ROWBYTES); @@ -480,15 +481,60 @@ asynStatus Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); status = setIntegerParam(hDefectCorrectMode, dvalue); break; - case DCAM_IDPROP_INTENSITYLUT_PAGE: - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &dvalue); - status = setIntegerParam(hIntensityLutPage, dvalue); + case DCAM_IDPROP_HOTPIXELCORRECT_LEVEL: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &dvalue); + status = setIntegerParam(hHotPixelCorrectLevel, dvalue); break; case DCAM_IDPROP_INTENSITYLUT_MODE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); status = setIntegerParam(hIntensityLutMode, dvalue); break; + case DCAM_IDPROP_INTENSITYLUT_PAGE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &dvalue); + status = setIntegerParam(hIntensityLutPage, dvalue); + break; + case DCAM_IDPROP_EXTRACTION_MODE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); + status = setIntegerParam(hExtractionMode, dvalue); + break; // - output trigger + case DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); + status = setIntegerParam(hNumberOfOutputTriggerConnector, dvalue); + break; + case DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + }else{ + printf("-----------------> value = %f\n", dvalue); + } + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+4, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + }else{ + printf("-----------------> value = %f\n", dvalue); + } + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+6, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); + }else{ + printf("-----------------> value = %f\n", dvalue); + } + + + status = setIntegerParam(hOutputTriggerActive0, dvalue); + break; + //case DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE: + // m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); + // status = setIntegerParam(hOutputTriggerActive1, dvalue); + //break; + //case DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE: + // m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); + // status = setIntegerParam(hOutputTriggerActive2, dvalue); + //break; // - master pulse @@ -724,7 +770,7 @@ void Hama::imageTask(){ timestamp = (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); status = setDoubleParam(hTimeStamp, timestamp); - //printf("Timestamp from camera: %f\n", (ts_sec + ts_microsec / 1.0e6)); + printf("Timestamp from camera: %f\n", (ts_sec + ts_microsec / 1.0e6)); //printf("Timestamp from camera with correction: %f\n", timestamp); getIntegerParam(NDArrayCallbacks, &callback); @@ -822,7 +868,7 @@ return status; asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ - printf("[DEBUG]::writeInt32\t"); + //printf("[DEBUG]::writeInt32\t"); asynStatus status = asynSuccess; const char* functionName = "writeInt32"; const char* paramName; @@ -840,7 +886,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ status = setIntegerParam(index, value); if (index == ADAcquire) { - printf("[DEBUG]::function ADAcquire\n"); + printf("[DEBUG]::writeInit32 ADAcquire\n"); if (value) { /* Send an event to wake up the acq task.*/ puts("Requested acquire start event. Sending acquire start event signal to thread"); @@ -867,12 +913,12 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ else if (index == ADImageMode) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("[DEBUG]::function ADImageMode\n"); + printf("[DEBUG]::writeInit32 ADImageMode\n"); } else if (index == ADNumExposures) { //camprop_setvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, value); //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); - printf("[DEBUG]::function ADNumExposures\n"); + printf("[DEBUG]::writeInit32 ADNumExposures\n"); } else if (index == ADMinX) { updateSensorSize(); @@ -889,17 +935,17 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); - printf("[DEBUG]::function ADReadStatus\n"); + printf("[DEBUG]::writeInit32 ADReadStatus\n"); } else if (index == hSensorMode) { - printf("[DEBUG]::function SensorMode %d\n", value); + printf("[DEBUG]::writeInit32 SensorMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hReadoutSpeed) { - printf("[DEBUG]::function ReadoutSpeed %d\n", value); + printf("[DEBUG]::writeInit32 ReadoutSpeed %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); @@ -907,7 +953,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } else if (index == hReadoutDirection) { - printf("[DEBUG]::function ReadoutDirection %d\n", value); + printf("[DEBUG]::writeInit32 ReadoutDirection %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue, 0); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); @@ -915,70 +961,70 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } else if (index == hBitPerChannel) { - printf("[DEBUG]::function BitPerChannel %d\n", value); + printf("[DEBUG]::writeInit32 BitPerChannel %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTriggerSource) { - printf("[DEBUG]::function TriggerSource %d\n", value); + printf("[DEBUG]::writeInit32 TriggerSource %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTriggerMode) { - printf("[DEBUG]::function TriggerMode %d\n", value); + printf("[DEBUG]::writeInit32 TriggerMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTriggerActive) { - printf("[DEBUG]::function TriggerActive %d\n", value); + printf("[DEBUG]::writeInit32 TriggerActive %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTriggerGlobalExposure) { - printf("[DEBUG]::function TriggerGlobalExposure %d\n", value); + printf("[DEBUG]::writeInit32 TriggerGlobalExposure %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTriggerPolarity) { - printf("[DEBUG]::function TriggerPolarity %d\n", value); + printf("[DEBUG]::writeInit32 TriggerPolarity %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTriggerConnector) { - printf("[DEBUG]::function TriggerConnector %d\n", value); + printf("[DEBUG]::writeInit32 TriggerConnector %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTriggerTimes) { - printf("[DEBUG]::function TriggerTimes %d\n", value); + printf("[DEBUG]::writeInit32 TriggerTimes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hInternalTriggerHandling) { - printf("[DEBUG]::function TriggerHandling %d\n", value); + printf("[DEBUG]::writeInit32 TriggerHandling %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hSensorCoolerStatus) { - printf("[DEBUG]::function SensorCoolerStatus %d\n", value); + printf("[DEBUG]::writeInit32 SensorCoolerStatus %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); @@ -986,13 +1032,13 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } else if (index == hDefectCorrectMode) { m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); - printf("[DEBUG]::function DefectCorrerMode %f\n", dvalue); + printf("[DEBUG]::writeInit32 DefectCorrerMode %f\n", dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hHotPixelCorrectLevel) { - printf("[DEBUG]::function HotPixelCorrectLevel %d\n", value); + printf("[DEBUG]::writeInit32 HotPixelCorrectLevel %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); @@ -1000,7 +1046,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } else if (index == hBinning) { updateSensorSize(); - printf("[DEBUG]::function Binning %d\n", value); + printf("[DEBUG]::writeInit32 Binning %d\n", value); } else if (index == hSubarrayHPos) { printf("[DEBUG]::function SubArrayHPos %d\n", value); @@ -1010,28 +1056,28 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } } else if (index == hSubarrayHSize) { - printf("[DEBUG]::function SubarrayHSize %d\n", value); + printf("[DEBUG]::writeInit32 SubarrayHSize %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hSubarrayVPos) { - printf("[DEBUG]::function SubarrayVPos %d\n", value); + printf("[DEBUG]::writeInit32 SubarrayVPos %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hSubarrayVSize) { - printf("[DEBUG]::function SubarrayVSize %d\n", value); + printf("[DEBUG]::writeInit32 SubarrayVSize %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hSubarrayMode) { - printf("[DEBUG]::function SubarrayMode %d\n", value); + printf("[DEBUG]::writeInit32 SubarrayMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); @@ -1054,217 +1100,225 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } */ else if (index == hExtractionMode) { - printf("[DEBUG]::function ExtractionMode %d\n", value); + printf("[DEBUG]::writeInit32 ExtractionMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTimingExposure) { - printf("[DEBUG]::function TimingExposure %d\n", value); + printf("[DEBUG]::writeInit32 TimingExposure %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == ADBinX) { - printf("[DEBUG]::function ImageWidth %d\n", value); + printf("[DEBUG]::writeInit32 ImageWidth %d\n", value); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == ADBinY) { - printf("[DEBUG]::function ImageHeight %d\n", value); + printf("[DEBUG]::writeInit32 ImageHeight %d\n", value); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hImageRowbytes) { - printf("[DEBUG]::function ImageRowBytes %d\n", value); + printf("[DEBUG]::writeInit32 ImageRowBytes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hImageFramebytes) { - printf("[DEBUG]::function ImageFramBytes %d\n", value); + printf("[DEBUG]::writeInit32 ImageFramBytes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hImageTopOffsetBytes) { - printf("[DEBUG]::function ImageTopOffsetBytes %d\n", value); + printf("[DEBUG]::writeInit32 ImageTopOffsetBytes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hImagePixelType) { - printf("[DEBUG]::function ImagePixelType %d\n", value); + printf("[DEBUG]::writeInit32 ImagePixelType %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hBufferRowbytes) { - printf("[DEBUG]::function BufferRowBytes %d\n", value); + printf("[DEBUG]::writeInit32 BufferRowBytes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hBufferFramebytes) { - printf("[DEBUG]::function BufferFrameBytes %d\n", value); + printf("[DEBUG]::writeInit32 BufferFrameBytes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hBufferTopOffsetBytes) { - printf("[DEBUG]::function BufferTopOffsetBytes %d\n", value); + printf("[DEBUG]::writeInit32 BufferTopOffsetBytes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hBufferPixelType) { - printf("[DEBUG]::function BufferPixelType %d\n", value); + printf("[DEBUG]::writeInit32 BufferPixelType %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hRecordFixedBytesPerFile) { - printf("[DEBUG]::function ecordFixedBytesPerFile %d\n", value); + printf("[DEBUG]::writeInit32 ecordFixedBytesPerFile %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hRecordFixedBytesPerSession) { - printf("[DEBUG]::function RecordFixedBytesPerSesion %d\n", value); + printf("[DEBUG]::writeInit32 RecordFixedBytesPerSesion %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hRecordFixedBytesPerFrame) { - printf("[DEBUG]::function RecordFixedBytesPerFrame %d\n", value); + printf("[DEBUG]::writeInit32 RecordFixedBytesPerFrame %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hNumberOfOutputTriggerConnector) { - printf("[DEBUG]::function NumberOutputTriggerConnector %d\n", value); + printf("[DEBUG]::writeInit32 NumberOutputTriggerConnector %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hOutputTriggerSource0) { - printf("[DEBUG]::function OutputTriggerSource0 %d\n", value); + printf("[DEBUG]::writeInit32 OutputTriggerSource0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hOutputTriggerPolarity0) { - printf("[DEBUG]::function OutputTriggerPolaroty0 %d\n", value); + printf("[DEBUG]::writeInit32 OutputTriggerPolaroty0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hOutputTriggerActive0) { - printf("[DEBUG]::function OutputTriggerActive0 %d\n", value); + printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hOutputTriggerKind0) { - printf("[DEBUG]::function OutputTriggerKind0 %d\n", value); + printf("[DEBUG]::writeInit32 OutputTriggerKind0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hOutputTriggerBaseSensor0) { - printf("[DEBUG]::function OutputTriggerBaseSensor0 %d\n", value); + printf("[DEBUG]::writeInit32 OutputTriggerBaseSensor0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hOutputTriggerPreHsyncCount0) { - printf("[DEBUG]::function OutputTriggerPreHsynCount %d\n", value); + printf("[DEBUG]::writeInit32 OutputTriggerPreHsynCount %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hMasterPulseMode) { - printf("[DEBUG]::function MasterPulseMode %d\n", value); + printf("[DEBUG]::writeInit32 MasterPulseMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hMasterPulseTriggerSource) { - printf("[DEBUG]::function MasterPulseTriggerSource %d\n", value); + printf("[DEBUG]::writeInit32 MasterPulseTriggerSource %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else if (index == hIntensityLutMode) { + printf("[DEBUG]::writeInit32 IntensityLutMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hMasterPulseBurstTimes) { - printf("[DEBUG]::function MasterPulseBurstTimes %d\n", value); + printf("[DEBUG]::writeInit32 MasterPulseBurstTimes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hSystemAlive) { - printf("[DEBUG]::function SystemAlive %d\n", value); + printf("[DEBUG]::writeInit32 SystemAlive %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hNumberOfView) { - printf("[DEBUG]::function NumberOfView %d\n", value); + printf("[DEBUG]::writeInit32 NumberOfView %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hImageDetectorPixelNumHorz) { - printf("[DEBUG]::function ImageDetectorPixelNumHorz %d\n", value); + printf("[DEBUG]::writeInit32 ImageDetectorPixelNumHorz %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hImageDetectorPixelNumVert) { - printf("[DEBUG]::function ImageDetectorPixelNumVert %d\n", value); + printf("[DEBUG]::writeInit32 ImageDetectorPixelNumVert %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hTimeStampProducer) { - printf("[DEBUG]::function TimeStampProducer %d\n", value); + printf("[DEBUG]::writeInit32 TimeStampProducer %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } else if (index == hFrameStampProducer) { - printf("[DEBUG]::function FrameStampProducer %d\n", value); + printf("[DEBUG]::writeInit32 FrameStampProducer %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); @@ -1273,7 +1327,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ else{ if(index < FIRST_HAMA_PARAM){ status = ADDriver::writeInt32(pasynUser, value); - printf("[+DEBUG]::function writeInt32 did not find a parameter, call ADDriver::writeInit32 %s\n", paramName); + printf("[+DEBUG]:: ADDriver::writeInit32 %s\n", paramName); ADDriver::writeInt32(pasynUser, value); } else{ From 922a418e5e9fac41173d95607c8ff283100f9bcd Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 14 Dec 2022 13:41:02 +0100 Subject: [PATCH 26/66] fix attributes --- ADHamaApp/Db/hama.template | 22 ++++-- ADHamaApp/src/hama.cpp | 133 ++++++++++++++++++++++++++++++------- ADHamaApp/src/hama.h | 8 +-- 3 files changed, 127 insertions(+), 36 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 99b983b..e099c71 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -961,7 +961,7 @@ record(mbbi, "$(P)$(R)OutputTriggerKind0-RB") { } ########################################################################## -# Output Trigger PreHsyncCount +# Output Trigger PreHsyncCount0 record(ao, "$(P)$(R)OutputTriggerPreHsyncCount-S") { field(DESC, "") field(PINI, "YES") @@ -1165,13 +1165,23 @@ record(ai, "$(P)$(R)TimingGlobalExposureDelay-RB") { } ########################################################################## -# Timing Invalid Exposure Period -record(mbbi, "$(P)$(R)TimingInvalidExposurePeriod-RB") { +# Timing Global Exposure Delay +record(mbbi, "$(P)$(R)TimingExposure-RB") { field(DESC, "") field(DTYP, "asynInt32") - field(ZRVL, "1") - field(ZRST, "Exposure Roling") + field(ZRVL, "3") + field(ZRST, "Roling") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TIMING_EXPOSURE") + field(SCAN, "I/O Intr") +} + +########################################################################## +# Timing Invalid Exposure Period +record(ai, "$(P)$(R)TimingInvalidExposurePeriod-RB") { + field(DESC, "") + field(DTYP, "asynFloat64") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TIMING_INVALID_EXPOSURE_PERIOD") + field(EGU, "Sec") field(SCAN, "I/O Intr") } @@ -1214,7 +1224,7 @@ record(ai, "$(P)$(R)InternalFrameInternal-RB") { } ########################################################################## -# Internal Line Interval +# Internal Line Speed record(ao, "$(P)$(R)InternalLineSpeed-S") { field(DESC, "") field(DTYP, "asynFloat64") diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 8fc606c..f00c5b9 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -134,9 +134,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hOutputTriggerBaseSensor0String, asynParamInt32, &hOutputTriggerBaseSensor0); createParam( hOutputTriggerBaseSensor1String, asynParamInt32, &hOutputTriggerBaseSensor1); createParam( hOutputTriggerBaseSensor2String, asynParamInt32, &hOutputTriggerBaseSensor2); - createParam( hOutputTriggerPreHsyncCount0String, asynParamInt32, &hOutputTriggerPreHsyncCount0); - createParam( hOutputTriggerPreHsyncCount1String, asynParamInt32, &hOutputTriggerPreHsyncCount1); - createParam( hOutputTriggerPreHsyncCount2String, asynParamInt32, &hOutputTriggerPreHsyncCount2); + createParam( hOutputTriggerPreHsyncCountString, asynParamInt32, &hOutputTriggerPreHsyncCount); //Master Puls createParam( hMasterPulseModeString, asynParamInt32, &hMasterPulseMode); @@ -285,6 +283,19 @@ int Hama::initCamera(){ // MASTER PULSE ------------------------------------------ // SYNCHRONOUS TIMING ------------------------------------ + + err |= getParameter( DCAM_IDPROP_TIMING_READOUTTIME); + err |= getParameter( DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD); + err |= getParameter( DCAM_IDPROP_TIMING_MINTRIGGERBLANKING); + err |= getParameter( DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL); + err |= getParameter( DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY); + err |= getParameter( DCAM_IDPROP_TIMING_EXPOSURE); + err |= getParameter( DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD); + err |= getParameter( DCAM_IDPROP_INTERNALFRAMERATE); + err |= getParameter( DCAM_IDPROP_INTERNAL_FRAMEINTERVAL); + err |= getParameter( DCAM_IDPROP_INTERNALLINESPEED); + err |= getParameter( DCAM_IDPROP_INTERNAL_LINEINTERVAL); + // SYSTEM INFORMATION ------------------------------------ err |= getParameter(DCAM_IDPROP_COLORTYPE); err |= getParameter(DCAM_IDPROP_BITSPERCHANNEL); @@ -539,6 +550,50 @@ asynStatus Hama::getParameter(int propertyID){ // - master pulse // - synchronous timing + case DCAM_IDPROP_TIMING_READOUTTIME: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &dvalue); + status = setDoubleParam(hTimingReadoutTime, dvalue); + break; + case DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &dvalue); + status = setDoubleParam(hTimingCyclicTriggerPeriod, dvalue); + break; + case DCAM_IDPROP_TIMING_MINTRIGGERBLANKING: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &dvalue); + status = setDoubleParam(hTimingMinTriggerBlanking, dvalue); + break; + case DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, &dvalue); + status = setDoubleParam(hTimingMinTriggerInterval, dvalue); + break; + case DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, &dvalue); + status = setDoubleParam(hTimingGlobalExposureDelay, dvalue); + break; + case DCAM_IDPROP_TIMING_EXPOSURE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &dvalue); + status = setIntegerParam(hTimingExposure, dvalue); + break; + case DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, &dvalue); + status = setDoubleParam(hTimingInvalidExposurePeriod, dvalue); + break; + case DCAM_IDPROP_INTERNALFRAMERATE: + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); + status = setDoubleParam(hInternalFrameRate, dvalue); + break; + case DCAM_IDPROP_INTERNAL_FRAMEINTERVAL: + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &dvalue); + status = setDoubleParam(hInternalFrameInterval, dvalue); + break; + case DCAM_IDPROP_INTERNALLINESPEED: + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, &dvalue); + status = setDoubleParam(hInternalLineSpeed, dvalue); + break; + case DCAM_IDPROP_INTERNAL_LINEINTERVAL: + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, &dvalue); + status = setDoubleParam(hInternalLineInterval, dvalue); + break; // - system information case DCAM_IDPROP_COLORTYPE: @@ -765,6 +820,18 @@ void Hama::imageTask(){ width * 2, width, height, ts_sec, ts_microsec); double exposure_time, readout_time, timestamp; + + //double _readouttime, _internal_frameinternal, _cyclictriggerperiod, _mintriggerblanking; + //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &_readouttime); + //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &_internal_frameinternal); + //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &_cyclictriggerperiod); + //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &_mintriggerblanking); + //printf("DCAM_IDPROP_TIMING_READOUTTIME: %f\n", _readouttime); + //printf("DCAM_IDPROP_INTERNAL_FRAMEINTERVAL: %f\n", _internal_frameinternal); + //printf("DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD: %f\n", _cyclictriggerperiod); + //printf("DCAM_IDPROP_TIMING_MINTRIGGERBLANKING: %f\n", _mintriggerblanking); + + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &readout_time); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &exposure_time); timestamp = (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); @@ -816,21 +883,28 @@ void Hama::imageTask(){ //============================================================================ void Hama::temperatureTask(){ static const char *functionName = "tempTask"; -// asynStatus status = asynSuccess; - double value = 0; + asynStatus status = asynSuccess; + double dvalue = 0; while( !stopThread ) { - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORTEMPERATURE, &value); - if(m_err != DCAMERR_SUCCESS){ + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORTEMPERATURE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_SensorTemperature()", " VALUE:%f\n", dvalue); + } + status = setDoubleParam(hSensorTemperature, dvalue); + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_SensorCoolerStatus()", "VALUE:%f\n", dvalue); + } + status = setIntegerParam(hSensorCoolerStatus, dvalue); + + if(status){ asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: temperature read error = %d\n", driverName, functionName, m_err); } - else{ - setDoubleParam(hSensorTemperature, value); - //printf("Temperature = %f\n",value); - } callParamCallbacks(); epicsThreadSleep(1.0); @@ -1246,13 +1320,14 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hOutputTriggerPreHsyncCount0) { + else if (index == hOutputTriggerPreHsyncCount) { printf("[DEBUG]::writeInit32 OutputTriggerPreHsynCount %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else if (index == hMasterPulseMode) { printf("[DEBUG]::writeInit32 MasterPulseMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &dvalue); @@ -1274,7 +1349,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hMasterPulseBurstTimes) { printf("[DEBUG]::writeInit32 MasterPulseBurstTimes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); @@ -1282,6 +1356,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else if (index == hSystemAlive) { printf("[DEBUG]::writeInit32 SystemAlive %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &dvalue); @@ -1328,7 +1403,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ if(index < FIRST_HAMA_PARAM){ status = ADDriver::writeInt32(pasynUser, value); printf("[+DEBUG]:: ADDriver::writeInit32 %s\n", paramName); - ADDriver::writeInt32(pasynUser, value); + //ADDriver::writeInt32(pasynUser, value); } else{ printf("[-DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); @@ -1336,9 +1411,8 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } setIntegerParam(index, value); - /* Do callbacks so higher layers see any changes */ - //status = (asynStatus) callParamCallbacks(); + status = (asynStatus) callParamCallbacks(); if (status) asynPrint(pasynUser, ASYN_TRACE_ERROR, @@ -1435,10 +1509,19 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } } else if (index == hInternalFrameRate) { - printf("[DEBUG]::function InternalFrameRate %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); - if(failed(m_err)) { + int sensorMode = 0; + getIntegerParam(hSensorMode, &sensorMode); + printf("[DEBUG]::function InternalFrameRate %f, %d, %d\n", value, hSensorMode, sensorMode); + printf("[DEBUG]::DCAMPROP_SENSORMODE__AREA = %d, DCAMPROP_SENSORMODE__SPLITVIEW = %d\n", + DCAMPROP_SENSORMODE__AREA, DCAMPROP_SENSORMODE__SPLITVIEW); + if((sensorMode != DCAMPROP_SENSORMODE__AREA) && (sensorMode != DCAMPROP_SENSORMODE__SPLITVIEW)){ + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); + if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else{ + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); } } else if (index == hInternalFrameInterval) { @@ -1512,9 +1595,13 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } } else{ - status = ADDriver::writeFloat64(pasynUser, value); - printf("Call function ADDriver::writeFloat64\n"); - printf("[DEBUG]::function writeFloat64 did not find a parameter\n"); + if(index < FIRST_HAMA_PARAM){ + status = ADDriver::writeFloat64(pasynUser, value); + printf("[+DEBUG]:: ADDriver::writeInit32 %s\n", paramName); + } + else{ + printf("[-DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); + } } setDoubleParam(index, value); @@ -1528,8 +1615,6 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: function=%d, paramName=%s, value=%f\n", driverName, functionName, index, paramName, value); - - return(asynSuccess); } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 68ecbbc..27d94ec 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -81,9 +81,7 @@ #define hOutputTriggerBaseSensor0String "H_OUTPUT_TRIGGER_BASE_SENSOR0" /* asynInt32 rw */ #define hOutputTriggerBaseSensor1String "H_OUTPUT_TRIGGER_BASE_SENSOR1" /* asynInt32 rw */ #define hOutputTriggerBaseSensor2String "H_OUTPUT_TRIGGER_BASE_SENSOR2" /* asynInt32 rw */ -#define hOutputTriggerPreHsyncCount0String "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT0" /* asynInt32 rw */ -#define hOutputTriggerPreHsyncCount1String "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT1" /* asynInt32 rw */ -#define hOutputTriggerPreHsyncCount2String "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT2" /* asynInt32 rw */ +#define hOutputTriggerPreHsyncCountString "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT" /* asynInt32 rw */ // Master Puls #define hMasterPulseModeString "H_MASTERPULSE_MODE" /* asynInt32 rw */ @@ -220,9 +218,7 @@ protected: int hOutputTriggerBaseSensor0; int hOutputTriggerBaseSensor1; int hOutputTriggerBaseSensor2; - int hOutputTriggerPreHsyncCount0; - int hOutputTriggerPreHsyncCount1; - int hOutputTriggerPreHsyncCount2; + int hOutputTriggerPreHsyncCount; // - master pulse int hMasterPulseMode; int hMasterPulseTriggerSource; From 1c1ee4e728b0a5966017948c73f4e03513dc9ba6 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 14 Dec 2022 14:35:54 +0100 Subject: [PATCH 27/66] Add linux library to local repo --- ADHama.Makefile | 3 ++- support/dcamsdk4/lib/linux/libdcamapi.so | Bin 0 -> 200144 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100755 support/dcamsdk4/lib/linux/libdcamapi.so diff --git a/ADHama.Makefile b/ADHama.Makefile index 1cee485..9af2285 100644 --- a/ADHama.Makefile +++ b/ADHama.Makefile @@ -133,7 +133,8 @@ USR_DBFLAGS += -I $(E3_ADCORE_LOCATION)/db USR_DBFLAGS += -I $(EPICS_BASE)/db USR_DBFLAGS += -I $(APPDB) -USR_LDFLAGS += -L/usr/local/lib -ldcamapi +USR_LDFLAGS += -L$(PWD)/support/dcamsdk4/lib/linux -ldcamapi +#USR_LDFLAGS += -L/usr/local/lib -ldcamapi db: $(SUBS) $(TMPS) diff --git a/support/dcamsdk4/lib/linux/libdcamapi.so b/support/dcamsdk4/lib/linux/libdcamapi.so new file mode 100755 index 0000000000000000000000000000000000000000..7140b484609f6ba5357aa12ad4e5ba0c48b3cae3 GIT binary patch literal 200144 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 K8;gm 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 literal 0 HcmV?d00001 From 0d44d0bbf2711f3570e1958ee2b4cdd45bf67b52 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Thu, 15 Dec 2022 11:55:21 +0100 Subject: [PATCH 28/66] implement virtual void report(FILE *, int) function --- ADHamaApp/src/hama.cpp | 183 ++++++++++++++++++++++++++++++++++------- 1 file changed, 152 insertions(+), 31 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index f00c5b9..dbf21b9 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -911,34 +911,8 @@ void Hama::temperatureTask(){ } } + //============================================================================ -/* -asynStatus Hama::getBounds(asynUser *pasynUser, epicsInt32 *low, epicsInt32 *high){ - - asynStatus status = asynSuccess; - const char* functionName = "getBounds"; - const char* paramName; - - int index = pasynUser->reason; - - getParamName(index, ¶mName); - - if(index == hSensorMode){ - *low = 0; - *high = 10; - } - else{ - ADDriver::getBounds(pasynUser, low, high); - - } - - - -return status; -} -*/ -//============================================================================ - asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ @@ -1511,9 +1485,6 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ else if (index == hInternalFrameRate) { int sensorMode = 0; getIntegerParam(hSensorMode, &sensorMode); - printf("[DEBUG]::function InternalFrameRate %f, %d, %d\n", value, hSensorMode, sensorMode); - printf("[DEBUG]::DCAMPROP_SENSORMODE__AREA = %d, DCAMPROP_SENSORMODE__SPLITVIEW = %d\n", - DCAMPROP_SENSORMODE__AREA, DCAMPROP_SENSORMODE__SPLITVIEW); if((sensorMode != DCAMPROP_SENSORMODE__AREA) && (sensorMode != DCAMPROP_SENSORMODE__SPLITVIEW)){ m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); if(failed(m_err)) { @@ -1694,8 +1665,158 @@ return(asynSuccess); //============================================================================ void Hama::report(FILE *fp, int details){ + double dvalue = 0; + fprintf(fp, "Hamamatsu Orca Flash4.0 driver\n"); + if (details < 1) return; - printf("[DEBUG]::report\n"); + // Sensor mode and speed + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); + fprintf(fp, "SENSOR MODE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); + fprintf(fp, "READOUT SPEED:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); + fprintf(fp, "READOUT DIRECTION:\t%f\n", dvalue); + // Trigger + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); + fprintf(fp, "TRIGGER SOURCE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); + fprintf(fp, "TRIGGER MODE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &dvalue); + fprintf(fp, "TRIGGER ACTIVE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); + fprintf(fp, "TRIGGER GLOBAL EXPOSURE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &dvalue); + fprintf(fp, "TRIGGER POLARITY:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); + fprintf(fp, "TRIGGER CONNECTOR:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); + fprintf(fp, "TRIGGER TIMES:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &dvalue); + fprintf(fp, "TRIGGER DELAY:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); + fprintf(fp, "TRIGGER HANDLING:\t%f\n", dvalue); + // Sensor cooler + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); + fprintf(fp, "SENSOR COOLER STATUS:\t%f\n", dvalue); + // Binning and ROI + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &dvalue); + fprintf(fp, "BINNING:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dvalue); + fprintf(fp, "SUBARRAY HSIZE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dvalue); + fprintf(fp, "SUBARRAY VSIZE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dvalue); + fprintf(fp, "SUBARRAY HPOS:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dvalue); + fprintf(fp, "SUBARRAY MODE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &dvalue); + fprintf(fp, "SUBARRAY MODE:\t%f\n", dvalue); + // Feature + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + fprintf(fp, "EXPOSURE TIME:\t%f\n", dvalue); + // ALU + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); + fprintf(fp, "DEFECT CORRETION MODE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &dvalue); + fprintf(fp, "HOT PIXEL CORRECTION LEVEL:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); + fprintf(fp, "INTENSITY LUT MODE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &dvalue); + fprintf(fp, "INTENSITY LUT PAGE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); + fprintf(fp, "EXTRACTION MODE:\t%f\n", dvalue); + // Output Trigger + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); + fprintf(fp, "OUTPUT TRIGGER CONNECTOR:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); + fprintf(fp, "OUTPUT TRIGGER ACTIVE:\t%f\n", dvalue); + //m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+4, &dvalue); + //fprintf(fp, ":\t%f\n", dvalue); + //m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+6, &dvalue); + //fprintf(fp, ":\t%f\n", dvalue); + + // - master pulse + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &dvalue); + fprintf(fp, "MASTER PULSE MODE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &dvalue); + fprintf(fp, "MASTER MODE TRIGGERSOURCE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &dvalue); + fprintf(fp, "MASTER MODE INTERVAL:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); + fprintf(fp, "MASTER MODE BURSTTIMES:\t%f\n", dvalue); + + // - synchronous timing + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &dvalue); + fprintf(fp, "TIMING READOUT TIME:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &dvalue); + fprintf(fp, "TIMING CYCLIN TRIGGER PERIOD:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &dvalue); + fprintf(fp, "TIMING MIN TRIGGER BLANKING:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, &dvalue); + fprintf(fp, "TIMING MIN TRIGGER INTERVAL:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, &dvalue); + fprintf(fp, "TIMING GLOBAL EXPOSURE DELAY:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &dvalue); + fprintf(fp, "TIMING EXPOSURE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, &dvalue); + fprintf(fp, "TIMING INVALID EXPOSURE PERIOD:\t%f\n", dvalue); + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); + fprintf(fp, "INTERNAL FRAME RATE:\t%f\n", dvalue); + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &dvalue); + fprintf(fp, "INTERNAL FRAME INTERVAL:\t%f\n", dvalue); + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, &dvalue); + fprintf(fp, "INTERNAL LINE SPEED:\t%f\n", dvalue); + m_err = dcamprop_getvalue( m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, &dvalue); + fprintf(fp, "INTERNAL LINE INTERVAL:\t%f\n", dvalue); + // - system information + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &dvalue); + fprintf(fp, "COLOR TYPE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); + fprintf(fp, "BITS PER CHANNEL:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); + fprintf(fp, "IMAGE ROW BYTES:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); + fprintf(fp, "IMAGE FRAME BYTES:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &dvalue); + fprintf(fp, "IMAGE TOP OFFSET BYTES:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); + fprintf(fp, "IMAGE PIXEL TYPE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); + fprintf(fp, "BUFFER ROW BYTES:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &dvalue); + fprintf(fp, "BUFER FRAME BYTES:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &dvalue); + fprintf(fp, "BUFFER TOP OFFSET BYTES:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &dvalue); + fprintf(fp, "BUFFER PIXEL TYPE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &dvalue); + fprintf(fp, "RECORD FIXED BYTES PER FILE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &dvalue); + fprintf(fp, "RECORD FIXED BYTES PER SESSION:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &dvalue); + fprintf(fp, "RECORD FIXED BYTES PER FRAME:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &dvalue); + fprintf(fp, "SYSTEM ALIVE:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &dvalue); + fprintf(fp, "CONVERSION FACTOR COEFFICIENT:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, &dvalue); + fprintf(fp, "CONVERSION FACTOR OFFSET:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &dvalue); + fprintf(fp, "NUMBER OF VIEW:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + fprintf(fp, "IMAGE WIDTH:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + fprintf(fp, "IMAGE HEIGHT:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); + fprintf(fp, "PIXEL NUM HORZ:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &dvalue); + fprintf(fp, "PIXEL NUM VERT:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); + fprintf(fp, "TIMESTAMP PRODUCER:\t%f\n", dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &dvalue); + fprintf(fp, "FRAMESTAMP PRODUCER:\t%f\n", dvalue); + + ADDriver::report(fp, details); } //============================================================================ From 97fd6f7c46a25c0f8f8d707b76bc488f6d9cc25a Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 16 Dec 2022 07:50:26 +0100 Subject: [PATCH 29/66] refactoring --- ADHamaApp/src/hama.cpp | 322 ++++++++++++++++++++--------------------- 1 file changed, 153 insertions(+), 169 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index dbf21b9..eb4e3ca 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -985,6 +985,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("[DEBUG]::writeInit32 ADReadStatus\n"); } + //-- Sensor mode and speed else if (index == hSensorMode) { printf("[DEBUG]::writeInit32 SensorMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); @@ -998,7 +999,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } - } else if (index == hReadoutDirection) { printf("[DEBUG]::writeInit32 ReadoutDirection %d\n", value); @@ -1007,14 +1007,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - - else if (index == hBitPerChannel) { - printf("[DEBUG]::writeInit32 BitPerChannel %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } + //-- Trigger else if (index == hTriggerSource) { printf("[DEBUG]::writeInit32 TriggerSource %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); @@ -1071,6 +1064,8 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + //-- sensor cooler - implemented in the temperature task + /* else if (index == hSensorCoolerStatus) { printf("[DEBUG]::writeInit32 SensorCoolerStatus %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); @@ -1078,20 +1073,8 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hDefectCorrectMode) { - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); - printf("[DEBUG]::writeInit32 DefectCorrerMode %f\n", dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hHotPixelCorrectLevel) { - printf("[DEBUG]::writeInit32 HotPixelCorrectLevel %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } + */ + //-- binning and ROI else if (index == hBinning) { updateSensorSize(); printf("[DEBUG]::writeInit32 Binning %d\n", value); @@ -1147,6 +1130,21 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } } */ + //-- ALU + else if (index == hDefectCorrectMode) { + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); + printf("[DEBUG]::writeInit32 DefectCorrerMode %f\n", dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hHotPixelCorrectLevel) { + printf("[DEBUG]::writeInit32 HotPixelCorrectLevel %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } else if (index == hExtractionMode) { printf("[DEBUG]::writeInit32 ExtractionMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); @@ -1154,6 +1152,96 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + //-- Output trigger + else if (index == hOutputTriggerSource0) { + printf("[DEBUG]::writeInit32 OutputTriggerSource0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerPolarity0) { + printf("[DEBUG]::writeInit32 OutputTriggerPolaroty0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + //else if (index == hOutputTriggerActive0) { + // printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); + // m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); + // if(failed(m_err)) { + // printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + // } + //} + else if (index == hOutputTriggerKind0) { + printf("[DEBUG]::writeInit32 OutputTriggerKind0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerPreHsyncCount) { + printf("[DEBUG]::writeInit32 OutputTriggerPreHsynCount %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerBaseSensor0) { + printf("[DEBUG]::writeInit32 OutputTriggerBaseSensor0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + //-- Master pulse + else if (index == hMasterPulseMode) { + printf("[DEBUG]::writeInit32 MasterPulseMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hMasterPulseTriggerSource) { + printf("[DEBUG]::writeInit32 MasterPulseTriggerSource %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hIntensityLutMode) { + printf("[DEBUG]::writeInit32 IntensityLutMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hMasterPulseBurstTimes) { + printf("[DEBUG]::writeInit32 MasterPulseBurstTimes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + //-- Synchronous timing - nothing to implement either is in writeFloat64 + //-- System information + else if (index == hBitPerChannel) { + printf("[DEBUG]::writeInit32 BitPerChannel %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BITSPERCHANNEL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + +/* + else if (index == hBufferRowbytes) { + printf("[DEBUG]::writeInit32 BufferRowBytes %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } else if (index == hTimingExposure) { printf("[DEBUG]::writeInit32 TimingExposure %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &dvalue); @@ -1196,6 +1284,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + */ else if (index == hImagePixelType) { printf("[DEBUG]::writeInit32 ImagePixelType %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); @@ -1203,13 +1292,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hBufferRowbytes) { - printf("[DEBUG]::writeInit32 BufferRowBytes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } +/* else if (index == hBufferFramebytes) { printf("[DEBUG]::writeInit32 BufferFrameBytes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &dvalue); @@ -1252,86 +1335,14 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hNumberOfOutputTriggerConnector) { - printf("[DEBUG]::writeInit32 NumberOutputTriggerConnector %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerSource0) { - printf("[DEBUG]::writeInit32 OutputTriggerSource0 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerPolarity0) { - printf("[DEBUG]::writeInit32 OutputTriggerPolaroty0 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerActive0) { - printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerKind0) { - printf("[DEBUG]::writeInit32 OutputTriggerKind0 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerBaseSensor0) { - printf("[DEBUG]::writeInit32 OutputTriggerBaseSensor0 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerPreHsyncCount) { - printf("[DEBUG]::writeInit32 OutputTriggerPreHsynCount %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - - else if (index == hMasterPulseMode) { - printf("[DEBUG]::writeInit32 MasterPulseMode %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hMasterPulseTriggerSource) { - printf("[DEBUG]::writeInit32 MasterPulseTriggerSource %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hIntensityLutMode) { - printf("[DEBUG]::writeInit32 IntensityLutMode %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hMasterPulseBurstTimes) { - printf("[DEBUG]::writeInit32 MasterPulseBurstTimes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - - else if (index == hSystemAlive) { + //else if (index == hNumberOfOutputTriggerConnector) { + // printf("[DEBUG]::writeInit32 NumberOutputTriggerConnector %d\n", value); + // m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); + // if(failed(m_err)) { + // printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + // } + //} + else if (index == hSystemAlive) { printf("[DEBUG]::writeInit32 SystemAlive %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &dvalue); if(failed(m_err)) { @@ -1373,6 +1384,8 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + */ + else{ if(index < FIRST_HAMA_PARAM){ status = ADDriver::writeInt32(pasynUser, value); @@ -1413,8 +1426,8 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ double dvalue = value; getParamName(index, ¶mName); - - + //-- Sensor mode and speed + //-- Feature if(index == ADAcquireTime) { printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); status = (asynStatus)setFeature(DCAM_IDPROP_EXPOSURETIME, value); @@ -1423,6 +1436,7 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + //-- Trigger else if (index == hTriggerDelay) { printf("[DEBUG]::function TriggerDelay %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &dvalue); @@ -1430,16 +1444,34 @@ 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); + //-- Sensor cooler - nothing + //-- Binning and ROI - nothing + //-- ALU - nothing + //-- Output trigger + else if (index == hOutputTriggerDelay0) { + printf("[DEBUG]::function OutputTriggerDelay0 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - */ - + else if (index == hOutputTriggerPeriod0) { + printf("[DEBUG]::function OutputTriggerPeriod0 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + //-- Master Pulse + else if (index == hMasterPulseInterval) { + printf("[DEBUG]::function MasterPulseInterval %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + //-- Synchronous timing + /* else if (index == hTimingReadoutTime) { printf("[DEBUG]::function TimingReadoutTime %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &dvalue); @@ -1481,7 +1513,7 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } - } + }*/ else if (index == hInternalFrameRate) { int sensorMode = 0; getIntegerParam(hSensorMode, &sensorMode); @@ -1516,27 +1548,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 == hOutputTriggerDelay0) { - printf("[DEBUG]::function OutputTriggerDelay0 %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerPeriod0) { - printf("[DEBUG]::function OutputTriggerPeriod0 %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hMasterPulseInterval) { - printf("[DEBUG]::function MasterPulseInterval %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } + /* else if (index == hConversionFactorCoeff) { printf("[DEBUG]::function ConversionFactorCoeff %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &dvalue); @@ -1565,6 +1577,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 < FIRST_HAMA_PARAM){ status = ADDriver::writeFloat64(pasynUser, value); @@ -1635,35 +1648,6 @@ return status; } //============================================================================ -/* -asynStatus Hama::readEnum(asynUser *pasynUser, char *strings[], int values[], - int severities[], size_t nElements, size_t *nIn){ - - printf("[DEBUG]::readEnum\t"); - const char* functionName = "readEnum"; - const char *paramName; - - int function = pasynUser->reason; - asynStatus status = asynSuccess; - - - getParamName(function, ¶mName); - - - double value = 0; - - *nIn = 0; - - status = (asynStatus) callParamCallbacks(); - - asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, - "%s:%s: entry, function=%d, string=%s\n", driverName, functionName, function, strings[0]); - -return(asynSuccess); -} -*/ -//============================================================================ - void Hama::report(FILE *fp, int details){ double dvalue = 0; fprintf(fp, "Hamamatsu Orca Flash4.0 driver\n"); From f62b2102bc693148deffcd74540f3c9937e27466 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Tue, 20 Dec 2022 09:30:57 +0100 Subject: [PATCH 30/66] implement trigger out --- ADHamaApp/Db/hama.template | 408 +++++++++++++++++++++++++++++++++++-- ADHamaApp/src/hama.cpp | 129 ++++++++++-- 2 files changed, 507 insertions(+), 30 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index e099c71..dd64bf5 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -798,6 +798,40 @@ record(ai, "$(P)$(R)NumberOfOutputTriggerConnector-R") { ########################################################################## # Output Trigger Source 0 (mode 4) record(mbbo, "$(P)$(R)OutputTriggerSource0-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "0") + field(ZRST, "Read Out End") + field(ONVL, "1") + field(ONST, "VSync") + field(TWVL, "2") + field(TWST, "HSync") + field(THVL, "3") + field(THST, "Trigger") +# field(DRVL, "2") +# field(DRVH, "6") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") + field(VAL, "0") +} + +record(mbbi, "$(P)$(R)OutputTriggerSource0-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "0") + field(ZRST, "Read Out End") + field(ONVL, "1") + field(ONST, "VSync") + field(TWVL, "2") + field(THST, "HSync") + field(THVL, "3") + field(THST, "Trigger") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") + field(SCAN, "I/O Intr") +} +########################################################################## +# Output Trigger Source 1 (mode 4) +record(mbbo, "$(P)$(R)OutputTriggerSource1-S") { field(DESC, "") field(PINI, "YES") field(DTYP, "asynInt32") @@ -811,11 +845,11 @@ record(mbbo, "$(P)$(R)OutputTriggerSource0-S") { field(THST, "Trigger") # field(DRVL, "2") # field(DRVH, "6") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") - field(VAL, "2") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE1") + field(VAL, "0") } -record(mbbi, "$(P)$(R)OutputTriggerSource0-RB") { +record(mbbi, "$(P)$(R)OutputTriggerSource1-RB") { field(DESC, "") field(DTYP, "asynInt32") field(ZRVL, "2") @@ -826,7 +860,41 @@ record(mbbi, "$(P)$(R)OutputTriggerSource0-RB") { field(THST, "HSync") field(THVL, "6") field(THST, "Trigger") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE1") + field(SCAN, "I/O Intr") +} + +# Output Trigger Source 2 (mode 4) +record(mbbo, "$(P)$(R)OutputTriggerSource2-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "2") + field(ZRST, "Read Out End") + field(ONVL, "3") + field(ONST, "VSync") + field(TWVL, "4") + field(TWST, "HSync") + field(THVL, "6") + field(THST, "Trigger") +# field(DRVL, "2") +# field(DRVH, "6") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE2") + field(VAL, "0") +} + +record(mbbi, "$(P)$(R)OutputTriggerSource2-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "2") + field(ZRST, "Read Out End") + field(ONVL, "3") + field(ONST, "VSync") + field(TWVL, "4") + field(THST, "HSync") + field(THVL, "6") + field(THST, "Trigger") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE2") field(SCAN, "I/O Intr") } @@ -856,6 +924,59 @@ record(mbbi, "$(P)$(R)OutputTriggerPolarity0-RB") { field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY0") field(SCAN, "I/O Intr") } + +# Output Trigger Polarity 1 (mode 2) +record(mbbo, "$(P)$(R)OutputTriggerPolarity1-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Negative") + field(ONVL, "2") + field(ONST, "Positive") +# field(DRVL, "1") +# field(DRVH, "2") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY1") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)OutputTriggerPolarity1-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Negative") + field(ONVL, "2") + field(ONST, "Positive") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY1") + field(SCAN, "I/O Intr") +} +# Output Trigger Polarity 2 (mode 2) +record(mbbo, "$(P)$(R)OutputTriggerPolarity2-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Negative") + field(ONVL, "2") + field(ONST, "Positive") +# field(DRVL, "1") +# field(DRVH, "2") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY2") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)OutputTriggerPolarity2-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Negative") + field(ONVL, "2") + field(ONST, "Positive") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY2") + field(SCAN, "I/O Intr") +} + + ########################################################################## # Internal Trigger Active (mode 1) record(mbbo, "$(P)$(R)OutputTriggerActive0-S") { @@ -869,7 +990,6 @@ record(mbbo, "$(P)$(R)OutputTriggerActive0-S") { field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE0") field(VAL, "1") } - record(mbbi, "$(P)$(R)OutputTriggerActive0-RB") { field(DESC, "") field(DTYP, "asynInt32") @@ -879,6 +999,49 @@ record(mbbi, "$(P)$(R)OutputTriggerActive0-RB") { field(SCAN, "I/O Intr") } +# Internal Trigger Active (mode 1) +record(mbbo, "$(P)$(R)OutputTriggerActive1-S") { + field(DESC, "") + field(DTYP, "asynInt32") + field(PINI, "YES") + field(ZRVL, "1") + field(ZRST, "Edge") +# field(DRVL, "1") +# field(DRVH, "1") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE1") + field(VAL, "1") +} +record(mbbi, "$(P)$(R)OutputTriggerActive1-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Edge") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE1") + field(SCAN, "I/O Intr") +} + +# Internal Trigger Active (mode 1) +record(mbbo, "$(P)$(R)OutputTriggerActive2-S") { + field(DESC, "") + field(DTYP, "asynInt32") + field(PINI, "YES") + field(ZRVL, "1") + field(ZRST, "Edge") +# field(DRVL, "1") +# field(DRVH, "1") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE2") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)OutputTriggerActive2-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Edge") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE2") + field(SCAN, "I/O Intr") +} + ########################################################################## # Output Trigger Delay 0 record(ao, "$(P)$(R)OutputTriggerDelay0-S") { @@ -890,7 +1053,6 @@ record(ao, "$(P)$(R)OutputTriggerDelay0-S") { field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_DELAY0") field(VAL, "0") } - record(ai, "$(P)$(R)OutputTriggerDelay0-RB") { field(DESC, "") field(DTYP, "asynFloat64") @@ -898,6 +1060,41 @@ record(ai, "$(P)$(R)OutputTriggerDelay0-RB") { field(SCAN, "I/O Intr") } +# Output Trigger Delay 1 +record(ao, "$(P)$(R)OutputTriggerDelay1-1") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynFloat64") + field(DRVL, "0") + field(DRVH, "10.0") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_DELAY1") + field(VAL, "0") +} +record(ai, "$(P)$(R)OutputTriggerDelay1-RB") { + field(DESC, "") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_DELAY1") + field(SCAN, "I/O Intr") +} + +# Output Trigger Delay 2 +record(ao, "$(P)$(R)OutputTriggerDelay2-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynFloat64") + field(DRVL, "0") + field(DRVH, "10.0") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_DELAY2") + field(VAL, "0") +} + +record(ai, "$(P)$(R)OutputTriggerDelay2-RB") { + field(DESC, "") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_DELAY2") + field(SCAN, "I/O Intr") +} + ########################################################################## # Output Trigger Period 0 record(ao, "$(P)$(R)OutputTriggerPeriod0-S") { @@ -909,7 +1106,6 @@ record(ao, "$(P)$(R)OutputTriggerPeriod0-S") { field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD0") field(VAL, "0") } - record(ai, "$(P)$(R)OutputTriggerPeriod0-RB") { field(DESC, "") field(DTYP, "asynFloat64") @@ -917,6 +1113,41 @@ record(ai, "$(P)$(R)OutputTriggerPeriod0-RB") { field(SCAN, "I/O Intr") } +# Output Trigger Period 1 +record(ao, "$(P)$(R)OutputTriggerPeriod1-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynFloat64") + field(DRVL, "0.000001") + field(DRVH, "10.0") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD1") + field(VAL, "0") +} +record(ai, "$(P)$(R)OutputTriggerPeriod1-RB") { + field(DESC, "") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD1") + field(SCAN, "I/O Intr") +} + +# Output Trigger Period 2 +record(ao, "$(P)$(R)OutputTriggerPeriod2-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynFloat64") + field(DRVL, "0.000001") + field(DRVH, "10.0") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD2") + field(VAL, "0") +} + +record(ai, "$(P)$(R)OutputTriggerPeriod2-RB") { + field(DESC, "") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD2") + field(SCAN, "I/O Intr") +} + ########################################################################## # Output Trigger Kind 0 (mode 5) record(mbbo, "$(P)$(R)OutputTriggerKind0-S") { @@ -935,8 +1166,6 @@ record(mbbo, "$(P)$(R)OutputTriggerKind0-S") { field(FRST, "High") field(FVVL, "6") field(FVST, "Any Row Exposure") -# field(DRVL, "1") -# field(DRVH, "6") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_KIND0") field(VAL, "1") } @@ -960,6 +1189,86 @@ record(mbbi, "$(P)$(R)OutputTriggerKind0-RB") { field(SCAN, "I/O Intr") } +# Output Trigger Kind 1 (mode 5) +record(mbbo, "$(P)$(R)OutputTriggerKind1-S") { + field(DESC, "") + field(DTYP, "asynInt32") + field(PINI, "YES") + field(ZRVL, "1") + field(ZRST, "Low") + field(ONVL, "2") + field(ONST, "Global Exposure") + field(TWVL, "3") + field(TWST, "Programable") + field(THVL, "4") + field(THST, "Trigger Ready") + field(FRVL, "5") + field(FRST, "High") + field(FVVL, "6") + field(FVST, "Any Row Exposure") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_KIND1") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)OutputTriggerKind1-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Low") + field(ONVL, "2") + field(ONST, "Global Exposure") + field(TWVL, "3") + field(TWST, "Programable") + field(THVL, "4") + field(THST, "Trigger Ready") + field(FRVL, "5") + field(FRST, "High") + field(FVVL, "6") + field(FVST, "Any Row Exposure") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_KIND1") + field(SCAN, "I/O Intr") +} + +# Output Trigger Kind 2 (mode 5) +record(mbbo, "$(P)$(R)OutputTriggerKind2-S") { + field(DESC, "") + field(DTYP, "asynInt32") + field(PINI, "YES") + field(ZRVL, "1") + field(ZRST, "Low") + field(ONVL, "2") + field(ONST, "Global Exposure") + field(TWVL, "3") + field(TWST, "Programable") + field(THVL, "4") + field(THST, "Trigger Ready") + field(FRVL, "5") + field(FRST, "High") + field(FVVL, "6") + field(FVST, "Any Row Exposure") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_KIND2") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)OutputTriggerKind2-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Low") + field(ONVL, "2") + field(ONST, "Global Exposure") + field(TWVL, "3") + field(TWST, "Programable") + field(THVL, "4") + field(THST, "Trigger Ready") + field(FRVL, "5") + field(FRST, "High") + field(FVVL, "6") + field(FVST, "Any Row Exposure") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_KIND2") + field(SCAN, "I/O Intr") +} + ########################################################################## # Output Trigger PreHsyncCount0 record(ao, "$(P)$(R)OutputTriggerPreHsyncCount-S") { @@ -1014,6 +1323,75 @@ record(mbbi, "$(P)$(R)OutputTriggerBaseSensor0-RB") { field(SCAN, "I/O Intr") } +# Output Trigger Base Sensor 1 (mode 4) +record(mbbo, "$(P)$(R)OutputTriggerBaseSensor1-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "View 1") + field(ONVL, "2") + field(ONST, "View 2") + field(TWVL, "15") + field(TWST, "Any View") + field(THVL, "16") + field(THST, "All Views") +# field(DRVL, "1") +# field(DRVH, "4") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_BASE_SENSOR1") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)OutputTriggerBaseSensor1-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "View 1") + field(ONVL, "2") + field(ONST, "View 2") + field(TWVL, "15") + field(TWST, "Any View") + field(THVL, "16") + field(THST, "All Views") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_BASE_SENSOR1") + field(SCAN, "I/O Intr") +} + +# Output Trigger Base Sensor 2 (mode 4) +record(mbbo, "$(P)$(R)OutputTriggerBaseSensor2-S") { + field(DESC, "") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "View 1") + field(ONVL, "2") + field(ONST, "View 2") + field(TWVL, "15") + field(TWST, "Any View") + field(THVL, "16") + field(THST, "All Views") +# field(DRVL, "1") +# field(DRVH, "4") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_BASE_SENSOR2") + field(VAL, "1") +} + +record(mbbi, "$(P)$(R)OutputTriggerBaseSensor2-RB") { + field(DESC, "") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "View 1") + field(ONVL, "2") + field(ONST, "View 2") + field(TWVL, "15") + field(TWST, "Any View") + field(THVL, "16") + field(THST, "All Views") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_BASE_SENSOR2") + field(SCAN, "I/O Intr") +} + + ########################################################################## # Master Pulse # ########################################################################## @@ -1189,9 +1567,8 @@ record(ai, "$(P)$(R)TimingInvalidExposurePeriod-RB") { # Internal Frame Rate record(ao, "$(P)$(R)InternalFrameRate-S") { field(DESC, "") + field(PINI, "YES") field(DTYP, "asynFloat64") - field(DRVL, "0.1") - field(DRVH, "100.022862") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_RATE") field(EGU, "Hz") } @@ -1208,9 +1585,8 @@ record(ai, "$(P)$(R)InternalFrameRate-RB") { # Internal Frame Interval record(ao, "$(P)$(R)InternalFrameInternal-S") { field(DESC, "") + field(PINI, "YES") field(DTYP, "asynFloat64") - field(DRVL, "0.00998") - field(DRVH, "10.0") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_INTERVAL") field(EGU, "Sec") } @@ -1227,9 +1603,8 @@ record(ai, "$(P)$(R)InternalFrameInternal-RB") { # Internal Line Speed record(ao, "$(P)$(R)InternalLineSpeed-S") { field(DESC, "") + field(PINI, "YES") field(DTYP, "asynFloat64") - field(DRVL, "0.667052") - field(DRVH, "0.667052") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_SPEED") field(EGU, "m/s") } @@ -1246,9 +1621,8 @@ record(ai, "$(P)$(R)InternalLineSpeed-RB") { # Internal Line Interval record(ao, "$(P)$(R)InternalLineInterval-S") { field(DESC, "") + field(PINI, "YES") field(DTYP, "asynFloat64") - field(DRVL, "0.00001") - field(DRVH, "0.00001") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_INTERVAL") field(EGU, "Sec") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index eb4e3ca..15cd162 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -521,14 +521,14 @@ asynStatus Hama::getParameter(int propertyID){ printf("-----------------> value = %f\n", dvalue); } - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+4, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+100, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); }else{ printf("-----------------> value = %f\n", dvalue); } - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+6, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+200, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); }else{ @@ -1160,6 +1160,21 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else if (index == hOutputTriggerSource1) { + printf("[DEBUG]::writeInit32 OutputTriggerSource1 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE+0x100, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerSource2) { + printf("[DEBUG]::writeInit32 OutputTriggerSource2 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE+0x200, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerPolarity0) { printf("[DEBUG]::writeInit32 OutputTriggerPolaroty0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &dvalue); @@ -1167,13 +1182,43 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - //else if (index == hOutputTriggerActive0) { - // printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); - // m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); - // if(failed(m_err)) { - // printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - // } - //} + else if (index == hOutputTriggerPolarity1) { + printf("[DEBUG]::writeInit32 OutputTriggerPolaroty1 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY+0x100, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerPolarity2) { + printf("[DEBUG]::writeInit32 OutputTriggerPolaroty2 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY+0x200, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + + else if (index == hOutputTriggerActive0) { + printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerActive1) { + printf("[DEBUG]::writeInit32 OutputTriggerActive1 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+0x100, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerActive2) { + printf("[DEBUG]::writeInit32 OutputTriggerActive2 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+0x200, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerKind0) { printf("[DEBUG]::writeInit32 OutputTriggerKind0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); @@ -1181,9 +1226,16 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hOutputTriggerPreHsyncCount) { - printf("[DEBUG]::writeInit32 OutputTriggerPreHsynCount %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); + else if (index == hOutputTriggerKind1) { + printf("[DEBUG]::writeInit32 OutputTriggerKind1 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND+0x100, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerKind2) { + printf("[DEBUG]::writeInit32 OutputTriggerKind2 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND+0x200, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } @@ -1195,6 +1247,28 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else if (index == hOutputTriggerBaseSensor1) { + printf("[DEBUG]::writeInit32 OutputTriggerBaseSensor1 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR+0x100, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerBaseSensor2) { + printf("[DEBUG]::writeInit32 OutputTriggerBaseSensor2 %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR+0x200, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerPreHsyncCount) { + printf("[DEBUG]::writeInit32 OutputTriggerPreHsynCount %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + //-- Master pulse else if (index == hMasterPulseMode) { printf("[DEBUG]::writeInit32 MasterPulseMode %d\n", value); @@ -1455,13 +1529,42 @@ 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 == hOutputTriggerPeriod0) { + else if (index == hOutputTriggerDelay1) { + printf("[DEBUG]::function OutputTriggerDelay1 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY+0x100, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerDelay2) { + printf("[DEBUG]::function OutputTriggerDelay2 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY+0x200, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + + else if (index == hOutputTriggerPeriod0) { printf("[DEBUG]::function OutputTriggerPeriod0 %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else if (index == hOutputTriggerPeriod1) { + printf("[DEBUG]::function OutputTriggerPeriod1 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD+0x100, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + else if (index == hOutputTriggerPeriod2) { + printf("[DEBUG]::function OutputTriggerPeriod2 %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD+200, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } //-- Master Pulse else if (index == hMasterPulseInterval) { printf("[DEBUG]::function MasterPulseInterval %f\n", value); From a4cbf7e9094744163dea9597f5f2b8877525b7b2 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Tue, 20 Dec 2022 10:27:02 +0100 Subject: [PATCH 31/66] fix in trigger output, not ready yet... --- ADHamaApp/src/hama.cpp | 39 ++++++++------------------------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 15cd162..8df5a55 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -281,6 +281,7 @@ int Hama::initCamera(){ // OUTPUT TRIGGER ---------------------------------------- + err |= getParameter(DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE); // MASTER PULSE ------------------------------------------ // SYNCHRONOUS TIMING ------------------------------------ @@ -508,6 +509,7 @@ asynStatus Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); status = setIntegerParam(hExtractionMode, dvalue); break; + // - output trigger case DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); @@ -515,37 +517,12 @@ asynStatus Hama::getParameter(int propertyID){ break; case DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - }else{ - printf("-----------------> value = %f\n", dvalue); - } - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+100, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - }else{ - printf("-----------------> value = %f\n", dvalue); - } - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+200, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "OUTPUT_TRIGGER_ACTIVE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - }else{ - printf("-----------------> value = %f\n", dvalue); - } - - status = setIntegerParam(hOutputTriggerActive0, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+0x100, &dvalue); + status = setIntegerParam(hOutputTriggerActive1, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+0x200, &dvalue); + status = setIntegerParam(hOutputTriggerActive2, dvalue); break; - //case DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE: - // m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); - // status = setIntegerParam(hOutputTriggerActive1, dvalue); - //break; - //case DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE: - // m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); - // status = setIntegerParam(hOutputTriggerActive2, dvalue); - //break; // - master pulse @@ -1196,7 +1173,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - +/* else if (index == hOutputTriggerActive0) { printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); @@ -1218,7 +1195,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - +*/ else if (index == hOutputTriggerKind0) { printf("[DEBUG]::writeInit32 OutputTriggerKind0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); From 58aefc799d09964fefb060613113e9f901530211 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Tue, 20 Dec 2022 14:24:21 +0100 Subject: [PATCH 32/66] small fix in trigger out implementation --- ADHamaApp/Db/hama.template | 43 ++++---------------------------------- ADHamaApp/src/hama.cpp | 7 ++++--- 2 files changed, 8 insertions(+), 42 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index dd64bf5..557e334 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -658,7 +658,6 @@ record(mbbi, "$(P)$(R)SubarrayMode-RB") { ########################################################################## record(ao, "$(P)$(R)ExposureTime-S") { field(DESC, "") - field(PINI, "YES") field(DTYP, "asynFloat64") field(DRVL, "0.001004") field(DRVH, "10.0") @@ -812,7 +811,7 @@ record(mbbo, "$(P)$(R)OutputTriggerSource0-S") { # field(DRVL, "2") # field(DRVH, "6") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") - field(VAL, "0") + field(VAL, "2") } record(mbbi, "$(P)$(R)OutputTriggerSource0-RB") { @@ -979,17 +978,6 @@ record(mbbi, "$(P)$(R)OutputTriggerPolarity2-RB") { ########################################################################## # Internal Trigger Active (mode 1) -record(mbbo, "$(P)$(R)OutputTriggerActive0-S") { - field(DESC, "") - field(DTYP, "asynInt32") - field(PINI, "YES") - field(ZRVL, "1") - field(ZRST, "Edge") -# field(DRVL, "1") -# field(DRVH, "1") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE0") - field(VAL, "1") -} record(mbbi, "$(P)$(R)OutputTriggerActive0-RB") { field(DESC, "") field(DTYP, "asynInt32") @@ -1000,17 +988,6 @@ record(mbbi, "$(P)$(R)OutputTriggerActive0-RB") { } # Internal Trigger Active (mode 1) -record(mbbo, "$(P)$(R)OutputTriggerActive1-S") { - field(DESC, "") - field(DTYP, "asynInt32") - field(PINI, "YES") - field(ZRVL, "1") - field(ZRST, "Edge") -# field(DRVL, "1") -# field(DRVH, "1") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE1") - field(VAL, "1") -} record(mbbi, "$(P)$(R)OutputTriggerActive1-RB") { field(DESC, "") field(DTYP, "asynInt32") @@ -1021,18 +998,6 @@ record(mbbi, "$(P)$(R)OutputTriggerActive1-RB") { } # Internal Trigger Active (mode 1) -record(mbbo, "$(P)$(R)OutputTriggerActive2-S") { - field(DESC, "") - field(DTYP, "asynInt32") - field(PINI, "YES") - field(ZRVL, "1") - field(ZRST, "Edge") -# field(DRVL, "1") -# field(DRVH, "1") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE2") - field(VAL, "1") -} - record(mbbi, "$(P)$(R)OutputTriggerActive2-RB") { field(DESC, "") field(DTYP, "asynInt32") @@ -1104,7 +1069,7 @@ record(ao, "$(P)$(R)OutputTriggerPeriod0-S") { field(DRVL, "0.000001") field(DRVH, "10.0") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD0") - field(VAL, "0") + field(VAL, "0.000001") } record(ai, "$(P)$(R)OutputTriggerPeriod0-RB") { field(DESC, "") @@ -1121,7 +1086,7 @@ record(ao, "$(P)$(R)OutputTriggerPeriod1-S") { field(DRVL, "0.000001") field(DRVH, "10.0") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD1") - field(VAL, "0") + field(VAL, "0.000001") } record(ai, "$(P)$(R)OutputTriggerPeriod1-RB") { field(DESC, "") @@ -1138,7 +1103,7 @@ record(ao, "$(P)$(R)OutputTriggerPeriod2-S") { field(DRVL, "0.000001") field(DRVH, "10.0") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_PERIOD2") - field(VAL, "0") + field(VAL, "0.000001") } record(ai, "$(P)$(R)OutputTriggerPeriod2-RB") { diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 8df5a55..7fc7b1d 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -282,6 +282,7 @@ int Hama::initCamera(){ // OUTPUT TRIGGER ---------------------------------------- err |= getParameter(DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE); + err |= getParameter(DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR); // MASTER PULSE ------------------------------------------ // SYNCHRONOUS TIMING ------------------------------------ @@ -1173,7 +1174,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } -/* + else if (index == hOutputTriggerActive0) { printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); @@ -1195,7 +1196,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } -*/ + else if (index == hOutputTriggerKind0) { printf("[DEBUG]::writeInit32 OutputTriggerKind0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); @@ -1537,7 +1538,7 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } else if (index == hOutputTriggerPeriod2) { printf("[DEBUG]::function OutputTriggerPeriod2 %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD+200, &dvalue); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD+0x200, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } From e15fafea4b5dc045581badfffbe94f01c1e3aed2 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Fri, 23 Dec 2022 11:36:28 +0100 Subject: [PATCH 33/66] Add shared libraries --- ADHama.Makefile | 2 +- support/dcamsdk4/lib/linux-x86_64/libdcamapi.so | 1 + support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4 | 1 + .../libdcamapi.so.4.0.6269} | Bin 4 files changed, 3 insertions(+), 1 deletion(-) create mode 120000 support/dcamsdk4/lib/linux-x86_64/libdcamapi.so create mode 120000 support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4 rename support/dcamsdk4/lib/{linux/libdcamapi.so => linux-x86_64/libdcamapi.so.4.0.6269} (100%) diff --git a/ADHama.Makefile b/ADHama.Makefile index 9af2285..4324898 100644 --- a/ADHama.Makefile +++ b/ADHama.Makefile @@ -133,7 +133,7 @@ USR_DBFLAGS += -I $(E3_ADCORE_LOCATION)/db USR_DBFLAGS += -I $(EPICS_BASE)/db USR_DBFLAGS += -I $(APPDB) -USR_LDFLAGS += -L$(PWD)/support/dcamsdk4/lib/linux -ldcamapi +USR_LDFLAGS += -L$(PWD)/support/dcamsdk4/lib/linux-x86_64 -ldcamapi #USR_LDFLAGS += -L/usr/local/lib -ldcamapi db: $(SUBS) $(TMPS) diff --git a/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so b/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so new file mode 120000 index 0000000..5225fce --- /dev/null +++ b/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so @@ -0,0 +1 @@ +libdcamapi.so.4.0.6269 \ No newline at end of file diff --git a/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4 b/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4 new file mode 120000 index 0000000..5225fce --- /dev/null +++ b/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4 @@ -0,0 +1 @@ +libdcamapi.so.4.0.6269 \ No newline at end of file diff --git a/support/dcamsdk4/lib/linux/libdcamapi.so b/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4.0.6269 similarity index 100% rename from support/dcamsdk4/lib/linux/libdcamapi.so rename to support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4.0.6269 From ee066ef720af9040d3979196af4d6688dc3802a2 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Fri, 30 Dec 2022 17:21:52 +0100 Subject: [PATCH 34/66] Add frame rate and control to acquire period PV --- ADHamaApp/Db/hama.template | 15 ++++++++-- ADHamaApp/src/hama.cpp | 59 ++++++++++++++++++++++++++++++++------ ADHamaApp/src/hama.h | 4 +-- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 557e334..d3fc562 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -118,6 +118,15 @@ record(ai, "$(P)$(R)TimeStamp-RB") { field(PINI, "YES") } +record(ai, "$(P)$(R)FrameRate-R") { + field(DESC, "Acquisition frame rate") + field(DTYP, "asynFloat64") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_FRAMERATE") + field(PREC, "2") + field(SCAN, "I/O Intr") + field(PINI, "YES") +} + ########################################################################## # General properties # ########################################################################## @@ -1371,10 +1380,8 @@ record(mbbo, "$(P)$(R)MasterPulseMode-S") { field(ONST, "Start") field(TWVL, "3") field(THST, "Burst") -# field(DRVL, "1") -# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_MODE") - field(VAL, "1") + field(VAL, "0") } record(mbbi, "$(P)$(R)MasterPulseMode-RB") { @@ -1423,6 +1430,7 @@ record(ao, "$(P)$(R)MasterPulseInterval-S") { field(DESC, "") field(PINI, "YES") field(DTYP, "asynFloat64") + field(PREC, "6") field(DRVL, "0.00001") field(DRVH, "10") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_INTERVAL") @@ -1432,6 +1440,7 @@ record(ao, "$(P)$(R)MasterPulseInterval-S") { record(ai, "$(P)$(R)MasterPulseInterval-RB") { field(DESC, "") field(DTYP, "asynFloat64") + field(PREC, "6") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_INTERVAL") field(SCAN, "I/O Intr") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 7fc7b1d..298603d 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -18,6 +18,8 @@ // #include +#include +using namespace std; //#define NUM_HAMA_PARAMS ((int)(&LAST_HAMA_PARAM - &FIRST_HAMA_PARAM + 1)) @@ -61,7 +63,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, } //General - createParam( hFrameRateString, asynParamOctet, &hFrameRate); + createParam( hFrameRateString, asynParamFloat64, &hFrameRate); createParam( hHamaNameString, asynParamOctet, &hHamaName); createParam( hVendorString, asynParamOctet, &hVendor); createParam( hModelString, asynParamOctet, &hModel); @@ -729,6 +731,8 @@ void Hama::imageTask(){ int totalImages=0; uint64_t prevAcquisitionCount = 0; DCAMCAP_TRANSFERINFO captransferinfo; + epicsTimeStamp prevAcqTime, currentAcqTime; + double elapsedTime; //static const char *functionName = "imageTask"; @@ -749,6 +753,7 @@ void Hama::imageTask(){ setIntegerParam(ADStatus, ADStatusAcquire); status = startAcquire(); + epicsTimeGetCurrent(&prevAcqTime); printf("Status: %d\n", status); if (status != asynSuccess) { //acquireStatusError = 1; @@ -790,6 +795,7 @@ void Hama::imageTask(){ image = new unsigned char[width * 2 * height]; memset(image, 0, width * 2 * height); + getIntegerParam(NDArrayCounter, &count); count++; setIntegerParam(NDArrayCounter, count); @@ -818,6 +824,12 @@ void Hama::imageTask(){ printf("Timestamp from camera: %f\n", (ts_sec + ts_microsec / 1.0e6)); //printf("Timestamp from camera with correction: %f\n", timestamp); + epicsTimeGetCurrent(¤tAcqTime); + elapsedTime = epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime); + prevAcqTime = currentAcqTime; + + status = setDoubleParam(hFrameRate, (double)(1 / elapsedTime)); + getIntegerParam(NDArrayCallbacks, &callback); if(callback) { @@ -1482,12 +1494,43 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ //-- Feature if(index == ADAcquireTime) { printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); - status = (asynStatus)setFeature(DCAM_IDPROP_EXPOSURETIME, value); + status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } + + double acquire_period = 0; + status = getDoubleParam(ADAcquirePeriod, &acquire_period); + if (value >= acquire_period) { + status = setDoubleParam(ADAcquirePeriod, 0); + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); + callParamCallbacks(); + } } + + if(index == ADAcquirePeriod) { + printf("[DEBUG]::function ADAcquirePeriod from camera: %f\n", value); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + + if (value <= dvalue) { + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); + value = 0; + } + else { + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__MASTERPULSE); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__MASTERPULSE); + + status = setFeature(DCAM_IDPROP_MASTERPULSE_INTERVAL, value); + status = setDoubleParam(hMasterPulseInterval, value); + + status = setFeature(DCAM_IDPROP_MASTERPULSE_MODE, DCAMPROP_MASTERPULSE_MODE__CONTINUOUS); + status = setIntegerParam(hMasterPulseMode, DCAMPROP_MASTERPULSE_MODE__CONTINUOUS); + } + } + //-- Trigger else if (index == hTriggerDelay) { printf("[DEBUG]::function TriggerDelay %f\n", value); @@ -1595,6 +1638,8 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } }*/ + + /* THESE PARAMETERS ARE READ ONLY else if (index == hInternalFrameRate) { int sensorMode = 0; getIntegerParam(hSensorMode, &sensorMode); @@ -1615,6 +1660,8 @@ 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 == hInternalLineSpeed) { printf("[DEBUG]::function InternalLineSpeed %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALLINESPEED, &dvalue); @@ -2243,7 +2290,7 @@ return ! failed( err ); } //============================================================================ -int Hama::setFeature(int featureIndex, double value) { +asynStatus Hama::setFeature(int featureIndex, double value) { DCAMERR err; err = dcamprop_setvalue(m_hdcam, featureIndex, value); if(failed(err)) { @@ -2372,9 +2419,3 @@ extern "C" { epicsExportRegistrar(hamaRegister); } - - - - - - diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 27d94ec..1132aa0 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -6,7 +6,7 @@ #define MAX_FEATURE_NAME_LEN 64 -#define hFrameRateString "H_FRAME_RATE" /* asynOctet ro */ +#define hFrameRateString "H_FRAMERATE" #define hHamaNameString "H_HAMA_NAME" /* asynOctet ro */ #define hVendorString "H_VENDOR" /* asynOctet ro */ #define hModelString "H_MODEL" /* asynOctet ro */ @@ -303,7 +303,7 @@ private: int setParameter(int paramIndex); int getParameterStr(int paramIndex); int getProperties(); - int setFeature(int featureIndex, double value); + asynStatus setFeature(int featureIndex, double value); }; #endif From 4f8962f9e170a6f4455895e39ddb8893b6386087 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 2 Jan 2023 11:55:36 +0100 Subject: [PATCH 35/66] Add conditional to not process time parameters when external trigger is activate --- ADHamaApp/src/hama.cpp | 85 +++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 298603d..3525d4d 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -1481,7 +1481,7 @@ return status; asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ - asynStatus status = asynSuccess; + asynStatus status = asynSuccess; const char* functionName = "writeFloat64"; const char* paramName; @@ -1494,41 +1494,56 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ //-- Feature if(index == ADAcquireTime) { printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); - status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + + int trigger_mode = 0; + getIntegerParam(hTriggerSource, &trigger_mode); + + if (trigger_mode != DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + + double acquire_period = 0; + status = getDoubleParam(ADAcquirePeriod, &acquire_period); + if (value >= acquire_period) { + status = setDoubleParam(ADAcquirePeriod, 0); + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); + callParamCallbacks(); + } } - double acquire_period = 0; - status = getDoubleParam(ADAcquirePeriod, &acquire_period); - if (value >= acquire_period) { - status = setDoubleParam(ADAcquirePeriod, 0); - status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); - status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); - callParamCallbacks(); - } + else status = asynError; } - if(index == ADAcquirePeriod) { + else if(index == ADAcquirePeriod) { printf("[DEBUG]::function ADAcquirePeriod from camera: %f\n", value); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - if (value <= dvalue) { - status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); - status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); - value = 0; - } - else { - status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__MASTERPULSE); - status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__MASTERPULSE); - - status = setFeature(DCAM_IDPROP_MASTERPULSE_INTERVAL, value); - status = setDoubleParam(hMasterPulseInterval, value); - - status = setFeature(DCAM_IDPROP_MASTERPULSE_MODE, DCAMPROP_MASTERPULSE_MODE__CONTINUOUS); - status = setIntegerParam(hMasterPulseMode, DCAMPROP_MASTERPULSE_MODE__CONTINUOUS); + int trigger_mode = 0; + getIntegerParam(hTriggerSource, &trigger_mode); + + if (trigger_mode != DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + + if (value <= dvalue) { + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); + value = 0; + } + else { + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__MASTERPULSE); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__MASTERPULSE); + + status = setFeature(DCAM_IDPROP_MASTERPULSE_INTERVAL, value); + status = setDoubleParam(hMasterPulseInterval, value); + + status = setFeature(DCAM_IDPROP_MASTERPULSE_MODE, DCAMPROP_MASTERPULSE_MODE__CONTINUOUS); + status = setIntegerParam(hMasterPulseMode, DCAMPROP_MASTERPULSE_MODE__CONTINUOUS); + } } + else status = asynError; } //-- Trigger @@ -1716,19 +1731,19 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } } - setDoubleParam(index, value); - status = (asynStatus) callParamCallbacks(); - - if (status) + if (status) asynPrint(pasynUser, ASYN_TRACE_ERROR, "%s:%s: error, status=%d function=%d, paramName=%s, value=%f\n", driverName, functionName, status, index, paramName, value); - else + else { + setDoubleParam(index, value); + callParamCallbacks(); asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: function=%d, paramName=%s, value=%f\n", driverName, functionName, index, paramName, value); + } -return(asynSuccess); + return status; } //============================================================================ From 90d571bb43bd9a3fc52a91774f2754cf5df8c183 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Thu, 2 Feb 2023 17:21:27 +0100 Subject: [PATCH 36/66] add readAtributes, readSensor functions --- ADHamaApp/src/hama.cpp | 133 ++++++++++++++++++++++++++--------------- ADHamaApp/src/hama.h | 8 ++- 2 files changed, 92 insertions(+), 49 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 3525d4d..7694367 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -393,6 +393,86 @@ int Hama::getParameterStr(int propertyID){ return int(status); } + +//============================================================================ +asynStatus Hama::readAttributes(){ + + asynStatus status = asynSuccess; + + getParameter( DCAM_IDPROP_COLORTYPE ); + //status |= getParameter( DCAM_IDPROP_BITSPERCHANNEL ); + status = getParameter( DCAM_IDPROP_IMAGE_ROWBYTES ); + status = getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES ); + status = getParameter( DCAM_IDPROP_IMAGE_TOPOFFSETBYTES ); + //status |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE ); + status = getParameter( DCAM_IDPROP_BUFFER_ROWBYTES ); + status = getParameter( DCAM_IDPROP_BUFFER_FRAMEBYTES ); + status = getParameter( DCAM_IDPROP_BUFFER_TOPOFFSETBYTES ); + status = getParameter( DCAM_IDPROP_BUFFER_PIXELTYPE ); + status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE ); + status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION ); + status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME ); + status = getParameter( DCAM_IDPROP_SYSTEM_ALIVE ); + status = getParameter( DCAM_IDPROP_CONVERSIONFACTOR_COEFF ); + status = getParameter( DCAM_IDPROP_CONVERSIONFACTOR_OFFSET ); + status = getParameter( DCAM_IDPROP_NUMBEROF_VIEW ); + +return status; +} + + +//============================================================================ +asynStatus Hama::readSensor(){ + + + asynStatus status = asynSuccess; + + int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; + double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; + double dvalue = 0; + + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeX, &sizeH); + getIntegerParam(ADSizeY, &sizeV); + getIntegerParam(hBinning, &binning); + + + dbinning = binning; + dminH = minH; + dminV = minV; + dsizeH = sizeH; + dsizeV = sizeV; + double modeON = DCAMPROP_MODE__ON; + double modeOFF = DCAMPROP_MODE__OFF; + + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + status = setIntegerParam(ADBinX, dvalue); + status = setIntegerParam(ADBinY, dvalue); + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); + //m_err = dcamprop_getvalue(m_hdcam, , &dvalue); + + + + + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); + + + callParamCallbacks(); + +return status; +} + + //============================================================================ asynStatus Hama::getParameter(int propertyID){ @@ -959,16 +1039,16 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[DEBUG]::writeInit32 ADNumExposures\n"); } else if (index == ADMinX) { - updateSensorSize(); + readSensor(); } else if (index == ADMinY) { - updateSensorSize(); + readSensor(); } else if (index == ADSizeX) { - updateSensorSize(); + readSensor(); } else if (index == ADSizeY) { - updateSensorSize(); + readSensor(); } else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); @@ -1066,7 +1146,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ */ //-- binning and ROI else if (index == hBinning) { - updateSensorSize(); + readSensor(); printf("[DEBUG]::writeInit32 Binning %d\n", value); } else if (index == hSubarrayHPos) { @@ -1746,49 +1826,6 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ return status; } -//============================================================================ -asynStatus Hama::updateSensorSize(){ - - - asynStatus status = asynSuccess; - - int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; - double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; - double dvalue = 0; - - getIntegerParam(ADMinX, &minH); - getIntegerParam(ADMinY, &minV); - getIntegerParam(ADSizeX, &sizeH); - getIntegerParam(ADSizeY, &sizeV); - getIntegerParam(hBinning, &binning); - - - dbinning = binning; - dminH = minH; - dminV = minV; - dsizeH = sizeH; - dsizeV = sizeV; - double modeON = DCAMPROP_MODE__ON; - double modeOFF = DCAMPROP_MODE__OFF; - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - status = setIntegerParam(ADBinX, dvalue); - status = setIntegerParam(ADBinY, dvalue); - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); - - - callParamCallbacks(); - -return status; -} //============================================================================ void Hama::report(FILE *fp, int details){ diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 1132aa0..9e5bfda 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -289,10 +289,15 @@ private: int allocateBuffers(unsigned int); int freeBuffers(); + // These function will be read only once int connectCamera(); int disconnectCamera(); int initCamera(); - asynStatus updateSensorSize(); + + // These function can be read more than once + asynStatus readAttributes(); + asynStatus readSensor(); + asynStatus getParameter(int paramIndex); @@ -303,6 +308,7 @@ private: int setParameter(int paramIndex); int getParameterStr(int paramIndex); int getProperties(); + asynStatus setFeature(int featureIndex, double value); }; From 37607c5f23a6a22b83205873882eb5690b15436d Mon Sep 17 00:00:00 2001 From: Iocuser Date: Mon, 6 Feb 2023 13:20:07 +0100 Subject: [PATCH 37/66] Add adpluginkafka --- cmds/st.cmd | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmds/st.cmd b/cmds/st.cmd index ac29702..b693a0f 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -1,5 +1,6 @@ # This should be a test startup script require adhama +require adpluginkafka epicsEnvSet("PREFIX", "Hama:") @@ -36,6 +37,15 @@ dbLoadRecords("$(adcore_DIR)/db/NDPva.template", "P=$(PREFIX),R=Pva1:, PORT=PVA NDStdArraysConfigure("Image1", "$(QSIZE)", 0, "$(PORT)", 0, 0) dbLoadRecords("NDStdArrays.template", "P=$(PREFIX),R=image1:,PORT=Image1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),TYPE=Int32,FTVL=LONG,NELEMENTS=$(NELEMENTS)") +# Create a kafka plugin, set it to get data from hama driver. +epicsEnvSet("KFK_SERVER_IP", "10.100.1.19") +epicsEnvSet("KFK_SERVER_PORT", "9092") +epicsEnvSet("KFK_TOPIC", "ymir_camera") + +KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_SERVER_IP):$(KFK_SERVER_PORT)", "$(KFK_TOPIC)", "hama_source") +dbLoadRecords("$(adpluginkafka_DIR)db/adpluginkafka.db", "P=$(PREFIX), R=Kfk1:, PORT=KFK1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)") + + startPVAServer # @@ -49,6 +59,7 @@ iocInit() dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 +dbpf Hama:Kfk1:EnableCallbacks 1 epicsThreadSleep(1.0) From 7dc9fd7cb332a3bd0bc4fd809241316bd26a2edf Mon Sep 17 00:00:00 2001 From: Iocuser Date: Thu, 2 Feb 2023 17:21:27 +0100 Subject: [PATCH 38/66] add readAtributes, readSensor functions --- ADHamaApp/src/hama.cpp | 133 ++++++++++++++++++++++++++--------------- ADHamaApp/src/hama.h | 8 ++- 2 files changed, 92 insertions(+), 49 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 3525d4d..7694367 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -393,6 +393,86 @@ int Hama::getParameterStr(int propertyID){ return int(status); } + +//============================================================================ +asynStatus Hama::readAttributes(){ + + asynStatus status = asynSuccess; + + getParameter( DCAM_IDPROP_COLORTYPE ); + //status |= getParameter( DCAM_IDPROP_BITSPERCHANNEL ); + status = getParameter( DCAM_IDPROP_IMAGE_ROWBYTES ); + status = getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES ); + status = getParameter( DCAM_IDPROP_IMAGE_TOPOFFSETBYTES ); + //status |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE ); + status = getParameter( DCAM_IDPROP_BUFFER_ROWBYTES ); + status = getParameter( DCAM_IDPROP_BUFFER_FRAMEBYTES ); + status = getParameter( DCAM_IDPROP_BUFFER_TOPOFFSETBYTES ); + status = getParameter( DCAM_IDPROP_BUFFER_PIXELTYPE ); + status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE ); + status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION ); + status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME ); + status = getParameter( DCAM_IDPROP_SYSTEM_ALIVE ); + status = getParameter( DCAM_IDPROP_CONVERSIONFACTOR_COEFF ); + status = getParameter( DCAM_IDPROP_CONVERSIONFACTOR_OFFSET ); + status = getParameter( DCAM_IDPROP_NUMBEROF_VIEW ); + +return status; +} + + +//============================================================================ +asynStatus Hama::readSensor(){ + + + asynStatus status = asynSuccess; + + int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; + double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; + double dvalue = 0; + + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeX, &sizeH); + getIntegerParam(ADSizeY, &sizeV); + getIntegerParam(hBinning, &binning); + + + dbinning = binning; + dminH = minH; + dminV = minV; + dsizeH = sizeH; + dsizeV = sizeV; + double modeON = DCAMPROP_MODE__ON; + double modeOFF = DCAMPROP_MODE__OFF; + + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + status = setIntegerParam(ADBinX, dvalue); + status = setIntegerParam(ADBinY, dvalue); + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); + //m_err = dcamprop_getvalue(m_hdcam, , &dvalue); + + + + + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); + + + callParamCallbacks(); + +return status; +} + + //============================================================================ asynStatus Hama::getParameter(int propertyID){ @@ -959,16 +1039,16 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[DEBUG]::writeInit32 ADNumExposures\n"); } else if (index == ADMinX) { - updateSensorSize(); + readSensor(); } else if (index == ADMinY) { - updateSensorSize(); + readSensor(); } else if (index == ADSizeX) { - updateSensorSize(); + readSensor(); } else if (index == ADSizeY) { - updateSensorSize(); + readSensor(); } else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); @@ -1066,7 +1146,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ */ //-- binning and ROI else if (index == hBinning) { - updateSensorSize(); + readSensor(); printf("[DEBUG]::writeInit32 Binning %d\n", value); } else if (index == hSubarrayHPos) { @@ -1746,49 +1826,6 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ return status; } -//============================================================================ -asynStatus Hama::updateSensorSize(){ - - - asynStatus status = asynSuccess; - - int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; - double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; - double dvalue = 0; - - getIntegerParam(ADMinX, &minH); - getIntegerParam(ADMinY, &minV); - getIntegerParam(ADSizeX, &sizeH); - getIntegerParam(ADSizeY, &sizeV); - getIntegerParam(hBinning, &binning); - - - dbinning = binning; - dminH = minH; - dminV = minV; - dsizeH = sizeH; - dsizeV = sizeV; - double modeON = DCAMPROP_MODE__ON; - double modeOFF = DCAMPROP_MODE__OFF; - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - status = setIntegerParam(ADBinX, dvalue); - status = setIntegerParam(ADBinY, dvalue); - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); - - - callParamCallbacks(); - -return status; -} //============================================================================ void Hama::report(FILE *fp, int details){ diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 1132aa0..9e5bfda 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -289,10 +289,15 @@ private: int allocateBuffers(unsigned int); int freeBuffers(); + // These function will be read only once int connectCamera(); int disconnectCamera(); int initCamera(); - asynStatus updateSensorSize(); + + // These function can be read more than once + asynStatus readAttributes(); + asynStatus readSensor(); + asynStatus getParameter(int paramIndex); @@ -303,6 +308,7 @@ private: int setParameter(int paramIndex); int getParameterStr(int paramIndex); int getProperties(); + asynStatus setFeature(int featureIndex, double value); }; From e7d48816d25afd0e45edeb770d5b6eeaaa28ea36 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Mon, 6 Feb 2023 13:20:07 +0100 Subject: [PATCH 39/66] Add adpluginkafka --- cmds/st.cmd | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmds/st.cmd b/cmds/st.cmd index ac29702..b693a0f 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -1,5 +1,6 @@ # This should be a test startup script require adhama +require adpluginkafka epicsEnvSet("PREFIX", "Hama:") @@ -36,6 +37,15 @@ dbLoadRecords("$(adcore_DIR)/db/NDPva.template", "P=$(PREFIX),R=Pva1:, PORT=PVA NDStdArraysConfigure("Image1", "$(QSIZE)", 0, "$(PORT)", 0, 0) dbLoadRecords("NDStdArrays.template", "P=$(PREFIX),R=image1:,PORT=Image1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),TYPE=Int32,FTVL=LONG,NELEMENTS=$(NELEMENTS)") +# Create a kafka plugin, set it to get data from hama driver. +epicsEnvSet("KFK_SERVER_IP", "10.100.1.19") +epicsEnvSet("KFK_SERVER_PORT", "9092") +epicsEnvSet("KFK_TOPIC", "ymir_camera") + +KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_SERVER_IP):$(KFK_SERVER_PORT)", "$(KFK_TOPIC)", "hama_source") +dbLoadRecords("$(adpluginkafka_DIR)db/adpluginkafka.db", "P=$(PREFIX), R=Kfk1:, PORT=KFK1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)") + + startPVAServer # @@ -49,6 +59,7 @@ iocInit() dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 +dbpf Hama:Kfk1:EnableCallbacks 1 epicsThreadSleep(1.0) From b6de30a14443cb4b10500d2cf4786abe6dcf4af8 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Mon, 6 Feb 2023 16:37:54 +0100 Subject: [PATCH 40/66] check and update getParameters --- ADHamaApp/src/hama.cpp | 141 ++++++++++++++++++++++++++++++++++------- 1 file changed, 117 insertions(+), 24 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 7694367..803e2aa 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -480,22 +480,22 @@ asynStatus Hama::getParameter(int propertyID){ double dvalue = 0; switch (propertyID){ - // - sensor mode and speed - case DCAM_IDPROP_SENSORMODE: + // - sensor mode and speed + case DCAM_IDPROP_SENSORMODE: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "SENSOR MODE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } status = setIntegerParam(hSensorMode, dvalue); break; - case DCAM_IDPROP_READOUTSPEED: + case DCAM_IDPROP_READOUTSPEED: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "READOUT SPEED", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); } status = setIntegerParam(hReadoutSpeed, dvalue); break; - case DCAM_IDPROP_READOUT_DIRECTION: + case DCAM_IDPROP_READOUT_DIRECTION: // (RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "R DIRECTION", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); @@ -503,92 +503,104 @@ asynStatus Hama::getParameter(int propertyID){ status = setIntegerParam(hReadoutDirection, dvalue); break; // - trigger - case DCAM_IDPROP_TRIGGERSOURCE: + case DCAM_IDPROP_TRIGGERSOURCE: // (RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &dvalue); status = setIntegerParam(hTriggerSource, dvalue); break; - case DCAM_IDPROP_TRIGGER_MODE: + case DCAM_IDPROP_TRIGGER_MODE: // (RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); status = setIntegerParam(hTriggerMode, dvalue); break; - case DCAM_IDPROP_TRIGGERACTIVE: + case DCAM_IDPROP_TRIGGERACTIVE: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &dvalue); status = setIntegerParam(hTriggerActive, dvalue); break; - case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: + case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); status = setIntegerParam(hTriggerGlobalExposure, dvalue); break; - case DCAM_IDPROP_TRIGGERPOLARITY: + case DCAM_IDPROP_TRIGGERPOLARITY: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &dvalue); status = setIntegerParam(hTriggerPolarity, dvalue); break; - case DCAM_IDPROP_TRIGGER_CONNECTOR: + case DCAM_IDPROP_TRIGGER_CONNECTOR: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); status = setIntegerParam(hTriggerConnector, dvalue); break; - case DCAM_IDPROP_TRIGGERTIMES: + case DCAM_IDPROP_TRIGGERTIMES: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); status = setIntegerParam(hTriggerTimes, dvalue); break; - case DCAM_IDPROP_TRIGGERDELAY: + case DCAM_IDPROP_TRIGGERDELAY: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &dvalue); status = setDoubleParam(hTriggerDelay, dvalue); break; - case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: + case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: //(RW12-) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); status = setIntegerParam(hInternalTriggerHandling, dvalue); break; // - sensor cooler - case DCAM_IDPROP_SENSORCOOLERSTATUS: + case DCAM_IDPROP_SENSORCOOLERSTATUS: //(R) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); status = setIntegerParam(hSensorCoolerStatus, dvalue); break; + // - sensor temperature in a thread + // - binning and roi - case DCAM_IDPROP_BINNING: + case DCAM_IDPROP_BINNING: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &dvalue); status = setIntegerParam(hBinning, dvalue); break; - case DCAM_IDPROP_SUBARRAYHSIZE: + case DCAM_IDPROP_SUBARRAYHSIZE: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dvalue); status = setIntegerParam(ADSizeX, dvalue); break; - case DCAM_IDPROP_SUBARRAYVSIZE: + case DCAM_IDPROP_SUBARRAYVSIZE: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dvalue); status = setIntegerParam(ADSizeY, dvalue); break; - case DCAM_IDPROP_SUBARRAYHPOS: + case DCAM_IDPROP_SUBARRAYHPOS: //(RW---) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dvalue); status = setIntegerParam(ADMinX, dvalue); break; - case DCAM_IDPROP_SUBARRAYVPOS: + case DCAM_IDPROP_SUBARRAYVPOS: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dvalue); status = setIntegerParam(ADMinY, dvalue); break; + + case DCAM_IDPROP_SUBARRAYMODE: //(RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &dvalue); + status = setIntegerParam(hSubarrayMode, dvalue); + break; + // - feature + case DCAM_IDPROP_EXPOSURETIME: //(RW123) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + status = setIntegerParam(hExposureTime, dvalue); + break; // - alu - case DCAM_IDPROP_DEFECTCORRECT_MODE: + case DCAM_IDPROP_DEFECTCORRECT_MODE: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); status = setIntegerParam(hDefectCorrectMode, dvalue); break; - case DCAM_IDPROP_HOTPIXELCORRECT_LEVEL: + case DCAM_IDPROP_HOTPIXELCORRECT_LEVEL: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_HOTPIXELCORRECT_LEVEL, &dvalue); status = setIntegerParam(hHotPixelCorrectLevel, dvalue); break; - case DCAM_IDPROP_INTENSITYLUT_MODE: + case DCAM_IDPROP_INTENSITYLUT_MODE: //(RW123) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); status = setIntegerParam(hIntensityLutMode, dvalue); break; - case DCAM_IDPROP_INTENSITYLUT_PAGE: + case DCAM_IDPROP_INTENSITYLUT_PAGE: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_PAGE, &dvalue); status = setIntegerParam(hIntensityLutPage, dvalue); break; - case DCAM_IDPROP_EXTRACTION_MODE: + case DCAM_IDPROP_EXTRACTION_MODE: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); status = setIntegerParam(hExtractionMode, dvalue); break; @@ -598,6 +610,25 @@ asynStatus Hama::getParameter(int propertyID){ m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); status = setIntegerParam(hNumberOfOutputTriggerConnector, dvalue); break; + + case DCAM_IDPROP_OUTPUTTRIGGER_SOURCE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE, &dvalue); + status = setIntegerParam(hOutputTriggerSource0, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE+0x100, &dvalue); + status = setIntegerParam(hOutputTriggerSource1, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_SOURCE+0x200, &dvalue); + status = setIntegerParam(hOutputTriggerSource2, dvalue); + break; + + case DCAM_IDPROP_OUTPUTTRIGGER_POLARITY: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &dvalue); + status = setIntegerParam(hOutputTriggerPolarity0, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY+0x100, &dvalue); + status = setIntegerParam(hOutputTriggerPolarity1, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY+0x200, &dvalue); + status = setIntegerParam(hOutputTriggerPolarity2, dvalue); + break; + case DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); status = setIntegerParam(hOutputTriggerActive0, dvalue); @@ -607,7 +638,69 @@ asynStatus Hama::getParameter(int propertyID){ status = setIntegerParam(hOutputTriggerActive2, dvalue); break; + case DCAM_IDPROP_OUTPUTTRIGGER_DELAY: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY, &dvalue); + status = setIntegerParam(hOutputTriggerDelay0, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY+0x100, &dvalue); + status = setIntegerParam(hOutputTriggerDelay1, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_DELAY+0x200, &dvalue); + status = setIntegerParam(hOutputTriggerDelay2, dvalue); + break; + + case DCAM_IDPROP_OUTPUTTRIGGER_PERIOD: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD, &dvalue); + status = setIntegerParam(hOutputTriggerPeriod0, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD+0x100, &dvalue); + status = setIntegerParam(hOutputTriggerPeriod1, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PERIOD+0x200, &dvalue); + status = setIntegerParam(hOutputTriggerPeriod2, dvalue); + break; + + case DCAM_IDPROP_OUTPUTTRIGGER_KIND: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); + status = setIntegerParam(hOutputTriggerKind0, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND+0x100, &dvalue); + status = setIntegerParam(hOutputTriggerKind1, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND+0x200, &dvalue); + status = setIntegerParam(hOutputTriggerKind2, dvalue); + break; + + case DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR, &dvalue); + status = setIntegerParam(hOutputTriggerBaseSensor0, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR+0x100, &dvalue); + status = setIntegerParam(hOutputTriggerBaseSensor1, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_BASESENSOR+0x200, &dvalue); + status = setIntegerParam(hOutputTriggerBaseSensor2, dvalue); + break; + + case DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_PREHSYNCCOUNT, &dvalue); + status = setIntegerParam(hOutputTriggerPreHsyncCount, dvalue); + break; + + // - master pulse + case DCAM_IDPROP_MASTERPULSE_MODE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_MODE, &dvalue); + status = setIntegerParam(hMasterPulseMode, dvalue); + break; + + case DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_TRIGGERSOURCE, &dvalue); + status = setIntegerParam(hMasterPulseTriggerSource, dvalue); + break; + + case DCAM_IDPROP_MASTERPULSE_INTERVAL: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_INTERVAL, &dvalue); + status = setIntegerParam(hMasterPulseInterval, dvalue); + break; + + case DCAM_IDPROP_MASTERPULSE_BURSTTIMES: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); + status = setIntegerParam(hMasterPulseBurstTimes, dvalue); + break; + // - synchronous timing case DCAM_IDPROP_TIMING_READOUTTIME: From 27dabf4fdcde1c382586cd75c2d573b0c7ff5605 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Wed, 8 Feb 2023 11:33:44 +0100 Subject: [PATCH 41/66] remove comments and old code --- ADHamaApp/src/hama.cpp | 534 +++++++++-------------------------------- ADHamaApp/src/hama.h | 22 +- 2 files changed, 127 insertions(+), 429 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 803e2aa..e235a6f 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -193,16 +193,6 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, printf("\n\n============================ Init Camera =========================\n"); initCamera(); - - printf("[DEBUG]:: FIRST_HAMA_PARAM = %d \n", FIRST_HAMA_PARAM); - //printf("[-DEBUG]:: FIRST_HAMA_PARAM = %d / LAST_HAMA_PARAM = %d, %d)\n", - //FIRST_HAMA_PARAM, LAST_HAMA_PARAM, NUM_HAMA_PARAMS); - - // printf("\n\n============================ Info Camera =========================\n"); - //dcamcon_show_dcamdev_info( m_hdcam ); - //printf("\n\n============================ Info Camera Details =================\n"); - //dcamcon_show_dcamdev_info_detail( m_hdcam ) - printf("\n\n============================ Start Threads =======================\n"); /* launch image read task */ epicsThreadCreate("HamaImageTask", @@ -233,93 +223,94 @@ int Hama::initCamera(){ int err = 0; - err |= getParameterStr(DCAM_IDSTR_VENDOR); - err |= getParameterStr(DCAM_IDSTR_MODEL); - err |= getParameterStr(DCAM_IDSTR_CAMERAID); - err |= getParameterStr(DCAM_IDSTR_BUS); - err |= getParameterStr(DCAM_IDSTR_CAMERAVERSION); - err |= getParameterStr(DCAM_IDSTR_DRIVERVERSION); - err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); - err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); + err |= readParameterStr(DCAM_IDSTR_VENDOR); + err |= readParameterStr(DCAM_IDSTR_MODEL); + err |= readParameterStr(DCAM_IDSTR_CAMERAID); + err |= readParameterStr(DCAM_IDSTR_BUS); + err |= readParameterStr(DCAM_IDSTR_CAMERAVERSION); + err |= readParameterStr(DCAM_IDSTR_DRIVERVERSION); + err |= readParameterStr(DCAM_IDSTR_MODULEVERSION); + err |= readParameterStr(DCAM_IDSTR_DCAMAPIVERSION); // SENSOR MODE AND SPEED ------------------------ - err |= getParameter(DCAM_IDPROP_SENSORMODE); - err |= getParameter(DCAM_IDPROP_READOUTSPEED); - err |= getParameter(DCAM_IDPROP_READOUT_DIRECTION); + err |= readParameter(DCAM_IDPROP_SENSORMODE); + err |= readParameter(DCAM_IDPROP_READOUTSPEED); + err |= readParameter(DCAM_IDPROP_READOUT_DIRECTION); // TRIGGER -------------------------------------- - err |= getParameter(DCAM_IDPROP_TRIGGERSOURCE); - err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); - err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); - err |= getParameter(DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE); - err |= getParameter(DCAM_IDPROP_TRIGGERPOLARITY); - err |= getParameter(DCAM_IDPROP_TRIGGER_CONNECTOR); - err |= getParameter(DCAM_IDPROP_TRIGGERTIMES); - err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); - err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); + err |= readParameter(DCAM_IDPROP_TRIGGERSOURCE); + err |= readParameter(DCAM_IDPROP_TRIGGER_MODE); + err |= readParameter(DCAM_IDPROP_TRIGGERACTIVE); + err |= readParameter(DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE); + err |= readParameter(DCAM_IDPROP_TRIGGERPOLARITY); + err |= readParameter(DCAM_IDPROP_TRIGGER_CONNECTOR); + err |= readParameter(DCAM_IDPROP_TRIGGERTIMES); + err |= readParameter(DCAM_IDPROP_TRIGGERDELAY); + err |= readParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); // BINNING AND ROI ------------------------------ - err |= getParameter( DCAM_IDPROP_BINNING); - err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); - err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); - err |= getParameter( DCAM_IDPROP_SUBARRAYHSIZE); - err |= getParameter( DCAM_IDPROP_SUBARRAYVSIZE); - err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); - err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); - err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); - err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); - err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); - //SUBARRAYMODE + err |= readParameter( DCAM_IDPROP_BINNING); + err |= readParameter( DCAM_IDPROP_SUBARRAYHPOS); + err |= readParameter( DCAM_IDPROP_SUBARRAYVPOS); + err |= readParameter( DCAM_IDPROP_SUBARRAYHSIZE); + err |= readParameter( DCAM_IDPROP_SUBARRAYVSIZE); + err |= readParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); + err |= readParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); + err |= readParameter( DCAM_IDPROP_IMAGE_WIDTH); + err |= readParameter( DCAM_IDPROP_IMAGE_ROWBYTES); + err |= readParameter( DCAM_IDPROP_IMAGE_HEIGHT); + // SUBARRAYMODE ------------------------------------------ + // FEATURE ----------------------------------------------- - //EXPOSURETIME + + // EXPOSURETIME ------------------------------------------ // ALU --------------------------------------------------- - err |= getParameter( DCAM_IDPROP_DEFECTCORRECT_MODE); - err |= getParameter( DCAM_IDPROP_HOTPIXELCORRECT_LEVEL); - err |= getParameter( DCAM_IDPROP_INTENSITYLUT_MODE); - err |= getParameter( DCAM_IDPROP_INTENSITYLUT_PAGE); - err |= getParameter( DCAM_IDPROP_EXTRACTION_MODE); + err |= readParameter( DCAM_IDPROP_DEFECTCORRECT_MODE); + err |= readParameter( DCAM_IDPROP_HOTPIXELCORRECT_LEVEL); + err |= readParameter( DCAM_IDPROP_INTENSITYLUT_MODE); + err |= readParameter( DCAM_IDPROP_INTENSITYLUT_PAGE); + err |= readParameter( DCAM_IDPROP_EXTRACTION_MODE); // OUTPUT TRIGGER ---------------------------------------- - - err |= getParameter(DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE); - err |= getParameter(DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR); + err |= readParameter(DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE); + err |= readParameter(DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR); // MASTER PULSE ------------------------------------------ // SYNCHRONOUS TIMING ------------------------------------ - err |= getParameter( DCAM_IDPROP_TIMING_READOUTTIME); - err |= getParameter( DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD); - err |= getParameter( DCAM_IDPROP_TIMING_MINTRIGGERBLANKING); - err |= getParameter( DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL); - err |= getParameter( DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY); - err |= getParameter( DCAM_IDPROP_TIMING_EXPOSURE); - err |= getParameter( DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD); - err |= getParameter( DCAM_IDPROP_INTERNALFRAMERATE); - err |= getParameter( DCAM_IDPROP_INTERNAL_FRAMEINTERVAL); - err |= getParameter( DCAM_IDPROP_INTERNALLINESPEED); - err |= getParameter( DCAM_IDPROP_INTERNAL_LINEINTERVAL); + err |= readParameter( DCAM_IDPROP_TIMING_READOUTTIME); + err |= readParameter( DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD); + err |= readParameter( DCAM_IDPROP_TIMING_MINTRIGGERBLANKING); + err |= readParameter( DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL); + err |= readParameter( DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY); + err |= readParameter( DCAM_IDPROP_TIMING_EXPOSURE); + err |= readParameter( DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD); + err |= readParameter( DCAM_IDPROP_INTERNALFRAMERATE); + err |= readParameter( DCAM_IDPROP_INTERNAL_FRAMEINTERVAL); + err |= readParameter( DCAM_IDPROP_INTERNALLINESPEED); + err |= readParameter( DCAM_IDPROP_INTERNAL_LINEINTERVAL); // SYSTEM INFORMATION ------------------------------------ - err |= getParameter(DCAM_IDPROP_COLORTYPE); - err |= getParameter(DCAM_IDPROP_BITSPERCHANNEL); - err |= getParameter(DCAM_IDPROP_IMAGE_TOPOFFSETBYTES); - err |= getParameter(DCAM_IDPROP_BUFFER_ROWBYTES); - err |= getParameter(DCAM_IDPROP_BUFFER_FRAMEBYTES); - err |= getParameter(DCAM_IDPROP_BUFFER_TOPOFFSETBYTES); - err |= getParameter(DCAM_IDPROP_BUFFER_PIXELTYPE); - err |= getParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE); - err |= getParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION); - err |= getParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME); - err |= getParameter(DCAM_IDPROP_SYSTEM_ALIVE); - err |= getParameter(DCAM_IDPROP_CONVERSIONFACTOR_COEFF); - err |= getParameter(DCAM_IDPROP_CONVERSIONFACTOR_OFFSET); - err |= getParameter(DCAM_IDPROP_NUMBEROF_VIEW); - err |= getParameter(DCAM_IDPROP_TIMESTAMP_PRODUCER); - err |= getParameter(DCAM_IDPROP_FRAMESTAMP_PRODUCER); + err |= readParameter(DCAM_IDPROP_COLORTYPE); + err |= readParameter(DCAM_IDPROP_BITSPERCHANNEL); + err |= readParameter(DCAM_IDPROP_IMAGE_TOPOFFSETBYTES); + err |= readParameter(DCAM_IDPROP_BUFFER_ROWBYTES); + err |= readParameter(DCAM_IDPROP_BUFFER_FRAMEBYTES); + err |= readParameter(DCAM_IDPROP_BUFFER_TOPOFFSETBYTES); + err |= readParameter(DCAM_IDPROP_BUFFER_PIXELTYPE); + err |= readParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE); + err |= readParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION); + err |= readParameter(DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME); + err |= readParameter(DCAM_IDPROP_SYSTEM_ALIVE); + err |= readParameter(DCAM_IDPROP_CONVERSIONFACTOR_COEFF); + err |= readParameter(DCAM_IDPROP_CONVERSIONFACTOR_OFFSET); + err |= readParameter(DCAM_IDPROP_NUMBEROF_VIEW); + err |= readParameter(DCAM_IDPROP_TIMESTAMP_PRODUCER); + err |= readParameter(DCAM_IDPROP_FRAMESTAMP_PRODUCER); - err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); - err |= getParameter(DETECTOR_PIXEL_NUM_VERT); + err |= readParameter(DETECTOR_PIXEL_NUM_HORZ); + err |= readParameter(DETECTOR_PIXEL_NUM_VERT); if(err){ @@ -330,7 +321,7 @@ return err; } //============================================================================ -int Hama::getParameterStr(int propertyID){ +int Hama::readParameterStr(int propertyID){ asynStatus status = asynSuccess; @@ -391,33 +382,33 @@ int Hama::getParameterStr(int propertyID){ callParamCallbacks(); -return int(status); +return status; } //============================================================================ asynStatus Hama::readAttributes(){ - asynStatus status = asynSuccess; + int status = 0; - getParameter( DCAM_IDPROP_COLORTYPE ); - //status |= getParameter( DCAM_IDPROP_BITSPERCHANNEL ); - status = getParameter( DCAM_IDPROP_IMAGE_ROWBYTES ); - status = getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES ); - status = getParameter( DCAM_IDPROP_IMAGE_TOPOFFSETBYTES ); - //status |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE ); - status = getParameter( DCAM_IDPROP_BUFFER_ROWBYTES ); - status = getParameter( DCAM_IDPROP_BUFFER_FRAMEBYTES ); - status = getParameter( DCAM_IDPROP_BUFFER_TOPOFFSETBYTES ); - status = getParameter( DCAM_IDPROP_BUFFER_PIXELTYPE ); - status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE ); - status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION ); - status = getParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME ); - status = getParameter( DCAM_IDPROP_SYSTEM_ALIVE ); - status = getParameter( DCAM_IDPROP_CONVERSIONFACTOR_COEFF ); - status = getParameter( DCAM_IDPROP_CONVERSIONFACTOR_OFFSET ); - status = getParameter( DCAM_IDPROP_NUMBEROF_VIEW ); + readParameter( DCAM_IDPROP_COLORTYPE ); + //status |= readParameter( DCAM_IDPROP_BITSPERCHANNEL ); + status = readParameter( DCAM_IDPROP_IMAGE_ROWBYTES ); + status = readParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES ); + status = readParameter( DCAM_IDPROP_IMAGE_TOPOFFSETBYTES ); + //status |= readParameter( DCAM_IDPROP_IMAGE_PIXELTYPE ); + status = readParameter( DCAM_IDPROP_BUFFER_ROWBYTES ); + status = readParameter( DCAM_IDPROP_BUFFER_FRAMEBYTES ); + status = readParameter( DCAM_IDPROP_BUFFER_TOPOFFSETBYTES ); + status = readParameter( DCAM_IDPROP_BUFFER_PIXELTYPE ); + status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE ); + status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION ); + status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME ); + status = readParameter( DCAM_IDPROP_SYSTEM_ALIVE ); + status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_COEFF ); + status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_OFFSET ); + status = readParameter( DCAM_IDPROP_NUMBEROF_VIEW ); -return status; +return (asynStatus)status; } @@ -474,7 +465,7 @@ return status; //============================================================================ -asynStatus Hama::getParameter(int propertyID){ +int Hama::readParameter(int propertyID){ asynStatus status = asynSuccess; double dvalue = 0; @@ -483,23 +474,14 @@ asynStatus Hama::getParameter(int propertyID){ // - sensor mode and speed case DCAM_IDPROP_SENSORMODE: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "SENSOR MODE", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } status = setIntegerParam(hSensorMode, dvalue); break; case DCAM_IDPROP_READOUTSPEED: //(RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "READOUT SPEED", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } status = setIntegerParam(hReadoutSpeed, dvalue); break; case DCAM_IDPROP_READOUT_DIRECTION: // (RW1--) m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "R DIRECTION", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } status = setIntegerParam(hReadoutDirection, dvalue); break; // - trigger @@ -819,30 +801,18 @@ asynStatus Hama::getParameter(int propertyID){ break; case DCAM_IDPROP_IMAGE_WIDTH: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "IMAGE WIDTH", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } status = setIntegerParam(ADBinX, dvalue); break; case DCAM_IDPROP_IMAGE_HEIGHT: m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "IMAGE HEIGHT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } status = setIntegerParam(ADBinY, (int)dvalue); break; case DETECTOR_PIXEL_NUM_HORZ: m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_HORZ", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } status = setIntegerParam(ADMaxSizeX, dvalue); break; case DETECTOR_PIXEL_NUM_VERT: m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "DETECT)R_PIXEL_SIZE_VERT", "IDPROP:0x%08x, VALUE:%f\n", propertyID, dvalue); - } status = setIntegerParam(ADMaxSizeY, dvalue); break; case DCAM_IDPROP_TIMESTAMP_PRODUCER: @@ -868,29 +838,19 @@ asynStatus Hama::getParameter(int propertyID){ /* Do callbacks so higher layers see any changes */ status = callParamCallbacks(); - + /* + if (status) + asynPrint(0, ASYN_TRACE_ERROR, + "%s:%s: error, status=%d function=%d, paramName=%s, value=%d\n", + driverName, functionName, status, index, paramName, value); + else + asynPrint(NULL, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, paramName=%s, value=%d\n", + driverName, functionName, index, paramName, value); +*/ return status; } -//============================================================================ -int Hama::setParameter(int paramIndex){ -/* - setIntegerParam(ADBinY, 2048); - setIntegerParam(ADBinX, 2048); - setIntegerParam(NDNDimensions, 1); - setIntegerParam(NDArrayCounter, 1); - setIntegerParam(NDDataType, NDUInt16); - setIntegerParam(NDColorMode, NDColorModeMono); - setIntegerParam(NDArraySizeZ, 0); - setIntegerParam(NDArraySize, 5000000); - setStringParam(ADStringToServer, ""); - setStringParam(ADStringFromServer, ""); - setStringParam(ADManufacturer, "Hamamatsu"); -*/ - - -return 0; -} //============================================================================ void Hama::imageTask(){ @@ -1227,16 +1187,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - //-- sensor cooler - implemented in the temperature task - /* - else if (index == hSensorCoolerStatus) { - printf("[DEBUG]::writeInit32 SensorCoolerStatus %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORCOOLERSTATUS, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - */ + //-- binning and ROI else if (index == hBinning) { readSensor(); @@ -1308,6 +1259,14 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else if (index == hIntensityLutMode) { + printf("[DEBUG]::writeInit32 IntensityLutMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + /* else if (index == hExtractionMode) { printf("[DEBUG]::writeInit32 ExtractionMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXTRACTION_MODE, &dvalue); @@ -1315,6 +1274,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + */ //-- Output trigger else if (index == hOutputTriggerSource0) { printf("[DEBUG]::writeInit32 OutputTriggerSource0 %d\n", value); @@ -1360,28 +1320,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } } - else if (index == hOutputTriggerActive0) { - printf("[DEBUG]::writeInit32 OutputTriggerActive0 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerActive1) { - printf("[DEBUG]::writeInit32 OutputTriggerActive1 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+0x100, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerActive2) { - printf("[DEBUG]::writeInit32 OutputTriggerActive2 %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE+0x200, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hOutputTriggerKind0) { printf("[DEBUG]::writeInit32 OutputTriggerKind0 %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_KIND, &dvalue); @@ -1447,13 +1385,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } - else if (index == hIntensityLutMode) { - printf("[DEBUG]::writeInit32 IntensityLutMode %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } + else if (index == hMasterPulseBurstTimes) { printf("[DEBUG]::writeInit32 MasterPulseBurstTimes %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_MASTERPULSE_BURSTTIMES, &dvalue); @@ -1471,57 +1403,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } } -/* - else if (index == hBufferRowbytes) { - printf("[DEBUG]::writeInit32 BufferRowBytes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_ROWBYTES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hTimingExposure) { - printf("[DEBUG]::writeInit32 TimingExposure %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_EXPOSURE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == ADBinX) { - printf("[DEBUG]::writeInit32 ImageWidth %d\n", value); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == ADBinY) { - printf("[DEBUG]::writeInit32 ImageHeight %d\n", value); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hImageRowbytes) { - printf("[DEBUG]::writeInit32 ImageRowBytes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hImageFramebytes) { - printf("[DEBUG]::writeInit32 ImageFramBytes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hImageTopOffsetBytes) { - printf("[DEBUG]::writeInit32 ImageTopOffsetBytes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_TOPOFFSETBYTES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - */ else if (index == hImagePixelType) { printf("[DEBUG]::writeInit32 ImagePixelType %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &dvalue); @@ -1529,99 +1410,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } -/* - else if (index == hBufferFramebytes) { - printf("[DEBUG]::writeInit32 BufferFrameBytes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_FRAMEBYTES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hBufferTopOffsetBytes) { - printf("[DEBUG]::writeInit32 BufferTopOffsetBytes %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_TOPOFFSETBYTES, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hBufferPixelType) { - printf("[DEBUG]::writeInit32 BufferPixelType %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BUFFER_PIXELTYPE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hRecordFixedBytesPerFile) { - printf("[DEBUG]::writeInit32 ecordFixedBytesPerFile %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hRecordFixedBytesPerSession) { - printf("[DEBUG]::writeInit32 RecordFixedBytesPerSesion %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hRecordFixedBytesPerFrame) { - printf("[DEBUG]::writeInit32 RecordFixedBytesPerFrame %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - //else if (index == hNumberOfOutputTriggerConnector) { - // printf("[DEBUG]::writeInit32 NumberOutputTriggerConnector %d\n", value); - // m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR, &dvalue); - // if(failed(m_err)) { - // printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - // } - //} - else if (index == hSystemAlive) { - printf("[DEBUG]::writeInit32 SystemAlive %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SYSTEM_ALIVE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hNumberOfView) { - printf("[DEBUG]::writeInit32 NumberOfView %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_NUMBEROF_VIEW, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hImageDetectorPixelNumHorz) { - printf("[DEBUG]::writeInit32 ImageDetectorPixelNumHorz %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hImageDetectorPixelNumVert) { - printf("[DEBUG]::writeInit32 ImageDetectorPixelNumVert %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hTimeStampProducer) { - printf("[DEBUG]::writeInit32 TimeStampProducer %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMESTAMP_PRODUCER, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hFrameStampProducer) { - printf("[DEBUG]::writeInit32 FrameStampProducer %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_FRAMESTAMP_PRODUCER, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - */ else{ if(index < FIRST_HAMA_PARAM){ @@ -1783,72 +1571,6 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } } //-- Synchronous timing - /* - else if (index == hTimingReadoutTime) { - printf("[DEBUG]::function TimingReadoutTime %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hTimingCyclicTriggerPeriod) { - printf("[DEBUG]::function TimingCyclicTriggerPeriod %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hTimingMinTriggerBlanking) { - printf("[DEBUG]::function TimingMinTriggerBlanking %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hTimingMinTriggerInterval) { - printf("[DEBUG]::function TimingMinTriggerInterval %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERINTERVAL, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hTimingGlobalExposureDelay) { - printf("[DEBUG]::function TimingGlobalExposureDelay %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_GLOBALEXPOSUREDELAY, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hTimingInvalidExposurePeriod) { - printf("[DEBUG]::function TimingEnvalidExposurePeriod %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_TIMING_INVALIDEXPOSUREPERIOD, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - }*/ - - /* THESE PARAMETERS ARE READ ONLY - else if (index == hInternalFrameRate) { - int sensorMode = 0; - getIntegerParam(hSensorMode, &sensorMode); - if((sensorMode != DCAMPROP_SENSORMODE__AREA) && (sensorMode != DCAMPROP_SENSORMODE__SPLITVIEW)){ - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else{ - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); - } - } - else if (index == hInternalFrameInterval) { - printf("[DEBUG]::function InternalFrameRate %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - */ else if (index == hInternalLineSpeed) { printf("[DEBUG]::function InternalLineSpeed %f\n", value); @@ -1864,36 +1586,6 @@ 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 == hConversionFactorCoeff) { - printf("[DEBUG]::function ConversionFactorCoeff %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_COEFF, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hConversionFactorOffset) { - printf("[DEBUG]::function ConversionFactorOffset %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_CONVERSIONFACTOR_OFFSET, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hImageDetectorPixelWidth) { - printf("[DEBUG]::function ImageDetectorPixelWidth %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELWIDTH, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hImageDetectorPixelHeight) { - printf("[DEBUG]::function ImageDetectorPixelHeight %f\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_IMAGEDETECTOR_PIXELHEIGHT, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - */ else{ if(index < FIRST_HAMA_PARAM){ status = ADDriver::writeFloat64(pasynUser, value); diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 9e5bfda..7000c76 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -138,15 +138,20 @@ class epicsShareClass Hama : public ADDriver { public: Hama(const char*, int, int, size_t, int, int, int); -// ~Hama(); +// ~Hama(); /* override ADDriver methods */ virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); - -// virtual asynStatus getBounds(asynUser *, epicsInt32 *low, epicsInt32 *high); - //virtual asynStatus readEnum(asynUser *pasynUser, char *strings[], int values[], - // int severities[], size_t nElements, size_t *nIn); virtual void report(FILE *fp, int details); + + /* This function could be implemented as overwrite virtual readInt32, readFloat64 */ + /* It is however implemented in that way due to sugestion that only */ + /* writeInt32, writeFloat64, report should be overwrite */ + /* could be changed in the future */ + int readParameter(int paramIndex); + int readParameterStr(int paramIndex); + + void imageTask(); void temperatureTask(); @@ -279,6 +284,7 @@ private: epicsEventId startEvent_; + // Helper functions asynStatus startAcquire(void); asynStatus stopAcquire(void); void getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes); @@ -298,15 +304,15 @@ private: asynStatus readAttributes(); asynStatus readSensor(); - asynStatus getParameter(int paramIndex); + // helper functions for dcamapi void printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt=NULL, ...); void printInfo(HDCAM hdcam); int dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, int32 textbytes ); - int setParameter(int paramIndex); - int getParameterStr(int paramIndex); + + int getProperties(); asynStatus setFeature(int featureIndex, double value); From b01e13eb776d205538d8ddacf71a2c3847bcff07 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Thu, 9 Feb 2023 09:20:07 +0100 Subject: [PATCH 42/66] small update --- ADHamaApp/src/hama.cpp | 165 ++++++++++++++++++++++------------------- 1 file changed, 87 insertions(+), 78 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index e235a6f..39e04a3 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -385,84 +385,6 @@ int Hama::readParameterStr(int propertyID){ return status; } -//============================================================================ -asynStatus Hama::readAttributes(){ - - int status = 0; - - readParameter( DCAM_IDPROP_COLORTYPE ); - //status |= readParameter( DCAM_IDPROP_BITSPERCHANNEL ); - status = readParameter( DCAM_IDPROP_IMAGE_ROWBYTES ); - status = readParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES ); - status = readParameter( DCAM_IDPROP_IMAGE_TOPOFFSETBYTES ); - //status |= readParameter( DCAM_IDPROP_IMAGE_PIXELTYPE ); - status = readParameter( DCAM_IDPROP_BUFFER_ROWBYTES ); - status = readParameter( DCAM_IDPROP_BUFFER_FRAMEBYTES ); - status = readParameter( DCAM_IDPROP_BUFFER_TOPOFFSETBYTES ); - status = readParameter( DCAM_IDPROP_BUFFER_PIXELTYPE ); - status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE ); - status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION ); - status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME ); - status = readParameter( DCAM_IDPROP_SYSTEM_ALIVE ); - status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_COEFF ); - status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_OFFSET ); - status = readParameter( DCAM_IDPROP_NUMBEROF_VIEW ); - -return (asynStatus)status; -} - - -//============================================================================ -asynStatus Hama::readSensor(){ - - - asynStatus status = asynSuccess; - - int minH=0, minV=0, sizeH=0, sizeV=0, binning=1; - double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; - double dvalue = 0; - - getIntegerParam(ADMinX, &minH); - getIntegerParam(ADMinY, &minV); - getIntegerParam(ADSizeX, &sizeH); - getIntegerParam(ADSizeY, &sizeV); - getIntegerParam(hBinning, &binning); - - - dbinning = binning; - dminH = minH; - dminV = minV; - dsizeH = sizeH; - dsizeV = sizeV; - double modeON = DCAMPROP_MODE__ON; - double modeOFF = DCAMPROP_MODE__OFF; - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - status = setIntegerParam(ADBinX, dvalue); - status = setIntegerParam(ADBinY, dvalue); - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dvalue); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dvalue); - //m_err = dcamprop_getvalue(m_hdcam, , &dvalue); - - - - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); - - - callParamCallbacks(); - -return status; -} - //============================================================================ int Hama::readParameter(int propertyID){ @@ -1035,6 +957,93 @@ void Hama::temperatureTask(){ } +//============================================================================ +asynStatus Hama::readAttributes(){ + + int status = 0; + + readParameter( DCAM_IDPROP_COLORTYPE ); + //status |= readParameter( DCAM_IDPROP_BITSPERCHANNEL ); + status = readParameter( DCAM_IDPROP_IMAGE_ROWBYTES ); + status = readParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES ); + status = readParameter( DCAM_IDPROP_IMAGE_TOPOFFSETBYTES ); + //status |= readParameter( DCAM_IDPROP_IMAGE_PIXELTYPE ); + status = readParameter( DCAM_IDPROP_BUFFER_ROWBYTES ); + status = readParameter( DCAM_IDPROP_BUFFER_FRAMEBYTES ); + status = readParameter( DCAM_IDPROP_BUFFER_TOPOFFSETBYTES ); + status = readParameter( DCAM_IDPROP_BUFFER_PIXELTYPE ); + status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE ); + status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION ); + status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME ); + status = readParameter( DCAM_IDPROP_SYSTEM_ALIVE ); + status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_COEFF ); + status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_OFFSET ); + status = readParameter( DCAM_IDPROP_NUMBEROF_VIEW ); + +return (asynStatus)status; +} + + +//============================================================================ +asynStatus Hama::readSensor(){ + + + asynStatus status = asynSuccess; + + int minH=0, minV=0, sizeH=0, sizeV=0, binning=1, bitPerChannel = 0; + double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; + double dFrameBytes = 0, dRowBytes = 0; + double dvalue = 0; + + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeX, &sizeH); + getIntegerParam(ADSizeY, &sizeV); + getIntegerParam(hBinning, &binning); + getIntegerParam(hBitPerChannel, &bitPerChannel); + + dbinning = binning; + dminH = minH; + dminV = minV; + dsizeH = sizeH; + dsizeV = sizeV; + double modeON = DCAMPROP_MODE__ON; + double modeOFF = DCAMPROP_MODE__OFF; + + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + status = setIntegerParam(ADBinX, dvalue); + status = setIntegerParam(ADBinY, dvalue); + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dRowBytes); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + //m_err = dcamprop_getvalue(m_hdcam, , &dvalue); + + status = setIntegerParam(hBinning, dbinning); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + status = setIntegerParam(hImageRowbytes, dRowBytes); + + unsigned long size = (dsizeH - dminH) * (dsizeV - dminV) * dbinning; + printf("[DEBUG::readSensor] BitPerChannel = %d\n", bitPerChannel); + printf("[DEBUG::readSensor] ImageSize = %ld\n", size); + + + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); + + + callParamCallbacks(); + +return status; +} + + + //============================================================================ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ From e2368aa11375b4a463c67c99920f77b3badd4ec6 Mon Sep 17 00:00:00 2001 From: Iocuser Date: Thu, 16 Mar 2023 20:29:40 +0100 Subject: [PATCH 43/66] just update --- ADHamaApp/Db/hama.template | 10 +- ADHamaApp/src/hama.cpp | 265 ++++++++++++++++++++++++++++++++++--- cmds/st.cmd | 12 +- 3 files changed, 256 insertions(+), 31 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index d3fc562..e4965a4 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -611,7 +611,7 @@ record(mbbo, "$(P)$(R)Binning-S") { field(ZRST, "1x1") field(ONVL, "2") field(ONST, "2x2") - field(TWVL, "3") + field(TWVL, "4") field(TWST, "4x4") # field(DRVL, "1") # field(DRVH, "3") @@ -626,7 +626,7 @@ record(mbbi, "$(P)$(R)Binning-RB") { field(ZRST, "1x1") field(ONVL, "2") field(ONST, "2x2") - field(TWVL, "3") + field(TWVL, "4") field(TWST, "4x4") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") field(SCAN, "I/O Intr") @@ -1541,7 +1541,6 @@ record(ai, "$(P)$(R)TimingInvalidExposurePeriod-RB") { # Internal Frame Rate record(ao, "$(P)$(R)InternalFrameRate-S") { field(DESC, "") - field(PINI, "YES") field(DTYP, "asynFloat64") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_RATE") field(EGU, "Hz") @@ -1559,7 +1558,6 @@ record(ai, "$(P)$(R)InternalFrameRate-RB") { # Internal Frame Interval record(ao, "$(P)$(R)InternalFrameInternal-S") { field(DESC, "") - field(PINI, "YES") field(DTYP, "asynFloat64") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_INTERVAL") field(EGU, "Sec") @@ -1616,8 +1614,8 @@ record(ai, "$(P)$(R)InternalLineInterval-RB") { record(mbbi, "$(P)$(R)ColorType-R") { field(DESC,"") field(DTYP, "asynInt32") - field(ZRVL, "0") - field(ZRST, "BW") + field(ZRVL, "1") + field(ZRST, "B & W") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_COLOR_TYPE") field(SCAN, "I/O Intr") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 39e04a3..a7eb2b9 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -277,8 +277,8 @@ int Hama::initCamera(){ err |= readParameter(DCAM_IDPROP_OUTPUTTRIGGER_ACTIVE); err |= readParameter(DCAM_IDPROP_NUMBEROF_OUTPUTTRIGGERCONNECTOR); // MASTER PULSE ------------------------------------------ + // SYNCHRONOUS TIMING ------------------------------------ - err |= readParameter( DCAM_IDPROP_TIMING_READOUTTIME); err |= readParameter( DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD); err |= readParameter( DCAM_IDPROP_TIMING_MINTRIGGERBLANKING); @@ -818,6 +818,7 @@ void Hama::imageTask(){ acquire = 1; /* Get the current time */ prevAcquisitionCount = 0; + setIntegerParam(ADNumImagesCounter, 0); } } @@ -876,7 +877,7 @@ void Hama::imageTask(){ timestamp = (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); status = setDoubleParam(hTimeStamp, timestamp); - printf("Timestamp from camera: %f\n", (ts_sec + ts_microsec / 1.0e6)); + //printf("Timestamp from camera: %f\n", (ts_sec + ts_microsec / 1.0e6)); //printf("Timestamp from camera with correction: %f\n", timestamp); epicsTimeGetCurrent(¤tAcqTime); @@ -914,6 +915,7 @@ void Hama::imageTask(){ getIntegerParam(ADNumImages, &totalImages); getIntegerParam(ADImageMode, &imageMode); + setIntegerParam(ADNumImagesCounter, captransferinfo.nFrameCount); if ((imageMode == ADImageMultiple && totalImages == captransferinfo.nFrameCount) || (imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) { @@ -994,6 +996,8 @@ asynStatus Hama::readSensor(){ double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; double dFrameBytes = 0, dRowBytes = 0; double dvalue = 0; + int mode = 0; + getIntegerParam(ADMinX, &minH); getIntegerParam(ADMinY, &minV); @@ -1001,7 +1005,14 @@ asynStatus Hama::readSensor(){ getIntegerParam(ADSizeY, &sizeV); getIntegerParam(hBinning, &binning); getIntegerParam(hBitPerChannel, &bitPerChannel); - + getIntegerParam(hSubarrayMode ,&mode); + + if(mode == DCAMPROP_MODE__OFF){ + status = asynError; + return status ; + } + + dbinning = binning; dminH = minH; dminV = minV; @@ -1009,33 +1020,109 @@ asynStatus Hama::readSensor(){ dsizeV = sizeV; double modeON = DCAMPROP_MODE__ON; double modeOFF = DCAMPROP_MODE__OFF; + double dsensorH = 2048; + double dsensorV = 2048; +/* m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_SubarrayMode()", " VALUE:%f\n", modeOFF); + +*/ m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_Binning()", " VALUE:%f\n", dbinning); + status = setIntegerParam(hBinning, dbinning); + + printf("BEFORE::::n"); + printf("SUBARRAY Hpos = %f \n", dminH); + printf("SUBARRAY Vpos = %f \n", dminV); + printf("SUBARRAY Hsize = %f \n", dsizeH); + printf("SUBARRAY Vsize = %f \n", dsizeV); + + if(dsizeH > (dsensorH - dminH)){ + dsizeH = dsensorH - dminH; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + } + if(dsizeV > (dsensorV - dminV)){ + dsizeV = dsensorV - dminV; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + } + + + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_SubarrayHPos()", " VALUE:%f\n", dminH); + else + status = setIntegerParam(ADMinX, dminH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_SubarrayVPos()", " VALUE:%f\n", dminV); + else status = setIntegerParam(ADMinY, dminV); + + //dsizeH = 2048 - dminH; + //dsizeV = 2048 - dminV; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_SubarrayHSize()", " VALUE:%f\n", dsizeH); + else status = setIntegerParam(ADSizeX, dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_SubarrayVSize()", " VALUE:%f\n", dsizeV); + else status = setIntegerParam(ADSizeY, dsizeV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_ImageWidth()", " VALUE:%f\n", dvalue); + else status = setIntegerParam(ADBinX, dvalue); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - status = setIntegerParam(ADBinX, dvalue); - status = setIntegerParam(ADBinY, dvalue); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_ImageHeight()", " VALUE:%f\n", dvalue); + else status = setIntegerParam(ADBinY, dvalue); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dRowBytes); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_ImageRowBytes()", " VALUE:%f\n", dRowBytes); + else status = setIntegerParam(hImageRowbytes, dRowBytes); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + if(failed(m_err)) + printError(m_hdcam, m_err, "dcamprop_ImageFrameBytes()", " VALUE:%f\n", dFrameBytes); + else status = setIntegerParam(hImageFramebytes, dFrameBytes); + //m_err = dcamprop_getvalue(m_hdcam, , &dvalue); - status = setIntegerParam(hBinning, dbinning); + + printf("AFTER::::n"); + printf("SUBARRAY Hpos = %f \n", dminH); + printf("SUBARRAY Vpos = %f \n", dminV); + printf("SUBARRAY Hsize = %f \n", dsizeH); + printf("SUBARRAY Vsize = %f \n", dsizeV); + + printf("binning = %f \n", dbinning); + + unsigned long size = (dsizeH-dminH) * (dsizeV-dminV) / dbinning * 2; + printf("ImageSize = %ld\n", size); + status = setIntegerParam(hImageFramebytes, dFrameBytes); status = setIntegerParam(hImageRowbytes, dRowBytes); - - unsigned long size = (dsizeH - dminH) * (dsizeV - dminV) * dbinning; - printf("[DEBUG::readSensor] BitPerChannel = %d\n", bitPerChannel); - printf("[DEBUG::readSensor] ImageSize = %ld\n", size); - - + + int bytes = 2; + if(bitPerChannel >=12) bytes = 2; + else bytes = 1; + + status = setIntegerParam(NDArraySize, bytes); + +/* m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); - +*/ callParamCallbacks(); @@ -1101,16 +1188,113 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[DEBUG]::writeInit32 ADNumExposures\n"); } else if (index == ADMinX) { - readSensor(); + + int sensorH = 2048, minH = 0, sizeH = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADSizeX, &sizeH); + + if(sizeH > (sensorH - minH)){ + sizeH = sensorH - minH; + double dsizeH = sizeH; + double dminH = minH; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + printf("--- minH = %d\n", sizeH); + setIntegerParam(ADSizeX, sizeH); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + else{ + double dsizeH = sizeH; + double dminH = minH; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } } else if (index == ADMinY) { - readSensor(); + int sensorV = 2048, minV = 0, sizeV = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeY, &sizeV); + + if(sizeV > (sensorV - minV)){ + sizeV = sensorV - minV; + double dsizeV = sizeV; + double dminV = minV; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + printf("--- sizeV = %d\n", sizeV); + setIntegerParam(ADSizeY, sizeV); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + else{ + double dsizeV = sizeV; + double dminV = minV; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminV); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } } else if (index == ADSizeX) { - readSensor(); + int sensorH = 2048, minH = 0, sizeH = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADSizeX, &sizeH); + printf("---1 sensorH = %d minH = %d sizeH = %d\n", sensorH, minH, sizeH); + + if(sizeH < sensorH - minH){ + double dsizeH = sizeH; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + else{ + + double dsizeH = sensorH - minH; + printf("---2 sensorH = %d minH = %d sizeH = %f\n", sensorH, minH, dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dsizeH); + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dFrameBytes); + + printf("---3 dFrameBuffer = %f\n", dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + //status = setIntegerParam(ADSizeX, dsizeH); + } + } else if (index == ADSizeY) { - readSensor(); + int sensorV = 2048, minV = 0, sizeV = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeY, &sizeV); + + if(sizeV < sensorV - minV){ + double dsizeV = sizeV; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + else{ + + double dsizeV = sizeV; + printf("---4 sensor = %d min = %d size = %d\n", sensorV, minV, sizeV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dsizeV); + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dFrameBytes); + + status = setIntegerParam(hImageFramebytes, dFrameBytes); + status = setIntegerParam(ADSizeX, dsizeV); + } + } else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); @@ -1199,9 +1383,21 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ //-- binning and ROI else if (index == hBinning) { - readSensor(); + int binning = 0; + double dFrameBytes = 0; + + getIntegerParam(hBinning, &binning); + double dbinning = binning; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); + if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_Binning()", " VALUE:%f\n", dbinning); + + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + + status = setIntegerParam(hBinning, dbinning); printf("[DEBUG]::writeInit32 Binning %d\n", value); } + /* else if (index == hSubarrayHPos) { printf("[DEBUG]::function SubArrayHPos %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dvalue); @@ -1230,6 +1426,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + */ else if (index == hSubarrayMode) { printf("[DEBUG]::writeInit32 SubarrayMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &dvalue); @@ -1464,8 +1661,14 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ //-- Feature if(index == ADAcquireTime) { printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); - - int trigger_mode = 0; + status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + status = asynError; + } + + /* int trigger_mode = 0; getIntegerParam(hTriggerSource, &trigger_mode); if (trigger_mode != DCAMPROP_TRIGGERSOURCE__EXTERNAL) { @@ -1486,6 +1689,7 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } else status = asynError; + */ } else if(index == ADAcquirePeriod) { @@ -1588,20 +1792,37 @@ 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 == hInternalLineInterval) { + /* + else if (index == hInternalFrameRate) { + printf("[DEBUG]::function InternalFrameRate %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNALFRAMERATE, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } +else if (index == hInternalFrameInterval) { + printf("[DEBUG]::function Internal FrameInterval %f\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &dvalue); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + } + } + */ +else if (index == hInternalLineInterval) { printf("[DEBUG]::function InternalLineInterupt %f\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_INTERNAL_LINEINTERVAL, &dvalue); if(failed(m_err)) { printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); } } + else{ if(index < FIRST_HAMA_PARAM){ status = ADDriver::writeFloat64(pasynUser, value); printf("[+DEBUG]:: ADDriver::writeInit32 %s\n", paramName); } else{ - printf("[-DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); + printf("[-DEBUG]::function writeFloat64 did not find a parameter index = %d, %s\n", index, paramName); } } diff --git a/cmds/st.cmd b/cmds/st.cmd index b693a0f..ebb4796 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -7,18 +7,22 @@ epicsEnvSet("PREFIX", "Hama:") epicsEnvSet("PORT", "HAMA") epicsEnvSet("CAMERA", "0") epicsEnvSet("QSIZE", "21") -epicsEnvSet("XSIZE", "10") -epicsEnvSet("YSIZE", "10") +epicsEnvSet("XSIZE", "2048") +epicsEnvSet("YSIZE", "2048") epicsEnvSet("NCHANS", "2048") # Number of Elements epicsEnvSet("NELEMENTS", "4194304") epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "64000000") +#EVR settings +epicsEnvSet("EVR", "YMIR-TS:Ctrl-EVR-01") +epicsEnvSet("EVR_EVENT", "E") + # iocshLoad("$(adhama_DIR)ADHama.iocsh") devHamamatsuConfig("$(PORT)", $(CAMERA), 0, 0, 0, 0, 10) -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") +dbLoadRecords("$(adhama_DIR)db/hama.db","P=$(PREFIX),R=cam1:,EVR=$(EVR),E=$(EVR_EVENT),PORT=$(PORT),ADDR=0,TIMEOUT=1") #asynSetTraceMask("$(PORT)",-1,0x9) #asynSetTraceIOMask("$(PORT)",-1,0x2) @@ -61,6 +65,8 @@ dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 dbpf Hama:Kfk1:EnableCallbacks 1 +#dbpf Hama:cam1:TriggerPolarity-S # 2-positive, 1-negative + epicsThreadSleep(1.0) dbl > pv.list From 545fb7b0ec9fcda41106e70148582fb8db40366e Mon Sep 17 00:00:00 2001 From: Iocuser Date: Fri, 31 Mar 2023 10:12:04 +0200 Subject: [PATCH 44/66] Add Tomasz's changes --- .gitignore | 4 +- .vscode/c_cpp_properties.json | 10 ++--- ADHamaApp/src/hama.cpp | 77 ++++++++++++++++------------------- 3 files changed, 44 insertions(+), 47 deletions(-) diff --git a/.gitignore b/.gitignore index fbd322a..eeaf8f9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ O.* *.db.* pv.list core.* -.vscode \ No newline at end of file +.vscode +list.txt +.vscode/c_cpp_properties.json \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index ead342c..1da3a01 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -6,11 +6,11 @@ "${workspaceFolder}/**", "${workspaceFolder}/ADHamaApp/src/**", "${workspaceFolder}/ADHamaApp/src/", - "/home/iocuser/.conda/envs/hama/epics/include/**", - "/home/iocuser/.conda/envs/hama/epics/include/", - "/home/iocuser/.conda/envs/hama/modules/adcore/3.10.0/include/", - "/home/iocuser/.conda/envs/hama/modules/**", - "/home/iocuser/.conda/envs/hama/epics/include/os/Linux" + "/home/iocuser/.conda/envs/hama-dev/epics/include/**", + "/home/iocuser/.conda/envs/hama-dev/epics/include/", + "/home/iocuser/.conda/envs/hama-dev/modules/adcore/3.10.0/include/", + "/home/iocuser/.conda/envs/hama-dev/modules/**", + "/home/iocuser/.conda/envs/hama-dev/epics/include/os/Linux" ], "defines": [], "compilerPath": "/usr/bin/gcc", diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index a7eb2b9..3b8b3cc 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -988,10 +988,9 @@ return (asynStatus)status; //============================================================================ asynStatus Hama::readSensor(){ - asynStatus status = asynSuccess; - +/* int minH=0, minV=0, sizeH=0, sizeV=0, binning=1, bitPerChannel = 0; double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; double dFrameBytes = 0, dRowBytes = 0; @@ -1023,12 +1022,12 @@ asynStatus Hama::readSensor(){ double dsensorH = 2048; double dsensorV = 2048; -/* - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_SubarrayMode()", " VALUE:%f\n", modeOFF); + + //m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); + //if(failed(m_err)) + // printError(m_hdcam, m_err, "dcamprop_SubarrayMode()", " VALUE:%f\n", modeOFF); -*/ + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_Binning()", " VALUE:%f\n", dbinning); @@ -1120,12 +1119,12 @@ asynStatus Hama::readSensor(){ status = setIntegerParam(NDArraySize, bytes); -/* - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); -*/ + +// m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); + callParamCallbacks(); - + */ return status; } @@ -1241,58 +1240,54 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ } } else if (index == ADSizeX) { - int sensorH = 2048, minH = 0, sizeH = 0; + int sensorX = 2048, minX = 0, sizeX = 0; double dFrameBytes = 0; - getIntegerParam(ADMinX, &minH); - getIntegerParam(ADSizeX, &sizeH); - printf("---1 sensorH = %d minH = %d sizeH = %d\n", sensorH, minH, sizeH); + getIntegerParam(ADMinX, &minX); + getIntegerParam(ADSizeX, &sizeX); - if(sizeH < sensorH - minH){ - double dsizeH = sizeH; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + if(sizeX < sensorX - minX){ + double dsizeX = sizeX; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeX); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); status = setIntegerParam(hImageFramebytes, dFrameBytes); + status = setIntegerParam(ADSizeX, (int)dsizeX); + printf("1-Status = %d\n", status); } else{ - double dsizeH = sensorH - minH; - printf("---2 sensorH = %d minH = %d sizeH = %f\n", sensorH, minH, dsizeH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dsizeH); - + double dsizeX = sensorX - minX; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeX); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dFrameBytes); - - printf("---3 dFrameBuffer = %f\n", dFrameBytes); + status = setIntegerParam(ADSizeX, sizeX); + printf("2-Status = %d\n", status); status = setIntegerParam(hImageFramebytes, dFrameBytes); - //status = setIntegerParam(ADSizeX, dsizeH); - } + } } else if (index == ADSizeY) { - int sensorV = 2048, minV = 0, sizeV = 0; + int sensorY = 2048, minY = 0, sizeY = 0; double dFrameBytes = 0; - getIntegerParam(ADMinY, &minV); - getIntegerParam(ADSizeY, &sizeV); + getIntegerParam(ADMinY, &minY); + getIntegerParam(ADSizeY, &sizeY); - if(sizeV < sensorV - minV){ - double dsizeV = sizeV; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + if(sizeY < sensorY - minY){ + double dsizeY = sizeY; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeY); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(ADSizeX, (int)dsizeY); status = setIntegerParam(hImageFramebytes, dFrameBytes); } else{ - - double dsizeV = sizeV; - printf("---4 sensor = %d min = %d size = %d\n", sensorV, minV, sizeV); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); - if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dsizeV); + double dsizeY = sizeY; + //printf("---4 sensor = %d min = %d size = %d\n", sensorY, minY, sizeY); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeY); + //if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dsizeY); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dFrameBytes); + //if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dFrameBytes); status = setIntegerParam(hImageFramebytes, dFrameBytes); - status = setIntegerParam(ADSizeX, dsizeV); + status = setIntegerParam(ADSizeX, (int)dsizeY); } } From 882f2771140f9e5722a2f50d91f0364861af7059 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 3 Apr 2023 10:51:02 +0200 Subject: [PATCH 45/66] Add dcambuf_release() function to release the internal receiving buffer in the DCAM module when stop an acquisition --- ADHamaApp/src/hama.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 3b8b3cc..2084859 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -2113,8 +2113,14 @@ return 0; asynStatus Hama::stopAcquire(void) { asynStatus status = asynSuccess; - dcamcap_stop(m_hdcam); + m_err = dcamcap_stop(m_hdcam); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamcap_stop()"); + status = asynError; + } printf("Stop Capture\n"); + + freeBuffers(); return status; } From 11a7e3fe9e2219369a735f9e01d10a597023fb67 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 17 May 2023 12:32:06 +0200 Subject: [PATCH 46/66] Add external (EVR) timestamp --- ADHama.Makefile | 1 + ADHamaApp/Db/hama.template | 37 ++++++++++++++++++++++--------- ADHamaApp/src/hama.cpp | 45 +++++++++++++++++++++++++------------- ADHamaApp/src/hama.h | 6 ++++- cmds/st.cmd | 9 ++++++++ 5 files changed, 72 insertions(+), 26 deletions(-) diff --git a/ADHama.Makefile b/ADHama.Makefile index 4324898..fb86eff 100644 --- a/ADHama.Makefile +++ b/ADHama.Makefile @@ -38,6 +38,7 @@ endif REQUIRED += adcore REQUIRED += busy +REQUIRED += seq ############################################################################ diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index e4965a4..b7f9016 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -90,23 +90,40 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") { field(SVVL, "") } -record(longin, "$(P)$(R)ArrayCounter_RBV") -{ - field(FLNK, "$(P)$(R)#EVRTimeProc.PROC") +record(ao, "$(P)$(R)ExtTriggerFreq-S") { + field(DESC, "External trigger frequency") + field(PREC, "3") + field(EGU, "Hz") + field(DRVL, "0") + field(DRVH, "500") + field(FLNK, "$(P)$(R)EVRAcquireTime-S.PROC PP MS") } -record(ai, "$(P)$(R)#EVRTimeProc") { +record(stringin, "$(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") + field(SDIS, "$(EVR):Evt$(E)Cnt-I CP MS") + field(DISV, "-1") + field(TSEL, "$(EVR):Evt$(E)Cnt-I.TIME") + field(INP, "@%s.%f") + field(FLNK, "$(P)$(R)EVRTime-R.PROC PP MS") } -record(calc, "$(P)$(R)EVRTime-R") { +# holds TS value in 'sec.nsec' format +record(stringout, "$(P)$(R)EVRTime-R") { field(DESC, "EPICS epoch EVRTime timestamp") - field(CALC, "a+b") - field(INPA, "631152000") - field(INPB, "$(P)$(R)#EVRTimeProc") + field(DOL, "$(P)$(R)#EVRTimeProc MS") + field(OMSL, "closed_loop") + field(DTYP, "asynOctetWrite") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_TIMESTAMP") +} + +record(calcout, "$(P)$(R)EVRAcquireTime-S") { + field(DESC, "Set EVR acquire time in seconds") + field(CALC, "A=0?B:(1/A)*B") + field(INPA, "$(P)$(R)ExtTriggerFreq-S") + field(INPB, "88052500") + field(OUT, "$(EVR):PS-1-Div-SP PP") } record(ai, "$(P)$(R)TimeStamp-RB") { diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 2084859..fe9bcbc 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -185,6 +185,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hFrameStampProducerString, asynParamInt32, &hFrameStampProducer); createParam( hTimeStampString, asynParamFloat64, &hTimeStamp); + createParam(evrTimeStampString, asynParamOctet, &evrTimeStamp); setIntegerParam(NDArrayCallbacks, 1); callParamCallbacks(); @@ -831,7 +832,7 @@ void Hama::imageTask(){ lock(); if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { - //printf("nFrameCount: %d, nNewestFrameIndex: %d\n", captransferinfo.nFrameCount, captransferinfo.nNewestFrameIndex); + printf("nFrameCount: %d\n", captransferinfo.nFrameCount); prevAcquisitionCount = captransferinfo.nFrameCount; // get image information @@ -855,11 +856,12 @@ void Hama::imageTask(){ count++; setIntegerParam(NDArrayCounter, count); - int32 ts_sec = 0, ts_microsec = 0; + epicsUInt32 ts_sec = 0, ts_microsec = 0; accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, width * 2, width, height, ts_sec, ts_microsec); - double exposure_time, readout_time, timestamp; + double exposure_time, readout_time; + long double timestamp; //double _readouttime, _internal_frameinternal, _cyclictriggerperiod, _mintriggerblanking; //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &_readouttime); @@ -874,11 +876,22 @@ void Hama::imageTask(){ dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &readout_time); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &exposure_time); - timestamp = (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); + + printf("readout_time: %f - exposure_time: %f\n", readout_time, exposure_time); + timestamp = (ts_sec + ts_microsec / 1.0e6L) - (exposure_time + readout_time); status = setDoubleParam(hTimeStamp, timestamp); - //printf("Timestamp from camera: %f\n", (ts_sec + ts_microsec / 1.0e6)); - //printf("Timestamp from camera with correction: %f\n", timestamp); + char buf[256]; + getStringParam(evrTimeStamp, 256, buf); + + // remember parsed timestamp values + sscanf(buf, "%u.%u", &mTimeStampSec, &mTimeStampNsec); + //printf("ts_sec: %u - ts_microsec: %u\n", ts_sec, ts_microsec); + printf("mTimeStampSec: %u - mTimeStampNsec: %u\n", mTimeStampSec, mTimeStampNsec); + printf("Timestamp from camera : %f\n", (ts_sec + ts_microsec / 1.0e6)); + printf("Timestamp from camera with correction (long double): %.9Lf\n", timestamp); + printf("Timestamp from camera with correction (float): %f\n", (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time)); + printf("Timestamp from evr : %.9Lf\n", (mTimeStampSec + mTimeStampNsec / 1.0e9L)); epicsTimeGetCurrent(¤tAcqTime); elapsedTime = epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime); @@ -899,8 +912,13 @@ void Hama::imageTask(){ if(pImage) { pImage->uniqueId = count; - pImage->timeStamp = ts_sec + (ts_microsec / 1.0e6); - updateTimeStamp(&pImage->epicsTS); + //pImage->timeStamp = timestamp; + //updateTimeStamp(&pImage->epicsTS); + + pImage->timeStamp = mTimeStampSec + mTimeStampNsec / 1.e9; + pImage->epicsTS.secPastEpoch = mTimeStampSec; + pImage->epicsTS.nsec = mTimeStampNsec; + //updateTimeStamp(&pImage->epicsTS); memcpy(pImage->pData, (epicsUInt16 *)image, pImage->dataSize); @@ -1618,9 +1636,9 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ printf("[+DEBUG]:: ADDriver::writeInit32 %s\n", paramName); //ADDriver::writeInt32(pasynUser, value); } - else{ - printf("[-DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); - } + //else{ + // printf("[-DEBUG]::function writeInt32 did not find a parameter index = %d, %s\n", index, paramName); + //} } setIntegerParam(index, value); @@ -1816,9 +1834,6 @@ else if (index == hInternalLineInterval) { status = ADDriver::writeFloat64(pasynUser, value); printf("[+DEBUG]:: ADDriver::writeInit32 %s\n", paramName); } - else{ - printf("[-DEBUG]::function writeFloat64 did not find a parameter index = %d, %s\n", index, paramName); - } } if (status) @@ -2171,7 +2186,7 @@ inline void* memcpy_s( void* dst, size_t dstsize, const void* src, size_t srclen //============================================================================ asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy, - int32& ts_sec, int32& ts_microsec) + epicsUInt32& ts_sec, epicsUInt32& ts_microsec) { DCAMERR err; diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 7000c76..1d4ad54 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -129,6 +129,7 @@ #define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ #define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ #define hTimeStampString "H_TIMESTAMP" /* asynFloat64 ro */ +#define evrTimeStampString "EVR_TIMESTAMP" // For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h #define DETECTOR_PIXEL_NUM_HORZ 0x00420830 @@ -151,6 +152,8 @@ public: int readParameter(int paramIndex); int readParameterStr(int paramIndex); + epicsUInt32 mTimeStampSec; + epicsUInt32 mTimeStampNsec; void imageTask(); void temperatureTask(); @@ -265,6 +268,7 @@ protected: int hImageDetectorPixelNumVert; int hTimeStampProducer; int hFrameStampProducer; + int evrTimeStamp; //---- int hTimeStamp; //#define LAST_HAMA_PARAM hTimeStamp @@ -288,7 +292,7 @@ private: asynStatus startAcquire(void); asynStatus stopAcquire(void); void getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes); - asynStatus accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy, int32& ts_sec, int32& ts_microsec); + asynStatus accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy, epicsUInt32& ts_sec, epicsUInt32& ts_microsec); asynStatus imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo); // wrapper functions for dcamapi diff --git a/cmds/st.cmd b/cmds/st.cmd index ebb4796..1ad7c0b 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -1,6 +1,7 @@ # This should be a test startup script require adhama require adpluginkafka +require seq epicsEnvSet("PREFIX", "Hama:") @@ -65,11 +66,19 @@ dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 dbpf Hama:Kfk1:EnableCallbacks 1 +#dbpf Hama:cam1:AcquireTime .0005 +#dbpf Hama:cam1:TriggerSource-S 1 # external +#dbpf Hama:cam1:NumImages 10 +#dbpf Hama:cam1:ImageMode 1 + #dbpf Hama:cam1:TriggerPolarity-S # 2-positive, 1-negative epicsThreadSleep(1.0) dbl > pv.list + +#seq external_acquire "EVR=$(EVR),PREFIX=${PREFIX},R=cam1:" + # # END of st.cmd # From 5751c2b7032c608d563818eb5c93a2dc94c9e8a4 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Sat, 20 May 2023 09:27:02 +0200 Subject: [PATCH 47/66] Add logic to select the correct timestamp source --- ADHamaApp/Db/hama.template | 9 ------ ADHamaApp/src/hama.cpp | 56 ++++++++++++-------------------------- ADHamaApp/src/hama.h | 4 +-- 3 files changed, 18 insertions(+), 51 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index b7f9016..187cab2 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -126,15 +126,6 @@ record(calcout, "$(P)$(R)EVRAcquireTime-S") { field(OUT, "$(EVR):PS-1-Div-SP PP") } -record(ai, "$(P)$(R)TimeStamp-RB") { - field(DESC, "DCAM Timestamp when trigger received") - field(DTYP, "asynFloat64") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TIMESTAMP") - field(PREC, "3") - field(SCAN, "I/O Intr") - field(PINI, "YES") -} - record(ai, "$(P)$(R)FrameRate-R") { field(DESC, "Acquisition frame rate") field(DTYP, "asynFloat64") diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index fe9bcbc..eb82e50 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -183,7 +183,6 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hImageDetectorPixelNumVertString, asynParamInt32, &hImageDetectorPixelNumVert); createParam( hTimeStampProducerString, asynParamInt32, &hTimeStampProducer); createParam( hFrameStampProducerString, asynParamInt32, &hFrameStampProducer); - createParam( hTimeStampString, asynParamFloat64, &hTimeStamp); createParam(evrTimeStampString, asynParamOctet, &evrTimeStamp); @@ -790,10 +789,9 @@ void Hama::imageTask(){ epicsTimeStamp prevAcqTime, currentAcqTime; double elapsedTime; - //static const char *functionName = "imageTask"; + int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; lock(); - while(1) { getIntegerParam(ADAcquire, &acquire); if(!acquire) { @@ -801,7 +799,6 @@ void Hama::imageTask(){ unlock(); status = epicsEventWait(startEvent_); - puts("Starting request received"); lock(); /* We are acquiring. */ @@ -810,7 +807,6 @@ void Hama::imageTask(){ status = startAcquire(); epicsTimeGetCurrent(&prevAcqTime); - printf("Status: %d\n", status); if (status != asynSuccess) { //acquireStatusError = 1; epicsThreadSleep(.1); @@ -860,38 +856,26 @@ void Hama::imageTask(){ accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, width * 2, width, height, ts_sec, ts_microsec); - double exposure_time, readout_time; - long double timestamp; - - //double _readouttime, _internal_frameinternal, _cyclictriggerperiod, _mintriggerblanking; - //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &_readouttime); - //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNAL_FRAMEINTERVAL, &_internal_frameinternal); - //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD, &_cyclictriggerperiod); - //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_MINTRIGGERBLANKING, &_mintriggerblanking); - //printf("DCAM_IDPROP_TIMING_READOUTTIME: %f\n", _readouttime); - //printf("DCAM_IDPROP_INTERNAL_FRAMEINTERVAL: %f\n", _internal_frameinternal); - //printf("DCAM_IDPROP_TIMING_CYCLICTRIGGERPERIOD: %f\n", _cyclictriggerperiod); - //printf("DCAM_IDPROP_TIMING_MINTRIGGERBLANKING: %f\n", _mintriggerblanking); - + 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); - printf("readout_time: %f - exposure_time: %f\n", readout_time, exposure_time); - timestamp = (ts_sec + ts_microsec / 1.0e6L) - (exposure_time + readout_time); - status = setDoubleParam(hTimeStamp, timestamp); - char buf[256]; - getStringParam(evrTimeStamp, 256, buf); + getIntegerParam(hTriggerSource, &triggerMode); + if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + char buf[256]; + getStringParam(evrTimeStamp, 256, buf); - // remember parsed timestamp values - sscanf(buf, "%u.%u", &mTimeStampSec, &mTimeStampNsec); - //printf("ts_sec: %u - ts_microsec: %u\n", ts_sec, ts_microsec); - printf("mTimeStampSec: %u - mTimeStampNsec: %u\n", mTimeStampSec, mTimeStampNsec); - printf("Timestamp from camera : %f\n", (ts_sec + ts_microsec / 1.0e6)); - printf("Timestamp from camera with correction (long double): %.9Lf\n", timestamp); - printf("Timestamp from camera with correction (float): %f\n", (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time)); - printf("Timestamp from evr : %.9Lf\n", (mTimeStampSec + mTimeStampNsec / 1.0e9L)); + // remember parsed timestamp values + sscanf(buf, "%u.%u", &mTimeStampSec, &mTimeStampNsec); + timestamp = mTimeStampSec + mTimeStampNsec / 1.e9; + printf("mTimeStampSec: %u - mTimeStampNsec: %u\n", mTimeStampSec, mTimeStampNsec); + printf("Timestamp from evr: %f\n", timestamp); + } else { + timestamp = (ts_sec + ts_microsec / 1.0e6) - (exposure_time + readout_time); + printf("Timestamp from camera: %f\n", timestamp); + } epicsTimeGetCurrent(¤tAcqTime); elapsedTime = epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime); @@ -912,13 +896,8 @@ void Hama::imageTask(){ if(pImage) { pImage->uniqueId = count; - //pImage->timeStamp = timestamp; - //updateTimeStamp(&pImage->epicsTS); - - pImage->timeStamp = mTimeStampSec + mTimeStampNsec / 1.e9; - pImage->epicsTS.secPastEpoch = mTimeStampSec; - pImage->epicsTS.nsec = mTimeStampNsec; - //updateTimeStamp(&pImage->epicsTS); + pImage->timeStamp = timestamp; + updateTimeStamp(&pImage->epicsTS); memcpy(pImage->pData, (epicsUInt16 *)image, pImage->dataSize); @@ -941,7 +920,6 @@ void Hama::imageTask(){ stopAcquire(); setIntegerParam(ADAcquire, 0); } - callParamCallbacks(); } } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 1d4ad54..88fadf6 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -128,7 +128,6 @@ #define hImageDetectorPixelNumVertString "H_IMAGE_DETECTOR_PIXEL_NUM_VERT" /* asynInt32 ro */ #define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ #define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ -#define hTimeStampString "H_TIMESTAMP" /* asynFloat64 ro */ #define evrTimeStampString "EVR_TIMESTAMP" // For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h @@ -270,8 +269,7 @@ protected: int hFrameStampProducer; int evrTimeStamp; //---- - int hTimeStamp; - //#define LAST_HAMA_PARAM hTimeStamp + //#define LAST_HAMA_PARAM evrTimeStamp private: From 25e346e970d34f3b9f88b26073e544803435afaf Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Tue, 23 May 2023 11:25:18 +0200 Subject: [PATCH 48/66] Add logic to start and stop evr sequencer --- ADHamaApp/Db/hama.template | 123 ++++++++++++++++++++++++++++++++++++- ADHamaApp/src/hama.cpp | 7 ++- cmds/st.cmd | 6 +- 3 files changed, 127 insertions(+), 9 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 187cab2..a1395c7 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -96,7 +96,7 @@ record(ao, "$(P)$(R)ExtTriggerFreq-S") { field(EGU, "Hz") field(DRVL, "0") field(DRVH, "500") - field(FLNK, "$(P)$(R)EVRAcquireTime-S.PROC PP MS") + field(FLNK, "$(P)$(R)#EVRAcquireTime-S.PROC PP MS") } record(stringin, "$(P)$(R)#EVRTimeProc") { @@ -118,7 +118,7 @@ record(stringout, "$(P)$(R)EVRTime-R") { field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_TIMESTAMP") } -record(calcout, "$(P)$(R)EVRAcquireTime-S") { +record(calcout, "$(P)$(R)#EVRAcquireTime-S") { field(DESC, "Set EVR acquire time in seconds") field(CALC, "A=0?B:(1/A)*B") field(INPA, "$(P)$(R)ExtTriggerFreq-S") @@ -132,9 +132,128 @@ record(ai, "$(P)$(R)FrameRate-R") { field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_FRAMERATE") field(PREC, "2") field(SCAN, "I/O Intr") +} + +# PV that actually start the "burst" of events (On Demand) +# when the burst is finish, FLNK causes the sequencers to stop +record(busy, "$(P)$(R)StartFixedCycles") { + field(DESC, "StartFixedCycles") + field(OUT, "$(P)$(R)#SeqStartFixCycles.PROC PP") + field(FLNK, "$(P)$(R)#SeqDisableAll") +} + +# Procedure to start burst of events +record(seq, "$(P)$(R)#SeqStartFixCycles") { + field(SELM, "All") + + # Enable sequence stopper + field(DOL1, "0") + field(LNK1, "$(P)$(R)#StopAfterCycles.DISA") + + # Start sequencer as usual + field(DOL2, "1") + field(LNK2, "$(P)$(R)#Seq-Enable-Cond.PROC PP") + + # Only process this record when busy = 1 + field(SDIS, "$(P)$(R)StartFixedCycles") + field(DISV, "0") +} + +# When user selects "on demand" or when burst is ended +record(seq, "$(P)$(R)#SeqDisableAll") { + field(SELM, "All") + + # Disable sequencer 0 + field(DOL1, "1") + field(LNK1, "$(EVR):SoftSeq-0-Disable-Cmd CP") + + # Save current number of cycles + field(DOL2, "$(P)$(R)Cycle-Cnt") + field(LNK2, "$(P)$(R)#NCyclesPartial PP") + + # Disable Cycle Counter + field(DOL3, "1") + field(LNK3, "$(P)$(R)#StopAfterCycles.DISA") +} + + +record(longin, "$(P)$(R)Cycle-Cnt") { + field(DESC, "Cycle Counter") + field(SCAN, "Passive") + field(INP, "$(EVR):SoftSeq-0-NumOfStarts-I CPP") +} + +# Acts as a variable to store num. cycles before burst +record(ai, "$(P)$(R)#NCyclesPartial") { + field(DESC, "Num. cycles before burst") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") +} + +## Stop sequence after N cycles +record(calcout, "$(P)$(R)#StopAfterCycles") { + field(DESC, "StopAfterCycles") + field(CALC, "C < (A + B)") + field(INPA, "$(P)$(R)#NCyclesPartial NPP") + field(INPB, "$(P)$(R)NCycles NPP") + field(INPC, "$(P)$(R)Cycle-Cnt CPP") + field(DISA, "1") + + # Write "Done" to busy when VAL(CALC) goes to zero + field(OOPT, "When Zero") + field(OUT, "$(P)$(R)StartFixedCycles PP") +} + +# User input for number of cycles when mode = On Demand (burst) +record(ao, "$(P)$(R)NCycles") { + field(DESC, "Number of cycles for fixed mode") + field(VAL, "10") field(PINI, "YES") } + +######################################################## +# Auxiliary record to indicate if EVM sequencers should +# be enabled (used by On Demand mode) +######################################################## +record(calc, "$(P)$(R)#Seq-Enable-Cond") { + field(INPA, "$(P)$(R)StartFixedCycles NPP") + + # Only enable SoftSeq-0 when the burst started (busy == 1) + field(CALC, "A=1 ? 2 : 1") + field(FLNK, "$(P)$(R)#SeqMainProcess PP") +} + + +record(seq, "$(P)$(R)#SeqMainProcess") { + field(SELM, "All") + # Conditionally enable sequencer + field(DOL1, "1") + field(LNK1, "$(P)$(R)#Seq-Enable-Disable.PROC") +} + + +######################################################## +# Trigger the processing of the record that decides +# if sequencer should be enabled or not +######################################################## +record(fanout, "$(P)$(R)#Seq-Enable-Disable") { + field(SELM, "Specified") + field(SELL, "$(P)$(R)#Seq-Enable-Cond") + field(LNK2, "$(P)$(R)#SoftSeq-Enable PP") +} + +record(seq, "$(P)$(R)#SoftSeq-Enable") { + field(SELM, "All") + # reset prescaler + field(DOL1, "123") + field(LNK1, "$(EVR):Evt-ResetPS-SP PP") + field(DOL2, "123") + field(LNK2, "$(EVR):EvtCode-SP.PROC PP") + field(LNK3, "$(EVR):SoftSeq-0-Enable-Cmd.PROC PP") +} + + ########################################################################## # General properties # ########################################################################## diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index eb82e50..57e9518 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -1147,8 +1147,9 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ status = setIntegerParam(index, value); - if (index == ADAcquire) { - printf("[DEBUG]::writeInit32 ADAcquire\n"); + if (index == ADAcquire) { + printf("[DEBUG]::writeInit32 ADAcquire\n"); + printf("ADstatus: %d\n", adstatus); if (value) { /* Send an event to wake up the acq task.*/ puts("Requested acquire start event. Sending acquire start event signal to thread"); @@ -1159,7 +1160,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ setShutter(0); stopAcquire(); } - } + } /* else if (index == ADMaxSizeX_RBV) { dcamprop_setvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, value); diff --git a/cmds/st.cmd b/cmds/st.cmd index 1ad7c0b..ba78033 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -66,8 +66,8 @@ dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 dbpf Hama:Kfk1:EnableCallbacks 1 -#dbpf Hama:cam1:AcquireTime .0005 -#dbpf Hama:cam1:TriggerSource-S 1 # external +dbpf Hama:cam1:AcquireTime .05 +dbpf Hama:cam1:TriggerSource-S 1 # external #dbpf Hama:cam1:NumImages 10 #dbpf Hama:cam1:ImageMode 1 @@ -77,8 +77,6 @@ epicsThreadSleep(1.0) dbl > pv.list -#seq external_acquire "EVR=$(EVR),PREFIX=${PREFIX},R=cam1:" - # # END of st.cmd # From 7b73325de8018f32b11b1f1036f35957800a02d2 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Tue, 23 May 2023 14:59:20 +0200 Subject: [PATCH 49/66] Remove dcamwait frame since this is done by acquisition epicsThread --- ADHamaApp/src/hama.cpp | 42 +++++++----------------------------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 57e9518..4d5bae8 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -801,10 +801,6 @@ void Hama::imageTask(){ status = epicsEventWait(startEvent_); lock(); - /* We are acquiring. */ - //acquireStatusError = 0; - setIntegerParam(ADStatus, ADStatusAcquire); - status = startAcquire(); epicsTimeGetCurrent(&prevAcqTime); if (status != asynSuccess) { @@ -812,16 +808,13 @@ void Hama::imageTask(){ epicsThreadSleep(.1); } else { + setIntegerParam(ADStatus, ADStatusAcquire); acquire = 1; - /* Get the current time */ prevAcquisitionCount = 0; setIntegerParam(ADNumImagesCounter, 0); } } - /* Added this delay for the thread not to hog the processor. No need to run on full speed. */ - //epicsThreadSleep(0.001); - // get image transfer status. unlock(); imageTransferStatus(m_hdcam, captransferinfo); @@ -919,6 +912,7 @@ void Hama::imageTask(){ setShutter(0); stopAcquire(); setIntegerParam(ADAcquire, 0); + setIntegerParam(ADStatus, ADStatusIdle); } callParamCallbacks(); } @@ -1127,10 +1121,7 @@ return status; //============================================================================ -asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ - - - //printf("[DEBUG]::writeInt32\t"); +asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { asynStatus status = asynSuccess; const char* functionName = "writeInt32"; const char* paramName; @@ -1148,17 +1139,15 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ status = setIntegerParam(index, value); if (index == ADAcquire) { - printf("[DEBUG]::writeInit32 ADAcquire\n"); - printf("ADstatus: %d\n", adstatus); - if (value) { + if (value && adstatus != ADStatusAcquire) { /* Send an event to wake up the acq task.*/ puts("Requested acquire start event. Sending acquire start event signal to thread"); epicsEventSignal(this->startEvent_); } - else if (!value && (adstatus == ADStatusAcquire || adstatus == ADStatusError)) { + else if (!value && (adstatus == ADStatusAcquire || adstatus == ADStatusError || adstatus == ADStatusWaiting)) { /* This was a command to stop acquisition */ - setShutter(0); - stopAcquire(); + setIntegerParam(ADStatus, ADStatusAborted); + stopAcquire(); } } /* @@ -2087,7 +2076,6 @@ int Hama::disconnectCamera(void){ int Hama::allocateBuffers(unsigned int nBuffers) { m_err = dcambuf_alloc(m_hdcam, nBuffers); if(failed(m_err)) { - puts("banana"); printError(m_hdcam, m_err, "dcambuf_alloc()"); return asynError; } @@ -2135,21 +2123,6 @@ asynStatus Hama::startAcquire(void) printError(m_hdcam, m_err, "dcamcap_start()"); status = asynError; } - else { - printf( "\nStart Capture\n" ); - // set wait param - DCAMWAIT_START waitstart; - memset( &waitstart, 0, sizeof(waitstart) ); - waitstart.size = sizeof(waitstart); - waitstart.eventmask = DCAMWAIT_CAPEVENT_FRAMEREADY; - waitstart.timeout = DCAMWAIT_TIMEOUT_INFINITE; - - m_err = dcamwait_start(hwait, &waitstart); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamwait_start()"); - status = asynError; - } - } return status; } @@ -2282,7 +2255,6 @@ asynStatus Hama::imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captrans } if(captransferinfo.nFrameCount < 1) { - printf( "not capture image\n" ); return asynError; } From 63fc03a41ee973f3e8d7440dce47d91ec1b5c2d4 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 24 May 2023 15:30:44 +0200 Subject: [PATCH 50/66] Add logic to PV AcquirePeriod controls the EVR pulse period --- ADHamaApp/Db/hama.template | 53 +++++++++++++++++--------------------- ADHamaApp/src/hama.cpp | 34 ++++++++++-------------- cmds/st.cmd | 2 +- 3 files changed, 38 insertions(+), 51 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index a1395c7..0473265 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -90,15 +90,19 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") { field(SVVL, "") } -record(ao, "$(P)$(R)ExtTriggerFreq-S") { - field(DESC, "External trigger frequency") - field(PREC, "3") - field(EGU, "Hz") - field(DRVL, "0") - field(DRVH, "500") +record("*", "$(P)$(R)AcquirePeriod_RBV") +{ field(FLNK, "$(P)$(R)#EVRAcquireTime-S.PROC PP MS") } +record(calcout, "$(P)$(R)#EVRAcquireTime-S") { + field(DESC, "Set EVR acquire time in seconds") + field(CALC, "A=0?B:A*B") + field(INPA, "$(P)$(R)AcquirePeriod_RBV") + field(INPB, "88052500") + field(OUT, "$(EVR):PS-1-Div-SP PP") +} + record(stringin, "$(P)$(R)#EVRTimeProc") { field(DESC, "Start proce the EVRTime record") field(DTYP, "Soft Timestamp") @@ -118,14 +122,6 @@ record(stringout, "$(P)$(R)EVRTime-R") { field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_TIMESTAMP") } -record(calcout, "$(P)$(R)#EVRAcquireTime-S") { - field(DESC, "Set EVR acquire time in seconds") - field(CALC, "A=0?B:(1/A)*B") - field(INPA, "$(P)$(R)ExtTriggerFreq-S") - field(INPB, "88052500") - field(OUT, "$(EVR):PS-1-Div-SP PP") -} - record(ai, "$(P)$(R)FrameRate-R") { field(DESC, "Acquisition frame rate") field(DTYP, "asynFloat64") @@ -442,21 +438,20 @@ record(mbbi, "$(P)$(R)BitPerChannel-RB") { ########################################################################## # Trigger source (mode 4) record(mbbo, "$(P)$(R)TriggerSource-S") { - field(DESC,"") - field(PINI, "YES") - field(DTYP, "asynInt32") - field(ZRVL, "1") - field(ZRST, "Internal") - field(ONVL, "2") - field(ONST, "External") - field(TWVL, "3") - field(TWST, "Software") - field(THVL, "4") - field(THST, "Master Pulse") -# field(DRVL, "1") -# field(DRVH, "4") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_SOURCE") - field(VAL, "1") + field(DESC,"") + field(PINI, "YES") + field(DTYP, "asynInt32") + field(ZRVL, "1") + field(ZRST, "Internal") + field(ONVL, "2") + field(ONST, "External") + field(TWVL, "3") + field(TWST, "Software") + field(THVL, "4") + field(THST, "Master Pulse") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_SOURCE") + field(VAL, "1") + field(FLNK, "$(P)$(R)AcquirePeriod.PROC PP MS") } record(mbbi, "$(P)$(R)TriggerSource-RB") { diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 4d5bae8..7f7d396 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -1642,35 +1642,27 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ //-- Feature if(index == ADAcquireTime) { printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); - status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - status = asynError; - } - /* int trigger_mode = 0; + int trigger_mode = 0; getIntegerParam(hTriggerSource, &trigger_mode); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - if (trigger_mode != DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + if (trigger_mode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + if (dvalue <= value) status = asynError; + } + + else { status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); double acquire_period = 0; status = getDoubleParam(ADAcquirePeriod, &acquire_period); if (value >= acquire_period) { - status = setDoubleParam(ADAcquirePeriod, 0); status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); callParamCallbacks(); } - } - - else status = asynError; - */ + } } else if(index == ADAcquirePeriod) { @@ -1679,13 +1671,11 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ int trigger_mode = 0; getIntegerParam(hTriggerSource, &trigger_mode); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); if (trigger_mode != DCAMPROP_TRIGGERSOURCE__EXTERNAL) { - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - if (value <= dvalue) { status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); - value = 0; } else { status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__MASTERPULSE); @@ -1698,7 +1688,9 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ status = setIntegerParam(hMasterPulseMode, DCAMPROP_MASTERPULSE_MODE__CONTINUOUS); } } - else status = asynError; + else { + if (value <= dvalue) status = asynError; + } } //-- Trigger diff --git a/cmds/st.cmd b/cmds/st.cmd index ba78033..cca1e4a 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -67,7 +67,7 @@ dbpf Hama:image1:EnableCallbacks 1 dbpf Hama:Kfk1:EnableCallbacks 1 dbpf Hama:cam1:AcquireTime .05 -dbpf Hama:cam1:TriggerSource-S 1 # external +#dbpf Hama:cam1:TriggerSource-S 1 # external #dbpf Hama:cam1:NumImages 10 #dbpf Hama:cam1:ImageMode 1 From bfd746ac675dd53690b14f034b3d4448508932da Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 24 May 2023 17:11:24 +0200 Subject: [PATCH 51/66] Fix acquireTime blocker logic to external trigger --- ADHamaApp/src/hama.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 7f7d396..49cf33f 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -1644,19 +1644,19 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); int trigger_mode = 0; - getIntegerParam(hTriggerSource, &trigger_mode); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + double acquire_period = 0; + status = getDoubleParam(ADAcquirePeriod, &acquire_period); + status = getIntegerParam(hTriggerSource, &trigger_mode); if (trigger_mode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { - if (dvalue <= value) status = asynError; + if (value >= acquire_period) status = asynError; + else { + status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); + } } else { status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - - double acquire_period = 0; - status = getDoubleParam(ADAcquirePeriod, &acquire_period); if (value >= acquire_period) { status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); From a66877b3540c267e1f0afb177dc72f2528a715eb Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 24 May 2023 17:17:04 +0200 Subject: [PATCH 52/66] Update the enable/disable EVR softSequencer logic to work with different kinds of acquisition modes --- ADHamaApp/Db/hama.template | 129 +++++++------------------------------ 1 file changed, 24 insertions(+), 105 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 0473265..0b32b5e 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -130,125 +130,44 @@ record(ai, "$(P)$(R)FrameRate-R") { field(SCAN, "I/O Intr") } -# PV that actually start the "burst" of events (On Demand) -# when the burst is finish, FLNK causes the sequencers to stop -record(busy, "$(P)$(R)StartFixedCycles") { - field(DESC, "StartFixedCycles") - field(OUT, "$(P)$(R)#SeqStartFixCycles.PROC PP") - field(FLNK, "$(P)$(R)#SeqDisableAll") -} - -# Procedure to start burst of events -record(seq, "$(P)$(R)#SeqStartFixCycles") { - field(SELM, "All") - - # Enable sequence stopper - field(DOL1, "0") - field(LNK1, "$(P)$(R)#StopAfterCycles.DISA") - - # Start sequencer as usual - field(DOL2, "1") - field(LNK2, "$(P)$(R)#Seq-Enable-Cond.PROC PP") - - # Only process this record when busy = 1 - field(SDIS, "$(P)$(R)StartFixedCycles") - field(DISV, "0") -} - -# When user selects "on demand" or when burst is ended -record(seq, "$(P)$(R)#SeqDisableAll") { - field(SELM, "All") - +record(seq, "$(P)$(R)#SoftSeqDisable") { + field(SELM, "All") # Disable sequencer 0 field(DOL1, "1") field(LNK1, "$(EVR):SoftSeq-0-Disable-Cmd CP") - - # Save current number of cycles - field(DOL2, "$(P)$(R)Cycle-Cnt") - field(LNK2, "$(P)$(R)#NCyclesPartial PP") - - # Disable Cycle Counter - field(DOL3, "1") - field(LNK3, "$(P)$(R)#StopAfterCycles.DISA") } - -record(longin, "$(P)$(R)Cycle-Cnt") { - field(DESC, "Cycle Counter") - field(SCAN, "Passive") - field(INP, "$(EVR):SoftSeq-0-NumOfStarts-I CPP") -} - -# Acts as a variable to store num. cycles before burst -record(ai, "$(P)$(R)#NCyclesPartial") { - field(DESC, "Num. cycles before burst") - field(DTYP, "Soft Channel") - field(SCAN, "Passive") -} - -## Stop sequence after N cycles -record(calcout, "$(P)$(R)#StopAfterCycles") { - field(DESC, "StopAfterCycles") - field(CALC, "C < (A + B)") - field(INPA, "$(P)$(R)#NCyclesPartial NPP") - field(INPB, "$(P)$(R)NCycles NPP") - field(INPC, "$(P)$(R)Cycle-Cnt CPP") - field(DISA, "1") - - # Write "Done" to busy when VAL(CALC) goes to zero - field(OOPT, "When Zero") - field(OUT, "$(P)$(R)StartFixedCycles PP") -} - -# User input for number of cycles when mode = On Demand (burst) -record(ao, "$(P)$(R)NCycles") { - field(DESC, "Number of cycles for fixed mode") - field(VAL, "10") - field(PINI, "YES") -} - - -######################################################## -# Auxiliary record to indicate if EVM sequencers should -# be enabled (used by On Demand mode) -######################################################## -record(calc, "$(P)$(R)#Seq-Enable-Cond") { - field(INPA, "$(P)$(R)StartFixedCycles NPP") - - # Only enable SoftSeq-0 when the burst started (busy == 1) - field(CALC, "A=1 ? 2 : 1") - field(FLNK, "$(P)$(R)#SeqMainProcess PP") -} - - -record(seq, "$(P)$(R)#SeqMainProcess") { - field(SELM, "All") - # Conditionally enable sequencer - field(DOL1, "1") - field(LNK1, "$(P)$(R)#Seq-Enable-Disable.PROC") -} - - -######################################################## -# Trigger the processing of the record that decides -# if sequencer should be enabled or not -######################################################## -record(fanout, "$(P)$(R)#Seq-Enable-Disable") { - field(SELM, "Specified") - field(SELL, "$(P)$(R)#Seq-Enable-Cond") - field(LNK2, "$(P)$(R)#SoftSeq-Enable PP") -} - -record(seq, "$(P)$(R)#SoftSeq-Enable") { +record(seq, "$(P)$(R)#SoftSeqEnable") { field(SELM, "All") # reset prescaler field(DOL1, "123") field(LNK1, "$(EVR):Evt-ResetPS-SP PP") field(DOL2, "123") field(LNK2, "$(EVR):EvtCode-SP.PROC PP") + # Enable sequencer 0 field(LNK3, "$(EVR):SoftSeq-0-Enable-Cmd.PROC PP") } +record("*", "$(P)$(R)Acquire") +{ + field(FLNK, "$(P)$(R)#CalcSoftSeqCtrl PP MS") +} + +record(calcout, "$(P)$(R)#CalcSoftSeqCtrl") { + field(DESC, "Calc software sequencer control") + field(CALC, "(A = 1 && B = 1) ? 1 : 0") + field(INPA, "$(P)$(R)Acquire") + field(INPB, "$(P)$(R)TriggerSource-RB") + field(OOPT, "On Change") + field(OUT, "$(P)$(R)#SoftSeqControl.PROC") +} + +record(fanout, "$(P)$(R)#SoftSeqControl") { + field(SELM, "Specified") + field(SELL, "$(P)$(R)#CalcSoftSeqCtrl") + field(LNK0, "$(P)$(R)#SoftSeqDisable PP") + field(LNK1, "$(P)$(R)#SoftSeqEnable PP") +} ########################################################################## # General properties # From 374a84971baa38507e7d8dd4b67dde9e5ac9f9e6 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Thu, 25 May 2023 15:38:08 +0200 Subject: [PATCH 53/66] Fix trigger_mode value to option start --- ADHamaApp/Db/hama.template | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 0b32b5e..7d9bad4 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -395,10 +395,8 @@ record(mbbo, "$(P)$(R)TriggerMode-S") { field(DTYP, "asynInt32") field(ZRVL, "1") field(ZRST, "Normal") - field(ONVL, "2") + field(ONVL, "6") field(ONST, "Start") -# field(DRVL, "1") -# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_MODE") field(VAL, "1") } From 41d69d3ef144248d9c3d9dc262d5f1faa2c70f48 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Tue, 30 May 2023 08:34:42 +0200 Subject: [PATCH 54/66] Refactor sensor size and position definitions --- ADHamaApp/Db/hama.template | 43 ++-- ADHamaApp/src/hama.cpp | 461 ++++++++++--------------------------- ADHamaApp/src/hama.h | 14 +- 3 files changed, 150 insertions(+), 368 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 7d9bad4..d5bf499 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -90,6 +90,30 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") { field(SVVL, "") } +record("*", "$(P)$(R)SizeX") +{ + field(DRVH, "2048") + field(DRVL, "4") +} + +record("*", "$(P)$(R)SizeY") +{ + field(DRVH, "2048") + field(DRVL, "4") +} + +record("*", "$(P)$(R)MinX") +{ + field(DRVH, "2044") + field(DRVL, "0") +} + +record("*", "$(P)$(R)MinY") +{ + field(DRVH, "2044") + field(DRVL, "0") +} + record("*", "$(P)$(R)AcquirePeriod_RBV") { field(FLNK, "$(P)$(R)#EVRAcquireTime-S.PROC PP MS") @@ -701,25 +725,6 @@ record(mbbi, "$(P)$(R)SubarrayMode-RB") { } -########################################################################## -# Feature # -########################################################################## -record(ao, "$(P)$(R)ExposureTime-S") { - field(DESC, "") - field(DTYP, "asynFloat64") - field(DRVL, "0.001004") - field(DRVH, "10.0") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_EXPOSURE_TIME") - field(VAL, "0.009998") -} - -record(ai, "$(P)$(R)ExposureTime-RB") { - field(DESC, "") - field(DTYP, "asynFloat64") - field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_EXPOSURE_TIME") - field(SCAN, "I/O Intr") -} - ########################################################################## # ALU # ########################################################################## diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 49cf33f..108dbe8 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -103,9 +103,6 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hSubarrayVSizeString, asynParamInt32, &hSubarrayVSize); createParam( hSubarrayModeString, asynParamInt32, &hSubarrayMode); -//Feature - createParam( hExposureTimeString, asynParamFloat64, &hExposureTime); - //ALU createParam( hDefectCorrectModeString, asynParamInt32, &hDefectCorrectMode); createParam( hHotPixelCorrectLevelString, asynParamInt32, &hHotPixelCorrectLevel); @@ -481,11 +478,10 @@ int Hama::readParameter(int propertyID){ status = setIntegerParam(hSubarrayMode, dvalue); break; - // - feature - case DCAM_IDPROP_EXPOSURETIME: //(RW123) - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); - status = setIntegerParam(hExposureTime, dvalue); - break; + case DCAM_IDPROP_EXPOSURETIME: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &dvalue); + status = setDoubleParam(ADAcquireTime, dvalue); + break; // - alu case DCAM_IDPROP_DEFECTCORRECT_MODE: //(RW123) @@ -949,177 +945,6 @@ void Hama::temperatureTask(){ } -//============================================================================ -asynStatus Hama::readAttributes(){ - - int status = 0; - - readParameter( DCAM_IDPROP_COLORTYPE ); - //status |= readParameter( DCAM_IDPROP_BITSPERCHANNEL ); - status = readParameter( DCAM_IDPROP_IMAGE_ROWBYTES ); - status = readParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES ); - status = readParameter( DCAM_IDPROP_IMAGE_TOPOFFSETBYTES ); - //status |= readParameter( DCAM_IDPROP_IMAGE_PIXELTYPE ); - status = readParameter( DCAM_IDPROP_BUFFER_ROWBYTES ); - status = readParameter( DCAM_IDPROP_BUFFER_FRAMEBYTES ); - status = readParameter( DCAM_IDPROP_BUFFER_TOPOFFSETBYTES ); - status = readParameter( DCAM_IDPROP_BUFFER_PIXELTYPE ); - status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFILE ); - status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERSESSION ); - status = readParameter( DCAM_IDPROP_RECORDFIXEDBYTES_PERFRAME ); - status = readParameter( DCAM_IDPROP_SYSTEM_ALIVE ); - status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_COEFF ); - status = readParameter( DCAM_IDPROP_CONVERSIONFACTOR_OFFSET ); - status = readParameter( DCAM_IDPROP_NUMBEROF_VIEW ); - -return (asynStatus)status; -} - - -//============================================================================ -asynStatus Hama::readSensor(){ - - asynStatus status = asynSuccess; -/* - int minH=0, minV=0, sizeH=0, sizeV=0, binning=1, bitPerChannel = 0; - double dminH=0, dminV=0, dsizeH=0, dsizeV=0, dbinning=1; - double dFrameBytes = 0, dRowBytes = 0; - double dvalue = 0; - int mode = 0; - - - getIntegerParam(ADMinX, &minH); - getIntegerParam(ADMinY, &minV); - getIntegerParam(ADSizeX, &sizeH); - getIntegerParam(ADSizeY, &sizeV); - getIntegerParam(hBinning, &binning); - getIntegerParam(hBitPerChannel, &bitPerChannel); - getIntegerParam(hSubarrayMode ,&mode); - - if(mode == DCAMPROP_MODE__OFF){ - status = asynError; - return status ; - } - - - dbinning = binning; - dminH = minH; - dminV = minV; - dsizeH = sizeH; - dsizeV = sizeV; - double modeON = DCAMPROP_MODE__ON; - double modeOFF = DCAMPROP_MODE__OFF; - double dsensorH = 2048; - double dsensorV = 2048; - - - //m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeOFF); - //if(failed(m_err)) - // printError(m_hdcam, m_err, "dcamprop_SubarrayMode()", " VALUE:%f\n", modeOFF); - - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_BINNING, &dbinning); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_Binning()", " VALUE:%f\n", dbinning); - status = setIntegerParam(hBinning, dbinning); - - printf("BEFORE::::n"); - printf("SUBARRAY Hpos = %f \n", dminH); - printf("SUBARRAY Vpos = %f \n", dminV); - printf("SUBARRAY Hsize = %f \n", dsizeH); - printf("SUBARRAY Vsize = %f \n", dsizeV); - - if(dsizeH > (dsensorH - dminH)){ - dsizeH = dsensorH - dminH; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - } - if(dsizeV > (dsensorV - dminV)){ - dsizeV = dsensorV - dminV; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); - } - - - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_SubarrayHPos()", " VALUE:%f\n", dminH); - else - status = setIntegerParam(ADMinX, dminH); - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_SubarrayVPos()", " VALUE:%f\n", dminV); - else status = setIntegerParam(ADMinY, dminV); - - //dsizeH = 2048 - dminH; - //dsizeV = 2048 - dminV; - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_SubarrayHSize()", " VALUE:%f\n", dsizeH); - else status = setIntegerParam(ADSizeX, dsizeH); - - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_SubarrayVSize()", " VALUE:%f\n", dsizeV); - else status = setIntegerParam(ADSizeY, dsizeV); - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_ImageWidth()", " VALUE:%f\n", dvalue); - else status = setIntegerParam(ADBinX, dvalue); - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_ImageHeight()", " VALUE:%f\n", dvalue); - else status = setIntegerParam(ADBinY, dvalue); - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &dRowBytes); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_ImageRowBytes()", " VALUE:%f\n", dRowBytes); - else status = setIntegerParam(hImageRowbytes, dRowBytes); - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - if(failed(m_err)) - printError(m_hdcam, m_err, "dcamprop_ImageFrameBytes()", " VALUE:%f\n", dFrameBytes); - else status = setIntegerParam(hImageFramebytes, dFrameBytes); - - //m_err = dcamprop_getvalue(m_hdcam, , &dvalue); - - - printf("AFTER::::n"); - printf("SUBARRAY Hpos = %f \n", dminH); - printf("SUBARRAY Vpos = %f \n", dminV); - printf("SUBARRAY Hsize = %f \n", dsizeH); - printf("SUBARRAY Vsize = %f \n", dsizeV); - - printf("binning = %f \n", dbinning); - - unsigned long size = (dsizeH-dminH) * (dsizeV-dminV) / dbinning * 2; - printf("ImageSize = %ld\n", size); - - status = setIntegerParam(hImageFramebytes, dFrameBytes); - status = setIntegerParam(hImageRowbytes, dRowBytes); - - int bytes = 2; - if(bitPerChannel >=12) bytes = 2; - else bytes = 1; - - status = setIntegerParam(NDArraySize, bytes); - - -// m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &modeON); - - - callParamCallbacks(); - */ -return status; -} - - - //============================================================================ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { asynStatus status = asynSuccess; @@ -1150,18 +975,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { stopAcquire(); } } - /* - else if (index == ADMaxSizeX_RBV) { - dcamprop_setvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, value); - dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &value_d); - printf("[DEBUG]::function ADNumExposures\n"); - } - else if (index == ADMaxSizeY_RBV) { - dcamprop_setvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, value); - dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &value_d); - printf("[DEBUG]::function ADMinX\n"); - } - */ else if (index == ADImageMode) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); @@ -1172,131 +985,123 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { //dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value_d); printf("[DEBUG]::writeInit32 ADNumExposures\n"); } - else if (index == ADMinX) { - - int sensorH = 2048, minH = 0, sizeH = 0; - double dFrameBytes = 0; - getIntegerParam(ADMinX, &minH); - getIntegerParam(ADSizeX, &sizeH); - - if(sizeH > (sensorH - minH)){ - sizeH = sensorH - minH; - double dsizeH = sizeH; - double dminH = minH; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - printf("--- minH = %d\n", sizeH); - setIntegerParam(ADSizeX, sizeH); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - status = setIntegerParam(hImageFramebytes, dFrameBytes); - } - else{ - double dsizeH = sizeH; - double dminH = minH; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - status = setIntegerParam(hImageFramebytes, dFrameBytes); - } - } - else if (index == ADMinY) { - int sensorV = 2048, minV = 0, sizeV = 0; - double dFrameBytes = 0; - getIntegerParam(ADMinY, &minV); - getIntegerParam(ADSizeY, &sizeV); + else if (index == ADMinX) { + int minH = 0, sizeH = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADSizeX, &sizeH); - if(sizeV > (sensorV - minV)){ - sizeV = sensorV - minV; - double dsizeV = sizeV; - double dminV = minV; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); - printf("--- sizeV = %d\n", sizeV); - setIntegerParam(ADSizeY, sizeV); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - status = setIntegerParam(hImageFramebytes, dFrameBytes); - } - else{ - double dsizeV = sizeV; - double dminV = minV; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeV); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminV); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - status = setIntegerParam(hImageFramebytes, dFrameBytes); - } - } - else if (index == ADSizeX) { - int sensorX = 2048, minX = 0, sizeX = 0; - double dFrameBytes = 0; - getIntegerParam(ADMinX, &minX); - getIntegerParam(ADSizeX, &sizeX); - - if(sizeX < sensorX - minX){ - double dsizeX = sizeX; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeX); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - status = setIntegerParam(hImageFramebytes, dFrameBytes); - status = setIntegerParam(ADSizeX, (int)dsizeX); - printf("1-Status = %d\n", status); - } - else{ - - double dsizeX = sensorX - minX; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeX); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - status = setIntegerParam(ADSizeX, sizeX); - printf("2-Status = %d\n", status); - status = setIntegerParam(hImageFramebytes, dFrameBytes); - } + if(sizeH > (MAX_H_SENSOR_SIZE - minH)) { + sizeH = MAX_H_SENSOR_SIZE - minH; + double dsizeH = sizeH; + double dminH = minH; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + setIntegerParam(ADSizeX, sizeH); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + else { + double dsizeH = sizeH; + double dminH = minH; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeH); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dminH); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + } + else if (index == ADMinY) { + int minV = 0, sizeV = 0; + double dFrameBytes = 0; + status = getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeY, &sizeV); - } - else if (index == ADSizeY) { - int sensorY = 2048, minY = 0, sizeY = 0; - double dFrameBytes = 0; - getIntegerParam(ADMinY, &minY); - getIntegerParam(ADSizeY, &sizeY); + if(sizeV > (MAX_V_SENSOR_SIZE - minV)) { + sizeV = MAX_V_SENSOR_SIZE - minV; + double dsizeV = sizeV; + double dminV = minV; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + setIntegerParam(ADSizeY, sizeV); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + else { + double dsizeV = sizeV; + double dminV = minV; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeV); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dminV); + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + } - if(sizeY < sensorY - minY){ - double dsizeY = sizeY; - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeY); - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - status = setIntegerParam(ADSizeX, (int)dsizeY); - status = setIntegerParam(hImageFramebytes, dFrameBytes); - } - else{ - double dsizeY = sizeY; - //printf("---4 sensor = %d min = %d size = %d\n", sensorY, minY, sizeY); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeY); - //if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dsizeY); - - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); - //if(failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%d\n", index, (int)dFrameBytes); - - status = setIntegerParam(hImageFramebytes, dFrameBytes); - status = setIntegerParam(ADSizeX, (int)dsizeY); - } + else if (index == ADSizeX) { + int minX = 0, sizeX = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinX, &minX); + getIntegerParam(ADSizeX, &sizeX); - } + if(sizeX < MAX_H_SENSOR_SIZE - minX) { + double dsizeX = roundToNearestMultipleOfFour(sizeX); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeX); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + value = (int)dsizeX; + } + else { + double dsizeX = MAX_H_SENSOR_SIZE - minX; + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dsizeX); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + value = (int)dsizeX; + } + readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + } + + else if (index == ADSizeY) { + int minY = 0, sizeY = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinY, &minY); + getIntegerParam(ADSizeY, &sizeY); + if(sizeY < MAX_V_SENSOR_SIZE - minY) { + double dsizeY = roundToNearestMultipleOfFour(sizeY); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeY); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + value = (int)dsizeY; + status = setIntegerParam(hImageFramebytes, dFrameBytes); + } + else { + double dsizeY = 0; + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dsizeY); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); + status = setIntegerParam(hImageFramebytes, dFrameBytes); + value = (int)dsizeY; + } + readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + } else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); printf("[DEBUG]::writeInit32 ADReadStatus\n"); } - //-- Sensor mode and speed - else if (index == hSensorMode) { - printf("[DEBUG]::writeInit32 SensorMode %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hReadoutSpeed) { - printf("[DEBUG]::writeInit32 ReadoutSpeed %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } + + else if (index == hSensorMode) { + printf("[DEBUG]::writeInit32 SensorMode %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); + if (failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + } + + else if (index == hReadoutSpeed) { + printf("[DEBUG]::writeInit32 ReadoutSpeed %d\n", value); + m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); + if (failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + } + else if (index == hReadoutDirection) { printf("[DEBUG]::writeInit32 ReadoutDirection %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue, 0); @@ -1378,36 +1183,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { status = setIntegerParam(hBinning, dbinning); printf("[DEBUG]::writeInit32 Binning %d\n", value); } - /* - else if (index == hSubarrayHPos) { - printf("[DEBUG]::function SubArrayHPos %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hSubarrayHSize) { - printf("[DEBUG]::writeInit32 SubarrayHSize %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hSubarrayVPos) { - printf("[DEBUG]::writeInit32 SubarrayVPos %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - else if (index == hSubarrayVSize) { - printf("[DEBUG]::writeInit32 SubarrayVSize %d\n", value); - m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dvalue); - if(failed(m_err)) { - printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - } - } - */ else if (index == hSubarrayMode) { printf("[DEBUG]::writeInit32 SubarrayMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SUBARRAYMODE, &dvalue); @@ -1642,7 +1417,6 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ //-- Feature if(index == ADAcquireTime) { printf("[DEBUG]::function ADAcquireTime from camera: %f\n", value); - int trigger_mode = 0; double acquire_period = 0; status = getDoubleParam(ADAcquirePeriod, &acquire_period); @@ -1662,7 +1436,10 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); callParamCallbacks(); } - } + } + + readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value); } else if(index == ADAcquirePeriod) { @@ -2393,6 +2170,12 @@ int Hama::getProperties(){ return 0; } +int Hama::roundToNearestMultipleOfFour(int value) { + int remainder = value % 4; + if (remainder == 0) return value; + else if (remainder <= 2) return value - remainder; + else return value + (4 - remainder); +} //============================================================================ diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 88fadf6..c781e8c 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -6,6 +6,9 @@ #define MAX_FEATURE_NAME_LEN 64 +#define MAX_H_SENSOR_SIZE 2048 +#define MAX_V_SENSOR_SIZE 2048 + #define hFrameRateString "H_FRAMERATE" #define hHamaNameString "H_HAMA_NAME" /* asynOctet ro */ #define hVendorString "H_VENDOR" /* asynOctet ro */ @@ -48,9 +51,6 @@ // #define hFrameBundleMode (usb3 only not implemented) // #define hFrameBundleNumber (usb3 only not implemented) -// Feature -#define hExposureTimeString "H_EXPOSURE_TIME" /* asynFloat64 rw */ - // ALU #define hDefectCorrectModeString "H_DEFECTCORRECT_MODE" /* asynInt32 rw */ #define hHotPixelCorrectLevelString "H_HOT_PIXEL_CORRECT_LEVEL" /* asynInt32 rw */ @@ -301,14 +301,7 @@ private: int connectCamera(); int disconnectCamera(); int initCamera(); - - // These function can be read more than once - asynStatus readAttributes(); - asynStatus readSensor(); - - - // helper functions for dcamapi void printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt=NULL, ...); void printInfo(HDCAM hdcam); @@ -316,6 +309,7 @@ private: int getProperties(); + int roundToNearestMultipleOfFour(int value); asynStatus setFeature(int featureIndex, double value); }; From 8d4e8ee925fd3adcc6b70d890da63d781bb3af7e Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Tue, 30 May 2023 09:15:55 +0200 Subject: [PATCH 55/66] Add logic to prevent always to process the PVs on readParameter function --- ADHamaApp/src/hama.cpp | 42 ++++++++++++++++-------------------------- ADHamaApp/src/hama.h | 6 +----- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 108dbe8..9c38690 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -384,7 +385,7 @@ return status; //============================================================================ -int Hama::readParameter(int propertyID){ +int Hama::readParameter(int propertyID, bool processPV) { asynStatus status = asynSuccess; double dvalue = 0; @@ -748,25 +749,14 @@ int Hama::readParameter(int propertyID){ break; } - if(failed(m_err)) { - char text[256]; - dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); - printError(m_hdcam, m_err, "+dcamprop_getvalue()", "IDPROP:0x%08x, VALUE:%s\n", propertyID, text); - } + if(failed(m_err)) { + char text[256] = {'\0'}; + dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); + printError(m_hdcam, m_err, "+dcamprop_getvalue()", "IDPROP:0x%08x, VALUE:%s\n", propertyID, text); + } - /* Do callbacks so higher layers see any changes */ - status = callParamCallbacks(); - /* - if (status) - asynPrint(0, ASYN_TRACE_ERROR, - "%s:%s: error, status=%d function=%d, paramName=%s, value=%d\n", - driverName, functionName, status, index, paramName, value); - else - asynPrint(NULL, ASYN_TRACEIO_DRIVER, - "%s:%s: function=%d, paramName=%s, value=%d\n", - driverName, functionName, index, paramName, value); -*/ -return status; + if (processPV) status = callParamCallbacks(); + return status; } @@ -1009,7 +999,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); status = setIntegerParam(hImageFramebytes, dFrameBytes); } - readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); } else if (index == ADMinY) { int minV = 0, sizeV = 0; @@ -1035,7 +1025,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &dFrameBytes); status = setIntegerParam(hImageFramebytes, dFrameBytes); } - readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); } else if (index == ADSizeX) { @@ -1058,7 +1048,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { status = setIntegerParam(hImageFramebytes, dFrameBytes); value = (int)dsizeX; } - readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); } else if (index == ADSizeY) { @@ -1080,7 +1070,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { status = setIntegerParam(hImageFramebytes, dFrameBytes); value = (int)dsizeY; } - readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); } else if (index == ADReadStatus) { // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); @@ -1092,14 +1082,14 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { printf("[DEBUG]::writeInit32 SensorMode %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); if (failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); } else if (index == hReadoutSpeed) { printf("[DEBUG]::writeInit32 ReadoutSpeed %d\n", value); m_err = dcamprop_setgetvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); if (failed(m_err)) printError(m_hdcam, m_err, "dcamprop_setgetvalue()", "IDPROP:0x%08x, VALUE:%f\n", index, dvalue); - readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); } else if (index == hReadoutDirection) { @@ -1438,7 +1428,7 @@ asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ } } - readParameter(DCAM_IDPROP_TIMING_READOUTTIME); + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value); } diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index c781e8c..9311a8f 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -144,11 +144,7 @@ public: virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); virtual void report(FILE *fp, int details); - /* This function could be implemented as overwrite virtual readInt32, readFloat64 */ - /* It is however implemented in that way due to sugestion that only */ - /* writeInt32, writeFloat64, report should be overwrite */ - /* could be changed in the future */ - int readParameter(int paramIndex); + int readParameter(int propertyID, bool processPV = true); int readParameterStr(int paramIndex); epicsUInt32 mTimeStampSec; From cc537075ab4e28bdffb2dc87a0e611cfa1fd030e Mon Sep 17 00:00:00 2001 From: George Nicolas Kontogiorgos Date: Fri, 16 Jun 2023 15:54:27 +0200 Subject: [PATCH 56/66] Set startup script to use Kafka broker's SSL port --- .gitignore | 4 +++- cmds/st.cmd | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index eeaf8f9..7047b82 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ pv.list core.* .vscode list.txt -.vscode/c_cpp_properties.json \ No newline at end of file +.vscode/c_cpp_properties.json +kafka.conf +ecdc-kafka-ca.crt diff --git a/cmds/st.cmd b/cmds/st.cmd index cca1e4a..c7478c7 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -43,13 +43,13 @@ NDStdArraysConfigure("Image1", "$(QSIZE)", 0, "$(PORT)", 0, 0) dbLoadRecords("NDStdArrays.template", "P=$(PREFIX),R=image1:,PORT=Image1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),TYPE=Int32,FTVL=LONG,NELEMENTS=$(NELEMENTS)") # Create a kafka plugin, set it to get data from hama driver. -epicsEnvSet("KFK_SERVER_IP", "10.100.1.19") -epicsEnvSet("KFK_SERVER_PORT", "9092") epicsEnvSet("KFK_TOPIC", "ymir_camera") -KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_SERVER_IP):$(KFK_SERVER_PORT)", "$(KFK_TOPIC)", "hama_source") -dbLoadRecords("$(adpluginkafka_DIR)db/adpluginkafka.db", "P=$(PREFIX), R=Kfk1:, PORT=KFK1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)") +# Kafka plugin +epicsEnvSet("KFK_CONFIG_FILE_PATH", "/home/iocuser/git/adhama/cmds/kafka.conf") +KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_TOPIC)", "hama_source","$(KFK_CONFIG_FILE_PATH)") +dbLoadRecords("$(adpluginkafka_DIR)db/adpluginkafka.db", "P=$(PREFIX), R=Kfk1:, PORT=KFK1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)") startPVAServer From 7118ae9186da4f9f5fdc17d48bc0f7068732cca9 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Wed, 6 Sep 2023 14:42:07 +0200 Subject: [PATCH 57/66] Add internal PVs to control when enable and stop EVR sequencer instead only to use Acquire 1/0 --- ADHamaApp/Db/hama.template | 71 ++++++++++++++++++++++++++++++++------ ADHamaApp/src/hama.cpp | 16 +++++++-- ADHamaApp/src/hama.h | 4 +++ 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index d5bf499..ea8e6a7 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -167,14 +167,28 @@ record(seq, "$(P)$(R)#SoftSeqEnable") { field(DOL1, "123") field(LNK1, "$(EVR):Evt-ResetPS-SP PP") field(DOL2, "123") - field(LNK2, "$(EVR):EvtCode-SP.PROC PP") + field(LNK2, "$(EVR):EvtCode-SP PP") # Enable sequencer 0 field(LNK3, "$(EVR):SoftSeq-0-Enable-Cmd.PROC PP") } -record("*", "$(P)$(R)Acquire") -{ - field(FLNK, "$(P)$(R)#CalcSoftSeqCtrl PP MS") +record(longin, "$(P)$(R)#AcquireCtrl") { + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_ACQ_CONTROL") + field(FLNK, "$(P)$(R)#SeqAcquire PP MS") + field(SCAN, "I/O Intr") +} + +record(seq, "$(P)$(R)#SeqAcquire") { + field(SELM, "All") + + # Save current number of cycles + field(DOL1, "$(P)$(R)Cycle-Cnt") + field(LNK1, "$(P)$(R)#NCyclesPartial PP") + + # Process CalcSoftSeqCtrl + field(DOL2, "1") + field(LNK2, "$(P)$(R)#CalcSoftSeqCtrl.PROC PP") } record(calcout, "$(P)$(R)#CalcSoftSeqCtrl") { @@ -182,15 +196,50 @@ record(calcout, "$(P)$(R)#CalcSoftSeqCtrl") { field(CALC, "(A = 1 && B = 1) ? 1 : 0") field(INPA, "$(P)$(R)Acquire") field(INPB, "$(P)$(R)TriggerSource-RB") - field(OOPT, "On Change") - field(OUT, "$(P)$(R)#SoftSeqControl.PROC") + field(OOPT, "Transition To Non-zero") + field(OUT, "$(P)$(R)#SoftSeqEnable PP") } -record(fanout, "$(P)$(R)#SoftSeqControl") { - field(SELM, "Specified") - field(SELL, "$(P)$(R)#CalcSoftSeqCtrl") - field(LNK0, "$(P)$(R)#SoftSeqDisable PP") - field(LNK1, "$(P)$(R)#SoftSeqEnable PP") +record(longin, "$(P)$(R)Cycle-Cnt") { + field(DESC, "Cycle Counter") + field(SCAN, "Passive") + field(INP, "$(EVR):SoftSeq-0-NumOfStarts-I CPP") +} + +# Acts as a variable to store num. cycles before burst +record(ai, "$(P)$(R)#NCyclesPartial") { + field(DESC, "Num. cycles before burst") + field(DTYP, "Soft Channel") + field(SCAN, "Passive") +} + +## Stop sequence after N cycles +record(calcout, "$(P)$(R)#StopAfterCycles") { + field(DESC, "StopAfterCycles") + field(CALC, "C < (A + B)") + field(INPA, "$(P)$(R)#NCyclesPartial NPP") + field(INPB, "$(P)$(R)NumImages_RBV NPP") + field(INPC, "$(P)$(R)Cycle-Cnt CPP") + field(OOPT, "When Zero") + field(OUT, "$(P)$(R)#SoftSeqDisable PP") +} + +record(longin, "$(P)$(R)#Cycle-Cnt") { + field(DESC, "Cycle Counter") + field(SCAN, "Passive") + field(INP, "$(EVR):SoftSeq-0-NumOfStarts-I CPP") + field(FLNK, "$(P)$(R)#CountSeq") +} + +record(seq, "$(P)$(R)#CountSeq") { + field(SELM, "All") + field(DOL1, "$(P)$(R)#Cycle-Cnt") + field(LNK1, "$(P)$(R)#EVRCounts PP") +} + +record(ao, "$(P)$(R)#EVRCounts") { + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_COUNTS") } ########################################################################## diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 9c38690..029070d 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -183,6 +183,8 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam( hFrameStampProducerString, asynParamInt32, &hFrameStampProducer); createParam(evrTimeStampString, asynParamOctet, &evrTimeStamp); + createParam(evrCountString, asynParamInt32, &evrCounts); + createParam(hAcqControlString, asynParamInt32, &hAcqControl); setIntegerParam(NDArrayCallbacks, 1); callParamCallbacks(); @@ -788,6 +790,9 @@ void Hama::imageTask(){ lock(); status = startAcquire(); + setIntegerParam(hAcqControl, 1); + callParamCallbacks(); + epicsTimeGetCurrent(&prevAcqTime); if (status != asynSuccess) { //acquireStatusError = 1; @@ -807,7 +812,7 @@ void Hama::imageTask(){ lock(); if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { - printf("nFrameCount: %d\n", captransferinfo.nFrameCount); + printf("\nHama Frame Count: %d\n", captransferinfo.nFrameCount); prevAcquisitionCount = captransferinfo.nFrameCount; // get image information @@ -839,10 +844,12 @@ void Hama::imageTask(){ dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TIMING_READOUTTIME, &readout_time); dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &exposure_time); - printf("readout_time: %f - exposure_time: %f\n", readout_time, exposure_time); getIntegerParam(hTriggerSource, &triggerMode); if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + int evr_counts = 0; + getIntegerParam(evrCounts, &evr_counts); + printf("EVR event count: %d\n", evr_counts); char buf[256]; getStringParam(evrTimeStamp, 256, buf); @@ -856,6 +863,7 @@ void Hama::imageTask(){ printf("Timestamp from camera: %f\n", timestamp); } + printf("readout_time: %f - exposure_time: %f\n", readout_time, exposure_time); epicsTimeGetCurrent(¤tAcqTime); elapsedTime = epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime); prevAcqTime = currentAcqTime; @@ -898,6 +906,7 @@ void Hama::imageTask(){ setShutter(0); stopAcquire(); setIntegerParam(ADAcquire, 0); + setIntegerParam(hAcqControl, 0); setIntegerParam(ADStatus, ADStatusIdle); } callParamCallbacks(); @@ -957,6 +966,9 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { if (value && adstatus != ADStatusAcquire) { /* Send an event to wake up the acq task.*/ puts("Requested acquire start event. Sending acquire start event signal to thread"); + int evr_counts = 0; + getIntegerParam(evrCounts, &evr_counts); + printf("EVR counts on Acquire: %d\n", evr_counts); epicsEventSignal(this->startEvent_); } else if (!value && (adstatus == ADStatusAcquire || adstatus == ADStatusError || adstatus == ADStatusWaiting)) { diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 9311a8f..8cd9d2e 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -129,6 +129,8 @@ #define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ #define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ #define evrTimeStampString "EVR_TIMESTAMP" +#define evrCountString "EVR_COUNTS" +#define hAcqControlString "H_ACQ_CONTROL" // For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h #define DETECTOR_PIXEL_NUM_HORZ 0x00420830 @@ -263,6 +265,8 @@ protected: int hImageDetectorPixelNumVert; int hTimeStampProducer; int hFrameStampProducer; + int evrCounts; + int hAcqControl; int evrTimeStamp; //---- //#define LAST_HAMA_PARAM evrTimeStamp From 1d079853717cc9139418208fa3f430746f01695a Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 18 Sep 2023 10:29:28 +0200 Subject: [PATCH 58/66] Stop sequencer when Acquire 0 --- ADHamaApp/Db/hama.template | 11 ++++++++++- ADHamaApp/src/hama.cpp | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index ea8e6a7..fa147f7 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -155,7 +155,7 @@ record(ai, "$(P)$(R)FrameRate-R") { } record(seq, "$(P)$(R)#SoftSeqDisable") { - field(SELM, "All") + field(SELM, "All") # Disable sequencer 0 field(DOL1, "1") field(LNK1, "$(EVR):SoftSeq-0-Disable-Cmd CP") @@ -224,6 +224,14 @@ record(calcout, "$(P)$(R)#StopAfterCycles") { field(OUT, "$(P)$(R)#SoftSeqDisable PP") } +record(calcout, "$(P)$(R)#StopAfterAcq0") { + field(DESC, "Stop seq when acquire 0") + field(CALC, "A = 0") + field(INPA, "$(P)$(R)Acquire CPP") + field(OOPT, "When Non-Zero") + field(OUT, "$(P)$(R)#SoftSeqDisable PP") +} + record(longin, "$(P)$(R)#Cycle-Cnt") { field(DESC, "Cycle Counter") field(SCAN, "Passive") @@ -1566,6 +1574,7 @@ record(ai, "$(P)$(R)TimingReadoutTime-RB") { field(DTYP, "asynFloat64") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TIMING_READOUT_TIME") field(EGU, "Sec") + field(PREC, "9") field(SCAN, "I/O Intr") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 029070d..cde1549 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -974,6 +974,7 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { else if (!value && (adstatus == ADStatusAcquire || adstatus == ADStatusError || adstatus == ADStatusWaiting)) { /* This was a command to stop acquisition */ setIntegerParam(ADStatus, ADStatusAborted); + setIntegerParam(hAcqControl, 0); stopAcquire(); } } From 16bb800227ba5e32689fb13a99fb01ce64e02676 Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 18 Sep 2023 11:31:57 +0200 Subject: [PATCH 59/66] Add mechanism to check if acquirePeriod is valid --- ADHamaApp/src/hama.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index cde1549..f8cde03 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -187,6 +187,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, createParam(hAcqControlString, asynParamInt32, &hAcqControl); setIntegerParam(NDArrayCallbacks, 1); + setStringParam (ADStatusMessage, "Idle"); callParamCallbacks(); connectCamera(); @@ -790,6 +791,7 @@ void Hama::imageTask(){ lock(); status = startAcquire(); + setStringParam (ADStatusMessage, "Acquiring"); setIntegerParam(hAcqControl, 1); callParamCallbacks(); @@ -908,6 +910,7 @@ void Hama::imageTask(){ setIntegerParam(ADAcquire, 0); setIntegerParam(hAcqControl, 0); setIntegerParam(ADStatus, ADStatusIdle); + setStringParam (ADStatusMessage, "Acquisition Done"); } callParamCallbacks(); } @@ -964,17 +967,28 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { if (index == ADAcquire) { if (value && adstatus != ADStatusAcquire) { - /* Send an event to wake up the acq task.*/ - puts("Requested acquire start event. Sending acquire start event signal to thread"); - int evr_counts = 0; - getIntegerParam(evrCounts, &evr_counts); - printf("EVR counts on Acquire: %d\n", evr_counts); - epicsEventSignal(this->startEvent_); + double readoutTime, acquirePeriod, acquireTime; + status = getDoubleParam(hTimingReadoutTime, &readoutTime); + status = getDoubleParam(ADAcquireTime, &acquireTime); + status = getDoubleParam(ADAcquirePeriod, &acquirePeriod); + + if (acquirePeriod < (readoutTime + acquireTime)) { + setStringParam (ADStatusMessage, + "Acquire Period must be greater than ReadoutTime + AcquireTime"); + setIntegerParam(ADAcquire, 0); + setIntegerParam(ADStatus, ADStatusAborted); + } + else { + /* Send an event to wake up the acq task.*/ + setStringParam (ADStatusMessage, ""); + epicsEventSignal(this->startEvent_); + } } else if (!value && (adstatus == ADStatusAcquire || adstatus == ADStatusError || adstatus == ADStatusWaiting)) { /* This was a command to stop acquisition */ setIntegerParam(ADStatus, ADStatusAborted); setIntegerParam(hAcqControl, 0); + setStringParam (ADStatusMessage, "Acquisition aborted by user"); stopAcquire(); } } @@ -1387,7 +1401,6 @@ asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { //} } - setIntegerParam(index, value); /* Do callbacks so higher layers see any changes */ status = (asynStatus) callParamCallbacks(); From a9b6d1c4be7b52f50e4ae0c2f84f6f804861c7dc Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 18 Sep 2023 11:33:23 +0200 Subject: [PATCH 60/66] Update st.cmd to run with external trigger by EVR 11 and update kafka topic --- cmds/st.cmd | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/cmds/st.cmd b/cmds/st.cmd index c7478c7..6aa4d64 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -1,8 +1,6 @@ # This should be a test startup script require adhama require adpluginkafka -require seq - epicsEnvSet("PREFIX", "Hama:") epicsEnvSet("PORT", "HAMA") @@ -16,8 +14,8 @@ epicsEnvSet("NELEMENTS", "4194304") epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "64000000") #EVR settings -epicsEnvSet("EVR", "YMIR-TS:Ctrl-EVR-01") -epicsEnvSet("EVR_EVENT", "E") +epicsEnvSet("EVR", "Labs-ECDC:TS-EVR-11") +epicsEnvSet("EVR_EVENT", "B") # iocshLoad("$(adhama_DIR)ADHama.iocsh") @@ -43,7 +41,8 @@ NDStdArraysConfigure("Image1", "$(QSIZE)", 0, "$(PORT)", 0, 0) dbLoadRecords("NDStdArrays.template", "P=$(PREFIX),R=image1:,PORT=Image1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),TYPE=Int32,FTVL=LONG,NELEMENTS=$(NELEMENTS)") # Create a kafka plugin, set it to get data from hama driver. -epicsEnvSet("KFK_TOPIC", "ymir_camera") +#epicsEnvSet("KFK_TOPIC", "ymir_camera") +epicsEnvSet("KFK_TOPIC", "nido_camera") # Kafka plugin epicsEnvSet("KFK_CONFIG_FILE_PATH", "/home/iocuser/git/adhama/cmds/kafka.conf") @@ -52,31 +51,20 @@ KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_TOPIC)", "hama_sourc dbLoadRecords("$(adpluginkafka_DIR)db/adpluginkafka.db", "P=$(PREFIX), R=Kfk1:, PORT=KFK1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)") startPVAServer - -# -# -# Start iocInit function=================================================================================== -# iocInit() -# -# End iocInit function ==================================================================================== -# dbpf Hama:cam1:PoolUsedMem.SCAN 0 dbpf Hama:image1:EnableCallbacks 1 dbpf Hama:Kfk1:EnableCallbacks 1 -dbpf Hama:cam1:AcquireTime .05 -#dbpf Hama:cam1:TriggerSource-S 1 # external -#dbpf Hama:cam1:NumImages 10 -#dbpf Hama:cam1:ImageMode 1 +dbpf Hama:cam1:AcquireTime .001 +dbpf Hama:cam1:AcquirePeriod .02 +dbpf Hama:cam1:TriggerSource-S 1 # external +dbpf Hama:cam1:NumImages 10 +dbpf Hama:cam1:ImageMode 1 #dbpf Hama:cam1:TriggerPolarity-S # 2-positive, 1-negative epicsThreadSleep(1.0) dbl > pv.list - -# -# END of st.cmd -# From 10d88aa4799f2ecaecae94185e5af118a715f1c1 Mon Sep 17 00:00:00 2001 From: Tomasz Brys Date: Wed, 17 Jan 2024 15:14:49 +0100 Subject: [PATCH 61/66] rename Hama to Orca --- ADHamaApp/Db/.DS_Store | Bin 6148 -> 0 bytes ADHamaApp/src/hama.dbd | 1 - ADHama.Makefile => ADOrca.Makefile | 8 +- .../Db/orca.template | 1 + .../src/ADOrcaMain.cpp | 2 +- .../src/hama.cpp => ADOrcaApp/src/orca.cpp | 120 ++++++++-------- ADOrcaApp/src/orca.dbd | 1 + ADHamaApp/src/hama.h => ADOrcaApp/src/orca.h | 131 +++++++++--------- README.md | 6 +- cmds/st.cmd | 38 ++--- iocsh/{ADHama.iocsh => ADOrca.iocsh} | 2 +- 11 files changed, 156 insertions(+), 154 deletions(-) delete mode 100644 ADHamaApp/Db/.DS_Store delete mode 100644 ADHamaApp/src/hama.dbd rename ADHama.Makefile => ADOrca.Makefile (97%) rename ADHamaApp/Db/hama.template => ADOrcaApp/Db/orca.template (99%) rename ADHamaApp/src/ADHamaMain.cpp => ADOrcaApp/src/ADOrcaMain.cpp (94%) rename ADHamaApp/src/hama.cpp => ADOrcaApp/src/orca.cpp (96%) create mode 100644 ADOrcaApp/src/orca.dbd rename ADHamaApp/src/hama.h => ADOrcaApp/src/orca.h (66%) rename iocsh/{ADHama.iocsh => ADOrca.iocsh} (70%) diff --git a/ADHamaApp/Db/.DS_Store b/ADHamaApp/Db/.DS_Store deleted file mode 100644 index 6181c298c50c53adea231751fc685b93409e335e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJx{|>3_L@JN(iYV;~SZfm|3E#49xriQb1w|Dg*4<`m@XV14I-USQyY*vhO{| z_g-^DTm!K6+ruTW0TemNP(#W$GKg3|G%dHF#k_U+DQQ^@UIlG#pZUi<||cioxPm*+D5;le;8|{ noFQ5|l2A%n!6ZJ>Hb&*Mdzfj;EHwYWx diff --git a/ADHamaApp/src/hama.dbd b/ADHamaApp/src/hama.dbd deleted file mode 100644 index fa1b18e..0000000 --- a/ADHamaApp/src/hama.dbd +++ /dev/null @@ -1 +0,0 @@ -registrar("hamaRegister") diff --git a/ADHama.Makefile b/ADOrca.Makefile similarity index 97% rename from ADHama.Makefile rename to ADOrca.Makefile index fb86eff..9c85548 100644 --- a/ADHama.Makefile +++ b/ADOrca.Makefile @@ -56,7 +56,7 @@ EXCLUDE_ARCHS += linux-ppc64e6500 # ############################################################################ -APP := ADHamaApp +APP := ADOrcaApp APPDB := $(APP)/Db APPSRC := $(APP)/src APPCMDS := $(APP)/cmds @@ -88,8 +88,8 @@ USR_INCLUDES += -DLINUX -I ../support/dcamsdk4/inc/ # ############################################################################ -# SOURCES += $(APPSRC)/ADHamaMain.cpp -SOURCES += $(APPSRC)/hama.cpp +# SOURCES += $(APPSRC)/ADOrcaMain.cpp +SOURCES += $(APPSRC)/orca.cpp # SOURCES += support/dcamsdk4/misc/common.cpp ############################################################################ @@ -98,7 +98,7 @@ SOURCES += $(APPSRC)/hama.cpp # ############################################################################ -DBDS += $(APPSRC)/hama.dbd +DBDS += $(APPSRC)/orca.dbd ############################################################################ diff --git a/ADHamaApp/Db/hama.template b/ADOrcaApp/Db/orca.template similarity index 99% rename from ADHamaApp/Db/hama.template rename to ADOrcaApp/Db/orca.template index fa147f7..acf8c1e 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADOrcaApp/Db/orca.template @@ -1,4 +1,5 @@ # Database for the records specific to the Hamamatsu Orca Flash4.0 cameras +# include "ADBase.template" diff --git a/ADHamaApp/src/ADHamaMain.cpp b/ADOrcaApp/src/ADOrcaMain.cpp similarity index 94% rename from ADHamaApp/src/ADHamaMain.cpp rename to ADOrcaApp/src/ADOrcaMain.cpp index bdf0d07..084f6c3 100644 --- a/ADHamaApp/src/ADHamaMain.cpp +++ b/ADOrcaApp/src/ADOrcaMain.cpp @@ -1,4 +1,4 @@ -/* ADHamaMain.cpp */ +/* ADOrcaMain.cpp */ /* Author: Tomasz Brys */ /* Date: 2022-03-16 */ diff --git a/ADHamaApp/src/hama.cpp b/ADOrcaApp/src/orca.cpp similarity index 96% rename from ADHamaApp/src/hama.cpp rename to ADOrcaApp/src/orca.cpp index f8cde03..abf5042 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -13,7 +13,7 @@ #include #include -#include "hama.h" +#include "orca.h" // --- includes from DCMAPI ---- #include "dcamprop.h" // @@ -24,21 +24,21 @@ using namespace std; //#define NUM_HAMA_PARAMS ((int)(&LAST_HAMA_PARAM - &FIRST_HAMA_PARAM + 1)) -static const char *driverName="drvHama"; +static const char *driverName="drvOrca"; static void c_imagetask(void *arg) { - Hama *p = (Hama *)arg; + Orca *p = (Orca *)arg; p->imageTask(); } static void c_temperaturetask(void *arg) { - Hama *p = (Hama *)arg; + Orca *p = (Orca *)arg; p->temperatureTask(); } //============================================================================ -Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, +Orca::Orca(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, int priority, int stackSize, int maxFrames) : ADDriver(portName, 1, 0, maxBuffers, maxMemory, asynEnumMask, asynEnumMask, @@ -48,9 +48,9 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, m_hdcam(NULL), m_id(0) { - const char *functionName = "hamaDetector::hamaDetector"; + const char *functionName = "orcaDetector::orcaDetector"; - printf("[DEBUG] === Constructor ADHama ===\n"); + printf("[DEBUG] === Constructor ADOrca ===\n"); printf("[DEBUG] driverName: %s\n", driverName); stopThread = 0; @@ -65,7 +65,7 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, //General createParam( hFrameRateString, asynParamFloat64, &hFrameRate); - createParam( hHamaNameString, asynParamOctet, &hHamaName); + createParam( hOrcaNameString, asynParamOctet, &hOrcaName); createParam( hVendorString, asynParamOctet, &hVendor); createParam( hModelString, asynParamOctet, &hModel); createParam( hCameraIDString, asynParamOctet, &hCameraID); @@ -196,13 +196,13 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, printf("\n\n============================ Start Threads =======================\n"); /* launch image read task */ - epicsThreadCreate("HamaImageTask", + epicsThreadCreate("OrcaImageTask", epicsThreadPriorityMedium, epicsThreadGetStackSize(epicsThreadStackMedium), c_imagetask, this); /* launch temp read task */ - epicsThreadCreate("HamaTemperatureTask", + epicsThreadCreate("OrcaTemperatureTask", epicsThreadPriorityMedium, epicsThreadGetStackSize(epicsThreadStackMedium), c_temperaturetask, this); @@ -210,17 +210,17 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, /* shutdown on exit */ //epicsAtExit(c_shutdown, this); - printf("\n\n=== END Constructor ADHama ===\n"); + printf("\n\n=== END Constructor ADOrca ===\n"); printf("===================================================================\n"); } //============================================================================ -//Hama::~Hama(){ +//Orca::~Orca(){ // // not sure if the destructor has to be define here... -// printf("[DEBUG] === Destructor ADHama ===\n"); +// printf("[DEBUG] === Destructor ADOrca ===\n"); //} //======================================================================================================== -int Hama::initCamera(){ +int Orca::initCamera(){ int err = 0; @@ -322,7 +322,7 @@ return err; } //============================================================================ -int Hama::readParameterStr(int propertyID){ +int Orca::readParameterStr(int propertyID){ asynStatus status = asynSuccess; @@ -388,7 +388,7 @@ return status; //============================================================================ -int Hama::readParameter(int propertyID, bool processPV) { +int Orca::readParameter(int propertyID, bool processPV) { asynStatus status = asynSuccess; double dvalue = 0; @@ -764,7 +764,7 @@ int Hama::readParameter(int propertyID, bool processPV) { //============================================================================ -void Hama::imageTask(){ +void Orca::imageTask(){ int status; unsigned char *image; int acquire; @@ -814,7 +814,7 @@ void Hama::imageTask(){ lock(); if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { - printf("\nHama Frame Count: %d\n", captransferinfo.nFrameCount); + printf("\nOrca Frame Count: %d\n", captransferinfo.nFrameCount); prevAcquisitionCount = captransferinfo.nFrameCount; // get image information @@ -916,7 +916,7 @@ void Hama::imageTask(){ } } //============================================================================ -void Hama::temperatureTask(){ +void Orca::temperatureTask(){ static const char *functionName = "tempTask"; asynStatus status = asynSuccess; double dvalue = 0; @@ -948,7 +948,7 @@ void Hama::temperatureTask(){ } //============================================================================ -asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value) { +asynStatus Orca::writeInt32(asynUser *pasynUser, epicsInt32 value) { asynStatus status = asynSuccess; const char* functionName = "writeInt32"; const char* paramName; @@ -1418,7 +1418,7 @@ return status; //============================================================================ -asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ +asynStatus Orca::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ asynStatus status = asynSuccess; const char* functionName = "writeFloat64"; @@ -1606,9 +1606,9 @@ else if (index == hInternalLineInterval) { //============================================================================ -void Hama::report(FILE *fp, int details){ +void Orca::report(FILE *fp, int details){ double dvalue = 0; - fprintf(fp, "Hamamatsu Orca Flash4.0 driver\n"); + fprintf(fp, "Orcamatsu Orca Flash4.0 driver\n"); if (details < 1) return; // Sensor mode and speed @@ -1762,7 +1762,7 @@ void Hama::report(FILE *fp, int details){ } //============================================================================ -int Hama::connectCamera(void){ +int Orca::connectCamera(void){ static const char *functionName = "connectCamera"; int nDevices = 0; @@ -1823,7 +1823,7 @@ int Hama::connectCamera(void){ } //============================================================================ -int Hama::disconnectCamera(void){ +int Orca::disconnectCamera(void){ static const char *functionName = "disconnectCamera"; @@ -1858,7 +1858,7 @@ int Hama::disconnectCamera(void){ } //============================================================================ -int Hama::allocateBuffers(unsigned int nBuffers) { +int Orca::allocateBuffers(unsigned int nBuffers) { m_err = dcambuf_alloc(m_hdcam, nBuffers); if(failed(m_err)) { printError(m_hdcam, m_err, "dcambuf_alloc()"); @@ -1868,7 +1868,7 @@ int Hama::allocateBuffers(unsigned int nBuffers) { } //============================================================================ -int Hama::freeBuffers(){ +int Orca::freeBuffers(){ m_err = dcambuf_release( m_hdcam ); if( failed(m_err) ) printError( m_hdcam, m_err, "dcambuf_release()" ); @@ -1877,7 +1877,7 @@ return 0; } //============================================================================ -asynStatus Hama::stopAcquire(void) +asynStatus Orca::stopAcquire(void) { asynStatus status = asynSuccess; m_err = dcamcap_stop(m_hdcam); @@ -1892,7 +1892,7 @@ asynStatus Hama::stopAcquire(void) } //============================================================================ -asynStatus Hama::startAcquire(void) +asynStatus Orca::startAcquire(void) { asynStatus status = asynSuccess; @@ -1921,7 +1921,7 @@ inline void* memcpy_s( void* dst, size_t dstsize, const void* src, size_t srclen } //============================================================================ -asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, +asynStatus Orca::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy, epicsUInt32& ts_sec, epicsUInt32& ts_microsec) { @@ -1967,7 +1967,7 @@ asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, //======================================================================================================== -void Hama::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes) +void Orca::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes) { DCAMERR err; double property_value; @@ -2025,7 +2025,7 @@ void Hama::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int3 } //============================================================================ -asynStatus Hama::imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo) +asynStatus Orca::imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo) { DCAMERR err; // transferinfo param @@ -2047,7 +2047,7 @@ asynStatus Hama::imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captrans } //============================================================================ -void Hama::printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt, ...){ +void Orca::printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt, ...){ char errtext[ 256 ]; @@ -2070,7 +2070,7 @@ void Hama::printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const cha //============================================================================ -void Hama::printInfo(HDCAM hdcam){ +void Orca::printInfo(HDCAM hdcam){ char model[ 256 ]; char cameraid[ 64 ]; @@ -2095,7 +2095,7 @@ void Hama::printInfo(HDCAM hdcam){ //============================================================================ -int Hama::dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, int32 textbytes ) { +int Orca::dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, int32 textbytes ) { DCAMDEV_STRING param; memset( ¶m, 0, sizeof(param) ); @@ -2109,7 +2109,7 @@ return ! failed( err ); } //============================================================================ -asynStatus Hama::setFeature(int featureIndex, double value) { +asynStatus Orca::setFeature(int featureIndex, double value) { DCAMERR err; err = dcamprop_setvalue(m_hdcam, featureIndex, value); if(failed(err)) { @@ -2120,7 +2120,7 @@ asynStatus Hama::setFeature(int featureIndex, double value) { } //============================================================================ -int Hama::getProperties(){ +int Orca::getProperties(){ printf("\n[DEBUG] Function:getProperties\n"); int32 iProp = 0; // property IDs @@ -2186,7 +2186,7 @@ int Hama::getProperties(){ return 0; } -int Hama::roundToNearestMultipleOfFour(int value) { +int Orca::roundToNearestMultipleOfFour(int value) { int remainder = value % 4; if (remainder == 0) return value; else if (remainder <= 2) return value - remainder; @@ -2200,47 +2200,47 @@ int Hama::roundToNearestMultipleOfFour(int value) { -extern "C" int HamaConfig(const char *portName, int cameraId, int maxBuffers, +extern "C" int OrcaConfig(const char *portName, int cameraId, int maxBuffers, size_t maxMemory, int priority, int stackSize, int maxFrames) { - new Hama(portName, cameraId, maxBuffers, maxMemory, priority, stackSize, + new Orca(portName, cameraId, maxBuffers, maxMemory, priority, stackSize, maxFrames); return(asynSuccess); } //============================================================================ -static const iocshArg HamaConfigArg0 = {"Port name", iocshArgString}; -static const iocshArg HamaConfigArg1 = {"CameraId", iocshArgInt}; -static const iocshArg HamaConfigArg2 = {"maxBuffers", iocshArgInt}; -static const iocshArg HamaConfigArg3 = {"maxMemory", iocshArgInt}; -static const iocshArg HamaConfigArg4 = {"priority", iocshArgInt}; -static const iocshArg HamaConfigArg5 = {"stackSize", iocshArgInt}; -static const iocshArg HamaConfigArg6 = {"maxFrames", iocshArgInt}; -static const iocshArg * const HamaConfigArgs[] = { &HamaConfigArg0, - &HamaConfigArg1, - &HamaConfigArg2, - &HamaConfigArg3, - &HamaConfigArg4, - &HamaConfigArg5, - &HamaConfigArg6 }; +static const iocshArg OrcaConfigArg0 = {"Port name", iocshArgString}; +static const iocshArg OrcaConfigArg1 = {"CameraId", iocshArgInt}; +static const iocshArg OrcaConfigArg2 = {"maxBuffers", iocshArgInt}; +static const iocshArg OrcaConfigArg3 = {"maxMemory", iocshArgInt}; +static const iocshArg OrcaConfigArg4 = {"priority", iocshArgInt}; +static const iocshArg OrcaConfigArg5 = {"stackSize", iocshArgInt}; +static const iocshArg OrcaConfigArg6 = {"maxFrames", iocshArgInt}; +static const iocshArg * const OrcaConfigArgs[] = { &OrcaConfigArg0, + &OrcaConfigArg1, + &OrcaConfigArg2, + &OrcaConfigArg3, + &OrcaConfigArg4, + &OrcaConfigArg5, + &OrcaConfigArg6 }; //============================================================================ -static const iocshFuncDef confighama = {"devHamamatsuConfig", 7, HamaConfigArgs}; +static const iocshFuncDef configorca = {"devOrcamatsuConfig", 7, OrcaConfigArgs}; //============================================================================ -static void confighamaCallFunc(const iocshArgBuf *args) { - HamaConfig(args[0].sval, args[1].ival, args[2].ival, args[3].ival, +static void configorcaCallFunc(const iocshArgBuf *args) { + OrcaConfig(args[0].sval, args[1].ival, args[2].ival, args[3].ival, args[4].ival, args[5].ival, args[6].ival); } //============================================================================ -static void hamaRegister(void) { +static void orcaRegister(void) { - iocshRegister(&confighama, confighamaCallFunc); + iocshRegister(&configorca, configorcaCallFunc); } //============================================================================ extern "C" { -epicsExportRegistrar(hamaRegister); +epicsExportRegistrar(orcaRegister); } diff --git a/ADOrcaApp/src/orca.dbd b/ADOrcaApp/src/orca.dbd new file mode 100644 index 0000000..1cd0a06 --- /dev/null +++ b/ADOrcaApp/src/orca.dbd @@ -0,0 +1 @@ +registrar("orcaRegister") diff --git a/ADHamaApp/src/hama.h b/ADOrcaApp/src/orca.h similarity index 66% rename from ADHamaApp/src/hama.h rename to ADOrcaApp/src/orca.h index 8cd9d2e..79a01a8 100644 --- a/ADHamaApp/src/hama.h +++ b/ADOrcaApp/src/orca.h @@ -1,6 +1,7 @@ #ifndef DRV_HAMA_H #define DRV_HAMA_H + #include "ADDriver.h" #include "dcamapi4.h" @@ -10,7 +11,7 @@ #define MAX_V_SENSOR_SIZE 2048 #define hFrameRateString "H_FRAMERATE" -#define hHamaNameString "H_HAMA_NAME" /* asynOctet ro */ +#define hOrcaNameString "H_HAMA_NAME" /* asynOctet ro */ #define hVendorString "H_VENDOR" /* asynOctet ro */ #define hModelString "H_MODEL" /* asynOctet ro */ #define hCameraIDString "H_CAMERAID" /* asynOctet ro */ @@ -20,108 +21,108 @@ #define hModuleVersionString "H_MODULE_VERSION" /* asynOctet ro */ #define hDcamApiVersionString "H_DCAM_API_VERSION" /* asynOctet ro */ -// Sensor mode and speed -#define hSensorModeString "H_SENSOR_MODE" /* asynint32 rw */ -#define hReadoutSpeedString "H_READOUT_SPEED" /* asynInt32 rw */ -#define hReadoutDirectionString "H_READOUT_DIRECTION" /* asynIekt32 rw */ +// Sensor mode and speed +#define hSensorModeString "H_SENSOR_MODE" /* asynint32 rw */ +#define hReadoutSpeedString "H_READOUT_SPEED" /* asynInt32 rw */ +#define hReadoutDirectionString "H_READOUT_DIRECTION" /* asynIekt32 rw */ // Trigger -#define hTriggerSourceString "H_TRIGGER_SOURCE" /* asynInt32 rw */ -#define hTriggerModeString "H_TRIGGER_MODE" /* asynInt32 rw */ -#define hTriggerActiveString "H_TRIGGER_ACTIVE" /* asynInt32 rw */ +#define hTriggerSourceString "H_TRIGGER_SOURCE" /* asynInt32 rw */ +#define hTriggerModeString "H_TRIGGER_MODE" /* asynInt32 rw */ +#define hTriggerActiveString "H_TRIGGER_ACTIVE" /* asynInt32 rw */ #define hTriggerGlobalExposureString "H_TRIGGER_GLOBAL_EXPOSURE" /* asynInt32 rw */ -#define hTriggerPolarityString "H_TRIGGER_POLARITY" /* asynInt32 rw */ +#define hTriggerPolarityString "H_TRIGGER_POLARITY" /* asynInt32 rw */ #define hTriggerConnectorString "H_TRIGGER_CONNECTOR" /* asynInt32 rw */ -#define hTriggerTimesString "H_TRIGGER_TIMES" /* asynInt32 rw */ -#define hTriggerDelayString "H_TRIGGER_DELAY" /* asynFloat64 rw */ +#define hTriggerTimesString "H_TRIGGER_TIMES" /* asynInt32 rw */ +#define hTriggerDelayString "H_TRIGGER_DELAY" /* asynFloat64 rw */ #define hInternalTriggerHandlingString "H_INTERNAL_TRIGGER_HANDLING" /* asynInt32 rw */ // Sensor cooler -#define hSensorTemperatureString "H_SENSOR_TEMPERATURE" /* asynFloat64 ro */ -#define hSensorCoolerString "H_SENSOR_COOLER" /* asynInt32 rw */ -#define hSensorCoolerStatusString "H_SENSOR_COOLER_STATUS" /* asynInt32 ro */ +#define hSensorTemperatureString "H_SENSOR_TEMPERATURE" /* asynFloat64 ro */ +#define hSensorCoolerString "H_SENSOR_COOLER" /* asynInt32 rw */ +#define hSensorCoolerStatusString "H_SENSOR_COOLER_STATUS" /* asynInt32 ro */ // Binning and ROI -#define hBinningString "H_BINNING" /* asynInt32 rw */ -#define hSubarrayHPosString "H_SUBARRAY_HPOST" /* asynInt32 rw */ -#define hSubarrayHSizeString "H_SUBARRAY_HSIZE" /* asynInt32 rw */ -#define hSubarrayVPosString "H_SUBARRAY_VPOS" /* asynInt32 rw */ -#define hSubarrayVSizeString "H_SUBARRAY_VSIZE" /* asynInt32 rw */ -#define hSubarrayModeString "H_SUBARRAY_MODE" /* asynInt32 rw */ +#define hBinningString "H_BINNING" /* asynInt32 rw */ +#define hSubarrayHPosString "H_SUBARRAY_HPOST" /* asynInt32 rw */ +#define hSubarrayHSizeString "H_SUBARRAY_HSIZE" /* asynInt32 rw */ +#define hSubarrayVPosString "H_SUBARRAY_VPOS" /* asynInt32 rw */ +#define hSubarrayVSizeString "H_SUBARRAY_VSIZE" /* asynInt32 rw */ +#define hSubarrayModeString "H_SUBARRAY_MODE" /* asynInt32 rw */ // #define hFrameBundleMode (usb3 only not implemented) // #define hFrameBundleNumber (usb3 only not implemented) // ALU -#define hDefectCorrectModeString "H_DEFECTCORRECT_MODE" /* asynInt32 rw */ -#define hHotPixelCorrectLevelString "H_HOT_PIXEL_CORRECT_LEVEL" /* asynInt32 rw */ -#define hIntensityLutModeString "H_INTENSITY_LUT_MODE" /* asynInt32 rw */ -#define hIntensityLutPageString "H_INTENSITY_LUT_PAGE" /* asynInt32 ro */ -#define hExtractionModeString "H_EXTRACTION_MODE" /* asynInt32 ro */ +#define hDefectCorrectModeString "H_DEFECTCORRECT_MODE" /* asynInt32 rw */ +#define hHotPixelCorrectLevelString "H_HOT_PIXEL_CORRECT_LEVEL" /* asynInt32 rw */ +#define hIntensityLutModeString "H_INTENSITY_LUT_MODE" /* asynInt32 rw */ +#define hIntensityLutPageString "H_INTENSITY_LUT_PAGE" /* asynInt32 ro */ +#define hExtractionModeString "H_EXTRACTION_MODE" /* asynInt32 ro */ // output trigger #define hNumberOfOutputTriggerConnectorString "H_NUMBEROF_OUTPUTTRIGGERCONNECTOR" /* asynInt32 ro */ -#define hOutputTriggerSource0String "H_OUTPUT_TRIGGER_SOURCE0" /* asynInt32 rw */ -#define hOutputTriggerSource1String "H_OUTPUT_TRIGGER_SOURCE1" /* asynInt32 rw */ -#define hOutputTriggerSource2String "H_OUTPUT_TRIGGER_SOURCE2" /* asynInt32 rw */ +#define hOutputTriggerSource0String "H_OUTPUT_TRIGGER_SOURCE0" /* asynInt32 rw */ +#define hOutputTriggerSource1String "H_OUTPUT_TRIGGER_SOURCE1" /* asynInt32 rw */ +#define hOutputTriggerSource2String "H_OUTPUT_TRIGGER_SOURCE2" /* asynInt32 rw */ #define hOutputTriggerPolarity0String "H_OUTPUT_TRIGGER_POLARITY0" /* asynInt32 rw */ #define hOutputTriggerPolarity1String "H_OUTPUT_TRIGGER_POLARITY1" /* asynInt32 rw */ #define hOutputTriggerPolarity2String "H_OUTPUT_TRIGGER_POLARITY2" /* asynInt32 rw */ -#define hOutputTriggerActive0String "H_OUTPUT_TRIGGER_ACTIVE0" /* asynInt32 ro */ -#define hOutputTriggerActive1String "H_OUTPUT_TRIGGER_ACTIVE1" /* asynInt32 ro */ -#define hOutputTriggerActive2String "H_OUTPUT_TRIGGER_ACTIVE2" /* asynInt32 ro */ -#define hOutputTriggerDelay0String "H_OUTPUT_TRIGGER_DELAY0" /* asynFloat64 rw */ -#define hOutputTriggerDelay1String "H_OUTPUT_TRIGGER_DELAY1" /* asynFloat64 rw */ -#define hOutputTriggerDelay2String "H_OUTPUT_TRIGGER_DELAY2" /* asynFloat64 rw */ -#define hOutputTriggerPeriod0String "H_OUTPUT_TRIGGER_PERIOD0" /* asynFloat64 rw */ -#define hOutputTriggerPeriod1String "H_OUTPUT_TRIGGER_PERIOD1" /* asynFloat64 rw */ -#define hOutputTriggerPeriod2String "H_OUTPUT_TRIGGER_PERIOD2" /* asynFloat64 rw */ -#define hOutputTriggerKind0String "H_OUTPUT_TRIGGER_KIND0" /* asynInt32 rw */ -#define hOutputTriggerKind1String "H_OUTPUT_TRIGGER_KIND1" /* asynInt32 rw */ -#define hOutputTriggerKind2String "H_OUTPUT_TRIGGER_KIND2" /* asynInt32 rw */ +#define hOutputTriggerActive0String "H_OUTPUT_TRIGGER_ACTIVE0" /* asynInt32 ro */ +#define hOutputTriggerActive1String "H_OUTPUT_TRIGGER_ACTIVE1" /* asynInt32 ro */ +#define hOutputTriggerActive2String "H_OUTPUT_TRIGGER_ACTIVE2" /* asynInt32 ro */ +#define hOutputTriggerDelay0String "H_OUTPUT_TRIGGER_DELAY0" /* asynFloat64 rw */ +#define hOutputTriggerDelay1String "H_OUTPUT_TRIGGER_DELAY1" /* asynFloat64 rw */ +#define hOutputTriggerDelay2String "H_OUTPUT_TRIGGER_DELAY2" /* asynFloat64 rw */ +#define hOutputTriggerPeriod0String "H_OUTPUT_TRIGGER_PERIOD0" /* asynFloat64 rw */ +#define hOutputTriggerPeriod1String "H_OUTPUT_TRIGGER_PERIOD1" /* asynFloat64 rw */ +#define hOutputTriggerPeriod2String "H_OUTPUT_TRIGGER_PERIOD2" /* asynFloat64 rw */ +#define hOutputTriggerKind0String "H_OUTPUT_TRIGGER_KIND0" /* asynInt32 rw */ +#define hOutputTriggerKind1String "H_OUTPUT_TRIGGER_KIND1" /* asynInt32 rw */ +#define hOutputTriggerKind2String "H_OUTPUT_TRIGGER_KIND2" /* asynInt32 rw */ #define hOutputTriggerBaseSensor0String "H_OUTPUT_TRIGGER_BASE_SENSOR0" /* asynInt32 rw */ #define hOutputTriggerBaseSensor1String "H_OUTPUT_TRIGGER_BASE_SENSOR1" /* asynInt32 rw */ #define hOutputTriggerBaseSensor2String "H_OUTPUT_TRIGGER_BASE_SENSOR2" /* asynInt32 rw */ #define hOutputTriggerPreHsyncCountString "H_OUTPUT_TRIGGER_PRE_HSYNC_COUNT" /* asynInt32 rw */ // Master Puls -#define hMasterPulseModeString "H_MASTERPULSE_MODE" /* asynInt32 rw */ +#define hMasterPulseModeString "H_MASTERPULSE_MODE" /* asynInt32 rw */ #define hMasterPulseTriggerSourceString "H_MASTERPULSE_TRIGGER_SOURCE" /* asynInt32 rw */ -#define hMasterPulseIntervalString "H_MASTERPULSE_INTERVAL" /* asynFloat64 rw */ +#define hMasterPulseIntervalString "H_MASTERPULSE_INTERVAL" /* asynFloat64 rw */ #define hMasterPulseBurstTimesString "H_MASTERPULSE_BURST_TIMES" /* asynInt32 rw */ // Synchronious Timing -#define hTimingReadoutTimeString "H_TIMING_READOUT_TIME" /* asynFloat64 ro */ +#define hTimingReadoutTimeString "H_TIMING_READOUT_TIME" /* asynFloat64 ro */ #define hTimingCyclicTriggerPeriodString "H_TIMING_CYCLICTRIGGERPERIOD" /* asynFloat64 ro */ #define hTimingMinTriggerBlankingString "H_TIMING_MIN_TRIGGER_BLANKING" /* asynFloat64 ro */ #define hTimingMinTriggerIntervalString "H_TIMING_MIN_TRIGGER_INTERVAL" /* asynFloat64 ro */ #define hTimingGlobalExposureDelayString "H_TIMING_GLOBAL_EXPOSURE_DELAY" /* asynFloat64 ro */ -#define hTimingExposureString "H_TIMING_EXPOSURE" /* asynInt32 ro */ +#define hTimingExposureString "H_TIMING_EXPOSURE" /* asynInt32 ro */ #define hTimingInvalidExposurePeriodString "H_TIMING_INVALID_EXPOSURE_PERIOD" /* asynFloat64 ro */ -#define hInternalFrameRateString "H_INTERNAL_FRAME_RATE" /* asynFloat64 rw */ +#define hInternalFrameRateString "H_INTERNAL_FRAME_RATE" /* asynFloat64 rw */ #define hInternalFrameIntervalString "H_INTERNAL_FRAME_INTERVAL" /* asynFloat64 rw */ -#define hInternalLineSpeedString "H_INTERNAL_LINE_SPEED" /* asynFloat64 rw */ -#define hInternalLineIntervalString "H_INTERNAL_LINE_INTERVAL" /* asynFloat64 rw */ +#define hInternalLineSpeedString "H_INTERNAL_LINE_SPEED" /* asynFloat64 rw */ +#define hInternalLineIntervalString "H_INTERNAL_LINE_INTERVAL" /* asynFloat64 rw */ // System information -#define hColorTypeString "H_COLOR_TYPE" /* asynInt32 ro */ -#define hBitPerChannelString "H_BIT_PER_CHANNEL" /* asynInt32 rw */ -//#define hImageWidthString "H_IMAGE_WIDTH" /* asynInt32 ro */ -//#define hImageHeightString "H_IMAGE_HEIGHT" /* asynInt32 ro */ -#define hImageRowBytesString "H_IMAGE_ROWBYTES" /* asynInt32 ro */ -#define hImageFrameBytesString "H_IMAGE_FRAMEBYTES" /* asynInt32 ro */ -#define hImageTopOffsetBytesString "H_IMAGE_TOP_OFFSETBYTES" /* asynInt32 ro */ -#define hImagePixelTypeString "H_IMAGE_PIXEL_TYPE" /* asynInt32 rw */ -#define hBufferRowbytesString "H_BUFFER_ROWBYTES" /* asynInt32 ro */ -#define hBufferFramebytesString "H_BUFFER_FRAMEBYTES" /* asynInt32 ro */ -#define hBufferTopOffsetBytesString "H_BUFFER_TOP_OFFSETBYTES" /* asynInt32 ro */ -#define hBufferPixelTypeString "H_BUFFER_PIXEL_TYPE" /* asynInt32 ro */ +#define hColorTypeString "H_COLOR_TYPE" /* asynInt32 ro */ +#define hBitPerChannelString "H_BIT_PER_CHANNEL" /* asynInt32 rw */ +//#define hImageWidthString "H_IMAGE_WIDTH" /* asynInt32 ro */ +//#define hImageHeightString "H_IMAGE_HEIGHT" /* asynInt32 ro */ +#define hImageRowBytesString "H_IMAGE_ROWBYTES" /* asynInt32 ro */ +#define hImageFrameBytesString "H_IMAGE_FRAMEBYTES" /* asynInt32 ro */ +#define hImageTopOffsetBytesString "H_IMAGE_TOP_OFFSETBYTES" /* asynInt32 ro */ +#define hImagePixelTypeString "H_IMAGE_PIXEL_TYPE" /* asynInt32 rw */ +#define hBufferRowbytesString "H_BUFFER_ROWBYTES" /* asynInt32 ro */ +#define hBufferFramebytesString "H_BUFFER_FRAMEBYTES" /* asynInt32 ro */ +#define hBufferTopOffsetBytesString "H_BUFFER_TOP_OFFSETBYTES" /* asynInt32 ro */ +#define hBufferPixelTypeString "H_BUFFER_PIXEL_TYPE" /* asynInt32 ro */ #define hRecordFixedBytesPerFileString "H_RECORD_FIXED_BYTES_PER_FILE" /* asynInt32 ro */ #define hRecordFixedBytesPerSessionString "H_RECORD_FIXED_BYTES_PER_SESION" /* asynInt32 ro */ #define hRecordFixedBytesPerFrameString "H_RECORD_FIXED_BYTES_PER_FRAME" /* asynInt32 ro */ -#define hSystemAliveString "H_SYSTEM_ALIVE" /* asynInt32 ro */ +#define hSystemAliveString "H_SYSTEM_ALIVE" /* asynInt32 ro */ #define hConversionFactorCoeffString "H_CONVERSIONFACTOR_COEFF" /* asynFloat64 ro */ #define hConversionFactorOffsetString "H_CONVERSIONFACTOR_OFFSET" /* asynFloat64 ro */ -#define hNumberOfViewString "H_NUMBER_OF_VIEW" /* asynInt32 ro */ +#define hNumberOfViewString "H_NUMBER_OF_VIEW" /* asynInt32 ro */ #define hImageDetectorPixelWidthString "H_IMAGE_DETECTOR_PIXEL_WIDTH" /* asynFloat64 ro */ #define hImageDetectorPixelHeightString "H_IMAGE_DETECTOR_PIXEL_HEIGHT" /* asynFloat64 ro */ #define hImageDetectorPixelNumHorzString "H_IMAGE_DETECTOR_PIXEL_NUM_HORZ" /* asynInt32 ro */ @@ -136,11 +137,11 @@ #define DETECTOR_PIXEL_NUM_HORZ 0x00420830 #define DETECTOR_PIXEL_NUM_VERT 0x00420840 -class epicsShareClass Hama : public ADDriver { +class epicsShareClass Orca : public ADDriver { public: - Hama(const char*, int, int, size_t, int, int, int); -// ~Hama(); + Orca(const char*, int, int, size_t, int, int, int); +// ~Orca(); /* override ADDriver methods */ virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); @@ -158,7 +159,7 @@ public: protected: int hFrameRate; #define FIRST_HAMA_PARAM hFrameRate - int hHamaName; + int hOrcaName; int hVendor; int hModel; int hCameraID; diff --git a/README.md b/README.md index cadf2f4..d572142 100644 --- a/README.md +++ b/README.md @@ -15,15 +15,15 @@ conda create -n hama epics-base require tclx make compilers adcore busy To activate env: -conda activate hama +conda activate orca git clone ... -cd git/ADHama +cd git/ADOrca compilation: -make -f ADHama.Makefile LIBVERSION=0.1 clean uninstall build db install +make -f ADOrca.Makefile LIBVERSION=0.1 clean uninstall build db install execution: diff --git a/cmds/st.cmd b/cmds/st.cmd index 6aa4d64..a109039 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -1,9 +1,9 @@ # This should be a test startup script -require adhama +require adorca require adpluginkafka -epicsEnvSet("PREFIX", "Hama:") -epicsEnvSet("PORT", "HAMA") +epicsEnvSet("PREFIX", "Orca:") +epicsEnvSet("PORT", "ORCA") epicsEnvSet("CAMERA", "0") epicsEnvSet("QSIZE", "21") epicsEnvSet("XSIZE", "2048") @@ -17,11 +17,11 @@ epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "64000000") epicsEnvSet("EVR", "Labs-ECDC:TS-EVR-11") epicsEnvSet("EVR_EVENT", "B") -# iocshLoad("$(adhama_DIR)ADHama.iocsh") +# iocshLoad("$(adorca_DIR)ADOrca.iocsh") -devHamamatsuConfig("$(PORT)", $(CAMERA), 0, 0, 0, 0, 10) +devOrcamatsuConfig("$(PORT)", $(CAMERA), 0, 0, 0, 0, 10) -dbLoadRecords("$(adhama_DIR)db/hama.db","P=$(PREFIX),R=cam1:,EVR=$(EVR),E=$(EVR_EVENT),PORT=$(PORT),ADDR=0,TIMEOUT=1") +dbLoadRecords("$(adorca_DIR)db/orca.db","P=$(PREFIX),R=cam1:,EVR=$(EVR),E=$(EVR_EVENT),PORT=$(PORT),ADDR=0,TIMEOUT=1") #asynSetTraceMask("$(PORT)",-1,0x9) #asynSetTraceIOMask("$(PORT)",-1,0x2) @@ -36,34 +36,34 @@ NDPvaConfigure("PVA1", $(QSIZE), 0, "$(PORT)", 0, "$(PREFIX)Pva1:Image", 0, 0, 0 dbLoadRecords("$(adcore_DIR)/db/NDPva.template", "P=$(PREFIX),R=Pva1:, PORT=PVA1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT)") # -# Create a standard arrays plugin, set it to get data from hama driver. +# Create a standard arrays plugin, set it to get data from orca driver. NDStdArraysConfigure("Image1", "$(QSIZE)", 0, "$(PORT)", 0, 0) dbLoadRecords("NDStdArrays.template", "P=$(PREFIX),R=image1:,PORT=Image1,ADDR=0,TIMEOUT=1,NDARRAY_PORT=$(PORT),TYPE=Int32,FTVL=LONG,NELEMENTS=$(NELEMENTS)") -# Create a kafka plugin, set it to get data from hama driver. +# Create a kafka plugin, set it to get data from orca driver. #epicsEnvSet("KFK_TOPIC", "ymir_camera") epicsEnvSet("KFK_TOPIC", "nido_camera") # Kafka plugin -epicsEnvSet("KFK_CONFIG_FILE_PATH", "/home/iocuser/git/adhama/cmds/kafka.conf") +epicsEnvSet("KFK_CONFIG_FILE_PATH", "/home/iocuser/git/adorca/cmds/kafka.conf") -KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_TOPIC)", "hama_source","$(KFK_CONFIG_FILE_PATH)") +KafkaPluginConfigure("KFK1", 3, 1, "$(PORT)", 0, -1, "$(KFK_TOPIC)", "orca_source","$(KFK_CONFIG_FILE_PATH)") dbLoadRecords("$(adpluginkafka_DIR)db/adpluginkafka.db", "P=$(PREFIX), R=Kfk1:, PORT=KFK1, ADDR=0, TIMEOUT=1, NDARRAY_PORT=$(PORT)") startPVAServer iocInit() -dbpf Hama:cam1:PoolUsedMem.SCAN 0 -dbpf Hama:image1:EnableCallbacks 1 -dbpf Hama:Kfk1:EnableCallbacks 1 +dbpf Orca:cam1:PoolUsedMem.SCAN 0 +dbpf Orca:image1:EnableCallbacks 1 +dbpf Orca:Kfk1:EnableCallbacks 1 -dbpf Hama:cam1:AcquireTime .001 -dbpf Hama:cam1:AcquirePeriod .02 -dbpf Hama:cam1:TriggerSource-S 1 # external -dbpf Hama:cam1:NumImages 10 -dbpf Hama:cam1:ImageMode 1 +dbpf Orca:cam1:AcquireTime .001 +dbpf Orca:cam1:AcquirePeriod .02 +dbpf Orca:cam1:TriggerSource-S 1 # external +dbpf Orca:cam1:NumImages 10 +dbpf Orca:cam1:ImageMode 1 -#dbpf Hama:cam1:TriggerPolarity-S # 2-positive, 1-negative +#dbpf Orca:cam1:TriggerPolarity-S # 2-positive, 1-negative epicsThreadSleep(1.0) diff --git a/iocsh/ADHama.iocsh b/iocsh/ADOrca.iocsh similarity index 70% rename from iocsh/ADHama.iocsh rename to iocsh/ADOrca.iocsh index 1d5100b..12f5cf1 100644 --- a/iocsh/ADHama.iocsh +++ b/iocsh/ADOrca.iocsh @@ -1,3 +1,3 @@ # This should be the included snippet to configure and run the deployed IOC. It should be loaded with # -# iocshLoad("$(ADHama_DIR)/ADHama.iocsh") +# iocshLoad("$(ADOrca_DIR)/ADOrca.iocsh") From 81ee3c28a5ca96bce2a62554f702542bc55b07ad Mon Sep 17 00:00:00 2001 From: Douglas Araujo Date: Mon, 29 Jan 2024 09:21:22 +0100 Subject: [PATCH 62/66] Add mechanism to check dropped frames --- ADOrca.Makefile | 2 -- ADOrcaApp/Db/orca.template | 13 +++++++++++ ADOrcaApp/src/orca.cpp | 45 ++++++++++++++++++++++++++++++++------ ADOrcaApp/src/orca.h | 4 ++++ cmds/st.cmd | 6 ++--- 5 files changed, 58 insertions(+), 12 deletions(-) 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 From 1a3c91838bbaf1504625dbb02cfdf6ae4ba3e227 Mon Sep 17 00:00:00 2001 From: Jim Larsson Date: Tue, 13 Feb 2024 11:45:02 +0100 Subject: [PATCH 63/66] add elapsedTotalTime and compare with max acq. --- ADOrcaApp/src/orca.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp index 0556dfa..09bc064 100644 --- a/ADOrcaApp/src/orca.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -783,10 +783,11 @@ void Orca::imageTask(){ DCAMCAP_TRANSFERINFO captransferinfo; epicsTimeStamp prevAcqTime, currentAcqTime; epicsTimeStamp prev_trigger_time, current_trigger_time; - double elapsedTime; + epicsTimeStamp startTimeStamp; + double elapsedTime, elapsedTotalTime; int evr_counts = 0; double exposure_time, readout_time; - + double maxAcqusitionTime; int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; lock(); @@ -810,6 +811,7 @@ void Orca::imageTask(){ epicsThreadSleep(.1); } else { + epicsTimeGetCurrent(&startTimeStamp); getIntegerParam(ADNumImages, &totalImages); getIntegerParam(ADImageMode, &imageMode); setIntegerParam(ADStatus, ADStatusAcquire); @@ -828,7 +830,7 @@ void Orca::imageTask(){ imageTransferStatus(m_hdcam, captransferinfo); lock(); - if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { + if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { printf("\nOrca Frame Count: %d\n", captransferinfo.nFrameCount); prevAcquisitionCount = captransferinfo.nFrameCount; @@ -926,6 +928,12 @@ void Orca::imageTask(){ } epicsTimeGetCurrent(¤t_trigger_time); + if (imageMode == ADImageMultiple) { + elapsedTotalTime = epicsTimeDiffInSeconds(¤t_trigger_time, &startTimeStamp); + elapsedTotalTime > maxAcqusitionTime) { + setStringParam(ADStatusMessage, "Acquisition taking too long!"); + } + } if (epicsTimeDiffInSeconds(¤t_trigger_time, &prev_trigger_time) > (exposure_time + readout_time)) { if ((evr_counts_since_last_start) > captransferinfo.nFrameCount ) { From 9bf0389752d9ace847dfb429381e7a5fe15a4a8e Mon Sep 17 00:00:00 2001 From: Jim Larsson Date: Tue, 13 Feb 2024 14:32:11 +0100 Subject: [PATCH 64/66] ICSHWI-17104: add waiting time until status update -taking too long --- ADOrcaApp/src/orca.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp index 09bc064..978df5c 100644 --- a/ADOrcaApp/src/orca.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -787,7 +787,7 @@ void Orca::imageTask(){ double elapsedTime, elapsedTotalTime; int evr_counts = 0; double exposure_time, readout_time; - double maxAcqusitionTime; + double maxAcqusitionTime, setAcqusitionRate; int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; lock(); @@ -812,6 +812,8 @@ void Orca::imageTask(){ } else { epicsTimeGetCurrent(&startTimeStamp); + getDoubleParam(ADAcquirePeriod, &setAcqusitionRate); + maxAcqusitionTime = setAcqusitionRate * 2; getIntegerParam(ADNumImages, &totalImages); getIntegerParam(ADImageMode, &imageMode); setIntegerParam(ADStatus, ADStatusAcquire); @@ -926,11 +928,13 @@ void Orca::imageTask(){ epicsTimeGetCurrent(&prev_trigger_time); evr_counts_since_last_start_previous = evr_counts_since_last_start; } + - epicsTimeGetCurrent(¤t_trigger_time); + if (imageMode == ADImageMultiple) { + epicsTimeGetCurrent(¤t_trigger_time); elapsedTotalTime = epicsTimeDiffInSeconds(¤t_trigger_time, &startTimeStamp); - elapsedTotalTime > maxAcqusitionTime) { + if (elapsedTotalTime > maxAcqusitionTime) { setStringParam(ADStatusMessage, "Acquisition taking too long!"); } } From 15e0849a58619f1d2cbe5b717025a0626d5cde0f Mon Sep 17 00:00:00 2001 From: Jim Larsson Date: Mon, 19 Feb 2024 11:27:22 +0100 Subject: [PATCH 65/66] fix(orca.cpp): timeout msg --- ADOrcaApp/src/orca.cpp | 29 ++++++++++++++++------------- cmds/st.cmd | 3 ++- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp index 978df5c..0d7d1f0 100644 --- a/ADOrcaApp/src/orca.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -783,11 +783,10 @@ void Orca::imageTask(){ DCAMCAP_TRANSFERINFO captransferinfo; epicsTimeStamp prevAcqTime, currentAcqTime; epicsTimeStamp prev_trigger_time, current_trigger_time; - epicsTimeStamp startTimeStamp; - double elapsedTime, elapsedTotalTime; + double elapsedTime; int evr_counts = 0; double exposure_time, readout_time; - double maxAcqusitionTime, setAcqusitionRate; + double maxAcqusitionTime, acqusitionRate; int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; lock(); @@ -811,9 +810,6 @@ void Orca::imageTask(){ epicsThreadSleep(.1); } else { - epicsTimeGetCurrent(&startTimeStamp); - getDoubleParam(ADAcquirePeriod, &setAcqusitionRate); - maxAcqusitionTime = setAcqusitionRate * 2; getIntegerParam(ADNumImages, &totalImages); getIntegerParam(ADImageMode, &imageMode); setIntegerParam(ADStatus, ADStatusAcquire); @@ -931,14 +927,21 @@ void Orca::imageTask(){ - if (imageMode == ADImageMultiple) { - epicsTimeGetCurrent(¤t_trigger_time); - elapsedTotalTime = epicsTimeDiffInSeconds(¤t_trigger_time, &startTimeStamp); - if (elapsedTotalTime > maxAcqusitionTime) { - setStringParam(ADStatusMessage, "Acquisition taking too long!"); - } - } + + getDoubleParam(ADAcquirePeriod, &acqusitionRate); + maxAcqusitionTime = acqusitionRate * 2; + epicsTimeGetCurrent(¤tAcqTime); + if (epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) > maxAcqusitionTime) { + setShutter(0); + stopAcquire(); + setIntegerParam(ADAcquire, 0); + setIntegerParam(hAcqControl, 0); + setIntegerParam(ADStatus,ADStatusError); + setStringParam(ADStatusMessage, "Acquisition timeout"); + } + + 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; diff --git a/cmds/st.cmd b/cmds/st.cmd index d830eb8..ae0e90d 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -14,7 +14,8 @@ epicsEnvSet("NELEMENTS", "4194304") epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "64000000") #EVR settings -epicsEnvSet("EVR", "LabS-NIDO:Ctrl-EVR-01") +#epicsEnvSet("EVR", "LabS-NIDO:Ctrl-EVR-01") +epicsEnvSet("EVR", "Labs-ECDC:TS-EVR-11") epicsEnvSet("EVR_EVENT", "B") # iocshLoad("$(adorca_DIR)ADOrca.iocsh") From 2562f3d732ad2e4f28b1d728dfae4e9c3922c8c6 Mon Sep 17 00:00:00 2001 From: Jim Larsson Date: Fri, 23 Feb 2024 14:34:52 +0100 Subject: [PATCH 66/66] (Modify) Logic to #StopAfterCycles for cont. mode --- ADOrca.Makefile | 2 +- ADOrcaApp/Db/orca.template | 3 ++- ADOrcaApp/src/orca.cpp | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ADOrca.Makefile b/ADOrca.Makefile index 5d63f25..9bee891 100644 --- a/ADOrca.Makefile +++ b/ADOrca.Makefile @@ -67,7 +67,7 @@ APPCMDS := $(APP)/cmds # ############################################################################ -TEMPLATES += $(wildcard $(APPDB)/*.db) +# TEMPLATES += $(wildcard $(APPDB)/*.db) TEMPLATES += $(wildcard $(ADCORE_DIR)/*.db) # USR_INCLUDES += -I$(where_am_I)$(APPSRC) diff --git a/ADOrcaApp/Db/orca.template b/ADOrcaApp/Db/orca.template index bfaf218..3806d11 100644 --- a/ADOrcaApp/Db/orca.template +++ b/ADOrcaApp/Db/orca.template @@ -217,10 +217,11 @@ record(ai, "$(P)$(R)#NCyclesPartial") { ## Stop sequence after N cycles record(calcout, "$(P)$(R)#StopAfterCycles") { field(DESC, "StopAfterCycles") - field(CALC, "C < (A + B)") + field(CALC, "(C < (A + B)) || (D=2)") field(INPA, "$(P)$(R)#NCyclesPartial NPP") field(INPB, "$(P)$(R)NumImages_RBV NPP") field(INPC, "$(P)$(R)Cycle-Cnt CPP") + field(INPD, "$(P)$(R)ImageMode_RBV NPP") field(OOPT, "When Zero") field(OUT, "$(P)$(R)#SoftSeqDisable PP") } diff --git a/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp index 0d7d1f0..004243f 100644 --- a/ADOrcaApp/src/orca.cpp +++ b/ADOrcaApp/src/orca.cpp @@ -929,9 +929,10 @@ void Orca::imageTask(){ getDoubleParam(ADAcquirePeriod, &acqusitionRate); - maxAcqusitionTime = acqusitionRate * 2; + maxAcqusitionTime = acqusitionRate * 2; epicsTimeGetCurrent(¤tAcqTime); if (epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) > maxAcqusitionTime) { + printf("[DEBUG]::maxAcqusitionTime %f\n", maxAcqusitionTime); setShutter(0); stopAcquire(); setIntegerParam(ADAcquire, 0);