#include "debug/testing.h"

#include "devices/derivate.h"
#include "thread/guarded_scheduler.h"
#include "thread/thread.h"
#include "thread/abstract_schedule_table.h"
#include "thread/schedule_table.h"

const char* right_sequence = "abcdabcdabcd";
      char  sequence[12];

static int counter = 0;

class Test_Thread : public Thread {

  char thread_char;

public:

  Test_Thread(char c) : thread_char(c) {}

  void action() {
    sequence[counter++] = thread_char;
    scheduler.exit();
  }
};

class Checker_Thread : public Thread {

public:

  void action() {
    static unsigned int runs = 0;

    runs++;

    if(runs == 3) {
      if(!check_sequence(right_sequence,sequence)) {
	Panic("Wrong Testsequence!");
      }
      else {
	TestOK("Test successful finished!");
      }
    }

    scheduler.exit();
  }
};

static unsigned int stack[512];

Test_Thread t1('a');
Test_Thread t2('b');
Test_Thread t3('c');
Test_Thread t4('d');

Checker_Thread checker;

Schedule_Table< 5 > schedule_table(&stack[512],100000);

void user_main() {
  init_sequence(right_sequence,sequence);

  schedule_table.add(10000,&t1);
  schedule_table.add(30000,&t2);
  schedule_table.add(50000,&t3);
  schedule_table.add(70000,&t4);
  schedule_table.add(90000,&checker);

  scheduler.set_schedule_table(&schedule_table);
}
