/*********************************************** * lv_status.c * ************************************************/ #include #include #include #include #include #include "lv.h" #define ADC1 0x02000000 #define ADC2 0x02000200 #define ADC3 0x02000400 #define VTOI 33.3 unsigned adc_base[] = { ADC1, ADC2, ADC3}; LV_MBOX *mod; int evid; char *caller; sighand(signal) register int signal; { printf(" %s : signal %d received \n", *caller, signal); if ( signal == 0 || (signal >= 2 && signal <= 3)){ /* ^C or ^E ? */ munlink(mod); sem_unl_del(evid, "lv_mbox", caller); exit(0); } } main(argc, argv) int argc; char **argv; { int evid; int cpu_nr, tcp_ip_nr; char *hv_config[3]; int sonda, cycle; int hra[6]; int gains_set[96], gains_read[96], data[96]; float datv[96], adcv[3][48]; float vstar[3][N_LV], istar[3][N_LV], vsgs[2][N_LV], isgs[2][N_LV]; unsigned base; int ndata, gain_mode, diff_mode, i, j, adc; float vmin = -10.; /* give range of the A/D : settable only hardware ! */ float vmax = 10.; float nch = 4096; caller = argv[0]; if (argc < 2) cycle = 0; else if(strcmp(argv[1],"cycle") == 0 && argc > 2) cycle = atoi(argv[2]); /* time to cycle in seconds */ if (cycle < 0) cycle = - cycle; if (get_config( &tcp_ip_nr, &cpu_nr, hv_config) != 0){ printf (" error in get_config \n"); exit (0); } if (cpu_nr < 1 || cpu_nr > 2) { printf(" No termometer probes readable from this CPU \n"); printf(" Move to OS9B1 ( 131.169.32.121 ) or OS9B2 "); printf("( 131.169.32.122)\n"); exit(0); } intercept(sighand); if (cycle){ evid = sem_link_cr("lv_mbox", caller); if((mod = (LV_MBOX *)modlink("lv_mod", 0)) == (LV_MBOX *)-1){ data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); sem_wait(evid, caller); if((mod = (LV_MBOX *)_mkdata_module("lv_mod", sizeof(LV_MBOX), 0x8001, 0x0033)) == (LV_MBOX *)-1){ /* see module.h for attr,perm */ sem_free(evid, caller); sem_unl_del(evid, "lv_mbox", caller); exit(_errmsg(errno,"termometri: err. link/create data module\n")); } for(i=0; i<6; i++) mod->creat_tim[i] = hra[i]; for( i = 0; i < N_CHAMBERS; i++) { strcpy(mod->name[i],ch_name[ N_CHAMBERS * (cpu_nr -1) + i]); } sem_free(evid, caller); } sem_wait(evid, caller); mod->nread_lv = 0; mod->nerr_lv = 0; sem_free(evid, caller); } diff_mode = 1; gain_mode = 1; gains_set[0] = gain_word(1); /* -> amplification = 1 */ while(1){ for (adc = 0; adc < 3; adc++){ anl_adc_init(adc_base[adc], &gain_mode, gains_set, &diff_mode); anl_adc_read(adc_base[adc], data, &ndata, &gain_mode, gains_read, &diff_mode); for ( i = 0; i < ndata; i++){ datv[i] = (vmax - vmin)/(nch-1) * (float) data[i] + vmin; if ( i < 48) adcv[adc][i] = datv[i]; else { printf("error reading differential ADC"); printf(": more then 48 data !!\n"); } } } for ( i = 0; i < 8; i++){ vstar[0][i] = - adcv[0][1 + 6 * i]; vstar[1][i] = - adcv[0][3 + 6 * i]; vstar[2][i] = - adcv[0][5 + 6 * i]; istar[0][i] = - adcv[0][0 + 6 * i] * VTOI; istar[1][i] = - adcv[0][2 + 6 * i] * VTOI; istar[2][i] = - adcv[0][4 + 6 * i] * VTOI; } for ( i = 0; i < 4; i++){ vstar[0][8 + i] = - adcv[1][1 + 6 * i]; vstar[1][8 + i] = - adcv[1][3 + 6 * i]; vstar[2][8 + i] = - adcv[1][5 + 6 * i]; istar[0][8 + i] = - adcv[1][0 + 6 * i] * VTOI; istar[1][8 + i] = - adcv[1][2 + 6 * i] * VTOI; istar[2][8 + i] = - adcv[1][4 + 6 * i] * VTOI; } for ( i = 0; i < 6; i++){ vsgs[0][i] = - adcv[1][24 + 1 + 4 * i]; vsgs[1][i] = - adcv[1][24 + 3 + 4 * i]; isgs[0][i] = adcv[1][24 + 0 + 4 * i] * VTOI; isgs[1][i] = adcv[1][24 + 2 + 4 * i] * VTOI; } for ( i = 0; i < 6; i++){ vsgs[0][6 + i] = - adcv[2][1 + 4 * i]; vsgs[1][6 + i] = - adcv[2][3 + 4 * i]; isgs[0][6 + i] = adcv[2][0 + 4 * i] * VTOI; isgs[1][6 + i] = adcv[2][2 + 4 * i] * VTOI; } if(cycle){ data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); sem_wait(evid, caller); for(i = 0; i < 6; i++) mod->lv_tim[i] = hra[i]; for ( i = 0; i < N_LV; i++) { for ( j = 0; j < 3; j++){ if (istar[j][i] < 0) istar[j][i] = - istar[j][i]; mod->vstar[j][i] = vstar[j][i]; mod->istar[j][i] = istar[j][i]; } for ( j = 0; j < 2; j++){ if (isgs[j][i] < 0) isgs[j][i] = - isgs[j][i]; mod->vsgs[j][i] = vsgs[j][i]; mod->isgs[j][i] = isgs[j][i]; } } mod->nread_lv++; sem_free(evid, caller); } else{ printf("\n S T A R"); printf(" S G S\n\n"); printf(" -6V +6V +5V"); printf(" -5V +7V\n"); printf(" V I V I V I"); printf(" V I V I\n"); for ( i = 0; i < N_LV; i++) { if ( cpu_nr == 1) printf(" %s ", ch_name[ lv_t[i] ]); if ( cpu_nr == 2) printf(" %s ", ch_name[ N_CHAMBERS + lv_t[i] ]); for ( j = 0; j < 3; j++){ if (istar[j][i] < 0) istar[j][i] = - istar[j][i]; printf("%4.1f %4.1f ", vstar[j][i], istar[j][i]); } printf(" "); for ( j = 0; j < 2; j++){ if (isgs[j][i] < 0) isgs[j][i] = - isgs[j][i]; printf("%4.1f %4.1f ", vsgs[j][i], isgs[j][i]); } printf("\n"); } } if (cycle) sleep(cycle); else break; /* only one reading if cicle == 0 */ } }