QFRCDashboard: a simple, high-performance, reliable Shuffleboard alternative

QFRCDashboard

I am happy to announce the beta release of QFRCDashboard, a high-performance, low-footprint, reliable, FOSS dashboard for FRC use, written in pure Qt and C++.

QFRCDashboard has been designed from the ground up to perform well with minimal memory and CPU footprint, and to be as extensible as possible without sacrificing developer experience. Compared to Shuffleboard on a ThinkPad X220:

image

The tiny footprint of QFRCDashboard is thanks to a variety of factors:

  • It’s written in the highly performant, lightweight C++ and Qt
  • Contains no menu that subscribes to every topic at once
  • Duplicate subscriptions to topics refer to the same subscription; no double-referencing topics
  • Widgets only update or do any paint events when they need to, such as a resize or NT update.

Availability

QFRCDashboard is available on Linux (AppImage, system folder, binary) and Windows (portable), through GitHub Actions. QFRCDashboard has been tested on Windows, but has yet to see extensive testing. Linux builds have been tested thoroughly.

These builds currently use the master branch of WPILib, meaning that you must use this with a 2024 robot project. If there’s enough demand I will gladly create builds for 2023 WPILib.

Theming

QFRCDashboard does not support theming at the moment. By the time of the official 1.0.0 release, QFRCDashboard will receive an “official” theme, in the same vein as Qt’s Elegant Dark.

A New Take on Custom Widgets

While Shuffleboard’s custom widget plugin system was extremely powerful, it was also just as complicated for the end user. Thus, to simplify widget developer’s lives, QFRCDashboard has no plugin system. Instead, custom widgets are created directly in the code of QFRCDashboard, allowing developers complete control over the widget’s layout, type, data representation, and more. However, steps have been taken to ensure that registering a widget into the QFRCDashboard meta-system is as convenient and simple as possible.

QFRCDashboard will contain a developer’s guide for creating widgets soon.

Widgets

While not every widget from Shuffleboard is available, many have new features added, and there are some new ones.

All widgets have editable fonts for their title and, if applicable, their text–this includes font size!

  • String Display
  • Int & Double Displays
  • Int & Double Dials
    • The starting angle of the dials are now configurable, as is the range.
    • Note that a 0 starting angle is the bottom.
  • Boolean Color Display
    • Added support for changing to various preset shapes. (Hexagon, Rectangle, Triangle, Circle)
  • Boolean Checkbox
    • The checkbox size is editable.
  • Camera View
    • This lacks support for getting views from CameraServer, this will be added soon.
  • Field2d
    • Supports built-in images and even custom field images!
    • Editable robot size
  • Sendable Chooser
  • Enum Widget
    • A completely new widget. This widget takes in a string, and changes its color depending on the string.
    • All key-value (string-color) pairs are editable.
    • Like the boolean color widget, the shape is editable.

Coming soon will be:

  • Graphs
    • CSV Export
    • Configurable axes
    • Multiple lines and values
    • Static values in the graph
    • Configurable colors
  • FMSInfo
  • Command Activation
    • Distinction between toggle and instant commands.
    • This is a high priority right now, expect this by beta 5.
  • Swerve Widget
  • Drag & Drop
    • This is a high priority right now, expect this by beta 5.
23 Likes

This is some incredible work! I’m glad that I’m no longer the only person providing a more stable alternative to Shuffleboard!

I do have a suggestion though, designing a layout would be a bit easier if there was some sort of preview or way of seeing the size of the grid

Thanks!

What do you mean by a preview of the grid size? As in grid lines? If so I can do that, but otherwise, there’s a “resize tab” option in the Tab menu that shows you the amount of rows and columns in the current tab.

Yes, it’s a bit hard to tell how big a grid space will actually be when adding a widget

Alright gotcha. I’ll probably get this done before drag&drop since it’ll definitely make that easier for the user.

1 Like

Enjoy the new name logo.

Excellent work. I am looking forward to using it on my lower-spec personal laptop.

1 Like

Honestly surprised it took this long for someone to make it! Thank you for being the chosen one!!

2 Likes

I’m actually shocked nobody else has made a Qt + NT dashboard.

Regardless I’m quite happy with how this turned out. I learned quite a lot about the intricacies of Qt and its meta-object system. And it just performs SO much better than Shuffleboard.

1 Like

How’s this look?

If you need any help feel free to ask! I spent a few months designing and fixing a large qt application this year. My one suggestion if you aren’t already doing so is to use ui files if you’re not doing uml. They make your life easier in the long run!!

I’ve honestly had a lot of issues getting Qt Designer and the UI files to work. I’ve long considered this, but given that I’ve never had success with UI files, I work much better with programmatic layout generation.

If you’d like to spend a lot of effort helping me get all that figured out tho, be my guest! It’d likely make custom widgets easier for end developers.

It does! It also makes your life significantly easier too. Code generated layouts are fine if they’re small enough but eventually it gets too cumbersome and large to maintain. What issues were you having?

If i spend any effort doing it I would likely just do one to show you how it’s done, which would you like done the most?

I feel like it should be a bit more transparent (gray) but otherwise it’s great!

So that’s part of the reason I didn’t really want to invest into UI files actually. Each widget is really just 2-3 different QWidgets together. Text widgets are a title and text line edits, color display is a title edit and a QFrame, etc. Using UI files may still have some benefit, but this combined with the polymorphism required for much of the dashboard’s functionality I’m unsure. I’ll take a look though!

My issues with Qt Designer are related to the application just kinda not working correctly. This may be my fault as I’m using Sway without any Qt configs…

1 Like

I also considered gray, but I also had to consider different themes. It’s white when on dark themes and black when on light themes. I tried gray and it didn’t really create a uniform look between light and dark.

Chances are I’ll end up making this an option within the available themes. I’m not a UI designer in the slightest. :>

Why did you do it widget based instead of QML then? QML was made for that and is somewhat easy to work and can look like a piece of art if done really well, like qFlipper. QML can also work with C++ through interfaces with signals/slots.

Cause I’ve never used QML lmao :slight_smile: It might be better but I’ve invested enough into the current C++ code that a rewrite into QML is a huge undertaking.

1 Like

Fair enough, i have been saddled with that tech debt for a while and wanted to let you know before it got too bad! QML is sooo nice too. But it would be alot of work to rewrite this into QML. My offer to make a widget is still valid btw, i could make the mainwindow a UI file too FYI.

1 Like

The main window is absolutely an area I’d love to have a UI file. The constructor is just a bunch of boilerplate that sets up the UI and binds a few actions to slots. All the rest is the actual slot definitions.

Offer accepted. :slight_smile:

1 Like