At least if you are using a USB connection and a pre-3.0.316 navX version see the release notes here.
Even with this update, we may have had a similar issue. We are using LabVIEW. We did not have much time to investigate it but we wrote a wapper for the navX Get Yaw VI that allows the yaw to be set to any angle using an offset to get around the problem.
Edit: Our navX is connected via SPI to the roboRIO MXP port.
a) Yaw cannot zero the yaw until startup calibration completes.
b) Due to some limitations found during testing of the 2017 WPI Libraries/RoboRIO firmware, in C++/Java, if connecting via USB, yaw cannot be zeroed more than once/second. Only the first attempt to zero the yaw will pass through, the second attempt will be ignored. However, another attempt that occurs at least 1 second after the first will succeed.
It’s likely a) is the condition you’re hitting. You can check whether startup calibration is still occuring by invoking the isCalibrating() method.
I reloaded the latest firmware to be sure. We are connected via MXP to the Rio.
Still not able to get the ZeroYaw() to reset the forward direction to zero. We have it set to a button. When pressed, instead of zero, it seems to take the initial value, say -16, and doubles it (to -36 in the latest test, then -72, etc) when viewed on the SmartDashboard.