#include "complex.h" #include "arh.h" #include "screen.h" #define TA talg[nscr] #define XLW 40 #define YLW 219 #define XPW 627 #define YPW 319 //--------------------- extern char sc[6][5]; char zvet[8]={5,6,9,10,11,12,13,14}; char *p_alg_b; //char scvr[5][5]={"-40м","-30м","-20м","-10м"," 0"}; typedef struct {controller *t_c; analog *t_p,*vh[8]; digit *t_d; char priz[8],zvet; alg_str *t_a; word_s cur; m_kod *buf_zn_i; word_s hn_fl; time_t t_time; resourceptr res; cpr *mac; word_s par[8],parv; word_s tip; byte nomcontr; word_s nomsert; float *cur_kf; }basalg; void drawAlg(basalg *b_alg,char opt); int drawKf(basalg *alg,word_s pos,word_s pos1,char opt); int drawInp(alg_str *alg,word_s pos,char opt); void drawFrm(basalg *alg,int *x1, int *y1,char opt); void di_alg1(basalg *alg,int pos); void draw_frm(int *x,int y,int x1,int y1,char *str_ptr1,int color); basalg *talg[DISPLAY]; word_s algkoef(word_s nscr,char tip,word_s contr,word_s nomsert) {word_s keyboard[4],i,zn,n_kf,n_inp; int x_fr=0,y_fr=0,x_fr_cr,y_fr_cr,tmp; word_s pos_Kf=0, pos_Kf1=0, pos_Inp=0,func=0; byte *old_tip_ekr; request_resource(ekran,0*HZ); ramka(); _setcolor(8); for(i=0;i<6;i++)fgtext(7,8,YPW-i*20-4,"%s",sc[i]); fgtext(7,XLW+47+4*120,YPW+2," 0"); //@ for(i=0;i<4;i++)fgtext(7,XLW+47+i*120,YPW+2,"-%dm",(4-i)*2*into); //@ // fgtext(7,XLW+47+i*120,YPW+2,"%s",scvr[i]); _setcolor(7);_rectangle(_GBORDER,XLW-1,YLW-1,XPW+1,YPW+1); if((TA=(basalg *)calloc(1,sizeof(basalg)))==NULL) {eprintf(RED_,"Нет памяти для MODEL");release_resource(ekran);return 0;} TA->tip=tip; TA->nomcontr=contr; TA->nomsert=nomsert; TA->t_c=c_ptr+TA->nomcontr; TA->t_p=TA->t_c->a_ptr+TA->nomsert; TA->t_d=TA->t_c->d_ptr+TA->nomsert; if((TA->tip==ANALOG && TA->t_p->nomin_var >= k_alg1) || (TA->tip==DIGIT && (TA->t_d->nom_var-1)>=k_alg1)) {release_resource(ekran);free(TA);return 0;} drawAlg(TA,0); drawFrm(TA,&tmp,&tmp,3); // eprintf(GRAY_,"TEST ERR"); drawKf(TA,pos_Kf,pos_Kf1,3); drawInp(TA->t_a,pos_Inp,3); n_kf=drawKf(TA,pos_Kf,pos_Kf1,0); n_inp=drawInp(TA->t_a,pos_Inp,0); di_alg1(TA,0); x_fr_cr=x_fr; y_fr_cr=y_fr; drawFrm(TA,&x_fr_cr,&y_fr_cr,0); release_resource(ekran); change_timer(period_tm[nscr],into*HZ,1); //@ change_timer(peri_tm1[nscr],1*HZ,1); old_tip_ekr=tip_ekr; tip_ekr="alg"; while(!endrun) {keyboard[nscr]=read_wpipe(scr_chn[nscr],0.4*HZ); if(keyboard[nscr]<0){ drawInp(TA->t_a,pos_Inp,4); drawKf(TA,pos_Kf,pos_Kf1,4); } if(list_func(keyboard[nscr])||var_obj(keyboard[nscr],nscr)) {free(TA); tip_ekr=old_tip_ekr; return keyboard[nscr]; } if(keyboard[nscr]==ESC){free(TA); tip_ekr=old_tip_ekr; return keyboard[nscr];} if(keyboard[nscr]==Tab) { if(func==1) drawKf(TA,pos_Kf,pos_Kf1,3); if(func==2) drawInp(TA->t_a,pos_Inp,3); if(func==3) { drawFrm(TA,&tmp,&tmp,3);} i= 0; while(i!=2) {func++; if(func==1) if(n_kf) { drawKf(TA,pos_Kf,pos_Kf1,2); break;} else continue; if(func==2) if(n_inp>8){ drawInp(TA->t_a,pos_Inp,2); break;} else continue; if(func==3) if(x_fr_cr>78 || y_fr_cr>5) {drawFrm(TA,&tmp,&tmp,2); break;} else continue; func=0; i++; } } if(keyboard[nscr]==MORE&&func==1) {*TA->cur_kf+=max(0.000001,fabs(*TA->cur_kf *.001)); *TA->cur_kf=min(*TA->cur_kf,9999999998.); drawKf(TA,pos_Kf,pos_Kf1,1); goto m1; } if(keyboard[nscr]==LESS&&func==1) {*TA->cur_kf-=max(0.000001,fabs(*TA->cur_kf *.001)); *TA->cur_kf=max(*TA->cur_kf,-999999998.); drawKf(TA,pos_Kf,pos_Kf1,1); goto m1; } if(keyboard[nscr]==QMORE&&func==1) {*TA->cur_kf+=max(.01,fabs(*TA->cur_kf *.01)); *TA->cur_kf=min(*TA->cur_kf,9999999998.); drawKf(TA,pos_Kf,pos_Kf1,1); goto m1; } if(keyboard[nscr]==QLESS&&func==1) {*TA->cur_kf-=max(.01,fabs(*TA->cur_kf *.01)); *TA->cur_kf=max(*TA->cur_kf,-999999998.); drawKf(TA,pos_Kf,pos_Kf1,1); goto m1; } if(keyboard[nscr]==K1&&func==1) {*TA->cur_kf= 0.0; drawKf(TA,pos_Kf,pos_Kf1,1); goto m1; } if(keyboard[nscr]==K2&&func==1) {*TA->cur_kf=ceil(*TA->cur_kf-0.5); drawKf(TA,pos_Kf,pos_Kf1,1); goto m1; } if(keyboard[nscr]==Up) { if(func==1) {if(pos_Kf1>0) pos_Kf1--; else if(pos_Kf>0) pos_Kf--; else goto m1; drawKf(TA,pos_Kf,pos_Kf1,0); } if(func==2) {if(pos_Inp>0) pos_Inp--; else goto m1; drawInp(TA->t_a,pos_Inp,0); di_alg1(TA,pos_Inp); x_fr_cr=x_fr; y_fr_cr=y_fr; drawFrm(TA,&x_fr_cr,&y_fr_cr,0); } if(func==3) {if(y_fr>0) y_fr--; else goto m1; x_fr_cr=x_fr; y_fr_cr=y_fr; drawFrm(TA,&x_fr_cr,&y_fr_cr,0); } } if(keyboard[nscr]==Down) { if(func==1) {if(pos_Kf1t_a,pos_Inp,0); di_alg1(TA,pos_Inp); x_fr_cr=x_fr; y_fr_cr=y_fr; drawFrm(TA,&x_fr_cr,&y_fr_cr,0); } if(func==3) {if((5+y_fr)0) x_fr--; else goto m1; x_fr_cr=x_fr; y_fr_cr=y_fr; drawFrm(TA,&x_fr_cr,&y_fr_cr,0); } } m1: if(check_flag(peri_fl1[nscr])) { clear_flag(peri_fl1[nscr]); request_resource(ekran,0*HZ); if(screen!=nscr)set_screen(nscr); drawAlg(TA,1); drawKf(TA,pos_Kf,pos_Kf1,1); drawInp(TA->t_a,pos_Inp,1); if(screen!=nscr)set_screen(screen); release_resource(ekran); } if(check_flag(period_fl[nscr])) { clear_flag(period_fl[nscr]); request_resource(ekran,0*HZ); if(screen!=nscr)set_screen(nscr); if(++TA->cur>(XPW-1)) di_alg1(TA,pos_Inp); else { for(i=0;i<8;i++) {if(TA->vh[i]->novalid||!TA->priz[i])TA->par[i]=-1; else {zn=TA->vh[i]->var_cod; if(zn<0)zn=0;if(zn>ADC_SC)zn=ADC_SC; if(TA->vh[i]->type_sc!=SC_LINE)zn=(word_s)(sqrt((double)zn*ADC_SC)); zn=(word_s)((float)zn*100/ADC_SC); if(TA->par[i]!=-1){_setcolor(zvet[i]);li(TA->cur-1,YPW-TA->par[i],TA->cur-1,YPW-zn);} TA->par[i]=zn; } } if(TA->tip==ANALOG) {if(TA->t_p->novalid)TA->parv=-1; else {zn=TA->t_p->var_cod; if(zn<0)zn=0;if(zn>ADC_SC)zn=ADC_SC; if(TA->t_p->type_sc!=SC_LINE)zn=(word_s)(sqrt((double)zn*ADC_SC)); zn=(word_s)((float)zn*100/ADC_SC); if(TA->parv!=-1){_setcolor(15);li(TA->cur-1,YPW-TA->parv,TA->cur-1,YPW-zn);} TA->parv=zn; } } } if(screen!=nscr)set_screen(screen); release_resource(ekran); } } return 0; } void drawFrm(basalg *alg,int *x1, int *y1,char opt) { int x,y,i,ii,len,col,zn,len_str,rem; char *str, *str_ptr, str_ptr1[15]; if(opt==2) {_setcolor(WHITE_BR_); _rectangle(_GBORDER,2,150,637,210); _rectangle(_GBORDER,3,151,636,209); fgtext(WHITE_BR_,5,139,"%.78s ",formuls1[alg->t_a->form].name); return; } if(opt==3) {_setcolor(WHITE_); _rectangle(_GBORDER,2,150,637,210); _rectangle(_GBORDER,3,151,636,209); fgtext(WHITE_BR_,5,139,"%.78s ",formuls1[alg->t_a->form].name); return; } // _setcolor(7);_rectangle(_GBORDER,2,150,637,210); _rectangle(_GBORDER,3,151,636,209); _setcolor(0);_rectangle(_GFILLINTERIOR,7,153,635,208); if(formuls1[alg->t_a->form].tip!=5) { str=formuls1[alg->t_a->form].formul; len=strlen(str); for(y=-1,x=0,i=0;i(4+ *y1)){i+=(ii+1); continue;} if(*x1t_a->form].formul;// formuls[TA->t_a->subfunc].f_ptr; len_str=formuls1[alg->t_a->form].l_frm; // formuls[TA->t_a->subfunc].l_frm; // str_ptr1=malloc(15); i=0,zn=7,x=y=0,rem=0; while (ipriz[ii]==str_ptr[i+1]+1) break; if(ii!=8)col=zvet[ii]; draw_frm(&zn,y,*x1,*y1,str_ptr1,col); i+=2; continue; } if(str_ptr[i]=='C') {gcvt(*(float *)(str_ptr+i+1),6,str_ptr1); col=WHITE_; draw_frm(&zn,y,*x1,*y1,str_ptr1,col); i+=5; continue; } if(str_ptr[i]=='Y') {str_ptr1[0]='Y'; str_ptr1[1]=0; col=WHITE_; draw_frm(&zn,y,*x1,*y1,str_ptr1,col); i+=1; continue; } if(str_ptr[i]==0x0D) {rem=0; y++; x=max(x,(zn-7)/8);zn=7; i+=2; continue; } str_ptr1[0]=str_ptr[i]; str_ptr1[1]=0; col=WHITE_BR_; draw_frm(&zn,y,*x1,*y1,str_ptr1,col); i++; } if(len_str) {y++; x=max(x,(zn-7)/8);} *x1=x; *y1=y; // free(str_ptr1); } } void draw_frm(int *x,int y,int x1,int y1,char *str,int color) { int ofs= -1,len; len=strlen(str); if((*x/8-x1)<78 && y>=y1 && (y-y1)<5) { if((*x-7) >= x1*8) ofs = 0; else if((*x-7 + len*8) > x1*8 ) ofs=x1-(*x-7)/8; if(ofs>=0) fgtext(color,*x-x1*8+ofs*8,153+(y-y1)*11,"%.*s",78-(*x/8-x1+ofs),str+ofs); } *x+=8*len; } void drawAlg(basalg *b_alg,char opt) { char color; if(b_alg->tip==ANALOG) { b_alg->t_a=p_alg1+b_alg->t_p->nomin_var; color=GREEN_; if(b_alg->t_p->no_uchet)color=BLUE_; else if(b_alg->t_p->novalid)color=DARKGRAY_; else if(b_alg->t_p->bound_al)color=RED_; else if(b_alg->t_p->bound_reg)color=YELLOW_; _setcolor(0);_rectangle(_GFILLINTERIOR,85,33,85+9*8,33+10); fgtext(color,85,33,"%9.2f",b_alg->t_p->var_tech); if(opt) return; fgtext(WHITE_BR_,5,33,"%s ",b_alg->t_p->cipher); fgtext(WHITE_BR_,165,33,"(%.50s)",b_alg->t_a->disript); } else {b_alg->t_a=p_alg1+b_alg->t_d->nom_var-1; fgtext(15,5,32,"%s (%.50s)",b_alg->t_d->cipher,b_alg->t_a->disript);} } int drawKf(basalg *alg,word_s pos,word_s pos1,char opt) { int i,k; char str[20]; if(opt==2) {_setcolor(WHITE_BR_); _rectangle(_GBORDER,2,50,323,137); _rectangle(_GBORDER,3,51,322,136); _setcolor(BLACK_); _rectangle(_GFILLINTERIOR,90,45,200,55); fgtext(WHITE_BR_,95,45,"Коэффициенты:"); return 0; } if(opt==3) {_setcolor(WHITE_); _rectangle(_GBORDER,2,50,323,137); _rectangle(_GBORDER,3,51,322,136); _setcolor(BLACK_); _rectangle(_GFILLINTERIOR,90,45,200,55); fgtext(WHITE_BR_,95,45,"Коэффициенты:"); return 0; } if(opt==0) {_setcolor(0);_rectangle(_GFILLINTERIOR,5,54,321,55+8*10); } else _setcolor(0);_rectangle(_GFILLINTERIOR,236,54,321,55+8*10); for(k= -1,i=0;it_a->form].n_koef;i++) { if(!formuls1[alg->t_a->form].name_kf[i][0]||formuls1[alg->t_a->form].name_kf[i][0]==' ') continue; k++; if(k=(8+pos)) continue; sprintf(str,"%f",alg->t_a->koef[i]); fgtext(7,230,55+(k-pos)*10,"|%.10s",str); if(opt) continue; fgtext(7,5,55+(k-pos)*10,"%d:%.25s",i+1,formuls1[alg->t_a->form].name_kf[i]); if((k-pos)==pos1) alg->cur_kf=&alg->t_a->koef[i]; } if(formuls1[alg->t_a->form].n_koef){ _setcolor(WHITE_BR_); _rectangle(_GBORDER,235,54+pos1*10,320,64+pos1*10);} return(k+1); } int drawInp(alg_str *alg,word_s pos,char opt) { int i,k; char *str,color; if(opt==2) {_setcolor(WHITE_BR_); _rectangle(_GBORDER,325,50,637,137); _rectangle(_GBORDER,326,51,636,136); _setcolor(BLACK_); _rectangle(_GFILLINTERIOR,420,45,475,55); fgtext(15,425,45,"Входы:"); return 0; } if(opt==3) {_setcolor(WHITE_); _rectangle(_GBORDER,325,50,637,137); _rectangle(_GBORDER,326,51,636,136); _setcolor(BLACK_); _rectangle(_GFILLINTERIOR,420,45,475,55); fgtext(15,425,45,"Входы:"); return 0; } if(opt==0) {_setcolor(0);_rectangle(_GFILLINTERIOR,327,54,635,55+8*10); } else _setcolor(0);_rectangle(_GFILLINTERIOR,570,55,570+8*8,55+8*10); for(k=-1,i=0;iform].n_inp;i++) { if(alg->inp[i].tip==EMPTY) continue; k++; if(k=(8+pos)) continue; if(alg->inp[i].tip==ANALOG) { color=GREEN_; if(((c_ptr+alg->inp[i].nc)->a_ptr+alg->inp[i].nz)->no_uchet)color=BLUE_; else if(((c_ptr+alg->inp[i].nc)->a_ptr+alg->inp[i].nz)->novalid)color=DARKGRAY_; else if(((c_ptr+alg->inp[i].nc)->a_ptr+alg->inp[i].nz)->bound_al)color=RED_; else if(((c_ptr+alg->inp[i].nc)->a_ptr+alg->inp[i].nz)->bound_reg)color=YELLOW_; fgtext(color,570,55+(k-pos)*10,"%8.2f",((c_ptr+alg->inp[i].nc)->a_ptr+alg->inp[i].nz)->var_tech); if(opt) continue; str=((c_ptr+alg->inp[i].nc)->a_ptr+alg->inp[i].nz)->cipher; } if(alg->inp[i].tip==DIGIT) { if(((c_ptr+alg->inp[i].nc)->d_ptr+alg->inp[i].nz)->type_par==0) if(((c_ptr+alg->inp[i].nc)->d_ptr+alg->inp[i].nz)->val_par) fgtext(GREEN_,602,55+(k-pos)*10,"<1>"); else fgtext(RED_,602,55+(k-pos)*10,"<0>"); str=((c_ptr+alg->inp[i].nc)->d_ptr+alg->inp[i].nz)->cipher; } fgtext(7,327,55+(k-pos)*10,"%d:%.17s",i+1,formuls1[alg->form].name_inp[i]); fgtext(7,488,55+(k-pos)*10,"|",str); fgtext(zvet[k-pos],495,55+(k-pos)*10,"%.9s",str); } return(k+1); } void di_alg1(basalg *alg,int pos) {word_s i,j,jj,jjj,jjjj,k,zn; long kk,kp,rf,gtbl,rf1,rb,rp,gkzap; word nar[9]={0,0,0,0,0,0,0,0,0}; if(alg->tip==ANALOG) { for(j=0;jnomcontr;j++)nar[8]+=c_ptr[j].num_ap; nar[8]+=alg->nomsert; } for(k=-1,i=0;it_a->form].n_inp;i++) { if(alg->t_a->inp[i].tip==EMPTY) continue; k++; if(k=(8+pos)) continue; if(alg->t_a->inp[i].tip==ANALOG) { for(j=0;jt_a->inp[i].nc;j++)nar[k-pos]+=c_ptr[j].num_ap; nar[k-pos]+=alg->t_a->inp[i].nz; alg->vh[k-pos]=(c_ptr+alg->t_a->inp[i].nc)->a_ptr+alg->t_a->inp[i].nz; alg->priz[k-pos]=i+1; } } alg->mac=&mg;alg->res=r_mgn; time(&alg->t_time); if((gtbl=alg->mac->tbl-540)<0)gtbl+=alg->mac->kbl; request_resource(alg->res,0*HZ); _setcolor(0);_rectangle(_GFILLINTERIOR,XLW,YLW,XPW,YPW); _setcolor(8); for(i=1;i<5;i++)if(i&&i<5)li(XLW,YPW-i*20,XPW,YPW-i*20); for(i=0;i<9;i++)li(XLW+60+i*60,YLW,XLW+60+i*60,YPW); alg->hn_fl=sopen(NameFile[34],O_RDONLY|O_BINARY,SH_DENYNO); release_resource(alg->res); gkzap=24510/alg->mac->dlbl; rb=gkzap*alg->mac->dlbl;rf1=rf=540;rf=rf1*alg->mac->dlbl; kp=rf1%gkzap;kk=rf/rb+1;rp=rf%rb; if((p_alg_b=(char *)calloc(1,rb))==NULL) {eprintf(RED_,"Нет памяти для MODEL");return;} for(jj=0,j=0,jjjj=0;jjmac->kbl) r_read(alg->hn_fl,p_alg_b,(unsigned)rb,(gtbl+1)*alg->mac->dlbl,SEEK_SET,alg->res); else { r_read(alg->hn_fl,p_alg_b,(unsigned)((alg->mac->kbl-gtbl+1)*alg->mac->dlbl),gtbl*alg->mac->dlbl,SEEK_SET,alg->res); r_read(alg->hn_fl,p_alg_b+(alg->mac->kbl-gtbl+1)*alg->mac->dlbl,(unsigned)(rb-(alg->mac->kbl-gtbl)*alg->mac->dlbl),(long)0,SEEK_SET,alg->res); } for(jjj=0;jjjmac->kbl)gtbl=0; if((alg->t_time- *(long *)(p_alg_b+alg->mac->dlbl*jjj))<86400) { alg->buf_zn_i=(m_kod *)((p_alg_b+alg->mac->dlbl*jjj)+sizeof(long)); for(i=0;i<8;i++) { if((alg->buf_zn_i+nar[i])->count==0 && alg->priz[i]) { zn=(alg->buf_zn_i+nar[i])->zn; if(zn<0)zn=0;if(zn>ADC_SC)zn=ADC_SC; if(alg->vh[i]->type_sc!=SC_LINE)zn=(word_s)(sqrt((double)zn*ADC_SC)); zn=(word_s)((float)zn*100/ADC_SC); if(jjjj) if(alg->par[i]!=-1) { _setcolor(zvet[i]); li(XLW+jjjj-1,YPW-alg->par[i],XLW+jjjj,YPW-zn); } alg->par[i]=zn; } else alg->par[i]=-1; } if(alg->tip==ANALOG) { if((alg->buf_zn_i+nar[8])->count==0) { zn=(alg->buf_zn_i+nar[8])->zn; if(zn<0)zn=0; if(zn>ADC_SC)zn=ADC_SC; if(alg->t_p->type_sc!=SC_LINE)zn=(word_s)(sqrt((double)zn*ADC_SC)); zn=(word_s)((float)zn*100/ADC_SC); if(jjjj) if(alg->parv!=-1) { _setcolor(15); li(XLW+jjjj-1,YPW-alg->par[i],XLW+jjjj,YPW-zn); } alg->parv=zn; } else alg->parv=-1; } } else { for(i=0;i<8;i++)alg->par[i]=-1;alg->parv=-1;} jjjj++; } } free(p_alg_b);close(alg->hn_fl);alg->cur=XLW+540; }