A few people I work with are tinkering with an off-the-shelf drone in our spare time and so we are writing a C# library to control it.
The way it works is you send UDP commands to the drone and you receive a stream of status & navigation UDP packets from it. So everything is asynchronous by default. You don’t send a command and get back an “I got it!” response. You have to send a command and then monitor the status for a change reflecting your desired state,
For example, to start flying, you must repeatedly send the “take off” packet every few milliseconds until you see the “is flying” flag set in the status packets. Lets see what that would look like.
We want the SendCommand method to be asynchronous and totally decoupled from the UI. So the send process looks like this.
Broken down, each function is simple enough to understand and debug. This simplicity only comes from the power of Rx, the TPL and the async/await functionality. Imagine what the code would look like before when all the timers and .NET events and state would have to be managed directly.
Mostly I just liked his title... :P
Well that and there are some tips in this post that will come in handy, right about, well, now...