#define F_CPU 8000000UL
#define UART_BAUD 9600

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "uart.h"
#include "util.h"

#if 0
/* polling read */
int main(void) {
    char prev, cur;
    uart_init();
    uart_putchar('i');
    DDRB &= ~_BV(PB1); /* kbd_data in */
    DDRD &= ~_BV(PD2); /* kbd_clock in */
    PORTB &= ~_BV(PB1); /* pull up kbd_data */
    PORTD &= ~_BV(PD2); /* pull up kbd_clock */
    uart_putchar('I');

    prev = 0;
    for (;;) {
	cur = PINB & _BV(PB1);
	if (prev != cur) {
	    uart_putchar(cur ? '1' : '0');
	    prev = cur;
	}
    }
}
#endif

#if 0
/* polling read of all bits */
int main(void) {
    char prev, cur;
    char prev2, cur2;
    uart_init();
    uart_putchar('i');
    DDRB = 0x00;
    DDRD = 0x00;
    PORTB = 0xff;
    PORTD = 0xff;
    uart_putchar('I');
    GIMSK = 0;
    sei();

    prev = 0;
    prev2 = 0;
    for (;;) {
	cur = PIND;
	if (prev != cur) {
	    uart_putchar(cur ? 'D' : 'd');
	    prev = cur;
	}
	cur2 = PINB;
	if (prev2 != cur2) {
	    uart_putchar(cur2 ? 'B' : 'b');
	    prev2 = cur2;
	}
	uart_putchar('_');
	delay_ms(200);
    }
}
#endif

#if 0
/* polling read of all bits with verbose output */
int main(void) {
    char cnt = 0;
    uart_init();
    uart_putchar('i');
    DDRB = 0x0;
    DDRD = 0x0;
    PORTB = 0xff;
    PORTD = 0xff;
    uart_putchar('I');
    GIMSK = 0;
    sei();

    print_bits(0xA3);
    for (;;) {
	uart_putchar(cnt++ & 1 ? '>' : ' ');
	print_bits(PINB);
	uart_putchar(' ');
	print_bits(PIND);
	uart_putchar('\r');
	uart_putchar('\n');
	delay_ms(1000);
    }
}
#endif

#if 0
/* generate output pattern for scope */
int main(void) {
    char prev, cur;
    uart_init();
    uart_putchar('i');
    DDRB |= _BV(PB1); /* kbd_data out */
    DDRD |= _BV(PD2); /* kbd_clock out */
    uart_putchar('I');

    for (;;) {
	PORTB |= _BV(PB1);
	PORTD |= _BV(PD2);
	_delay_ms(1);
	PORTB &= ~_BV(PB1);
	PORTD &= ~_BV(PD2);
	_delay_ms(1);
    }
}
#endif


#if 1
/* interrupt test */
static volatile char int0_hits = 0;

ISR(INT0_vect) {
    int0_hits++;
}

int main(void) {
    uart_init();
    uart_putchar('i');
    DDRB &= ~_BV(PB1); /* kbd_data in */
    DDRD &= ~_BV(PD2); /* kbd_clock in */
    PORTB &= ~_BV(PB1); /* pull up kbd_data */
    PORTD &= ~_BV(PD2); /* pull up kbd_clock */
    MCUCR = 2;    // INT0 interrupt on falling edge
    uart_putchar('I');
    GIMSK = 0x40;        // Enable INT0 interrupt
    sei();
    uart_putchar('1');
    {
	char prev;
	for (;;) {
	    if (int0_hits != prev) {
		uart_putchar('C');
		prev = int0_hits;
	    }
	}
    }
}
#endif
