//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------
#include <m8c.h> 
#include "PSoCAPI.h" 
#include "UART.h"
#include "delay.h"
#include <stdlib.h>

#define BUFFER_SIZE 0x08
#define ADT7410_ADDRESS  0x48 	//adresa I2C čidla

int cas = 9;
int enable=0;
int i = 0;
char buffer;
int counter = 0;
	
int bADCData;
void init_ADT7410(void)  	//inicializace I2C teplotního čidla
{  
	BYTE    txBuffer[BUFFER_SIZE];  
	txBuffer[0] = 0x03; // adresa registru
	txBuffer[1] = 0x80;	// zápis do registru pro 16 bit přesnost
		I2CHW_bWriteBytes(ADT7410_ADDRESS, txBuffer, 2, I2CHW_CompleteXfer);  
		while(!(I2CHW_bReadI2CStatus() & I2CHW_WR_COMPLETE));  
		I2CHW_ClrWrStatus();    
}  

  
void read_temperature_ADT7410(void)		//vyčtení teploty s následným vytisknutím na UART  
{  
	int temp=0;
	BYTE    txBuffer[BUFFER_SIZE];  
	BYTE    rxBuffer[BUFFER_SIZE];  
	BYTE    status; 
	txBuffer[0] = 0x00; //adresa registu pro vyčtení teploty
		I2CHW_bWriteBytes(ADT7410_ADDRESS, txBuffer, 1, I2CHW_CompleteXfer);  // zapíše txBuffer do zařízení  
        while(!(I2CHW_bReadI2CStatus() & I2CHW_WR_COMPLETE));  
        I2CHW_ClrWrStatus();  
        I2CHW_fReadBytes(ADT7410_ADDRESS, rxBuffer, 2, I2CHW_CompleteXfer);   //čtení ze zařízení a umístění do rxBuffer
        while(!(I2CHW_bReadI2CStatus() & I2CHW_RD_COMPLETE));  
        I2CHW_ClrRdStatus();  
		/* úprava dat pro výstup */ 
		temp = ((rxBuffer[0] << 8) | rxBuffer[1]); //spojí rxBuffery na 16 bit číslo
		UART_PutSHexInt(temp);	//pošle na UART hodnotu teploty v HEXa kódu
		I2CHW_SendStop();		//stop bit
}  

void init_I2C(void)  //konfigurace I2C sběrnice
{  
    I2CHW_Start();
    I2CHW_EnableMstr();
    I2CHW_EnableInt();  
}

void analog_input(void)	
	{
			if(ADCINC_fIsDataAvailable() != 0) {
			bADCData = ADCINC_wGetData(); //čte i 16 bit 
			UART_PutSHexInt(bADCData);
			UART_CPutString("\n");
			ADCINC_fClearFlag();
				}		
	}
	
void mereni_init (void)		//nastaveni pro analogové měření
{
	ACB00CR2 &= ~0x1C; 
   	ACB00CR2 |= 0x1C;
	RefLow_Start(RefLow_HIGHPOWER);
	Buffer_Start(Buffer_HIGHPOWER);
	ADCINC_Start(ADCINC_HIGHPOWER); 
}

int mereni_napeti (BYTE bChannel)	//měření napětí
{
	int iV=0;
	
	AMUX8_1_InputSelect(bChannel);      
	ADCINC_fClearFlag();
	ADCINC_GetSamples(1);  //odměří pouze jeden vzorek   
	while(!ADCINC_fIsDataAvailable());
	iV = bADCData = ADCINC_wGetData();
	
	return iV;
}
void mereni_odporu (void)	//odměří napětí na všech místech pro výpočet odporu
{
	int iV0=0; 	// referenční napětí - vysoké (Vref+)
	int iV1=0;	// čislo1
	int iV2=0;	// referenční napětí - nízké (Vref-)
	int iV3=0;	// čidlo2

	iV0 = mereni_napeti (AMUX8_1_PORT0_3);		// čtení V0 (Vref+) 
	iV1 = mereni_napeti (AMUX8_1_PORT0_1);		// čtení V1 (čidlo1)
	iV2 = mereni_napeti (AMUX8_1_PORT0_5);		// čtení V2 (Vref-) 
	iV3 = mereni_napeti (AMUX8_1_PORT0_7);		// čtení V3 (čidlo2) 

	/*následující odstavec tiskne hodnoty napětí na odporovém můstku ze všech čidel*/
	UART_PutSHexInt(iV0);	
	UART_CPutString("\t");
	UART_PutSHexInt(iV1);
	UART_CPutString("\t");
	UART_PutSHexInt(iV2);
	UART_CPutString("\t");
	UART_PutSHexInt(iV3);
	UART_CPutString("\t");

}

void UART_init (void)	//nastevení UART komunikace 
{
	UART_EnableInt();
    Counter8_WritePeriod(155);            // nastavení hodnoty baud rate generatoru
    Counter8_WriteCompareValue(77);
    Counter8_Start();                     // spuštění baud rate generatoru     
    UART_Start(UART_PARITY_NONE);         // Povolení komunikace UART
}
void read_UART(void)	//čtení příchozí komunikace
{
    int Parameter_code = 0;
	char * strPtr;                        // Parameter pointer 
	int Signum_Value = 1;
	char *H_parameter[4];

       if(UART_bCmdCheck())  // kontroluje příchozí komunikaci
	   {                   
         	if(strPtr = UART_szGetParam()) 
		 	{      								 
				H_parameter[0]= strPtr;          
				Parameter_code = atoi(H_parameter[0]); 
				if(Parameter_code == 8)	// 8 je komunikační kod a povoluje komunikaci a přepsání stavu hmustku
				{ 
					if(strPtr = UART_szGetParam()) 
					{      								 
						H_parameter[1]= strPtr;
						Signum_Value = atoi(H_parameter[1]);
							if(Signum_Value == 0) 
							{  
								H_NAPAJENI_Off();	//vypne napájení na můstku
							} 
							if(Signum_Value == 1) 
							{  
								H_NAPAJENI_On();	//zapne napájení na můstku
								counter = 0;	
							} 
						if(strPtr = UART_szGetParam()) 
						{      								 
							H_parameter[2]= strPtr;
							Signum_Value = atoi(H_parameter[2]); 
								if(Signum_Value == 0) 
								{  
									H_POLARITA_Off();	//nastaví polaritu na mustek
								} 
								if(Signum_Value == 1) 
								{  
									H_POLARITA_On();	//nastaví polaritu na mustek
								} 
						} 
						
					 
					
 					} 
				}
			} 

        } 
      UART_CmdReset();                          // Resetovací příkaz bufferu  
}

void init_H(void)  //spuštení hmustku
{  
	H_NAPAJENI_Start();
	H_POLARITA_Start(); 
}

void protect(void)  //ochrana proti nečekanému přerušení komunikace
{  
	counter++;
	if (counter >= 6)
	{
		H_NAPAJENI_Off();
		counter = 6;	//pokud 6 cyklu nezaregistruje mikroprocesor příchozí komunikaci, vypne napájení mustku
	}		
}
	
void main(void)		//tělo hlavního programu
{
    M8C_EnableGInt; // povoleni preruseni
	UART_init();	//inicializace UART komunikace
	mereni_init();	//nastavení analogoveho měření
    init_I2C();		//inicializace I2C rozhraní
	init_ADT7410();	//inicializace I2C čidla
	init_H();		//inicializace ovládání mustku

    UART_CPutString("Termobox\n");	//možno si na příchozí straně ověřit správný start komunikace

	while(1) 
	{ 
		read_UART();		//zkontroluje nové hodnoty přijaté z UARTu
		mereni_odporu();	//odměří hodnoty napětí na odporech a vytiskne na UART
		read_temperature_ADT7410();		//přečte hodnotu teploty v I2C čidlu a vytiskne na UART
		UART_CPutString("\n");			//ukončení řádku v UART komunikaci
		protect();			//kontrola komunikace s počítačem, pokud do cca 3s počítač nezareaguje, tak se hmustek vypne
		PROVOZNI_LED_Invert();			//invertování stavu na kontrolní diodě v čele krabičky
		Delay10msTimes(50);	//přerušení odesílání dat na dobu 500ms
	}	
}
	

    


    
   

