/*
 * GccApplication4.c
 *
 * Created: 03.08.2020 16:38:39
 * Author : oli_r
 */ 

#include <avr/io.h>
#include "lib/enc28j60.h"
#include "lib/http.h"
#include "lib/net.h"
#include "lib/net_tcp.h"
#include "lib/usart.h"


volatile uint16_t   debugLevel;
volatile uint8_t    timeflags;
volatile uint16_t   counter;


#define DEBUGLVL_DEFAULT          (DEBUGLVL_STACK_TCP_ERROR | DEBUGLVL_STACK_TCP_INFO | DEBUGLVL_STACK_INFO | DEBUGLVL_STACK_ERROR)

// --------------------------------------
// Timeflags
#define TIMEFLAG_10MS             0x01        // Jeweils nur einzelne Bits, damit diese unabhängig voneinander sind
#define TIMEFLAG_100MS            0x02
#define TIMEFLAG_1S               0x04

// --------------------------------------

ISR ( USART0_RX_vect )
{
	usart_new_char () ;
}


 ISR ( TIMER0_COMPA_vect )
{
	// Counter fuer Sequence - Nummern neuer TCP - Verbindungen hochzaehlen
	tcpInitialSeqCnt ++;
	 
	counter ++;
	if (( counter % 10) == 0)
	{
		timeflags |= TIMEFLAG_10MS ;
	}
	if (( counter % 100) == 0)
	{
		timeflags |= TIMEFLAG_100MS ;
	}
	if( counter >= 1000)
	{
		timeflags |= TIMEFLAG_1S ;
		counter = 0;
	}
}

ISR ( INT2_vect )
{
	newPacketPresent = 1;
	ETH_INTERRUPT_DISABLE () ;
}

int main(void)
{
	
	debugLevel = DEBUGLVL_DEFAULT;
	
	TCCR0A = 0;
	TCCR0B = (3 << CS00 ); // Timer0 : 1ms , 64x Prescaler , CTC Mode
	TCCR0A |= (1 << WGM01 );
	OCR0A = 249; // 16 MHz / 64 / 1 kHz = 250; -1 da bei 0 begonnen wird
	TIMSK0 = (1 << OCIE0A ); // Compare Match Interrupt freigeben
	
	usart_init () ; // USART initialisieren
	enc28Init () ; // ENC28J60 initialisieren
	ipInitStack () ; // Netzwerkstack initialisieren

	tcpListen (1395 , ( void *) tcpCmdHandler ); // Port oeffnen , Handlerfunktion fuer TCP - Kommandos ( NeMo zu NeMo )
	tcpListen (1396 , ( void *) tcpCmdHandler ) ; // Port oeffnen , Handlerfunktion fuer TCP - Kommandos ( NeMo zu NeMo )
	tcpListen (1397 , ( void *) tcpCmdHandler ); // Port oeffnen , Handlerfunktion fuer TCP - Kommandos (PC zu NeMo )

	ETH_INTERRUPT_ENABLE () ; // Externen Interrupt fuer ENC28J60 aktivieren
	sei() ;	//Über die Funktion sei() werden dann die Interrupts global freigegeben. S14/15

	
	
    while (1) 
    {
		ipHandlePacket () ; // Packet Handler fuer neu eingetroffene Packets
	    usart_scheduler () ; // Scheduler fuer USART - Kommunikation
	    usartCmdHandler () ; // Befehlshandler fuer USART - Befehle
	    
	    if( timeflags & TIMEFLAG_10MS ) // **** 10ms - Routine ****
	    {
			timeflags &= ~ TIMEFLAG_10MS ;
		    tcpTimer () ;
		    httpTimer () ;
	    }
	    
	    if( timeflags & TIMEFLAG_1S ) // **** 1s- Routine ****
	    {
		    timeflags &= ~ TIMEFLAG_1S ;
		    arpTimer () ; // ARP -Timer - Prozedur ( Lebensdauer der Eintraege )
	    }
	}
    
}

