#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "board.h"
#include "ctx.h"
#include "stack.h"
#include "queue.h"
#include "thread.h"
#include "schedule.h"
#include "isr.h"
#include "sys_tick.h"

#include "ascii_font.h"
#include "bitmap.h"

#define STACK_SIZE  256
stack_t tc_1_stack[STACK_SIZE];
struct thread_context tc_1;

void task1(void *arg)
{
	gpio_open(&led_1);
	gpio_write(&led_1, 0);
	while(1) {
		sleep_ms(1000);
		gpio_toggle(&led_1);
		uart_write(&uart_1, "Hello world\r\n", 13);
	}
}

char rx_buf[80];
void task2(void *arg)
{
	while(1) {
		int i = uart_read(&uart_1, rx_buf, 80);
		if(i > 0) {
			uart_write(&uart_1, rx_buf, i);
		}
	}
}

stack_t tc_2_stack[STACK_SIZE];
struct thread_context tc_2;
int main(void)
{
	board_init();
	sys_tick_init(&timer_1);
	uart_open(&uart_1);
	thread_create(&tc_1, tc_1_stack, STACK_SIZE, task1, NULL, THREAD_PRIO_LOW);
	thread_create(&tc_2, tc_2_stack, STACK_SIZE, task2, NULL, THREAD_PRIO_LOW);

	schedule_start();

	return 0;
}
