Leveraging Joulescope Waveform Widget for Custom Live Signal Plotting in PySide


I’m currently developing a PySide QT-based GUI application for a client that requires live and offline charting of multiple signals. While searching for third-party graphing widgets, I discovered the Joulescope UI repository on GitHub. I’m truly impressed with the waveform widget 's performance! It excels in displaying numerous live plots with high sampling rates, providing live statistics (min/max/avg), and offering cursor and marker functionalities.

Given its capabilities, I’m interested in incorporating the waveform widget into my PySideQT application. I noticed the Joulescope UI code is licensed under Apache-2. To ensure compliance, I’d like to confirm if using the waveform widget in my application aligns with the terms of this license.

Hi @engg.rex - Welcome to the Joulescope forum, and great to hear that you like the Joulescope UI Waveform widget! The Apache 2 license grants you the ability to basically whatever you want with the code as long as keep the copyright notice and license the same for that segment of code. It does not provide any warranty and it does not grant permission to use the Joulescope trademark. You can hack the code and distribute it as part of your commercial application. Here is a nice summary page that compares open source licenses.

You will run into some challenges separating the Waveform widget from the Joulescope UI. The Joulescope UI architecture is opinionated, and it relies on our pubsub.py implementation. The data model is not provided by the widget, but by the sources. The Waveform widget communicates with the sources using PubSub.

These two files are wrappers for the actual sources which are implemented in C:

The JLS file format is also available for you to use, likely as is using the pyjls package. I am not sure how you are getting online data into your system, but you may be able to reuse buffer.c and buffer_signal.c. They also use an opinioned pubsub.c.

I look forward to hearing what you think and if you can make this reusable!

A totally different way to go about this is to use the Joulescope UI as an application framework and port your existing widgets/app to it. I have thought about separating the Joulescope UI application framework from the Joulescope-y parts. As a framework, the Joulescope UI has some nice features:

  • Automatic widget discovery and registery
  • Plugin support with automatic code reload enables interactive, live widget development
  • Automatic widget settings & Settings widget with defaults and per instance overrides
  • Colors and styles (the Joulescope UI implements light & dark)
  • Pyside6-QtAds integration for Qt Advanced Docking System
  • Automatically save state at exit and restore state on start
  • Support for fully customizable views (arrangement of widgets)
  • Windows, macOS & Linux support
  • Build and deploy using pyinstaller (macOS & Linux), Nuitka and Inno Setup (Windows)
  • Internationalization: multi-language support with automatic DeepL translations
  • Integrated PubSub inspection tools for debug, memory leak troubleshooter
  • Software update
  • Crash and issue reporter
  • Logging

Hi @mliberty,

Thanks so much for the detailed reply!
Joulescope looks incredibly powerful.