bool timer_add_event(timer_event* event)
{
	#ifdef LOG_FWK_ENABLED
	uint16_t current_timer = hal_timer_getvalue();
	log_print_stack_string(LOG_FWK, "timer_add_event: %d.%d", event->next_event/1000,event->next_event%1000);
	log_print_stack_string(LOG_FWK, "timer_add_event timer S : %d.%d", current_timer/1000, current_timer%1000);
	#endif

    if (event->next_event == 0)
    {
        event->f(NULL);
        return true;
    }

    timer_event new_event;
    new_event.f = event->f;
    new_event.next_event = event->next_event;

    if (timer_insert_value_in_queue(&new_event))
    {
        if (!started)
        {
            hal_timer_enable_interrupt();
            started = true;
            hal_timer_setvalue(new_event.next_event);
        }
        uint16_t diff = hal_timer_getvalue() - new_event.next_event;
        if (diff < 1000)
		{
			#ifdef LOG_FWK_ENABLED
        	current_timer = hal_timer_getvalue();
        	log_print_stack_string(LOG_FWK, "timer_add_event M timer overrun : %d.%d", current_timer/1000,current_timer%1000);
        	log_print_stack_string(LOG_FWK, "timer_add_event M: %d.%d", new_event.next_event/1000,  new_event.next_event%1000);
			#endif
			timer_completed();
		}
    } else {
        //log_print_stack_string(LOG_FWK, "Cannot add event, queue is full");
        return false;
    }

	#ifdef LOG_FWK_ENABLED
	current_timer = hal_timer_getvalue();
	log_print_stack_string(LOG_FWK, "timer_add_event timer E : %d.%d", current_timer/1000,current_timer%1000);
	#endif

    return true;
}
bool timer_add_event(timer_event* event)
{

    DPRINT("Add event: current timer: %d.", hal_timer_getvalue());

    if (event->next_event == 0)
    {
        event->f();
        return true;
    }

    timer_event new_event;
    new_event.f = event->f;
    new_event.next_event = event->next_event;


    DPRINT(" - new event : %d %p", new_event.next_event, new_event.f);

    if (timer_insert_value_in_queue(&new_event))
    {
        if (!started)
        {
            hal_timer_enable_interrupt();
            started = true;
            hal_timer_setvalue(new_event.next_event);
        }
        uint16_t diff = hal_timer_getvalue() - new_event.next_event;
        if (diff < 1000)
		{
                    DPRINT("timer_add_event M timer overrun : %d", hal_timer_getvalue());
                    DPRINT("timer_add_event M: %d", new_event.next_event);
                    timer_completed();
		}
    } else {
        DPRINT("Cannot add event, queue is full");
        return false;
    }

    DPRINT("timer_add_event timer E : %d", hal_timer_getvalue());

    return true;
}