Ejemplo n.º 1
0
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);
}