void *Rotary::monitor(void *arg) { Rotary *rotary = static_cast<Rotary *>(arg); int state = DETENT; int last = -1; while (rotary->run_state) { int value = rotary->phase(); if (value != last) { //printf("value: %x\n", value); switch (state) { case DETENT: if (value == 2) { state = CW_1; } else if (value == 1) { state = CCW_1; } break; case CW_1: if (value == 0) { state = DETENT; } else if (value == 3) { state = CW_2; } break; case CW_2: if (value == 2) { state = CW_1; } else if (value == 1) { state = CW_3; } break; case CW_3: if (value == 1) { state = CW_2; } else if (value == 0) { state = DETENT; rotary->_position++; //printf("CW! position: %d\n", rotary->_position); } break; case CCW_1: if (value == 0) { state = DETENT; } else if (value == 3) { state = CCW_2; } break; case CCW_2: if (value == 1) { state = CCW_1; } else if (value == 2) { state = CCW_3; } break; case CCW_3: if (value == 3) { state = CCW_2; } else if (value == 0) { state = DETENT; rotary->_position--; //printf("CCW! position: %d\n", rotary->_position); } } last = value; //usleep(10); } //usleep(3); rotary->loop_count++; } pthread_exit(NULL); }