/*
 * Copyright 2021, Adrien Destugues, pulkomandy@pulkomandy.tk
 * Distributed under terms of the MIT license.
 */

// Contiki includes
#include "ctk.h"

#include "clock-conf.h"

#include "program-handler.h"

// Applications
#include "netconf-dsc.h"
#include "dhcp-dsc.h"
#include "www-dsc.h"
#include "webserver-dsc.h"
#include "ftp-dsc.h"
#include "telnet-dsc.h"
#include "email-dsc.h"
#include "irc-dsc.h"
#include "editor-dsc.h"
#include "calc-dsc.h"
#include "processes-dsc.h"
#include "shell-dsc.h"
#include "about-dsc.h"

// Use the vga_frame counter as a main clock. It would be nice to have a
// millisecond-precision (or more) clock, but this will do for now.
clock_time_t clock_time(void)
{
	return 0;
}

// For debugging purposes only. Actually I didn't see it being called yet.
void
log_message(const char *part1, const char *part2)
{
	  //printf("%s%s\n", part1, part2);
}


int main(void)
{
	static volatile int* const SYSTEM_CTRL = 0x3d20;
	static volatile int* const WATCHDOG_CLEAR = 0x3d24;
	
	*SYSTEM_CTRL = 0;
	*WATCHDOG_CLEAR = 0x55aa;
	
	ek_init();
	conio_init();
	ctk_init();

	program_handler_init();
#if 0
#if 0
  program_handler_add(&netconf_dsc,   "Network setup", 1);
  program_handler_add(&dhcp_dsc,      "DHCP client",   1);
  program_handler_add(&www_dsc,       "Web browser",   1);
  program_handler_add(&webserver_dsc, "Web server",    1);
  program_handler_add(&ftp_dsc,       "FTP client",    1);
  program_handler_add(&telnet_dsc,    "Telnet",        1);
  program_handler_add(&email_dsc,     "E-mail",        1);
  program_handler_add(&irc_dsc,       "IRC client",    1);
#endif
	program_handler_add(&editor_dsc,    "Editor",        1);
	program_handler_add(&calc_dsc,      "Calculator",    1);
	program_handler_add(&processes_dsc, "Processes",     1);
	program_handler_add(&shell_dsc,     "Command shell", 1);
#endif
	program_handler_add(&about_dsc,     "About Contiki", 0);

	// Call ek_run until everything is initialized. Then, load welcome.prg.
	while(1) {
		if(ek_run() == 0) {
			//program_handler_load("welcome.prg", NULL);
			welcome_init();
			//TODO we don't have a loader; so call the init func directly
			break;
		}
	}

	// Run the main loop.
	while(1) {
		if (ek_run() == 0) {
			// We are out of events to run, sleep a little.
			// TODO wait_vsync(1);
		}
	}

    return 0;
}
