****************
Revision History
****************

V2.22.0 - 26.06.2026
====================

.. rubric:: Highlights

* Adds support for streaming time tags at up to 300 MTags/s over 10 Gigabit Ethernet via the SFP+ port of the |ttx-name|.
* Adds the option to plot multiple measurements of the same type together on one chart in |ttlab-name|.
* Adds a switch to automatically save measurement data to file for selected measurements in |ttlab-name|.

.. rubric:: Features and improvements

* Adds a secondary (temporary) hardware license slot, with updated Python example `hardware_license_update.py` and support in |ttlab-name|.
* Adds the ability to upgrade hardware licenses for devices connected to a Synchronizer.
* Adds the virtual channel :cpp:class:`GatedChannels` as a generalized multi-channel version of :cpp:class:`GatedChannel`.
* Adds the measurement :cpp:class:`GatedCounter` as a generalized multi-channel version of :cpp:class:`CountBetweenMarkers`.
* Improves performance of the software delay and data processing pipelines for |ttu-name| and |ttx-name|.
* Improves default measurement parameters for :cpp:class:`FrequencyCounter`, :cpp:class:`FrequencyStability`, :cpp:class:`HistogramLogBins` and :cpp:class:`TimeDifferences` in |ttlab-name|.
* Adds support for setting a custom Time Tagger application data directory via the ``TIMETAGGER_CONFIG_DIR`` environment variable.
* Many improvements and fixes in the documentation and programming examples.
* Improves the file structure in the distributed packages for Ubuntu, Debian and AlmaLinux.

.. rubric:: Bug Fixes

* Fixes instabilities in :cpp:class:`TimeTaggerNetwork`, especially when connecting multiple clients to a server and transferring high data rates.
* Fixes possible error in :cpp:func:`CounterData::getDataTotalCounts` for very small binwidths and improves :cpp:class:`Counter` restarting behavior after an Error event.
* Fixes several memory leaks and reduces overall memory usage in |ttlab-name|.
* Fixes a deadlock when :cpp:func:`~IteratorBase::startFor()` is called with a very high repetition rate.
* Fixes a bug where :cpp:func:`~TimeTaggerSource::getConditionalFilterFiltered` returned unfiltered rather than filtered channels in :cpp:class:`TimeTaggerVirtual`.
* Fixes a bug where :cpp:func:`~TimeTaggerSource::setConditionalFilter` accepted an empty trigger list and silently dropped all filtered events :cpp:class:`TimeTaggerVirtual`.
* Fixes a bug in :cpp:class:`FrequencyCounter`, where the first bin was one ps too long and was not returned when running for exactly one `fitting_window` of time.
* Fixes crashes when using binwidth = 0 for :cpp:class:`Correlation`, :cpp:class:`CorrelationPairs`, :cpp:class:`Flim`, :cpp:class:`StartStop`, :cpp:class:`TimeDifferences` and :cpp:class:`TimeDifferencesND`.
* Fixes incorrect output of :cpp:func:`FrequencyStabilityData::getSTDD`.
* Fixes incorrect output channels of :cpp:class:`DelayedChannels` when duplicate input channels are used.
* Fixes a crash after finishing capturing data in :cpp:class:`CountBetweenMarkers` when in overflow mode.
* Fixes retriggering :cpp:class:`Scope` when in overflow mode.
* Fixes incorrect counts in :cpp:func:`~TimeDifferencesND::getRollovers` and :cpp:func:`~TimeDifferencesND::setMaxRollovers` in :cpp:class:`TimeDifferencesND`.
* Fixes multiple rare instabilities in :cpp:class:`PulsePerSecondMonitor`, especially when in overflow mode.

.. rubric:: Support and compatibility

* Adds Python libraries for Windows to PyPI.
* Adds support for Ubuntu Long Term Support release 26.04.
* Adds Arm64 libraries to the Windows installer.
* Moves :cpp:class:`PulsePerSecondMonitor` out of the `Experimental` namespace. Deprecated aliases for this measurement remain, except for C# and LabVIEW bindings for which this is a breaking change.
* This release changes how settings are stored in |ttlab-name|: workspaces saved with version >=2.22.0 may not fully work when opened with older software versions.
* Removes the deprecated :ref:`channel numbering scheme<LegacyZeroNumberSchemeNote>` which existed for backward compatibility with devices with channel numbers starting at 0.

V2.21.2 - 26.03.2026
====================

.. rubric:: Improvements

* Reverts the default :cpp:enum:`TestSignalSource` to `Digital` for the |ttx-name| to maintain backwards compatibility. 

.. rubric:: Bug Fixes

* Fixes the Python example `hardware_license_update.py`.
* Fixes a bug that may prevent starting a measurement in |ttlab-name| when multiple measurements depend on the same processor.
* Fixes a bug that prevented loading a workspace with floating measurement windows in |ttlab-name|.
* Includes various other UI fixes and stability improvements in |ttlab-name|.
* Fixes a bug in the Linux Python libraries distributed through PyPI that caused a crash of the server created by :cpp:func:`TimeTagger::startServer()` upon connection attempts.
* Fixes a bug in the Linux Python libraries distributed through PyPI that checked wrong paths for SSL CA files on some systems, which caused the license download to fail.

V2.21.0 - 19.02.2026
====================

.. rubric:: Highlights

* Support for the :cpp:class:`StartStop` measurement class in |ttlab-name|.

.. rubric:: Improvements

* Adds :cpp:enum:`TestSignalSource`, :cpp:func:`~TimeTagger::setTestSignalSource()`, and :cpp:func:`~TimeTagger::getTestSignalSource()` to define, set, and retrieve the source of the Time Tagger on-device test signal (available only for |ttx-name| hardware revision >= v1.3).
* Adds `capture_duration` to :cpp:class:`HistogramLogBinsData`.
* Increases the delay hardware range for the |ttx-name| to ±2500000 (±2.5 µs)
* Adds :cpp:func:`~TimeTagger::fetchDeviceLicenseUpdate()` and python example `hardware_license_update.py`.
* Adds performance improvements in |ttlab-name|.
* Many improvements and fixes in the documentation and programming examples.

.. rubric:: Bug Fixes

* Fixes a rare bug causing a 2 ns offset between Time Taggers when using the Synchronizer.
* Fixes a bug in :cpp:class:`SynchronizedMeasurements` where some data are missing at the start of the measurement if the channels were not previously registered.
* Fixes a possible client-side crash in |ttlab-name| when the Time Tagger Network server disconnects.
* Fixes the allowed reference frequency for reference clock by taking into account the event divider in |ttlab-name|.
* Fixes the trigger level control within the channel configurator of a measurement or processor in |ttlab-name|.
* Reverts status LEDs to being on by default for |ttu-name| and |ttx-name| in |ttlab-name|.

.. rubric:: Support and compatibility

* Adds support for |ttu-name| with hardware revision 2.0.
* Adds support for |ttx-name| with hardware revision 1.4.
* Adds support Debian Trixie for amd64 and ARM.
* Adds support for AlmaLinux 10.
* Drops the deprecated WebApp user interface.

V2.20.2 - 17.12.2025
====================

.. rubric:: Bug Fixes

* Fixes an error when saving a |ttlab-name| workspace in a OneDrive synchronized folder.

.. rubric:: Improvements

* Adds Python libraries for Arm64 Linux to PyPI.
* Adds a description to the Python libraries distributed through PyPI.


V2.20.0 - 11.12.2025
====================

.. rubric:: Highlights

* Introduces :cpp:class:`TimeTaggerNetwork` functionality in |ttlab-name|.
* Support for :doc:`/api/VirtualChannels` :cpp:class:`Combinations` and :cpp:class:`Combiner` in |ttlab-name|.
* Support for the :cpp:class:`PhaseNoise` measurement class in |ttlab-name|.
* New measurement classes :cpp:class:`CorrelationPairs` and :cpp:class:`HistogramCustomBins`.
* New tutorial on :doc:`Fluorescence Correlation Spectroscopy (FCS) </tutorials/FluorescenceCorrelationSpectroscopy>` in the documentation.

.. rubric:: Improvements

* Adds methods :cpp:func:`~TimeDifferencesND::setMaxRollovers`, :cpp:func:`~TimeDifferencesND::getRollovers`,
  and :cpp:func:`~TimeDifferencesND::getHistogramIndex` to the measurement class :cpp:class:`TimeDifferencesND`.
* Adds method :cpp:func:`~Combinations::getChannelByMask` to the virtual channel class :cpp:class:`Combinations`.
* Many improvements and fixes in the documentation and programming examples.

.. rubric:: Bug Fixes

* Tag streaming over network or USB is now halted for unused channels after :cpp:func:`~IteratorBase::stop()` is called.

.. rubric:: Support and compatibility

* Python libraries for Linux are now distributed through PyPI under the name ``Swabian-TimeTagger`` and can be installed with pip.
* The Python namespace is changed to *Swabian.TimeTagger*. The *TimeTagger* namespace is deprecated but continues to be supported.
* This software version will be the last to include the deprecated WebApp user interface.


V2.19.0 - 29.07.2025
====================

.. rubric:: Highlights

* New measurement class :cpp:class:`PhaseNoise` provides a phase noise estimator for periodic signals.

.. rubric:: Improvements

* Adds performance improvements for :cpp:class:`FrequencyStability`, especially for CPUs supporting AVX512 instructions.
* Improves and expands the :doc:`FLIM tutorial </tutorials/ConfocalMicroscope>` in the documentation.
* New method :cpp:func:`TimeTagger::getConnectedClients` to list the clients connected to a Time Tagger Network server.

.. rubric:: Bug fixes

* Fixes performance limitations that led to USB3 transfer rates below 90 MTags/s in Linux builds.
* Fixes the broken CoincidencesFactory constructor in LabVIEW.
* Fixes incorrect channel numbering in Time Tagger Network clients for the specific case of multiple servers streaming at low data rates.
* Fixes a rare crash when copying log messages to the clipboard in |ttlab-name|.

.. rubric:: Support and compatibility

* This release breaks backward compatibility for Time Tagger Network. This means that clients connecting to servers with version >= 2.19.0 must also be of version >= 2.19.0. 
* Drops support for Ubuntu 20.04.


V2.18.2 - 07.05.2025
====================

.. rubric:: Bug fixes

* Fixes a crash when aborting a :cpp:class:`HistogramLogBins` measurement.
* Fixes a memory leak when starting a Time Tagger Network server in |ttlab-name|.
* Fixes a crash when resetting a |ttlab-name| workspace saved in a OneDrive synchronized folder.
* Fixes a channel mapping bug in Time Tagger Network when transferring low data rates in a multi-server configuration.


V2.18.0 - 23.04.2025
====================

.. rubric:: Highlights

* Support for :doc:`/api/VirtualChannels` :cpp:class:`Coincidences`, :cpp:class:`GatedChannel` and :cpp:class:`DelayedChannel` in |ttlab-name|.
* Multi-server time tag stream merger with :cpp:class:`TimeTaggerNetwork`.
* 20 channel support for the |ttx-name|.

.. rubric:: Time Tagger

* Introduces ReferenceClock as an improvement over SoftwareClock to allow for synchronization with 1PPS signals and reconstruction of the original frequency.
* Adds a Raspberry Pi installer for TimeTagger software.
* Documentation: unifies the online user manual and the C++ API user manual into a single document. 
* Documentation is now built into our Python and C# wrappers (via pydoc and XML).
* New tutorials for :doc:`Time Tagger Lab</../gettingStarted/GettingStartedTTLab>` and :doc:`Remote synchronization</tutorials/RemoteSynchronization>`.

.. rubric:: Time Tagger Lab

* Introduces manually adjustable plot limits.
* Adds option to switch between :cpp:class:`Counter` and :cpp:class:`FrequencyCounter` as the auxiliary graph.
* Fixes unreliable behavior when using multiple monitors with different screen scaling settings.
* Visual improvements when using Synchronized devices.
* Includes several smaller UI and stability improvements.

.. rubric:: Support and compatibility

* Removes installer for 32 bit Windows.
* Drops support for Ubuntu 18.04 and replaces CentOS 8 with AlmaLinux 8.
* Adds support Debian Bookworm (amd64 and arm64) and for AlmaLinux 9.
* Adds support for C# on Linux (not on Ubuntu 20.04 and Raspberry Pi).
* Adds support for Numpy 2.0 on all Linux distributions but Ubuntu 20.04 and AlmaLinux 8.
* This release breaks backward and forward compatibility for Time Tagger Network. This means that clients connecting to servers with version = 2.18.x must also be of version = 2.18.x. 

.. rubric:: Improvements

* Adds the method :cpp:func:`~TimeTagger::setServerAddress` for binding to a single network interface.
* Adds the method :cpp:func:`~TimeTaggerNetwork::getServer` providing a proxy object with the :cpp:class:`TimeTaggerHardware` interface to control the Time Tagger device connected to the server.
* Adds the method :cpp:func:`Combinations::getChannels` to query many virtual channels at once.
* Adds the methods :cpp:func:`~TimeTaggerHardware::getTriggerLevelRange`, :cpp:func:`~TimeTaggerSource::getDeadtimeRange` and :cpp:func:`~TimeTaggerSource::getDelayHardwareRange` to query hardware limitations.
* Adds the enum :cpp:enumerator:`AccessMode::SynchronousListen` to Time Tagger Network for delivering data synchronously to clients while restricting control settings and exposing only a limited set of channels.
* Improves the performance of :cpp:class:`FileWriter` and :cpp:class:`HistogramLogBins`.
* Fixes a slowdown of :cpp:class:`FrequencyStability` on Windows with small values for the `average` parameter.
* Fixes the instantiation of :cpp:class:`FrequencyStability` in LabView.
* Fixes input registration and unregistration by measurements if some requested channel numbers are not available.
* Fixes the behavior of :cpp:class:`Countrate` with Error events.
* Fixes the generation of MissedEvents in Listen mode on overload conditions for TimeTaggerNetwork.

.. rubric:: API changes

* New API for the Time Tagger Virtual: Specify the files in :cpp:func:`createTimeTaggerVirtual` and call :cpp:func:`~TimeTaggerVirtual::run` after creating all measurements.
* Split :cpp:class:`TimeTagger` in the two interfaces :cpp:class:`TimeTaggerSource` for controlling the on-device timestamp manipulation modules and :cpp:class:`TimeTaggerHardware` for controlling the physical parameters of a Time Tagger device.
* Support for :cpp:func:`setTestSignal <TimeTaggerHardware::setTestSignal>` and :cpp:func:`getTestSignal <TimeTaggerHardware::getTestSignal>` has been removed from :cpp:class:`SynchronizedMeasurements` and deprecated in :cpp:class:`TimeTaggerVirtual`.
* :cpp:func:`freeTimeTagger` no longer supports a Boolean return value in all programming interfaces (except C# and Labview, for backward compatibility reasons). This value was used to test whether a TimeTagger in singleton mode had been properly freed, however singleton mode has been deprecated since v2.7.2.
* C#: Throws ArgumentOutOfRangeException instead of ApplicationException on unsupported function arguments.
* Deprecates :cpp:func:`~TimeTaggerHardware::getDACRange` and :cpp:func:`~TimeTaggerBase::setSoftwareClock`.
* Renames :cpp:func:`~TimeTaggerVirtual::waitForCompletion` to :cpp:func:`~TimeTaggerVirtual::waitUntilFinished` to match the method name of measurements.
* Splits the former single C++ measurements header in one file per measurement.


V2.17.6 - 21.01.2025
====================

.. rubric:: Highlight

* The maximum default :cpp:func:`block size <TimeTaggerHardware::setStreamBlockSize>` is increased to 1 million events on the |ttu-name| and |ttx-name|.
  With the default settings, the respective maximum transfer rates exceed 90 MTags/s.

V2.17.4 - 17.07.2024
====================

.. rubric:: Improvement

* Python: adds support for NumPy 2.0.0 (for Python versions on Linux that support NumPy 2.0.0, rebuilding the Python wrapper
  may be necessary. See our :ref:`documentation <linux-build-python>` for more details).


V2.17.2 - 02.07.2024
====================

.. rubric:: Improvement

* Adds support for Ubuntu Long Term Support release 24.04.
* Adds :cpp:func:`~IteratorBase::abort()` for a non-blocking hint to abort measurements quickly.
* Adds a tutorial for ODMR measurements.

.. rubric:: Time Tagger bug fixes

* Fixes wrong initial UTC time stamp in :cpp:class:`~PulsePerSecondMonitor` and improved formatting in its data export file.
* Fixes :cpp:class:`HistogramND` for N > 4. 
* Fixes a bug with missing time tags when multiple small saved files are merged and replayed.

.. rubric:: Time Tagger Lab bug fixes

* Fixes a crash when switching between :cpp:class:`FileWriter` and other measurements.
* Adds missing data export option for :cpp:class:`~PulsePerSecondMonitor` and :cpp:class:`FrequencyCounter`.
* Fixes visualization of available HighRes channels for |ttx-name| on the landing page.
* Fixes a bug when stopping and restarting the Logarithmic Histogram DLS simulation.
* Fixes a crash in the application's window docking manager.
* Includes several smaller UI and stability improvements.


V2.17.0 - 22.04.2024
====================

.. rubric:: Highlights

* With the new :cpp:class:`FrequencyCounter` measurement, the Time Tagger becomes a full feature Omega-type frequency counter.
* The new :cpp:class:`~PulsePerSecondMonitor` measurement allows to monitor the synchronicity of different PPS sources.
* The support of variable integration time per bin in :cpp:class:`HistogramLogBins` provides the accurate g2 normalization with immediate start and gated inputs.
* Improve the performance of the Synchronizer to reach the full 80 MTags/s per device.

.. rubric:: Improvement

* New virtual channel :cpp:class:`Combinations` for exclusive coincidences.
* Adds support for the Python Stable ABI to support Python 3.12 and likely many more further releases.
* Adds support for the MinGW C++ ABI for the `MINGW32 and UCRT64 environment <https://www.msys2.org/docs/environments/>`_.

.. rubric:: Time Tagger Ultra and Time Tagger X

* Significantly reduced on-device latency noticeable both over USB and FPGA link.
* Support for :cpp:func:`high priority input channels<TimeTagger::xtra_setHighPrioChannel>`, which will still be transmitted while in overflow domain.
* The timestamps of rising and falling events can be :cpp:func:`averaged on hardware<TimeTagger::xtra_setAvgRisingFalling>` for a higher precision of events.
* Enhanced version of the :cpp:func:`deadtime filter<TimeTaggerSource::setDeadtime>`, which can be configured with any dead time in picosecond precision.

.. rubric:: Time Tagger X

* Full support for the :ref:`High-Resolution <HighResHardwareDescription>` mode on the |ttx-name| with a timing jitter of 1.5 ps RMS per channel.
* Support for the QSFP+ :doc:`FPGA link </InDepthGuides/FpgaLink>` with a data rate of 1200 MTags/s.
* Support for the readout of more device sensors on the hardware.
* The self verification of the hardware input stage of the built-in test signal is reverted on the |ttx-name|.
* All input ports stay at the :ref:`high-impedance<ConfigurableInputTermination>` mode before their first usage and after :cpp:func:`freeTimeTagger`.
* Changes the default :cpp:func:`hysteresis<TimeTaggerHardware::setInputHysteresis>` from 1 mV to 20 mV.

.. rubric:: Time Tagger Ultra

* Adds support for |ttu-name| with hardware revision 1.8.
* The improved auto-calibration for periodic signals and its error handling is backported from the |ttx-name| to the |ttu-name|.
* Improves the USB performance for many aligned inputs.

.. rubric:: Time Tagger Lab features and enhancements

* Improved and more informative landing page layout.
* Existing measurements can now be cloned easily (by right clicking).
* The live countrate is now visible in the detailed device view.
* Application window positions and the measurement list order are now saved to workspace.
* A notification appears when the measurement dead time is automatically adjusted to a multiple of the Time Tagger clock.
* New startup command line options --select-device and --start-measurement.
* Maximum file size for the :cpp:class:`FileWriter` measurement is now shown in megabytes.
* "Force high impedance" option for |ttx-name| start-up without impedance switch.
* Many smaller UI improvements and fixes.

.. rubric:: Time Tagger Lab bug fixes

* Fixed various crashes related to device license checks, sending feedback and exporting large data sets to file.
* Fixed occasional misaligned axis ticks and missing axis ticks when zooming in.
* Fixed limited application visibility for high screen scaling settings.
* Fixed occasionally missing chart cursor values.
* Changed logarithmic axis labels from E^ to 10^.


V2.16.2 - 28.06.2023
====================

.. rubric:: Time Tagger hardware support

* Adds support for |tt20-name| with hardware revision 2.5.
* Adds support for |ttx-name| with hardware revision 1.2.

.. rubric:: Time Tagger bug fix

* Fixes :cpp:class:`Counter` showing wrong values when the same channel is used multiple times, now throwing an exception on creating.
* Fixes :cpp:class:`FileReader` in MATLAB not loading the .NET Assembly in its constructor. All measurement classes now load the assembly.

.. rubric:: Time Tagger Lab

* Fixes non-visible numbers for cursor values.
* Moved legend of Counter time trace to the top left.
* Higher precision formatting values when necessary.


V2.16.0 - 05.06.2023
====================

.. rubric:: Highlights

* |ttlab-name|: Virtual Antibunching and Fluorescence lifetime setups.

.. rubric:: Time Tagger Lab features and enhancements

* Antibunching and Fluorescence lifetime setups and corresponding simulation measurements. The detector signals are fully simulated for those measurements and no physical detectors are needed.
* Option to suppress counts for dt=0 with autocorrelation measurements.
* Notification that software updates are available.
* Improved crash and error reporting.
* Improved ticks and labels of logarithmic plots.

.. rubric:: Time Tagger Lab bug fixes

* Fixed various crashes related to exporting data, opening a message box, and creating log files.
* Fixed Histogram 2D export.
* Fixed auto-restarting with no-plot measurements on configuration change.
* Missing log-y labels and ticks are added to chart display.

.. rubric:: Improvement

* Adds support for Python 3.11.
* The built-in test signal verifies the hardware input stage on |ttx-name| starting from hardware revision 1.1.

.. rubric:: Bug fixes

* Fixes fan information of :cpp:func:`~TimeTaggerHardware::getSensorData` on the |ttu-name|.
* Fixes the support for Time |ttu-name| devices with the serials starting with `17`.
* Fixes :cpp:class:`GatedChannel`, :cpp:class:`FrequencyMultiplier` and :cpp:class:`TriggerOnCountrate` to switch to the initial state on :cpp:func:`~IteratorBase::clear` and :cpp:func:`~IteratorBase::startFor`.
* Fixes :cpp:func:`~TimeTagger::autoCalibration` to clear the old calibration data.
* Fixes the error handling on Linux if parts of the Python wrapper are missing.
* Fixes a one bit out of bounds memory access on verifying the hardware license.
* Fixes the jagged array handling of the MATLAB Wrapper for :cpp:class:`Coincidences`.


V2.15.0 - 06.03.2023
====================

.. rubric:: Highlights

* Rework of the MATLAB wrapper, now reflecting the full functionality of the Time Tagger API.

.. rubric:: MATLAB wrapper

* Supports class inheritance, new TT classes are closer to their C++, and Python counterparts.
* Supports creation of TimeTagger objects via :cpp:func:`createTimeTagger<createTimeTagger>`.
* Supports native MATLAB enums.
* Supports jagged arrays via conversion from/into MATLAB cells.

.. rubric:: Behavior change

* Disallow an event divider value of 0. Please use 1 instead.
* MATLAB: Removed MATLAB app designer examples.

.. rubric:: Other Changes

* Updated Opal Kelly Frontpanel library to 5.2.12.

.. rubric:: Bug fixes

* Python: Fix return type annotation for :cpp:func:`createTimeTagger`.
* Fixes certain deadlock issues in MATLAB caused by asynchronous functions.
* Fixes the overflow tracking with a USB error while in overflow.
* Fixes handling of tags with respect to <-> missed events at the timestamp of an OverflowBegin error.
* Counter: Fixes a transpose issue of the NaN generation in :cpp:func:`~CounterData::getDataNormalized`.
* FrequencyStability: Fixes an integer overflow in the MDEV / TDEV calculation.
* Fixed issue with ``LicenseRequestGenerator.exe`` not working on some systems.

.. rubric:: Time Tagger Lab features and enhancements

* Device LEDs can be switched on and off (not |tt20-name|).
* Improved setting of the reference software clock for signals with an event divider greater than 1.
* |tt20-name| Edu is supported.

.. rubric:: Time Tagger Lab bug fixes

* Fix the crash when capturing high-resolution counter-time traces.
* Fix the crash when the USB connection to the device is unstable.
* Fix the crash when exporting large Scope measurement data.
* Fix the crash when exporting a plot to a PNG file.
* Fix the crash when measurements require too much memory on initialization.
* User interface issues with small screens are solved.


V2.14.0 - 23.12.2022
====================

.. rubric:: Time Tagger X

* Adds support for |ttx-name| with hardware revision 1.1.
* Adds support for Synchronizer with |ttx-name| and also mixed setups with |ttu-name|.
* Provides preliminary Ethernet support on the SFP+.
* Improves the auto-calibration for periodic signals.
* Better CPU performance for aligned tags.
* Improves the channel LED blinking for 1pps signals.
* Shows calibration errors on the channel LED in red.
* Fixes a random skew jump of 1333 ps per input channel on USB errors.
* Fixes the channel LED indication for falling events.

.. rubric:: Bug fix

* Fix Power LED turning off after calling :cpp:func:`freeTimeTagger` on the |ttu-name|.

V2.13.2 - 22.11.2022
====================

.. rubric:: Highlight

* Release of :doc:`Time Tagger Lab </gettingStarted/GettingStartedTTLab>` - the native UI for Windows.

V2.12.4 - 09.11.2022
====================

.. rubric:: Improvement

* Adds support for |ttu-name| with hardware revision 1.7.

.. rubric:: Bug fix

* Fixed webapplication data export for :cpp:class:`HistogramLogBins`.

V2.12.2 - 04.10.2022
====================

.. rubric:: Bug fixes

* Fixes wrong :cpp:enumerator:`Tag::Type::Error` event generation and channel detection in :cpp:func:`mergeStreamFiles`.
* Fixes host license querying for :cpp:class:`TimeTaggerNetwork` clients (broken in v2.12.0)
* Python: Fixes the decoding of the return values of :cpp:func:`~TimeTaggerHardware::getDeviceLicense` and :cpp:func:`~TimeTaggerHardware::getSensorData` of :cpp:class:`TimeTaggerNetwork`.
* C++: Fixes std::string unmarshalling within the Network Time Tagger.

.. rubric:: Various improvements

* Adds method :cpp:func:`~FrequencyStabilityData::getTraceFrequencyAbsolute` to :cpp:class:`FrequencyStability`.
* Adds method :cpp:func:`~FileReader::getChannelList` to :cpp:class:`FileReader`.

V2.12.0 - 01.09.2022
====================

.. rubric:: Highlights

* Add support for our new high precision measurement device, the `Time Tagger X`, with a typical timing resolution of 2.0 picoseconds.

.. rubric:: WebApp

* Change default access mode to :cpp:enumerator:`AccessMode::Control` for Time Tagger Network.

.. rubric:: Features

* Improve the performance of the Synchronizer. Two |ttu-name| devices now can achieve a total data rate of over 100 Mtags per second.
* Add support for the new Ubuntu Long Term Support release 22.04 Jammy Jellyfish.

.. rubric:: Behavior change

* All provided strings to the C++ API must be encoded as UTF-8, returning strings are also UTF-8 encoded.
* Rename getLicenseInfo() to :cpp:func:`~TimeTaggerHardware::getDeviceLicense`. It returns a JSON formatted string for easier processing.
* Drop support for obsolete Python versions 2.7 and 3.5 and for the obsolete Linux distributions CentOS 7 and Ubuntu 16.04.

.. rubric:: Examples

* Jitter verification requests the specified jitter values directly from the Time Tagger backend.
* FLIM example is now available for MATLAB

.. rubric:: Various Fixes and Improvements

* Fix Unicode characters in all filenames of :cpp:class:`FileWriter` and :cpp:class:`FileReader`.
* Fix CoincidenceFactory for MATLAB and Labview.
* Fix the :cpp:class:`Flim` measurement for MATLAB.
* Fix the crash on a failing license download within the initialization of the Network Time Tagger.
* Prefer a host-locked license over a user-locked license in the Virtual Time Tagger. This reduces the chance of a false-positive anti-virus warning.
* Improve the rounding behavior of :cpp:func:`~TimeTaggerHardware::getTriggerLevel`.
* Update of the USB driver for various fixes.

V2.11.0 - 22.04.2022
====================

.. rubric:: Highlights

* Introduced :cpp:func:`mergeStreamFiles` to combine several :cpp:class:`FileWriter` files into one.

.. rubric:: Time Tagger Network

* New Protocol version 3.1 with a new set of features. Backward compatible with 3.0.
* Improved messages for connection loss and disconnection. Additionally, messages for connecting to new and old versions of TTN will be presented.
* Fixed issue related to implicit call of :cpp:func:`~TimeTaggerBase::sync` on measurement creation in :cpp:enumerator:`AccessMode::Listen` mode.
* Server and network information has been added to :cpp:func:`~TimeTaggerBase::getConfiguration`.
* Fixed crashes when streaming over 250 channels.
* Various race conditions and possible freezes have been fixed.
* Faster initialization of measurements with many channels.
* Fixed error handling on disconnection.
* Reduced connection timeout to 10 seconds.
* Fixed an issue where channels used by a client remained registered after a disconnect.
* :cpp:func:`~TimeTaggerHardware::setTimeTaggerNetworkStreamCompression` can be utilized to double the maximum transfer rate in a very slow network environment (<= 100 Mbit/s).

.. rubric:: Time Tagger Virtual

* The :cpp:class:`TimeTaggerVirtual` will now wait for a test signal channel to be registered before starting to stream it (behavior identical to a hardware Time Tagger).

.. rubric:: GatedChannel

* Optional constructor argument `initial` of type :cpp:enum:`GatedChannelInitial` to initialize the gate optionally in an open state.
* Changed behavior if `input_channel` equals `gate_start_channel` or `gate_stop_channel` to allow for operation similar to the ConditionalFilter.

.. rubric:: FrequencyStability

* Fixed :cpp:func:`~FrequencyStabilityData::getTraceFrequency`; now it returns the relative frequency error instead of the relative period error.
* Traces are no longer truncated to the length of the maximum steps.
* Corrected behavior if stopped and restarted without clearing.

.. rubric:: Other measurement classes

* :cpp:class:`HistogramLogBins`: Removed bins which have a bin width of 0 ps.
* :cpp:class:`SynchronizedMeasurements`: Methods calls on a :cpp:class:`SynchronizedMeasurements` object without any registered measurements will no longer generate an exception but a warning.
* :cpp:class:`TimeDifferences`: Added :cpp:func:`~TimeDifferences::getHistogramIndex` to return the index of the histogram being processed currently.
* Exposed :cpp:enum:`Tag::Type` to be used with :cpp:class:`TimeTagStream` and :class:`CustomMeasurement`.

.. rubric:: Synchronizer

* Improved error messages.
* Fixed USB errors occurring under very high data rates.

.. rubric:: Examples

* Added Visual Basic .NET example

.. rubric:: Various Fixes

* Fixed crash on :cpp:func:`createTimeTagger` during a USB error.
* Fixed an issue where :cpp:func:`~IteratorBase::startFor` could run further than the specified time on :cpp:class:`HistogramLogBins` and :cpp:class:`FileWriter`.
* WebApp: Fixed argument handling on Linux.
* MATLAB: Supports now :cpp:enum:`Resolution` for HighRes.
* MATLAB: Verifies that the version of the installed backend matches the wrapper version.

V2.10.6 - 16.03.2022
====================

.. rubric:: Improvements

* Adds support for |ttu-name| with hardware revision 1.6b.

V2.10.4 - 23.02.2022
====================

.. rubric:: WebApp

* Fixed Input Delay for negative values.
* Fixed adding new channels for :cpp:class:`Countrate` measurement.
* Fixed :cpp:class:`HistogramLogBins` for low start times (< 10ps).
* Fixed units for data export of :cpp:class:`Counter`, :cpp:class:`Correlation`, :cpp:class:`Histogram2D`, and :cpp:class:`HistogramLogBins` measurements.

V2.10.2 - 31.12.2021
====================

.. rubric:: Improvements

* Added support for Python 3.10.

.. rubric:: Fixes for issues since v2.10.0

* Fixed :cpp:class:`HistogramLogBins` in the Web Application.
* Fixed :cpp:class:`DelayedChannel` for negative delays.
* Fixed an issue with :cpp:func:`Counter::getDataTotalCounts` not resetting to 0 on :cpp:func:`~IteratorBase::clear`.
* Fixed some MATLAB examples not being compatible with 2016b or older.

V2.10.0 - 22.12.2021
====================

.. rubric:: Highlights

* Time Tagger Network: All Time Tagger devices and the acquired data can be accessed via the network from multiple clients or locally across the different programming languages. The clients can use all TimeTagger measurement classes and may optionally control the settings of the physical Time Tagger.
* A new frequency stability toolbox: It offers on-the-fly evaluation of periodic signals by calculating several analysis metrics, including, for example, the Allan deviation (ADEV) and time deviation (TDEV).
* Software Clock: The new recommended method for using an external clock on the |ttu-name|. The time tag stream is rescaled on the software side with respect to the connected clock. It allows for a broad input frequency range and also calculates phase error estimators. In addition, the input jitter of the clock channel will be averaged out, resulting in a lower jitter for measurements including the clock channel directly.

.. rubric:: Features

* Counter: New :cpp:func:`~Counter::getDataObject` returning data as an object of :cpp:class:`CounterData` and allowing for continuous chunkwise data acquisition. This object contains the Counter data, timing information and overflow flags. 
* New :cpp:class:`HistogramND` measurement, which is a multidimensional generalization of the older :cpp:class:`Histogram2D`.
* New :cpp:class:`Sampler` measurement class for a triggered sampling of the current state of other channels.
* Measurement and virtual channel settings can now be requested with :cpp:func:`~IteratorBase::getConfiguration` method. The settings of all measurements are also available in the return value of :cpp:func:`~TimeTaggerBase::getConfiguration` method.

.. rubric:: WebApp

* A `Time Tagger Network` server can be activated in the settings.
* Includes the `Software Clock` feature.
* Adds `Event Divider` settings.
* Shows specified RMS jitter for each channel in HighRes mode.
* It is now possible to specify the integration time in a single-shot or cyclic mode (internally uses :cpp:func:`~IteratorBase::startFor`) for all available measurement classes.

.. rubric:: Performance

* Improved performance of :cpp:class:`Counter`, :cpp:class:`Countrate`, :cpp:class:`TimeTagStream`, :cpp:class:`Combiner`, :cpp:class:`DelayedChannel` for many channels.
* :cpp:class:`HistogramLogBins` with an improved algorithm, multithreading, and AVX2+AVX512 tuning.
* :cpp:class:`Coincidences` improved for high input rates with low coincidence rates.

.. rubric:: Behavior change

* :cpp:class:`TimeTagStream` now always requires a list of channels.
* :class:`CustomMeasurement` in Python: ``with self.mutex`` replaces ``self.lock`` and ``self.unlock``.
* A Synchronizer with only one Time Tagger will use the timestamps of the Synchronizer but the channel identifiers of the single device itself.
* No messages on the INFO level will be shown in MATLAB to avoid running into deadlocks.
* ``std::invalid_argument`` exceptions are now wrapped as :class:`ValueError` in Python.

.. rubric:: Examples

* New Python example to measure the maximum transfer rate and the jitter.
* New Python example to show coincidence counting applications.
* New example to show the use of the software clock and measure the frequency stability of the test signal in Python, MATLAB and LabVIEW.
* Update the `Counter` example in Python and MATLAB to show the use of the new :cpp:class:`CounterData`.

.. rubric:: Fixes

* Skips an unlikely blocking :cpp:func:`freeTimeTagger` call for up to 10 seconds.
* Fixes the 64-bit signed integer overflow after 106 days on Linux.
* Stops playing the last sound of :cpp:func:`~TimeTaggerHardware::setSoundFrequency` after :cpp:func:`freeTimeTagger`.
* Fixes the timing of :cpp:var:`TimeTagStreamBuffer::tGetData` in the last block of :cpp:class:`FileReader`.
* Adds support for TTU HW revision 1.6 and TT20 Value.
* Fixes the empty configuration and channel list in :cpp:class:`FileReader` before fetching the first time tag.
* Fixes a race condition on the |ttu-name|, which may yield one invalid time tag after USB connection errors.
* Fixes a crash on using ``with CustomMeasurement() as c`` in Python.
* Fixes incorrectly displayed units in the WebApp if measurement settings changed during a measurement.
* Fixes the behavior of Histogram2D if start_channel matches a stop channel.
* Fixes the behavior of Countrate with startFor if it ends within an overflow interval.

V2.9.0 - 07.06.2021
===================

.. rubric:: Highlights

* Reduced communication latency of all Time Taggers.
* Reduced |tt20-name| crosstalk on channel 1 and 2.
* Improved USB connection stability for |tt20-name|.
* Optional collection and reporting of pseudonymous usage statistics. :doc:`Improvement program <../gettingStarted/UsageStatistics>`.
* Please use at least v2.9.0 for devices shipped from 2021 on.

.. rubric:: Changes

* :cpp:func:`~TimeTaggerBase::getConfiguration` and :cpp:func:`~TimeTaggerHardware::getSensorData` return a JSON string with partially renamed sensor names.
* Altered :cpp:func:`Countrate::getData` to return ``NaN`` (Not a Number) for zero capture durations.
* Uses :class:`python:enum.Enum` as base class for all enumerators in the Python wrapper (Python >= 3.5).
* Improved the format of the Time Tagger error messages.

.. rubric:: Features

* Added :cpp:func:`~TimeTaggerHardware::setHardwareBufferSize` for the |tt20-name|.
* Added an example and tutorial on how to work with a remote Time Tagger using Python and the Pyro5 package.
* License upgrades can be flashed now for the |tt20-name| via the web application.

.. * Added :cpp:class:`SyntheticSingleTag` as a synthetic way to emit single tags (beta).

.. rubric:: Bug fixes

* Fixed :cpp:func:`~TimeTaggerHardware::setStreamBlockSize` block size heuristic while uploading new configuration.
* Fixed slow performance of :cpp:func:`freeTimeTagger()` in overflow mode.
* Fixed :cpp:func:`~IteratorBase::waitUntilFinished` invoke nodes in LabVIEW examples.
* Fixed error message in the Web Application for non compatible devices.
* Fixed :cpp:func:`~TimeTaggerBase::getConfiguration`. Now it is returning configuration data for :cpp:class:`TimeTaggerVirtual` class.
* Fixed a possible crash on Python interpreter exit while running :class:`CustomMeasurement`.
* Fixed :cpp:func:`~TimeTaggerBase::sync` signaling one block too late. The fix reduces the sync, measurement start and clear times.


V2.8.4 - 04.05.2021
===================

* Fixed the initialization for a Virtual Time Tagger in the Web Application

V2.8.2 - 26.04.2021
===================

* Fixed non appearing option to initialize in HighRes mode after upgrading/flashing the device in the Web Application.

V2.8.0 - 29.03.2021
===================

.. rubric:: Highlights

* High-resolution options for the |ttu-name| series with a timing jitter of down to 4 ps RMS per channel.
* Hardware input delay on the |ttu-name| series with picoseconds accuracy before the conditional filter.
* Reduced CPU load for |ttu-name|.

.. Note:: 
    The release is fully compatible with all |tt20-name| devices. 
    It is compatible with all |ttu-name| devices shipped from March 2021 and all earlier |ttu-name| devices with 8 or less channels without HighRes option. 
    If you received |ttu-name| before March 2021 and it has more than 8 channels or HighRes, it is not compatible with the release. 
    Please contact support to get a free device exchange to be fully compatible again.

.. rubric:: New Time Tagger Ultra features

* Reduced crosstalk and thermal drift on all channels.
* The Time Tagger hardware sound module can be activated and set via :cpp:func:`~TimeTaggerHardware::setSoundFrequency`. It can be used, e.g., for optical alignment purposes (count rate -> frequency).

.. rubric:: Changes

* Split :cpp:func:`~TimeTaggerSource::setInputDelay` into :cpp:func:`~TimeTaggerSource::setDelayHardware` and :cpp:func:`~TimeTaggerSource::setDelaySoftware`.
* :cpp:func:`~TimeTaggerHardware::getChannelList` filter enum renamed to :cpp:enum:`ChannelEdge`.
* :cpp:func:`~TimeTaggerHardware::setNormalization` can now be configured per channel.
* Changed the default port of the WebApp to ``50120`` to avoid collision with Jupiter Notebooks.
* Maximum input frequency of the |ttu-name| is reduced to 475 MHz.
* The deadtime specification of the |ttu-name| changed to 2.1 ns. It can detect events separated by 2 ns with possible loss of some events. 


.. rubric:: Features

* Added a :cpp:class:`TriggerOnCountrate` virtual channel that generates events when a count rate crosses the given threshold value.
* Added support for Python 3.9.
* :cpp:func:`~IteratorBase::waitUntilFinished` and sync have an optional timeout parameter.

.. rubric:: Examples

* Mathematica: Added example for :cpp:class:`FileWriter` and :cpp:class:`TimeTaggerVirtual`.
* LabVIEW: Fixed broken example (#14) and added it to the LabVIEW project.
* C++: Added an example for Custom Virtual Channel.

.. rubric:: Bug fixes

* Histogram can be used with :cpp:func:`~IteratorBase::waitUntilFinished` and :cpp:class:`SynchronizedMeasurements`. :cpp:class:`Histogram` is now derived from :cpp:class:`IteratorBase`.
* Displaying the singleton warning of createTimeTagger just once.
* Fixed string conversion issue for old MATLAB versions.
* Hide "unused argument" warnings in the TimeTagger C++ headers.

V2.7.6 - 26.04.2021
===================

* Fixed RuntimeError "Got the USB error 'UnsupportedFeature'" when calling :cpp:func:`createTimeTagger`

V2.7.4 - 19.04.2021
===================

* Fixed a bug for old |ttu-name| devices, where the Web Application could not apply the license upgrade.

V2.7.2 - 22.12.2020
===================

.. rubric:: Highlights

* Reworked :ref:`api.FLIM` implementation. Versatile high-level functionality with :cpp:class:`Flim` and low-level CPU- and memory- efficient access via :cpp:class:`FlimBase` and callbacks.
* Highly improved :cpp:class:`TimeTaggerVirtual` performance taking use of multithreading.
* Support for direct time tag stream access via :ref:`api.CustomMeasurement` in C# and Python - see examples in the installation folder.


.. rubric:: Improvements

* Added AnyCPU targeted .NET Assembly for C# wrappers. Available in GAC_MSIL and the installation folder.
* More detailed error handling and human-readable error messages.
* Added :doc:`/InDepthGuides/ConditionalFilter` for :cpp:class:`TimeTaggerVirtual`.
* Removed Intel’s `libmmd.dll` library dependency.
* All measurements have the new common method :cpp:func:`~IteratorBase::waitUntilFinished`, which can be used with :cpp:func:`~IteratorBase::startFor`.
* Warnings are printed with time information.
* Cleanup of the C++ measurements’ header file.
* Remote license upgrades can be performed via the web application.
* Reworked Python and C# examples.

.. rubric:: Fixes

* :cpp:class:`Countrate` no longer clears total counts on :cpp:func:`~IteratorBase::start`.
* Implemented :cpp:func:`~TimeTaggerHardware::getChannelList` and :cpp:func:`~TimeTaggerBase::waitForFence` in MATLAB.
* Fixed :cpp:func:`~TimeTaggerSource::setDeadtime` for the TimeTaggerVirtual using :cpp:func:`~TimeTaggerHardware::setTestSignal`.
* Fixed a frequent crash in :cpp:class:`FileWriter` with high data rates and multiple files.
* Fixed a crash in deleting measurements still registered to :cpp:class:`SynchronizedMeasurements`.
* Fixed an unlikely race condition of freeing measurements.

.. rubric:: API changes

* The old :ref:`FLIM<flimreplacement>` class is replaced by a new implementation: :cpp:class:`Flim`. In case you need the old implementation, there is a 1 to 1 replacement, see :ref:`here<flimreplacement>`.
* All methods and measurements now throw exceptions instead of warning on wrong arguments like invalid channels or out-of-range parameters.
* Automatically call freeTimeTagger on del/clear/Dispose in Python/MATLAB/LabVIEW/C# .
* Removed the :cpp:func:`freeAllTimeTagger` method.
* Deprecate the multiple use of :cpp:func:`createTimeTagger` for one physical device. Pass on the timetagger object instead.
* `_Log` is renamed to `LogBase`.
* Our libraries are compiled with VS 2019 now, so at least version 142 of the VC runtime is required in the final application.


V2.7.0 - 01.10.2020
===================

.. rubric:: Highlights

* New measurements are automatically synchronized to the hardware. All data analyzed is guaranteed to be temporal later than the measurement's initialization, start, or clear. Data coming from the internal buffer, which was acquired before the measurement was initialized, started, or cleared, will not be analyzed. Before this release, the .sync() method was required for these tasks.

.. rubric:: Fixes and improvements

* Added a MATLAB example for SynchronizedMeasurements.
* Fixed a bug in MATLAB, creating synced measurements via SynchronizedMeasruements and .getTagger().
* The last datapoint from a scope measurement is not marked as invalid any more.

V2.6.10 - 07.09.2020
====================

.. rubric:: Fixes and improvements

* Fixes input delay, deadtime and test signal generator for the TimeTaggerVirtual.
* Fixes getInvertedChannel with the Swabian Synchronizer and with |ttu-name| 8 devices with the old channel numbering schema.
* x axis is zoomable with Scope measurement.
* Better error handling for non-existent files with TimeTaggerVirtual and FileReader.

.. rubric:: Python

* Changed the constants CoincidenceTimestamp\_ to a Python enum (e.g., CoincidenceTimestamp\_First is now CoincidenceTimestamp.First).

.. rubric:: MATLAB

* Enum for timestamp argument for Coincidence(s) is available via TTCoincidenceTimestamp.

.. rubric:: Linux

* Fix for slow Linux device opening.

V2.6.8 - 21.08.2020
===================

.. rubric:: Highlights

* Support for the Time Tagger Value edition. This is an upgradeable and cost-efficient version of the |ttu-name| for applications with moderate timing precision requirements.

.. rubric:: Webapp

* Added :cpp:class:`Histogram2D` to the measurement list.
* Improved performance and responsiveness for large datasets.
* 32-bit version of the Web Application works again.
* Fixed a bug that data of stopped measurements could not be saved.
* Fixed a bug that settings saved had the file extension .json instead of .ttconf ending.
* Fixed a bug when using falling edges for Time Tagger starting with channel 0.

.. rubric:: Python

* Fixed a bug that some named arguments could not be used anymore.

.. rubric:: API

* Added the method :cpp:func:`SynchronizedMeasurements::unregisterMeasurement` to remove measurements from :cpp:class:`SynchronizedMeasurements`.

.. rubric:: Backend

* Improved performance of the FileWriter, exceeding 100 M tags/s on high-end CPUs.
* Improved binning performance of all histogram measurements: Correlation, FLIM, Histogram, StartStop, TimeDifferences, TimeDifferencesND.
* Fixes a deadlock in the virtual Time Tagger if a measurement accesses some public methods of the Time Tagger.

V2.6.6 - 10.07.2020
===================

.. rubric:: Highlights

* Swabian Synchronizer support. The Synchronizer hardware can combine 8 |ttu-name| devices with up to 144 channels. The combined Time Tagger can be interfaced the very same as it would be only one device.
* Support for custom measurements in Python. Please see the provided programming example in the installation folder for further details.

.. rubric:: Webapp

* Support for the Synchronizer
* Showing error messages from setLogger API in a modal window
* Load/save settings is now supported for the Time Tagger Virtual

.. rubric:: Time Tagger Ultra

* Hardware revision 1.1 now with the same performance enhancement of 500 MHz maximum sync rate, 2ns dead time and better phase stability, as introduced before for Hardware revision > 1.1
* Dropped support for the very first |ttu-name| devices, an error will be shown on initialization - free exchange program available
* More intuitive byte order of the bitmask in setLED
* Small modifications to the hardware channel to channel delay

.. rubric:: Backend

* Coincidence and Coincideces have an optional parameter to select which timestamp should be inserted, the last/first completing the coincidence, the average of the event timestamps, or the first of the coincidence list.
* Fixed .net/MATLAB/LabVIEW wrappers for data with empty 2D or 3D arrays
* Provide a globally registered .NET publisher policy for C#, avoiding the 'wrong dll version' message in Labview when updating the Time Tagger software
* setConditionalFilter throws an exception when invalid arguments are applied
* Hide the warning on fetching the TimeTaggerVirtual license without an internet connection
* DelayedChannel supports a negative delay
* Performance enhancements in StartStop

V2.6.4 - 27.05.2020
===================

.. rubric:: WebApp

* Option to enable logarithmic y-axis scaling for Counter, Histogram, HistogramLogBins and Correlation
* Redesign "Create measurement" dialog with links to the online documentation
* Fixed flickering when switching between plots
* Fixed plotting wrong data range when changing the number of data points
* Added the basic functionality of the TimeTaggerVirtual (test signal only)

.. rubric:: New features and improvements

* Added the test signal to TimeTaggerVirtual
* Support for Ubuntu 20.04 and CentOS 8
* LabVIEW example for FileWriter and FileReader
* Improved MATLAB API for VirtualTimeTagger, adding optional parameters
* Make the data transfer size configurable by .setStreamBlockSize
* Performance improvements for HistogramLogBins
* Slightly improved timing jitter at large time differences for the |tt20-name|
* Time Tagger Application works again with 32 bit operating systems
* Connection errors are shown in the MATLAB console or can be handled with the new logger functionality
* Added custom logger examples for MATLAB/Python/C#

.. rubric:: Changes

* Updated the USB library
* Stop measurements when freeTimeTagger is called (e.g. closes files on dump, isRunning now returns false)
* Reduced polling rate (0.1s) for USB reconnections

.. rubric:: API changes

* Added .setLogger() to attach a callback function for custom info/error logging
* Rename of enumeration ErrorLevel to LogLevel
* Rename of log level constants and with new corresponding integer values

V2.6.2 - 10.03.2020
===================

.. rubric:: Highlights

* TimeTaggerVirtual, FileWriter, and FileReader have reached a stable state
* Improved Linux support (documentation, compiling custom Python wrappers)

.. rubric:: New features

* Added setInputDelay, setDeadtime, getOverflows, and more to the TimeTaggerVirtual
* Add an optional parameter in setConditionalFilter for disabling the hardware delay compensation
* Infinite dumping in Dump for negative max_count
* Create a freeAllTimeTagger() method, which is called by Python atexit
* Reimplement SynchronizedMeasurements as a proxy tagger object, which auto registers new measurements without starting them
* The new SynchronizedMeasurements.isRunning() method returns if any measurement is still running
* Python: Distribute the generated C++ wrapper source for supporting future Python revisions
* C++: New IteratorBase.getLock method returning a std::unique_lock
* C++: Improved exception handling for custom measurements: exceptions now stop the measurement, runSynchronized forwards exceptions to the caller

.. rubric:: API changes

* TimeTagger.getVersion return value is changed to a string
* C++: Use 64 bit integers for the dimensions in the array_out helpers
* C++: Rename the base class for custom measurements from _Iterator to IteratorBase
* C++: Constructors of custom measurements shall call finishInitialization instead of IteratorBase.start
* Python 2.7: Update the numpy C headers to 1.16.1

.. rubric:: Examples and documentation

* Improved Histogram2D example
* Clarify setInputDelay vs DelayedChannel

.. rubric:: Bug fixes

* Relax the voltage supply check in the |ttu-name| hardware revision 1.4
* Use a 1 MB buffer for Dump, FileWriter, and FileReader to achieve full speed especially on network devices
* Fix getTimeTaggerModel on an active device
* Fix deadlock within sync() while the device is disconnected
* Provide the documentation on Linux
* Several fixes and improvements for the FileWriter and TimeTaggerVirtual

.. rubric:: WebApp

* Improved default names for measurements
* Not relying on data stored within the browser any more
* Disabling mouse scrolling within numeric inputs
* Various buxfixes

V2.6.0 - 23.12.2019
===================

.. rubric:: Highlights

* FileWriter: New space-efficient file writer for storing time tag stream on a disk. The file size is reduced by a factor of 4 to 8. Replaces the Dump function.
* Virtual Time Tagger allows to replay previously dumped events back into the Time Tagger software engine.
* Improved behavior in the overflow mode. The hardware now also reports the amount of missed events per input channel and provides the start and the end timestamps of the overflow interval.
* New tutorial on how to implement the data acquisition for a confocal microscope
* New measurement Histogram2D for 2-dimensional histogramming with examples
* Web App: Selectable input units (s/ms/µs/ps) instead of ps only

.. rubric:: Known issues

* FileWriter and FileReader have a low performance on network devices

.. rubric:: API changes

* deprecated TimeTagStreamBuffer.getOverflows() -- use .getEventTypes() instead
* renamed HistogramLogBin.getDataNormalized() to .getDataNormalizedCountsPerPs()
* removed deprecated TimeTagger.getChannels() - use .getChannelList() instead
* removed deprecated CHANNEL_INVALID - use CHANNEL_UNUSED instead
* removed deprecated TimeTagger.setFilter() and TimeTagger.getFilter() - use .setConditionalFilter(), .getConditionalFilter(), and .clearConditionalFilter() instead
* C++: All custom measurement class constructors must be modified, such that the parameter containing the Time Tagger is of the type TimeTaggerBase. This allows for using the custom measurement within a real Time Tagger object and the Time Tagger Virtual.
* C++: The struct Tag includes the type of event and the amount of missed events. They have replaced the overflow field.
* C++/Windows: We additionally distribute binaries for the debug runtime (/MDd)
* MATLAB: TimeTagger.free() is now deprecated, use .freeTimeTagger()

.. rubric:: New features

* Web App: Normalization (counts/s) for the Counter measurement
* getConfiguration returns the current hardware configuration as a JSON string
* added g2 normalization for HistogramLogBins with getDataNormalizedG2
* improved overflow behavior for Countrate due to the missed event counters
* improved overflow handling for the g2 normalization of Correlation and HistogramLogBin
* support for Python version 3.8
* smaller latency on low data rates due to adaptive chunk sizes of <= 20 ms
* support for the |ttu-name| hardware revision 1.4

.. rubric:: Examples

* MATLAB: Faster loading of events from disk for now deprecated Dump file format
* C++: Loading events from disk stored in the new data format
* Labview: Scope example, .NET version redirection
* Mathematica: Improved example
* Python: Added "Stop" button to the countrate figure.

.. rubric:: Bug fixes

* fixed static input delay error with conditional filter enabled since v2.2.4
* added missing TimeTagger.getTestSignalDivider() method
* Scope: Fix the output if one channel has had no events
* resolve overflows after the initialization of the |tt20-name|
* fixes an issue with wrongly sorted events on the reconfiguration of input delays
* always emit an error event on plugging an external clock source
* fixes an unlikely case when the synchronization of the external clock got lost
* the new USB driver version fixes some random data abruption
* TTU1.3: Fix a bug which may select a wrong clock source in the first 21 seconds and wrongly activated ext clock LED
* MATLAB: SynchronizedMeasurements work now in MATLAB, too
* different improvements within the python and C# wrappers
* LED turns off and not red after freeing a Time Tagger
* Dump now releases the file handle after the end of the startFor duration
* Web App: Removed caching issues when up or downgrading the software


V2.4.4 - 29.07.2019
===================
* reduced crosstalk between nonadjacent channels of the |ttu-name|
* fixed a bug leading to high crosstalk with V2.4.2 for specific channels
* fixed a rare clock selection issue on the |tt20-name|
* improved and more detailed documentation
* new method :cpp:func:`Countrate::getCountsTotal`, which returns the absolute number of events counted
* new Mathematica quickstart example
* new :cpp:class:`Scope` example for LabVIEW
* support of the |tt20-name| series with hardware revision 2.3
* release the Python GIL while in the Time Tagger engine code
* fixed a bug in :cpp:class:`ConstantFractionDiscriminator`, which could cause that no virtual tags were generated


V2.4.2 - 12.05.2019
===================
* support of the |ttu-name| series with hardware revision 1.3
* improve performance of short pulse sequences on the |tt20-name| series
* improve overflow behavior at too high input data rates
* fix the name of the 'SynchronizedMeasurements' measurement class

V2.4.0 - 10.04.2019
===================

.. rubric:: Libraries

* 32 bit C++ library added
* C++ and .NET libraries renamed and registered globally

.. rubric:: API

* virtual constant fraction discriminator channel 'ConstantFractionDiscriminator' added
* 'TimeDifferenceND' added for multidimensional time differences measurements
* faster binning in 'TimeDifferences' and 'Correlation' measurements
* improved memory handling for 'TimeTageStream'
* improved Python library include
* fixed '.getNormalizedData' for 'Correlation' measurements
* various minor bug fixes and improvements

.. rubric:: Examples

* LabVIEW project for 32 and 64 bit
* improved LabVIEW examples

.. rubric:: Time Tagger Ultra

* 10 MHz EXT input clock detection enabled
* internal buffer size can be increased from 40 MTags to 512 MTags with 'setHardwareBufferSize'
* reduced crosstalk and timing jitter
* increased maximum transfer rate to above 65 MTags/s (Intel 5 GHz CPU on 64 bit)
* various performance improvements
* reduced deadtime to 2 ns on hardware revision >= 1.2

.. rubric:: Time Tagger 20

* 166.6 MHz EXT input clock detection enabled

.. rubric:: Operating systems

* equivalent support for Windows 32 and 64 bit, Ubuntu 16.04 and 18.04 64 bit, CentOS 7 64 bit

V2.2.4 - 29.01.2019
===================
* fix the conditional filter with filter and trigger events arriving within one clock cycle
* fix issue with negative input delays
* calling .stop() while dumping data stops the dump and closes the file
* fix device selection on reconnection after transfer errors
* synchronize tags of falling edges to their rising ones

V2.2.2 - 13.11.2018
===================
* Removed not required Microsoft prerequisites.
* 32 bit version available

V2.2.0 - 07.11.2018
===================

.. rubric:: General improvements

* support for devices starting with channel 1 instead of 0
* under certain circumstances, the crosstalk for the |tt20-name| of channel 0-2, 0-3, 1-2, and 1-3 was highly increased, which has been fixed now
* updated and extended examples for all programming languages (Python, MATLAB, C#, C++, LabVIEW)
* C++ examples for Visual Studio 2017, with debug support
* documentation for virtual channels
* Web app included in the 32 bit installer
* Linux package available for Ubuntu 16.04
* Support for Python 3.7

.. rubric:: API

* 'HistogramLogBin' allows analyzing incoming tags with logarithmic bin sizes.
* 'FrequencyMultiplier' virtual channel class for upscaling a signal attached to the Time Tagger. This method can be used as an alternative to the 'Conditonal Filter'.
* 'SynchronizedMeasurements' class available to fully synchronize start(), stop(), clear() of different measurements.
* Second parameter from 'setConditionalFilter' changed from 'filter' to 'filtered'.

.. rubric:: Web application

* full 'setConditionalFilter' functionality available from the backend within the Web application


V2.1.6 - 17.05.2018
===================
fixed an error with getBinWidths from CountBetweenMarkers returning wrong values

V2.1.4 - 21.03.2018
===================
fixed bin equilibration error appearing since V2.1.0

V2.1.2 - 14.03.2018
===================
fixed issue installing the MATLAB toolbox

V2.1.0 - 06.03.2018
===================
.. rubric:: Time Tagger Ultra 

* efficient buffering of up to 60 MTags within the device to avoid overflows

V2.0.4 - 01.02.2018
===================
.. rubric:: Bug fixes

* Closing the web application server window works properly now


V2.0.2 - 17.01.2018
===================

.. rubric:: Improvements

* MATLAB GUI example added
* MATLAB dump/load example added

.. rubric:: Bug fixes

* dump class writing tags multiple times when the optional channel parameter is used
* Counter and Countrate skip the time in between a .stop() and a .start() call
* The Counter class now handles overflows properly. As soon as an overflow occurs the lost data junk is skipped and the Counter resumes with the new tags arriving with no gap on the time axis.

V2.0.0 - 14.12.2017
===================

.. rubric:: Release of the Time Tagger Ultra

.. Note:: The input delays might be shifted (up to a few hundred ps) compared to older driver versions.

.. rubric:: Documentation changes

* new section 'In Depth Guides' explaining the hardware event filter 

.. rubric:: Webapp

* fixed a bug setting the input values to 0 when typing in a new value
* new server launcher screen which stops the server reliably when the application is closed


V1.0.20 - 24.10.2017
====================

.. rubric:: Virtual Channels

* DelayedChannel clones and optionally delays a stream of time tags from an input channel
* GatedChannel clones an input stream, which is gated via a start and stop channel (e.g. rising and falling edge of another physical channel)

.. rubric:: API

* startFor(duration) method implemented for all measurements to acquire data for a predefined duration
* getCaptureDuration() available for all measurements to return the current capture duration
* getDataNormalized() available for Correlation
* setEventDivider(channel, divider) also transmits every nth event (divider) on channel defined

.. rubric:: Webapp

* label for 0 on the x-axis is now 0 instead of a tiny value

.. rubric:: C++ API:

* internal change so that clear_impl() and next_impl() must be overwritten instead of clear() and next()

.. rubric:: Other bug fixes/improvements

* improved documentation and examples

V1.0.6 - 16.03.2017
===================

.. rubric:: Web application (GUI)

* load/save settings available for the Time Tagger and the measurements
* correct x-axis scaling
* input channels can be labeled
* save data as tab separated output file (for MATLAB, Excel, ... import)
* fixed: saving measurement data now works reliably
* fixed: 'Initialize' button of measurements works now with tablets and phones

.. rubric:: API

* direct time stream access possible with new class TimeTagStream (before the stream could be only dumped with Dump)
* Python 3.6 support
* better error handling (throwing exceptions) when libraries not found or no Time Tagger attached
* setTestSignal(...) can be used with a vector of channels instead of a single channel only
* Dump(...) now with an optional vector of channels to explicitly dump the channels passed
* CHANNEL_INVALID is deprecated - use CHANNEL_UNUSED instead
* Coincidences class (multiple Coincidences) can be used now within MATLAB/LabVIEW
 
.. rubric:: Documentation changes

* documentation of every measurement now includes a figure
* update and include web application in the quickstart section

.. rubric:: Other bug fixes/improvements

* no internal test tags leaking through from the initialization of the Time Tagger
* Counter class not clearing the data buffer in time when no tags arrive
* search path for bitfile and libraries in Linux now work as they should
* installer for 32 bit OS available


V1.0.4 - 24.11.2016
===================

.. rubric:: Hardware changes

* extended event filter to multiple conditions and filter channels
* improved jitter for channel 0
* channel delays might be different from the previous version (< 1 ns)

.. rubric:: API changes

* new function setConditionalFilter allows for multiple filter and event channels (replaces setFilter)
* Scope class implements functionality to use the Time Tagger as a 50 GHz digitizer
* Coincidences class now can handle multiple coincidence groups which is much faster than multiple instances of Coincidence
* added examples for C++ and .net

.. rubric:: Software changes

* improved GUI (Web application)

.. rubric:: Bug fixes

* MATLAB/LabVIEW is not required to have the Visual Studio Redistributable package installed

V1.0.2 - 28.07.2016
===================

.. rubric:: Major changes:

* LabVIEW support including various example VIs
* MATLAB support including various example scripts
* .net assembly / class library provided (32 and 64 bit)
* WebApp graphical user interface to get started without writing a single line of code
* Improved performance (multicore CPUs are supported)

.. rubric:: API changes:

* reset() function added to reset a Time Tagger device to the startup state
* getOverflowsAndClear() and clearOverflows() introduced to be able to reset the overflow counter
* support for python 3.5 (32 and 64 bit) instead of 3.4

V1.0.0
======

initial release supporting python
