As someone who wrote more variants of button handling code than I have fingers (mostly for physical buttons): Buttons can be way more complex than people usually would suspect:
- Buttons need to be debounced so you don't trigger 10 presses because the contacts bounce 10 times up and down before they settle to the on state
- maybe you want different states and callbacks for single press, while pressed, double press, long press, very long press, release — all of which require to measure time and some thinking (e.g. how can you reach a long press when there is a short press before ?)
- how to properly implement key combinations? Does order matter? How would you handle a "both keys at the same time"-scenario if in reality they are many milliseconds apart?
And there are always tradeoffs, which is why I had to write more than once variant of the thing (that, and I got better at writing it).
You might want to add graphviz/digraph export (and possibly import). It's a pretty decent format for this kind of task, supported by several IRL tools.
Oh ... 2010. I guess it's not actively being maintained.
Check out automatarium - https://automatarium.tdib.xyz/
It can do finite state automata, pushdown automata and turning machines. We use it for computing theory classes at RMIT, and it was built by RMIT students.
To make matters more confusing, on some Macbook models (locale dependent?) the backspace key is labeled as "delete" (but still functions as a backspace key, unless you hold fn)
I remember this! It was one of my inspirations for creating a hierarchical state machine editor [0] and a state machine library with a visualization layer [1].
This is a handy tool, but I wish it supported edge snapping. If you inspect the generated LaTeX it doesn't actually link up the FSM states, it just anchors them to raw TikZ coordinates.
https://web.stanford.edu/class/archive/cs/cs103/cs103.1142/b...