/*************************************** * sy127_par_mon * * * * Monitor standard set of parameters * * * ***************************************/ #include #include #include #include "../lib/mylib1.h" #include "a200.h" /* definitions relative to the CAEN system */ #include "../dbase/hv_dbase.h" #define SECONDS #define MINUTES * 60 #define PAUSE 1001 #define CONTINUE 1002 #define STOP 1003 SY127_MBOX *hv_mod; PROCS_INFO *hv_procs_mod; int mev_id, evpro_id; hv_mod_struct *hv_mid; int tcp_ip_nr, cpu_nr; char *hv_config[3]; char *caller; int tcycle, command; sighand(signal) register int signal; { printf(" sy127_par_mon : 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->sy127_par_mon_id = 0; sem_free(evpro_id, caller); } /* unlink dbase module */ munlink(hv_mid); 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], map[40], prot_word; int hra[6]; short i, j, chan, value, code; int ntry, rok, nerror; int ncycle = 0; int maxtry = 1; int ir, rd_par[11]; int irmax = 11; short sy127_crate; rd_par[0] = V0; rd_par[1] = V1; rd_par[2] = I0; rd_par[3] = I1; rd_par[4] = RAMP_UP; rd_par[5] = RAMP_DOWN; rd_par[6] = TRIP; rd_par[7] = CH_TO_GR_ASS; rd_par[8] = PHASE; rd_par[9] = TIME; rd_par[10] = TYPE; 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("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)); get_config(&tcp_ip_nr, &cpu_nr, hv_config); if ((hv_mid = (hv_mod_struct *)modlink(hv_config[cpu_nr], 0)) == (hv_mod_struct *)-1) if ((hv_mid = (hv_mod_struct *)modload(hv_config[cpu_nr], 0)) == (hv_mod_struct *)-1) exit(_errmsg(errno, " %s: error loading/linking module %s\n", argv[0], hv_config[cpu_nr])); sy127_crate = hv_mid->hv_crate; A200_init(); while(1) { ncycle++; A200_reset(); /* reset from time to time the A200 */ for(ir=0; ir < irmax ; ir++){ ntry = 0; rok = 0; while ( rok == 0 && ntry < maxtry ){ ntry++; ndata = 40; code = HV_Read_Group(rd_par[ir], sy127_crate, GAG_G, data, &ndata, map); if ( code == 0) rok = 1; } if(rok == 1){ sem_wait(mev_id, argv[0]); /* printf(" vado a scrivere i dati nel modulo \n"); */ j = -1; for(i=0; i < 40; i++) if( map[i] ){ j++; switch (rd_par[ir]){ case V0: hv_mod->hv_par[1].v0[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].v0[i] = data[j]; break; case V1: hv_mod->hv_par[1].v1[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].v1[i] = data[j]; break; case I0: hv_mod->hv_par[1].i0[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].i0[i] = data[j]; break; case I1: hv_mod->hv_par[1].i1[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].i1[i] = data[j]; break; case RAMP_UP: hv_mod->hv_par[1].ramp_up[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].ramp_up[i] = data[j]; break; case RAMP_DOWN: hv_mod->hv_par[1].ramp_down[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].ramp_down[i] = data[j]; break; case TRIP: hv_mod->hv_par[1].trip[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].trip[i] = data[j]; break; case STATUS: hv_mod->hv_par[1].status[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].status[i] = data[j]; break; case CH_TO_GR_ASS: hv_mod->hv_par[1].ch_to_gr_ass[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].ch_to_gr_ass[i] = data[j]; break; case VMON: hv_mod->hv_par[1].vmon[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].vmon[i] = data[j]; break; case IMON: hv_mod->hv_par[1].imon[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].imon[i] = data[j]; break; case PHASE: hv_mod->hv_par[1].phase[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].phase[i] = data[j]; break; case TIME: hv_mod->hv_par[1].time[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].time[i] = data[j]; break; case TYPE: hv_mod->hv_par[1].type[i] = data[j]; if (ncycle == 1 && tcycle !=0) hv_mod->hv_par[0].type[i] = data[j]; break; } } /* printf(" vado a scrivere nwrite nel modulo \n"); */ sem_free(mev_id, argv[0]); } else { sem_wait(mev_id, argv[0]); /* printf(" vado a scrivere nerrors nel modulo \n"); */ hv_mod->nchk_err++; sem_free(mev_id, argv[0]); } } 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->pchk_tim[i] = hra[i]; hv_mod->nchk++; if (ncycle == 1 && tcycle != 0) for(i=0; i<6; i++) hv_mod->pset_tim[i] = hra[i]; sem_free(mev_id, argv[0]); sem_wait(evpro_id, argv[0]); if (tcycle != 0) { command = hv_procs_mod->sy127_par_mon_com; hv_procs_mod->sy127_par_mon_com = 0; /* reset immediately command */ tcycle = hv_procs_mod->sy127_par_mon_tcycle; } else command = 0; if (tcycle != 0) hv_procs_mod->sy127_par_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->sy127_par_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->sy127_par_mon_id = 0; sem_free(evpro_id, argv[0]); } /* unlink dbase module */ munlink(hv_mid); sem_unl(mev_id, caller); sem_unl(evpro_id, caller); munlink(hv_mod); munlink(hv_procs_mod); exit(0); } usage() { printf(" usage : sy127_par_mon \n"); printf(" |-> == 0 : read once \n"); printf(" >= 0 : cycle in s\n"); printf(" <= 0 : cycle in 1/256 s \n"); exit(0); }