/***************************************
* sy227_vi_test                         *
*                                      *
* Monitor prot_status and              *
* channel_status of each of the 40 ch  *
*                                      *
***************************************/

#include <stdio.h>
#include <errno.h>
#include <module.h>
#include "../lib/mylib1.h"
#include "a200.h"     /* definitions relative to the CAEN system */
#include "hv_dbase.h"

#define NMAX 45
#define NOK 40
#define SECONDS
#define MINUTES  * 60
#define PAUSE    1001
#define CONTINUE 1002
#define STOP     1003

SY227_MBOX *hv_mod;
PROCS_INFO *hv_procs_mod;
int mev_id, evpro_id;
char *caller;
int tcycle, command;

sighand(signal)
register int signal;
{
   printf(" sy227_vi_test:  signal %d received \n", signal);
   if ( signal == STOP    
        ||  signal == 2 || signal == 3) { /* ^C  ^E */
      A200_end();
      /* put process ID to zero */
      if (tcycle != 0){
      sem_wait(evpro_id, caller);
      hv_procs_mod->sy227_vi_mon_id = 0;
      sem_free(evpro_id, caller);
      }
      /* unlink dbase module */
      sem_unl(mev_id, caller);
      sem_unl(evpro_id, caller);
      munlink(hv_mod);
      munlink(hv_procs_mod);
      exit(0);
   }
   else if ( signal == PAUSE )
      sleep(0);
   else if ( signal == CONTINUE )
      ;          /*   do nothing , used to awaike the process  */ 
}

main(argc, argv)
int argc;
char *argv[];
{
   short ndata, data[40], prot_word;
   short ndatav, datav[40];
   short ndatai, datai[40];
   int hra[6];
   short i, j, chan, value, code, code1, code2;
   short dis, cr, sl;

   intercept(sighand);

   if (argc < 2)
      usage();
   caller = argv[0];
   tcycle = atoi(argv[1]);  /* sleep time in seconds if tcycle > 0 
                                             in 1/256 s if tcycle < 0
                                ( read once if tcycle = 0 )  */

   mev_id = sem_link("sy227mod", argv[0]);
   evpro_id = sem_link("hv_pr_info", argv[0]);

   if((hv_mod = (SY227_MBOX *)modlink("sy227mod", 0)) == (SY227_MBOX *) -1)
      exit(_errmsg(errno,
      "hv_mod: err. link data module sy227mod, errno %d\n", errno));
     
   if((hv_procs_mod = (PROCS_INFO *)modlink("hv_pr_info", 0)) 
   == (PROCS_INFO *)-1)
      exit(_errmsg(errno,
      "hv_mod: err. link data module hv_procs_info, errno %d\n", errno));

   A200_init();

   while(1) {     
    for (cr = 1; cr <= 2; cr++)
     for ( sl = 0; sl < 4; sl++){
       code1 = D_Read(D_VMON, cr, sl, ALL, datav, &ndatav);
       code2 = D_Read(D_IMON, cr, sl, ALL, datai, &ndatai);
       if(!(code1 + code2)){
          data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); 
          sem_wait(mev_id, argv[0]);
          for(i = 0; i < 6; i++)
             hv_mod->sta_tim[i] = hra[i];
          for( i = 0; i < 32; i++){
                hv_mod->sl_par[cr][sl].vmon[i] = datav[i];
                hv_mod->sl_par[cr][sl].imon[i] = datai[i];
          }
          hv_mod->nvim++;
          sem_free(mev_id, argv[0]);
       }
       else {
          sem_wait(mev_id, argv[0]);
          hv_mod->nvim_err++;
          sem_free(mev_id, argv[0]);
       }
     }

     sem_wait(evpro_id, argv[0]);
     if (tcycle != 0) {
        command = hv_procs_mod->sy227_vi_mon_com;
        hv_procs_mod->sy227_vi_mon_com = 0;  /* reset immediately command */
        tcycle = hv_procs_mod->sy227_vi_mon_tcycle;
     }
     else 
        command = 0;
     if (tcycle != 0)
        hv_procs_mod->sy227_vi_mon_active = 0;
     sem_free(evpro_id, argv[0]);

     if (!command){
        if (tcycle > 0)
           sleep( (unsigned) tcycle);
        else if(tcycle < 0)
           tsleep(BIT32 | (unsigned) -tcycle);
        else
           break;
     }
     else if(command == PAUSE)
        sleep(0);
     else if(command == STOP)
        break;

     sem_wait(evpro_id, argv[0]);
     hv_procs_mod->sy227_vi_mon_active = 1;
     sem_free(evpro_id, argv[0]);
   }
   A200_end();
   /* put process ID to zero */
   if (tcycle != 0){
   sem_wait(evpro_id, argv[0]);
   hv_procs_mod->sy227_vi_mon_id = 0;
   sem_free(evpro_id, argv[0]);
   }
   sem_unl(mev_id, caller);
   sem_unl(evpro_id, caller);
   munlink(hv_mod);
   munlink(hv_procs_mod);
   exit(0);
}

usage()
{
   printf(" usage :  sy227_vi_test   <tcycle> \n");
   printf("                            |-> == 0  : read once \n");
   printf("                                >= 0  : cycle in s\n");
   printf("                                <= 0  : cycle in  1/256 s   \n");
   exit(0);
}