#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include "usart.h"

#include "timer.h"

#include "global-conf.h"
#include "slipdev.h"
//#include "../drivers/slipdev/slipdev.h"

#include <string.h>

void initLowLevel()
{
    // ピン初期化
	// PB0 (Arduino D8)を出力に設定 => RTS (出力)
	DDRB |= _BV(PB0);
	PORTB &= ~_BV(PORTB0);

	// PB3 (Arduino D11)を入力に設定 => CTS (入力)
	DDRB &= ~_BV(PB3);
	PORTB |= _BV(PORTB3);

	_delay_ms(1);
}

int main(void)
{
    uip_ipaddr_t ipaddr;
    struct timer periodic_timer;

    clock_init();
    timer_set(&periodic_timer, CLOCK_SECOND / 4);

    // 低レベル初期化
    initLowLevel();
    // SLIPで初期化 (m328のuart初期化も含む)
    slipdev_init();
    // uIP初期化
    uip_init();

    // IPアドレス
    uip_ipaddr(ipaddr, 192, 168, 5, 3);
    uip_sethostaddr(ipaddr);
    // デフォルトゲートウェイ
    uip_ipaddr(ipaddr, 192, 168, 5, 1);
    uip_setdraddr(ipaddr);
    // サブネットマスク
    uip_ipaddr(ipaddr, 255, 255, 255, 0);
    uip_setnetmask(ipaddr);

    iperf_server_init();
    //telnetd_init();
    //hello_world_init();

    while (1)
    {
        uip_len = slipdev_poll();

        if (uip_len > 0)
        {
            uip_input();
            if (uip_len > 0)
            {
                slipdev_send();
            }
        }
        else if (timer_expired(&periodic_timer)) 
        {
            timer_reset(&periodic_timer);
            for (int i = 0; i < UIP_CONNS; i++)
            {
                uip_periodic(i);
                if (uip_len > 0)
                {
                    slipdev_send();
                }
            }
            
        }
    }
    
}

ISR(PCINT0_vect)
{
	cts0_isr_handler();
}