From c8829d6ee646ce01f3874b9e9d0dfe37d5e64874 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Fri, 13 Dec 2024 19:17:21 +0300 Subject: [PATCH] ... --- raptor_eagle_ccd.cpp | 65 ++++++++++++++++++++++++++++++-------------- raptor_eagle_ccd.h | 6 ++-- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/raptor_eagle_ccd.cpp b/raptor_eagle_ccd.cpp index fde6d6f..d7209eb 100644 --- a/raptor_eagle_ccd.cpp +++ b/raptor_eagle_ccd.cpp @@ -112,13 +112,15 @@ std::string formatByteArr(const std::ranges::range auto& bytes, std::string_view { std::string res; + using el_t = std::make_unsigned_t>; + auto sz = std::ranges::size(bytes); if (!sz) { return res; } - for (auto const& el : bytes | std::views::take(sz - 1)) { + for (el_t el : bytes | std::views::take(sz - 1)) { res += std::format("0x{:02X}{}", el, delim); } res += std::format("0x{:02X}", *(bytes.end() - 1)); @@ -351,11 +353,11 @@ bool RaptorEagleCCD::initCamera(int unitmap) return ok; } - ok = resetMicro(); - if (!ok) { - logError("Cannot reset microcontroller!"); - return ok; - } + // ok = resetMicro(); + // if (!ok) { + // logError("Cannot reset microcontroller!"); + // return ok; + // } getSystemState(); @@ -411,7 +413,7 @@ size_t RaptorEagleCCD::clRead(byte_seq_t& bytes) std::format("pxd_serialRead({}, 0, NULL, 0)", _cameraUnitmap)); if (!nbytes) { - logWarn("There are no bytes in Rx-buffer! Waiting for {} as timeout ...", CL_DEFAULT_TIMEOUT); + logWarn("There are no bytes in Rx-buffer! Polling buffer during {} ...", CL_DEFAULT_TIMEOUT); while ((std::chrono::steady_clock::now() - start_tp) <= CL_DEFAULT_TIMEOUT) { std::this_thread::sleep_for(std::chrono::milliseconds(5)); nbytes = pxd_serialRead(_cameraUnitmap, 0, nullptr, 0); @@ -424,9 +426,14 @@ size_t RaptorEagleCCD::clRead(byte_seq_t& bytes) logWarn("Cameralink reading operation timeout!"); return 0; } + + // here the call is only for logging purpose + xclibApiCall(nbytes = pxd_serialRead(_cameraUnitmap, 0, nullptr, 0), + std::format("pxd_serialRead({}, 0, NULL, 0)", _cameraUnitmap)); } - nbytes += _clCommandAckBit + _clChecksumBit; + + // nbytes += _clCommandAckBit + _clChecksumBit; if (bytes.size() < nbytes) { bytes.resize(nbytes); @@ -434,7 +441,7 @@ size_t RaptorEagleCCD::clRead(byte_seq_t& bytes) xclibApiCall(pxd_serialRead(_cameraUnitmap, 0, (char*)bytes.data(), nbytes), std::format("pxd_serialRead({}, 0, {}, {}) -> [{}]", _cameraUnitmap, (void*)bytes.data(), nbytes, - details::formatByteArr(bytes))); + details::formatByteArr(bytes | std::views::take(nbytes)))); // if (_loggerSPtr->level() == spdlog::level::trace) { @@ -454,7 +461,8 @@ size_t RaptorEagleCCD::clReadAndCheckAck(byte_seq_t& bytes) auto nbytes = clRead(bytes); if (_clCommandAckBit && nbytes) { - auto ack = *(bytes.end() - 1 - _clChecksumBit); + // auto ack = *(bytes.end() - 1 - _clChecksumBit); + auto ack = *(bytes.begin() + nbytes - 1 - _clChecksumBit); if (ack != CL_ETX) { // throw std::system_error(std::error_code(ack, RaptorEagleControllerErrorCategory::get())); throw std::system_error(ack, RaptorEagleControllerErrorCategory::get()); @@ -509,9 +517,12 @@ size_t RaptorEagleCCD::clWrite(const byte_seq_t& bytes) etx_checksum_bytes[1] = details::computeChecksum(bytes); } - xclibApiCall( - nbytes = pxd_serialWrite(_cameraUnitmap, 0, (char*)bytes.data(), bytes.size()), - std::format("pxd_serialWrite({}, 0, {}, {})", _cameraUnitmap, (void*)bytes.data(), bytes.size())); + xclibApiCall(nbytes = pxd_serialWrite(_cameraUnitmap, 0, (char*)bytes.data(), bytes.size()), + std::format("pxd_serialWrite({}, 0, [{}], {})", _cameraUnitmap, details::formatByteArr(bytes), + bytes.size())); + // xclibApiCall( + // nbytes = pxd_serialWrite(_cameraUnitmap, 0, (char*)bytes.data(), bytes.size()), + // std::format("pxd_serialWrite({}, 0, {}, {})", _cameraUnitmap, (void*)bytes.data(), bytes.size())); // send trailing ETX and possible checksum bytes @@ -522,7 +533,7 @@ size_t RaptorEagleCCD::clWrite(const byte_seq_t& bytes) } xclibApiCall(pxd_serialWrite(_cameraUnitmap, 0, (char*)etx_checksum_bytes, tr_nbytes), - std::format("pxd_serialWrite({}, 0, {}, {})", _cameraUnitmap, + std::format("pxd_serialWrite({}, 0, [{}], {})", _cameraUnitmap, details::formatByteArr(std::string_view((const char*)etx_checksum_bytes, 2) | std::views::take(tr_nbytes)), tr_nbytes)); @@ -668,22 +679,30 @@ bool RaptorEagleCCD::resetFPGA(const std::chrono::milliseconds& timeout) cnt > 10 ? std::chrono::milliseconds(cnt / 10) : std::chrono::milliseconds(10); // clearSystemStateBit(CL_SYSTEM_STATUS_FPGA_RST_HOLD_BIT); // set bit to 0 to hold FPGA in reset state - setSystemState(0x52); + clWrite({0x4F, 0x52}); + clRead(ack); // ignore answer std::this_thread::sleep_for(std::chrono::milliseconds(200)); - setSystemState(0x50); + clWrite({0x4F, 0x50}); + clRead(ack); // ignore answer // setSystemStateBit(CL_SYSTEM_STATUS_FPGA_RST_HOLD_BIT); // set bit to 1 to boot FPGA + clWrite({0x4F, 0x52}); + clRead(ack); // ignore answer + // according to instruction manual rev 1.1 FPGA will take approximately 500msecs to reset std::this_thread::sleep_for(std::chrono::milliseconds(500)); // poll controller auto start = std::chrono::steady_clock::now(); do { - clWrite({0x4F, 0x52}); + clWrite({0x49}); std::this_thread::sleep_for(sleep_dur); clRead(ack); - if (ack[0] == CL_ETX) { + auto bits = std::bitset<8>(ack[0]); + + if (bits.test(CL_SYSTEM_STATUS_FPGA_BOOT_OK_BIT)) { + // logInfo("bits = {}", bits.to_string()); logInfo("Camera FPGA is reset successfully!"); return true; } @@ -708,6 +727,7 @@ void RaptorEagleCCD::getHardwareInfo() // get manufacturer data clWrite({0x53, 0xAE, 0x05, 0x01, 0x00, 0x00, 0x02, 0x00}); + clReadAndCheckAck(); clWrite({0x53, 0xAF, 0x12}); clReadAndCheckAck(_manufacturerData); @@ -731,7 +751,8 @@ void RaptorEagleCCD::getHardwareInfo() // compute linear relation: Temp = k*ADC + b _adcCCDTempCalibCoeffs[0] = (cnt2 - cnt1) / (ADC_CALIBRATION_POINT_2 - ADC_CALIBRATION_POINT_1); // k _adcCCDTempCalibCoeffs[1] = ADC_CALIBRATION_POINT_2 - _adcCCDTempCalibCoeffs[0] * cnt2; - logDebug("Computed ADC-to-Temp linear relation: Temp(C) = {:7.4}*ADC(counts)+{:6.2}"); + logDebug("Computed ADC-to-Temp linear relation: Temp(C) = {:7.4f}*ADC(counts)+{:6.2f}", _adcCCDTempCalibCoeffs[0], + _adcCCDTempCalibCoeffs[1]); logDebug(""); logDebug("DAC calib data [{}, {}] counts at [{}C, {}C]", _dacTECSetPointCalibData[0], _dacTECSetPointCalibData[1], @@ -742,11 +763,13 @@ void RaptorEagleCCD::getHardwareInfo() _dacTECSetPointCalibCoeffs[0] = (cnt2 - cnt1) / (DAC_CALIBRATION_POINT_2 - DAC_CALIBRATION_POINT_1); _dacTECSetPointCalibCoeffs[1] = DAC_CALIBRATION_POINT_2 - _dacTECSetPointCalibCoeffs[0] * cnt2; - logDebug("Computed DAC-to-Temp linear relation: Temp(C) = {:7.4}*DAC(counts)+{:6.2}"); + logDebug("Computed DAC-to-Temp linear relation: Temp(C) = {:7.4f}*DAC(counts)+{:6.2f}", + _dacTECSetPointCalibCoeffs[0], _dacTECSetPointCalibCoeffs[1]); _dacTECSetPointCalibCoeffs[2] = (DAC_CALIBRATION_POINT_2 - DAC_CALIBRATION_POINT_1) / (cnt2 - cnt1); _dacTECSetPointCalibCoeffs[3] = cnt2 - _dacTECSetPointCalibCoeffs[0] * DAC_CALIBRATION_POINT_2; - logDebug("Computed DAC-to-Temp linear relation: DAC(counts) = {}*Temp(C)+{}"); + logDebug("Computed DAC-to-Temp linear relation: DAC(counts) = {}*Temp(C)+{}", _dacTECSetPointCalibCoeffs[2], + _dacTECSetPointCalibCoeffs[3]); logDebug("---------------------------------"); diff --git a/raptor_eagle_ccd.h b/raptor_eagle_ccd.h index 4c250d8..f88215b 100644 --- a/raptor_eagle_ccd.h +++ b/raptor_eagle_ccd.h @@ -30,7 +30,7 @@ public: /* class constants */ // separator char sequence of serialized representation of user FITS keywords array - static constexpr std::string_view USER_FITS_KEY_SEP_SEQ{"\n"}; + static constexpr std::string_view USER_FITS_KEY_SEP_SEQ{"\v"}; static constexpr size_t DEFAULT_ACQ_RING_BUFFER_SIZE = 3; @@ -339,7 +339,9 @@ private: } } else { if (std::ranges::size(func_name)) { - logDebug("XCLIB API call ('{}') finished successfully", func_name); + logDebug("XCLIB API call ('{}') finished successfully (exitcode = {})", func_name, err); + } else { + logDebug("XCLIB API call finished successfully (exitcode = {})", err); } } }