---------------------------------------------- About the current version ---------------------------------------------- Release notes ---------------------------------------------- 0.80 beta - experimental branch ============================================== * Started to enable QDSpy running under Linux (work in progress) * Added a `shader example `_ that shows how to deal with display aspect ratio * Started `Wiki `_. 0.78 beta ============================================== * Module ``Devices.lightcrafter`` now contains the essential API commands required to setup the pattern mode. For details and example scripts, see :doc:`lightcrafter`. * "LEDs" tab renamed to "LightCrafter(s)", buttons to inquire the status of up to two lightcrafters added (both must be connected via USB). The info is currently printed into the shell that runs QDSpy. * Two example "stimulus" scripts added: ``__toGB_8bit_patternMode.py`` switches lightcrafter #0 to pattern mode, whereas ``__toVideoMode.py`` switches lightcrafter #0 back to video mode. For details on scripts, see :doc:`lightcrafter`. Note when running these scripts from the QDSpy GUI, it will complain that it cannot compile the scripts. This is because these scripts do not contain any stimulus instructions; the python code that configures the lightcrafter is just directly executed. Executing these scripts from QDSpy GUI is the same as running them from a shell. 0.77 beta (May 2019) ============================================== * Possibility added to mirror the two screens separately in screen overlay mode, using additional `QDSpy.ini` parameters ``bool_v_flip_screen1``, ``bool_h_flip_screen1``, ``bool_v_flip_screen2``, and ``bool_h_flip_screen2``. When updating QDSpy, please follow the instructions about new `QDSpy.ini` parameters below. * Changes by `Tom Boissonnet `_: * Now computes hash only when starting the stimulus; GUI becomes more responsive with large pickle files. * Stage offset, scale and rotation are now logged * `.pickle` files in the stimulus folder are now ignored by GitHub (added `Stimuli/*.pickle` to `.gitignore`) * Additional shader * Bug fix: In Python 3.7, terminating QDSpy -> `RuntimeError: dictionary changed size during iteration`; fixed. * Bug fix: Default values for Arduino user-defined buttons fixed. * Bug fix: Issue with loading gamma LUTs via `windll.gdi32.SetDeviceGammaRamp` fixed. * New digital I/O feature added: In addition to the marker pin, two user output pins can be now be defined in the QDSpy.ini file. These allow to control simple external TTL-compatible hardware from the GUI, which now contains two user buttons to switch the signals at the user pins. A simple example application is controlling a drug puffing system. Note that this feature is not yet implemented for the Arduino as I/O device. See :doc:`inifile` for details on the new parameters. * Changes by `Tom Boissonnet `_: * Bug fix in probing center feature. * Parameters added to QDSpy.ini file: ``float_gui_time_out`` (in seconds), which deals with potential problems when loading very large stimuli; ``str_antimarkerrgba``, defining the colour of the "anti" marker, which "blanks" the marker area on the screen when the marker is not displayed. This prevents large stimuli from interacting with the marker display. * **IMPORTANT**: The `QDSpy.ini` file contains new parameters, which need to be added to the existing `QDSpy.ini` file, otherwise QDSpy will crash. The easiest way to do so, is to rename the file to, for example,`QDSpy.ini_COPY`. Then start QDSpy and let it generate a fresh configuration file. Open both the new file and your copy in parallel and change the parameters in the new file according to your previous settings. See see :doc:`inifile` for further details on the new parameters. * Small bug fix in the GUI. v0.76 beta ============================================== * Bug fix: Probing center feature (`Tom Boissonnet `_) * Experimental support for an Arduino as low-cost digital I/O device (timing not yet thoroughly tested!). * **New feature** contributed by `Tom Boissonnet `_ (Asari lab, EMBL Monterotondo): It is found on the GUI tab "Tools". When pressing "Start probing center", a spot appears on the stimulus screen. The spot can be moved (dragged) with the left mouse button pressed. Changing the spot parameters in the GUI changes the spot immediately. The tool can, for example, be used to roughly explore the receptive field of a retinal ganglion cell. The probing mode can be left by either pressing the right mouse button (saving the position to the log), or by pressing "Abort" in the GUI. * **IMPORTANT**: The QDSpy.ini file contains (a) new parameter(s), which need to be added to the existing QDSpy.ini file, otherwise QDSpy will crash. The easiest way to do so, is to rename the file to, for example, QDSpy.ini_COPY. Then start QDSpy and let it generate a fresh configuration file. Open both the new file and your copy in parallel and change the parameters in the new file according to your previous settings. See see :doc:`inifile` for further details on the new parameters. v0.75 beta (April 2017) ============================================== * Bug fix: Problems with "ghost images" when playing more than one movie or video were fixed. Now movie/video objects that are restarted before the previous run was finished are first automatically stopped and ended. Also, movies/videos were also forwarded for no-duration scenes (e.g. a change in object colour), which led to changes in the movie/video frame rate. This should now be fixed as well. * Bug fix: The first command in a loop was ignored; this is fixed now. * Bug fix: ``__autofile.py`` handling was restructured: When no ``__autorun.py`` file exists in the ``.\Stimuli`` folder, QDSpy warns and runs a default instead. An ``__autorun.py`` does no longer have to be present in ``.\Stimuli``. * **New feature**: Using the "screen overlay mode", stimuli with up to 6 different wavelengths (hexachromatic) can be shown by extending the presentation area to two neighbouring display devices (i.e. two lightcrafters with different sets of LEDs). See :doc:`inifile` for details on the new configuration parameters in section ``[Overlay]`` and :ref:`Screen overlay mode ` for instructions. This feature was inspired by the paper `"A tetrachromatic display for the spatio-temporal control of rod and cone stimulation"` by Florian S. Bayer and colleagues (`Bayer et al., 2015, J Vis doi:10.1167/15.11.15 `_). * **IMPORTANT**: The ``QDSpy.ini`` file contains a couple of new parameters, including a new section called ``[Overlay]``. Thus, the new parameters need to be added to the existing ``QDSpy.ini`` file, otherwise QDSpy will crash. The easiest way to do so, is to rename the file to, for example, ``QDSpy.ini_COPY``. Then start QDSpy and let it generate a fresh configuration file. Open both the new file and your copy in parallel and change the parameters in the new file according to your previous settings. See see :doc:`inifile` for further details on the new parameters. * **Known issues**: * The GUI controls for the "screen overlay mode" are already present but not yet working. A work-around is changing the settings directly in ``QDSpy.ini``. * Objects that use shaders are not yet correctly displayed in "screen overlay mode". * ``SetColorLUTEntry()`` does not yet handle a LUT with more than 3 colours. * When starting QDSpy the stimulus screen may sometimes go white; as soon as the first stimulus is presented, the screen behaves normal. v0.74 beta (March 2017) ============================================== * Added `hid.cp36-win_amd64.pyd` to ``.\Devices`` to enable ``hid`` under Python 3.6 (comes with Anaconda version 4.3.x). This means that now QDSpy should be compatible with the newest Anaconda distribution. * Attempted to simplify path management: ``__autorun.pickle`` is not anymore required in the stimulus folder * LED pre-settings for lightcrafter was extended: now for each LED also the default current, the maximal current, the index of the lightcrafter device (0 or 1), and the LED index (which LED position within the lightcrafter) are defined in ``QDSpy.ini``. * Up to two lightcrafters can be handled; the GUI has been changed accordingly. * **IMPORTANT**: Note that the ``.pickle`` format has changed and therefore all stimuli need to be recompiled. To avoid confusion, delete all ``.pickle`` files in the ``\QDSpy\Stimulus`` folder. * **IMPORTANT**: The ``QDSpy.ini`` file contains a couple of new parameters, including a new section called ``[Overlay]`` (the latter is work in progress and concerns a feature that is not yet fully implemented yet. Please ignore for now). Thus, the new parameters need to be added to the existing ``QDSpy.ini`` file, otherwise QDSpy will crash. The easiest way to do so, is to rename the file to, for example, ``QDSpy.ini_COPY``. Then start QDSpy and let it generate a fresh configuration file. Open both the new file and your copy in parallel and change the parameters in the new file according to your previous settings. See see :doc:`inifile` for further details on the new parameters. * Documentation was updated and extended (including, for example, a detailed explanation of the parameters in ``QDSpy.ini``). v0.73 beta (January - February 2017) ============================================== * Installation instructions extended (2016-12-20 and 2017-01-18). * Dependencies changed from Qt4 to Qt5. The background is that many packages, including Anaconda (from version 4.2.0), are now moving to Qt5 for several reasons. QDSpy is now using Qt5 and is now compatible to the latest version of the Anaconda distribution * Bux fix: The GUI is now scaled if an HD display is detected - before it was not usable on small HD screens. The mechanism is fairly simple: if one of the connected screens has a pixel density larger than 110 dpi (currently defined in `QDSpy_dpiThresholdForHD` in ``QDSpy_global.py``) then all GUI elements are scaled by this pixel density devided by 100. The font size of the text in the history is treated differently; dependent on whether an "HD" display was detected one of two pre-defined font sizes are used (see `QDSpy_fontPntSizeHistoryHD` and `QDSpy_fontPntSizeHistoryHD` in ``QDSpy_global.py``). * Bug fix: Stimulus duration now calculated correctly. * Bug fix: `GetStimulusPath()` now returns also to correct path for stimulus files in a subfolder of the default stimulus folder. v0.72 beta (August 2016) ============================================== * Bug fix: GUI for adjusting LED currents now remains active after sending a change to the lightcrafter. "Refresh display info" button now works and LED status is updated after the automatic execution of ``__autorun.pickle``. v0.71 beta (July 2016) ============================================== * **Videos (AVI containers) now work** except for the rotation parameter, which uses a corner instead of the centre. The commands are `DefObj_Video()`, `Start_Video()` and `GetVideoParamters()`. Note that the latter now returns a dictionary instead of a list. * Like `GetVideoParamters()`, `GetMovieParamters()` now also returns a dictionary. * The GUI has been reorganized: * A font is used that works on all Window versions (7 and higher). * *Lightcrafter only*: The `LEDs: enable` button allows switching off the LEDs and changes to manual LED control (for details, see section :doc:`lightcrafter`). * A new tab called "tools" was added; currently in contains a very simple interface to a USB camera (e.g. for observing the stimulus). * A "Wait for trigger: ..." button has been added; *this is not yet functional*. * Duration of stimulus is shown. * Minor fixes. v0.70 beta (July 2016) ============================================== * Now reports GLSL version * Fixed error when QDSpy GUI does not find a compiled `__autorun`. * Stimulus folder can now be selected using the `Change folder` button. Note that at program start, QDSpy always pre-selects the default stimulus folder defined in the `QDSpy.ini` file * Cleaning up some pyglet-related code * Fixed that `psutil` was required even with `bool_incr_process_prior=False` * Added two entries to the `[Display]` section of the configuration file: `bool_markershowonscreen` determines if the marker ("trigger") that is send via an I/O card is indicated as a small box in the right-bottom corner of the screen. Entry `int_markerrgba` (e.g. = 255,127,127,255) defines the marker color as RGB+alpha values. * Starting the GUI version does not require a command line parameter anymore * Added a new optional command line parameter ``--gui``, which when present directs all messages (except for messages generated when scripts are compiled) to the history window of the GUI. * If the `QDSpy.ini` file is missing, it will be recreated from default values. From now on, the `QDSpy.ini` file will not be any longer in this repository to prevent that new versions overwrite setup-specific settings (e.g. hardware use, digital I/O configuration, etc.) * Removed currently unused tab "Setting" in GUI * Changed code for increasing process priority via `psutil` * Added pre-compiled ``hidapi`` packages for Python 3.5.x (``hid.cp35-win_amd64.pyd``); the version for Python 3.4.x was renamed to ``hid.cp34-win_amd64.pyd``. * **Now QDSpy fully supports Python 3.5.x.** The installation instructions were updated accordingly. * Fixed bug in drawing routines for sectors and arcs * 'Q' now aborts stimulus presentation for both the command line and GUI version of QDSpy * Refactoring of the code that interfaces with the graphics API (currently OpenGL via pyglet) * Fixed a bug in the way the scene is centered and scaled. * Added a **stimulus control window** to be displayed on the GUI screen when stimulus presentation is running fullscreen on a different display. This is beta; the performance of drawing stimuli on different screens in parallel needs to be carefully tested on different machines. Added two entries to the `[Display]` section of the configuration file: `bool_use_control_window` activates or deactivates the control window, and `float_control_window_scale` is a scaling factor that defines the size of the control window. * When upgrading a QDSpy installation, new configuration file parameters are now automatically added. **Important:** for consistency, the names of some entries in the configuration file needed to be changed: `str_digitalio_port_out`, `str_digitalio_port_in`, `str_led_filter_peak_wavelengths`, `str_led_names`, `str_led_qtcolor`, and `str_markerrgba`. **This needs to be corrected manually in any pre-existing configuration file in an existing installation.** Alternatively, the configuration file can be deleted, triggering QDSpy to generated a new one with default values. * Fixed a bug that caused QDSpy to freeze when changing stage parameters and then playing a stimulus. * End program cleanly and with a clear error message when digital I/O is enabled in the configuration file but the Universal Library drivers are not installed. The default for the configuration file is now `bool_use_digitalio = False`. v0.6 beta (April 2016) ============================================== * Bug fixes * Added `DefObj_Video()`, `Start_Video()` and `GetVideoParamters()` commands. Not yet fully implemented and tested; do not use yet. * Added `GetMovieParameters()` command * Fixed `GetDefaultRefreshRate()` command; now reports requested frame rate. * Added `[Tweaking]` section to configuration file. Here, parameters that tune the behaviour of QDSpy are collected. The first parameter is `bool_use3DTextures`; it determines, which of pyglets texture implementations is used to load and manage montage images for movie objects (0=texture grid, 1=3D texture). * Added instructions to the documentation of `DefObj_Movie()` how to convert a movie image montage used for the previous QDS with QDSpy. Key is that - in contrast to QDS - QDSpy considers the bottom-left frame of a montage the first frame of the sequence. v0.5 beta (December 2015) ============================================== * Bug fixes * Documentation updated * Gamma correction of display now possible (see section :doc:`how_QDSpy_works`) * Now catches errors generated when compiling shader scripts. * Changed stage parameters (magnification, center, rotation, etc.) are now written to the configuration file. * Writes the log automatically to a file. The log contains machine-readable tags for the data analysis. v0.4 alpha (November 2015) ============================================== * Migrated to Python 3.4.3 * Added GUI * Bug fixes * Added rudimentary support for controlling a lightcrafter device * Added movie commands, currently only copying what the old QDS commands did. * Added a shader that acknowledges colour and alpha value of its object ("SINE_WAVE_GRATING_MIX"). v0.3 alpha (March 2015) ============================================== * Minor bug fixes * Fixed transparency of objects (works now) v0.2 alpha (before 2015) ============================================== * Basic functionality, proof of concept Known issues ---------------------------------------------- For issues, see also `GitHub repository `_, where the issue management will be moved to. * The rotation parameter for videos rotates around a corner, not the center. * Shader-enabled objects may not be drawn in the correct order, which means that shader objects can flicker when they overlap. * Starting a movie for the first time in a script can cause a delay of ~200 ms. A work-around is to start the movie right at the beginning of the script starting section, for example: .. code-block:: python QDS.StartScript() QDS.Start_Movie(1, (0,0), [ 0, 0, 1, 1], (1,1), 0, 0) QDS.Scene_Clear(2.00, 0) This avoids the delay later during the time-critical parts of a stimulus. To do ---------------------------------------------- * URGENT: Check dictionaries that are written by the user to history and log file for large lists or data structures; these should go into separate files to prevent delaying the stimulus presentation * For color modes >1 (special lightcrafter modes), movie images need to be converted with the respective cvolor scheme. * Add possibility to control timing (i.e. sync refresh to an external source) on genlock-enabled NVIDIA and/or ATI graphic cards.