/*******************************************************************************
 * Copyright (c) 2017 FH-Dortmund and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     FH-Dortmund - initial API and implementation
 *******************************************************************************/
#include <tasks/rover_test_task.h>

void say(char *text){
   char buffer[1024];

   strcpy(buffer,"flite -voice rms -t \"");
   strcat(buffer, text);
   strcat(buffer,"\"");

   system(buffer);
}

void autopark() {
	int i;
	for (i = 0; i < 3; i = i + 1)
	{
		turn(BACKWARD, RIGHT, FULL_SPEED);
	}

	for (i = 0; i < 1; i = i + 1) {
		go(BACKWARD, LOW_SPEED);
	}

	for (i = 0; i < 3; i = i + 1) {
		turn(BACKWARD, LEFT, FULL_SPEED);
	}

	for (i = 0; i < 1; i = i + 1)
	{
		turn(FORWARD, RIGHT, FULL_SPEED);
	}

	for (i = 0; i < 1; i = i + 1) {
		go(BACKWARD, LOW_SPEED);
	}

	stop();
}

void getDistanceTrain(int channel,int rounds){
	int i;
	for (i=0 ; i<rounds ; i++){
		printf("Distance channel (cm) %d:%f\n",channel,getDistance(channel));
		delay(500);
	}
}


void *Rover_Test_Task(void *unused)
{
	CollectThreadName("Rover_Test_Task");

	int running = 1;
	init();
	while(running)
	{
		int c = getchar();

		switch (c) {
		case 'q':
			running = 0;
			break;
		case 'p':
			autopark();
			break;
		case 'i':
			go(FORWARD, FULL_SPEED);
			break;
		case 'u':
			turn(FORWARD, LEFT, FULL_SPEED);
			break;
		case 'k':
			go(BACKWARD, FULL_SPEED);
			break;
		case 'o':
			turn(FORWARD, RIGHT, FULL_SPEED);
			break;
		case 'j':
			turn(BACKWARD, LEFT, FULL_SPEED);
			break;
		case 'l':
			turn(BACKWARD, RIGHT, FULL_SPEED);
			break;
		case 'c':
			getTemperature();
			break;
		case 'd':
			printf("Distance channel %d:%f\n",0,getDistance(0));
			break;
		case 'e':
			printf("Distance channel %d:%f\n",1,getDistance(1));
			break;
		case 'r':
			getDistanceTrain(0,10);
			break;
		case 'f':
			getDistanceTrain(1,10);
			break;
		case 'h':
			getHumidity();
			break;
		case 's':
			stop();
			break;
		case 't':
			toggle_light();
			break;
		case 'w':
			say("Good morning! I am the PolarSys Rover!");
			break;
		}
	}

	/* the function must return something - NULL will do */
	return NULL;
}

