Тут есть хитрый момент. Если импульсов было больше, чем код успел переварить, мы не можем данной проверкой выловить ошибку на 100%. Два входа могут передёрнуться и встать так, что пройдут эту проверку. Например, мы перескочили в обход кода только на 1 импульс (или на 4). При этом только 1 вход изменит своё состояние (или не один, если перескочили на 4).wldev писал(а): ↑Код: Выделить всё
if(stateA!=encoder[c].stateA &&stateB!=encoder[c].stateB) //если оба канала изменились то значит не успели { //Error }
wldev писал(а): ↑Код: Выделить всё
if ( state == encoder[c].state ) continue; //дальше пройдём только если неравно encoder[c].pos += encoder_states[encoder[c].state] == state ? 1 : -1; // и здесь всегда будет только -1? encoder[c].state = state;
Тут используется хитрая проверка. Индекс предыдущего AB состояния (от 0 до 3) используется для проверки следующего состояния с помощью массива всех возможных состояний.