/*********************************************** * * ************************************************/ #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}; #define T_ADC 0x02000800 #define J1_ODD 48 #define J1_EVEN 0 #define J2_ODD 72 #define J2_EVEN 24 #define T1 60. #define T2 65. #define T3 70. int stato[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }; LV_MBOX *mod; int evid; char *caller; sighand(signal) register int signal; { sem_unl_del(evid, "lv_mbox", caller); munlink(mod); exit(0); } main(argc, argv) int argc; char **argv; { 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, vmax; float t_vmin = 0.; /* give range of the A/D : settable only hardware! */ float t_vmax = 10.; float lv_vmin = -10.; float lv_vmax = 10.; float nch = 4096; int cpu_nr, tcp_ip_nr; char *hv_config[3]; int sonda, cycle; int hra[6]; caller = argv[0]; cycle = 60; if (argc < 2) cycle = 60; 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); 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,"lv_mon: err. link/create data module\n")); } for(i=0; i<6; i++) mod->creat_tim[i] = hra[i]; for( i = 0; i < N_CHAMBERS - (cpu_nr-1); i++) strcpy(mod->name[i],ch_name[ N_CHAMBERS * ( cpu_nr - 1 ) + i]); mod->t_alarm_id[0] = mod->t_alarm_id[1] = 0; mod->lv_alarm_id = 0; sem_free(evid, caller); } sem_wait(evid, caller); mod->nread_t = 0; mod->nerr_t = 0; mod->nread_lv = 0; mod->nerr_lv = 0; for( i = 0; i < N_CHAMBERS - (cpu_nr - 1); i++) { sonda = (cpu_nr - 1) * N_CHAMBERS + i; mod->st[i][0] = stato [sonda * 2]; mod->st[i][1] = stato [sonda * 2 + 1]; } sem_free(evid, caller); gain_mode = 1; /* 1: common amplification for all chan's 0: individual amplification */ gains_set[0] = gain_word(1); /* -> amplification = 1 */ while(1){ base = (unsigned) T_ADC; vmin = t_vmin; vmax = t_vmax; diff_mode = 0; /* 1: 48 diff chan's; 0: 96 single ended chan's */ anl_adc_init(base, &gain_mode, gains_set, &diff_mode); anl_adc_read(base, data, &ndata, &gain_mode, gains_read, &diff_mode); for ( i = 0; i < ndata; i++){ datv[i] = ((vmax - vmin)/(float) (nch-1)) * (float) data[i] + vmin; datv[i] = datv[i] / 0.01026 - 273. ; if (datv[i] < 0.) datv[i] = -1.; } 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->t_tim[i] = hra[i]; for ( i = 0; i < N_CHAMBERS - ( cpu_nr - 1) ; i++) { mod->t[i][0] = datv[J2_ODD + i]; mod->t[i][1] = datv[J2_EVEN + i]; } mod->nread_t++; sem_free(evid, caller); diff_mode = 1; vmin = lv_vmin; vmax = lv_vmax; 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; } 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); sleep(cycle); } }