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

#ifndef _DEF_GR-DR1_H
#define _DEF_GR-DR1_H

#include "stm32f4xx.h"
#include "stm32f417xx.h"
/////////////////////// IMPORTANT /////////////////////////////////////
/////  Your project must be compiled with define: CORE_GR_U01 /////////	
/////  														  /////////	
/////  unit: GR-U01 										  /////////	
/////  desc: ridici jednotka do rozvadece					  /////////	


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


//========================================================================

// define RS485 bus connections
// vysilani dat na sbernici probiha pouze aktivaci budice RS485 signalem DE (VTXD)

// vystup TxD musi byt trvale v '0'
  #define RS485_DRIVER_TX_LO	  GPIOC->BSRRH = GPIO_Pin_6//_IO.PDR2.BYTE &= ~0x0C   	// nastavuje '0' na pin TxD - P22, taky pin P23 pro signal /RE na cipu RS485

// pin RxD je pripojen standartne na RxD vstup UARTU - P21, musi byt fyzicky propojen na VRXD
// pin VRXD slouzi pro zpetny odposlech stavu sbernice pro vyhodnoceni kolize pres interrupt
  #define VRXD 				  ((GPIOA->IDR & (GPIO_Pin_15)) == 0 ? 0 : 1)//_IO.PDR1.BIT.B5				// definice pinu VRXD-P15 = IRQ1

// 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)GPIOG->BSRRL = GPIO_Pin_8;else GPIOG->BSRRH = GPIO_Pin_8;	// nastavuje hodnotu na pin DE - P20


//========================================================================
//>> 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	3		// 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			7		// konstanta pro dobu aktivace driveru RS485 - 10 us - hodnota neni kriticka
  #define 	BITPERIOD   		36		// konstanta pro dobu trvani jednoho bitu - 50us
  #define 	BITPERIOD1   		22		// 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)
// 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   		0		// doplneni prodlevy
	
//<< end of BUS_BAUDRATE


// define macros for sci interrupt enable/disable
#define RX_InterruptEnable		USART_ITConfig(USART6, USART_IT_RXNE, ENABLE)  	   // povol RX Interrupt
#define RX_InterruptDisable		USART_ITConfig(USART6, USART_IT_RXNE, DISABLE)   	   // zakaz RX Interrupt
#define RX_ClearFlags			USART_ClearITPendingBit(USART6,USART_IT_RXNE)    // vymazani prijijateho bytu a souvisejicich flagu
/*
#define VRX_InterruptEnable		{  _IENR1.BIT.IEN1 = 1; }  	   		   // povol VRX Interrupt - IRQ1
#define VRX_InterruptDisable	{  _IENR1.BIT.IEN1 = 0; }   		   // zakaz VRX Interrupt - IRQ1*/
#define VRX_ClearFlags			EXTI_ClearITPendingBit(EXTI_Line15);		       // vymazani flagu IRQ1

#define ALL_InterruptDisable	 __disable_irq()//{  asm ("ldc %0l,ccr"::"r"(0xC0)); }    // zakazat vsechna preruseni pro presne casovani odesilani na sbernici
#define ALL_InterruptEnable		 __enable_irq()//{  asm ("ldc %0l,ccr"::"r"(0)); }   	// povolit vsechna preruseni pro presne casovani odesilani na sbernici

// 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
#ifdef DEBUG
  #define MAX_MESSAGE_LEN			32	
#else
  #define MAX_MESSAGE_LEN			80	
#endif

// maximalni delka prijimaciho bufferu ve kterem se ukladaji 
// prijata data z linky nez se zpracuji jako pakety - co nejvice podle velikosti dostupne RAM
// touto hodnotou se maskuje, tedy musi to byt vzdy souvisla rada jednicek
#ifdef DEBUG
 #define RX_BUFF_SIZE			0x1ff		// 0x1ff - 512 bytes
#else
 #define RX_BUFF_SIZE			0xfff		// 0xfff - 4096 bytes
#endif

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

#endif 		// _DEF_GR-DR1_H

