Difference between revisions of "TODO"

From sigrok
Jump to navigation Jump to search
m
 
(143 intermediate revisions by 11 users not shown)
Line 1: Line 1:
== sigrok 0.3 ==
== libsigrok ==


* <s>Remove time/duration left-overs from libsigrok.</s>
=== Hardware support ===
* stackable protocol decoder implementation
** <s>Fix segfault: If "probes = [{}]" is used (for example), i.e., one or more of the dict items are not there, that yields a segfault.</s>
** <s>How to pass (and what exactly, and in which format) samples and already decoded protocol packets:
**** From C to Python (i.e. from libsigrokdecode/controller to the lowest-level decoder)
**** From Python to Python (i.e., from one decoder to the next in the stack)
**** From Python to C (i.e., from a decoder back to libsigrokdecode, which then hands it over to the CLI/GUI, which write it to file or display it in the GUI).</s>
** <s>free all instances at end of session</s>
** <s>There will also have to be a type for "sections", i.e. grouped sets of fields that have something in common -- an EDID block, ethernet frame, etc.
*** Actually not needed: these annotations will cover a larger sample range than its individual fields, so it's up to the frontend to do something visually interesting with this.</s>
** Annotations: replace string with optional list, containing annotations in decreasing length?
*** quick and easy form: <tt>put(ss, es, opid_ann, "something")</tt>
*** multiple strings: <tt>put(ss, es, opid_ann, ["something", "else", "yet"])</tt>
*** ...or annotations of decreasing length: <tt>put(ss, es, opid_ann, ["something", "sth", "s"])</tt>
** Test/implement support for multiple outputs of one PD, and stacking different additional PDs on those outputs.
** Test/implement multiple inputs support.
* APIs:
** <s>PDs: Change extra_probes to optional_probes (or a shorter name for that).</s>
** <s>srd: All public functions/names must have srd_ prefix.</s>
** Add good Doxygen documentation
*** <s>libsigrokdecode</s>
*** libsigrok
** <s>validate/review APIs</s>
*** <s>libsigrokdecode</s>
*** <s>libsigrok</s>
** <s>all API calls should use/return g_try_malloc()ed stuff and use g_free() instead of regular malloc()/free().</s>
*** <s>libsigrokdecode</s>
*** <s>libsigrok</s>
** <s>all APIs need to be carefully reviewed/checked and private stuff must be made private via "static" or SR_PRIV/SRD_PRIV.</s>
*** <s>libsigrokdecode</s>
*** <s>libsigrok</s>
** <s>srd: Python implementation details should be removed from the API.</s>
** all direct uses of file descriptors in the API should disappear, and GIOChannel should be used instead (portability issues)
** <s>use gboolean for all functions returning boolean values (as we depend on glib already anyway)</s>
*** <s>libsigrokdecode</s>
*** <s>libsigrok</s>
** use const for all parameters which are not changed by the API call.
** there must not be any lib-internal data structures that a frontend can manipulate directly. Internal stuff must be non-accessible, except via our defined API calls.
** use short naming for some overly long function names. For example: device_instance -> dev_inst everywhere.
* <s>[http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/tcsetattr.3.html Mac OS X: B460800] is not available it seems. Find the correct header (if any) and/or find a (possibly platform-specific) workaround, or drop this on Mac OS X.</s>
* <s>Make sure all combinations of --enable-*/--disable-* options works for configure.
** There may be issue if none of the drivers is enabled, print useful error in that case(?)</s>
* <s>libsigrok.h/libsigrokdecode.h: Only list public API functions.</s>


== sigrok 0.4 ==
* Clean up device-specific globals in hardware drivers, to properly permit multiple devices per driver: fx2lafw, zeroplus-logic-cube, others(?)
=== New features ===
* Chronovu LA8/LA16 driver: support multiple devices properly (currently only one is supported).
* Support for analog devices, starting with oscilloscopes.
* Hantek DSO-2090 driver
* Finish [[fx2lafw]] (open-source FX2 firmware).
* modular filter system
** take arguments in the regular thing:key=value format
** integrate current probe compression filter
** resampling module: sample up/down based on factor argument
** noise filter: filter out pulses shorter than the samplerate's period
** software triggering
*** integrate current basic trigger functionality from saleae driver
*** for streaming devices, opportunity for more complex triggers than the hardware can do
* ANT8/18e unified driver


=== Improvements ===
=== Input modules ===
* SRD improvements:
** Performance: ATM data passed to decode() creates lots of Python objects (-> performance, huge memory usage); find a way to make that more efficient. Use 'bytes' and/or 'memoryview' and the new Python 3 buffer API (?)
** Test/implement '''config''' PD method etc.
** Annotations need an additional 'type' field, so that PDs/GUIs can differentiate between different output "things".
*** Types are not yet defined, but could be things like DEFAULT, ERR, WARN, DBG, and others.
*** Best handled with a keyword arg to put(), which defaults to srd.ANN_DEFAULT
* CLI improvements:
** Stop session if SRD initialization indicates an error at any point.
** Support for printing/selecting a specific annotation for output (or multiple).
** Eliminate all printing to stdout, only sample data or decoder output should end up there. Error/debug messages should go to stderr always.
** Add a --start-sampling (TODO: Better name?) option, which just starts sampling with the supplied or default samplerate. Contrary to --time or --samples you don't need to explicitly specify a duration or number of samples here, that's automatically determined by the available memory of the logic analyzer and the selected samplerate.
*** TODO: Similar to --continuous? Merge both?
*** make it --run
** <s>enforce input/output options in PDs: don't send logic if PD only accepts i2c etc.</s> figure out what to do with inputs[] and outputs[] (1-wire case)
** Python exception handling in libsrd: add full traceback support with srd_dbg()
* Wiki improvements:
** Make a user-friendly protocol list/lookup page, based on a data-only backend
** Integrate these into the list: http://en.wikipedia.org/wiki/Category:Serial_buses
* Run the code receiving the samples as quickly as possible, run output format code and other non-timing-critical stuff (protocol decoders) in an extra thread. The problem is nicely visible with FX2-based logic analyzers, the longer an output format takes to produce its output, the better your chances to get "oops, I just lost samples" errors.
* Factor out input/output file formats to libsigrokfile.
* change all code to start counting probes at 0, not 1.
* Get rid of the use of manual polling of FDs, which is not portable (doesn't work on Windows). Use g_poll() instead (which spawns a new thread on Windows).
* We will have an extra datafeed type SR_DF_LOGIC_INDEXED, which contains [samplenumber, sample] instead of just raw samples. Samplenumber is a uint64_t, and sample is unchanged (unitsize). Frontends must be able to handle both, and modular filters in libsigrok or the sampling filter in libsigrokdecode may convert from SR_DF_LOGIC to SR_DF_LOGIC_INDEXED at any time.
* Processing raw logic vs. everything else up the stack: (optionally) deliver pre-sampled by clock or rate? <blockquote>Yes, the controller will deliver a clock- or rate-sampled feed instead, if the PD requests this via a configuration option.</blockquote>
* Hardware drivers: Make specification of triggering capabilities more detailed, so that frontends/GUIs can auto-generate GUI forms out of that metadata.
* Windows port:
** Implement anykey.c replacement.
** hex output: Not all lines/columns are of the same length (as they are with real LAs).
** VCD: All samplenumbers are 0 (instead of the proper samplecount).
** OLS, gnuplot: Hangs on MinGW for some reasons (not sure if related).


== Before 1.0 ==
* Add OLS input module support.
* Add gnuplot input module support ([[User:Uwe Hermann|Uwe Hermann]]).


* all output modules should use GString API instead of estimating output size
=== Miscellaneous ===
* VCD input modules
* OLS format input module


== Future ==
* Check all public API calls to see whether they need an sr_context parameter.
 
* Protocol decoder repository management:
** manifest file in every PD directory, containing:
*** list of files to install
*** list of test dumps in sigrok-dumps
*** list of output files to match test dump runs
** to check before accepting PD into repository:
*** make sure sigrok-dumps has the test files, and the output matches
*** run PD against memory profiler, make sure it doesn't go over X
*** run against pep8 with custom filter list
 
* udev:
** Make udev optional, only build MSO driver if it's available
** have OLS driver use udev if available, fall back to serial port probing otherwise
** Find alternative to udev for windows and macos
* Fix/workaround libusb 1.0 [[Windows]] port issues:
** Device renumeration not yet supported (needed for FX2 based LAs)
** File descriptor / socket based polling not supported in Windows. Workaround (short-term): Use a thread in sigrok.
* Make sure all optional components are really optional in the build system:
** Only require Python if the users wants protocol decoders, the rest should also build/compile/run fine without Python installed.
* sigrok uses uint64_t as an internal datatype to represent a sample, limiting the number of probes on supported hardware to 64. But high-end logic analyzers can have hundreds of probes. A solution would be to switch to either a roll-our-own byte array type, or use [http://gmplib.org/ GMP]. In any case, the overhead of switching over shouldn't be too bad: the filter code and frontend datafeed callback functions will need to use it, but hardware drivers should have enough with a couple of lightweight wrappers.
* sr_errno:
* sr_errno:
** Most functions should return SR_OK or SR_ERR_* (same for SRD_OK etc).
** Most functions should return SR_OK or SR_ERR_* (same for SRD_OK etc).
** Most backend functions return status as an integer, which is SR_OK if all went well, or SR_ERR_* and similar if an error occurred.
** Most backend functions return status as an integer, which is SR_OK if all went well, or SR_ERR_* if an error occurred.
** However there is no way to pass any information back as to what went wrong &mdash; and this is important for user-friendliness.
** However, there is no way to pass any information back as to what went wrong &mdash; and this is important for user-friendliness.
** Perhaps an error code is not enough; maybe something like sigrok_errno(errorcode, "unsupported device") is better.
** Perhaps an error code is not enough; maybe something like sigrok_errno(errorcode, "unsupported device") is better.
* Clean up device-specific globals in hardware drivers, to properly permit multiple devices per driver: <s>asix-sigma</s>, <s>demo</s> (not relevant), <s>link-mso19</s>, <s>openbench-logic-sniffer</s>, saleae-logic, zeroplus-logic-cube
* Support specifying the firmware directory at runtime.
* Python bindings for libsigrok and libsigrokdecode.
 
== libsigrokdecode ==
==== Major features ====
* Add high-precision timer to runtc
* Add annotation mime types
* Add annotation metadata (type/value/unit) to allow clients to format the value as the user desires (ASCII/dec/hex/bin/whatever)
 
==== Other ====
* Test/implement support for multiple outputs of one PD, and stacking different additional PDs on those outputs.
* Test/implement multiple inputs support.
* Python exception handling in libsrd: add full traceback support with srd_dbg().
 
== sigrok-cli ==
 
== fx2lafw ==
 
* Analog sampling: 1-channel, 2-channel, voltage meter
* Trigger pin
* Clock input
* Clock output
* Frequency/pulse counter
* Signal generator
* Fix power consumption during enumeration.
** Non-LP FX2's consume more than 100mA during enumeration. This is outside of the USB specification
** Official workaround is to enumerate first as full-speed, then as high-speed. This is overkill for sigrok.
** Investigate putting the CPU to sleep (except for processing interrupts) until enumerated.
 
== PulseView ==
 
* Deduplicate property setting functionality between SamplingBar and DeviceOptions - make SamplingBar a properties container
* Analog interpolation (cosine? sinc? some kind of interpolation filter?)
* Signal overview
* Transition coding


== Contributors wanted ==
== sigrok-meter ==


* Add output for latex package [http://www.ctan.org/tex-archive/graphics/pgf/contrib/tikz-timing tikz-timing].
* Make the list of measurements look nicer without using too much additional space.
* Add output for browser waveform viewer/editor written in javascript/JSON called [http://code.google.com/p/wavedrom WaveDrom].
* Add graphs.
* Linux distro packages for non-Debian distros.
** [http://www.pyqtgraph.org/ PyQtGraph] looks like a nice graphing library.
* FreeBSD packages/ports.
*** Works with PyQt and PySide.
*** Pure python, easy to install.
*** Few dependencies: '''scipy''' is not required any more in the upcoming version 0.9.9, '''numpy''' is already a dependency of the python bindings.
*** From looking at the examples, it seems more than fast enough for our requirements.
** Pass all samples (not only the most recent one) to the GUI thread and store them there.
*** The packet payload object is currently not thread save.

Latest revision as of 13:11, 19 July 2020

libsigrok

Hardware support

  • Clean up device-specific globals in hardware drivers, to properly permit multiple devices per driver: fx2lafw, zeroplus-logic-cube, others(?)
  • Chronovu LA8/LA16 driver: support multiple devices properly (currently only one is supported).

Input modules

  • Add OLS input module support.
  • Add gnuplot input module support (Uwe Hermann).

Miscellaneous

  • Check all public API calls to see whether they need an sr_context parameter.
  • sr_errno:
    • Most functions should return SR_OK or SR_ERR_* (same for SRD_OK etc).
    • Most backend functions return status as an integer, which is SR_OK if all went well, or SR_ERR_* if an error occurred.
    • However, there is no way to pass any information back as to what went wrong — and this is important for user-friendliness.
    • Perhaps an error code is not enough; maybe something like sigrok_errno(errorcode, "unsupported device") is better.
  • Support specifying the firmware directory at runtime.

libsigrokdecode

Major features

  • Add high-precision timer to runtc
  • Add annotation mime types
  • Add annotation metadata (type/value/unit) to allow clients to format the value as the user desires (ASCII/dec/hex/bin/whatever)

Other

  • Test/implement support for multiple outputs of one PD, and stacking different additional PDs on those outputs.
  • Test/implement multiple inputs support.
  • Python exception handling in libsrd: add full traceback support with srd_dbg().

sigrok-cli

fx2lafw

  • Analog sampling: 1-channel, 2-channel, voltage meter
  • Trigger pin
  • Clock input
  • Clock output
  • Frequency/pulse counter
  • Signal generator
  • Fix power consumption during enumeration.
    • Non-LP FX2's consume more than 100mA during enumeration. This is outside of the USB specification
    • Official workaround is to enumerate first as full-speed, then as high-speed. This is overkill for sigrok.
    • Investigate putting the CPU to sleep (except for processing interrupts) until enumerated.

PulseView

  • Deduplicate property setting functionality between SamplingBar and DeviceOptions - make SamplingBar a properties container
  • Analog interpolation (cosine? sinc? some kind of interpolation filter?)
  • Signal overview
  • Transition coding

sigrok-meter

  • Make the list of measurements look nicer without using too much additional space.
  • Add graphs.
    • PyQtGraph looks like a nice graphing library.
      • Works with PyQt and PySide.
      • Pure python, easy to install.
      • Few dependencies: scipy is not required any more in the upcoming version 0.9.9, numpy is already a dependency of the python bindings.
      • From looking at the examples, it seems more than fast enough for our requirements.
    • Pass all samples (not only the most recent one) to the GUI thread and store them there.
      • The packet payload object is currently not thread save.