Release 2.4.0 - 05.12.2017
INCOMPATIBLE CHANGES
- DAVIS: require new firmware version 4 and logic version 9912.
- Dynap-SE: require new logic version 5.
- devices/dynapse.h: the chip IDs are now mapped to be 0,1,2,3 for
  U0,U1,U2,U3 respectively, making them as easy to use and loop over
  as the core IDs. The defines have been updated, so if you've been
  properly using them, no change is needed other than a recompile.
- src/dynapse.c: spike events coming from a Dynap-SE's chip ID 0 (U0) do
  now have a chip ID of 0, the same as the chip ID used to configure the
  system, removing this small inconsistency. All usages of
  'DYNAPSE_CONFIG_DYNAPSE_U0+1' must now remove the '+1', chip U0 is not
  to be treated differently anymore in regards to its USB output chip ID.
- events/spike.h: caerSpikeEventGetX() and caerSpikeEventGetY() were
  inverting the meaning of column/row, resulting in inconsistencies
  when using those two functions in comparison to system configuration.
  This has now been corrected, and the functions moved to devices/dynapse.h
  with the new names of caerDynapseSpikeEventGetX/Y(), due to them being
  specific to the architecture of the Dynap-SE neuromorphic processor.
  Now both chips, cores and neurons, as interpreted through these functions,
  are set out in row-major order (similar to computer vision).
- devices/dynapse.h: the caerDynapseWriteSram() function is being deprecated
  in favour of its newer variant caerDynapseWriteSramN().
- devices/dynapse.h: removed define DYNAPSE_CONFIG_SRAMROW.
  Use DYNAPSE_CONFIG_NUMNEURONS and DYNAPSE_CONFIG_NUMSRAM_NEU.
- devices/dynapse.h: removed defines DYNAPSE_MAX_USER_USB_PACKET_SIZE,
  DYNAPSE_CONFIG_MAX_USB_TRANSFER and DYNAPSE_CONFIG_MAX_PARAM_SIZE.
  Those are internal implementation details, and caerDynapseSendDataToUSB()
  now accepts arbitrarily sized data to send, the user does not have to
  divide it in chunks of a particular size anymore.
- devices/dynapse.h: improved and changed 'struct caer_bias_dynapse' to
  reflect actual biasing of device correctly.
- devices/device.h: CAER_HOST_CONFIG_PACKETS_MAX_CONTAINER_PACKET_SIZE's
  default value has been changed to zero, disabling the size division of
  packets by default. Packet size is now dictated, by default, only by
  the time interval, with a value of 10 milliseconds.

NEW FEATURES
- Packaging: packages for Fedora, Debian and Gentoo Linux, as well as
  MacOS X via Homebrew are now available for each new libcaer release.
  For more information please visit:
  https://inilabs.com/support/software/libcaer/#h.qp4tgs7gb5k
- Python bindings: added bindings for Python 2/3 using SWIG. See
  bindings/python_swig/ and bindings/python_swig/examples/ for examples.
  NOTE: this needs a patched Swig, see 'https://github.com/swig/swig/pull/1166'.
- CMake: added support for generating RPM/DEB files via CPack, to
  easily be able to package one's own build.
- DAVIS/Dynap-SE: added support for AER and Multiplexer statistics, to
  examine number of events received, filtered and dropped.
- DAVIS: added support for hardware DVS Refractory Period filter on
  newer FX3 based devices.
- DAVIS: added support for DVS ROI filtering.
- DAVIS: added support for APS Quad-ROI (up to four independent
  regions of interest can be configured and enabled). The number of
  supported ROI regions is defined with DAVIS_APS_ROI_REGIONS_MAX.
- devices/davis.h: added 'caerDavisROIConfigure()' function to atomically
  and efficiently configure and enable ROI regions.
- devices/davis.h: expanded 'struct caer_davis_info' to account for the
  above new features: 'dvsHasROIFilter', 'dvsHasStatistics' and 'muxHasStatistics'.
- devices/dynapse.h: expanded 'struct caer_dynapse_info' to account for
  the above new features: 'aerHasStatistics' and 'muxHasStatistics'.
- devices/device.h: added 'caerDeviceConfigGet64()' to read 64-bit
  configuration parameters, needed for statistics support.
- src/dynapse.c: the Dynap-SE caerDeviceSendDefaultConfig() function now
  performs full initialization of the device and its chips. To reliably
  work with the device, make sure to always call this before setting
  your own custom configuration afterwards.
- devices/dynapse.h: added caerDynapseWriteSramN() function, uses global
  neuron ID [0,1023] instead of core ID/neuron ID syntax. Arguments are
  also directly compatible with caerDynapseGenerateSramBits().
- devices/dynapse.h: renamed define DYNAPSE_CONFIG_NUMCAM to
  DYNAPSE_CONFIG_NUMCAM_NEU to better explain what it is.
- devices/dynapse.h: added caerBiasDynapseGenerate() and caerBiasDynapseParse()
  functions to handle the improved 'struct caer_bias_dynapse' and
  transform it to/from the bit-wise bias configuration representation.
- devices/dynapse.h: added caerDynapseGenerateSramBits() function to
  generate SRAM configuration bits based on input arguments.
- devices/dynapse.h: added caerDynapseCoreXYToNeuronId() and
  caerDynapseCoreAddrToNeuronId() functions to calculate chip global
  neuron addresses (range [0,1023]).
- devices/dynapse.h: added caerDynapseSpikeEventFromXY() function to
  have a reverse transformation to caerDynapseSpikeEventGetX/Y().
- devices/dynapse.h: added DYNAPSE_CONFIG_TAU2_SET, DYNAPSE_CONFIG_TAU1_RESET
  and DYNAPSE_CONFIG_TAU2_RESET defines for caerDeviceConfigSet()
  usage, to allow configuration of which neuron leakage bias to use.
- events/common.h: added caerGenericEventCopy() function to copy
  events from one place in memory to another.
- events/*.h: added two new functions 'caerXXXEventPacketFromPacketHeader()'
  and 'caerXXXEventPacketFromPacketHeaderConst()' to transform a packet
  header pointer to the proper event packet pointer. This checks the
  type, and is needed for proper bindings support.
- ringbuffer.h/hpp: the ring-buffer functions for producer-consumer
  high-performance communication between two threads are now exposed
  as part of the API, to allow re-use in other projects such as cAER.
- examples/dynapse_simple.c: added simple example for Dynap-SE access.
- examples/davis_cvgui.cpp: added example for converting frames to OpenCV
  Mat and visualizing them using OpenCV's GUI.
- src/timestamps.h: added timestamp debugging code, to measure drift
  between host and device. Only enabled in debug builds.
- src/davis.h: improved APS_DEBUG_FRAME support, now splits signal and
  reset read for debugging over all ROI regions.
- New device: support for upcoming DAVIS128 Raspberry-Pi integration.
- events/matrix4x4.h: new event type for 4x4 Matrices.
- C++ support: added toString() for devices.

BUG FIXES
- devices/dynapse.h: major API documentation cleanup.
- devices/dynapse.h: several function parameters of integer type were
  sized more correctly to reflect the range of their arguments.
- src/dynapse.c: DYNAPSE_CONFIG_CLEAR_CAM now clears all 64 CAMs for
  each neuron in a chip, resulting in all CAMs being fully cleared.
- Dynap-SE: default low-power biases are now the same across all cores.
- DAVIS: improved default timings for APS, providing better image quality,
  especially on new chips with internal ADC support.
- DAVIS/AutoExposure: fixed auto-exposure on FX3 devices, sometimes didn't
  run due to rounding errors when correcting for clock skew between
  parameters sent to the devices and parameters received back.
- events/frame.h: added documentation that using the assignment operator
  to copy Frame events is not possible, caerGenericEventCopy() should
  be used instead. The C++ variant deletes the assignment operator to
  enforce this. This fixes issue #26.
- src/usb_utils.c: fixed shutdown callback not being called on MacOS X.
  Also fixed possible dead-lock on USB transfer re-submit on Windows.
  This fixes issue #32.
- src/date_exchange.h: prevent possible dead-lock inside dataExchangeGet(),
  if signals are delivered always while not sleeping.
- portable_endian.h, portable_time.h: fixed stand-alone compilation.
- Fixed many code quality warnings by Sonarcloud.
- Travis-CI: fixed automatic test build issues on MacOS X.


Release 2.3.0 - 30.06.2017
INCOMPATIBLE CHANGES
- device.hpp: removed C++ dataStart() method with no arguments. As with
  the C interface, only the variant with all notification arguments
  remains. This is to ensure users think about the possible arguments,
  especially with regards to the shutdown notification, which usually
  should be defined and used.
- Dynap-SE: requires new logic version 4. Adds new features related
  to DAVIS integration and spike generation/playback.

NEW FEATURES
- CI: test builds are now done by Travis-CI and results sent off to
  Sonarcloud for code quality analysis.
- Examples: added example to show how to bias a DAVIS camera and
  configure it for external AER control (davis_enable_aer.cpp).
- Examples: added shutdown notification handler to all examples.

BUG FIXES
- CMake: fix CMake 3.X support on MacOS X.
- caerDeviceDataGet(): now properly returns NULL in blocking mode when
  the device goes away or stops sending any data, thus preventing a
  dead-lock when using blocking mode with this function.


Release 2.2.0 - 13.06.2017
INCOMPATIBLE CHANGES
- frame_utils.h: the frame utilities API was simplified. Now only one
  function for demosaic support respective contrast enhancement support
  exists, with the type (standard or OpenCV) as an enumeration argument.

NEW FEATURES
- Added support for the eDVS4337 serial port device. Serial port devices
  require the libserialport library (version 0.1.1 or newer), and as such
  are optional; enable them by passing -DENABLE_SERIALDEV=1 to cmake.
  The presence of this support can be verified with the libcaer.h define
  LIBCAER_HAVE_SERIALDEV. When disabled, the API for serial devices is
  still available, but will simply return false/NULL on any operation to
  indicate missing support. For usage details, see 'examples/edvs_simple.c'.
  To open the device, use the new caerDeviceOpenSerial() function with
  'deviceType' set to 'CAER_DEVICE_EDVS'. The usual caerDeviceOpen()
  will only work for supported USB devices. All other functions, such
  as caerDeviceDataGet(), remain the same and work for all device types.
- DAVIS Examples: added example for frame parsing. Thanks to Jonathan Müller.

BUG FIXES
- DVS128/DAVIS/Dynap-se: fix log messages on failure to open device and
  on successful shutdown.
- Dynap-se: calculate rate in caerDynapseWritePoissonSpikeRate() as float.
- IMU and PointXD Events: fix conversion of floating-point data to/from
  little-endian in-memory format. On MacOS X, this resulted in a function
  call with integer arguments and thus conversion to an integer value,
  destroying the original floating-point value.


Release 2.1.5 - 03.06.2017
NEW FEATURES
- Dynap-se: added support for experimental DYNAPSE_CONFIG_POISSONSPIKEGEN
  control (thanks to Carsten Nielsen).

BUG FIXES
- DAVIS FX3: require new logic revision 9910 for FX3 devices.
  This fixes a bug in timestamp synchronization between multiple
  cameras, and improves precision of some time related parameters,
  namely APS_EXPOSURE, APS_FRAME_DELAY and USB_EARLY_PACKET_DELAY.
- DAVIS: fix incorrect extra log message when opening FX3 devices.


Release 2.1.4 - 30.05.2017
BUG FIXES
- C++: functions defined in C++ header files, such as happens in log or
  utils, need the inline keyword to allow the linker to resolve symbols
  properly. Fixes #14.


Release 2.1.3 - 28.05.2017
NEW FEATURES
- DAVIS: new device type CAER_DEVICE_DAVIS is now available, handles both
  FX2 and FX3 board-based devices transparently.

BUG FIXES
- C++ devices/usb.hpp: add missing std::string include.
- Devices: log failure to put new event packet containers on ring-buffer for
  consumption by clients with higher log-level of CAER_LOG_NOTICE.


Release 2.1.2 - 24.05.2017
BUG FIXES
- FrameUtils/C++ FrameEvent: fix detection of OpenCV presence.
- CMake: add dependency on libm for math.h functions.


Release 2.1.1 - 23.05.2017
BUG FIXES
- AutoExposure: disable debug logging.
- AutoExposure: get out of highly over/under-exposed situations much faster.


Release 2.1.0 - 22.05.2017
INCOMPATIBLE CHANGES
- usb.h: the 'dataShutdownNotify' callback of caerDeviceDataStart() will only
  be called on exceptional shutdowns now. Normal shutdowns, such as those from
  calling caerDeviceDataStop(), will not execute the callback anymore.
  The documentation for caerDeviceDataStart() and caerDeviceDataStop() has been
  updated accordingly.
- DAVIS: requires new logic revision 9880.

NEW FEATURES
- davis.h: added automatic exposure control, can be turned on/off with
  the DAVIS_CONFIG_APS_AUTOEXPOSURE configuration parameter, defaults to off.
- EventPackets (C/C++): added caerEventPacketGetDataSize() and
  caerEventPacketGetSize() functions to easily get packet size in bytes.
- C++ FrameEvent: added new function getOpenCVMat() to frame event, if
  OpenCV is enabled. Returns a cv::Mat representing the frame's pixels, with
  support for deep-const by cloning (can be disabled for efficiency).
- C++ Utils: enhanced makeUniqueFromCStruct() and makeSharedFromCStruct() to
  also allow a 'takeMemoryOwnership' parameter that is forwarded to the event
  packet constructors; it defaults to true like the constructors themselves.
- Devices (C/C++): added new CAER_HOST_CONFIG_LOG config module with parameter
  CAER_HOST_CONFIG_LOG_LEVEL to set per-device log-level; by default the
  log-level is equal to the current global one at device opening.

BUG FIXES
- libcaer.hpp: undefine log-level names to avoid name clashes.
- DAVIS: removed variable APS ADC Shift, is not used by any camera currently
  offered, all have 10 bits precision.
- DAVIS: fix black APS pixels on very high illumination.
- DAVIS240: fix low range of APS pixels due to reduced ADC dynamic range.
- USB: libusb-based USB communication completely rewritten, now there is one
  thread responsible for USB event handling only, while transfers are sent,
  started/stopped etc. from other threads. This avoids possible dead-locks,
  or other threads stealing the USB event handling, or new settings not being
  sent to the device under certain load conditions. This required a small
  change in the API, please see "INCOMPATIBLE CHANGES" above for more details.


Release 2.0.2 - 27.04.2017
NEW FEATURES
- Logging: added caerLogFileDescriptorsGetFirst(), caerLogFileDescriptorsGetSecond()
  functions to get the two file descriptors where log messages go to.
- Logging: added caerLogVAFull() function to allow full control over all
  parameters involved in logging, especially the log-level.
- Dynap-se: added support for experimental DYNAPSE_CONFIG_SPIKEGEN
  control and improved DYNAPSE_CONFIG_SRAM control (thanks to Carsten Nielsen).
- Updated C++ examples to use C++ logging functions.
- Updated C++ interface to reflect above changes.


Release 2.0.1 - 16.03.2017
NOTE: this release is numbered 2.0.1 and not 2.0.0, because 2.0.0 was the
development version. To ensure people can depend on the now actually released
version, the version number was increased to 2.0.1 for the official release.

INCOMPATIBLE CHANGES
- The Frame Event format changed to have the origin (0, 0) in the upper left
  corner of the image, following standard computer graphics conventions now.
  Before it was in the lower left corner, following the OpenGL convention.
  This was changed to more easily be able to benefit from the wealth of
  computer graphics libraries available, such as OpenCV.
  caerFrameEventGetPixelArrayCGFormat() has been removed as a consequence.
- The Polarity Event format has also changed its origin to the upper left corner.
- Device INFO structures have additional data members now, be sure to
  recompile anything depending on those!
- CAER_HOST_CONFIG_PACKETS_MAX_*_SIZE and MAX_*_INTERVAL options have been
  removed, the whole data packeting system is now much simpler with only
  two configuration options to control it:
  - CAER_HOST_CONFIG_PACKETS_MAX_CONTAINER_PACKET_SIZE
  - CAER_HOST_CONFIG_PACKETS_MAX_CONTAINER_INTERVAL
  These act at the event packet container level. See packetContainer.h
  documentation on more information for how this works.
- Removed LIBCAER_LOG_NONE define from headers, it is now not possible
  to completely suppress log output anymore.
- caerGenericEventGetEvent() has had its bounds restricted to [0,eventNumber[
  instead of [0,eventCapacity[.
- Event packet copy functions have been renamed to:
  - caerEventPacketCopy()
  - caerEventPacketCopyOnlyEvents()
  - caerEventPacketCopyOnlyValidEvents()

NEW FEATURES
- Support for the iniLabs DYNAP-SE neuromorphic chip was added.
- Added new event type Spike Event for spiking neurons.
- Added new event types Point1D, Point2D, Point3D and Point4D to
  hold floating point data in multiple dimensions.
- New event packet functions were added:
  - caerEventPacketEquals()
  - caerEventPacketClear()
  - caerEventPacketClean()
  - caerEventPacketResize()
  - caerEventPacketGrow()
  - caerEventPacketAppend()
- Full native support for C++11 through header library (libcaercpp).
- Improved const-qualification of functions, to allow better compile
  time checks for read-only data. A GetEventConst() function was added
  to each event type as part of this, to get read-only events.
- Const, reverse and const-reverse iterators were added to all event types.
- davis.h: added support for stereo microphones on DAVIS346mini.
- davis.h: added support for extra signal detectors.
- network.h: added header with functions to help parse AEDAT 3.X
  network stream headers.
- frame.h: added support for more color filter configurations.
- packetContainer.h: better documentation, now tracks lowest and highest
  timestamps contained, as well as number of total and valid events.
- packetContainer.h: added caerEventPacketContainerUpdateStatistics() to
  update above statistics. Automatically called on each addition or
  removal of an event packet from the container.
- packetContainer.h: added caerEventPacketContainerFindEventPacketByType*(),
  caerEventPacketContainerCopyAllEvents() and caerEventPacketContainerCopyValidEvents()
  functions to search for event packets by type and to make deep-copies of them.
- special.h: added new Special Event types, to support extra signal detection
  schemes and add Frame Event related timing information.
- special.h: added caerSpecialEventPacketFindEventByType*() and
  caerSpecialEventPacketFindValidEventByType*() functions to search for
  a specified type of special event.
- libcaer.h: added LIBCAER_VERSION, LIBCAER_NAME_STRING,
  LIBCAER_VERSION_STRING and LIBCAER_HAVE_OPENCV defines.
- log.h: added caerLogVA() function to pass va_list arguments directly.


Release 1.0.3 - 28.03.2016
INCOMPATIBLE CHANGES
- davis_fx2.c: removed specific FX2 code, now uses same backend as FX3
  for sending all configuration values, due to new firmware version 3
  for FX2 DAVIS small-board cameras. A firmware update is required,
  please follow the instructions at http://inilabs.com/support/reflashing/.

NEW FEATURES
- frame.h: add function caerFrameEventGetPixelArrayCGFormat() to
  Frame Event, allows to get a copy of the pixels array in the
  standard computer graphics format (pixel (0, 0) in upper left
  corner) efficently.
- davis.h: add DAVIS_CONFIG_APS_ADC_TEST_MODE parameter to APS module.


Release 1.0.2 - 08.01.2016
IMCOMPATIBLE CHANGES
- frame.h: rename channel number to color channels and add color
  filter information, to better specify the information needed
  to reconstruct color frames. The 'enum caer_frame_event_color_channels'
  and 'enum caer_frame_event_color_filter' hold the possible values.
  This change is backwards-compatible with older frame format!
- davis.h, dvs128.h: changed info data structure's integers to be
  signed for better cross-language compatibility. Also 'deviceID'
  can now be compared directly with 'sourceID' from event packets.
- davis.h: changed type of 'apsColorFilter' in info data structure
  to take advantage of new 'enum caer_frame_event_color_filter'.

NEW FEATURES
- common.h: add generic functions for event packet copying, with
  support for packet size reductions (copy only valid).
- libcaer.h: add generic clear, get and set functions for bitfields,
  and use them in all the event functions to avoid errors.
- config.h: add device configuration event type, for tracking
  of device configuration changes in the event stream.
- log.c: add timezone information to log message time information.
- dvs128_simple.cpp, davis_simple.cpp: add C++11 example variants.
- Enable more Clang compiler warnings.

BUG FIXES
- davis_common.c: only update the ROI size information if ROI
  updates actually came in from the device.
- Fix and improve documentation, especially for the frame event.
- Fix off-by-one in event's GetEvent() function's warning log message.
- device.c: mark global function pointer arrays static.
- common.h, frame.h: fix compilation of inline functions in
  strict C++11 mode.


Release 1.0.1 - 06.11.2015
INCOMPATIBLE CHANGES
- Requires firmware version 2 and logic revision 7449.
- usb.h: improved caerDeviceDataStart() API to also allow for
  notification of data acquisition shutdown, to be able to react
  to abnormal shutdown cases, like when a device is unplugged.
- frame.h: changed in-memory format for easier handling and compatibility
  with the other event formats (all-in-one memory block).
- davis.h: rename DAVIS240 APSOVERFLOWLEVEL to APSOVERFLOWLEVELBN.

NEW FEATURES
- Headers are C++ compatible and stand-alone now.
- MacOS X support.
- Added pkg-config file for library.
- Full API documentation (see docs/ for PDF).
- Various cmake/build improvements. Support out-of-tree builds.
- Add iterator macros for EventPackets.
- frame.h: added ROI region ID tracking, as well as ROI position.
  Added caerFrameEventGetExposureLength() and caerFrameEventGetTimestamp(),
  which is defined as the median of the exposure times.
  Added caerFrameEventPacketGetPixelsSize() and caerFrameEventPacketGetPixelsMaxIndex()
  for EventPacket-level size information.
  Added caerFrameEventGetPixelsSize() and caerFrameEventGetPixelsMaxIndex()
  for Event-level size information.
- log.h: added caerLogFileDescriptorsSet() to allow logging to
  up to two different file descriptors (defaults to STDERR only).
- davis.h: added chipID check macros.
- davis.h: added DAVIS_CONFIG_APS_SNAPSHOT to take one frame snapshots.
- dvs128.h: added DVS128_CONFIG_DVS_TS_MASTER to select timestamp
  master or slave behavior (timestamp synchronization).
- davis_common.c: added support for outputting only reset read or
  signal read frames, for debugging purposes.
- c11threads_posix.h: C11-compatible thread abstraction, for
  both Linux and MacOS X, based on POSIX Threads.

BUG FIXES
- Relaxed atomic operations memory constraints for better
  performance on weakly-ordered architectures (like ARM).
- log.c: call tzset() before localtime_r(), as per standard.
- davis_common.c: improved Region of Interest support (APS).
- davis_fx2.c: keep GlobalShutter flag correctly in-sync.
- davis_fx3.c: fixed support for new FX3 devices.
- packetContainer.h: handle container being NULL by returning NULL.


Release 1.0.0 - 02.10.2015
- Initial release.
