/*
 * c't-Bot
 * 
 * This program is free software; you can redistribute it
 * and/or modify it under the terms of the GNU General
 * Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your
 * option) any later version. 
 * This program is distributed in the hope that it will be 
 * useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 * PURPOSE. See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public 
 * License along with this program; if not, write to the Free 
 * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307, USA.
 * 
 */

/*! @file 	ena.c 
 * @brief 	Routinen zur Steuerung der Enable-Leitungen
 * @author 	Benjamin Benz (bbe@heise.de)
 * @date 	26.12.05
*/

#ifdef MCU 

#include <avr/io.h>
#include "ena.h"
#include "ct-Bot.h"
#include "shift.h"
#include "mouse.h"

#ifdef ENA_AVAILABLE


uint8 ena =0;	/*!< Sichert den Zustand der Enable-Leitungen */

/*!
 * Initialisiert die Enable-Leitungen
 */
void ENA_init(){
	DDRD |= 4;
	shift_init();
	ENA_set(0x00);
}


//void maus_sens_write(int8 adr, uint8 data);
/*! 
 * Schaltet einzelne Enable-Transistoren an
 * andere werden nicht beeinflusst
 * Achtung, die Treiber-Transistoren sind Low-Aktiv!!! 
 * ENA_on schaltet einen Transistor durch
 * Daher zieht es die entsprechende ENA_XXX-Leitung (mit Transistor) auf Low und NICHT auf High
 * @param enable Bitmaske der anzuschaltenden LEDs
 */
void ENA_on(uint8 enable){
//	uint8 i;
	// Maussensor und MMC-Karte haengen zusammen
	if (enable == ENA_MOUSE_SENSOR){		// Maus sensor an, MMC aus
		
//		if ((ena & ENA_MMC) ==0){ // War die MMC-Karte an?
			ena |= ENA_MMC;			// MMC aus
	
//	        PORTD |= 4;	// Fliplops takten
//	        PORTD &= ~4;
//	
//			for (i=0; i<200; i++){	// Ein paar flanken schocken, damit auch sicher danach ruhe ist
//				PORTB &= ~(1<<7);
//				PORTB |= (1<<7);
//			}			
//		}
		
		// Und dann den Maussensor an
		ena &= ~ENA_MOUSE_SENSOR;		
	} else	if (enable == ENA_MMC) {		// Maus sensor aus, MMC aan
		#ifdef MAUS_AVAILABLE
			if ((ena & ENA_MOUSE_SENSOR) ==0){ // War der Maussensor an?
				maus_sens_highZ();	// Der Maussensor muss die Datenleitung freigeben
				ena |= ENA_MOUSE_SENSOR;	// Maus aus
			}
		#endif
		ena &= ~enable;
	} else {
		ena |= enable;
	}
	
	ENA_set(ena);
	
	if ( (enable & (ENA_MOUSE_SENSOR | ENA_MMC)) != 0 ){
        PORTD |= 4;	// Fliplops takten
        PORTD &= ~4;
	}
}

/*! 
 * Schaltet einzelne Enable-Transistoren aus
 * andere werden nicht beeinflusst
 * Achtung, die Treiber-Transistoren sind Low-Aktiv!!! 
 * ENA_off schaltet einen Transistor ab
 * Daher zieht es die entsprechende ENA_XXX-Leitung (mit Transistor) auf High und NICHT auf Low
 * @param enable Bitmaske der anzuschaltenden LEDs
 */
void ENA_off(uint8 enable){
	ena &= ~enable;
	ENA_set(ena);
	
	if ( (enable & (ENA_MOUSE_SENSOR | ENA_MMC)) != 0 ){
        PORTD |= 4;	// Fliplops takten
        PORTD &= ~4;
	}
}

/*!
 * Schaltet die Enable-Transistoren
 * Achtung, die Treiber-Transistoren sind Low-Aktiv!!! 
 * ENA_set bezieht sich auf die Transistor
 * Daher zieht es die entsprechende ENA_XXX-Leitung auf ~enable
 * @param LED Wert der gezeigt werden soll
 */
void ENA_set(uint8 enable){
	ena=enable;
	shift_data(~enable,SHIFT_REGISTER_ENA); 
}

#endif
#endif
