Помимо того, что я никак не мог разобраться, как же мне обрабатывать биты, полученные с валкодера (за подсказку ещё раз спасибо sun_jr), я также столкнулся с тем, что периодически я получал не ожидаемые биты, а какую-то ересь, которой по таблице состояний валкодера быть не должно в принципе.
Выяснилось, что я напарывался на известную проблему в электронике -- дребезг контактов. Вот ты думаешь, ты кнопку нажал -- и всё, сразу ноль поменялся на единицу? А вот фигачечная. Прежде чем устаканиться на единице, проходит некоторое время, когда контакты переключателя, сталкиваясь друг с другом, отскакивают и искрят, а на выходе в это время там может быть всё, что угодно.
Увидеть это просто, если вооружиться приборами. Понадобится осциллограф с триггерным режимом. Вот смотри какую "красоту" выдаёт в момент переключения с 0 на 1 дешёвый безымянный китайский механический валкодер:
Одно деление шкалы -- 250 микросекунд. Таким образом, на протяжении около 5 миллисекунд с валкодера приходит всё, что угодно, кроме настоящих данных.
Методы борьбы известны -- как только мы считываем изменение положения переключателя, ждём время, за которое переключатель гарантированно перейдёт в устойчивое состояние, и считываем положение переключателя заново. В моём случае хватило ждать 5 миллисекунд внутри цикла после первого считывания единицы.
Ну, а по-хорошему, валкодеры надо покупать качественные оптические, например, Борнс или Ханивелл, а не кетайские механические. Там не будет такого безобразия.