если delta != prevDelta (то есть изменилось направление вращения) то сообщения не посылать вовсе. То есть примерно так:
{
char delta = (cur - prev) & 3;
if( delta == 0 )
return;
prev = cur;
if( delta == 2 ) {
processDelta( prevDelta );
processDelta( prevDelta );
} else if( delta != prevDelta ) {
prevDelta = delta;
} esle {
processDelta( delta );
}
Ну и
void processDelta( char delta )
{
if( delta & 2 )
down();
else
up();
}