diff --git a/.gitignore b/.gitignore index 75efaec..59231a1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,9 @@ O.* .cvsignore *.db *.db.* -*.Makefile -Makefile.E3 \ No newline at end of file +pv.list +core.* +.vscode +list.txt +kafka.conf +ecdc-kafka-ca.crt diff --git a/ADHamaApp/Db/.DS_Store b/ADHamaApp/Db/.DS_Store deleted file mode 100644 index 6181c29..0000000 Binary files a/ADHamaApp/Db/.DS_Store and /dev/null differ diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp deleted file mode 100644 index c492afe..0000000 --- a/ADHamaApp/src/hama.cpp +++ /dev/null @@ -1,1299 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "hama.h" -// --- includes from DCMAPI ---- -#include "dcamprop.h" -// - - -#define NUM_HAMA_PARAMS ((int)(&LAST_HAMA_PARAM - &FIRST_HAMA_PARAM + 1)) - -static const char *driverName="drvHama"; - -static void c_imagetask(void *arg) { - Hama *p = (Hama *)arg; - p->imageTask(); -} - -static void c_temperaturetask(void *arg) { - Hama *p = (Hama *)arg; - p->temperatureTask(); -} - - -//============================================================================ -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, - asynEnumMask, asynEnumMask, - ASYN_CANBLOCK, /* ASYN_CANBLOCK=1 ASYN_MULTIDEVICE=0 */ - 1, /* autoConnect=1 */ - priority, stackSize), - m_hdcam(NULL), m_id(0) - -{ - const char *functionName = "hamaDetector::hamaDetector"; - - printf("[DEBUG] === Constructor ADHama ===\n"); - printf("[DEBUG] driverName: %s\n", driverName); - - stopThread = 0; - - /* Create the epicsEvents for signaling to task when acquisition starts and stops */ - startAcquireEventId_ = epicsEventCreate(epicsEventEmpty); - if (!startAcquireEventId_) { - 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); - createParam( hVendorString, asynParamOctet, &hVendor); - createParam( hModelString, asynParamOctet, &hModel); - createParam( hCameraIDString, asynParamOctet, &hCameraID); - createParam( hBusString, asynParamOctet, &hBus); - createParam( hCameraVersionString, asynParamOctet, &hCameraVersion); - createParam( hDriverVersionString, asynParamOctet, &hDriverVersion); - createParam( hModuleVersionString, asynParamOctet, &hModuleVersion); - createParam( hDcamApiVersionString, asynParamOctet, &hDcamApiVersion); - -//Sensor Mode and Speed - createParam( hSensorModeString, asynParamInt32, &hSensorMode); - createParam( hReadoutSpeedString, asynParamInt32, &hReadoutSpeed); - createParam( hReadoutDirectionString, asynParamInt32, &hReadoutDirection); - -//Trigger - createParam( hTriggerModeString, asynParamInt32, &hTriggerMode); - createParam( hTriggerSourceString, asynParamInt32, &hTriggerSource); - createParam( hTriggerActiveString, asynParamInt32, &hTriggerActive); - createParam( hTriggerGlobalExposureString, asynParamInt32, &hTriggerGlobalExposure); - createParam( hTriggerPolarityString, asynParamInt32, &hTriggerPolarity); - createParam( hTriggerConnectorString, asynParamInt32, &hTriggerConnector); - createParam( hTriggerTimesString, asynParamInt32, &hTriggerTimes); - createParam( hTriggerDelayString, asynParamFloat64, &hTriggerDelay); - createParam( hInternalTriggerHandlingString, asynParamInt32, &hInternalTriggerHandling); - -//Sensor cooler - createParam( hSensorTemperatureString, asynParamFloat64, &hSensorTemperature); - createParam( hSensorCoolerString, asynParamInt32, &hSensorCooler); - createParam( hSensorCoolerStatusString, asynParamInt32, &hSensorCoolerStatus); - -//Binning and ROI - createParam( hBinningString, asynParamInt32, &hBinning); - createParam( hSubarrayHPosString, asynParamInt32, &hSubarrayHPos); - createParam( hSubarrayHSizeString, asynParamInt32, &hSubarrayHSize); - createParam( hSubarrayVPosString, asynParamInt32, &hSubarrayVPos); - createParam( hSubarrayVSizeString, asynParamInt32, &hSubarrayVSize); - createParam( hSubarrayModeString, asynParamInt32, &hSubarrayMode); - -//Feature - createParam( hExposureTimeString, asynParamFloat64, &hExposureTime); - -//ALU - createParam( hDefectCorrectModeString, asynParamInt32, &hDefectCorrectMode); - createParam( hHotPixelCorrectLevelString, asynParamInt32, &hHotPixelCorrectLevel); - createParam( hIntensityLutModeString, asynParamInt32, &hIntensityLutMode); - createParam( hIntensityLutPageString, asynParamInt32, &hIntensityLutPage); - createParam( hExtractionModeString, asynParamInt32, &hExtractionMode); - -//output trigger - createParam( hNrOutputTriggerConnectorsString, asynParamInt32, &hNrOutputTriggerConnectors); - createParam( hOutputTriggerSource0String, asynParamInt32, &hOutputTriggerSource0), - createParam( hOutputTriggerSource1String, asynParamInt32, &hOutputTriggerSource1); - createParam( hOutputTriggerSource2String, asynParamInt32, &hOutputTriggerSource2); - createParam( hOutputTriggerPolarity0String, asynParamInt32, &hOutputTriggerPolarity0); - createParam( hOutputTriggerPolarity1String, asynParamInt32, &hOutputTriggerPolarity1); - createParam( hOutputTriggerPolarity2String, asynParamInt32, &hOutputTriggerPolarity2); - createParam( hOutputTriggerActive0String, asynParamInt32, &hOutputTriggerActive0); - createParam( hOutputTriggerActive1String, asynParamInt32, &hOutputTriggerActive1); - createParam( hOutputTriggerActive2String, asynParamInt32, &hOutputTriggerActive2); - createParam( hOutputTriggerDelay0String, asynParamFloat64, &hOutputTriggerDelay0); - createParam( hOutputTriggerDelay1String, asynParamFloat64, &hOutputTriggerDelay1); - createParam( hOutputTriggerDelay2String, asynParamFloat64, &hOutputTriggerDelay2); - createParam( hOutputTriggerPeriod0String, asynParamFloat64, &hOutputTriggerPeriod0); - createParam( hOutputTriggerPeriod1String, asynParamFloat64, &hOutputTriggerPeriod1); - createParam( hOutputTriggerPeriod2String, asynParamFloat64, &hOutputTriggerPeriod2); - createParam( hOutputTriggerKind0String, asynParamInt32, &hOutputTriggerKind0); - createParam( hOutputTriggerKind1String, asynParamInt32, &hOutputTriggerKind1); - createParam( hOutputTriggerKind2String, asynParamInt32, &hOutputTriggerKind2); - createParam( hOutputTriggerBaseSensor0String, asynParamInt32, &hOutputTriggerBaseSensor0); - createParam( hOutputTriggerBaseSensor1String, asynParamInt32, &hOutputTriggerBaseSensor1); - createParam( hOutputTriggerBaseSensor2String, asynParamInt32, &hOutputTriggerBaseSensor2); - createParam( hOutTriggerPreHsyncCountString, asynParamInt32, &hOutTriggerPreHsyncCount); - -//Master Puls - createParam( hMasterPulseModeString, asynParamInt32, &hMasterPulseMode); - createParam( hMasterPulseTriggerSourceString, asynParamInt32, &hMasterPulseTriggerSource); - createParam( hMasterPulseIntervalString, asynParamFloat64, &hMasterPulseInterval); - createParam( hMasterPulseBurstTimesString, asynParamInt32, &hMasterPulseBurstTimes); - -//Synchronious Timing - createParam( hTimingReadoutTimeString, asynParamFloat64, &hTimingReadoutTime); - createParam( hTimingCyclicTriggerPeriodString, asynParamFloat64, &hTimingCyclicTriggerPeriod); - createParam( hTimingMinTriggerBlankingString, asynParamFloat64, &hTimingMinTriggerBlanking); - createParam( hTimingMinTriggerIntervalString, asynParamFloat64, &hTimingMinTriggerInterval); - createParam( hTimingGlobalExposureDelayString, asynParamFloat64, &hTimingGlobalExposureDelay); - createParam( hTimingExposureString, asynParamInt32, &hTimingExposure); - createParam( hTimingInvalidExposurePeriodString, asynParamFloat64, &hTimingInvalidExposurePeriod); - createParam( hInternalFrameRateString, asynParamFloat64, &hInternalFrameRate); - createParam( hInternalFrameIntervalString, asynParamFloat64, &hInternalFrameInterval); - createParam( hInternalLineSpeedString, asynParamFloat64, &hInternalLineSpeed); - createParam( hInternalLineIntervalString, asynParamFloat64, &hInternalLineInterval); - -//System Information - createParam( hColorTypeString, asynParamInt32, &hColorType); - createParam( hBitPerChannelString, asynParamInt32, &hBitPerChannel); - createParam( hImageWidthString, asynParamInt32, &hImageWidth); - createParam( hImageHeightString, asynParamInt32, &hImageHeight); - createParam( hImageRowBytesString, asynParamInt32, &hImageRowbytes); - createParam( hImageFrameBytesString, asynParamInt32, &hImageFramebytes); - createParam( hImageTopOffsetBytesString, asynParamInt32, &hImageTopOffsetBytes); - createParam( hImagePixelTypeString, asynParamInt32, &hImagePixelType); - createParam( hBufferRowbytesString, asynParamInt32, &hBufferRowbytes); - createParam( hBufferFramebytesString, asynParamInt32, &hBufferFramebytes); - createParam( hBufferTopOffsetBytesString, asynParamInt32, &hBufferTopOffsetBytes); - createParam( hBufferPixelTypeString, asynParamInt32, &hBufferPixelType); - createParam( hRecordFixedBytesPerFileString, asynParamInt32, &hRecordFixedBytesPerFile); - createParam( hRecordFixedBytesPerSessionString, asynParamInt32, &hRecordFixedBytesPerSession); - createParam( hRecordFixedBytesPerFrameString, asynParamInt32, &hRecordFixedBytesPerFrame); - createParam( hSystemAliveString, asynParamInt32, &hSystemAlive); - createParam( hConversionFactorCoeffString, asynParamFloat64, &hConversionFactorCoeff); - createParam( hConversionFactorOffsetString, asynParamFloat64, &hConversionFactorOffset); - createParam( hNumberOfViewString, asynParamInt32, &hNumberOfView); - createParam( hImageDetectorPixelWidthString, asynParamFloat64, &hImageDetectorPixelWidth); - createParam( hImageDetectorPixelHeightString, asynParamFloat64, &hImageDetectorPixelHeight); - createParam( hImageDetectorPixelNumHorzString, asynParamInt32, &hImageDetectorPixelNumHorz); - createParam( hImageDetectorPixelNumVertString, asynParamInt32, &hImageDetectorPixelNumVert); - createParam( hTimeStampProducerString, asynParamInt32, &hTimeStampProducer); - createParam( hFrameStampProducerString, asynParamInt32, &hFrameStampProducer); - - - setIntegerParam(NDArrayCallbacks, 1); - callParamCallbacks(); - - connectCamera(); - - int err = 0; - -/* - 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); - */ - - - 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); - } - - /* launch image read task */ - epicsThreadCreate("HamaImageTask", - epicsThreadPriorityMedium, - epicsThreadGetStackSize(epicsThreadStackMedium), - c_imagetask, this); - - /* launch temp read task */ - epicsThreadCreate("HamaTemperatureTask", - epicsThreadPriorityMedium, - epicsThreadGetStackSize(epicsThreadStackMedium), - c_temperaturetask, this); - - /* shutdown on exit */ - //epicsAtExit(c_shutdown, this); - - printf("[DEBUG] === END Constructor ADHama ===\n"); -} -//============================================================================ -//Hama::~Hama(){ -// // not sure if the destructor has to be define here... -// printf("[DEBUG] === Destructor ADHama ===\n"); -//} - -//============================================================================ -int Hama::getParameterStr(int propertyID){ - - asynStatus status = asynSuccess; - - char text[256]; - DCAMDEV_STRING param; - memset( ¶m, 0, sizeof(param) ); - param.size = sizeof(param); - param.text = text; - param.textbytes = sizeof(text); - param.iString = propertyID; - - switch (propertyID){ - case DCAM_IDSTR_VENDOR: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hVendor, text); - printf("[DEBUG]::VENDOR %s\n", text); - break; - case DCAM_IDSTR_MODEL: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hModel, text); - printf("[DEBUG]::MODEL %s\n", text); - break; - case DCAM_IDSTR_CAMERAID: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hCameraID, text); - printf("[DEBUG]::CAMERAID %s\n", text); - break; - case DCAM_IDSTR_BUS: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hBus, text); - printf("[DEBUG]::BUS %s\n", text); - break; - case DCAM_IDSTR_CAMERAVERSION: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hCameraVersion, text); - printf("[DEBUG]::CAMERAVERSION %s\n", text); - break; - case DCAM_IDSTR_DRIVERVERSION: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hDriverVersion, text); - printf("[DEBUG]::DRIVERVERSION %s\n", text); - break; - case DCAM_IDSTR_MODULEVERSION: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hModuleVersion, text); - printf("[DEBUG]::MODULEVERSION %s\n", text); - break; - case DCAM_IDSTR_DCAMAPIVERSION: - dcamdev_getstring(m_hdcam, ¶m); - status = setStringParam(hDcamApiVersion, text); - printf("[DEBUG]::DCAMPVERSION %s\n", text); - break; - default: - printf("[DEBUG]::NOT SUPPORTED\n"); - 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); -} -//============================================================================ -int Hama::getParameter(int propertyID){ - printf("\n[DEBUG] Function:getProperty\n"); - - double value = 0; - dcamprop_getvalue(m_hdcam, propertyID, &value); - - switch (propertyID){ - case DCAM_IDPROP_SENSORMODE: - printf("The SENSOR MODE = %f\n", value); - break; - - case DCAM_IDPROP_READOUTSPEED: - printf("The READOUT SPEED = %f\n", value); - break; - - case DCAM_IDPROP_READOUT_DIRECTION: - printf("The READOUT DIRECTION = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGERSOURCE: - printf("The = TRIGGER SOURCE = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGER_MODE: - printf("The TRIGGER MODE = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGERACTIVE: - printf("The TRIGGER ACTIVE = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: - printf("The TRIGGER GLOBAL EXPOSURE = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGERPOLARITY: - printf("The TRIGGER POLARITY = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGER_CONNECTOR: - printf("The TRIGGER CONNECTOR = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGERTIMES: - printf("The TRIGGER TIMES = %f\n", value); - break; - - case DCAM_IDPROP_TRIGGERDELAY: - printf("The TRIGGER DELAY = %f\n", value); - break; - - case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: - printf("The INTERNAL TRIGGE HANDLING = %f\n", value); - break; - - default: - printf("The = %f\n", value); - break; - - - - } - -return 0; -} - -//============================================================================ -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; -} - -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(){ -epicsTimeStamp imageStamp; - int status; - unsigned char *image; - int acquire; - int count; - int callback; - int acquireStatusError = 0; - int eventStatus=0; - int imageMode=0; - int totalImages=0; - uint64_t prevAcquisitionCount = 0; - epicsTimeStamp startTime; // endTime; - DCAMCAP_TRANSFERINFO captransferinfo; - - //static const char *functionName = "imageTask"; - - while(1) { - getIntegerParam(ADAcquire, &acquire); - if(!acquire) { - puts("Waitng start"); - status = epicsEventWait(startAcquireEventId_); - puts("Starting request received"); - - /* We are acquiring. */ - //acquireStatusError = 0; - setIntegerParam(ADStatus, ADStatusAcquire); - - status = startAcquire(); - printf("Status: %d\n", status); - if (status != asynSuccess) { - epicsEventSignal(this->stopAcquireEventId_); - acquireStatusError = 1; - epicsThreadSleep(.1); - } - else { - acquire = 1; - /* Get the current time */ - 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. */ - epicsThreadSleep(0.001); - - // get image transfer status. - imageTransferStatus(m_hdcam, captransferinfo); - - if (prevAcquisitionCount < captransferinfo.nFrameCount) { - //printf("nFrameCount: %d, nNewestFrameIndex: %d\n", captransferinfo.nFrameCount, captransferinfo.nNewestFrameIndex); - prevAcquisitionCount = captransferinfo.nFrameCount; - - // get image information - int32 pixeltype = 0, width = 0, rowbytes = 0, height = 0, framebytes = 0; - getImageInformation(m_hdcam, pixeltype, width, rowbytes, height, framebytes); - - if( pixeltype != DCAM_PIXELTYPE_MONO16 ) { - printf( "not implement\n" ); - return; - } - - setIntegerParam(NDArraySizeX, (int)width); - setIntegerParam(NDArraySizeY, (int)height); - /* Do callbacks so higher layers see any changes */ - callParamCallbacks(); - - image = new unsigned char[width * 2 * height]; - memset(image, 0, width * 2 * height); - - count++; - accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, width * 2, width, height); - - getIntegerParam(NDArrayCallbacks, &callback); - if(callback) { - - NDArray *pImage; - size_t dims[2]; - int itemp=0; - - getIntegerParam(NDArraySizeX, &itemp); dims[0] = itemp; - getIntegerParam(NDArraySizeY, &itemp); dims[1] = itemp; - pImage = pNDArrayPool->alloc(2, dims, NDUInt16, 0, 0); - - if(pImage) { - pImage->uniqueId = count; - pImage->timeStamp = imageStamp.secPastEpoch + - (imageStamp.nsec / 1.0e9); - updateTimeStamp(&pImage->epicsTS); - - memcpy(pImage->pData, (epicsUInt16 *)image, pImage->dataSize); - - getAttributes(pImage->pAttributeList); - doCallbacksGenericPointer(pImage, NDArrayData, 0); - pImage->release(); - } - } - - delete[] image; - } - - getIntegerParam(ADNumImages, &totalImages); - getIntegerParam(ADImageMode, &imageMode); - - if ((imageMode == ADImageMultiple && totalImages == captransferinfo.nFrameCount) || - (imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) { - setShutter(0); - stopAcquire(); - setIntegerParam(ADAcquire, 0); - } - - callParamCallbacks(); - } -} -//============================================================================ -void Hama::temperatureTask(){ - static const char *functionName = "tempTask"; - asynStatus status = asynSuccess; - double value = 0; - - while( !stopThread ) { - m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORTEMPERATURE, &value); - - if(m_err != DCAMERR_SUCCESS){ - 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); - } - - status = (asynStatus) callParamCallbacks(); - epicsThreadSleep(1.0); - - } - -} -//============================================================================ - -asynStatus Hama::writeInt32(asynUser *pasynUser, epicsInt32 value){ - - printf("[DEBUG]::writeInt32\t"); - asynStatus status = asynSuccess; - const char* functionName = "writeInt32"; - const char* paramName; - - int index = pasynUser->reason; - int adstatus; - - getParamName(index, ¶mName); - - /* Ensure that ADStatus is set correctly before we set ADAcquire.*/ - getIntegerParam(ADStatus, &adstatus); - - double value_d = 0; - //getIntegerParam(index, &value); - - if (index == ADAcquire) { - printf("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"); - epicsEventSignal(this->startAcquireEventId_); - } - 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_); - stopAcquire(); - } - - } - else if (index == ADImageMode) { - printf("function ADImageMode\n"); - } - else if (index == ADNumExposures) { - printf("function ADNumExposures\n"); - } - else if (index == ADMinX) { - printf("function ADMinX\n"); - } - else if (index == ADMinY) { - printf("function ADMinY\n"); - } - else if (index == ADSizeX) { - printf("function ADSizeX\n"); - } - else if (index == ADSizeY) { - printf("function ADSizeY\n"); - } - else if (index == ADReadStatus) { - printf("function ADReadStatus\n"); - } - else if (index == hSensorMode) { - setIntegerParam(index, value); - printf("function SensorMode\n"); - } - else if (index == hReadoutSpeed) { - printf("function ReadoutSpeed\n"); - - } - else if (index == hReadoutDirection) { - printf("function ReadoutDirection\n"); - } - else if (index == hColorType) { - printf("function ColorType\n"); - } - else if (index == hBitPerChannel) { - printf("function BitPerChannel\n"); - } - else if (index == hTriggerSource) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value_d); - } - else if (index == hTriggerMode) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value_d); - } - else if (index == hTriggerActive) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value_d); - } - else if (index == hTriggerGlobalExposure) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value_d); - } - else if (index == hTriggerPolarity) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERPOLARITY, &value_d); - } - else if (index == hTriggerConnector) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value_d); - } - else if (index == hTriggerTimes) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value_d); - } - else if (index == hInternalTriggerHandling) { - dcamprop_setvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, value); - dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value_d); - } - else{ - printf("function ELSE.... \n"); - - } - - setIntegerParam(index, value); - - /* Do callbacks so higher layers see any changes */ - status = (asynStatus) callParamCallbacks(); - - if (status) - asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s:%s: error, status=%d function=%d, paramName=%s, value=%d\n", - driverName, functionName, status, index, paramName, value); - else - asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, - "%s:%s: function=%d, paramName=%s, value=%d\n", - driverName, functionName, index, paramName, value); - -return status; -} - -//============================================================================ - -asynStatus Hama::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ - -// printf("[DEBUG]::writeFloat64\t"); - asynStatus status = asynSuccess; - const char* functionName = "writeFloat64"; - const char* paramName; - - int function = pasynUser->reason; - double value_from_device = 0; - - getParamName(function, ¶mName); - - setDoubleParam(function, value); - - if(function == 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); - } - - status = (asynStatus) callParamCallbacks(); - - 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); - else - asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, - "%s:%s: function=%d, paramName=%s, value=%f\n", - driverName, functionName, function, paramName, value); - - - -return(asynSuccess); -} - -//============================================================================ -/* -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; - 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(); - - 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){ - - printf("[DEBUG]::report\n"); -} - -//============================================================================ -int Hama::connectCamera(void){ - - static const char *functionName = "connectCamera"; - int nDevices = 0; - int iDevice = 0; - /* disconnect any connected camera first */ - disconnectCamera(); - - /* initialize api */ - memset(&m_apiInit, 0, sizeof(m_apiInit)); - m_apiInit.size = sizeof(m_apiInit); - - asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: connecting camera %d\n", - driverName, functionName, m_id); - - m_err = dcamapi_init( &m_apiInit); - if( failed(m_err) ){ - printError( m_hdcam, m_err, "dcamapi_init()", NULL ); - } else { - nDevices = m_apiInit.iDeviceCount; - printf("dcamapi_init() found %d device(s). \n", nDevices); - printf("camera with index 0 will be used\n"); - iDevice = 0; - } - - /* open handle to camera */ - memset( &m_devOpen, 0, sizeof(m_devOpen) ); - m_devOpen.size = sizeof(m_devOpen); - m_devOpen.index = iDevice; - m_err = dcamdev_open( &m_devOpen ); - - if( failed(m_err) ){ - printError( m_hdcam, m_err, "dcamapi_init()" ); - - } else { - m_hdcam = m_devOpen.hdcam; - printInfo( m_hdcam ); - } - - // open wait handle - DCAMWAIT_OPEN waitopen; - memset( &waitopen, 0, sizeof(waitopen) ); - waitopen.size = sizeof(waitopen); - waitopen.hdcam = m_hdcam; - - m_err = dcamwait_open( &waitopen ); - if( failed(m_err) ) { - printError( m_hdcam, m_err, "dcamwait_open()" ); - } - else { - hwait = waitopen.hwait; - } - - /* close api */ //- it should be here?????????????? -// dcamapi_uninit(); -// return status; - return 0; -} - -//============================================================================ -int Hama::disconnectCamera(void){ - - static const char *functionName = "disconnectCamera"; - - int status = 0; - - - if(m_hdcam == NULL) { - return status; - } - - asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, - "%s:%s: disconnecting camera %d\n", - driverName, functionName, m_id); - -// status = AT_GetBool(handle_, L"CameraAcquiring", &acquiring); -// if(status == AT_SUCCESS && acquiring) { -// status |= AT_Command(handle_, L"Acquisition Stop"); -// } - -// status |= freeBuffers(); - dcamdev_close( m_hdcam ); - - if(status) { - asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, - "%s:%s: error closing camera %d\n", - driverName, functionName, m_id); - } - - m_hdcam = NULL; - return status; - - -} -//============================================================================ -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; - } - return asynSuccess; -} - -//============================================================================ -int Hama::freeBuffers(){ - m_err = dcambuf_release( m_hdcam ); - if( failed(m_err) ) - printError( m_hdcam, m_err, "dcambuf_release()" ); - -return 0; -} - -asynStatus Hama::stopAcquire(void) -{ - asynStatus status = asynSuccess; - dcamcap_stop(m_hdcam); - printf("Stop Capture\n"); - return status; -} - -asynStatus Hama::startAcquire(void) -{ - asynStatus status = asynSuccess; - - // release buffer - freeBuffers(); - - // allocate buffer - allocateBuffers(1); - - // start capture - m_err = dcamcap_start(m_hdcam, DCAMCAP_START_SEQUENCE); - if(failed(m_err)) { - 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; -} - -inline void* memcpy_s( void* dst, size_t dstsize, const void* src, size_t srclen ) -{ - if( dstsize < srclen ) - return memcpy( dst, src, dstsize ); - else - return memcpy( dst, src, srclen ); -} - -asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, int32 rowbytes, int32 cx, int32 cy ) -{ - DCAMERR err; - - // prepare frame param - DCAMBUF_FRAME bufframe; - memset( &bufframe, 0, sizeof(bufframe) ); - bufframe.size = sizeof(bufframe); - bufframe.iFrame = iFrame; - - // access image - err = dcambuf_lockframe( hdcam, &bufframe ); - if(failed(err)) { - printError(hdcam, err, "dcambuf_lockframe()"); - return asynError; - } - - if( bufframe.type != DCAM_PIXELTYPE_MONO16 ) { - printf("not implement pixel type\n"); - return asynError; - } - - // copy target ROI - int32 copyrowbytes = cx * 2; - char* pSrc = (char*)bufframe.buf; - char* pDst = (char*)buf; - - for(int y = 0; y < cy; y++ ) { - memcpy_s( pDst, rowbytes, pSrc, copyrowbytes); - pSrc += bufframe.rowbytes; - pDst += rowbytes; - } - - return asynSuccess; -} - -void Hama::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes) -{ - DCAMERR err; - double property_value; - - // image pixel type(DCAM_PIXELTYPE_MONO16, MONO8, ... ) - err = dcamprop_getvalue(hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &property_value); - if( failed(err) ) - { - printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_PIXELTYPE" ); - return; - } - else - pixeltype = (int32) property_value; - - // image width - err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_WIDTH, &property_value ); - if( failed(err) ) - { - printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_WIDTH" ); - return; - } - else - width = (int32)property_value; - - // image row bytes - err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &property_value ); - if( failed(err) ) - { - printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_ROWBYTES" ); - return; - } - else - rowbytes = (int32)property_value; - - // image height - err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &property_value ); - if( failed(err) ) - { - printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_HEIGHT" ); - return; - } - else - height = (int32)property_value; - - - // image framebytes - err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &property_value ); - if( failed(err) ) - { - printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_FRAMEBYTES" ); - return; - } - else - framebytes = (int32)property_value; -} - -asynStatus Hama::imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo) -{ - DCAMERR err; - // transferinfo param - memset(&captransferinfo, 0, sizeof(captransferinfo)); - captransferinfo.size = sizeof(captransferinfo); - - // get number of captured image - err = dcamcap_transferinfo(m_hdcam, &captransferinfo ); - if( failed(err) ) { - printError( m_hdcam, err, "dcamcap_transferinfo()" ); - return asynError; - } - - if(captransferinfo.nFrameCount < 1) { - printf( "not capture image\n" ); - return asynError; - } - - return asynSuccess; -} - -//============================================================================ -void Hama::printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt, ...){ - - char errtext[ 256 ]; - - DCAMERR err; - dcamdev_string( err, hdcam, errid, errtext, sizeof(errtext) ); - - printf( "-[ERROR]- (DCAMERR) 0x%08X %s @ %s\n", errid, errtext, apiname ); - - if( fmt != NULL ) { - printf( " : " ); - - va_list arg; - va_start(arg,fmt); - vprintf( fmt, arg ); - va_end(arg); - } - - -} - -//============================================================================ - -void Hama::printInfo(HDCAM hdcam){ - - char model[ 256 ]; - char cameraid[ 64 ]; - char bus[ 64 ]; - - DCAMERR err; - if( ! dcamdev_string( err, hdcam, DCAM_IDSTR_MODEL, model, sizeof(model) ) ) { - printError( hdcam, err, "dcamdev_getstring(DCAM_IDSTR_MODEL)\n" ); - } - else if( ! dcamdev_string( err, hdcam, DCAM_IDSTR_CAMERAID, cameraid, sizeof(cameraid)) ) { - printError( hdcam, err, "dcamdev_getstring(DCAM_IDSTR_CAMERAID)\n" ); - } - else if( ! dcamdev_string( err, hdcam, DCAM_IDSTR_BUS, bus, sizeof(bus) ) ) { - printError( hdcam, err, "dcamdev_getstring(DCAM_IDSTR_BUS)\n" ); - } - else { - printf( "%s (%s) on %s\n", model, cameraid, bus ); - } - -} - - -//============================================================================ - -int Hama::dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, int32 textbytes ) { - - DCAMDEV_STRING param; - memset( ¶m, 0, sizeof(param) ); - param.size = sizeof(param); - param.text = text; - param.textbytes = textbytes; - param.iString = idStr; - - err = dcamdev_getstring( hdcam, ¶m ); -return ! failed( err ); -} - -//============================================================================ -//============================================================================ -/* Code for iocsh registration */ - - - -extern "C" int HamaConfig(const char *portName, int cameraId, int maxBuffers, - size_t maxMemory, int priority, int stackSize, - int maxFrames) { - new Hama(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 iocshFuncDef confighama = {"devHamamatsuConfig", 7, HamaConfigArgs}; - -//============================================================================ -static void confighamaCallFunc(const iocshArgBuf *args) { - HamaConfig(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) { - - iocshRegister(&confighama, confighamaCallFunc); -} - -//============================================================================ -extern "C" { - -epicsExportRegistrar(hamaRegister); -} - - - - - - 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/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h deleted file mode 100644 index b403794..0000000 --- a/ADHamaApp/src/hama.h +++ /dev/null @@ -1,295 +0,0 @@ -#ifndef DRV_HAMA_H -#define DRV_HAMA_H - -#include "ADDriver.h" -#include "dcamapi4.h" - -#define MAX_FEATURE_NAME_LEN 64 - -#define hFrameRateString "H_FRAME_RATE" /* asynOctet ro */ -#define HamaName "Name" /* asynOctet ro */ -#define hVendorString "H_VENDOR" /* asynOctet ro */ -#define hModelString "H_MODEL" /* asynOctet ro */ -#define hCameraIDString "H_CAMERAID" /* asynOctet ro */ -#define hBusString "H_BUS" /* asynOctet ro */ -#define hCameraVersionString "H_CAMERA_VERSION" /* asynOctet ro */ -#define hDriverVersionString "H_DRIVER_VERSION" /* asynOctet ro */ -#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 */ - -// Trigger -#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 hTriggerConnectorString "H_TRIGGER_CONNECTOR" /* asynInt32 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 */ - -// 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 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 */ -#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 hNrOutputTriggerConnectorsString "H_NR_OUTPUT_TRIGGER_CONNECTORS" /* 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 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 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 */ - -// Master Puls -#define hMasterPulseModeString "H_MASTERPULSE_MODE" /* asynInt32 rw */ -#define hMasterPulseTriggerSourceString "H_MASTERPULSE_TRIGGER_SOURCE" /* asynInt32 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 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 hTimingInvalidExposurePeriodString "H_TIMING_INVALID_EXPOSURE_PERIOD" /* asynFloat64 ro */ -#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 */ - -// 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 */ - - - - -class Hama : public ADDriver { - -public: - Hama(const char*, int, int, size_t, int, int, int); -// ~Hama(); - /* override ADDriver methods */ - virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); - virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); - //virtual asynStatus readEnum(asynUser *pasynUser, char *strings[], int values[], - // int severities[], size_t nElements, size_t *nIn); - virtual void report(FILE *fp, int details); - void imageTask(); - void temperatureTask(); - -protected: - int hFrameRate; - #define FIRST_HAMA_PARAM hFrameRate - int hHamaName; - int hVendor; - int hModel; - int hCameraID; - int hBus; - int hCameraVersion; - int hDriverVersion; - int hModuleVersion; - int hDcamApiVersion; - int hSensorMode; - int hReadoutSpeed; - int hReadoutDirection; - int hColorType; - int hBitPerChannel; - int hTriggerSource; - int hTriggerMode; - int hTriggerActive; - int hTriggerGlobalExposure; - int hTriggerPolarity; - int hTriggerConnector; - int hTriggerTimes; - int hTriggerDelay; - int hInternalTriggerHandling; - int hSensorTemperature; - int hSensorCooler; - int hSensorCoolerStatus; - int hExposureTime; - int hDefectCorrectMode; - int hHotPixelCorrectLevel; - int hBinning; - int hSubarrayHPos; - int hSubarrayHSize; - int hSubarrayVPos; - int hSubarrayVSize; - int hSubarrayMode; - 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; - int hNrOutputTriggerConnectors; - int hOutputTriggerSource0; - int hOutputTriggerSource1; - int hOutputTriggerSource2; - int hOutputTriggerPolarity0; - int hOutputTriggerPolarity1; - int hOutputTriggerPolarity2; - int hOutputTriggerActive0; - int hOutputTriggerActive1; - int hOutputTriggerActive2; - int hOutputTriggerDelay0; - int hOutputTriggerDelay1; - int hOutputTriggerDelay2; - int hOutputTriggerPeriod0; - int hOutputTriggerPeriod1; - int hOutputTriggerPeriod2; - int hOutputTriggerKind0; - int hOutputTriggerKind1; - int hOutputTriggerKind2; - int hOutputTriggerBaseSensor0; - int hOutputTriggerBaseSensor1; - int hOutputTriggerBaseSensor2; - int hOutTriggerPreHsyncCount; - int hMasterPulseMode; - int hMasterPulseTriggerSource; - int hMasterPulseInterval; - int hMasterPulseBurstTimes; - int hSystemAlive; - int hConversionFactorCoeff; - int hConversionFactorOffset; - int hNumberOfView; - int hImageDetectorPixelWidth; - int hImageDetectorPixelHeight; - int hImageDetectorPixelNumHorz; - int hImageDetectorPixelNumVert; - int hTimeStampProducer; - int hFrameStampProducer; - #define LAST_HAMA_PARAM hFrameStampProducer - - -private: - - - HDCAM m_hdcam; - DCAMAPI_INIT m_apiInit; - DCAMDEV_OPEN m_devOpen; - DCAMERR m_err; - // handle used to wait for events sent from the device - HDCAMWAIT hwait; - - int m_id; - int stopThread; - - epicsEventId startAcquireEventId_; - epicsEventId stopAcquireEventId_; - - 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 imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo); - - - // wrapper functions for dcamapi - int allocateBuffers(unsigned int); - int freeBuffers(); - - int connectCamera(); - int disconnectCamera(); - - // 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 getParameter(int paramIndex); - int getParameterStr(int paramIndex); - int getProperties(); - int setFeature(int featureIndex, double value); -}; - -#endif diff --git a/ADOrca.Makefile b/ADOrca.Makefile new file mode 100644 index 0000000..9bee891 --- /dev/null +++ b/ADOrca.Makefile @@ -0,0 +1,157 @@ +# +# Copyright (c) 2019 - 2022, European Spallation Source ERIC +# +# The program is free software: you can redistribute it and/or modify it +# under the terms of the BSD 3-Clause license. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. +# +# Author : Tomasz Brys +# email : tomasz.brys@ess.eu +# Date : 2022-03-16 +# version : 0.0.0 +# +# This template file is based on one generated by e3TemplateGenerator.bash. +# Please look at many other module_name.Makefile in the https://gitlab.esss.lu.se/epics-modules/ +# repositories. +# + +## The following lines are mandatory, please don't change them. +where_am_I := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) +include $(E3_REQUIRE_TOOLS)/driver.makefile + +ifneq ($(strip $(ADCORE_DEP_VERSION)),) +adcore_VERSION=$(ADCORE_DEP_VERSION) +endif + +ifneq ($(strip $(BUSY_DEP_VERSION)),) +busy_VERSION=$(BUSY_DEP_VERSION) +endif + +############################################################################ +# +# Add any required modules here that come from startup scripts, etc. +# +############################################################################ + +REQUIRED += adcore +REQUIRED += busy +REQUIRED += seq + + +############################################################################ +# +# If you want to exclude any architectures: +# +############################################################################ + +EXCLUDE_ARCHS += linux-ppc64e6500 + + +############################################################################ +# +# Relevant directories to point to files +# +############################################################################ + +APP := ADOrcaApp +APPDB := $(APP)/Db +APPSRC := $(APP)/src +APPCMDS := $(APP)/cmds + +############################################################################ +# +# Add any files that should be copied to $(module)/Db +# +############################################################################ + +# TEMPLATES += $(wildcard $(APPDB)/*.db) +TEMPLATES += $(wildcard $(ADCORE_DIR)/*.db) + +# USR_INCLUDES += -I$(where_am_I)$(APPSRC) +# USR_INCLUDES += -I $(E3_ADCORE_LOCATION)/ADCore/ADApp/ADSrc +# USR_INCLUDES += -I $(E3_ASYN_LOCATION)/asyn/interfaces +# USR_INCLUDES += -I $(E3_ASYN_LOCATION)/asyn/asynDriver +# USR_INCLUDES += -I $(E3_ASYN_LOCATION)/asyn/asynPortDriver + +# USR_INCLUDES += -DLINUX -I/home/iocuser/dcamsdk4/inc/ +USR_INCLUDES += -DLINUX -I ../support/dcamsdk4/inc/ +# USR_INCLUDES += -I ../support/dcamsdk4/misc/ + +############################################################################ +# +# Add any files that need to be compiled (e.g. .c, .cpp, .st, .stt) +# +############################################################################ + +# SOURCES += $(APPSRC)/ADOrcaMain.cpp +SOURCES += $(APPSRC)/orca.cpp +# SOURCES += support/dcamsdk4/misc/common.cpp + +############################################################################ +# +# Add any .dbd files that should be included (e.g. from user-defined functions, etc.) +# +############################################################################ + +DBDS += $(APPSRC)/orca.dbd + + +############################################################################ +# +# Add any header files that should be included in the install (e.g. +# StreamDevice or asyn header files that are used by other modules) +# +############################################################################ + +# HEADERS += /home/iocuser/dcamsdk4/inc + + +############################################################################ +# +# Add any startup scripts that should be installed in the base directory +# +############################################################################ + +SCRIPTS += $(wildcard iocsh/*.iocsh) + + +############################################################################ +# +# If you have any .substitution files, and template files, add them here. +# +############################################################################ + +# SUBS=$(wildcard $(APPDB)/*.substitutions) +TMPS=$(wildcard $(APPDB)/*.template) + +USR_DBFLAGS += -I . -I .. +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-x86_64 -ldcamapi +#USR_LDFLAGS += -L/usr/local/lib -ldcamapi + +db: $(SUBS) $(TMPS) + +$(SUBS): + @printf "Inflating database ... %44s >>> %40s \n" "$@" "$(basename $(@)).db" + @rm -f $(basename $(@)).db.d $(basename $(@)).db + @$(MSI) -D $(USR_DBFLAGS) -o $(basename $(@)).db -S $@ > $(basename $(@)).db.d + @$(MSI) $(USR_DBFLAGS) -o $(basename $(@)).db -S $@ + +$(TMPS): + @printf "Inflating database ... %44s >>> %40s \n" "$@" "$(basename $(@)).db" + @rm -f $(basename $(@)).db.d $(basename $(@)).db + @$(MSI) -D $(USR_DBFLAGS) -o $(basename $(@)).db $@ > $(basename $(@)).db.d + @$(MSI) $(USR_DBFLAGS) -o $(basename $(@)).db $@ + +.PHONY: db $(SUBS) $(TMPS) + + +vlibs: + +.PHONY: vlibs diff --git a/ADHamaApp/Db/hama.template b/ADOrcaApp/Db/orca.template similarity index 64% rename from ADHamaApp/Db/hama.template rename to ADOrcaApp/Db/orca.template index 7eda79e..3806d11 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" @@ -90,63 +91,244 @@ record(mbbi, "$(P)$(R)ColorMode_RBV") { field(SVVL, "") } -record(longin, "$(P)$(R)ArrayCounter_RBV") +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") +} + +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") + 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") +} + +# holds TS value in 'sec.nsec' format +record(stringout, "$(P)$(R)EVRTime-R") { + field(DESC, "EPICS epoch EVRTime timestamp") + field(DOL, "$(P)$(R)#EVRTimeProc MS") + field(OMSL, "closed_loop") + field(DTYP, "asynOctetWrite") + field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))EVR_TIMESTAMP") +} + +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") +} + +record(seq, "$(P)$(R)#SoftSeqDisable") { + field(SELM, "All") + # Disable sequencer 0 + field(DOL1, "1") + field(LNK1, "$(EVR):SoftSeq-0-Disable-Cmd CP") +} + +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 PP") + # Enable sequencer 0 + field(LNK3, "$(EVR):SoftSeq-0-Enable-Cmd.PROC PP") +} + +record(longin, "$(P)$(R)#AcquireCtrl") { field(DTYP, "asynInt32") - field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))ARRAY_COUNTER") + 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") { + 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, "Transition To Non-zero") + field(OUT, "$(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)) || (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") +} + +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") + 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") +} + +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 # ########################################################################## +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") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_VENDOR") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)Model-RB"){ field(DESC, "") 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(DTYP, "asynOctetRead") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_CAMERAID") + field(SCAN, "I/O Intr") } record(stringin, "$(P)$(R)Bus-RB"){ field(DESC, "") 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(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(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(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") } @@ -154,49 +336,53 @@ 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(mbbo, "$(P)$(R)SensorMode-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") - field(ZRVL, "0") - field(ZRST, "Area") - field(ZRVL, "1") - field(ZRST, "Progressive") - field(TWVL, "2") - field(TWST, "Splitview") - field(THVL, "3") - 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, "0") + field(VAL, "1") } +#record(longin, "$(P)$(R)SensorMode-RB") { 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(TWST, "Splitview") - field(THVL, "3") - 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") } ########################################################################## # Readout Speed (long) -record(ao, "$(P)$(R)ReadoutSpeed-S") { +record(mbbo, "$(P)$(R)ReadoutSpeed-S") { field(DESC,"") field(PINI, "YES") field(DTYP, "asynInt32") + 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") @@ -204,23 +390,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, "0") + field(ZRVL, "5") field(ZRST, "Diverge") 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, "1") + 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") @@ -231,24 +419,54 @@ record(mbbi, "$(P)$(R)ReadoutDirection-RB") { 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 # ########################################################################## # 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(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_SOURCE") - field(VAL, "0") + 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") { @@ -301,6 +519,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") } @@ -319,14 +539,22 @@ 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") field(DTYP, "asynInt32") field(ZRVL, "3") - field(ZRST, "Delay") + field(ZRST, "Delayed") field(ONVL, "5") - field(ONST, "Reset") + field(ONST, "Global Reset") +# field(DRVL, "3") +# field(DRVH, "5") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_GLOBAL_EXPOSURE") field(VAL, "3") } @@ -335,9 +563,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") } @@ -351,6 +579,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") } @@ -375,9 +605,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") { @@ -464,30 +695,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, "") @@ -512,11 +743,13 @@ 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(ONST, "2x2") field(TWVL, "4") - field(TWST, "4") + field(TWST, "4x4") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") field(VAL, "0") } @@ -548,8 +781,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") { @@ -559,31 +792,11 @@ 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") } -########################################################################## -# Feature # -########################################################################## -record(ao, "$(P)$(R)ExposureTime-S") { - field(DESC, "") - field(PINI, "YES") - field(DTYP, "asynFloat64") - field(DRVL, "0") - field(DRVH, "10.0") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_EXPOSURE_TIME") - field(VAL, "0") -} - -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 # ########################################################################## @@ -597,7 +810,7 @@ record(mbbo, "$(P)$(R)DefectCorrectMode-S") { field(ONVL, "2") field(ONST, "ON") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DEFECTCORRECT_MODE") - field(VAL, "1") + field(VAL, "2") } record(mbbi, "$(P)$(R)DefectCorrectMode-RB") { @@ -623,6 +836,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") } @@ -667,13 +882,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(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, "") @@ -695,16 +912,50 @@ 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") } ########################################################################## # 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, "2") +} + +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") @@ -716,11 +967,13 @@ record(mbbo, "$(P)$(R)OutputTriggerSource0-S") { field(TWST, "HSync") field(THVL, "6") field(THST, "Trigger") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") - field(VAL, "2") +# field(DRVL, "2") +# field(DRVH, "6") + 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") @@ -731,7 +984,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") } @@ -745,6 +1032,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") } @@ -759,18 +1048,61 @@ record(mbbi, "$(P)$(R)OutputTriggerPolarity0-RB") { field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY0") field(SCAN, "I/O Intr") } -########################################################################## -# Internal Trigger Active (mode 1) -record(mbbo, "$(P)$(R)OutputTriggerActive0-S") { + +# Output Trigger Polarity 1 (mode 2) +record(mbbo, "$(P)$(R)OutputTriggerPolarity1-S") { field(DESC, "") - field(DTYP, "asynInt32") field(PINI, "YES") + field(DTYP, "asynInt32") field(ZRVL, "1") - field(ZRST, "Edge") - field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE0") + 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(mbbi, "$(P)$(R)OutputTriggerActive0-RB") { field(DESC, "") field(DTYP, "asynInt32") @@ -780,6 +1112,26 @@ record(mbbi, "$(P)$(R)OutputTriggerActive0-RB") { field(SCAN, "I/O Intr") } +# Internal Trigger Active (mode 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(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") { @@ -791,7 +1143,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") @@ -799,6 +1150,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") { @@ -808,9 +1194,8 @@ 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, "") field(DTYP, "asynFloat64") @@ -818,6 +1203,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.000001") +} +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.000001") +} + +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") { @@ -859,8 +1279,88 @@ 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 PreHsyncCount +# Output Trigger PreHsyncCount0 record(ao, "$(P)$(R)OutputTriggerPreHsyncCount-S") { field(DESC, "") field(PINI, "YES") @@ -892,6 +1392,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") } @@ -911,6 +1413,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 # ########################################################################## @@ -926,7 +1497,7 @@ record(mbbo, "$(P)$(R)MasterPulseMode-S") { field(TWVL, "3") field(THST, "Burst") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_MODE") - field(VAL, "1") + field(VAL, "0") } record(mbbi, "$(P)$(R)MasterPulseMode-RB") { @@ -952,6 +1523,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") } @@ -973,6 +1546,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") @@ -982,6 +1556,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") } @@ -1014,6 +1589,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") } @@ -1058,13 +1634,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") } @@ -1073,8 +1659,6 @@ 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(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_RATE") field(EGU, "Hz") } @@ -1092,8 +1676,6 @@ record(ai, "$(P)$(R)InternalFrameRate-RB") { record(ao, "$(P)$(R)InternalFrameInternal-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_INTERVAL") field(EGU, "Sec") } @@ -1107,12 +1689,11 @@ record(ai, "$(P)$(R)InternalFrameInternal-RB") { } ########################################################################## -# Internal Line Interval +# Internal Line Speed record(ao, "$(P)$(R)InternalLineSpeed-S") { field(DESC, "") + field(PINI, "YES") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_SPEED") field(EGU, "m/s") } @@ -1129,9 +1710,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, "") - field(DRVH, "") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_INTERVAL") field(EGU, "Sec") } @@ -1151,32 +1731,48 @@ 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") } -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,"") +# field(DTYP, "asynInt32") +# field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_IMAGE_WIDTH") +# 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") -} - -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,"") @@ -1247,11 +1843,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") @@ -1281,25 +1877,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") } @@ -1310,16 +1906,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") } @@ -1339,12 +1935,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") } @@ -1359,4 +1961,3 @@ record(mbbi, "$(P)$(R)FrameStampProd-R") { field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_FRAMESTAMP_PRODUCER") field(SCAN, "I/O Intr") } - 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/ADOrcaApp/src/orca.cpp b/ADOrcaApp/src/orca.cpp new file mode 100644 index 0000000..004243f --- /dev/null +++ b/ADOrcaApp/src/orca.cpp @@ -0,0 +1,2293 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "orca.h" +// --- includes from DCMAPI ---- +#include "dcamprop.h" +// +#include + +#include +using namespace std; + +//#define NUM_HAMA_PARAMS ((int)(&LAST_HAMA_PARAM - &FIRST_HAMA_PARAM + 1)) + +static const char *driverName="drvOrca"; + +static void c_imagetask(void *arg) { + Orca *p = (Orca *)arg; + p->imageTask(); +} + +static void c_temperaturetask(void *arg) { + Orca *p = (Orca *)arg; + p->temperatureTask(); +} + + +//============================================================================ +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, + ASYN_CANBLOCK, /* ASYN_CANBLOCK=1 ASYN_MULTIDEVICE=0 */ + 1, /* autoConnect=1 */ + priority, stackSize), + m_hdcam(NULL), m_id(0) + +{ + const char *functionName = "orcaDetector::orcaDetector"; + + printf("[DEBUG] === Constructor ADOrca ===\n"); + printf("[DEBUG] driverName: %s\n", driverName); + + stopThread = 0; + + /* Create the epicsEvents for signaling to task when acquisition starts and stops */ + startEvent_ = epicsEventCreate(epicsEventEmpty); + if (!startEvent_) { + printf("%s:%s epicsEventCreate failure for acquire start event\n", + driverName, functionName); + return; + } + +//General + createParam( hFrameRateString, asynParamFloat64, &hFrameRate); + createParam( hOrcaNameString, asynParamOctet, &hOrcaName); + createParam( hVendorString, asynParamOctet, &hVendor); + createParam( hModelString, asynParamOctet, &hModel); + createParam( hCameraIDString, asynParamOctet, &hCameraID); + createParam( hBusString, asynParamOctet, &hBus); + createParam( hCameraVersionString, asynParamOctet, &hCameraVersion); + createParam( hDriverVersionString, asynParamOctet, &hDriverVersion); + createParam( hModuleVersionString, asynParamOctet, &hModuleVersion); + createParam( hDcamApiVersionString, asynParamOctet, &hDcamApiVersion); + +//Sensor Mode and Speed + createParam( hSensorModeString, asynParamInt32, &hSensorMode); + createParam( hReadoutSpeedString, asynParamInt32, &hReadoutSpeed); + createParam( hReadoutDirectionString, asynParamInt32, &hReadoutDirection); + +//Trigger + createParam( hTriggerSourceString, asynParamInt32, &hTriggerSource); + createParam( hTriggerModeString, asynParamInt32, &hTriggerMode); + createParam( hTriggerActiveString, asynParamInt32, &hTriggerActive); + createParam( hTriggerGlobalExposureString, asynParamInt32, &hTriggerGlobalExposure); + createParam( hTriggerPolarityString, asynParamInt32, &hTriggerPolarity); + createParam( hTriggerConnectorString, asynParamInt32, &hTriggerConnector); + createParam( hTriggerTimesString, asynParamInt32, &hTriggerTimes); + createParam( hTriggerDelayString, asynParamFloat64, &hTriggerDelay); + createParam( hInternalTriggerHandlingString, asynParamInt32, &hInternalTriggerHandling); + +//Sensor cooler + createParam( hSensorTemperatureString, asynParamFloat64, &hSensorTemperature); + createParam( hSensorCoolerString, asynParamInt32, &hSensorCooler); + createParam( hSensorCoolerStatusString, asynParamInt32, &hSensorCoolerStatus); + +//Binning and ROI + createParam( hBinningString, asynParamInt32, &hBinning); + createParam( hSubarrayHPosString, asynParamInt32, &hSubarrayHPos); + createParam( hSubarrayHSizeString, asynParamInt32, &hSubarrayHSize); + createParam( hSubarrayVPosString, asynParamInt32, &hSubarrayVPos); + createParam( hSubarrayVSizeString, asynParamInt32, &hSubarrayVSize); + createParam( hSubarrayModeString, asynParamInt32, &hSubarrayMode); + +//ALU + createParam( hDefectCorrectModeString, asynParamInt32, &hDefectCorrectMode); + createParam( hHotPixelCorrectLevelString, asynParamInt32, &hHotPixelCorrectLevel); + createParam( hIntensityLutModeString, asynParamInt32, &hIntensityLutMode); + createParam( hIntensityLutPageString, asynParamInt32, &hIntensityLutPage); + createParam( hExtractionModeString, asynParamInt32, &hExtractionMode); + +//output trigger + createParam( hNumberOfOutputTriggerConnectorString, asynParamInt32, &hNumberOfOutputTriggerConnector); + createParam( hOutputTriggerSource0String, asynParamInt32, &hOutputTriggerSource0), + createParam( hOutputTriggerSource1String, asynParamInt32, &hOutputTriggerSource1); + createParam( hOutputTriggerSource2String, asynParamInt32, &hOutputTriggerSource2); + createParam( hOutputTriggerPolarity0String, asynParamInt32, &hOutputTriggerPolarity0); + createParam( hOutputTriggerPolarity1String, asynParamInt32, &hOutputTriggerPolarity1); + createParam( hOutputTriggerPolarity2String, asynParamInt32, &hOutputTriggerPolarity2); + createParam( hOutputTriggerActive0String, asynParamInt32, &hOutputTriggerActive0); + createParam( hOutputTriggerActive1String, asynParamInt32, &hOutputTriggerActive1); + createParam( hOutputTriggerActive2String, asynParamInt32, &hOutputTriggerActive2); + createParam( hOutputTriggerDelay0String, asynParamFloat64, &hOutputTriggerDelay0); + createParam( hOutputTriggerDelay1String, asynParamFloat64, &hOutputTriggerDelay1); + createParam( hOutputTriggerDelay2String, asynParamFloat64, &hOutputTriggerDelay2); + createParam( hOutputTriggerPeriod0String, asynParamFloat64, &hOutputTriggerPeriod0); + createParam( hOutputTriggerPeriod1String, asynParamFloat64, &hOutputTriggerPeriod1); + createParam( hOutputTriggerPeriod2String, asynParamFloat64, &hOutputTriggerPeriod2); + createParam( hOutputTriggerKind0String, asynParamInt32, &hOutputTriggerKind0); + createParam( hOutputTriggerKind1String, asynParamInt32, &hOutputTriggerKind1); + createParam( hOutputTriggerKind2String, asynParamInt32, &hOutputTriggerKind2); + createParam( hOutputTriggerBaseSensor0String, asynParamInt32, &hOutputTriggerBaseSensor0); + createParam( hOutputTriggerBaseSensor1String, asynParamInt32, &hOutputTriggerBaseSensor1); + createParam( hOutputTriggerBaseSensor2String, asynParamInt32, &hOutputTriggerBaseSensor2); + createParam( hOutputTriggerPreHsyncCountString, asynParamInt32, &hOutputTriggerPreHsyncCount); + +//Master Puls + createParam( hMasterPulseModeString, asynParamInt32, &hMasterPulseMode); + createParam( hMasterPulseTriggerSourceString, asynParamInt32, &hMasterPulseTriggerSource); + createParam( hMasterPulseIntervalString, asynParamFloat64, &hMasterPulseInterval); + createParam( hMasterPulseBurstTimesString, asynParamInt32, &hMasterPulseBurstTimes); + +//Synchronious Timing + createParam( hTimingReadoutTimeString, asynParamFloat64, &hTimingReadoutTime); + createParam( hTimingCyclicTriggerPeriodString, asynParamFloat64, &hTimingCyclicTriggerPeriod); + createParam( hTimingMinTriggerBlankingString, asynParamFloat64, &hTimingMinTriggerBlanking); + createParam( hTimingMinTriggerIntervalString, asynParamFloat64, &hTimingMinTriggerInterval); + createParam( hTimingGlobalExposureDelayString, asynParamFloat64, &hTimingGlobalExposureDelay); + createParam( hTimingExposureString, asynParamInt32, &hTimingExposure); + createParam( hTimingInvalidExposurePeriodString, asynParamFloat64, &hTimingInvalidExposurePeriod); + createParam( hInternalFrameRateString, asynParamFloat64, &hInternalFrameRate); + createParam( hInternalFrameIntervalString, asynParamFloat64, &hInternalFrameInterval); + createParam( hInternalLineSpeedString, asynParamFloat64, &hInternalLineSpeed); + createParam( hInternalLineIntervalString, asynParamFloat64, &hInternalLineInterval); + +//System Information + createParam( hColorTypeString, asynParamInt32, &hColorType); + createParam( hBitPerChannelString, asynParamInt32, &hBitPerChannel); + //createParam( hImageWidthString, asynParamInt32, &hImageWidth); + //createParam( hImageHeightString, asynParamInt32, &hImageHeight); + createParam( hImageRowBytesString, asynParamInt32, &hImageRowbytes); + createParam( hImageFrameBytesString, asynParamInt32, &hImageFramebytes); + createParam( hImageTopOffsetBytesString, asynParamInt32, &hImageTopOffsetBytes); + createParam( hImagePixelTypeString, asynParamInt32, &hImagePixelType); + createParam( hBufferRowbytesString, asynParamInt32, &hBufferRowbytes); + createParam( hBufferFramebytesString, asynParamInt32, &hBufferFramebytes); + createParam( hBufferTopOffsetBytesString, asynParamInt32, &hBufferTopOffsetBytes); + createParam( hBufferPixelTypeString, asynParamInt32, &hBufferPixelType); + createParam( hRecordFixedBytesPerFileString, asynParamInt32, &hRecordFixedBytesPerFile); + createParam( hRecordFixedBytesPerSessionString, asynParamInt32, &hRecordFixedBytesPerSession); + createParam( hRecordFixedBytesPerFrameString, asynParamInt32, &hRecordFixedBytesPerFrame); + createParam( hSystemAliveString, asynParamInt32, &hSystemAlive); + createParam( hConversionFactorCoeffString, asynParamFloat64, &hConversionFactorCoeff); + createParam( hConversionFactorOffsetString, asynParamFloat64, &hConversionFactorOffset); + createParam( hNumberOfViewString, asynParamInt32, &hNumberOfView); + createParam( hImageDetectorPixelWidthString, asynParamFloat64, &hImageDetectorPixelWidth); + createParam( hImageDetectorPixelHeightString, asynParamFloat64, &hImageDetectorPixelHeight); + createParam( hImageDetectorPixelNumHorzString, asynParamInt32, &hImageDetectorPixelNumHorz); + createParam( hImageDetectorPixelNumVertString, asynParamInt32, &hImageDetectorPixelNumVert); + createParam( hTimeStampProducerString, asynParamInt32, &hTimeStampProducer); + createParam( hFrameStampProducerString, asynParamInt32, &hFrameStampProducer); + + createParam(evrTimeStampString, asynParamOctet, &evrTimeStamp); + createParam(evrCountString, asynParamInt32, &evrCounts); + createParam(evrCountSinceAcqStartString, asynParamInt32, &evrCountsSinceAcqStart); + createParam(evrTriggerDroppedString, asynParamInt32, &evrTriggerDropped); + createParam(hAcqControlString, asynParamInt32, &hAcqControl); + + setIntegerParam(NDArrayCallbacks, 1); + setStringParam (ADStatusMessage, "Idle"); + callParamCallbacks(); + + connectCamera(); + printf("\n\n============================ Init Camera =========================\n"); + initCamera(); + + printf("\n\n============================ Start Threads =======================\n"); + /* launch image read task */ + epicsThreadCreate("OrcaImageTask", + epicsThreadPriorityMedium, + epicsThreadGetStackSize(epicsThreadStackMedium), + c_imagetask, this); + + /* launch temp read task */ + epicsThreadCreate("OrcaTemperatureTask", + epicsThreadPriorityMedium, + epicsThreadGetStackSize(epicsThreadStackMedium), + c_temperaturetask, this); + + /* shutdown on exit */ + //epicsAtExit(c_shutdown, this); + + printf("\n\n=== END Constructor ADOrca ===\n"); + printf("===================================================================\n"); +} +//============================================================================ +//Orca::~Orca(){ +// // not sure if the destructor has to be define here... +// printf("[DEBUG] === Destructor ADOrca ===\n"); +//} + +//======================================================================================================== +int Orca::initCamera(){ + + int err = 0; + + 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 |= readParameter(DCAM_IDPROP_SENSORMODE); + err |= readParameter(DCAM_IDPROP_READOUTSPEED); + err |= readParameter(DCAM_IDPROP_READOUT_DIRECTION); + + // TRIGGER -------------------------------------- + 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 |= 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 ------------------------------------------ + + // ALU --------------------------------------------------- + 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 |= 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); + 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 |= 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 |= readParameter(DETECTOR_PIXEL_NUM_HORZ); + err |= readParameter(DETECTOR_PIXEL_NUM_VERT); + + + 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 Orca::readParameterStr(int propertyID){ + + asynStatus status = asynSuccess; + + char text[256]; + DCAMDEV_STRING param; + memset( ¶m, 0, sizeof(param) ); + param.size = sizeof(param); + param.text = text; + param.textbytes = sizeof(text); + param.iString = propertyID; + + switch (propertyID){ + case DCAM_IDSTR_VENDOR: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hVendor, text); + printf("[DEBUG]::VENDOR %s\n", text); + break; + case DCAM_IDSTR_MODEL: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hModel, text); + printf("[DEBUG]::MODEL %s\n", text); + break; + case DCAM_IDSTR_CAMERAID: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hCameraID, text); + printf("[DEBUG]::CAMERAID %s\n", text); + break; + case DCAM_IDSTR_BUS: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hBus, text); + printf("[DEBUG]::BUS %s\n", text); + break; + case DCAM_IDSTR_CAMERAVERSION: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hCameraVersion, text); + printf("[DEBUG]::CAMERAVERSION %s\n", text); + break; + case DCAM_IDSTR_DRIVERVERSION: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hDriverVersion, text); + printf("[DEBUG]::DRIVERVERSION %s\n", text); + break; + case DCAM_IDSTR_MODULEVERSION: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hModuleVersion, text); + printf("[DEBUG]::MODULEVERSION %s\n", text); + break; + case DCAM_IDSTR_DCAMAPIVERSION: + dcamdev_getstring(m_hdcam, ¶m); + status = setStringParam(hDcamApiVersion, text); + printf("[DEBUG]::DCAMPVERSION %s\n", text); + break; + default: + printf("[DEBUG]::NOT SUPPORTED\n"); + break; + + } + + callParamCallbacks(); + +return status; +} + + +//============================================================================ +int Orca::readParameter(int propertyID, bool processPV) { + + asynStatus status = asynSuccess; + double dvalue = 0; + + switch (propertyID){ + // - sensor mode and speed + case DCAM_IDPROP_SENSORMODE: //(RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &dvalue); + status = setIntegerParam(hSensorMode, dvalue); + break; + case DCAM_IDPROP_READOUTSPEED: //(RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &dvalue); + status = setIntegerParam(hReadoutSpeed, dvalue); + break; + case DCAM_IDPROP_READOUT_DIRECTION: // (RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &dvalue); + status = setIntegerParam(hReadoutDirection, dvalue); + break; + // - trigger + 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: // (RW123) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &dvalue); + status = setIntegerParam(hTriggerMode, dvalue); + break; + 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: //(RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &dvalue); + status = setIntegerParam(hTriggerGlobalExposure, dvalue); + break; + 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: //(RW123) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &dvalue); + status = setIntegerParam(hTriggerConnector, dvalue); + break; + case DCAM_IDPROP_TRIGGERTIMES: //(RW123) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &dvalue); + status = setIntegerParam(hTriggerTimes, dvalue); + break; + 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: //(RW12-) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &dvalue); + status = setIntegerParam(hInternalTriggerHandling, dvalue); + break; + // - sensor cooler + 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: //(RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_BINNING, &dvalue); + status = setIntegerParam(hBinning, dvalue); + break; + + case DCAM_IDPROP_SUBARRAYHSIZE: //(RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &dvalue); + status = setIntegerParam(ADSizeX, dvalue); + break; + + case DCAM_IDPROP_SUBARRAYVSIZE: //(RW1--) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &dvalue); + status = setIntegerParam(ADSizeY, dvalue); + break; + + case DCAM_IDPROP_SUBARRAYHPOS: //(RW---) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &dvalue); + status = setIntegerParam(ADMinX, dvalue); + break; + + 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; + + 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) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_DEFECTCORRECT_MODE, &dvalue); + status = setIntegerParam(hDefectCorrectMode, dvalue); + break; + 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: //(RW123) + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTENSITYLUT_MODE, &dvalue); + status = setIntegerParam(hIntensityLutMode, dvalue); + break; + 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: //(RW1--) + 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_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); + 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_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: + 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: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_COLORTYPE, &dvalue); + status = setIntegerParam(hColorType, dvalue); + break; + 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); + 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_IMAGE_WIDTH: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &dvalue); + status = setIntegerParam(ADBinX, dvalue); + break; + case DCAM_IDPROP_IMAGE_HEIGHT: + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &dvalue); + status = setIntegerParam(ADBinY, (int)dvalue); + break; + case DETECTOR_PIXEL_NUM_HORZ: + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_HORZ, &dvalue); + status = setIntegerParam(ADMaxSizeX, dvalue); + break; + case DETECTOR_PIXEL_NUM_VERT: + m_err = dcamprop_getvalue(m_hdcam, DETECTOR_PIXEL_NUM_VERT, &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); + 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]; + 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] = {'\0'}; + dcamprop_getname(m_hdcam, propertyID, text, sizeof(text)); + printError(m_hdcam, m_err, "+dcamprop_getvalue()", "IDPROP:0x%08x, VALUE:%s\n", propertyID, text); + } + + if (processPV) status = callParamCallbacks(); + return status; +} + + +//============================================================================ +void Orca::imageTask(){ + int status; + unsigned char *image; + int acquire; + int count = 0; + int callback; + //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; + double maxAcqusitionTime, acqusitionRate; + int triggerMode = DCAMPROP_TRIGGERSOURCE__INTERNAL; + + lock(); + while(1) { + getIntegerParam(ADAcquire, &acquire); + if(!acquire) { + puts("Waiting start"); + + unlock(); + status = epicsEventWait(startEvent_); + lock(); + + status = startAcquire(); + setStringParam (ADStatusMessage, "Acquiring"); + setIntegerParam(hAcqControl, 1); + callParamCallbacks(); + + epicsTimeGetCurrent(&prevAcqTime); + if (status != asynSuccess) { + //acquireStatusError = 1; + 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); + } + } + + // get image transfer status. + unlock(); + imageTransferStatus(m_hdcam, captransferinfo); + lock(); + + if (prevAcquisitionCount < (uint64_t)captransferinfo.nFrameCount) { + printf("\nOrca Frame Count: %d\n", captransferinfo.nFrameCount); + prevAcquisitionCount = captransferinfo.nFrameCount; + + // get image information + int32 pixeltype = 0, width = 0, rowbytes = 0, height = 0, framebytes = 0; + getImageInformation(m_hdcam, pixeltype, width, rowbytes, height, framebytes); + + if( pixeltype != DCAM_PIXELTYPE_MONO16 ) { + printf( "not implement\n" ); + return; + } + + setIntegerParam(NDArraySizeX, (int)width); + setIntegerParam(NDArraySizeY, (int)height); + /* Do callbacks so higher layers see any changes */ + callParamCallbacks(); + + image = new unsigned char[width * 2 * height]; + memset(image, 0, width * 2 * height); + + getIntegerParam(NDArrayCounter, &count); + count++; + setIntegerParam(NDArrayCounter, count); + + epicsUInt32 ts_sec = 0, ts_microsec = 0; + accessCapturedImage(m_hdcam, captransferinfo.nNewestFrameIndex, image, + width * 2, width, height, ts_sec, ts_microsec); + + double timestamp; + + getIntegerParam(hTriggerSource, &triggerMode); + if (triggerMode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + 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); + + // 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); + } + + printf("readout_time: %f - exposure_time: %f\n", readout_time, exposure_time); + epicsTimeGetCurrent(¤tAcqTime); + elapsedTime = epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime); + prevAcqTime = currentAcqTime; + + status = setDoubleParam(hFrameRate, (double)(1 / elapsedTime)); + + getIntegerParam(NDArrayCallbacks, &callback); + if(callback) { + + NDArray *pImage; + size_t dims[2]; + int itemp=0; + + getIntegerParam(NDArraySizeX, &itemp); dims[0] = itemp; + getIntegerParam(NDArraySizeY, &itemp); dims[1] = itemp; + pImage = pNDArrayPool->alloc(2, dims, NDUInt16, 0, 0); + + if(pImage) { + pImage->uniqueId = count; + pImage->timeStamp = timestamp; + updateTimeStamp(&pImage->epicsTS); + + memcpy(pImage->pData, (epicsUInt16 *)image, pImage->dataSize); + + getAttributes(pImage->pAttributeList); + doCallbacksGenericPointer(pImage, NDArrayData, 0); + pImage->release(); + } + } + + delete[] image; + } + + 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; + } + + + + + getDoubleParam(ADAcquirePeriod, &acqusitionRate); + maxAcqusitionTime = acqusitionRate * 2; + epicsTimeGetCurrent(¤tAcqTime); + if (epicsTimeDiffInSeconds(¤tAcqTime, &prevAcqTime) > maxAcqusitionTime) { + printf("[DEBUG]::maxAcqusitionTime %f\n", 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; + setIntegerParam(evrTriggerDropped, evr_trigger_dropped); + } + } + + if ((imageMode == ADImageMultiple && totalImages == captransferinfo.nFrameCount) || + (imageMode == ADImageSingle && captransferinfo.nFrameCount == 1)) { + setShutter(0); + stopAcquire(); + setIntegerParam(ADAcquire, 0); + setIntegerParam(hAcqControl, 0); + setIntegerParam(ADStatus, ADStatusIdle); + setStringParam (ADStatusMessage, "Acquisition Done"); + } + callParamCallbacks(); + } +} +//============================================================================ +void Orca::temperatureTask(){ + static const char *functionName = "tempTask"; + asynStatus status = asynSuccess; + double dvalue = 0; + + while( !stopThread ) { + + 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); + } + + callParamCallbacks(); + epicsThreadSleep(1.0); + } + +} + +//============================================================================ +asynStatus Orca::writeInt32(asynUser *pasynUser, epicsInt32 value) { + asynStatus status = asynSuccess; + const char* functionName = "writeInt32"; + const char* paramName; + + int index = pasynUser->reason; + int adstatus; + // the setget function required double parameter + double dvalue = double(value); + + getParamName(index, ¶mName); + + /* Ensure that ADStatus is set correctly before we set ADAcquire.*/ + getIntegerParam(ADStatus, &adstatus); + + status = setIntegerParam(index, value); + + if (index == ADAcquire) { + if (value && adstatus != ADStatusAcquire) { + 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(); + } + } + else if (index == ADImageMode) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); + 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]::writeInit32 ADNumExposures\n"); + } + else if (index == ADMinX) { + int minH = 0, sizeH = 0; + double dFrameBytes = 0; + getIntegerParam(ADMinX, &minH); + getIntegerParam(ADSizeX, &sizeH); + + 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, false); + } + else if (index == ADMinY) { + int minV = 0, sizeV = 0; + double dFrameBytes = 0; + status = getIntegerParam(ADMinY, &minV); + getIntegerParam(ADSizeY, &sizeV); + + 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, false); + } + + 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, false); + } + + 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, false); + } + else if (index == ADReadStatus) { + // dcamprop_setvalue(m_hdcam, DCAM_IDPROP_, value); + // dcamprop_getvalue(m_hdcam, DCAM_IDPROP_, &value_d); + printf("[DEBUG]::writeInit32 ADReadStatus\n"); + } + + 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, 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, false); + } + + else if (index == hReadoutDirection) { + 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); + } + } + //-- Trigger + else if (index == hTriggerSource) { + 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]::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]::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]::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]::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]::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]::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]::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); + } + } + + //-- binning and ROI + else if (index == hBinning) { + 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 == hSubarrayMode) { + 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); + } + } + /* + else if (index == hIntensityLutMode) { + 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) { + 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); + } + } + */ + //-- 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 == 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); + if(failed(m_err)) { + 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 == 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); + 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 == 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 == 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); + } + } + 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 == 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); + 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 == 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 == hImagePixelType) { + 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 < FIRST_HAMA_PARAM){ + status = ADDriver::writeInt32(pasynUser, 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); + //} + } + + /* Do callbacks so higher layers see any changes */ + status = (asynStatus) callParamCallbacks(); + + if (status) + asynPrint(pasynUser, ASYN_TRACE_ERROR, + "%s:%s: error, status=%d function=%d, paramName=%s, value=%d\n", + driverName, functionName, status, index, paramName, value); + else + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, paramName=%s, value=%d\n", + driverName, functionName, index, paramName, value); + +return status; +} + +//============================================================================ + +asynStatus Orca::writeFloat64(asynUser *pasynUser, epicsFloat64 value){ + + asynStatus status = asynSuccess; + const char* functionName = "writeFloat64"; + const char* paramName; + + int index = pasynUser->reason; + + double dvalue = value; + + getParamName(index, ¶mName); + //-- Sensor mode and speed + //-- 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); + status = getIntegerParam(hTriggerSource, &trigger_mode); + + if (trigger_mode == DCAMPROP_TRIGGERSOURCE__EXTERNAL) { + if (value >= acquire_period) status = asynError; + else { + status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); + } + } + + else { + status = setFeature(DCAM_IDPROP_EXPOSURETIME, value); + if (value >= acquire_period) { + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); + callParamCallbacks(); + } + } + + readParameter(DCAM_IDPROP_TIMING_READOUTTIME, false); + m_err = dcamprop_getvalue(m_hdcam, DCAM_IDPROP_EXPOSURETIME, &value); + } + + else if(index == ADAcquirePeriod) { + printf("[DEBUG]::function ADAcquirePeriod from camera: %f\n", 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) { + if (value <= dvalue) { + status = setFeature(DCAM_IDPROP_TRIGGERSOURCE, DCAMPROP_TRIGGERSOURCE__INTERNAL); + status = setIntegerParam(hTriggerSource, DCAMPROP_TRIGGERSOURCE__INTERNAL); + } + 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 { + if (value <= dvalue) status = asynError; + } + } + + //-- Trigger + else if (index == hTriggerDelay) { + 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); + } + } + //-- 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 == 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+0x200, &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 == hInternalLineSpeed) { + 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 == 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); + } + } + + 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 { + setDoubleParam(index, value); + callParamCallbacks(); + asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, + "%s:%s: function=%d, paramName=%s, value=%f\n", + driverName, functionName, index, paramName, value); + } + + return status; +} + + +//============================================================================ +void Orca::report(FILE *fp, int details){ + double dvalue = 0; + fprintf(fp, "Orcamatsu Orca Flash4.0 driver\n"); + if (details < 1) return; + + // 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); +} + +//============================================================================ +int Orca::connectCamera(void){ + + static const char *functionName = "connectCamera"; + int nDevices = 0; + int iDevice = 0; + /* disconnect any connected camera first */ + disconnectCamera(); + + /* initialize api */ + memset(&m_apiInit, 0, sizeof(m_apiInit)); + m_apiInit.size = sizeof(m_apiInit); + + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: connecting camera %d\n", + driverName, functionName, m_id); + + m_err = dcamapi_init( &m_apiInit); + if( failed(m_err) ){ + printError( m_hdcam, m_err, "dcamapi_init()", NULL ); + } else { + nDevices = m_apiInit.iDeviceCount; + printf("dcamapi_init() found %d device(s). \n", nDevices); + printf("camera with index 0 will be used\n"); + iDevice = 0; + } + + /* open handle to camera */ + memset( &m_devOpen, 0, sizeof(m_devOpen) ); + m_devOpen.size = sizeof(m_devOpen); + m_devOpen.index = iDevice; + m_err = dcamdev_open( &m_devOpen ); + + if( failed(m_err) ){ + printError( m_hdcam, m_err, "dcamapi_init()" ); + + } else { + m_hdcam = m_devOpen.hdcam; + printInfo( m_hdcam ); + } + + // open wait handle + DCAMWAIT_OPEN waitopen; + memset( &waitopen, 0, sizeof(waitopen) ); + waitopen.size = sizeof(waitopen); + waitopen.hdcam = m_hdcam; + + m_err = dcamwait_open( &waitopen ); + if( failed(m_err) ) { + printError( m_hdcam, m_err, "dcamwait_open()" ); + } + else { + hwait = waitopen.hwait; + } + + /* close api */ //- it should be here?????????????? +// dcamapi_uninit(); +// return status; + return 0; +} + +//============================================================================ +int Orca::disconnectCamera(void){ + + static const char *functionName = "disconnectCamera"; + + int status = 0; + + + if(m_hdcam == NULL) { + return status; + } + + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s:%s: disconnecting camera %d\n", + driverName, functionName, m_id); + +// status = AT_GetBool(handle_, L"CameraAcquiring", &acquiring); +// if(status == AT_SUCCESS && acquiring) { +// status |= AT_Command(handle_, L"Acquisition Stop"); +// } + +// status |= freeBuffers(); + dcamdev_close( m_hdcam ); + + if(status) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s:%s: error closing camera %d\n", + driverName, functionName, m_id); + } + + m_hdcam = NULL; + return status; + + +} +//============================================================================ +int Orca::allocateBuffers(unsigned int nBuffers) { + m_err = dcambuf_alloc(m_hdcam, nBuffers); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcambuf_alloc()"); + return asynError; + } + return asynSuccess; +} + +//============================================================================ +int Orca::freeBuffers(){ + m_err = dcambuf_release( m_hdcam ); + if( failed(m_err) ) + printError( m_hdcam, m_err, "dcambuf_release()" ); + +return 0; +} + +//============================================================================ +asynStatus Orca::stopAcquire(void) +{ + asynStatus status = asynSuccess; + 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; +} + +//============================================================================ +asynStatus Orca::startAcquire(void) +{ + asynStatus status = asynSuccess; + + // release buffer + freeBuffers(); + + // allocate buffer + allocateBuffers(1); + + // start capture + m_err = dcamcap_start(m_hdcam, DCAMCAP_START_SEQUENCE); + if(failed(m_err)) { + printError(m_hdcam, m_err, "dcamcap_start()"); + status = asynError; + } + return status; +} + +//============================================================================ +inline void* memcpy_s( void* dst, size_t dstsize, const void* src, size_t srclen ) +{ + if( dstsize < srclen ) + return memcpy( dst, src, dstsize ); + else + return memcpy( dst, src, srclen ); +} + +//============================================================================ +asynStatus Orca::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, + int32 rowbytes, int32 cx, int32 cy, + epicsUInt32& ts_sec, epicsUInt32& ts_microsec) +{ + DCAMERR err; + + // prepare frame param + DCAMBUF_FRAME bufframe; + memset( &bufframe, 0, sizeof(bufframe) ); + bufframe.size = sizeof(bufframe); + bufframe.iFrame = iFrame; + + // access image + err = dcambuf_lockframe( hdcam, &bufframe ); + if(failed(err)) { + printError(hdcam, err, "dcambuf_lockframe()"); + return asynError; + } + + if( bufframe.type != DCAM_PIXELTYPE_MONO16 ) { + printf("not implement pixel type\n"); + 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; + char* pDst = (char*)buf; + + for(int y = 0; y < cy; y++ ) { + memcpy_s( pDst, rowbytes, pSrc, copyrowbytes); + pSrc += bufframe.rowbytes; + pDst += rowbytes; + } + + return asynSuccess; +} + + +//======================================================================================================== + + +void Orca::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes) +{ + DCAMERR err; + double property_value; + + // image pixel type(DCAM_PIXELTYPE_MONO16, MONO8, ... ) + err = dcamprop_getvalue(hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &property_value); + if( failed(err) ) + { + printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_PIXELTYPE" ); + return; + } + else + pixeltype = (int32) property_value; + + // image width + err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_WIDTH, &property_value ); + if( failed(err) ) + { + printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_WIDTH" ); + return; + } + else + width = (int32)property_value; + + // image row bytes + err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &property_value ); + if( failed(err) ) + { + printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_ROWBYTES" ); + return; + } + else + rowbytes = (int32)property_value; + + // image height + err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &property_value ); + if( failed(err) ) + { + printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_HEIGHT" ); + return; + } + else + height = (int32)property_value; + + + // image framebytes + err = dcamprop_getvalue( hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &property_value ); + if( failed(err) ) + { + printError( hdcam, err, "dcamprop_getvalue()", "IDPROP:IMAGE_FRAMEBYTES" ); + return; + } + else + framebytes = (int32)property_value; +} + +//============================================================================ +asynStatus Orca::imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo) +{ + DCAMERR err; + // transferinfo param + memset(&captransferinfo, 0, sizeof(captransferinfo)); + captransferinfo.size = sizeof(captransferinfo); + + // get number of captured image + err = dcamcap_transferinfo(m_hdcam, &captransferinfo ); + if( failed(err) ) { + printError( m_hdcam, err, "dcamcap_transferinfo()" ); + return asynError; + } + + if(captransferinfo.nFrameCount < 1) { + return asynError; + } + + return asynSuccess; +} + +//============================================================================ +void Orca::printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt, ...){ + + char errtext[ 256 ]; + + DCAMERR err; + dcamdev_string( err, hdcam, errid, errtext, sizeof(errtext) ); + + printf( "-[ERROR]- -(DCAMERR)- -0x%08X- -%s- -%s-\n", errid, errtext, apiname ); + + if( fmt != NULL ) { + printf( " : " ); + + va_list arg; + va_start(arg,fmt); + vprintf( fmt, arg ); + va_end(arg); + } + + +} + +//============================================================================ + +void Orca::printInfo(HDCAM hdcam){ + + char model[ 256 ]; + char cameraid[ 64 ]; + char bus[ 64 ]; + + DCAMERR err; + if( ! dcamdev_string( err, hdcam, DCAM_IDSTR_MODEL, model, sizeof(model) ) ) { + printError( hdcam, err, "dcamdev_getstring(DCAM_IDSTR_MODEL)\n" ); + } + else if( ! dcamdev_string( err, hdcam, DCAM_IDSTR_CAMERAID, cameraid, sizeof(cameraid)) ) { + printError( hdcam, err, "dcamdev_getstring(DCAM_IDSTR_CAMERAID)\n" ); + } + else if( ! dcamdev_string( err, hdcam, DCAM_IDSTR_BUS, bus, sizeof(bus) ) ) { + printError( hdcam, err, "dcamdev_getstring(DCAM_IDSTR_BUS)\n" ); + } + else { + printf( "%s (%s) on %s\n", model, cameraid, bus ); + } + +} + + +//============================================================================ + +int Orca::dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, int32 textbytes ) { + + DCAMDEV_STRING param; + memset( ¶m, 0, sizeof(param) ); + param.size = sizeof(param); + param.text = text; + param.textbytes = textbytes; + param.iString = idStr; + + err = dcamdev_getstring( hdcam, ¶m ); +return ! failed( err ); +} + +//============================================================================ +asynStatus Orca::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 Orca::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; +} + +int Orca::roundToNearestMultipleOfFour(int value) { + int remainder = value % 4; + if (remainder == 0) return value; + else if (remainder <= 2) return value - remainder; + else return value + (4 - remainder); +} + + +//============================================================================ +//============================================================================ +/* Code for iocsh registration */ + + + +extern "C" int OrcaConfig(const char *portName, int cameraId, int maxBuffers, + size_t maxMemory, int priority, int stackSize, + int maxFrames) { + new Orca(portName, cameraId, maxBuffers, maxMemory, priority, stackSize, + maxFrames); + + return(asynSuccess); +} + +//============================================================================ +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 configorca = {"devOrcamatsuConfig", 7, OrcaConfigArgs}; + +//============================================================================ +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 orcaRegister(void) { + + iocshRegister(&configorca, configorcaCallFunc); +} + +//============================================================================ +extern "C" { + +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/ADOrcaApp/src/orca.h b/ADOrcaApp/src/orca.h new file mode 100644 index 0000000..1c1ab60 --- /dev/null +++ b/ADOrcaApp/src/orca.h @@ -0,0 +1,322 @@ +#ifndef DRV_HAMA_H +#define DRV_HAMA_H + + +#include "ADDriver.h" +#include "dcamapi4.h" + +#define MAX_FEATURE_NAME_LEN 64 + +#define MAX_H_SENSOR_SIZE 2048 +#define MAX_V_SENSOR_SIZE 2048 + +#define hFrameRateString "H_FRAMERATE" +#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 */ +#define hBusString "H_BUS" /* asynOctet ro */ +#define hCameraVersionString "H_CAMERA_VERSION" /* asynOctet ro */ +#define hDriverVersionString "H_DRIVER_VERSION" /* asynOctet ro */ +#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 */ + +// Trigger +#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 hTriggerConnectorString "H_TRIGGER_CONNECTOR" /* asynInt32 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 */ + +// 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 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 */ + +// 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 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 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 hMasterPulseTriggerSourceString "H_MASTERPULSE_TRIGGER_SOURCE" /* asynInt32 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 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 hTimingInvalidExposurePeriodString "H_TIMING_INVALID_EXPOSURE_PERIOD" /* asynFloat64 ro */ +#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 */ + +// 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_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 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 +#define DETECTOR_PIXEL_NUM_HORZ 0x00420830 +#define DETECTOR_PIXEL_NUM_VERT 0x00420840 + +class epicsShareClass Orca : public ADDriver { + +public: + 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); + virtual void report(FILE *fp, int details); + + int readParameter(int propertyID, bool processPV = true); + int readParameterStr(int paramIndex); + + epicsUInt32 mTimeStampSec; + epicsUInt32 mTimeStampNsec; + + void imageTask(); + void temperatureTask(); + +protected: + int hFrameRate; + #define FIRST_HAMA_PARAM hFrameRate + int hOrcaName; + int hVendor; + int hModel; + int hCameraID; + int hBus; + int hCameraVersion; + int hDriverVersion; + int hModuleVersion; + int hDcamApiVersion; + // - sensor mode and speed + int hSensorMode; + int hReadoutSpeed; + int hReadoutDirection; + // - trigger + int hTriggerSource; + int hTriggerMode; + int hTriggerActive; + int hTriggerGlobalExposure; + int hTriggerPolarity; + int hTriggerConnector; + int hTriggerTimes; + int hTriggerDelay; + int hInternalTriggerHandling; + // - sensor cooler + int hSensorTemperature; + int hSensorCooler; + int hSensorCoolerStatus; + // - 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; + // - output trigger + int hNumberOfOutputTriggerConnector; + int hOutputTriggerSource0; + int hOutputTriggerSource1; + int hOutputTriggerSource2; + int hOutputTriggerPolarity0; + int hOutputTriggerPolarity1; + int hOutputTriggerPolarity2; + int hOutputTriggerActive0; + int hOutputTriggerActive1; + int hOutputTriggerActive2; + int hOutputTriggerDelay0; + int hOutputTriggerDelay1; + int hOutputTriggerDelay2; + int hOutputTriggerPeriod0; + int hOutputTriggerPeriod1; + int hOutputTriggerPeriod2; + int hOutputTriggerKind0; + int hOutputTriggerKind1; + int hOutputTriggerKind2; + int hOutputTriggerBaseSensor0; + int hOutputTriggerBaseSensor1; + int hOutputTriggerBaseSensor2; + int hOutputTriggerPreHsyncCount; + // - 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; + int hNumberOfView; + int hImageDetectorPixelWidth; + int hImageDetectorPixelHeight; + int hImageDetectorPixelNumHorz; + int hImageDetectorPixelNumVert; + int hTimeStampProducer; + int hFrameStampProducer; + int evrCounts; + int evrCountsSinceAcqStart; + int evrTriggerDropped; + int hAcqControl; + int evrTimeStamp; + //---- + //#define LAST_HAMA_PARAM evrTimeStamp + + +private: + + HDCAM m_hdcam; + DCAMAPI_INIT m_apiInit; + DCAMDEV_OPEN m_devOpen; + DCAMERR m_err; + // handle used to wait for events sent from the device + HDCAMWAIT hwait; + + int m_id; + int stopThread; + + epicsEventId startEvent_; + + // Helper functions + 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, epicsUInt32& ts_sec, epicsUInt32& ts_microsec); + asynStatus imageTransferStatus(HDCAM hdcam, DCAMCAP_TRANSFERINFO &captransferinfo); + + // wrapper functions for dcamapi + int allocateBuffers(unsigned int); + int freeBuffers(); + + // These function will be read only once + 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); + int dcamdev_string( DCAMERR& err, HDCAM hdcam, int32 idStr, char* text, int32 textbytes ); + + + int getProperties(); + int roundToNearestMultipleOfFour(int value); + + asynStatus setFeature(int featureIndex, double value); +}; + +#endif 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 ba9cb96..ae0e90d 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -1,26 +1,31 @@ # 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", "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") -# iocshLoad("$(adhama_DIR)ADHama.iocsh") +#EVR settings +#epicsEnvSet("EVR", "LabS-NIDO:Ctrl-EVR-01") +epicsEnvSet("EVR", "Labs-ECDC:TS-EVR-11") +epicsEnvSet("EVR_EVENT", "B") -devHamamatsuConfig("$(PORT)", $(CAMERA), 0, 0, 0, 0, 10) +# iocshLoad("$(adorca_DIR)ADOrca.iocsh") -dbLoadRecords("$(adhama_DIR)db/hama.db","P=$(PREFIX),R=cam1:,PORT=$(PORT),ADDR=0,TIMEOUT=1") +devOrcamatsuConfig("$(PORT)", $(CAMERA), 0, 0, 0, 0, 10) -asynSetTraceMask("$(PORT)",-1,0x9) -asynSetTraceIOMask("$(PORT)",-1,0x2) +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) # ========================================================================================================= @@ -32,15 +37,35 @@ 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)") -startPVAServer +# 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") + +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 iocInit() -dbpf Hama:cam1:PoolUsedMem.SCAN 0 -dbpf Hama:image1:EnableCallbacks 1 +dbpf Orca:cam1:PoolUsedMem.SCAN 0 +dbpf Orca:image1:EnableCallbacks 1 +dbpf Orca:Kfk1:EnableCallbacks 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 Orca:cam1:TriggerPolarity-S # 2-positive, 1-negative epicsThreadSleep(1.0) + +dbl > pv.list 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") 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-x86_64/libdcamapi.so.4.0.6269 b/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4.0.6269 new file mode 100755 index 0000000..7140b48 Binary files /dev/null and b/support/dcamsdk4/lib/linux-x86_64/libdcamapi.so.4.0.6269 differ