#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"

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

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

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

int hw_idle_leave(struct edsm *me)
{
	struct ecap_engine *ecap = me->ecap;
	stop_tick(ecap, me->timers[0]);
	log_msg("Good Bye, World!\n");
	return 0;
}

int hw_done_enter(struct edsm *me)
{
	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("./", "hw.smd");
	/* получаем набор состояний для него */
	hw_state_set = edsm_get_state_set(hw_desc);

	/* количество каналов для нашего автомата */
	nch = hw_desc->nch;
	/* загружаем event capture engine */
	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);
}