diff --git a/include/smurf/core/processors/SmurfProcessor.h b/include/smurf/core/processors/SmurfProcessor.h index ce9fb08d5..dfebcd249 100644 --- a/include/smurf/core/processors/SmurfProcessor.h +++ b/include/smurf/core/processors/SmurfProcessor.h @@ -82,6 +82,7 @@ namespace smurf void setGain(double g); // Set the filter gain const double getGain() const; // Get the filter gain void resetFilter(); // Reset the filter + void resetFilterWithMutex(); // Reset the filter, but holding the mutex. //** DOWNSAMLER METHODS **// void setDownsamplerDisable(bool d); // Disable the processing block. The data diff --git a/python/pysmurf/core/devices/_SmurfProcessor.py b/python/pysmurf/core/devices/_SmurfProcessor.py index a41a7b280..5660b72df 100644 --- a/python/pysmurf/core/devices/_SmurfProcessor.py +++ b/python/pysmurf/core/devices/_SmurfProcessor.py @@ -82,6 +82,12 @@ def __init__(self, name, device, **kwargs): localSet=lambda value: self.device.setUnwrapperDisable(value), localGet=self.device.getUnwrapperDisable)) + # Command to reset the unwrapper + self.add(pyrogue.LocalCommand( + name='reset', + description='Reset the unwrapper', + function=self.device.resetUnwrapper)) + class Downsampler(pyrogue.Device): """ SMuRF Data Downsampler Python Wrapper. @@ -175,6 +181,12 @@ def __init__(self, name, device, **kwargs): localSet=lambda value: self.device.setB(value), localGet=self.device.getB)) + # Command to reset the filter + self.add(pyrogue.LocalCommand( + name='reset', + description='Reset the unwrapper', + function=self.device.resetFilter)) + class SmurfProcessor(pyrogue.Device): """ diff --git a/src/smurf/core/processors/SmurfProcessor.cpp b/src/smurf/core/processors/SmurfProcessor.cpp index c4e0f7372..c908b5020 100644 --- a/src/smurf/core/processors/SmurfProcessor.cpp +++ b/src/smurf/core/processors/SmurfProcessor.cpp @@ -70,13 +70,15 @@ void scp::SmurfProcessor::setup_python() boost::noncopyable > ("SmurfProcessor",bp::init<>()) // Channel mapping variables - .def("setUnwrapperDisable", &SmurfProcessor::setUnwrapperDisable) - .def("getUnwrapperDisable", &SmurfProcessor::getUnwrapperDisable) .def("getNumCh", &SmurfProcessor::getNumCh) .def("setPayloadSize", &SmurfProcessor::setPayloadSize) .def("getPayloadSize", &SmurfProcessor::getPayloadSize) .def("setMask", &SmurfProcessor::setMask) .def("getMask", &SmurfProcessor::getMask) + // Unwrapper variables + .def("setUnwrapperDisable", &SmurfProcessor::setUnwrapperDisable) + .def("getUnwrapperDisable", &SmurfProcessor::getUnwrapperDisable) + .def("resetUnwrapper", &SmurfProcessor::resetUnwrapper) // Filter variables .def("setFilterDisable", &SmurfProcessor::setFilterDisable) .def("getFilterDisable", &SmurfProcessor::getFilterDisable) @@ -88,6 +90,7 @@ void scp::SmurfProcessor::setup_python() .def("getB", &SmurfProcessor::getB) .def("setGain", &SmurfProcessor::setGain) .def("getGain", &SmurfProcessor::getGain) + .def("resetFilter", &SmurfProcessor::resetFilterWithMutex) // Downsampler variables .def("setDownsamplerDisable", &SmurfProcessor::setDownsamplerDisable) .def("getDownsamplerDisable", &SmurfProcessor::getDownsamplerDisable) @@ -423,6 +426,17 @@ void scp::SmurfProcessor::resetFilter() currentBlockIndex = 0; } +// Reset the filter but holding the mutex. This is need when reseting the +// filter from python +void scp::SmurfProcessor::resetFilterWithMutex() +{ + // Take the mutex before changing the filter parameters + // This make sure that the new order value is not used before + // the a and b array are resized. + std::lock_guard lockFilter(mutFilter); + resetFilter(); +} + void scp::SmurfProcessor::setDownsamplerDisable(bool d) { disableDownsampler = d;