This commit is contained in:
Timur A. Fatkhullin 2024-12-06 22:31:23 +03:00
parent fd8c2c7996
commit 4dd6893674
2 changed files with 87 additions and 0 deletions

View File

@ -111,6 +111,11 @@ R convertUIntTo12Bit(uint16_t counts)
} // namespace details
/***********************************************************/
/* ======= RaptorEagleCCD CLASS IMPLEMENTATION ======= */
/***********************************************************/
#define DEFAULT_EPIX_VIDEO_FMT_FILE "raptor_eagle-v.fmt"
/* CONSTRUCTORS AND DESTRUCTOR */
@ -744,6 +749,51 @@ void RaptorEagleCCD::getFPGAVersion()
}
/* ACQUISITION PROCESS */
void RaptorEagleCCD::startAquisition(acq_params_t acq_pars)
{
acq_pars.startTime = std::chrono::utc_clock::now();
std::chrono::milliseconds snap_tm =
CAMERA_CAPTURE_TIMEOUT_ADD_CONSTANT +
std::chrono::milliseconds(static_cast<std::chrono::milliseconds::rep>(acq_pars.expTime * 1000));
_doSnapAndCopyFuture = std::async(
std::launch::async,
[acq_pars = std::move(acq_pars), this](std::chrono::milliseconds timeout) mutable {
static char color_space[] = "Grey";
std::stringstream st;
st << std::this_thread::get_id();
logDebug("Arm grabber and wait for acquisition start trigger (thread id: {}) ...", st.str());
xclibApiCall(pxd_doSnap(_cameraUnitmap, 1, timeout.count()),
std::format("pxd_doSnap({},1,{})", _cameraUnitmap, timeout.count()));
logDebug("Capture is finished (thread id: {})!", st.str());
logDebug("Copy image from grabber to buffer (thread id: {}) ...", st.str());
size_t npix = acq_pars.roiWidth * acq_pars.roiHeight;
acq_pars.imageBufferRows = static_cast<size_t>(std::ceil(npix / _dimCCD[0]));
size_t sz = acq_pars.imageBufferRows * npix;
if (acq_pars.imageBufferSize < sz) {
acq_pars.imageBufferSize = sz;
acq_pars.imageBuffer.reset(new ushort[sz]); // may thow std::bad_alloc here!
}
auto log_str =
std::format("pxd_readushort({}, 1, 0, 0, -1, {}, {}, {}, {})", _cameraUnitmap, acq_pars.imageBufferRows,
(void*)acq_pars.imageBuffer.get(), acq_pars.imageBufferSize, (void*)color_space);
xclibApiCall(pxd_readushort(_cameraUnitmap, 1, 0, 0, -1, acq_pars.imageBufferRows,
acq_pars.imageBuffer.get(), acq_pars.imageBufferSize, (char*)color_space),
log_str);
},
std::move(snap_tm));
}
/* CREATE COMMANDS AND ATTRIBUTES */

View File

@ -8,6 +8,7 @@
#include <device/adc_device_command.h>
#include <xcliball.h>
#include <future>
#include "raptor_eagle_exception.h"
@ -62,6 +63,10 @@ public:
std::chrono::milliseconds(1000)};
// additive constant to timeout for capture process (see pxd_doSnap XCLIB function)
// this constant will be added to exposure to compute actual timeout
static constexpr std::chrono::milliseconds CAMERA_CAPTURE_TIMEOUT_ADD_CONSTANT{240000}; // 4 mins
static constexpr std::string_view CAMERA_ATTR_XBIN{"XBIN"};
static constexpr std::string_view CAMERA_ATTR_YBIN{"YBIN"};
static constexpr std::string_view CAMERA_ATTR_ROI_STARTX{"ROI_STARTX"};
@ -138,6 +143,28 @@ public:
private:
typedef std::vector<unsigned char> byte_seq_t;
struct acq_params_t {
uint16_t ccdDim[2];
std::chrono::utc_clock::time_point startTime;
double expTime; // in seconds
uint16_t roiStartX;
uint16_t roiStartY;
uint16_t roiWidth;
uint16_t roiHeight;
uint8_t binX;
uint8_t binY;
std::string_view readRate;
std::string_view readMode;
std::string filename;
std::string templateFilename;
std::vector<std::string> permanentKeywords;
std::vector<std::string> currentKeywords;
std::unique_ptr<ushort> imageBuffer;
size_t imageBufferSize;
size_t imageBufferRows;
};
std::string _epixFmtVideoFilename;
int _cameraUnitmap;
@ -181,6 +208,12 @@ private:
// must be interpretated as 2-element array of calibration points [at 0C, at +40C] (4 bytes)
const uint16_t* _dacTECSetPointCalibData{reinterpret_cast<const uint16_t*>(_manufacturerData.data() + 14)};
// acquisition process members
std::future<void> _doSnapAndCopyFuture;
std::future<void> _saveFitsFile;
std::atomic_bool _isAcqInProgress;
void initAttrComm();
bool initCamera(int unitmap = 1);
@ -236,6 +269,10 @@ private:
void getMicroVersion();
void getFPGAVersion();
// acquisition process methods
void startAquisition(acq_params_t);
void stopAcquisition();
// logging helper methods
template <bool NOEXCEPT = false>