/* Ken Dye
 * mouser.c
 * NQC code for controlling a mapping bumper robot.
 */

#pragma noinit
#define LEFT		OUT_A
#define RIGHT		OUT_C

#define BUMPER		SENSOR_1
#define RIGHTROT	SENSOR_2
#define LEFTROT		SENSOR_3

#define EVENT_COLLIDE	0

#define MAX_POINTS	16

#define BACKOFF_DISTANCE	20

task main()
{
	int point_count = 0;
	int bias = 0;
	int state = 0; // 0 for moving forward, 1 for reverse, 
		           // 2 for turning
	int newheading = 0;
	int leftpower = 1;
	int rightpower = 5;
	int turn = 1;
	CreateDatalog(6*MAX_POINTS);
	
	SetSensor(LEFTROT, SENSOR_ROTATION);
	ClearSensor(LEFTROT);
	SetSensor(RIGHTROT, SENSOR_ROTATION);
	ClearSensor(RIGHTROT);
	SetSensorMode(BUMPER, SENSOR_MODE_RAW);

	SetPower(LEFT, 3); 
	SetPower(RIGHT,2);

	Fwd(RIGHT);
	Fwd(LEFT);
	On(RIGHT+LEFT);
	SelectDisplay(DISPLAY_SENSOR_3);

	while(point_count < MAX_POINTS)
	{
		

		switch(state)
		{
		case 0:
			if(BUMPER < 950) {
				Off(LEFT+RIGHT);

				AddToDatalog(LEFTROT);
				AddToDatalog(RIGHTROT);
				point_count++;					

				newheading = (Random(62)+28);

				if(Random(1) == 0)			// randomize left or right turn
					newheading = newheading * -1;
				ClearSensor(LEFTROT);
				ClearSensor(RIGHTROT);
				state = 1; // first back off the wall a little
				Rev(LEFT+RIGHT);
				On(LEFT+RIGHT);
			}
			break;
		case 1:
			if(RIGHTROT >= BACKOFF_DISTANCE)
			{
				Off(LEFT+RIGHT);
				AddToDatalog(LEFTROT);
				AddToDatalog(RIGHTROT); // Log how much we actually backed up
				state = 2; // now we turn!
				ClearSensor(LEFTROT);
				ClearSensor(RIGHTROT);

				if(newheading < 0) {
					Fwd(RIGHT);
					Rev(LEFT);
				} else {
					Fwd(LEFT);
					Rev(RIGHT);
				}
				SetPower(LEFT+RIGHT,1);
				On(RIGHT+LEFT);
			}
			break;
		case 2:
			if(abs(RIGHTROT) >= abs(newheading))  // LEFTROT should == RIGHTROT while
												 // turning
			{
				Off(LEFT+RIGHT);
				AddToDatalog(LEFTROT);  // log how much we actually turned
				AddToDatalog(RIGHTROT);
				state = 0;              // move forward again
				ClearSensor(LEFTROT);
				ClearSensor(RIGHTROT);
				SetPower(LEFT, 3); 
				SetPower(RIGHT,2);
				Fwd(LEFT+RIGHT);
				On(LEFT+RIGHT);

			}
			break;
		default:
			break;
		}

	}
	Off(LEFT+RIGHT);

}
