diff --git a/ADHamaApp/Db/hama.template b/ADHamaApp/Db/hama.template index 4173172..d18f0e4 100644 --- a/ADHamaApp/Db/hama.template +++ b/ADHamaApp/Db/hama.template @@ -173,8 +173,8 @@ record(mbbo, "$(P)$(R)SensorMode-S") { field(TWST, "Splitview") field(THVL, "4") field(THST, "Duallightsheet") - field(DRVL, "1") - field(DRVH, "4") +# field(DRVL, "1") +# field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_SENSOR_MODE") field(VAL, "1") } @@ -221,8 +221,8 @@ record(mbbo, "$(P)$(R)ReadoutDirection-S") { field(DTYP, "asynInt32") field(ZRVL, "5") field(ZRST, "Diverge") - field(DRVL, "5") - field(DRVH, "5") +# field(DRVL, "5") +# field(DRVH, "5") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_READOUT_DIRECTION") field(VAL, "5") } @@ -249,8 +249,8 @@ record(mbbo, "$(P)$(R)ColorType-S") { field(DTYP, "asynInt32") field(ZRVL, "1") field(ZRST, "B/W") - field(DRVL, "1") - field(DRVH, "1") +# field(DRVL, "1") +# field(DRVH, "1") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_COLOR_TYPE") field(VAL, "1") } @@ -272,8 +272,8 @@ record(mbbo, "$(P)$(R)BitPerChannel-S") { field(ZRST, "12 bits") field(ONVL, "16") field(ONST, "16 bits") - field(DRVL, "12") - field(DRVH, "16") +# field(DRVL, "12") +# field(DRVH, "16") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BIT_PER_CHANNEL") field(VAL, "16") } @@ -308,8 +308,8 @@ record(mbbo, "$(P)$(R)TriggerSource-S") { field(TWST, "Software") field(THVL, "4") field(THST, "Master Pulse") - field(DRVL, "1") - field(DRVH, "4") +# field(DRVL, "1") +# field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_SOURCE") field(VAL, "1") } @@ -338,8 +338,8 @@ record(mbbo, "$(P)$(R)TriggerMode-S") { field(ZRST, "Normal") field(ONVL, "2") field(ONST, "Start") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_MODE") field(VAL, "1") } @@ -366,8 +366,8 @@ record(mbbo, "$(P)$(R)TriggerActive-S") { field(ONST, "Level") field(TWVL, "3") field(TWST, "Sync Readout") - field(DRVL, "1") - field(DRVH, "3") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_ACTIVE") field(VAL, "1") } @@ -397,11 +397,11 @@ record(mbbo, "$(P)$(R)TriggerGlobalExposure-S") { field(PINI, "YES") field(DTYP, "asynInt32") field(ZRVL, "3") - field(ZRST, "Delay") + field(ZRST, "Delayed") field(ONVL, "5") - field(ONST, "Reset") - field(DRVL, "3") - field(DRVH, "5") + field(ONST, "Global Reset") +# field(DRVL, "3") +# field(DRVH, "5") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_GLOBAL_EXPOSURE") field(VAL, "3") } @@ -410,9 +410,9 @@ record(mbbi, "$(P)$(R)TriggerGlobalExposure-RB") { field(DESC, "") field(DTYP, "asynInt32") field(ZRVL, "3") - field(ZRST, "Delay") + field(ZRST, "Delayed") field(ONVL, "5") - field(ONST, "Reset") + field(ONST, "Global Reset") field(INP, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_GLOBAL_EXPOSURE") field(SCAN, "I/O Intr") } @@ -426,8 +426,8 @@ record(mbbo, "$(P)$(R)TriggerPolarity-S") { field(ZRST, "Negative") field(ONVL, "2") field(ONST, "Positive") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_POLARITY") field(VAL, "1") } @@ -452,8 +452,8 @@ record(mbbo, "$(P)$(R)TriggerConnector-S") { field(ZRST, "Interface") field(ONVL, "2") field(ONST, "BNC") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_TRIGGER_CONNECTOR") field(VAL, "2") } @@ -595,8 +595,8 @@ record(mbbo, "$(P)$(R)Binning-S") { field(ONST, "2x2") field(TWVL, "3") field(TWST, "4x4") - field(DRVL, "1") - field(DRVH, "3") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_BINNING") field(VAL, "1") } @@ -676,8 +676,8 @@ record(mbbo, "$(P)$(R)DefectCorrectMode-S") { field(ZRST, "OFF") field(ONVL, "2") field(ONST, "ON") - field(DRVL, "1") - field(DRVH, "2") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_DEFECTCORRECT_MODE") field(VAL, "2") } @@ -705,8 +705,8 @@ record(mbbo, "$(P)$(R)HotPixelCorrectLevel-S") { field(ONST, "Minimum") field(TWVL, "3") field(TWST, "Aggressive") - field(DRVL, "1") - field(DRVH, "3") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_HOT_PIXEL_CORRECT_LEVEL") field(VAL, "1") } @@ -734,6 +734,8 @@ record(mbbo, "$(P)$(R)IntensityLutMode-S") { field(ZRST, "Through") field(ONVL, "2") field(ONST, "Page") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTENSITY_LUT_MODE") field(VAL, "1") } @@ -755,6 +757,8 @@ record(ao, "$(P)$(R)IntensityLutPage-S") { field(DESC, "") field(PINI, "YES") field(DTYP, "asynInt32") + field(DRVL, "1") + field(DRVH, "1") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTENSITY_LUT_PAGE") field(VAL, "1") } @@ -800,6 +804,8 @@ record(mbbo, "$(P)$(R)OutputTriggerSource0-S") { field(TWST, "HSync") field(THVL, "6") field(THST, "Trigger") +# field(DRVL, "2") +# field(DRVH, "6") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_SOURCE0") field(VAL, "2") } @@ -829,6 +835,8 @@ record(mbbo, "$(P)$(R)OutputTriggerPolarity0-S") { field(ZRST, "Negative") field(ONVL, "2") field(ONST, "Positive") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_POLARITY0") field(VAL, "1") } @@ -851,6 +859,8 @@ record(mbbo, "$(P)$(R)OutputTriggerActive0-S") { field(PINI, "YES") field(ZRVL, "1") field(ZRST, "Edge") +# field(DRVL, "1") +# field(DRVH, "1") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_ACTIVE0") field(VAL, "1") } @@ -920,6 +930,8 @@ record(mbbo, "$(P)$(R)OutputTriggerKind0-S") { field(FRST, "High") field(FVVL, "6") field(FVST, "Any Row Exposure") +# field(DRVL, "1") +# field(DRVH, "6") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_KIND0") field(VAL, "1") } @@ -976,6 +988,8 @@ record(mbbo, "$(P)$(R)OutputTriggerBaseSensor0-S") { field(TWST, "Any View") field(THVL, "16") field(THST, "All Views") +# field(DRVL, "1") +# field(DRVH, "4") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_OUTPUT_TRIGGER_BASE_SENSOR0") field(VAL, "1") } @@ -1009,6 +1023,8 @@ record(mbbo, "$(P)$(R)MasterPulseMode-S") { field(ONST, "Start") field(TWVL, "3") field(THST, "Burst") +# field(DRVL, "1") +# field(DRVH, "3") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_MODE") field(VAL, "1") } @@ -1036,6 +1052,8 @@ record(mbbo, "$(P)$(R)MasterPulseTriggerSource-S") { field(ZRST, "External") field(ONVL, "2") field(ONST, "Software") +# field(DRVL, "1") +# field(DRVH, "2") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_MASTERPULSE_TRIGGER_SOURCE") field(VAL, "1") } @@ -1157,8 +1175,8 @@ record(mbbi, "$(P)$(R)TimingInvalidExposurePeriod-RB") { record(ao, "$(P)$(R)InternalFrameRate-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "20.035817413") - field(DRVH, "49.865614232") + field(DRVL, "0.1") + field(DRVH, "100.022862") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_RATE") field(EGU, "Hz") } @@ -1176,8 +1194,8 @@ record(ai, "$(P)$(R)InternalFrameRate-RB") { record(ao, "$(P)$(R)InternalFrameInternal-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") + field(DRVL, "0.00998") + field(DRVH, "10.0") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_FRAME_INTERVAL") field(EGU, "Sec") } @@ -1195,8 +1213,8 @@ record(ai, "$(P)$(R)InternalFrameInternal-RB") { record(ao, "$(P)$(R)InternalLineSpeed-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") + field(DRVL, "0.667052") + field(DRVH, "0.667052") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_SPEED") field(EGU, "m/s") } @@ -1214,8 +1232,8 @@ record(ai, "$(P)$(R)InternalLineSpeed-RB") { record(ao, "$(P)$(R)InternalLineInterval-S") { field(DESC, "") field(DTYP, "asynFloat64") - field(DRVL, "") - field(DRVH, "") + field(DRVL, "0.00001") + field(DRVH, "0.00001") field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))H_INTERNAL_LINE_INTERVAL") field(EGU, "Sec") } diff --git a/ADHamaApp/src/hama.cpp b/ADHamaApp/src/hama.cpp index 8487c1c..eb46644 100644 --- a/ADHamaApp/src/hama.cpp +++ b/ADHamaApp/src/hama.cpp @@ -187,8 +187,6 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, connectCamera(); - int err = 0; - /* err |= getParameter(DCAM_IDPROP_SENSORMODE); err |= getParameter(DCAM_IDPROP_READOUTSPEED); @@ -205,24 +203,9 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, */ -#define DETECTOR_PIXEL_NUM_HORZ 0x00420830 -#define DETECTOR_PIXEL_NUM_VERT 0x00420840 - err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); - err |= getParameter(DETECTOR_PIXEL_NUM_VERT); - err |= getParameterStr(DCAM_IDSTR_VENDOR); - err |= getParameterStr(DCAM_IDSTR_MODEL); - err |= getParameterStr(DCAM_IDSTR_CAMERAID); - err |= getParameterStr(DCAM_IDSTR_BUS); - err |= getParameterStr(DCAM_IDSTR_CAMERAVERSION); - err |= getParameterStr(DCAM_IDSTR_DRIVERVERSION); - err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); - err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); - - if(err){ - printf("[DEBUG] Error = %d\n", err); - } + initCamera(); /* launch image read task */ epicsThreadCreate("HamaImageTask", @@ -247,6 +230,55 @@ Hama::Hama(const char* portName, int cameraId, int maxBuffers, size_t maxMemory, // printf("[DEBUG] === Destructor ADHama ===\n"); //} +//======================================================================================================== +int Hama::initCamera(){ + + int err = 0; + + err |= getParameterStr(DCAM_IDSTR_VENDOR); + err |= getParameterStr(DCAM_IDSTR_MODEL); + err |= getParameterStr(DCAM_IDSTR_CAMERAID); + err |= getParameterStr(DCAM_IDSTR_BUS); + err |= getParameterStr(DCAM_IDSTR_CAMERAVERSION); + err |= getParameterStr(DCAM_IDSTR_DRIVERVERSION); + err |= getParameterStr(DCAM_IDSTR_MODULEVERSION); + err |= getParameterStr(DCAM_IDSTR_DCAMAPIVERSION); + + err |= getParameter(DETECTOR_PIXEL_NUM_HORZ); + err |= getParameter(DETECTOR_PIXEL_NUM_VERT); + + err |= getParameter( DCAM_IDPROP_IMAGE_PIXELTYPE); + err |= getParameter( DCAM_IDPROP_IMAGE_WIDTH); + err |= getParameter( DCAM_IDPROP_IMAGE_ROWBYTES); + err |= getParameter( DCAM_IDPROP_IMAGE_HEIGHT); + err |= getParameter( DCAM_IDPROP_IMAGE_FRAMEBYTES); + err |= getParameter( DCAM_IDPROP_SUBARRAYHPOS); + err |= getParameter( DCAM_IDPROP_SUBARRAYVPOS); + err |= getParameter( DCAM_IDPROP_SUBARRAYHSIZE); + err |= getParameter( DCAM_IDPROP_SUBARRAYVSIZE); + + + err |= getParameter(DCAM_IDPROP_SENSORMODE); + err |= getParameter(DCAM_IDPROP_READOUTSPEED); + err |= getParameter(DCAM_IDPROP_READOUT_DIRECTION); + err |= getParameter(DCAM_IDPROP_TRIGGERSOURCE); + err |= getParameter(DCAM_IDPROP_TRIGGER_MODE); + err |= getParameter(DCAM_IDPROP_TRIGGERACTIVE); + err |= getParameter(DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE); + err |= getParameter(DCAM_IDPROP_OUTPUTTRIGGER_POLARITY); + err |= getParameter(DCAM_IDPROP_TRIGGER_CONNECTOR); + err |= getParameter(DCAM_IDPROP_TRIGGERTIMES); + err |= getParameter(DCAM_IDPROP_TRIGGERDELAY); + err |= getParameter(DCAM_IDPROP_INTERNALTRIGGER_HANDLING); + + + if(err){ + // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", + // driverName, functionName, this->portName, value, (int)status); + } +return err; +} + //============================================================================ int Hama::getParameterStr(int propertyID){ @@ -306,10 +338,6 @@ int Hama::getParameterStr(int propertyID){ break; } - - /* Do callbacks so higher layers see any changes */ - status = (asynStatus) callParamCallbacks(); - // asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, "%s:%s: port=%s, value=%d, status=%d\n", // driverName, functionName, this->portName, value, (int)status); return int(status); @@ -341,57 +369,126 @@ int Hama::getParameter(int propertyID){ status = setIntegerParam(ADMaxSizeY, value); printf("SENSOR SIZE_Y = %f\n", value); break; + + case DCAM_IDPROP_IMAGE_PIXELTYPE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_PIXELTYPE, &value); + status = setIntegerParam(hImagePixelType, value); + break; + + case DCAM_IDPROP_IMAGE_WIDTH: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_WIDTH, &value); + status = setIntegerParam(hImageWidth, value); + break; + + case DCAM_IDPROP_IMAGE_HEIGHT: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_HEIGHT, &value); + status = setIntegerParam(hImageHeight, value); + break; + + case DCAM_IDPROP_IMAGE_ROWBYTES: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_ROWBYTES, &value); + status = setIntegerParam(hImageRowbytes, value); + break; + + case DCAM_IDPROP_IMAGE_FRAMEBYTES: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_IMAGE_FRAMEBYTES, &value); + status = setIntegerParam(hImageFramebytes, value); + break; + + case DCAM_IDPROP_SUBARRAYHSIZE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHSIZE, &value); + status = setIntegerParam(ADMinX, value); + break; + + case DCAM_IDPROP_SUBARRAYVSIZE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVSIZE, &value); + status = setIntegerParam(ADMinY, value); + break; + + case DCAM_IDPROP_SUBARRAYHPOS: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYHPOS, &value); + status = setIntegerParam(ADSizeX, value); + break; + + case DCAM_IDPROP_SUBARRAYVPOS: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SUBARRAYVPOS, &value); + status = setIntegerParam(ADSizeY, value); + break; case DCAM_IDPROP_SENSORMODE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_SENSORMODE, &value); + status = setIntegerParam(hSensorMode, value); printf("The SENSOR MODE = %f\n", value); break; case DCAM_IDPROP_READOUTSPEED: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUTSPEED, &value); + status = setIntegerParam(hReadoutSpeed, value); printf("The READOUT SPEED = %f\n", value); break; case DCAM_IDPROP_READOUT_DIRECTION: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_READOUT_DIRECTION, &value); + status = setIntegerParam(hReadoutDirection, value); printf("The READOUT DIRECTION = %f\n", value); break; case DCAM_IDPROP_TRIGGERSOURCE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERSOURCE, &value); + status = setIntegerParam(hTriggerSource, value); printf("The = TRIGGER SOURCE = %f\n", value); break; case DCAM_IDPROP_TRIGGER_MODE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_MODE, &value); + status = setIntegerParam(hTriggerMode, value); printf("The TRIGGER MODE = %f\n", value); break; case DCAM_IDPROP_TRIGGERACTIVE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERACTIVE, &value); + status = setIntegerParam(hTriggerActive, value); printf("The TRIGGER ACTIVE = %f\n", value); break; case DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_GLOBALEXPOSURE, &value); + status = setIntegerParam(hTriggerGlobalExposure, value); printf("The TRIGGER GLOBAL EXPOSURE = %f\n", value); break; case DCAM_IDPROP_TRIGGERPOLARITY: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_OUTPUTTRIGGER_POLARITY, &value); + status = setIntegerParam(hTriggerPolarity, value); printf("The TRIGGER POLARITY = %f\n", value); break; case DCAM_IDPROP_TRIGGER_CONNECTOR: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGER_CONNECTOR, &value); + status = setIntegerParam(hTriggerConnector, value); printf("The TRIGGER CONNECTOR = %f\n", value); break; case DCAM_IDPROP_TRIGGERTIMES: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERTIMES, &value); + status = setIntegerParam(hTriggerTimes, value); printf("The TRIGGER TIMES = %f\n", value); break; case DCAM_IDPROP_TRIGGERDELAY: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_TRIGGERDELAY, &value); + status = setIntegerParam(hTriggerDelay, value); printf("The TRIGGER DELAY = %f\n", value); break; case DCAM_IDPROP_INTERNALTRIGGER_HANDLING: + dcamprop_getvalue(m_hdcam, DCAM_IDPROP_INTERNALTRIGGER_HANDLING, &value); + status = setIntegerParam(hInternalTriggerHandling, value); printf("The INTERNAL TRIGGE HANDLING = %f\n", value); break; default: - printf("The = %f\n", value); + printf("The init parameter not recognised.... = %f\n", value); break; } @@ -1470,6 +1567,10 @@ asynStatus Hama::accessCapturedImage(HDCAM hdcam, int32 iFrame, void* buf, return asynSuccess; } + +//======================================================================================================== + + void Hama::getImageInformation(HDCAM hdcam, int32& pixeltype, int32& width, int32& rowbytes, int32& height, int32& framebytes) { DCAMERR err; diff --git a/ADHamaApp/src/hama.h b/ADHamaApp/src/hama.h index 93bfd8a..7da1cef 100644 --- a/ADHamaApp/src/hama.h +++ b/ADHamaApp/src/hama.h @@ -128,9 +128,10 @@ #define hImageDetectorPixelNumVertString "H_IMAGE_DETECTOR_PIXEL_NUM_VERT" /* asynInt32 ro */ #define hTimeStampProducerString "H_TIMESTAMP_PRODUCER" /* asynInt32 ro */ #define hFrameStampProducerString "H_FRAMESTAMP_PRODUCER" /* asynInt32 ro */ - - +// For some reason these two addresses are not defined in the dcamapi4 neither in dcamprop.h +#define DETECTOR_PIXEL_NUM_HORZ 0x00420830 +#define DETECTOR_PIXEL_NUM_VERT 0x00420840 class Hama : public ADDriver { @@ -279,7 +280,9 @@ private: int connectCamera(); int disconnectCamera(); - + int initCamera(); + + // helper functions for dcamapi void printError(HDCAM hdcam, DCAMERR errid, const char* apiname, const char* fmt=NULL, ...); void printInfo(HDCAM hdcam);