/**********************************************************************
 *****  INCLUDE FILE FOR HW DEFINITION IN CORE LIBRARY	          *****
 *****  (WARNING: do not change variable names				      *****
 *****                                                            *****
 *****  Name: core_lib.h                                          *****
 *****  Desc: hardware layer definitions					      *****
 *****  Ver.: 1.0                                                 *****
 *****  Date: 01/2011		                                      *****
 *****  Auth: Martin Mechacek		                              *****
 *****  Comp: ESTELAR s.r.o.									  *****
 *****                                                            *****
 *****  Copyright ESTELAR s.r.o. (c) 2010, all rights reserved    *****
 **********************************************************************/ 

#ifndef __DEF_LOG4_H
#define __DEF_LOG4_H


#include "../Project/LOG4/iodefine.h" 


/////////////////////// IMPORTANT /////////////////////////////////////
/////  Your project must be compiled with define: CORE_EDK    /////////	
/////  														  /////////	
/////  unit: LOG4											  /////////	
/////  desc: terminal LOG s kalvesnici						  /////////	


/**********************************************************************
 *****  IMPLEMENTATION AREA							 			   ****
 *****  set specification according to your hardware		       ****
 *********************************************************************/ 



/*******************************************************************************/
// definice  priorit preruseni 1-7 (7 = nejvyssi priorita)
/*******************************************************************************/
#define INT_LEVEL_RXD			0x07	// RXD data
#define INT_LEVEL_INT1			0x06	// detekce bitu na RXD0
#define INT_LEVEL_RXD2			0x05	// detekce bitu na RXD2
#define INT_LEVEL_KI			0x05	// preruseni od SYNC	
#define INT_LEVEL_INT2			0x04	// preruseni od INT2

#define INT_LEVEL_TIMER_A		0x04	// preruseni od TIMER A
#define INT_LEVEL_ADC			0x03	// preruseni od ADC
#define INT_LEVEL_TIMER_B		0x02	// timeout timer	
#define INT_LEVEL_TIMER_E		0x01	// preruseni nevyuzito
#define INT_LEVEL_INT0			0x01	// preruseni nevyuzito
#define INT_DISABLED			0x00	// zakazano preruseni



/*******************************************************************************/
// define RS485 bus connections
// vysilani dat na sbernici probiha pouze aktivaci budice RS485
// vystup TxD je trvale v '0'
  #define RS485_DRIVER_TX_LO	  p1_4 = 0;   	// nastavuje '0' na pin TxD - P14


// pin VRXD slouzi pro zpetny odposlech stavu sbernice pro vyhodnoceni kolize
  #define VRXD 				  p1_7	   //p1_7 

//Interrupt - IRQ0
  #define VRX_ClearFlags			{  /*_IRR1.BIT.IRRI0 = 0;*/ }		       // vymazani flagu IRQ0


// data se vysilaji pomoci signalu DE
// pokud DE=1 na sbernici se zapisuje 0 a opacne, v klidu je nastaven na Lo
  #define SET_VTXD(data) 	if(data) p1_6 = 1; else p1_6 = 0	// nastavuje hodnotu na pin DE - P16

//========================================================================
//>> BUS_BAUDRATE 
// 19 200 bd serial constant definifion
// konstanty BUS_FREE_TIMEOUT, BUS_WAIT_TIMEOUT jsou definovany podle rychlosti volani BusTimer()
// ostatni se musi presne odmerit osciloskopem podle rychlosti procesoru, mista pro mereni jsou oznacena ve funkci BusPutChar
//------------------------------------------------------------------------

  #define 	BUS_BAUDRATE    	19200	// prenosova rychlost na sbernici	
  #define	BUS_FREE_TIMEOUT	5		// 5 ms - pokud trva klid na lince tuto dobu, bude nastaven priznak BUS_FREE (cca 10 znaku) - !! v praxi namereno 10 ms ??
  #define	BUS_WAIT_TIMEOUT	15		// doba cekani na nastaveni priznaku BUS_FREE (5x BUS_FREE_TIMEOUT)

  #define 	PERIOD10us			8		// konstatnta pro dobu aktivace driveru RS485 - 10 us - hodnota neni kriticka
  #define 	BITPERIOD1   		26		// doba trvani jednoho bitu - pokud se zapisuje jednicka ve smycce je vice instrukci proto je kratsi)
										// pro rychlost 19200 je ve smycce vlozena instrukce NOP pro dosazeni presneho casovani 
										// hodnota je svazana s PERIOD10us, presne nastaveni je mozne doladit zmenou PERIOD10us (+-1)

  #define 	BITPERIOD			59		// konstatnta pro dobu trvani jednoho bitu - 50us
  #define 	BITPERIOD2			57		// konstatnta pro dobu trvani jednoho bitu - 50us
  
  #define 	BITPERIOD_19200		58		// konstatnta pro dobu trvani jednoho bitu - 50us

// pro rychlost 19200 je doba prenosu 1 byte 468us
// prodleva mezi jednotlivymi byty je cca 20us - pokud je procesor prilis rychly vlozi se prodleva 
  #define 	BYTEMARKER   		255		// doplneni prodlevy
//<< end of BUS_BAUDRATE



// define macros for sci interrupt enable/disable
#define RX_InterruptEnable		{  s0ric.byte = INT_LEVEL_RXD; }  	   // povol RX Interrupt, priority 4
#define RX_InterruptDisable		{  s0ric.byte = INT_DISABLED; }   	   // zakaz RX Interrupt
#define RX_ClearFlags			{  /*_SCI3.SSR.BYTE = 0; _SCI3.RDR;*/ }    // vymazani prijijateho bytu a souvisejicich flagu

#define ALL_InterruptDisable	{  asm ("fclr i");   }    // zakazat vsechna preruseni pro presne casovani odesilani na sbernici
#define ALL_InterruptEnable		{  asm ("fset i");   }    // povolit vsechna preruseni pro presne casovani odesilani na sbernici

// zakazat vsechna preruseni od casovacu
#define ALL_TimersInterruptDisable	{ traic.byte = INT_DISABLED; trbic.byte = INT_DISABLED; treic.byte = INT_DISABLED; }
#define ALL_TimersInterruptEnable	{ traic.byte = INT_LEVEL_TIMER_A; trbic.byte = INT_LEVEL_TIMER_B; treic.byte = INT_LEVEL_TIMER_E; }    // povolit vsechna preruseni od casovacu




#define ENABLE_TIMEOUT_TIMER_ONLY	{ traic.byte  = INT_DISABLED;		\
									  trbic.byte  = INT_LEVEL_TIMER_B;  \
									  treic.byte  = INT_DISABLED; 		\
									  s0ric.byte  = INT_DISABLED; 		\
									  adic.byte   = INT_DISABLED; 		\
									  int1ic.byte = INT_DISABLED; 		\
									}    // povolit vsechna preruseni od casovacu

#define ADC_InterruptDisable 	{ adic.byte = INT_DISABLED;  }
#define ADC_InterruptEnable 	{ adic.byte = INT_LEVEL_ADC; }
	

#define INT1_InterruptDisable	{  int1ic.byte = INT_DISABLED;    }    // zakazat INT1 preruseni
#define INT1_InterruptEnable	{  int1ic.byte = INT_LEVEL_INT1;  }    // povolit INT1 preruseni

#define RECEIVER_ENABLE			re_u0c1 = 1
#define RECEIVER_DISABLE		re_u0c1 = 0

#define SYNC_InterruptEnable	ki0en = 1					// p10 enable KI interrupt
#define SYNC_InterruptDisable	ki0en = 0					// p10 disable KI interrupt
	
	
// maximalni delka celeho jednoho paketu pro prijem i odesilani
// pokud je prijat delsi paket, bude korektne obslouzen, ale data z neho nebudou zpracovana
// soucasne generuje chybu ERR_SCI_LONG do gData.SciState
// aplikace by mela odeslat chybovou zpravu
// dle nastavene hodnoty se alokuje potrebna pamet, proto je treba prihlednout k HW moznostem konkretniho zarizeni
#define MAX_MESSAGE_LEN			80			// pro prikaz DLL - 64 bajtu data + 14 bajtu paket je 78 bajtu.

// maximalni delka prijimaciho bufferu ve kterem se ukladaji 
// prijata data z linky nez se zpracuji jako pakety - co nejvice podle velikosti dostupne RAM
#define RX_BUFF_SIZE			0x3f		// bytes





/////// end of IMPLEMENTATION AREA ///////////////////////////////////*/

#endif 		// __DEF_GR-U01

