/***************************************** * sy227_set.c * * * * SET Parameters of CAEN HV Distributor * * * *****************************************/ #include #include #include #include #include "../lib/mylib1.h" #include "a200.h" /* definitions relative to the CAEN system */ #include "a200.hmn" /* conversion table */ #define NMAX 45 #define NOK 40 #define SECONDS #define MINUTES * 60 #define FINE 1001 SY227_MBOX *hv_mod; int mev_id; char *caller; sighand(signal) register int signal; { printf(" %s : signal %d received \n",*caller, signal); if ( signal >= 2 && signal <= 3){ /* ^C or ^E ? */ A200_end(); sem_unl_del(mev_id, "sy227mod", caller); munlink(hv_mod); exit(0); } } main(argc, argv) int argc; char *argv[]; { short ndata, data[45]; int hra[6]; short crate = 3; short i, j, chan, value, code; int try; int max_try = 3; char *par_code, *crate_code, *slot_code, *chan_code, *set_code; short par_val, crate_val, slot_val, chan_val, set_val; intercept(sighand); caller = argv[0]; if (argc < 6 || *argv[1] =='-'){ printf(" sy227_set : set parameters on the CAEN HV Distributor \n"); printf("\n usage : sy227_set par crate slot chan value \n"); printf("\n par : D_IMAX, D_ONOFF, D_PULSE_TEST \n"); printf("\n crate : 1-8 \n"); printf("\n slot : 0-3 \n"); printf("\n chan : 0-31 or ALL \n"); printf("\n only ALL with D_ONOFF or D_PULSE_TEST\n"); printf("\n value : 5-5000 ( mmA ) for IMAX \n"); printf("\n ON or OFF for switch \n"); exit(0); } par_code = argv[1]; crate_code = argv[2]; slot_code = argv[3]; chan_code = argv[4]; set_code = argv[5]; if (!isdigit( *par_code)) { if ((par_val = (short) find_code(par_code)) < 0 ) exit(_errmsg(0," %s error decoding parameter\n",caller)); } else par_val = (short) atoi(par_code); if (!isdigit( *crate_code)) { if ((crate_val = (short) find_code(crate_code)) < 0 ) exit(_errmsg(0," %s error decoding crate\n",caller)); } else crate_val = (short) atoi(crate_code); if (!isdigit( *slot_code)) { if ((slot_val = (short) find_code(slot_code)) < 0 ) exit(_errmsg(0," %s error decoding chan\n",caller)); } else slot_val = (short) atoi(slot_code); if (!isdigit( *chan_code)) { if ((chan_val = (short) find_code(chan_code)) < 0 ) exit(_errmsg(0," %s error decoding chan\n",caller)); } else chan_val = (short) atoi(chan_code); if (!isdigit( *set_code)) { if ((set_val = (short) find_code(set_code)) < 0 ) exit(_errmsg(0," %s error decoding value to be set\n",caller)); } else set_val = (short) atoi(set_code); if (par_val == D_IMAX) set_val = set_val / 5; /* 5 nA is the resolution -> do it autom !! */ if (chan_val >= ALL && par_val == ALL_PAR) exit(_errmsg(0,"%s cannot set several paraneters on several channel\n", caller )); mev_id = sem_link_cr("sy227mod", argv[0]); if((hv_mod = (SY227_MBOX *)modlink("sy227mod", 0)) == (SY227_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 = (SY227_MBOX *) _mkdata_module("sy227mod", sizeof(SY227_MBOX), 0x8001, 0x0033)) == (SY227_MBOX *)-1) /* see module.h for attr,perm */ exit(_errmsg(errno,"hv_mod: 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]); } A200_init(); /* take the module until update is ok */ sem_wait(mev_id, argv[0]); for(try = 1; try < max_try; try++){ if ((code = D_Set(par_val, crate_val, slot_val, chan_val, set_val)) ==0) { /* updates data module */ if ( par_val == D_IMAX ){ if ( chan_val == ALL ) for ( j = 0; j < 32; j++) hv_mod->sl_par[crate_val-1][slot_val].imax_set[j] = set_val; else if ( chan_val >= 0 && chan_val < 32) hv_mod->sl_par[crate_val-1][slot_val].imax_set[chan_val] = set_val; } else if ( par_val == D_ONOFF ) hv_mod->sl_par[crate_val-1][slot_val].onoff_set = set_val; else if ( par_val == D_PULSE_TEST ) hv_mod->sl_par[crate_val-1][slot_val].pulse_test_set = set_val; data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); for(i=0; i<6; i++) hv_mod->pset_tim[i] = hra[i]; break; } } sem_free(mev_id, argv[0]); A200_end(); sem_unl_del(mev_id, "SY227mod", caller); munlink(hv_mod); if ( try == max_try ){ printf(" %s not able to set HV after %d attempts \n", caller, max_try); exit(-1); } else exit(0); } int find_code(par_code) char *par_code; { int i; for ( i = 0; *(par_code + i) != '\0'; i++) *(par_code + i) = (char) toupper((int) *(par_code + i)); for( i = 0; i < a200_conv_tab_size; i++) if (strcmp(a200_conv[i].key, par_code) == 0) break; if ( i < a200_conv_tab_size ) return a200_conv[i].code; else return -1; }