/* ---------------------------------------------------------------------
  (c) ED 2001
  Projet       : CLIB.TEST
  Fonction     : Test du gestionnaire de timer par polling regulier
  .              (sans IT)
  Module       : TTIM
  Fichier      : TTIM.C
  Created      : 16-01-2001
  Modified     : 16-01-2001
  --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Log

   0.0 - 16-01-2001 Created

   --------------------------------------------------------------------- */

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "ed/inc/tim.h"
#include "ed/inc/sysalloc.h"
#include "ed/inc/dprintf.h"
#include "ed/inc/sys.h"

/* ---------------------------------------------------------------------
   Private macros
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   Private constants
   --------------------------------------------------------------------- */
#define MODULE "TTIM"
#define VER "0.0"
#define ID "TTIM Module \"C\" (c) ED 2001"

/* Stream redirection !!! NO ':' !!! */
#define OUT "CON"
/* #define OUT "COM1" */
/* #define OUT "LOG.TXT" */

#define TIC 18.2  /* Tic PC */
#define TEMPO 55  /* en ms */

typedef struct
{
   char const *sId;
   sTIM *pTim;
}
user_t;

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

/* ---------------------------------------------------------------------
   cb_action()
   ---------------------------------------------------------------------
   Action de Tim
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
static void cb_action (sTIM_CB * pData)
{
   ASSERT (pData != NULL);

   switch (pData->info)
   {
   case TIM_TIMEOUT:
      {
         user_t *pUser = pData->pUser;

         dprintf (MODULE
                  , "CB_%s : Timeout (USR_DATA='%s')"
                  , pData->szTag
                  , pUser->sId
                 );
      }
      break;

   case TIM_START:
      dprintf (MODULE
               , "CB_%s : Start %lu ms"
               , pData->szTag
               , (unsigned long) pData->duree
              );
      break;

   case TIM_RESTART:
      dprintf (MODULE
               , "CB_%s : Restart %lu ms"
               , pData->szTag
               , (unsigned long) pData->duree
              );
      break;

   case TIM_STOP:
      dprintf (MODULE
               , "CB_%s : Stop"
               , pData->szTag
              );
      break;
   }
}

/* ---------------------------------------------------------------------
   poll()
   ---------------------------------------------------------------------
   Test functions
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
static void poll (sTIM * pTim)
{
   unsigned long const cpt = TIM_poll (pTim);

   dprintf (MODULE, "poll %lu", (unsigned long) cpt);
}


/* ---------------------------------------------------------------------
   poll()
   ---------------------------------------------------------------------
   Test sequence
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
static void test (sTIM * pTim)
{
   TIM_start (pTim, TEMPO);

   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);

   TIM_start (pTim, TEMPO);

   poll (pTim);
   poll (pTim);

   TIM_restart (pTim);

   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);

   TIM_start (pTim, TEMPO);

   poll (pTim);
   poll (pTim);
   poll (pTim);

   TIM_stop (pTim);

   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
   poll (pTim);
}

/* ---------------------------------------------------------------------
   test_sta()
   ---------------------------------------------------------------------
   Test functions
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
static int test_sta (void)
{
   int ret = -1;
   sTIM Tim;
   sTIM *pTim = &Tim;
   user_t user =
      {"Statique"};
   user_t *const pUser = &user;

   TIM_init (pTim, TIC, cb_action, pUser, "TimSta");

   pUser->pTim = pTim;

   test (pTim);

   TIM_end (pTim);

   return ret;
}

/* ---------------------------------------------------------------------
   test_dyn()
   ---------------------------------------------------------------------
   Test functions
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
static int test_dyn (void)
{
   int ret = -1;
   sTIM *pTim = NULL;
   user_t user =
      {"Dynamique"};
   user_t *const pUser = &user;

   pTim = TIM_init (NULL, TIC, cb_action, pUser, "TimDyn");


   if (pTim)
   {
      pUser->pTim = pTim;

      test (pTim);

      TIM_end (pTim);

   }
   else
   {
      puts ("*** memory error ***");
   }
   return ret;
}


/* =====================================================================
   Main program
   ===================================================================== */

/* ---------------------------------------------------------------------
   main()
   ---------------------------------------------------------------------
   Main program
   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
int main (void)
{
   int ret = EXIT_SUCCESS;

   freopen (OUT, "w", stdout);
   freopen (OUT, "w", stderr);

   {
      static char Trace[1 << 8];

      sys_mem_init (Trace, sizeof Trace, TRACE_OFF, NULL);

      printf ("Testing [%s Ver %s]\n", TIM_sid (), TIM_sver ());

      ret = test_sta ();

      if (ret != 0)
      {
         ret = EXIT_FAILURE;
      }

      ret = test_dyn ();

      if (ret != 0)
      {
         ret = EXIT_FAILURE;
      }

      sys_mem_trace ();
   }
   return ret;
}


/* File generated by 'NEW.EXE' Ver 1.27 (c) ED 1998-2000 */
