If no Monocle paired, will initially attempt to pair. This can be canceled, in which case Bluetooth is effectively disabled until the user either 1) restarts the app or 2) attempts to pair again from the settings menu. A reason one may want to do this is to use the in-app text messaging interface exclusively.
If paired, will go straight to chat window but indicate whether Monocle connected or not.
Firmware and FPGA versions are always checked upon connection to Monocle and, if need-be, the appropriate update sequences are triggered.
Firmware and FPGA updates cannot be bypassed or canceled at all.
Things to look out for:
I have seen redundant firmware updates. Thankfully these are pretty quick. Redundant FPGA updates would be a serious problem because they are very sloooooow. It seems redundant firmware updates are most likely to happen after an update has just occurred. Something to keep an eye out for and report back to me.
Make sure the UI doesn't enter any unexpected states or experience any undesired transitions. I recommend unpairing/repairing, reseting the key, restarting at random points (especially during updates), etc.
How to test firmware and FPGA updates:
You can load older images onto Monocle and it should trigger an update.
Controller.swift around line 164 you will see _requiredFirmwareVersion and _requiredFPGAVersion. Change a character in these to force an update. But warning: this will create an infinite update loop when the device resets because, obviously, that fake version will never be returned. I recommend monitoring log output carefully to detect when the device is about to reset, kill the app from Xcode, revert back the version number, and proceed.
Similarly, to force scripts to be loaded, just change any character in a python script. E.g., add a fake comment or an extra space. This will change the SHA and cause the app to send over the scripts.
New UI behavior:
Things to look out for:
How to test firmware and FPGA updates: