/*************************************** * sy127_vi_mon * * * * Monitor Voltage and Current * * of the SY127 * * * ***************************************/ #include #include #include "../lib/mylib1.h" #include "a200.h" /* definitions relative to the CAEN system */ #include "hv_dbase.c" #define NMAX 45 #define NOK 40 #define SECONDS #define MINUTES * 60 #define STOP 1001 #define CONTINUE 1002 SY127_MBOX *hv_mod; PROCS_INFO *hv_procs_mod; int mev_id, evpro_id; char *caller; sighand(signal) register int signal; { printf(" sy127_vi_mon : signal %d received \n", signal); if ( signal == STOP || signal == 2 || signal == 3) { /* ^C ^E */ A200_end(); sem_unl(mev_id, caller); sem_unl(evpro_id, caller); munlink(hv_mod); munlink(hv_procs_mod); exit(0); } else if ( signal == CONTINUE ) ; /* do nothing , used to awaike the process */ } main(argc, argv) int argc; char *argv[]; { short ndatav, datav[40], map[40]; short ndatai, datai[40]; int hra[6]; short i, j, chan, value, codev, codei; int ntry, rok, nerror; int maxtry = 1; int tcycle, once; 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 ) */ /* create semaphores */ evpro_id = sem_link_cr("hv_pr_info", argv[0]); mev_id = sem_link_cr("sy127mod", argv[0]); /* create module for sy127 informations */ if((hv_mod = ( SY127_MBOX *)modlink("sy127mod", 0)) == (SY127_MBOX *)-1){ data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); sem_wait(mev_id, argv[0]); if((hv_mod = (SY127_MBOX *)_mkdata_module("sy127mod", sizeof(SY127_MBOX), 0x8001, 0x0033)) == (SY127_MBOX *)-1) /* see module.h for attr,perm */ exit(_errmsg(errno,"mod127: err. link/create data module\n")); for(i=0; i<6; i++) hv_mod->creat_tim[i] = hra[i]; sem_free(mev_id, argv[0]); } /* create module for processes informations ( needed by hv_procs_stop for example ) */ if((hv_procs_mod = (PROCS_INFO *)modlink("hv_pr_info", 0)) == (PROCS_INFO *)-1){ data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); sem_wait(evpro_id, argv[0]); if((hv_procs_mod = (PROCS_INFO *)_mkdata_module("hv_pr_info", sizeof(PROCS_INFO), 0x8001, 0x0033)) == (PROCS_INFO *) -1) /* see module.h for attr,perm */ exit(_errmsg(errno,"hv_procs_mod: err. link/create data module\n")); for(i=0; i<6; i++) hv_procs_mod->creat_date[i] = hra[i]; hv_procs_mod->sy127_vi_mon_id = 0; hv_procs_mod->sy127_vi_mon_tcycle = 5; hv_procs_mod->sy127_st_mon_id = 0; hv_procs_mod->sy127_par_mon_id = 0; hv_procs_mod->sy227_vi_mon_id = 0; hv_procs_mod->sy227_st_mon_id = 0; hv_procs_mod->sy227_par_mon_id = 0; hv_procs_mod->sy127_vi_mon_active = 1; /* value set to 0 when the */ hv_procs_mod->sy127_st_mon_active = 1; /* process puts itself to */ hv_procs_mod->sy127_par_mon_active = 1; /* sleep */ hv_procs_mod->sy227_vi_mon_active = 1; hv_procs_mod->sy227_st_mon_active = 1; hv_procs_mod->sy227_par_mon_active = 1; sem_free(evpro_id, argv[0]); } /* mev_id = sem_link("sy127mod", argv[0]); evpro_id = sem_link("hv_pr_info", argv[0]); if((hv_mod = (SY127_MBOX *)modlink("sy127mod", 0)) == (SY127_MBOX *) -1) exit(_errmsg(errno, "hv_mod: err. link data module sy127mod, 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)); */ deblev[0] = 0; deblev[1] = 0; A200_Par(deblev); A200_init(); while(1) { ntry = 0; rok = 0; while ( rok == 0 && ntry < maxtry ){ ntry++; ndatav = ndatai = 0; codev = HV_Read_Group(VMON, sy127_crate, ALL, datav, &ndatav, map); if ( codev != 0) printf(" after HV_Read_Group ( VMON ) : ndata = %d, code = %d\n", ndatav, codev); codei = HV_Read_Group(IMON, sy127_crate, ALL, datai, &ndatai, map); if ( codei != 0) printf(" after HV_Read_Group ( IMON ): ndata = %d, code = %d\n", ndatai, codei); if ( codev == 0 && codei == 0) rok = 1; } if(rok == 1){ data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); sem_wait(mev_id, argv[0]); /* printf(" vado a scrivere l'ora nel modulo \n"); */ for(i=0; i<6; i++) hv_mod->vim_tim[i] = hra[i]; /* printf(" vado a scrivere i dati nel modulo \n"); */ for(i=0; i < 40; i++) if ( map[i] ){ hv_mod->hv_par[1].vmon[i] = datav[i]; hv_mod->hv_par[1].imon[i] = datai[i]; } /* printf(" vado a scrivere nwrite nel modulo \n"); */ hv_mod->nvim++; sem_free(mev_id, argv[0]); } else { fprintf(stderr," sy127_vi_mon ( V ) error. code = %d, ndata = %d\n", codev, ndatav); fprintf(stderr," sy127_vi_mon ( I ) error. code = %d, ndata = %d\n", codei, ndatai); sem_wait(mev_id, argv[0]); /* printf(" vado a scrivere nerrors nel modulo \n"); */ hv_mod->nvim_err++; sem_free(mev_id, argv[0]); } sem_wait(evpro_id, argv[0]); tcycle = hv_procs_mod->sy127_vi_mon_tcycle; if (tcycle > 0) hv_procs_mod->sy127_vi_mon_active = 0; sem_free(evpro_id, argv[0]); if(tcycle > 0) sleep(tcycle); else if(tcycle < 0) tsleep(BIT32 | (unsigned) -tcycle); else break; sem_wait(evpro_id, argv[0]); hv_procs_mod->sy127_vi_mon_active = 1; sem_free(evpro_id, argv[0]); } A200_end(); sem_unl(mev_id, caller); sem_unl(evpro_id, caller); munlink(hv_mod); munlink(hv_procs_mod); exit(0); } usage() { printf(" usage : sy127_vi_mon \n"); printf(" |-> == 0 : read once \n"); printf(" >= 0 : cycle in s\n"); printf(" <= 0 : cycle in 1/256 s \n"); exit(0); }