Downlink Core:

States:
IDLE
- Nothing is happening
- FIFO isn't being written to or read from. It should be empty.
- Move into
ARM when the arm command is received.
ARM
- Pop things into the FIFO. If the FIFO's more than halfway full, pop them out as well. This ensures the buffer remains half full.
- Move into
FILL when trigger condition is met.
FILL
- Waiting for the FIFO to fill
- Move to
DOWNLINK once full.
DOWNLINK
- Pop things off the FIFO until it's empty.
- Move to
IDLE once FIFO is empty.
Uplink Core:
Just two states, IDLE and RUN. Unless we want it to be reconfigurable, in which case we'll need states for being uninitialized or uploading. But this can be specified in the YAML.