#include "kernel.h"
#include "event.h"
#include "pin.h"

typedef Thread<pr0, 	300> TThread1;
typedef Thread<pr1, 	300> TThread2;
typedef Thread<pr2, 	300> TThread3;
typedef Thread<prIdle,	300> TIdleThread;

TThread1		Thread1;
TThread2		Thread2;
TThread3		Thread3;
TIdleThread		IdleThread;

Event	ef;
Event	TimerEvent;

void AssertionFailure(char const *file, unsigned line)
{
	// Until I can think of something better for
	// low level assertion failures, loop here.

	// Force the counter to be placed into memory
	volatile static int i = 0 ;
	for (;;) {
		i++; // Place a breakpoint here with the debugger.
	}
}

int main()
{
	Kernel::Run(1000);
}

template <>
OS_PROCESS void TThread1::Exec()
{
	Out<PF_6> led;
	led = 1;
	for(;;) {
		led = led ^ 1;
		Thread1.Sleep(500);
	}
}

template <>
OS_PROCESS void TThread2::Exec()
{
	Out<PF_7> led;
	led = 1;
	for(;;) {
		led = led ^ 1;
		Thread2.Sleep(1000);
	}
}

template <>
OS_PROCESS void TThread3::Exec()
{
	Out<PF_8> led;
	led = 1;
	for (;;) {
		led = led ^ 1;
		Thread3.Sleep(2000);
	}
}

template<>
OS_PROCESS void TIdleThread::Exec()
{
	for(;;) {
	}
}

