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
361 epicsMutex _xcmclmMutex;
363 const size_t _sensorSizeX = 1600;
364 const size_t _sensorSizeY = 1600;
367 const double _acquireTimeoutSeconds = 0.2;
371#pragma warning (push)
372#pragma warning (disable: 4251)
374 bool _newImageRequired;
376 static const char* _driverName;
379 std::vector<int> _serialNumbers;
380 vector<NDArray*> _ccdImages;
383 const static int _ccdCountMax = 3;
418 Parameter<epicsInt32> _paramTEMP_ACCUMULATED_ERROR_LIMIT{
"TEMP_ACCUMULATED_ERROR_LIMIT", 16, 0, 16777215, 0};
428 const static int _parameterContainerCount = 43;
429 const static int _parameterCount = 67;
431 std::vector<ParameterBase*> _allParams;
434 bool _CCDPowerChanged;
435 bool _sequencerFilenameChanged;
437 bool _TriggerModeChanged;
439 const short _voltageIndexStep = 16;
440 std::vector<MultiParameter<_ccdCountMax, epicsFloat64>*> _voltageParams;
441 bool _voltageParamsChanged;
443 std::vector<Parameter<epicsInt32>*> _tempControllerParams;
444 bool _tempControllerParamsChanged;
446 std::vector<Parameter<epicsInt32>*> _sequencerParams;
447 bool _SequencerParametersChanged;
449 bool _acquireTimeChanged;
450 bool _adcGainOffsetChanged;
451 bool _shutterModeChanged;
452 bool _shutterDelayChanged;
454 double _grabWaitValue;
460 bool _roiParametersChanged;
462 bool _switchModeCheck;
464 std::set<int> _roiParameterIndices;
468 size_t CCDCount()
const {
return _serialNumbers.size(); };
471 bool xcamCamera::LoadSequencer();
475 bool SetCCDPower(
bool on,
bool force =
false);
477 bool SetCCDVoltages();
478 bool ApplyVoltageConstraints();
480 void SetExposureTime();
482 void SetTemperatureController();
484 void ConfigureROIBinning();
486 void ConfigureROIBinningAxis(
const int binID,
const int minID,
const int sizeID,
const int maxID,
487 int& bin,
int& origin,
int& count);
488 void ConstrainToSensorAxis(
const int globalOrigin,
const int globalSize,
const int globalBin,
489 const int localOrigin,
const int localSize,
490 int& originOut,
int& countOut);
492 int computeRIXSArray(
int sizeX,
int sizeY);
495 enum temperatureControllerCommands
497 CMD_TEMP_GET_RAW_PLANT_VALUE = 0,
498 CMD_TEMP_GET_SETPOINT = 1,
499 CMD_TEMP_SET_SETPOINT = 2,
500 CMD_TEMP_GET_PROPORTIONAL_GAIN = 3,
501 CMD_TEMP_SET_PROPORTIONAL_GAIN = 4,
502 CMD_TEMP_GET_INTEGRAL_GAIN = 5,
503 CMD_TEMP_SET_INTEGRAL_GAIN = 6,
504 CMD_TEMP_GET_DERIVATIVE_GAIN = 7,
505 CMD_TEMP_SET_DERIVATIVE_GAIN = 8,
506 CMD_TEMP_GET_PROPORTIONAL_TIME = 9,
507 CMD_TEMP_SET_PROPORTIONAL_TIME = 10,
508 CMD_TEMP_GET_INTEGRAL_RATE = 11,
509 CMD_TEMP_SET_INTEGRAL_RATE = 12,
510 CMD_TEMP_GET_DERIVATIVE_RATE = 13,
511 CMD_TEMP_SET_DERIVATIVE_RATE = 14,
512 CMD_TEMP_GET_ACCUMULATED_ERROR_LIMIT = 15,
513 CMD_TEMP_SET_ACCUMULATED_ERROR_LIMIT = 16,
514 CMD_TEMP_GET_OUTPUT_BIAS_VALUE = 17,
515 CMD_TEMP_SET_OUTPUT_BIAS_VALUE = 18,
516 CMD_TEMP_SET_MANUAL_MODE = 19,
517 CMD_TEMP_SET_ENABLE_CONTROL = 20
520 int EncodeTemperatureCelsius(
double tempDegreesC) {
return (
int)(0.5 + (tempDegreesC + 260.0) / 0.0000277); };
521 double DecodeTemperatureCelsius(
int encoded) {
return ((
double)encoded * 0.0000277) - 260.0; }
523 void ReportWriteStatus(asynUser *pasynUser,
const asynStatus status,
const char * methodName);
526 epicsEventId startEventId;
527 epicsEventId stopEventId;