/*----------------------------------------------------------------------------*
 *                                                                            *
 *         M I N I M A L I S T I C    T M R M G R     E N T I T Y             *
 *                                                                            *
 *                    Copyright (C) 2010 Amit Chawre.                         *
 *                                                                            *
 *----------------------------------------------------------------------------*/

/**
 * @file NwMiniTmrMgrEntity.c
 * @brief This file ontains example of a minimalistic timer manager entity.
*/

#include <stdio.h>
#include <assert.h>
#include "NwEvt.h"
#include "NwGtpv1u.h"
#include "NwMiniLogMgrEntity.h"
#include "NwMiniTmrMgrEntity.h"

#ifndef NW_ASSERT
#define NW_ASSERT assert
#endif

#ifdef __cplusplus
extern "C" {
#endif

/*---------------------------------------------------------------------------
 * Private functions
 *--------------------------------------------------------------------------*/

static void
NW_TMR_CALLBACK(nwMiniTmrMgrHandleTimeout)
{
  NwGtpv1uRcT rc;
  NwMiniTmrMgrEntityT *pTmr = (NwMiniTmrMgrEntityT *) arg;

  /*---------------------------------------------------------------------------
   *  Send Timeout Request to GTPv1u Stack Instance
   *--------------------------------------------------------------------------*/

  rc = nwGtpv1uProcessTimeout(pTmr->timeoutArg);
  NW_ASSERT( rc == NW_GTPV1U_OK );

  free(pTmr);

  return;
}

/*---------------------------------------------------------------------------
 * Public functions
 *--------------------------------------------------------------------------*/

NwGtpv1uRcT nwTimerStart( NwGtpv1uTimerMgrHandleT tmrMgrHandle,
                          uint32_t timeoutSec,
                          uint32_t timeoutUsec,
                          uint32_t tmrType,
                          void  *timeoutArg,
                          NwGtpv1uTimerHandleT *hTmr)
{
  NwGtpv1uRcT rc = NW_GTPV1U_OK;
  NwMiniTmrMgrEntityT *pTmr;
  struct timeval tv;

  NW_LOG(NW_LOG_LEVEL_INFO,
         "Received start timer request from stack with timer type %u, arg %x, for %u sec and %u usec",
         tmrType, timeoutArg, timeoutSec, timeoutUsec);

  pTmr = (NwMiniTmrMgrEntityT *) malloc (sizeof(NwMiniTmrMgrEntityT));

  /* set the timevalues*/
  timerclear(&tv);
  tv.tv_sec     = timeoutSec;
  tv.tv_usec    = timeoutUsec;

  pTmr->timeoutArg = timeoutArg;
  evtimer_set(&pTmr->ev, nwMiniTmrMgrHandleTimeout, pTmr);

  /*add event*/

  event_add(&(pTmr->ev), &tv);

  *hTmr = (NwGtpv1uTimerHandleT)pTmr;

  return rc;
}

NwGtpv1uRcT nwTimerStop( NwGtpv1uTimerMgrHandleT tmrMgrHandle,
                         NwGtpv1uTimerHandleT hTmr)
{
  NW_LOG(NW_LOG_LEVEL_INFO,
         "Received stop timer request from stack for timer handle %u", hTmr);
  evtimer_del(&(((NwMiniTmrMgrEntityT *)hTmr)->ev));
  free((void *)hTmr);
  return NW_GTPV1U_OK;
}

#ifdef __cplusplus
}
#endif