#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <errno.h>
#include <dlfcn.h>

#include "intypes.h"
#include "log.h"
#include "edsm.h"
#include "load-tool.h"

/* M0 event */
#define EC_PRINT_DONE 0

int hw2_idle_enter(struct edsm *me)
{
	struct ecap_engine *ecap = me->ecap;
	start_tick_oneshot(ecap, me->timers[0]);
	return 0;
}

int hw2_print_enter(struct edsm *me)
{
	/* get context */
	int *c = (int *)me->data;

	printf("Hello, World! (%d)\n", ++(*c));
	edsm_put_event(me, EC_PRINT_DONE);
	return 0;
}

int hw2_done_enter(struct edsm *me)
{
	struct ecap_engine *ecap = me->ecap;
	log_msg("Good Bye, World!\n");
	return 1;
}

struct edsm_desc *hw_desc;
struct state *hw_state_set;
struct edsm *hw;
int cnt = 0;

int main(int argc, char *argv[], char *envp[])
{
	int nch;

	hw_desc = edsm_load_desc("./", "hw2.smd");
	hw_state_set = edsm_get_state_set(hw_desc);
	nch = hw_desc->nch;
	edsm_load_engine("./", "libecap-poll.so", nch);
	hw = edsm_create(hw_desc, hw_state_set, &cnt);
	log_msg("INFO: started\n");

	/* get the ball rolling */
	edsm_run_engine();

	log_msg("INFO: terminated\n\n");
	exit(0);
}