#include <stdbool.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 "semaphore.h"

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

static struct semaphore sem;

void task2(void *arg)
{
	gpio_open(&led_1);
	gpio_write(&led_1, 0);
	while(1) {
		semaphore_wait(&sem);
		gpio_toggle(&led_1);
	}
}

void task1(void *arg)
{
	while(1) {
		sleep_ms(3000);
		semaphore_post(&sem);
	}
}

int main(void)
{
	board_init();
	sys_tick_init(&timer_1);

	semaphore_init( &sem, 0);

	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;
}
