From c9757a09d73e60e167f97b575438d8037b4e9bd4 Mon Sep 17 00:00:00 2001 From: Alejandro Homs Puron Date: Thu, 1 Oct 2020 18:15:02 +0200 Subject: [PATCH 1/4] Fix GENERATOR_PREFETCH with HW bin and/or roi: * Add getEffectiveFrameDim, the FrameBuilder implementation takes into account bin/roi settings --- include/simulator/SimulatorFrameBuilder.h | 2 ++ include/simulator/SimulatorFrameGetter.h | 2 ++ include/simulator/SimulatorFrameLoader.h | 2 ++ include/simulator/SimulatorFramePrefetcher.h | 2 +- sip/SimulatorFrameBuilder.sip | 2 ++ sip/SimulatorFrameLoader.sip | 2 ++ src/SimulatorFrameBuilder.cpp | 14 +++++++++++++- 7 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/simulator/SimulatorFrameBuilder.h b/include/simulator/SimulatorFrameBuilder.h index 7b2d2c7..ca03432 100644 --- a/include/simulator/SimulatorFrameBuilder.h +++ b/include/simulator/SimulatorFrameBuilder.h @@ -79,6 +79,8 @@ public: void getFrameDim(FrameDim &dim) const; void setFrameDim(const FrameDim &dim); + void getEffectiveFrameDim(FrameDim &dim) const; + void getBin(Bin &bin) const; void setBin(const Bin &bin); void checkBin(Bin &bin) const; diff --git a/include/simulator/SimulatorFrameGetter.h b/include/simulator/SimulatorFrameGetter.h index a3615bc..fcf3f5f 100644 --- a/include/simulator/SimulatorFrameGetter.h +++ b/include/simulator/SimulatorFrameGetter.h @@ -53,6 +53,8 @@ struct SIMULATOR_EXPORT FrameGetter { virtual void setFrameDim(const FrameDim &frame_dim) = 0; virtual void getFrameDim(FrameDim &frame_dim) const = 0; + virtual void getEffectiveFrameDim(FrameDim &frame_dim) const = 0; + virtual void getMaxImageSize(Size &max_image_size) const = 0; virtual void setHwMaxImageSizeCallback(HwMaxImageSizeCallback &cbk) { m_cbk = &cbk; } diff --git a/include/simulator/SimulatorFrameLoader.h b/include/simulator/SimulatorFrameLoader.h index 5cdc0ae..fc77f90 100644 --- a/include/simulator/SimulatorFrameLoader.h +++ b/include/simulator/SimulatorFrameLoader.h @@ -71,6 +71,8 @@ public: } void getFrameDim(FrameDim &frame_dim) const { frame_dim = m_frame_dim; } + void getEffectiveFrameDim(FrameDim &frame_dim) const { frame_dim = m_frame_dim; } + void getMaxImageSize(Size &max_image_size) const { max_image_size = m_frame_dim.getSize(); } protected: diff --git a/include/simulator/SimulatorFramePrefetcher.h b/include/simulator/SimulatorFramePrefetcher.h index 8d0c024..41d0e23 100644 --- a/include/simulator/SimulatorFramePrefetcher.h +++ b/include/simulator/SimulatorFramePrefetcher.h @@ -81,7 +81,7 @@ public: FrameDim frame_dim; // Get the frame dimension - FrameGetterImpl::getFrameDim(frame_dim); + FrameGetterImpl::getEffectiveFrameDim(frame_dim); // Allocate the buffers for the prebuilt frames m_mem_size = frame_dim.getMemSize(); diff --git a/sip/SimulatorFrameBuilder.sip b/sip/SimulatorFrameBuilder.sip index 2e127be..e19f34e 100644 --- a/sip/SimulatorFrameBuilder.sip +++ b/sip/SimulatorFrameBuilder.sip @@ -139,6 +139,8 @@ public: void getFrameDim( FrameDim &dim /Out/ ) const; void setFrameDim( const FrameDim &dim ); + void getEffectiveFrameDim(FrameDim &dim /Out/ ) const; + unsigned long getFrameNr(); void resetFrameNr( int frame_nr=0 ); diff --git a/sip/SimulatorFrameLoader.sip b/sip/SimulatorFrameLoader.sip index d53a4d9..32a39d8 100644 --- a/sip/SimulatorFrameLoader.sip +++ b/sip/SimulatorFrameLoader.sip @@ -36,6 +36,8 @@ public: void setFrameDim(const FrameDim& frame_dim); void getFrameDim(FrameDim& frame_dim /Out/) const; + void getEffectiveFrameDim(FrameDim &frame_dim /Out/) const; + void getMaxImageSize(Size& max_image_size /Out/) const; void setFilePattern(const std::string& file_pattern); diff --git a/src/SimulatorFrameBuilder.cpp b/src/SimulatorFrameBuilder.cpp index b47a8a3..84c554e 100644 --- a/src/SimulatorFrameBuilder.cpp +++ b/src/SimulatorFrameBuilder.cpp @@ -171,6 +171,18 @@ void FrameBuilder::getFrameDim(FrameDim &dim) const dim = m_frame_dim; } +/** + * @brief Gets the effective (real) frame dimention + * + * @param[out] dim FrameDim object reference + *******************************************************************/ +void FrameBuilder::getEffectiveFrameDim(FrameDim &dim) const +{ + dim = m_frame_dim / m_bin; + if (!m_roi.isEmpty()) + dim.setSize(m_roi.getSize()); +} + /** * @brief Sets frame dimention * @@ -564,7 +576,7 @@ void FrameBuilder::fillData(unsigned char *ptr) depth *p = (depth *)ptr; double data, max; - if (!m_roi.getSize().isEmpty()) { + if (!m_roi.isEmpty()) { bx0 = m_roi.getTopLeft().x; bxM = m_roi.getBottomRight().x + 1; by0 = m_roi.getTopLeft().y; -- GitLab From c550bc648079ff6cb94bd30b52d28cc968fdba10 Mon Sep 17 00:00:00 2001 From: Alejandro Homs Puron Date: Fri, 2 Oct 2020 12:26:44 +0200 Subject: [PATCH 2/4] Improve HW binning check and allow independent Horz/Vert binning --- src/SimulatorFrameBuilder.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/SimulatorFrameBuilder.cpp b/src/SimulatorFrameBuilder.cpp index 84c554e..b61f469 100644 --- a/src/SimulatorFrameBuilder.cpp +++ b/src/SimulatorFrameBuilder.cpp @@ -227,10 +227,9 @@ void FrameBuilder::setBin(const Bin &bin) *******************************************************************/ void FrameBuilder::checkBin(Bin &bin) const { - if ((bin == Bin(1, 1)) || (bin == Bin(1, 2)) || (bin == Bin(2, 1))) - bin = Bin(1, 1); - else - bin = Bin(2, 2); + int binX = ((bin.getX() % 2) == 0) ? 2 : 1; + int binY = ((bin.getY() % 2) == 0) ? 2 : 1; + bin = Bin(binX, binY); } /** -- GitLab From db35eacf67aad94106efdb35a61394afe9aa6143 Mon Sep 17 00:00:00 2001 From: Alejandro Homs Puron Date: Fri, 2 Oct 2020 12:24:42 +0200 Subject: [PATCH 3/4] Add HW Roi to Simulator::Interface --- CMakeLists.txt | 1 + include/simulator/SimulatorInterface.h | 2 + include/simulator/SimulatorRoiCtrlObj.h | 58 +++++++++++++++++++++++++ src/SimulatorInterface.cpp | 5 ++- src/SimulatorRoiCtrlObj.cpp | 51 ++++++++++++++++++++++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 include/simulator/SimulatorRoiCtrlObj.h create mode 100644 src/SimulatorRoiCtrlObj.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 35110bf..6a4647c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,7 @@ add_library(simulator SHARED src/SimulatorDetInfoCtrlObj.cpp src/SimulatorShutterCtrlObj.cpp src/SimulatorBinCtrlObj.cpp + src/SimulatorRoiCtrlObj.cpp ${SIMU_INCS} ) diff --git a/include/simulator/SimulatorInterface.h b/include/simulator/SimulatorInterface.h index 87649be..5ffe762 100644 --- a/include/simulator/SimulatorInterface.h +++ b/include/simulator/SimulatorInterface.h @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -61,6 +62,7 @@ private: DetInfoCtrlObj m_det_info; SyncCtrlObj m_sync; BinCtrlObj m_bin; + RoiCtrlObj m_roi; ShutterCtrlObj m_shutter; }; diff --git a/include/simulator/SimulatorRoiCtrlObj.h b/include/simulator/SimulatorRoiCtrlObj.h new file mode 100644 index 0000000..a69f2b3 --- /dev/null +++ b/include/simulator/SimulatorRoiCtrlObj.h @@ -0,0 +1,58 @@ +//########################################################################### +// This file is part of LImA, a Library for Image Acquisition +// +// Copyright (C) : 2009-2011 +// European Synchrotron Radiation Facility +// BP 220, Grenoble 38043 +// FRANCE +// +// This is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see . +//########################################################################### + +#pragma once + +#if !defined(SIMULATOR_ROICTRLOBJ_H) +#define SIMULATOR_ROICTRLOBJ_H + +#include + +#include + +namespace lima { + +// Forward definitions +class HwInterface; + +namespace Simulator { + +class Camera; + +/// Control object providing simulator roi interface +class SIMULATOR_EXPORT RoiCtrlObj : public HwRoiCtrlObj { +public: + RoiCtrlObj(Camera &simu) : m_simu(simu) {} + + virtual void setRoi(const Roi &roi); + virtual void getRoi(Roi &roi); + virtual void checkRoi(const Roi &set_roi, Roi &hw_roi); + +private: + Camera &m_simu; +}; + +} // namespace Simulator + +} // namespace lima + +#endif // !defined(SIMULATOR_ROICTRLOBJ_H) diff --git a/src/SimulatorInterface.cpp b/src/SimulatorInterface.cpp index 523ef4d..0989321 100644 --- a/src/SimulatorInterface.cpp +++ b/src/SimulatorInterface.cpp @@ -30,7 +30,7 @@ using namespace std; * \brief Interface constructor *******************************************************************/ -Interface::Interface(Camera &simu) : m_simu(simu), m_det_info(simu), m_sync(simu), m_bin(simu), m_shutter(simu) +Interface::Interface(Camera &simu) : m_simu(simu), m_det_info(simu), m_sync(simu), m_bin(simu), m_roi(simu), m_shutter(simu) { HwDetInfoCtrlObj *det_info = &m_det_info; m_cap_list.push_back(HwCap(det_info)); @@ -44,6 +44,9 @@ Interface::Interface(Camera &simu) : m_simu(simu), m_det_info(simu), m_sync(simu HwBinCtrlObj *bin = &m_bin; m_cap_list.push_back(HwCap(bin)); + HwRoiCtrlObj *roi = &m_roi; + m_cap_list.push_back(HwCap(roi)); + HwShutterCtrlObj *shutter = &m_shutter; m_cap_list.push_back(HwCap(shutter)); } diff --git a/src/SimulatorRoiCtrlObj.cpp b/src/SimulatorRoiCtrlObj.cpp new file mode 100644 index 0000000..a4d14ae --- /dev/null +++ b/src/SimulatorRoiCtrlObj.cpp @@ -0,0 +1,51 @@ +//########################################################################### +// This file is part of LImA, a Library for Image Acquisition +// +// Copyright (C) : 2009-2011 +// European Synchrotron Radiation Facility +// BP 220, Grenoble 38043 +// FRANCE +// +// This is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This software is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see . +//########################################################################### + +#include "simulator/SimulatorRoiCtrlObj.h" +#include "simulator/SimulatorCamera.h" +#include "simulator/SimulatorFrameBuilder.h" + +using namespace lima; +using namespace lima::Simulator; +using namespace std; + +void RoiCtrlObj::setRoi(const Roi &roi) +{ + FrameBuilder *builder = m_simu.getFrameBuilder(); + if (builder) builder->setRoi(roi); +} + +void RoiCtrlObj::getRoi(Roi &roi) +{ + FrameBuilder *builder = m_simu.getFrameBuilder(); + if (builder) builder->getRoi(roi); +} + +void RoiCtrlObj::checkRoi(const Roi &set_roi, Roi &hw_roi) +{ + FrameBuilder *builder = m_simu.getFrameBuilder(); + hw_roi = set_roi; + if (builder) + builder->checkRoi(hw_roi); + else + hw_roi = Roi(); +} -- GitLab From 41074f6e4bb0d14bc95f58208cf86fe5370ceeb9 Mon Sep 17 00:00:00 2001 From: Alejandro Homs Puron Date: Mon, 5 Oct 2020 16:40:09 +0200 Subject: [PATCH 4/4] Tango: add frame_dim device property and R/Wattribute * Move MaxImageSizeCallback management to FrameGetter --- include/simulator/SimulatorCamera.h | 2 +- include/simulator/SimulatorFrameGetter.h | 7 ++-- include/simulator/SimulatorFrameLoader.h | 19 ++-------- src/SimulatorCamera.cpp | 11 +++--- src/SimulatorDetInfoCtrlObj.cpp | 9 +++-- src/SimulatorFrameBuilder.cpp | 3 ++ src/SimulatorFrameLoader.cpp | 7 ++-- tango/Simulator.py | 46 +++++++++++++++++++----- 8 files changed, 59 insertions(+), 45 deletions(-) diff --git a/include/simulator/SimulatorCamera.h b/include/simulator/SimulatorCamera.h index 8f00320..753fcd3 100644 --- a/include/simulator/SimulatorCamera.h +++ b/include/simulator/SimulatorCamera.h @@ -102,7 +102,7 @@ public: void reset(); - void setHwMaxImageSizeCallback(HwMaxImageSizeCallback &cbk); + void setHwMaxImageSizeCallback(HwMaxImageSizeCallback *cbk); private: class SimuThread : public CmdThread { diff --git a/include/simulator/SimulatorFrameGetter.h b/include/simulator/SimulatorFrameGetter.h index fcf3f5f..54ea00f 100644 --- a/include/simulator/SimulatorFrameGetter.h +++ b/include/simulator/SimulatorFrameGetter.h @@ -24,6 +24,7 @@ #define SIMULATOR_FRAMEGETTER_H #include +#include #include @@ -38,7 +39,7 @@ class Exception; namespace Simulator { /// This interface describes a way to get the next frame buffer -struct SIMULATOR_EXPORT FrameGetter { +struct SIMULATOR_EXPORT FrameGetter : public HwMaxImageSizeCallbackGen { virtual ~FrameGetter() {} virtual Camera::Mode getMode() const = 0; @@ -56,10 +57,6 @@ struct SIMULATOR_EXPORT FrameGetter { virtual void getEffectiveFrameDim(FrameDim &frame_dim) const = 0; virtual void getMaxImageSize(Size &max_image_size) const = 0; - - virtual void setHwMaxImageSizeCallback(HwMaxImageSizeCallback &cbk) { m_cbk = &cbk; } - - HwMaxImageSizeCallback *m_cbk; //()), m_frame_nr(0), m_mis_cb_act(false) {} + FrameLoader() : m_current_stream(std::make_shared()), m_frame_nr(0) {} - void setHwMaxImageSizeCallback(HwMaxImageSizeCallback &cbk) override - { - DEB_MEMBER_FUNCT(); - registerMaxImageSizeCallback(cbk); - } - Camera::Mode getMode() const { return Camera::MODE_LOADER; } void setFilePattern(const std::string &file_pattern); @@ -75,13 +69,6 @@ public: void getMaxImageSize(Size &max_image_size) const { max_image_size = m_frame_dim.getSize(); } -protected: - void setMaxImageSizeCallbackActive(bool cb_active) override - { - DEB_MEMBER_FUNCT(); - m_mis_cb_act = cb_active; - } - private: typedef std::vector files_t; @@ -93,8 +80,6 @@ private: unsigned long m_frame_nr; FrameDim m_frame_dim; - - bool m_mis_cb_act; //setHwMaxImageSizeCallback(*m_cbk); + m_frame_getter->registerMaxImageSizeCallback(*m_cbk); } Camera::~Camera() @@ -234,12 +234,15 @@ void Camera::getFrameDim(FrameDim &frame_dim) m_frame_getter->getFrameDim(frame_dim); } -void Camera::setHwMaxImageSizeCallback(HwMaxImageSizeCallback &cbk) +void Camera::setHwMaxImageSizeCallback(HwMaxImageSizeCallback *cbk) { DEB_MEMBER_FUNCT(); - m_cbk = &cbk; - m_frame_getter->setHwMaxImageSizeCallback(cbk); + if (m_cbk && !cbk) + m_frame_getter->unregisterMaxImageSizeCallback(*m_cbk); + else if (!m_cbk && cbk) + m_frame_getter->registerMaxImageSizeCallback(*cbk); + m_cbk = cbk; } void Camera::getMaxImageSize(Size &max_image_size) const diff --git a/src/SimulatorDetInfoCtrlObj.cpp b/src/SimulatorDetInfoCtrlObj.cpp index 3ce2d20..3df7b3f 100644 --- a/src/SimulatorDetInfoCtrlObj.cpp +++ b/src/SimulatorDetInfoCtrlObj.cpp @@ -78,15 +78,14 @@ void DetInfoCtrlObj::registerMaxImageSizeCallback(HwMaxImageSizeCallback &cbk) { DEB_MEMBER_FUNCT(); - // Save the callback for future use by the frame getters (e.g. loader) - m_simu.setHwMaxImageSizeCallback(cbk); + // Save the callback for future use by the frame getters + m_simu.setHwMaxImageSizeCallback(&cbk); } void DetInfoCtrlObj::unregisterMaxImageSizeCallback(HwMaxImageSizeCallback &cbk) { DEB_MEMBER_FUNCT(); - // Register call back for the frame loader - FrameLoader *loader = m_simu.getFrameLoader(); - if (loader) loader->unregisterMaxImageSizeCallback(cbk); + // Remove callback from current and future frame getters + m_simu.setHwMaxImageSizeCallback(NULL); } diff --git a/src/SimulatorFrameBuilder.cpp b/src/SimulatorFrameBuilder.cpp index b61f469..3304f40 100644 --- a/src/SimulatorFrameBuilder.cpp +++ b/src/SimulatorFrameBuilder.cpp @@ -194,6 +194,9 @@ void FrameBuilder::setFrameDim(const FrameDim &dim) m_frame_dim = dim; + // Signal LiMA core that the frame properties may have changed + maxImageSizeChanged(m_frame_dim.getSize(), m_frame_dim.getImageType()); + // Reset Bin and RoI? } diff --git a/src/SimulatorFrameLoader.cpp b/src/SimulatorFrameLoader.cpp index 649cf77..f1b5ddc 100644 --- a/src/SimulatorFrameLoader.cpp +++ b/src/SimulatorFrameLoader.cpp @@ -230,11 +230,8 @@ void FrameLoader::setFilePattern(const std::string &file_pattern) DEB_TRACE() << DEB_VAR1(m_frame_dim); - if (m_mis_cb_act) - // Signal LiMA core that the frame properties may have changed - maxImageSizeChanged(size, image_type); - else - DEB_WARNING() << "Image size callback is not active"; + // Signal LiMA core that the frame properties may have changed + maxImageSizeChanged(size, image_type); } else throw LIMA_EXC(CameraPlugin, Error, "No file found with the given pattern"); } diff --git a/tango/Simulator.py b/tango/Simulator.py index a3b507e..e79f23c 100644 --- a/tango/Simulator.py +++ b/tango/Simulator.py @@ -111,12 +111,34 @@ class Simulator(PyTango.Device_4Impl): self.get_device_properties(self.get_device_class()) # Apply properties if any + if self.frame_dim: + frame_dim = self.getFrameDimFromLongArray(self.frame_dim) + _SimuCamera.setFrameDim(frame_dim) + if self.mode and (Simulator._Mode.get(self.mode) != None): _SimuCamera.setMode(Simulator._Mode[self.mode]) if 'PREFETCH' in self.mode and self.nb_prefetched_frames: _SimuCamera.getFrameGetter().setNbPrefetchedFrames(self.nb_prefetched_frames) + @Core.DEB_MEMBER_FUNCT + def getFrameDimFromLongArray(self, dim_arr): + width, height, depth = dim_arr + if depth == 1: + image_type = Core.Bpp8 + elif depth == 2: + image_type = Core.Bpp16 + elif depth == 4: + image_type = Core.Bpp32 + else: + raise ValueError('Unknown pixel depth: %d' % depth) + return Core.FrameDim(width, height, image_type) + + @Core.DEB_MEMBER_FUNCT + def getLongArrayFromFrameDim(self, frame_dim): + size = frame_dim.getSize() + return [size.getWidth(), size.getHeight(), frame_dim.getDepth()] + @Core.DEB_MEMBER_FUNCT def getAttrStringValueList(self, attr_name): return AttrHelper.get_attr_string_value_list(self, attr_name) @@ -176,20 +198,24 @@ class Simulator(PyTango.Device_4Impl): nb_prefetched_frames = 0 attr.set_value(nb_prefetched_frames) - # def read_mode(self,attr) : - # invMode = {v: k for k, v in self.__Mode.items()} - # mode = _SimuCamera.getMode() - # attr.set_value(invMode[mode]) - # - # def write_mode(self,attr) : - # mode = attr.get_write_value() - # _SimuCamera.setMode(self.__Mode[mode]) + def read_frame_dim(self,attr) : + frame_dim = _SimuCamera.getFrameDim() + dim_arr = self.getLongArrayFromFrameDim(frame_dim) + attr.set_value(dim_arr) + + def write_frame_dim(self,attr) : + dim_arr = attr.get_write_value() + frame_dim = self.getFrameDimFromLongArray(dim_arr) + _SimuCamera.setFrameDim(frame_dim) class SimulatorClass(PyTango.DeviceClass): class_property_list = {} device_property_list = { + 'frame_dim': + [PyTango.DevVarLongArray, + "Frame dimension in the form: width, height, depth", []], 'mode': [PyTango.DevString, "Simulator mode: GENERATOR, GENERATOR_PREFETCH, LOADER, LOADER_PREFETCH",[]], @@ -218,6 +244,10 @@ class SimulatorClass(PyTango.DeviceClass): attr_list = { # Simulator mode + 'frame_dim': + [[PyTango.DevLong, + PyTango.SPECTRUM, + PyTango.READ_WRITE, 3]], 'mode': [[PyTango.DevString, PyTango.SCALAR, -- GitLab