Replaced cout with asynPrint; exception errors now print name of function

git-svn-id: https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk@15793 dc6c5ff5-0b8b-c028-a01f-ffb33f00fc8b
This commit is contained in:
rivers
2012-12-21 17:34:26 +00:00
parent 15361513ac
commit fca2cbffd8

View File

@@ -10,19 +10,27 @@
*
*/
#include <iostream>
#include <fstream>
#include "andorCCD.h"
#include <stdio.h>
#include <string.h>
#include <string>
#include <epicsTime.h>
#include <epicsThread.h>
#include <epicsEvent.h>
#include <epicsString.h>
#include <iocsh.h>
#include <epicsExport.h>
#include <epicsExit.h>
using std::cout;
using std::endl;
using std::flush;
using std::ofstream;
#ifdef _WIN32
#include "ATMCD32D.h"
#else
#include "atmcdLXd.h"
#endif
#include "andorCCD.h"
static const char *driverName = "andorCCD";
//Definitions of static class data members
@@ -99,10 +107,8 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
int i;
int binX=1, binY=1, minX=0, minY=0, sizeX, sizeY;
char model[256];
const char *functionName = "AndorCCD::AndorCCD";
static const char *functionName = "AndorCCD";
cout << "Constructing AndorCCD driver..." << endl;
if (installPath == NULL)
strcpy(mInstallPath, "");
else
@@ -138,7 +144,8 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
// Initialize camera
try {
cout << "Initializing CCD..." << endl;
printf("%s:%s: initializing camera\n",
driverName, functionName);
checkStatus(Initialize(mInstallPath));
setStringParam(AndorMessage, "Camera successfully initialized.");
checkStatus(GetDetector(&sizeX, &sizeY));
@@ -147,7 +154,9 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
checkStatus(SetImage(binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY));
callParamCallbacks();
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
return;
}
@@ -205,7 +214,7 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
epicsEventSignal(statusEvent);
if (status) {
printf("%s: unable to set camera parameters\n", functionName);
printf("%s:%s: unable to set camera parameters\n", driverName, functionName);
return;
}
@@ -224,7 +233,7 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
(EPICSTHREADFUNC)andorStatusTaskC,
this) == NULL);
if (status) {
printf("%s:%s epicsThreadCreate failure for status task\n",
printf("%s:%s: epicsThreadCreate failure for status task\n",
driverName, functionName);
return;
}
@@ -237,11 +246,11 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
(EPICSTHREADFUNC)andorDataTaskC,
this) == NULL);
if (status) {
printf("%s:%s epicsThreadCreate failure for data task\n",
printf("%s:%s: epicsThreadCreate failure for data task\n",
driverName, functionName);
return;
}
cout << "CCD initialized OK!\n" << endl;
printf("CCD initialized OK!\n");
}
/**
@@ -249,15 +258,19 @@ AndorCCD::AndorCCD(const char *portName, int maxBuffers, size_t maxMemory,
*/
AndorCCD::~AndorCCD()
{
static const char *functionName = "~AndorCCD";
try {
cout << "Shutdown and freeing up memory..." << endl;
printf("Shutdown and freeing up memory...\n");
this->lock();
checkStatus(FreeInternalMemory());
checkStatus(ShutDown());
cout << "Camera shutting down as part of IOC exit." << endl;
printf("Camera shutting down as part of IOC exit.\n");
this->unlock();
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
}
}
@@ -394,6 +407,7 @@ void AndorCCD::report(FILE *fp, int details)
unsigned int uIntParam6;
AndorCapabilities capabilities;
AndorADCSpeed_t *pSpeed;
static const char *functionName = "report";
fprintf(fp, "Andor CCD port=%s\n", this->portName);
if (details > 0) {
@@ -450,7 +464,9 @@ void AndorCCD::report(FILE *fp, int details)
fprintf(fp, " EMGain=0x%X\n", (int)capabilities.ulEMGainCapability);
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
}
}
// Call the base class method
@@ -470,7 +486,7 @@ asynStatus AndorCCD::writeInt32(asynUser *pasynUser, epicsInt32 value)
epicsInt32 oldValue;
asynStatus status = asynSuccess;
const char *functionName = "AndorCCD::writeInt32";
static const char *functionName = "writeInt32";
//Set in param lib so the user sees a readback straight away. Save a backup in case of errors.
getIntegerParam(function, &oldValue);
@@ -483,27 +499,31 @@ asynStatus AndorCCD::writeInt32(asynUser *pasynUser, epicsInt32 value)
mAcquiringData = 1;
//We send an event at the bottom of this function.
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
status = asynError;
}
}
if (!value && (adstatus != ADStatusIdle)) {
try {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, AbortAcquisition()\n",
functionName);
"%s:%s:, AbortAcquisition()\n",
driverName, functionName);
checkStatus(AbortAcquisition());
mAcquiringData = 0;
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, FreeInternalMemory()\n",
functionName);
"%s:%s:, FreeInternalMemory()\n",
driverName, functionName);
checkStatus(FreeInternalMemory());
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, CancelWait()\n",
functionName);
"%s:%s:, CancelWait()\n",
driverName, functionName);
checkStatus(CancelWait());
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
status = asynError;
}
}
@@ -522,14 +542,20 @@ asynStatus AndorCCD::writeInt32(asynUser *pasynUser, epicsInt32 value)
else if (function == AndorCoolerParam) {
try {
if (value == 0) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, "%s, CoolerOFF()\n", functionName);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, CoolerOFF()\n",
driverName, functionName);
checkStatus(CoolerOFF());
} else if (value == 1) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, "%s, CoolerON()\n", functionName);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, CoolerON()\n",
driverName, functionName);
checkStatus(CoolerON());
}
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
status = asynError;
}
}
@@ -555,8 +581,8 @@ asynStatus AndorCCD::writeInt32(asynUser *pasynUser, epicsInt32 value)
if (mAcquiringData) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, Sending dataEvent to dataTask ...\n",
functionName);
"%s:%s:, Sending dataEvent to dataTask ...\n",
driverName, functionName);
//Also signal the data readout thread
epicsEventSignal(dataEvent);
}
@@ -581,7 +607,7 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
{
int function = pasynUser->reason;
asynStatus status = asynSuccess;
const char *functionName = "AndorCCD::writeFloat64";
static const char *functionName = "writeFloat64";
int minTemp = 0;
int maxTemp = 0;
@@ -600,10 +626,13 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
else if (function == ADGain) {
try {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetPreAmpGain(%d)\n", functionName, (int)value);
"%s:%s:, SetPreAmpGain(%d)\n",
driverName, functionName, (int)value);
checkStatus(SetPreAmpGain((int)value));
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
status = asynError;
}
}
@@ -613,14 +642,17 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
}
else if (function == ADTemperature) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, Setting temperature value %f\n", functionName, value);
"%s:%s:, Setting temperature value %f\n",
driverName, functionName, value);
try {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, CCD Min Temp: %d, Max Temp %d\n", functionName, minTemp, maxTemp);
"%s:%s:, CCD Min Temp: %d, Max Temp %d\n",
driverName, functionName, minTemp, maxTemp);
checkStatus(GetTemperatureRange(&minTemp, &maxTemp));
if ((static_cast<int>(value) > minTemp) & (static_cast<int>(value) < maxTemp)) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetTemperature(%d)\n", functionName, static_cast<int>(value));
"%s:%s:, SetTemperature(%d)\n",
driverName, functionName, static_cast<int>(value));
checkStatus(SetTemperature(static_cast<int>(value)));
} else {
setStringParam(AndorMessage, "Temperature is out of range.");
@@ -628,7 +660,9 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
status = asynError;
}
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
status = asynError;
}
}
@@ -648,7 +682,7 @@ asynStatus AndorCCD::writeFloat64(asynUser *pasynUser, epicsFloat64 value)
callParamCallbacks();
if (status)
asynPrint(pasynUser, ASYN_TRACE_ERROR,
"%s:%s error, status=%d function=%d, value=%f\n",
"%s:%s: error, status=%d function=%d, value=%f\n",
driverName, functionName, status, function, value);
else
asynPrint(pasynUser, ASYN_TRACEIO_DRIVER,
@@ -667,7 +701,7 @@ asynStatus AndorCCD::setupShutter(int command)
int shutterExTTL;
int shutterMode;
asynStatus status=asynSuccess;
static const char *functionName = "AndorCCD::setupShutter";
static const char *functionName = "setupShutter";
getDoubleParam(ADShutterOpenDelay, &dTemp);
// Convert to ms
@@ -691,12 +725,14 @@ asynStatus AndorCCD::setupShutter(int command)
try {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetShutter(%d,%d,%d,%d)\n",
functionName, shutterExTTL, shutterMode, closeTime, openTime);
"%s:%s:, SetShutter(%d,%d,%d,%d)\n",
driverName, functionName, shutterExTTL, shutterMode, closeTime, openTime);
checkStatus(SetShutter(shutterExTTL, shutterMode, closeTime, openTime));
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
status = asynError;
}
return status;
@@ -803,13 +839,10 @@ void AndorCCD::statusTask(void)
unsigned int uvalue = 0;
unsigned int status = 0;
double timeout = 0.0;
unsigned int forcedFastPolls = 0;
static const char *functionName = "statusTask";
//const char *functionName = "AndorCCD::statusTask";
cout << "Status thread started..." << endl;
printf("%s:%s: Status thread started...\n", driverName, functionName);
while(1) {
//Read timeout for polling freq.
@@ -828,7 +861,9 @@ void AndorCCD::statusTask(void)
status = epicsEventWait(statusEvent);
}
if (status == epicsEventWaitOK) {
//cout << "Got status event" << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s: Got status event\n",
driverName, functionName);
//We got an event, rather than a timeout. This is because other software
//knows that data has arrived, or device should have changed state (parameters changed, etc.).
//Force a minimum number of fast polls, because the device status
@@ -837,7 +872,6 @@ void AndorCCD::statusTask(void)
}
this->lock();
//cout << " Status poll." << endl;
try {
//Only read these if we are not acquiring data
@@ -879,7 +913,9 @@ void AndorCCD::statusTask(void)
setStringParam(ADStatusMessage, "Overflow of the spool buffer.");
}
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
setStringParam(AndorMessage, e.c_str());
}
@@ -904,7 +940,7 @@ asynStatus AndorCCD::setupAcquisition()
int FKmode = 4;
int FKOffset;
AndorADCSpeed_t *pSpeed;
static const char *functionName = "AndorCCD::setupAcquisition";
static const char *functionName = "setupAcquisition";
getIntegerParam(ADImageMode, &imageMode);
getIntegerParam(ADNumExposures, &numExposures);
@@ -963,90 +999,105 @@ asynStatus AndorCCD::setupAcquisition()
try {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetTriggerMode(%d)\n", functionName, triggerMode);
"%s:%s:, SetTriggerMode(%d)\n",
driverName, functionName, triggerMode);
checkStatus(SetTriggerMode(triggerMode));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetADChannel(%d)\n", functionName, pSpeed->ADCIndex);
"%s:%s:, SetADChannel(%d)\n",
driverName, functionName, pSpeed->ADCIndex);
checkStatus(SetADChannel(pSpeed->ADCIndex));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetOutputAmplifier(%d)\n", functionName, pSpeed->AmpIndex);
"%s:%s:, SetOutputAmplifier(%d)\n",
driverName, functionName, pSpeed->AmpIndex);
checkStatus(SetOutputAmplifier(pSpeed->AmpIndex));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetHSSpeed(%d, %d)\n", functionName, pSpeed->AmpIndex, pSpeed->HSSpeedIndex);
"%s:%s:, SetHSSpeed(%d, %d)\n",
driverName, functionName, pSpeed->AmpIndex, pSpeed->HSSpeedIndex);
checkStatus(SetHSSpeed(pSpeed->AmpIndex, pSpeed->HSSpeedIndex));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetImage(%d,%d,%d,%d,%d,%d)\n",
functionName, binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY);
"%s:%s:, SetImage(%d,%d,%d,%d,%d,%d)\n",
driverName, functionName, binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY);
checkStatus(SetImage(binX, binY, minX+1, minX+sizeX, minY+1, minY+sizeY));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetExposureTime(%f)\n", functionName, mAcquireTime);
"%s:%s:, SetExposureTime(%f)\n",
driverName, functionName, mAcquireTime);
checkStatus(SetExposureTime(mAcquireTime));
switch (imageMode) {
case ADImageSingle:
if (numExposures == 1) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetAcquisitionMode(AASingle)\n", functionName);
"%s:%s:, SetAcquisitionMode(AASingle)\n",
driverName, functionName);
checkStatus(SetAcquisitionMode(AASingle));
} else {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetAcquisitionMode(AAAccumulate)\n", functionName);
"%s:%s:, SetAcquisitionMode(AAAccumulate)\n",
driverName, functionName);
checkStatus(SetAcquisitionMode(AAAccumulate));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetNumberAccumulations(%d)\n",
functionName, numExposures);
"%s:%s:, SetNumberAccumulations(%d)\n",
driverName, functionName, numExposures);
checkStatus(SetNumberAccumulations(numExposures));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetAccumulationCycleTime(%f)\n", functionName, mAccumulatePeriod);
"%s:%s:, SetAccumulationCycleTime(%f)\n",
driverName, functionName, mAccumulatePeriod);
checkStatus(SetAccumulationCycleTime(mAccumulatePeriod));
}
break;
case ADImageMultiple:
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetAcquisitionMode(AAKinetics)\n", functionName);
"%s:%s:, SetAcquisitionMode(AAKinetics)\n",
driverName, functionName);
checkStatus(SetAcquisitionMode(AAKinetics));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetNumberAccumulations(%d)\n",
functionName, numExposures);
"%s:%s:, SetNumberAccumulations(%d)\n",
driverName, functionName, numExposures);
checkStatus(SetNumberAccumulations(numExposures));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetAccumulationCycleTime(%f)\n", functionName, mAccumulatePeriod);
"%s:%s:, SetAccumulationCycleTime(%f)\n",
driverName, functionName, mAccumulatePeriod);
checkStatus(SetAccumulationCycleTime(mAccumulatePeriod));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetNumberKinetics(%d)\n", functionName, numImages);
"%s:%s:, SetNumberKinetics(%d)\n",
driverName, functionName, numImages);
checkStatus(SetNumberKinetics(numImages));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetKineticCycleTime(%f)\n", functionName, mAcquirePeriod);
"%s:%s:, SetKineticCycleTime(%f)\n",
driverName, functionName, mAcquirePeriod);
checkStatus(SetKineticCycleTime(mAcquirePeriod));
break;
case ADImageContinuous:
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetAcquisitionMode(AARunTillAbort)\n", functionName);
"%s:%s:, SetAcquisitionMode(AARunTillAbort)\n",
driverName, functionName);
checkStatus(SetAcquisitionMode(AARunTillAbort));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetKineticCycleTime(%f)\n", functionName, mAcquirePeriod);
"%s:%s:, SetKineticCycleTime(%f)\n",
driverName, functionName, mAcquirePeriod);
checkStatus(SetKineticCycleTime(mAcquirePeriod));
break;
case AImageFastKinetics:
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetAcquisitionMode(AAFastKinetics)\n", functionName);
"%s:%s:, SetAcquisitionMode(AAFastKinetics)\n",
driverName, functionName);
checkStatus(SetAcquisitionMode(AAFastKinetics));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetImage(%d,%d,%d,%d,%d,%d)\n",
functionName, binX, binY, 1, maxSizeX, 1, maxSizeY);
"%s:%s:, SetImage(%d,%d,%d,%d,%d,%d)\n",
driverName, functionName, binX, binY, 1, maxSizeX, 1, maxSizeY);
checkStatus(SetImage(binX, binY, 1, maxSizeX, 1, maxSizeY));
FKOffset = maxSizeY - sizeY - minY;
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SetFastKineticsEx(%d,%d,%f,%d,%d,%d,%d)\n",
functionName, sizeY, numImages, mAcquireTime, FKmode, binX, binY, FKOffset);
"%s:%s:, SetFastKineticsEx(%d,%d,%f,%d,%d,%d,%d)\n",
driverName, functionName, sizeY, numImages, mAcquireTime, FKmode, binX, binY, FKOffset);
checkStatus(SetFastKineticsEx(sizeY, numImages, mAcquireTime, FKmode, binX, binY, FKOffset));
setIntegerParam(NDArraySizeX, maxSizeX/binX);
setIntegerParam(NDArraySizeY, sizeY/binY);
@@ -1058,8 +1109,8 @@ asynStatus AndorCCD::setupAcquisition()
} else {
checkStatus(GetAcquisitionTimings(&acquireTimeAct, &accumulatePeriodAct, &acquirePeriodAct));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetAcquisitionTimings(exposure=%f, accumulate=%f, kinetic=%f)\n",
functionName, acquireTimeAct, accumulatePeriodAct, acquirePeriodAct);
"%s:%s:, GetAcquisitionTimings(exposure=%f, accumulate=%f, kinetic=%f)\n",
driverName, functionName, acquireTimeAct, accumulatePeriodAct, acquirePeriodAct);
}
setDoubleParam(ADAcquireTime, acquireTimeAct);
setDoubleParam(ADAcquirePeriod, acquirePeriodAct);
@@ -1067,7 +1118,9 @@ asynStatus AndorCCD::setupAcquisition()
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
return asynError;
}
return asynSuccess;
@@ -1098,12 +1151,9 @@ void AndorCCD::dataTask(void)
epicsTimeStamp startTime;
NDArray *pArray;
int autoSave;
//long *dP = NULL;
static const char *functionName = "dataTask";
const char *functionName = "AndorCCD::dataTask";
cout << "Data thread started..." << endl;
printf("%s:%s: Data thread started...\n", driverName, functionName);
this->lock();
@@ -1115,7 +1165,8 @@ void AndorCCD::dataTask(void)
this->unlock();
status = epicsEventWait(dataEvent);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, got data event\n", functionName);
"%s:%s:, got data event\n",
driverName, functionName);
this->lock();
//Sanity check that main thread thinks we are acquiring data
@@ -1124,11 +1175,14 @@ void AndorCCD::dataTask(void)
status = setupAcquisition();
if (status != asynSuccess) continue;
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, StartAcquisition()\n", functionName);
"%s:%s:, StartAcquisition()\n",
driverName, functionName);
checkStatus(StartAcquisition());
acquiring = 1;
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
continue;
}
//Read some parameters
@@ -1143,7 +1197,8 @@ void AndorCCD::dataTask(void)
callParamCallbacks();
} else {
asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,
"%s, Data thread is running but main thread thinks we are not acquiring.\n", functionName);
"%s:%s:, Data thread is running but main thread thinks we are not acquiring.\n",
driverName, functionName);
acquiring = 0;
}
@@ -1151,15 +1206,18 @@ void AndorCCD::dataTask(void)
try {
checkStatus(GetStatus(&acquireStatus));
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetStatus returned %d\n", functionName, acquireStatus);
"%s:%s:, GetStatus returned %d\n",
driverName, functionName, acquireStatus);
if (acquireStatus != DRV_ACQUIRING) break;
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, WaitForAcquisition().\n", functionName);
"%s:%s:, WaitForAcquisition().\n",
driverName, functionName);
this->unlock();
checkStatus(WaitForAcquisition());
this->lock();
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, WaitForAcquisition has returned.\n", functionName);
"%s:%s:, WaitForAcquisition has returned.\n",
driverName, functionName);
getIntegerParam(ADNumExposuresCounter, &numExposuresCounter);
numExposuresCounter++;
setIntegerParam(ADNumExposuresCounter, numExposuresCounter);
@@ -1168,7 +1226,8 @@ void AndorCCD::dataTask(void)
status = GetNumberNewImages(&firstImage, &lastImage);
if (status != DRV_SUCCESS) continue;
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, firstImage=%d, lastImage=%d\n", functionName, firstImage, lastImage);
"%s:%s:, firstImage=%d, lastImage=%d\n",
driverName, functionName, firstImage, lastImage);
for (i=firstImage; i<=lastImage; i++) {
// Update counters
getIntegerParam(NDArrayCounter, &imageCounter);
@@ -1188,20 +1247,20 @@ void AndorCCD::dataTask(void)
// Is there still an image available?
status = GetNumberNewImages(&firstImage, &lastImage);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetNumberNewImages, status=%d, firstImage=%d, lastImage=%d\n",
functionName, status, firstImage, lastImage);
"%s:%s:, GetNumberNewImages, status=%d, firstImage=%d, lastImage=%d\n",
driverName, functionName, status, firstImage, lastImage);
if (dataType == NDUInt32) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetImages(%d, %d, %p, %d, %p, %p)\n",
functionName, i, i, pArray->pData, sizeX*sizeY, &validFirst, &validLast);
"%s:%s:, GetImages(%d, %d, %p, %d, %p, %p)\n",
driverName, functionName, i, i, pArray->pData, sizeX*sizeY, &validFirst, &validLast);
checkStatus(GetImages(i, i, (at_32*)pArray->pData,
sizeX*sizeY, &validFirst, &validLast));
setIntegerParam(NDArraySize, sizeX * sizeY * sizeof(epicsUInt32));
}
else if (dataType == NDUInt16) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, GetImages16(%d, %d, %p, %d, &p, &p)\n",
functionName, i, i, pArray->pData, sizeX*sizeY, &validFirst, &validLast);
"%s:%s:, GetImages16(%d, %d, %p, %d, &p, &p)\n",
driverName, functionName, i, i, pArray->pData, sizeX*sizeY, &validFirst, &validLast);
checkStatus(GetImages16(i, i, (epicsUInt16*)pArray->pData,
sizeX*sizeY, &validFirst, &validLast));
setIntegerParam(NDArraySize, sizeX * sizeY * sizeof(epicsUInt16));
@@ -1216,7 +1275,8 @@ void AndorCCD::dataTask(void)
* block on the plugin lock, and the plugin can be calling us */
this->unlock();
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:, calling array callbacks\n", functionName);
"%s:%s:, calling array callbacks\n",
driverName, functionName);
doCallbacksGenericPointer(pArray, NDArrayData, 0);
this->lock();
pArray->release();
@@ -1226,7 +1286,9 @@ void AndorCCD::dataTask(void)
callParamCallbacks();
}
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
errorString = const_cast<char *>(e.c_str());
setStringParam(AndorMessage, errorString);
}
@@ -1256,52 +1318,63 @@ void AndorCCD::saveDataFrame(int frameNumber)
int FITSType=0;
char fullFileName[MAX_FILENAME_LEN];
char palFilePath[MAX_FILENAME_LEN];
const char *functionName = "AndorCCD::saveDataFrame";
static const char *functionName = "saveDataFrame";
// Fetch the file format
getIntegerParam(NDFileFormat, &fileFormat);
this->createFileName(255, fullFileName);
setStringParam(NDFullFileName, fullFileName);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, "%s, file name is %s.\n", functionName, fullFileName);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, file name is %s.\n",
driverName, functionName, fullFileName);
getStringParam(AndorPalFileName, 255, palFilePath);
try {
if (fileFormat == AFFTIFF) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SaveAsTiffEx(%s, %s, %d, 1, 1)\n", functionName, fullFileName, palFilePath, frameNumber);
"%s:%s:, SaveAsTiffEx(%s, %s, %d, 1, 1)\n",
driverName, functionName, fullFileName, palFilePath, frameNumber);
checkStatus(SaveAsTiffEx(fullFileName, palFilePath, frameNumber, 1, 1));
} else if (fileFormat == AFFBMP) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SaveAsBmp(%s, %s, 0, 0)\n", functionName, fullFileName, palFilePath);
"%s:%s:, SaveAsBmp(%s, %s, 0, 0)\n",
driverName, functionName, fullFileName, palFilePath);
checkStatus(SaveAsBmp(fullFileName, palFilePath, 0, 0));
} else if (fileFormat == AFFSIF) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SaveAsSif(%s)\n", functionName, fullFileName);
"%s:%s:, SaveAsSif(%s)\n",
driverName, functionName, fullFileName);
checkStatus(SaveAsSif(fullFileName));
} else if (fileFormat == AFFEDF) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SaveAsEDF(%s, 0)\n", functionName, fullFileName);
"%s:%s:, SaveAsEDF(%s, 0)\n",
driverName, functionName, fullFileName);
checkStatus(SaveAsEDF(fullFileName, 0));
} else if (fileFormat == AFFRAW) {
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SaveAsRaw(%s, 1)\n", functionName, fullFileName);
"%s:%s:, SaveAsRaw(%s, 1)\n",
driverName, functionName, fullFileName);
checkStatus(SaveAsRaw(fullFileName, 1));
} else if (fileFormat == AFFFITS) {
getIntegerParam(NDDataType, &itemp); dataType = (NDDataType_t)itemp;
if (dataType == NDUInt16) FITSType=0;
else if (dataType== NDUInt32) FITSType=1;
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s, SaveAsFITS(%s, %d)\n", functionName, fullFileName, FITSType);
"%s:%s:, SaveAsFITS(%s, %d)\n",
driverName, functionName, fullFileName, FITSType);
checkStatus(SaveAsFITS(fullFileName, FITSType));
}
} catch (const std::string &e) {
cout << e << endl;
asynPrint(pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: %s\n",
driverName, functionName, e.c_str());
errorString = const_cast<char *>(e.c_str());
}
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW, "%s, Saving data.. Done!\n", functionName);
asynPrint(this->pasynUserSelf, ASYN_TRACE_FLOW,
"%s:%s:, Saving data.. Done!\n",
driverName, functionName);
if (errorString != NULL) {
setStringParam(AndorMessage, errorString);