wpilibsuite / shuffleboard Goto Github PK
View Code? Open in Web Editor NEWA modern dashboard for FRC
License: Other
A modern dashboard for FRC
License: Other
Both exist right now. ShuffleboardController is empty but in what I believe is the correct package.
A tentative list of the classes that should be moved into an api
project:
Package | Class |
---|---|
components |
LinearIndicator |
NumberField |
|
Scrubber |
|
data |
Everything in this package |
data.types |
Everything in this package |
properties |
AsyncProperty |
sources |
DataSource |
AbstractDataSource |
|
SourceType (should also be split into an interface and util class) |
|
IncompatibleSourceException |
|
widget |
Widget |
AbstractWidget |
|
AnnotatedWidget |
|
SingleTypeWidget |
|
ComplexAnnotatedWidget |
|
@Description |
|
@ParamtrizedController |
Other thoughts:
@JLLeitschuh can you work on splitting the project into an api
project and an app
project?
Per the short discussion on one of the recent PRS; there was a thought floated about switching to Junit5.
The Junit5 vintage plugin would be used to run the TestFX tests as I think they rely on the Junit4 API.
I'm opening this so the question can be discussed.
I'm my experience:
There should be a feature to disable snap to grid. I want to be able to place widgets freely
Class | Test |
---|---|
MainWindowControllerTest | testDragSingleNetworkTableSourceToWidgetPane |
CompositeNetworkTableSourceTest | testDataUpdates |
SingleKeyNetworkTableSourceTest | testValueUpdates |
WidgetSaverTest | loadSimpleWidget |
Save as... on the file menu throws exceptions and doesn't show the dialog.
Due to the file name format dashboard_recording_uuuu-MM-dd_HH:mm:ss
and Windows not allowing colons in file names
This ties them in more with material design. We should also remove the blue background from tiles as part of this
If you have a row with 3 widgets that are {2, 1, 1} grid cells in size and the "2" sized widget could be shrunk. If I drag from the right edge towards the left edge, things only on the right edge start moving, then shrinking. The left edge widget doesn't seem to resize. Probably a bug since the other interior widgets seem to resize properly.
You should be able to hide everything except the widget tab for use on a driver station
Jun 19, 2017 4:48:54 PM com.sun.javafx.css.StyleConverterImpl getInstance
SEVERE: StyleConverterImpl : converter Class is null for : com.sun.javafx.scene.layout.region.CornerRadiiConverter
Jun 19, 2017 4:48:54 PM com.sun.javafx.css.StyleConverterImpl readBinary
SEVERE: could not deserialize com.sun.javafx.scene.layout.region.CornerRadiiConverter
could not deserialize com.sun.javafx.scene.layout.region.CornerRadiiConverter
possibly related to controlsfx?
NetworkTableTree shouldn't be bound directly to NetworkTablesJNI, but to an intermediary that can be initialized elsewhere to allow the component to be used standalone without a connection to ntcore (eg in SceneBuilder)
All other software released under WPIlib is BSD 3 clause.
Shuffleboard should be licensed under the same license.
The question that I have is if it should be copyright FIRST or WPI?
GRIP is copyright WPI. WPILib is copyright FIRST.
For example, dragging a number into the rightmost column will create a slider widget that extends outside the grid
If you make a toggle switch for a boolean it shows an oval that the little switch moves in. When the switch is on the right side, it moves outside of the oval. The left side state is OK.
Should be able to resize the widget/sources area, or possibly get rid of it completely to make more room on small screens (i.e. classmate).
Running shuffleboard on my machine results in it launching with the window size too large. It flows off the top and bottom of the screen, hiding the menus.
Instead, a different entry is chosen when dragging so the resulting source/widget is not the one the user selected in the tree
Currently the amounts of rows and columns are hardcoded. Columns should be added or removed as the tile grid is resized, possibly down to some fixed minimum size or to a size where anything smaller would clip or remove tiles
See title
When there are more widgets vertically in the palette than fit in the window there should be a scrollbar.
not really a near term thing, but you should be able to click and drag to select groups of widgets, and then move them (or delete them)
Copy the logic from OutlineViewer
Plugins would have:
The name must always be set, but plugins can choose to define any or all of the custom lists.
We'll need to change SourceType
away from an enum to an interface + util class, like DataType
/DataTypes
. Should probably also change SourceType
to do data recording and playback, so we don't have to add custom code for each source type in the recording/playback classes.
We'd need to add UI stuff to load plugin jars or classes, as well as a simple dialog to show the currently loaded plugins.
Providing the plugin API would let us move classes into their own jars. All the stock widgets can be bundled into a StockWidget
plugin, network table sources can be in a NetworkTable Source
plugin, etc. Ideally the stock data types would also go into a plugin, but that would mean plugins would either need to be compiled with that jar to let the @Description
annotation to function, forcing us to load that jar first to make sure the data type classes are loaded; or remove the @Description
annotation entirely.
Because of this, I think we should keep the stock data types in the api jar (#101) to make sure all plugins can use all the data types provided by WPILib, but still split the stock widgets and data sources into plugins.
There are a few pain points like the network table tree widget that we use to display data in network tables and add widgets from. We may want to let source types provide a JavaFX node that we stick in a tab in the sources view.
The titlebar on widgets currently has the full path for the value. So a typical value would be "SmartDashboard/name". With small widgets, the name isn't shown because "SmartDashboard" fills the entire title area. Maybe show the full value when mousing over or in a properties dialog for the widget.
They should be saved in a format like SmartDashboard/recordings/YYYY-MM-DD/hh-mm-ss-timestamp.sblog
This makes it easier to clean out super old recordings, and easier to find the recordings you're looking for
When I change the key of a key-value pair, I get this exception:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException
at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:136)
at javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:242)
at javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.handleSelectedCellsListChangeEvent(TreeTableView.java:3244)
at javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.access$2000(TreeTableView.java:2289)
at javafx.scene.control.TreeTableView.sort(TreeTableView.java:1817)
at edu.wpi.first.shuffleboard.widget.NetworkTableTreeWidget.makeBranches(NetworkTableTreeWidget.java:150)
at edu.wpi.first.shuffleboard.widget.NetworkTableTreeWidget.lambda$null$7(NetworkTableTreeWidget.java:75)
at java.util.HashMap.forEach(HashMap.java:1288)
at edu.wpi.first.shuffleboard.widget.NetworkTableTreeWidget.lambda$new$8(NetworkTableTreeWidget.java:75)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.binding.ObjectBinding.invalidate(ObjectBinding.java:172)
at org.fxmisc.easybind.monadic.FlatMapBindingBase.mappedInvalidated(FlatMap.java:76)
at org.fxmisc.easybind.monadic.FlatMapBindingBase.lambda$new$22(FlatMap.java:21)
at javafx.beans.WeakInvalidationListener.invalidated(WeakInvalidationListener.java:83)
at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:349)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:105)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146)
at edu.wpi.first.shuffleboard.properties.AsyncProperty.lambda$set$2(AsyncProperty.java:54)
at edu.wpi.first.shuffleboard.util.FxUtils.runOnFxThread(FxUtils.java:45)
at edu.wpi.first.shuffleboard.util.AsyncUtils.runAsync(AsyncUtils.java:24)
at edu.wpi.first.shuffleboard.properties.AsyncProperty.set(AsyncProperty.java:54)
at javafx.beans.property.ObjectProperty.setValue(ObjectProperty.java:69)
at edu.wpi.first.shuffleboard.sources.DataSource.setData(DataSource.java:59)
at edu.wpi.first.shuffleboard.sources.CompositeNetworkTableSource.lambda$new$0(CompositeNetworkTableSource.java:48)
at edu.wpi.first.shuffleboard.sources.NetworkTableSource.lambda$null$0(NetworkTableSource.java:46)
at edu.wpi.first.shuffleboard.util.FxUtils.lambda$runOnFxThread$0(FxUtils.java:49)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Steps to reproduce:
We currently just grab the first compatible widget alphabetically. We should have an annotation @DefaultWidget
that provides an array of data types (in the same format as @Description
) that can be placed on widget classes
@Description(name = "My Number Widget", dataTypes = NumberType.class)
@DefaultWidget(NumberType.class)
public class MyNumberWidget implements Widget {
// ...
}
Changing the widget type causes the widget to move to a (not obviously predictable) location. This happens even if the widget becomes smaller than the original type would have been.
For example, a SmartDashboard
tab should be able to auto-populate with one widget for each Network Table source that matches ^/SmartDashboard/.+$
, and LiveWindow
tab auto-populate with network table sources matching ^/LiveWindow/.+$
Since every key can be a source and there's no point in having widgets for unchanging data like /LiveWindow/Subsystem/Name
or /LiveWindow/Subsystem/.type
, or for keys that are part of a composite object like a SendableChooser
, the auto-population should be smart and not add widgets for those sources
People may want to still use SmartDashboard. Are we sure what we put in the directory will not conflict?
This tool can be used for things other than frc.
The README points to the .com
version of travis. If you are using the the open source builder they have now then their builds are at a .org
address instead.
Dragging from the source tree to the widget pane behaves as expected. It's only widgets added via the context menu that have this problem
Load layout gets an error and no dialog box.
I think this should be built into the UI (like in the title bar) and not a widget.
Showing negative numbers as progress bars does the cylon eyes thing - very cool, but probably not what was expected.
Seems like an artifact from the past, but it's very confusing... "save layout" and "save as" - not obvious that these save the same things.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.