//************************************************************************************//
// Auteur     : Christophe Le Lann                                                    //
// Mail       : totofwebcreation@gmail.com                                            //
// Site perso : www.totofweb.ma.cx                                                    //
//************************************************************************************//
// Caractéristiques du robot                                                          //
//   - roues de 121mm de diamètre                                                     //
//   - roues espacées de 156mm                                                        //
//   - vitesse de rotation de 1 tour/s                                                //
//   - soit 380 mm/s                                                                  //
//************************************************************************************//
// Action du robot : filoguidage par RS232                                            //
//************************************************************************************//

#include <16F877A.h>                             // Inclusion du Header correspondant au µC utilisé
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP       // Paramétrage des fusibles du microcontrôleur
#use delay(clock=20000000)                       // Quartz de 20MHz
#use rs232(baud=115200, xmit=PIN_C6,rcv=PIN_C7)  // Liaison RS232 sur RC6 et RC7 à 115200b/s

//******************************
// Librairies
//******************************
#include "libservos.c"                           // Librairie de génération de PWM pour la commande des servos

//******************************
// Defines
//******************************
#define DEBUT_TIMER0 4                           // (254-4)/(20000000/4) = 50 µs

//******************************
// Variables globales
//******************************
int rs232_commande;

//******************************
// Timers & Interruptions
//******************************
void config_interrupts() {
	set_timer0(DEBUT_TIMER0);
	setup_timer_0(RTCC_INTERNAL);
	enable_interrupts(INT_TIMER0);
	enable_interrupts(INT_RDA);
	enable_interrupts(GLOBAL);
}

#INT_TIMER0
void main_pwm() {                                // toutes les 50µs
	generation_pwm();
	set_timer0(DEBUT_TIMER0);
}

#INT_RDA
void main_rs232rx() {
	rs232_commande = getc();
	//printf("Commande : %u\n\r", rs232_commande);

	switch(rs232_commande) {
		case 49: // 1
			moteur_gauche_arreter();
			moteur_droit_reculer();
			break;
		case 50: // 2
			moteur_gauche_reculer();
			moteur_droit_reculer();
			break;
		case 51: // 3
			moteur_gauche_reculer();
			moteur_droit_arreter();
			break;
		case 52: // 4
			moteur_gauche_reculer();
			moteur_droit_avancer();
			break;
		case 53: // 5
			moteur_gauche_arreter();
			moteur_droit_arreter();
			break;
		case 54: // 6
			moteur_droit_reculer();
			moteur_gauche_avancer();
			break;
		case 55: // 7
			moteur_gauche_arreter();
			moteur_droit_avancer();
			break;
		case 56: // 8
			moteur_gauche_avancer();
			moteur_droit_avancer();
			break;
		case 57: // 9
			moteur_gauche_avancer();
			moteur_droit_arreter();
			break;
		default:
			printf("Commande invalide !\n\r");
			break;
	}
}

//******************************
// Programme principal
//******************************

void main () {
	config_interrupts();

	printf("Demarrage\n\r");
	delay_ms(200);

	while (TRUE);
}
