gpioctl icon indicating copy to clipboard operation
gpioctl copied to clipboard

rotary state machine may be suboptimal

Open nettings opened this issue 5 years ago • 0 comments

/* Yay. A bit-wise state machine :)
 *
 * State:
 *   nnnn
 *   |||+----> clk bit
 *   ||+-----> dt bit
 *   |+------> clockwise bit
 *   +-------> outer ring bit
 *
 * The clk and dt bits are set by interrupt handlers.
 * They can change rapidly when the switch hardware
 * bounces.
 *
 * Two rings:
 *  Outer        1100*_    _1000*
 *                /    \  /    \
 *  Inner        /     0x00     \
 *              |      /  \      |
 *            1101  0010  0101  1010
  *             |     |    |     |
 *               \  0011* 0111* /
 *                \    \  /    /
 *                 \___1x11___/ 
 *
 * The starred states will fire a callback.
 * Between two unstarred states, we tolerate bouncing.
 * A starred state cannot bounce back, because we 
 * change rings immediately, so that it cannot trigger 
 * again.
 * We need two firing states per ring, because
 * in the (clk == dt) case, we cannot tell which
 * direction we're going.
 */

Right now, CLOCKWISE is only updated when we pass a 01 or 10 state, i.e. when CLK and DT differ. On 00 and 11 states, it remains unchanged. If we could "unset" it, we might be able to catch more invalid states, so the state machine might not be complete yet. It's very hard to trigger spurious directions changes already, but if they occur, then almost always in bursts of three or so.

nettings avatar Mar 12 '19 22:03 nettings