334 xcamCamera(
const char *portName,
int maxSizeX,
int maxSizeY,
335 int maxBuffers,
size_t maxMemory,
336 int priority,
int stackSize);
339 virtual asynStatus
writeInt32(asynUser *pasynUser, epicsInt32 value);
340 virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
341 virtual asynStatus
writeOctet(asynUser *pasynUser,
const char *value,
size_t maxChars,
size_t *nActual);
343 virtual void report(FILE *fp,
int details);
347 void temperatureTask(
void);
352#define FIRST_XCAM_CAMERA_PARAM SoftVersion
357#define LAST_XCAM_CAMERA_PARAM SeqFilename
364 epicsMutex _xcmclmMutex;
366 const size_t _sensorSizeX = 1600;
367 const size_t _sensorSizeY = 1600;
370 const double _acquireTimeoutSeconds = 0.2;
374#pragma warning (push)
375#pragma warning (disable: 4251)
377 bool _newImageRequired;
379 static const char* _driverName;
382 std::vector<int> _serialNumbers;
383 vector<NDArray*> _ccdImages;
386 const static int _ccdCountMax = 3;
421 Parameter<epicsInt32> _paramTEMP_ACCUMULATED_ERROR_LIMIT{
"TEMP_ACCUMULATED_ERROR_LIMIT", 16, 0, 16777215, 0};
431 const static int _parameterContainerCount = 43;
432 const static int _parameterCount = 67;
434 std::vector<ParameterBase*> _allParams;
437 bool _CCDPowerChanged;
438 bool _sequencerFilenameChanged;
440 bool _TriggerModeChanged;
442 const short _voltageIndexStep = 16;
443 std::vector<MultiParameter<_ccdCountMax, epicsFloat64>*> _voltageParams;
444 bool _voltageParamsChanged;
446 std::vector<Parameter<epicsInt32>*> _tempControllerParams;
447 bool _tempControllerParamsChanged;
449 std::vector<Parameter<epicsInt32>*> _sequencerParams;
450 bool _SequencerParametersChanged;
452 bool _acquireTimeChanged;
453 bool _adcGainOffsetChanged;
454 bool _shutterModeChanged;
455 bool _shutterDelayChanged;
457 double _grabWaitValue;
463 bool _roiParametersChanged;
465 bool _switchModeCheck;
467 std::set<int> _roiParameterIndices;
471 size_t CCDCount()
const {
return _serialNumbers.size(); };
474 bool xcamCamera::LoadSequencer();
478 bool SetCCDPower(
bool on,
bool force =
false);
480 bool SetCCDVoltages();
481 bool ApplyVoltageConstraints();
483 void SetExposureTime();
485 void SetTemperatureController();
487 void ConfigureROIBinning();
489 void ConfigureROIBinningAxis(
const int binID,
const int minID,
const int sizeID,
const int maxID,
490 int& bin,
int& origin,
int& count);
491 void ConstrainToSensorAxis(
const int globalOrigin,
const int globalSize,
const int globalBin,
492 const int localOrigin,
const int localSize,
493 int& originOut,
int& countOut);
495 int computeRIXSArray(
int sizeX,
int sizeY);
497 int configureCaptureParams();
498 void doAcquisition(
bool &acquisition_done);
499 epicsEventStatus preAcquisition();
501 enum temperatureControllerCommands
503 CMD_TEMP_GET_RAW_PLANT_VALUE = 0,
504 CMD_TEMP_GET_SETPOINT = 1,
505 CMD_TEMP_SET_SETPOINT = 2,
506 CMD_TEMP_GET_PROPORTIONAL_GAIN = 3,
507 CMD_TEMP_SET_PROPORTIONAL_GAIN = 4,
508 CMD_TEMP_GET_INTEGRAL_GAIN = 5,
509 CMD_TEMP_SET_INTEGRAL_GAIN = 6,
510 CMD_TEMP_GET_DERIVATIVE_GAIN = 7,
511 CMD_TEMP_SET_DERIVATIVE_GAIN = 8,
512 CMD_TEMP_GET_PROPORTIONAL_TIME = 9,
513 CMD_TEMP_SET_PROPORTIONAL_TIME = 10,
514 CMD_TEMP_GET_INTEGRAL_RATE = 11,
515 CMD_TEMP_SET_INTEGRAL_RATE = 12,
516 CMD_TEMP_GET_DERIVATIVE_RATE = 13,
517 CMD_TEMP_SET_DERIVATIVE_RATE = 14,
518 CMD_TEMP_GET_ACCUMULATED_ERROR_LIMIT = 15,
519 CMD_TEMP_SET_ACCUMULATED_ERROR_LIMIT = 16,
520 CMD_TEMP_GET_OUTPUT_BIAS_VALUE = 17,
521 CMD_TEMP_SET_OUTPUT_BIAS_VALUE = 18,
522 CMD_TEMP_SET_MANUAL_MODE = 19,
523 CMD_TEMP_SET_ENABLE_CONTROL = 20
526 int EncodeTemperatureCelsius(
double tempDegreesC) {
return (
int)(0.5 + (tempDegreesC + 260.0) / 0.0000277); };
527 double DecodeTemperatureCelsius(
int encoded) {
return ((
double)encoded * 0.0000277) - 260.0; }
529 void ReportWriteStatus(asynUser *pasynUser,
const asynStatus status,
const char * methodName);
532 epicsEventId startEventId;
533 epicsEventId stopEventId;