/* REGUL.C - ¯/¯ ®â®¡p ¦¥­¨ï p¥£ã«ïâ®p®¢ */ #include "complex.h" #include "screen.h" #include "graf.h" void stat_reg(word_s d,word_s nscr,int n_koef,rec_koeff *stat_kf); void dinam_reg(word_s nscr); void ask_kf(rec_koeff *,int); extern int set_kf(controller *p_c, analog *p_a, word_s nom_kf, float valk); extern int get_kf(controller *p_c, analog *p_a,void **koef); extern word_s lenbar(analog *ptr, word_s cod); //extern void stat_koef_contr(word_s nscr); extern int Get_info_contr(controller *p_c, analog *p_a,int n_mess,rec_info_reg *info_reg); extern void set_cur_kf(word_s dp,word_s nscr,rec_koeff *koef,int); extern gr_cont * p_grc[]; extern word_s i_par_sav[]; extern word_s contr[]; time_t z_t[DISPLAY]; word_s x_kf[DISPLAY], y_kf[DISPLAY], pos_kf[DISPLAY], cur_kf[4]={ 0, 0, 0, 0 }; char t_sc[DISPLAY]; char mas_cur_kf[DISPLAY][180]; /*-------------------------------------------------------------------*/ word_s regul(word_s nscr) { rec_koeff *koef; float save, work; int numb_koef; byte modif=0, *old_tip_ekr; numb_koef = get_kf(p_c[nscr],p_a[nscr],&koef); stat_reg(0,nscr,numb_koef,koef); ask_kf(koef,numb_koef); old_tip_ekr=tip_ekr; tip_ekr="reg"; while(!endrun) { key[nscr] = read_wpipe(scr_chn[nscr],0.5*HZ); if(list_func(key[nscr]) || var_obj(key[nscr],nscr)) { // i_par[nscr] = i_par_sav[nscr]; //“¡à âì tip_ekr=old_tip_ekr; return key[nscr]; } if(key[nscr]==Tab){request_resource(ekran,0L); switch_so(Tab,nscr); release_resource(ekran); goto m1;} if(key[nscr]==MAN || key[nscr]==AUTO || key[nscr]==CAS) {set_mode(key[nscr],nscr); goto m1;} if(key[nscr]==MORE || key[nscr]==LESS || key[nscr]==QMORE || key[nscr]==QLESS) { if(cur_kf[nscr]) { if(!modif) save = work = koef[pos_kf[nscr]].znach; modif=1; if(key[nscr]==MORE){work += 0.01; goto m2;} if(key[nscr]==LESS){work -= 0.01; goto m2;} if(key[nscr]==QMORE){work += max(1.0,fabs(work*.01)); goto m2;} if(key[nscr]==QLESS){work -= max(1.0,fabs(work*.01)); goto m2;} if(key[nscr]==OFF){work = 0; goto m2;} if(key[nscr]==ON) {work = koef[pos_kf[nscr]].max; goto m2;} m2: if(work > koef[pos_kf[nscr]].max) work = koef[pos_kf[nscr]].max; else if(work < koef[pos_kf[nscr]].min) work = koef[pos_kf[nscr]].min; koef[pos_kf[nscr]].znach=work; print_kf(pos_kf[nscr],koef); } else if(cur_so[nscr]) set_so(key[nscr],nscr); goto m1; } if(key[nscr]==PgUp || key[nscr]==PgDn) {tip_ekr=old_tip_ekr; return key[nscr];} if(key[nscr]==Up){if(!modif) set_cur_kf(-1,nscr,koef,numb_koef); goto m1;} if(key[nscr]==Down){if(!modif) set_cur_kf(+1,nscr,koef,numb_koef); goto m1;} if(key[nscr]==Left){if(!modif) set_cur_kf(-3,nscr,koef,numb_koef); goto m1;} if(key[nscr]==Right){if(!modif) set_cur_kf(+3,nscr,koef,numb_koef); goto m1;} // if(key[nscr]==ON || key[nscr]==OFF){if(cur_kf[nscr]) set_kf(nscr); goto m1;} if(key[nscr]==ENTER) { if(cur_kf[nscr]) { if(modif) { if(set_kf(p_c[nscr],p_a[nscr],pos_kf[nscr]/*koef[pos_kf[nscr]].index*/,koef[pos_kf[nscr]].znach)) { koef[pos_kf[nscr]].znach=save; print_kf(pos_kf[nscr],koef); } else { #if (PROTOC) arc_op1("%s - %s %f -> %f",p_a[nscr]->cipher,koef[pos_kf[nscr]].nam,save,work); #endif } modif=0; } set_cur_kf(5,nscr,koef,numb_koef); } ask_kf(koef,numb_koef); goto m1; } if(key[nscr]==ESC) { if(cur_kf[nscr]) { if(modif){ koef[pos_kf[nscr]].znach = save; print_kf(pos_kf[nscr],koef); modif=0;} set_cur_kf(5,nscr,koef,numb_koef); goto m1; } tip_ekr=old_tip_ekr; return key[nscr]; } m1:; if(check_flag(period_fl[nscr])) { clear_flag(period_fl[nscr]); request_resource(ekran, 0L); if(screen!=nscr) set_screen(nscr); // eprintf(RED_,"ERR %f",(p_alg1+p_a[nscr]->nomin_var)->koef[7]); dinam_analog(p_a[nscr],7/*i_par[nscr]*/,nscr); //(analog*, nomcontãà  (7), displ ) dinam_reg(nscr); if(screen!=nscr) set_screen(screen); release_resource(ekran); } } return 0; } /*-------------------------------------------------------------------*/ void stat_reg(word_s d,word_s nscr,int n_koef,rec_koeff *stat_kf) { word_s i,n_mess; rec_info_reg info_reg; // if(d) { //“¡à âì // i_par[nscr] = i_par_sav[nscr]; // do { // i_par[nscr] = i_par[nscr] + d; // if(i_par[nscr] < 0 ) i_par[nscr] = p_grc[nscr]->n_par - 1; // else if(i_par[nscr] >= p_grc[nscr]->n_par) i_par[nscr] = 0; // p_c[nscr] = c_ptr+p_grc[nscr]->nomcontr[i_par[nscr]]; // p_a[nscr] = p_c[nscr]->a_ptr+p_grc[nscr]->nomsert[i_par[nscr]]; // } while(p_grc[nscr]->type_sert[i_par[nscr]]!=ANALOG||!p_a[nscr]->type_mech); // } //“¡à âì // i_par_sav[nscr] = i_par[nscr]; i_par[nscr] = 7; p_d[nscr]=NULL; request_resource(ekran, 0L); bar_(0, 1, Y_T_SCR+1, X_SCR-1, Y_B_SCR-1); set_vso(7/*i_par[nscr]*/,nscr); stat_analog(p_a[nscr],7/*i_par[nscr]*/); image_cont(7/*i_par[nscr]*/,nscr); eprintf(GREEN_,p_a[nscr]->name); dinam_analog(p_a[nscr],7/*i_par[nscr]*/,nscr); // release_resource(ekran); for(i=0;itype_sc==SC_SQRT) t_sc[nscr] = 'Š'; else t_sc[nscr] = '‹'; gprintf(9,2,"˜ª «  %c%8.1f %8.1f",t_sc[nscr],p_a[nscr]->min_sc,p_a[nscr]->max_sc); gprintf(10,2,"ƒp ­¨æë %c%8.1f %8.1f",'P', valtec(p_a[nscr],p_a[nscr]->min_reg)+0.049,valtec(p_a[nscr],p_a[nscr]->max_reg)+0.049); gprintf(11,2,"ƒp ­¨æë %c%8.1f %8.1f",'A', valtec(p_a[nscr],p_a[nscr]->min_al)+0.049,valtec(p_a[nscr],p_a[nscr]->max_al)+0.049); _setcolor(WHITE_); line(0,Y0-LSC-10,565,Y0-LSC-10); for(n_mess=0;!Get_info_contr(p_c[nscr],p_a[nscr],n_mess,&info_reg);n_mess++) { _settextcolor(info_reg.color); gprintf(info_reg.str,info_reg.col,info_reg.string); } // stat_koef_contr(nscr); _settextcolor(WHITE_); for(i=0; i < 5; i++) gprintf(CIPH_CO_L-1,4+i*15,"%+3d",-12+i*6); gprintf(CIPH_CO_L-1,68,"¬¨­"); _setcolor(WHITE_); for(i=15; i < 500; i+=120) line(XR+i,Y0,XR+i,Y0+1); release_resource(ekran); time(&z_t[nscr]); z_t[nscr] = z_t[nscr] - 32000; change_timer(period_tm[nscr], 3*HZ, 1); set_flag(period_fl[nscr]); } /*-------------------------------------------------------------------*/ void dinam_reg(word_s nscr) { static word_s i[DISPLAY], i_old[DISPLAY], k[DISPLAY], j[DISPLAY], j_old[DISPLAY]; static word_s y[DISPLAY], vv[DISPLAY], ss[DISPLAY], oo[DISPLAY]; static time_t l_t[DISPLAY]; static char bff[DISPLAY][9]; static reg_ar *par[DISPLAY]; time(&l_t[nscr]); i[nscr] = (l_t[nscr] - z_t[nscr])/3; if(i[nscr] >= NX_REG) { time(&z_t[nscr]); _strtime(bff[nscr]); bar_(0, XR, Y0-1, XR+NX_REG*2, Y0-1-LSC); _settextcolor(WHITE_); gprintf(CIPH_CO_L-1,32,bff[nscr]); _settextcolor(GRAY_); for(j[nscr]=0; j[nscr] <= 4; j[nscr]++) gprintf(SC_L-j[nscr]*2,SC_C+30,"%2d",j[nscr]*20); _setcolor(GRAY_); for(j[nscr]=1; j[nscr] <= 10; j[nscr]++) line(XR-5,Y0-1-j[nscr]*H_CH,XR+515,Y0-1-j[nscr]*H_CH); for(i[nscr]=-5; i[nscr] < 520; i[nscr]+=20) line(XR+i[nscr],Y0-2,XR+i[nscr],Y0-1-LSC); _setcolor(WHITE_); for(j[nscr]=2; j[nscr]<=10; j[nscr]+=2) line(XR+NX_REG,Y0-1-j[nscr]*H_CH,XR+NX_REG+4,Y0-1-j[nscr]*H_CH); line(XR+NX_REG,Y0-1,XR+NX_REG,Y0-1-LSC); line(XR-5,Y0-1,XR+515,Y0-1); line(XR+255,Y0,XR+255,Y0+1); par[nscr] = (p_ref+p_a[nscr]->i_reg_ar)->p_ar; for(k[nscr]=1,j_old[nscr]=j[nscr]=i_rec_ar; k[nscr] < NX_REG; k[nscr]++) { if(par[nscr]->v_y[j_old[nscr]]!=255 && par[nscr]->v_y[j[nscr]]!=255) //add { _setcolor(CYAN_); if(par[nscr]->o_y[j_old[nscr]] <= LSC && par[nscr]->o_y[j[nscr]] <= LSC) line(XR+k[nscr]-1,Y0-1-par[nscr]->o_y[j_old[nscr]],XR+k[nscr],Y0-1-par[nscr]->o_y[j[nscr]]); _setcolor(GREEN_); if(par[nscr]->s_y[j_old[nscr]] <= LSC && par[nscr]->s_y[j[nscr]] <= LSC) line(XR+k[nscr]-1,Y0-1-par[nscr]->s_y[j_old[nscr]],XR+k[nscr],Y0-1-par[nscr]->s_y[j[nscr]]); _setcolor(GREEN_BR_); if(par[nscr]->v_y[j_old[nscr]] <= LSC && par[nscr]->v_y[j[nscr]] <= LSC) line(XR+k[nscr]-1,Y0-1-par[nscr]->v_y[j_old[nscr]],XR+k[nscr],Y0-1-par[nscr]->v_y[j[nscr]]); } j_old[nscr]=j[nscr]; if(++j[nscr] >= NX_REG) j[nscr]=0; } vv[nscr] = par[nscr]->v_y[j_old[nscr]]; ss[nscr] = par[nscr]->s_y[j_old[nscr]]; oo[nscr] = par[nscr]->o_y[j_old[nscr]]; i_old[nscr] = k[nscr] - NX_REG; i[nscr] = 0; } if(p_a[nscr]->novalid) y[nscr]=255; else if(p_a[nscr]->type_mech==PULS) y[nscr]=p_a[nscr]->pos_cod*K_BAR0; else y[nscr]=p_a[nscr]->out_cod*K_BAR0; _setcolor(CYAN_); if(oo[nscr] <= LSC && y[nscr] <= LSC) line(XR+NX_REG+i_old[nscr],Y0-1-oo[nscr],XR+NX_REG+i[nscr],Y0-1-y[nscr]); oo[nscr] = y[nscr]; if(p_a[nscr]->novalid) y[nscr]=255; else y[nscr]=lenbar(p_a[nscr],p_a[nscr]->set_cod); _setcolor(GREEN_); if(ss[nscr] <= LSC && y[nscr] <= LSC) line(XR+NX_REG+i_old[nscr],Y0-1-ss[nscr],XR+NX_REG+i[nscr],Y0-1-y[nscr]); ss[nscr] = y[nscr]; if(p_a[nscr]->novalid) y[nscr]=255; else y[nscr]=lenbar(p_a[nscr],p_a[nscr]->var_cod); _setcolor(GREEN_BR_); if(vv[nscr] <= LSC && y[nscr] <= LSC) line(XR+NX_REG+i_old[nscr],Y0-1-vv[nscr],XR+NX_REG+i[nscr],Y0-1-y[nscr]); vv[nscr] = y[nscr]; i_old[nscr] = i[nscr]; } //-------------------------------------------------------------------- void ask_kf(rec_koeff *koef,int numb) { word_s i; request_resource(ekran,0L); for(i=0; i < numb; i++) print_kf(i,koef); release_resource(ekran); } //----------------------------------------------------------------- void print_kf(word_s i,rec_koeff *koef) { _settextcolor(GREEN_); gprintf(koef[i].str,koef[i].col,koef[i].format,koef[i].znach); } //------------------------------------------------------------------- void set_cur_kf(word_s dp,word_s nscr,rec_koeff *koef,int numb) { char str1[5]; word_s x_old, y_old,i,t_max,t_min,i_min,i_max,symb; if(dp==5) goto off; if(t_kbd==2 && !cur_kf[nscr]) { tsk_outp(0x60,0xED); pause(1000); tsk_outp(0x60,0x07); i=0; for(i=0;(symb=read_wpipe(scr_chn[nscr],2L))!=-1;i++) str1[i]=symb; if(strncmp(str1,"",3)) return; } if(cur_kf[nscr] && dp) { set_cur_kf(5,nscr,koef,numb); x_old=koef[pos_kf[nscr]].str; y_old=koef[pos_kf[nscr]].col; switch(dp) { case -1 : t_min=t_max= -1; for(i=0;i t_min){ t_min=koef[i].str; i_min=i;} if(koef[i].col == y_old && koef[i].str > t_max){ t_max=koef[i].str; i_max=i;} } if(t_min != -1) pos_kf[nscr]=i_min; else if(t_max != -1) pos_kf[nscr]=i_max; break; case 1 : t_min=t_max= 200; for(i=0;i x_old && koef[i].str < t_max){ t_max=koef[i].str; i_max=i;} else if(koef[i].col == y_old && koef[i].str < t_min){ t_min=koef[i].str; i_min=i;} } if(t_max != 200) pos_kf[nscr]=i_max; else if(t_min != 200) pos_kf[nscr]=i_min; break; case -3 : t_min=t_max= -1; for(i=0;i t_min){ t_min=koef[i].col; i_min=i;} if(koef[i].str == x_old && koef[i].col > t_max){ t_max=koef[i].col; i_max=i;} } if(t_min != -1) pos_kf[nscr]=i_min; else if(t_max != -1) pos_kf[nscr]=i_max; break; case 3 : t_min=t_max= 200; for(i=0;i y_old && koef[i].col < t_max){ t_max=koef[i].col; i_max=i;} else if(koef[i].str == x_old && koef[i].col < t_min){ t_min=koef[i].col; i_min=i;} } if(t_max != 200) pos_kf[nscr]=i_max; else if(t_min != 200) pos_kf[nscr]=i_min; break; } } x_kf[nscr] = (koef[pos_kf[nscr]].col-5) *W_CH; y_kf[nscr] = (koef[pos_kf[nscr]].str-1) *H_CH; request_resource(ekran,0L); _setcolor(WHITE_); _rectangle(_GBORDER,x_kf[nscr]-1,y_kf[nscr]-1,x_kf[nscr]+koef[pos_kf[nscr]].cur_x,y_kf[nscr]+koef[pos_kf[nscr]].cur_y); // fgtext(GREEN_,x_kf[nscr],y_kf[nscr]+2,"%s",koef[pos_kf[nscr]].nam); release_resource(ekran); cur_kf[nscr] = 1; return; off: request_resource(ekran,0L); _setcolor(BLACK_); _rectangle(_GBORDER,x_kf[nscr]-1,y_kf[nscr]-1,x_kf[nscr]+koef[pos_kf[nscr]].cur_x,y_kf[nscr]+koef[pos_kf[nscr]].cur_y); // fgtext(GREEN_,x_kf[nscr],y_kf[nscr]+2,"%s",koef[pos_kf[nscr]].nam); release_resource(ekran); cur_kf[nscr] = 0; }