CIQ SDK 3.0.8 (Plugin 3.0.6)
Windows 10
Description
An app supports (optional) FIT recording in the following manner. When recording is enabled:
- One set of fields is always recorded (to the activity graph, laps, and summary)
- Another set of fields is optionally recorded (to the activity graph), depending on app settings
If MonkeyGraph tries to open a FIT file created with only the mandatory set of fields (and not the optional fields), it fails with an exception. If MonkeyGraph opens a file with the optional fields present, the file is opened successfully.
In the failure case, there is no error indication whatsoever -- nothing happens -- unless you launch monkeygraph from the console.
If you would like to reproduce this with an existing app, you need Run Power, a power meter, and a "large memory CIQ3" device with 128 KB for data fields such as Fenix 5X Plus:
https://apps.garmin.com/en-US/apps/a...5-87987ba737e1
- Pair a power meter (such as Stryd) with the watch (this is necessary to get non-null data for the mandatory fields). Alternatively, a cycling power meter can be used.
- Add the Run Power data field to an activity, with a one field layout
- The option to enable FIT recording for the "mandatory" fields is:
- Record Power Data to FIT file
This will record current, average and max power to the graph, lap and summary fields. - To record optional fields:
- Data Field 5 > ..., ..., Custom Metric A
- Data Field 6 > ..., ..., Custom Metric B
- Custom Metric A > Record to FIT file
- Custom Metric B > Record to FIT file
This will record "Custom Metric A" and "Custom Metric B" to the graph fields. (Recording this data to lap and summary is possible, but not necessary to recreate this bug). These fields are also based on power, so they should be non-null if power is non-null
Console output:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.garmin.monkeybrains.fitgraphs.graph.FitGraphXYDataset.<init>(FitGraphXYDataset.java:63)
at com.garmin.monkeybrains.fitgraphs.ui.MainUiController.buildCharts(MainUiController.java:163)
at com.garmin.monkeybrains.fitgraphs.ui.MainUiController.buildTabs(MainUiController.java:145)
at com.garmin.monkeybrains.fitgraphs.ui.MainUiController.actionPerformed(MainUiController.java:134)
at javax.swing.JFileChooser.fireActionPerformed(Unknown Source)
at javax.swing.JFileChooser.approveSelection(Unknown Source)
at javax.swing.plaf.basic.BasicFileChooserUI$Handler.mouseClicked(Unknown Source)
at sun.swing.FilePane$Handler.mouseClicked(Unknown Source)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.WaitDispatchSupport$2.run(Unknown Source)
at java.awt.WaitDispatchSupport$4.run(Unknown Source)
at java.awt.WaitDispatchSupport$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.WaitDispatchSupport.enter(Unknown Source)
at java.awt.Dialog.show(Unknown Source)
at javax.swing.JFileChooser.showDialog(Unknown Source)
at javax.swing.JFileChooser.showOpenDialog(Unknown Source)
at com.garmin.monkeybrains.fitgraphs.ui.MainUiController.actionPerformed(MainUiController.java:120)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)