/*            CONTUR.C  -  задача  pаботы  с  контуpами              */
#include  "complex.h"
#include  "screen.h"
#include  "graf.h"

char * formt();
word_s col_a(analog *ptr);
void stat_grc(word_s nomgr,word_s nscr);
void stat_analog(analog *ptr,word_s nomc);
void stat_digit(digit *ptr,word_s nomc);
void dinam_grc(word_s nscr);
void dinam_analog(analog *ptr,word_s nomc,word_s nscr);
void dinam_digit(digit *ptr,word_s nomc,word_s nscr);
void ext_help_contr(byte tip,word_s nscr);                       //Дополнительная помощь о контроллере
void din_var(analog *ptr,word_s nomc);
void din_set(analog *ptr,word_s nomc);
void din_out(analog *ptr,word_s nomc);
void din_pos(analog *ptr,word_s nomc);
void din_mod(analog *ptr,word_s nomc,word_s nscr);

void din_dt_st(digit *ptr,word_s nomc,word_s nscr);
void din_dt1(digit *ptr,word_s nomc);
void din_dt2(digit *ptr,word_s nomc);
void din_dt3(digit *ptr,word_s nomc);
void din_dt4(digit *ptr,word_s nomc);
void din_dt5(digit *ptr,word_s nomc);

void din_par(digit *ptr,word_s nomc);
void din_dot(digit *ptr,word_s nomc);
void set_cur(word_s nompar, word_s flag, word_s nscr);
void image_cont(word_s nompar,word_s nscr);
void set_vso(word_s pos,word_s nscr);
void switch_so(word_s curs,word_s nscr);
void set_mode(word_s mode,word_s nscr);
void set_so(word_s action,word_s nscr);
void switch_d(word_s ky,word_s nscr);
void inform(word_s help,word_s nscr);
word_s lenbar(analog *ptr, word_s cod);
void varcod(word_s keycod, word_s *pc, word_s nscr);
void varpuls(word_s keycod, word_s *pc);

extern word_s mode_contr(controller *ctr , analog *anal, word_s mod);
extern word_s so_contr(controller *ctr, analog *anal, word_s mod);
extern int so_contr_dir(controller *ctr, analog *anal, word_s key);

void  sav_parm(analog *ptra);
extern word_s algkoef(word_s nscr,char tip,word_s contr,word_s nomsert);
extern word_s regul(word_s nscr);

object * ptr_o[DISPLAY];
word_s info[4] = { 0, 0, 0, 0 };
word_s i_grc[4] = { 0, 0, 0, 0 };           /* текущ. номеp гpуппы в объекте */
gr_cont * p_grc[DISPLAY];

//char mas_v[4][580];                   /* массив хpанения куpсоpа шифpа */
//char mas_s[4][56];                    /* массив хpанения куpсоpа "З" */
//char mas_o[4][56];                    /* массив хpанения куpсоpа "В" */

char *on_n[5]={"OTКР","ПУСК","ВКЛ ","  НОРМА  ","БЛК "};
char *st_n[5]={"СТОП",""    ,""    ,""         ,""    };
char *of_n[5]={"ЗАКР","СТОП","ВЫКЛ","НАРУШЕНИЕ","ДБЛК"};

word_s cur_so[DISPLAY];                        /* пpизн. уст. куpсоpа на З или В */
word_s x_v[DISPLAY], x_s[DISPLAY], x_o[DISPLAY];                 /* кооpдинаты куpсоpов */
word_s i_par[4] = { 0, 0, 0, 0 };           /* текущ. номеp контуpа в гpуппе */
controller *p_c[DISPLAY];
extern word_s i_par_sav[];
analog *p_a[DISPLAY];
digit *p_d[DISPLAY];
word_s key[DISPLAY];
/*-------------------------------------------------------------------*/

word_s   conturs(word_s kc,word_s nscr)
{
 int d;
 stat_grc(i_grc[nscr],nscr);

 while(!endrun)
 {
  key[nscr] = read_wpipe(scr_chn[nscr],0.5*HZ);

  if(key[nscr]==kc) continue;          /* если вызов этой же задачи */
  if(list_func(key[nscr]))
  {           /* если вызов дpугой задачи */
   i_par_sav[nscr] = i_par[nscr];
   return key[nscr];
  }
  if(var_obj(key[nscr],nscr)) stat_grc(0,nscr);

  else if(ptr_o[nscr]->n_gr_c != 0)
  {
//SWITCH
   if(key[nscr]==PgUp) {if(ptr_o[nscr]->n_gr_c > 1) stat_grc(i_grc[nscr] - 1,nscr); goto m1;}
   if(key[nscr]==PgDn) {if(ptr_o[nscr]->n_gr_c > 1) stat_grc(i_grc[nscr] + 1,nscr); goto m1;}
   if(i_par[nscr]== -1) continue;
   if(key[nscr]==Left)
   {
//    if(i_par[nscr]== -1) goto m1;
    do if(--i_par[nscr] < 0)i_par[nscr]=7;
    while(p_grc[nscr]->type_sert[i_par[nscr]]==EMPTY);
    set_cur(i_par[nscr],1,nscr); goto m1;
   }
   if(key[nscr]==Right)
   {
//    if(i_par[nscr]== -1) goto m1;
    do if(++i_par[nscr] > 7)i_par[nscr]=0;
    while(p_grc[nscr]->type_sert[i_par[nscr]]==EMPTY);
    set_cur(i_par[nscr],1,nscr); goto m1;
   }
   if(key[nscr]==K1) {if(p_grc[nscr]->type_sert[0] != EMPTY) set_cur(0, 1,nscr); goto m1;}
   if(key[nscr]==K2) {if(p_grc[nscr]->type_sert[1] != EMPTY) set_cur(1, 1,nscr); goto m1;}
   if(key[nscr]==K3) {if(p_grc[nscr]->type_sert[2] != EMPTY) set_cur(2, 1,nscr); goto m1;}
   if(key[nscr]==K4) {if(p_grc[nscr]->type_sert[3] != EMPTY) set_cur(3, 1,nscr); goto m1;}
   if(key[nscr]==K5) {if(p_grc[nscr]->type_sert[4] != EMPTY) set_cur(4, 1,nscr); goto m1;}
   if(key[nscr]==K6) {if(p_grc[nscr]->type_sert[5] != EMPTY) set_cur(5, 1,nscr); goto m1;}
   if(key[nscr]==K7) {if(p_grc[nscr]->type_sert[6] != EMPTY) set_cur(6, 1,nscr); goto m1;}
   if(key[nscr]==K8) {if(p_grc[nscr]->type_sert[7] != EMPTY) set_cur(7, 1,nscr); goto m1;}
   if(key[nscr]==ON || key[nscr]==OFF || key[nscr]==OP || key[nscr]==STP || key[nscr]==CL)
          {if(p_grc[nscr]->type_sert[i_par[nscr]] == DIGIT /*&& p_d[nscr]->type_par > 1*/)      //!!!!
           switch_d(key[nscr],nscr); goto m1;}
   if(key[nscr]==Tab){ switch_so(Tab,nscr); goto m1;}
   if(key[nscr]==MAN || key[nscr]==AUTO || key[nscr]==CAS)
          {if(p_grc[nscr]->type_sert[i_par[nscr]] == ANALOG) set_mode(key[nscr],nscr);goto m1;}
   if(key[nscr]==MORE || key[nscr]==LESS || key[nscr]==QMORE || key[nscr]==QLESS)
          {if(cur_so[nscr]) set_so(key[nscr],nscr); goto m1;}
#if (REGULAT)
   if(key[nscr]==ENTER)
          {if(p_grc[nscr]->type_sert[i_par[nscr]]==ANALOG &&
              (p_a[nscr]->type_mech==NC || p_a[nscr]->type_mech==NO) &&
//              p_a[nscr]->type_mech && p_a[nscr]->mod_cod &&
              (p_ref+p_a[nscr]->i_reg_ar)->p_ar != NULL)
           {
            next:
            i_par_sav[nscr] = i_par[nscr];
            key[nscr] = regul(nscr); d=0;
            i_par[nscr] = i_par_sav[nscr];
            if(key[nscr]==PgUp) d=-1;
            if(key[nscr]==PgDn) d=1;
            if(d)
            {
             for(;;)
             {
              i_par[nscr]+=d; if(i_par[nscr] > 7)i_par[nscr]=0; if(i_par[nscr] < 0)i_par[nscr]=7;
              if(p_grc[nscr]->type_sert[i_par[nscr]] == ANALOG &&
                (p_c[nscr]->a_ptr[p_grc[nscr]->nomsert[i_par[nscr]]].type_mech==NC ||
                 p_c[nscr]->a_ptr[p_grc[nscr]->nomsert[i_par[nscr]]].type_mech==NO))
              {
               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]];
               goto next;
              }
             }
            }
            if(list_func(key[nscr])) return key[nscr];
            i_par[nscr] = i_par_sav[nscr];
            stat_grc(i_grc[nscr],nscr);
           }
           else
            if((c_ptr+p_grc[nscr]->nomcontr[i_par[nscr]])->typcontr==4&&
               ((p_grc[nscr]->type_sert[i_par[nscr]]==ANALOG&&p_a[nscr]->nomin_var>=0)||
               (p_grc[nscr]->type_sert[i_par[nscr]]==DIGIT&&p_d[nscr]->nom_var)))
            {
             if(t_kbd==0 || t_kbd==3)key[nscr]=algkoef(nscr,p_grc[nscr]->type_sert[i_par[nscr]],p_grc[nscr]->nomcontr[i_par[nscr]],p_grc[nscr]->nomsert[i_par[nscr]]);
             if(list_func(key[nscr])) return key[nscr];
             stat_grc(i_grc[nscr],nscr);
            }
           goto m1;
          }
#endif
   if(key[nscr]==Help) {inform(1,nscr); goto m1;}
   if(key[nscr]==ESC) inform(0,nscr);

m1: if(check_flag(period_fl[nscr])) dinam_grc(nscr);
  }
 }
return 0;
}
/*-------------------------------------------------------------------*/

void stat_grc(word_s nomgr,word_s nscr)
{
  word_s i;
  char first= -1;

  request_resource(ekran, 0*HZ);
  bar_(0, 1, Y_T_SCR+1, X_SCR-1, Y_B_SCR-1);
  release_resource(ekran);
  ptr_o[nscr] = o_ptr+o_curr[nscr];
  if(ptr_o[nscr]->n_gr_c == 0){ eprintf(YELLOW_," Для объекта нет гpупп контуpов");return;}

  eprintf(BLACK_,"");
  change_timer(period_tm[nscr], 3*HZ, 1);
  i_grc[nscr] = nomgr;
  if(i_grc[nscr] < 0) i_grc[nscr] = ptr_o[nscr]->n_gr_c - 1;
  else if(i_grc[nscr] >= ptr_o[nscr]->n_gr_c) i_grc[nscr] = 0;
  p_grc[nscr] = gr_c_p+ *(ptr_o[nscr]->nom_gr_c+i_grc[nscr]);       //ptr_o[nscr]->nom_gr_c[i_grc[nscr]];

  request_resource(ekran, 0*HZ);
  _settextcolor(WHITE_);

  gprintf(NOGR_L,NOGR_C,"%1d(%1d)",i_grc[nscr]+1,ptr_o[nscr]->n_gr_c);
  gprintf(CIPH_GR_L,CIPH_GR_C,"%s",p_grc[nscr]->cipher);
  gprintf(NAME_GR_L,NAME_GR_C,"%s",p_grc[nscr]->name);

  for(i=0; i < 8/*p_grc[nscr]->n_par*/; i++)
  {
   if(p_grc[nscr]->type_sert[i] == EMPTY) continue;
   if(p_grc[nscr]->type_sert[i] == ANALOG)
    stat_analog((c_ptr+p_grc[nscr]->nomcontr[i])->a_ptr+p_grc[nscr]->nomsert[i],i);
   else
    stat_digit((c_ptr+p_grc[nscr]->nomcontr[i])->d_ptr+p_grc[nscr]->nomsert[i],i);
   if(first== -1 || i == i_par[nscr] )first=i;
  }
  i_par[nscr]=first;
  if(i_par[nscr]== -1){release_resource(ekran);return;}
//  if(first== -1){release_resource(ekran);i_par[nscr]= -1;return;}
  set_vso(0,nscr);
//  if(p_grc[nscr]->type_sert[i_par[nscr]]==EMPTY) i_par[nscr] = first;
//  if(i_par[nscr] >= 8/*p_grc[nscr]->n_par*/) i_par[nscr] = first;

  set_cur(i_par[nscr],0,nscr);

  _setcolor(WHITE_BR_);
  line(0,YT_ER,X_SCR,YT_ER);
  line(XL_ER-1,YT_ER,XL_ER-1,YB_ER);

  ykstr(ptr_o[nscr]->n_gr_c,i_grc[nscr]+1);

  release_resource(ekran);

  dinam_grc(nscr);
}
/*-------------------------------------------------------------------*/

void stat_analog(analog *ptr,word_s nomc)
{
  word_s i;
  word_s dc,x0,ym;
  dc=nomc*DC_C;  x0=X1+nomc*DX;

  _settextcolor(GREEN_BR_);
  gprintf(CIPH_CO_L,CIPH_CO_C+dc,"%s",ptr->cipher);
  _settextcolor(WHITE_);
  gprintf(MEG_L,VAL_C-1+dc,"%s",ptr->unit);

  for(i=0; i <= NSEG_S; i++)
  {
   gprintf(SC_L-i*DM_S,SC_C+dc,"%3d",i*V_SEG);
   _setcolor(WHITE_);
   ym=Y0-i*DM_S*H_CH;
   line(x0,ym,x0+3,ym);
  }
  gprintf(SC_L- --i*DM_S,SC_C+dc+3,"%c",'%');
  _setcolor(WHITE_);
  line(x0,Y0,x0,Y0-LSC);

  if(ptr->type_mech==NC || ptr->type_mech==NO)
  {
   _settextcolor(CYAN_);
   gprintf(OVS_L,OVS_C+dc,"В");
   _settextcolor(GREEN_BR_);

   gprintf(OVS_L,OVS_C+dc+2,"П");
   _settextcolor(GREEN_);
   gprintf(OVS_L,OVS_C+dc+5,"З");

   _setcolor(WHITE_);
   line(x0+DSET,Y0,x0+DSET,Y0-LSC);
   line(x0-DOUT,Y0,x0-DOUT,Y0-LSC);

   _settextcolor(WHITE_);
   if(ptr->type_mech == NC) { gprintf(SC_L,C_C+dc,"З"); gprintf(SCH,C_C+dc,"О"); }
   else                     { gprintf(SC_L,C_C+dc,"О"); gprintf(SCH,C_C+dc,"З"); }
  }

  if(ptr->min_reg) { ym = Y0 - lenbar(ptr,ptr->min_reg); bar_(YELLOW_,x0-7,ym,x0-9,ym+1); }
  if(ptr->max_reg) { ym = Y0 - lenbar(ptr,ptr->max_reg); bar_(YELLOW_,x0-7,ym,x0-9,ym+1); }
  if(ptr->min_al)  { ym = Y0 - lenbar(ptr,ptr->min_al); bar_(RED_,x0-7,ym,x0-9,ym+1); }
  if(ptr->max_al)  { ym = Y0 - lenbar(ptr,ptr->max_al); bar_(RED_,x0-7,ym,x0-9,ym+1); }

  _settextcolor(CYAN_);
  if(ptr->pasive) gprintf(CIPH_CO_L-1,CIPH_CO_C+7+nomc*DC_C,"П");
  else            gprintf(CIPH_CO_L-1,CIPH_CO_C+7+nomc*DC_C,"A");
  if(ptr->type_mech==M_INP)  gprintf(CIPH_CO_L-1,CIPH_CO_C+1+nomc*DC_C,"ВЫХОД");
  if(ptr->type_mech==NO_REG) gprintf(CIPH_CO_L-1,CIPH_CO_C+1+nomc*DC_C,"ВХОД");
//  if(ptr->type_mech==M_INP)                                                      //!!
//  {_settextcolor(CYAN_); gprintf(CIPH_CO_L-1,CIPH_CO_C+1+nomc*DC_C,"Р_ВВОД"); }
}
/*-------------------------------------------------------------------*/

void dinam_grc(word_s nscr)
{
  word_s i;
  controller *tmpPC;

  clear_flag(period_fl[nscr]);
  request_resource(ekran, 0*HZ);
  if(screen!=nscr) set_screen(nscr);

  tmpPC=p_c[nscr];
  for(i=0; i < 8/*p_grc[nscr]->n_par*/; i++)
  {
   if(p_grc[nscr]->type_sert[i] == EMPTY) continue;
   p_c[nscr]=c_ptr+p_grc[nscr]->nomcontr[i];
   if(p_grc[nscr]->type_sert[i] == ANALOG)
    dinam_analog(p_c[nscr]->a_ptr+p_grc[nscr]->nomsert[i],i,nscr);
   else
    dinam_digit(p_c[nscr]->d_ptr+p_grc[nscr]->nomsert[i],i,nscr);
  }

  p_c[nscr]=tmpPC;
  if(screen!=nscr) set_screen(screen);
  release_resource(ekran);
}
/*-------------------------------------------------------------------*/

void dinam_analog(analog *ptr,word_s nomc,word_s nscr)
{
  din_var(ptr,nomc);
  if(ptr->type_mech != M_INP && ptr->type_mech != NO_REG) din_mod(ptr,nomc,nscr); //!!
  if(ptr->type_mech==NC || ptr->type_mech==NO || ptr->type_mech==PULS)
  {
   din_set(ptr,nomc);
   if(ptr->type_mech==PULS) din_pos(ptr,nomc);  else din_out(ptr,nomc);
  }
}
/*-------------------------------------------------------------------*/

void din_var(analog *ptr,word_s nomc)
{
  word_s x0,ym,color;

  if(ptr->novalid) color=8; else color=GREEN_BR_;
  _settextcolor(color);
  gprintf(VAR_L,VAL_C+nomc*DC_C,formt()/*"%8.2f"*/,ptr->var_tech);
  x0=X1+nomc*DX;
  ym = Y0 - lenbar(ptr,ptr->var_cod);
  bar_(col_a(ptr),x0-1,Y0,x0-5,ym);
  bar_(0,x0-1,ym-1,x0-5,Y0-LSC-1);
}
/*-------------------------------------------------------------------*/

void din_set(analog *ptr,word_s nomc)
{
  word_s x0,ym,color;

  if(ptr->novalid) color=8; else color=GREEN_;
  _settextcolor(color);
  gprintf(SET_L,VAL_C+nomc*DC_C,formt()/*"%8.2f"*/, valtec(ptr,ptr->set_cod));
  x0=X1+nomc*DX;
  ym = Y0 - lenbar(ptr,ptr->set_cod);
  bar_(color,x0+DSET+1,Y0,x0+DSET+4,ym);
  bar_(0,x0+DSET+1,ym-1,x0+DSET+4,Y0-LSC-1);
}
/*-------------------------------------------------------------------*/

void din_out(analog *ptr,word_s nomc)
{
  word_s x0,ym,color,out;

  if(ptr->novalid) color=8; else color=CYAN_;
  _settextcolor(color);
  out =( ptr->out_cod > ADC_SC )?ADC_SC:(ptr->out_cod < 0 )?0:ptr->out_cod;
  gprintf(OUT_L,VAL_C+nomc*DC_C,"%8.2f",100.0*out/ADC_SC);
  x0=X1+nomc*DX;
  ym = Y0 - out * K_BAR0;
  bar_(color,x0-DOUT-1,Y0,x0-DOUT-3,ym);
  bar_(0,x0-DOUT-1,ym-1,x0-DOUT-3,Y0-LSC-1);
}
/*-------------------------------------------------------------------*/

void din_pos(analog *ptr,word_s nomc)
{
  word_s x0,ym,color;

  if(ptr->novalid) color=8; else color=CYAN_;
  _settextcolor(color);
  gprintf(OUT_L,VAL_C+nomc*DC_C,"%8.2f",100.0*ptr->pos_cod/ADC_SC);
  x0=X1+nomc*DX;
  ym = Y0 - ptr->pos_cod * K_BAR0;
  bar_(color,x0-DOUT-1,Y0,x0-DOUT-3,ym);
  bar_(0,x0-DOUT-1,ym-1,x0-DOUT-3,Y0-LSC-1);
}
/*-------------------------------------------------------------------*/

void din_mod(analog *ptr,word_s nomc,word_s nscr)
{
  static char mod[10][6] = { "     ", "РУЧН ", "АВТ  ", "КАСК ", "П-АВТ",
                             "ИСКЛ ", "ИСКЛр", "ИСКЛа", "ИСКЛк", "ИСКЛп" };
  word_s i;

  switch(ptr->mod_cod) {
        case R_MAN  :  i = 1;  break;
        case R_AUTO :  i = 2;  break;

        case R_CAS  :  i = 3;  break;

        case R_PULT :  i = 4;  break;


        default     :  i = 0;
  }
  i=i+ptr->no_uchet*5;
  if(ptr->no_uchet) _settextcolor(YELLOW_);
  else if(ptr->novalid) _settextcolor(8);
  else _settextcolor(GREEN_BR_);
  gprintf(CIPH_CO_L-1,CIPH_CO_C+1+nomc*DC_C,"%c%s",' ',mod[i]);
  if(nomc == i_par[nscr]) switch_so(p_a[nscr]->mod_cod,nscr);
}
/*-------------------------------------------------------------------*/

word_s col_a(analog *ptr)
{
  if(ptr->novalid) return 8;
//  else if(ptr->max_al && ptr->var_cod > ptr->max_al ||
//         ptr->min_al && ptr->var_cod < ptr->min_al) return(RED_);
//  else if(ptr->max_reg && ptr->var_cod > ptr->max_reg ||
//                  ptr->min_reg && ptr->var_cod < ptr->min_reg) return(YELLOW_);
//  else return(GREEN_BR_);
  if(ptr->bound_al) return(RED_);
  else if(ptr->bound_reg) return(YELLOW_);
  else return(GREEN_BR_);
}
/*-------------------------------------------------------------------*/

void stat_digit(digit *ptr,word_s nomc)
{
  _settextcolor(GREEN_BR_);
  gprintf(CIPH_CO_L,CIPH_CO_C+nomc*DC_C,"%s",ptr->cipher);
  _settextcolor(3);
  if(ptr->type_par==1) gprintf(CIPH_CO_L-3,CIPH_CO_C+nomc*DC_C,"Состояние");
  else if(ptr->type_par==0&&ptr->type_com==1) gprintf(CIPH_CO_L-3,CIPH_CO_C+nomc*DC_C+5,"Ком");
  else if(ptr->type_par==0&&ptr->type_com==2) gprintf(CIPH_CO_L-3,CIPH_CO_C+nomc*DC_C,"Сост");
  else gprintf(CIPH_CO_L-3,CIPH_CO_C+nomc*DC_C,"Сост Ком");
  bar_(7,(CIPH_CO_C-1)*W_CH-1+nomc*DX,270,(CIPH_CO_C-1)*W_CH+nomc*DX+9*W_CH,160);

  _settextcolor(CYAN_);
  if(ptr->pasive) gprintf(CIPH_CO_L-1,CIPH_CO_C+7+nomc*DC_C,"П");
  else            gprintf(CIPH_CO_L-1,CIPH_CO_C+7+nomc*DC_C,"A");
  if(ptr->type_par==0 && ptr->type_com ==1)
  {_settextcolor(CYAN_); gprintf(CIPH_CO_L-1,CIPH_CO_C+1+nomc*DC_C,"ВЫХОД"); }
  if(ptr->type_par==0 && ptr->type_com ==2)
  {_settextcolor(CYAN_); gprintf(CIPH_CO_L-1,CIPH_CO_C+1+nomc*DC_C,"ВХОД"); }
}
/*-------------------------------------------------------------------*/

void dinam_digit(digit *ptr,word_s nomc,word_s nscr)
{
  switch(ptr->type_par) {
        case 0 : din_dt_st(ptr,nomc,nscr); break;
        case 1 : din_dt1(ptr,nomc); break;
        case 2 : din_dt2(ptr,nomc); break;
        case 3 : din_dt3(ptr,nomc); break;
        case 4 : din_dt4(ptr,nomc); break;
        case 5 : din_dt5(ptr,nomc); break;
  }
}
/*-------------------------------------------------------------------*/
void din_dt_st(digit *ptr,word_s nomc,word_s nscr)
{
  word_s color,x,tip=0;
  alg_str *algb;
  digit *ptrd1;

  if(ptr->type_com)
  {
   if(ptr->nom_var == -1) return;
   if(ptr->type_com==1)      x=CIPH_CO_C+nomc*DC_C+5;
   else if(ptr->type_com==2) x=CIPH_CO_C+nomc*DC_C;
   else return;

   if(ptr->val_par)
   {
      if(ptr->novalid ) color=1;
      else if(ptr->signal != 2) color=GREEN_; else color=RED_;
   }
   else color=8;
   _settextcolor(color); gprintf(CIPH_CO_L-11,x,"<1>");
   if(!ptr->val_par)
   {
      if(ptr->novalid) color=1;
      else if(ptr->signal != 1) color=GREEN_; else color=RED_;
   }
   else color=8;
   _settextcolor(color); gprintf(CIPH_CO_L-7,x,"<0>");
  }
  else if(p_c[nscr]->typcontr==VIRT&&ptr->nom_var>0)
  {
   algb=p_alg1+ptr->nom_var-1;
   if((formuls1+algb->form)->tip==1)
   {
    tip=floor(algb->koef[3]);
    if(tip<0&&tip>4) tip=0;

    if(algb->inp[0].tip==DIGIT)
     if(algb->inp[2].tip==DIGIT)
     {ptrd1=(c_ptr+algb->inp[0].nc)->d_ptr+algb->inp[0].nz;
      if(ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=GREEN_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C+5,on_n[tip]);
      ptrd1=(c_ptr+algb->inp[2].nc)->d_ptr+algb->inp[2].nz;
      if(ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=RED_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C+5,of_n[tip]);
     }
     else
     {
//      if(algb->inp[1].tip==DIGIT)
//       ((c_ptr+algb->inp[0].nc)->d_ptr+algb->inp[0].nz)->val_par=((c_ptr+algb->inp[1].nc)->d_ptr+algb->inp[1].nz)->val_par;
      ptrd1=(c_ptr+algb->inp[0].nc)->d_ptr+algb->inp[0].nz;
      if(ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=GREEN_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C+5,on_n[tip]);
      if(!ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=RED_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C+5,of_n[tip]);
     }
    if(algb->inp[4].tip==DIGIT)
    {ptrd1=(c_ptr+algb->inp[4].nc)->d_ptr+algb->inp[4].nz;
     if(ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=RED_; }
     else color=8;
     _settextcolor(color); gprintf(CIPH_CO_L-9,CIPH_CO_C+nomc*DC_C+5,st_n[tip]);
    }
    if(algb->inp[1].tip==DIGIT)
     if(algb->inp[3].tip==DIGIT)
     {ptrd1=(c_ptr+algb->inp[1].nc)->d_ptr+algb->inp[1].nz;
      if(ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=GREEN_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C,on_n[tip]);
      ptrd1=(c_ptr+algb->inp[3].nc)->d_ptr+algb->inp[3].nz;
      if(ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=RED_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C,of_n[tip]);
     }
     else
     {ptrd1=(c_ptr+algb->inp[1].nc)->d_ptr+algb->inp[1].nz;
      if(ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=GREEN_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C,on_n[tip]);
      if(!ptrd1->val_par) { if(ptrd1->novalid) color=1; else color=RED_; }
      else color=8;
      _settextcolor(color); gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C,of_n[tip]);
     }
    if(algb->inp[6].tip==DIGIT)
    {
      ptrd1=(c_ptr+algb->inp[6].nc)->d_ptr+algb->inp[6].nz;
      _settextcolor(3);
      if(ptrd1->val_par) gprintf(CIPH_CO_L-3,CIPH_CO_C+nomc*DC_C,"  Блок  ");
      else               gprintf(CIPH_CO_L-3,CIPH_CO_C+nomc*DC_C," Деблок ");
    }
   }
  }
}
/*-------------------------------------------------------------------*/

void din_dt1(digit *ptr,word_s nomc)
{
  word_s color;

  if(ptr->nom_var != -1) {
    if(!ptr->val_par) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+2+nomc*DC_C,"НОРМА");
    if(ptr->val_par) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C,"НАРУШЕНИЕ");
  }
}
/*-------------------------------------------------------------------*/

void din_dt2(digit *ptr,word_s nomc)
{
  word_s color;

  if(ptr->nom_var != -1) {
    if(ptr->val_par) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C,"БЛК");
    if(!ptr->val_par) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C,"ДБЛК");
  }

  if(ptr->nom_dout != -1) {
    if(ptr->val_out) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+5+nomc*DC_C,"БЛК");
    if(!ptr->val_out) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+5+nomc*DC_C,"ДБЛК");
  }
}
/*-------------------------------------------------------------------*/

void din_dt3(digit *ptr,word_s nomc)
{
  word_s color;

  if(ptr->nom_var != -1) {
    if(ptr->val_par) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C,"ВКЛ");
    if(!ptr->val_par) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C,"ВЫКЛ");
  }

  if(ptr->nom_dout != -1) {
    if(ptr->val_out) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+5+nomc*DC_C,"ВКЛ");
    if(!ptr->val_out) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+5+nomc*DC_C,"ВЫКЛ");
  }
}
/*-------------------------------------------------------------------*/

void din_dt4(digit *ptr,word_s nomc)
{
  word_s color;

  if(ptr->nom_var != -1) {
    if(ptr->val_par) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C,"ВКЛ");

    if(!ptr->val_par) {
      if(ptr->novalid) color=1;
#if(PUMP_NORMAL)
      else color=GREEN_;
#else
      else color=RED_;
#endif
    }
    else color=8;

    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C,"ВЫКЛ");
  }

  if(ptr->nom_dout != -1) {
    if(ptr->val_out) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+5+nomc*DC_C,"ПУСК");
  }
  if(ptr->nom_dot2 != -1) {
    if(ptr->val_ot2) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+5+nomc*DC_C,"СТОП");
  }
}
/*-------------------------------------------------------------------*/

void din_dt5(digit *ptr,word_s nomc)
{
  word_s color;
  if(ptr->nom_var != -1) {
    if(ptr->val_par) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+nomc*DC_C,"ОТКР");
  }
  if(ptr->nom_vr2 != -1) {
    if(ptr->val_pr2) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+nomc*DC_C,"ЗАКР");
  }
  /*if(ptr->nom_vr3 != -1) {
    if(ptr->val_pr3) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-5,CIPH_CO_C+nomc*DC_C,"МУФТ");
  } */
  if(ptr->nom_vr4 != -1) {
    if(ptr->novalid) color=1; else color=GREEN_BR_;
    _settextcolor(color);
    if(ptr->val_pr4) gprintf(CIPH_CO_L-1,CIPH_CO_C+nomc*DC_C,"  ДИСТ");
    else             gprintf(CIPH_CO_L-1,CIPH_CO_C+nomc*DC_C,"  МЕСТН");
  }
  if(ptr->nom_dout != -1) {
    if(ptr->val_out) { if(ptr->novalid) color=1; else color=GREEN_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-11,CIPH_CO_C+5+nomc*DC_C,"ОТКР");
  }
  if(ptr->nom_dot2 != -1) {
    if(ptr->val_ot2) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-7,CIPH_CO_C+5+nomc*DC_C,"ЗАКР");
  }
  /*if(ptr->type_com==1)*/
  if(ptr->nom_dot3 !=-1) {
    if(ptr->val_ot3) { if(ptr->novalid) color=1; else color=RED_; }
    else color=8;
    _settextcolor(color);
    gprintf(CIPH_CO_L-9,CIPH_CO_C+5+nomc*DC_C,"СТОП");
  }
}
/*-------------------------------------------------------------------*/

void set_cur(word_s nompar, word_s flag, word_s nscr)
{
  if(flag)
  {
   _setcolor(BLACK_);
   _rectangle(_GBORDER,x_v[nscr]-1,y_v+H_CH-2,x_v[nscr]+9*W_CH+2,(MEG_L-1)*H_CH-2);
   line(x_v[nscr],y_v,x_v[nscr]+73,y_v);
//        _putimage(x_v[nscr], y_v, mas_v[nscr], _GPSET);
   if(cur_so[nscr] == CUR_S)      _rectangle(_GBORDER,x_s[nscr]-1,y_s,x_s[nscr]+W_CH,y_s+H_CH);      //_putimage(x_s[nscr], y_s, mas_s[nscr], _GPSET);
   else if(cur_so[nscr] == CUR_O) _rectangle(_GBORDER,x_o[nscr]-1,y_o,x_o[nscr]+W_CH,y_o+H_CH); //_putimage(x_o[nscr], y_o, mas_o[nscr], _GPSET);
  }

  i_par[nscr] = nompar;
//  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]];
  if(p_grc[nscr]->type_sert[i_par[nscr]]==ANALOG)
   p_a[nscr] = p_c[nscr]->a_ptr+p_grc[nscr]->nomsert[i_par[nscr]];
  else p_a[nscr]=NULL;
  if(p_grc[nscr]->type_sert[i_par[nscr]]==DIGIT)
   p_d[nscr] = p_c[nscr]->d_ptr+p_grc[nscr]->nomsert[i_par[nscr]];
  else p_d[nscr] =NULL;
  image_cont(i_par[nscr],nscr);

  if(p_grc[nscr]->type_sert[i_par[nscr]]==ANALOG&&p_a[nscr]->type_mech) switch_so(p_a[nscr]->mod_cod,nscr);

  if(p_grc[nscr]->type_sert[i_par[nscr]] == ANALOG) eprintf(GREEN_,p_a[nscr]->name);
  else eprintf(GREEN_,p_d[nscr]->name);
  if(info[nscr]) inform(info[nscr],nscr);
}
/*-------------------------------------------------------------------*/

void image_cont(word_s nomc,word_s nscr)
{
  if(p_a[nscr]&&p_a[nscr]->type_mech==M_INP) cur_so[nscr]=M_INP;  //!!
  else cur_so[nscr] = 0;

  x_o[nscr] = (OVS_C-1)*W_CH + nomc*DX;
  x_s[nscr] = x_o[nscr] + 5*W_CH;
  x_v[nscr] = (CIPH_CO_C-1)*W_CH-1 + nomc*DX;
//  _getimage(x_v[nscr], y_v, x_v[nscr]+9*W_CH, y_v+H_CH-2, mas_v[nscr]);
//  _putimage(x_v[nscr], y_v, mas_v[nscr], _GPRESET);
  _setcolor(WHITE_BR_);

  line(x_v[nscr],y_v,x_v[nscr]+73,y_v);
  _rectangle(_GBORDER,x_v[nscr]-1,y_v+H_CH-1,x_v[nscr]+9*W_CH+2,(MEG_L-1)*H_CH-2);
}
/*-------------------------------------------------------------------*/

void set_vso(word_s pos,word_s nscr)
{
        _settextcolor(GREEN_BR_); gprintf(VAR_L,VSO_C+pos*DC_C,"П");
        _settextcolor(GREEN_); gprintf(SET_L,VSO_C+pos*DC_C,"З");
        _settextcolor(CYAN_); gprintf(OUT_L,VSO_C+pos*DC_C,"В");
//        _getimage((VSO_C-1+pos*DC_C)*W_CH,(SET_L-1)*H_CH,
//                          (VSO_C+pos*DC_C)*W_CH-1,SET_L*H_CH-2,mas_s[nscr]);
//        _getimage((VSO_C-1+pos*DC_C)*W_CH,(OUT_L-1)*H_CH,
//                          (VSO_C+pos*DC_C)*W_CH-1,OUT_L*H_CH-2,mas_o[nscr]);
}
/*-------------------------------------------------------------------*/

void switch_so(word_s curs,word_s nscr)
{
 if(curs==R_MAN)
   {if(cur_so[nscr] == CUR_S) {_setcolor(BLACK_); _rectangle(_GBORDER,x_s[nscr]-1,y_s,x_s[nscr]+W_CH,y_s+H_CH);}//_putimage(x_s[nscr], y_s, mas_s[nscr], _GPSET);
    _setcolor(WHITE_BR_); _rectangle(_GBORDER,x_o[nscr]-1,y_o,x_o[nscr]+W_CH,y_o+H_CH);//_putimage(x_o[nscr], y_o, mas_o[nscr], _GPRESET);
    cur_so[nscr] = CUR_O; goto m2;}
 if(curs==R_AUTO)
   {if(cur_so[nscr] == CUR_O) {_setcolor(BLACK_); _rectangle(_GBORDER,x_o[nscr]-1,y_o,x_o[nscr]+W_CH,y_o+H_CH);}//_putimage(x_o[nscr], y_o, mas_o[nscr], _GPSET);
    _setcolor(WHITE_BR_); _rectangle(_GBORDER,x_s[nscr]-1,y_s,x_s[nscr]+W_CH,y_s+H_CH); //_putimage(x_s[nscr], y_s, mas_s[nscr], _GPRESET);
    cur_so[nscr] = CUR_S; goto m2;}
 if(curs==R_CAS)
   {if(cur_so[nscr] == CUR_S) {_setcolor(BLACK_); _rectangle(_GBORDER,x_s[nscr]-1,y_s,x_s[nscr]+W_CH,y_s+H_CH);}//_putimage(x_s[nscr], y_s, mas_s[nscr], _GPSET);
    else if(cur_so[nscr] == CUR_O) {_setcolor(BLACK_); _rectangle(_GBORDER,x_o[nscr]-1,y_o,x_o[nscr]+W_CH,y_o+H_CH);}//_putimage(x_o[nscr], y_o, mas_o[nscr], _GPSET);
    cur_so[nscr] = 0; goto m2;}
 if(curs==Tab) if(cur_so[nscr] == CUR_O)
    {_setcolor(BLACK_); _rectangle(_GBORDER,x_o[nscr]-1,y_o,x_o[nscr]+W_CH,y_o+H_CH); //_putimage(x_o[nscr], y_o, mas_o[nscr], _GPSET);
     _setcolor(WHITE_BR_); _rectangle(_GBORDER,x_s[nscr]-1,y_s,x_s[nscr]+W_CH,y_s+H_CH);//_putimage(x_s[nscr], y_s, mas_s[nscr], _GPRESET);
     cur_so[nscr] = CUR_S; set_so(-1,nscr);
    }
    else if(cur_so[nscr] == CUR_S && p_a[nscr]->mod_cod == R_MAN)
    {_setcolor(BLACK_); _rectangle(_GBORDER,x_s[nscr]-1,y_s,x_s[nscr]+W_CH,y_s+H_CH); // _putimage(x_s[nscr], y_s, mas_s[nscr], _GPSET);
     _setcolor(WHITE_BR_); _rectangle(_GBORDER,x_o[nscr]-1,y_o,x_o[nscr]+W_CH,y_o+H_CH);//_putimage(x_o[nscr], y_o, mas_o[nscr], _GPRESET);
     cur_so[nscr] = CUR_O;
    }
m2: return;
}
/*-------------------------------------------------------------------*/

void set_mode(word_s mode,word_s nscr)
{
 word_s kz=0, r_mode;
 char *cop;

 if(mode==MAN) {cop="РУЧН"; r_mode=R_MAN;  goto m3;}
 if(mode==AUTO){cop=" АВТ"; r_mode=R_AUTO; goto m3;}
 if(mode==CAS) {cop="КАСК"; r_mode=R_CAS;  goto m3;}
 if(mode==COMP){cop="-//-"; r_mode=R_COMP; goto m3;}
 if(mode==PULT){cop="-//-"; r_mode=R_PULT; goto m3;}
 cop="-//-"; r_mode=0;
m3:

 if(!p_a[nscr]->type_mech || !p_a[nscr]->mod_cod || p_a[nscr]->mod_cod == r_mode) return;   //M
 kz=mode_contr(p_c[nscr], p_a[nscr], r_mode);

 if(!kz)
 {
#if (PROTOC)
  arc_op1("%s - Режим  %s",p_a[nscr]->cipher,cop);
#endif
  p_a[nscr]->mod_cod = r_mode;
  p_a[nscr]->mod_din = 1;
  request_resource(ekran,0*HZ);
  din_mod(p_a[nscr],i_par[nscr],nscr);
  release_resource(ekran);
 }
}
/*-------------------------------------------------------------------*/

void set_so(word_s action,word_s nscr)
{
  word_s kz, save, ok_lev;
  float val;
  char *cop, com=0;

  if(action==-1 && p_a[nscr]->set_cod == p_a[nscr]->var_cod) return;

  p_a[nscr]->nolog = 1;
  kz=0;

  if(action==-1)
  {
   save = p_a[nscr]->set_cod;
   p_a[nscr]->set_cod=p_a[nscr]->var_cod;
   din_set(p_a[nscr],i_par[nscr]);
   p_a[nscr]->set_din = 1; com=1;
  }
  else if(p_a[nscr]->type_mech==M_INP)  //Ручной ввод
  {
   save = p_a[nscr]->var_cod;
   while(key[nscr] != -1)
   {
    varcod(key[nscr],&p_a[nscr]->var_cod,nscr);
    p_a[nscr]->var_tech=valtec(p_a[nscr],p_a[nscr]->var_cod);
    din_var(p_a[nscr], i_par[nscr]);
    key[nscr] = read_wpipe(scr_chn[nscr],T_KEY*HZ);
   }
   ok_lev=p_a[nscr]->var_cod;
   p_a[nscr]->var_cod=save;
   kz=SetAnalogVal(p_c[nscr],p_a[nscr],ok_lev);
  }
  else if(cur_so[nscr] == CUR_S)        //Ввод задания
  {
   save = p_a[nscr]->set_cod;
   while(key[nscr] != -1)
   {
    varcod(key[nscr],&p_a[nscr]->set_cod,nscr);
    din_set(p_a[nscr], i_par[nscr]);
    p_a[nscr]->set_din = 1;
    key[nscr] = read_wpipe(scr_chn[nscr],T_KEY*HZ);
   }
   com=1;
  }
  else if(p_a[nscr]->type_mech==PULS) varpuls(key[nscr],&p_a[nscr]->out_cod);
  else                                  //Ввод выхода
  {
   if(!so_contr_dir(p_c[nscr], p_a[nscr], key[nscr]))
   {
    save = p_a[nscr]->out_cod;
    while(key[nscr] != -1)
    {
     varcod(key[nscr],&p_a[nscr]->out_cod,nscr);
     din_out(p_a[nscr], i_par[nscr]);
     p_a[nscr]->out_din = 1;
     key[nscr] = read_wpipe(scr_chn[nscr],T_KEY*HZ);
    }
    com=2;
   }
   else com=0;
  }
  if(com/*p_a[nscr]->type_mech!=M_INP*/) kz=so_contr(p_c[nscr], p_a[nscr], com /*cur_so[nscr]*/);

  if(!kz)
  {
#if (PROTOC)

   if(p_a[nscr]->type_mech != PULS)
   {
    if(cur_so[nscr] == M_INP)
    { sav_parm(p_a[nscr]); cop="РУЧ.ВВОД"; val=p_a[nscr]->var_tech; }
    else if(cur_so[nscr] == CUR_S) { cop="Задание"; val=valtec(p_a[nscr],p_a[nscr]->set_cod); }
    else { cop="Выход"; val=100.0*p_a[nscr]->out_cod/ADC_SC; }
    arc_op1("%s - %s %f",p_a[nscr]->cipher,cop,val);
   }
  }
#endif
  else
  {
   if(action==-1) p_a[nscr]->set_cod = save;
   else if(p_a[nscr]->type_mech==M_INP)
   { p_a[nscr]->var_cod = save; p_a[nscr]->var_tech=valtec(p_a[nscr],p_a[nscr]->var_cod); }
   else if(cur_so[nscr] == M_INP)
   { p_a[nscr]->var_cod = save; p_a[nscr]->var_tech=valtec(p_a[nscr],p_a[nscr]->var_cod); }
   else if(cur_so[nscr] == CUR_S)
   {
    p_a[nscr]->set_cod = save;
    din_set(p_a[nscr],i_par[nscr]);
    p_a[nscr]->set_din = 1;
   }
   else if(p_a[nscr]->type_mech != PULS)
   {
    p_a[nscr]->out_cod = save;
    din_out(p_a[nscr],i_par[nscr]);
    p_a[nscr]->out_din = 1;
   }
  }
  p_a[nscr]->nolog = 0;
}
/*-------------------------------------------------------------------*/

void switch_d(word_s ky,word_s nscr)
{
  word_s kf,tip=0,stat,kz;
  byte ab, *cop;
  alg_str *algb;
  digit *ptrd1;


  switch(p_d[nscr]->type_par)
  {
        case 0:
          cop=NULL;
          if(p_d[nscr]->type_com==1)
          {
           p_d[nscr]->nolog=1;
           if(ky==ON)  if(!SetDigVal(p_c[nscr],p_d[nscr],1)) cop="<1>";
           if(ky==OFF) if(!SetDigVal(p_c[nscr],p_d[nscr],0)) cop="<0>";
           p_d[nscr]->nolog=0;
          }
          else
          if(p_c[nscr]->typcontr==VIRT&&p_d[nscr]->nom_var>0)
          {
           algb=p_alg1+p_d[nscr]->nom_var-1;
           if((formuls1+algb->form)->tip==1)
           {
            if(algb->koef[3]<.5) tip=0;
            else if(algb->koef[3]<1.5) tip=1;
            else if(algb->koef[3]<2.5) tip=2;
            else if(algb->koef[3]<3.5) tip=3;
            else if(algb->koef[3]<4.5) tip=4;
            else tip=0;

            stat=0;
            if(algb->inp[0].tip==DIGIT) stat|=0x01;
            if(algb->inp[2].tip==DIGIT) stat|=0x02;
            if(algb->inp[4].tip==DIGIT) stat|=0x04;

            kz=0;
            if(stat&0x01)
             if(stat&0x02)
             {
//              ptrd1=(c_ptr+algb->inp[0].nc)->d_ptr+algb->inp[0].nz;
              if((tip==0&&ky==OP)||(tip!=0&&ky==ON)) //{ptrd1->val_par=1; cop=on_n[tip];}
              {
               kz=SetDigVal(c_ptr+algb->inp[2].nc,(c_ptr+algb->inp[2].nc)->d_ptr+algb->inp[2].nz,0);
               if(!kz && stat&0x04) kz=SetDigVal(c_ptr+algb->inp[4].nc,(c_ptr+algb->inp[4].nc)->d_ptr+algb->inp[4].nz,0);
               if(!kz) kz=SetDigVal(c_ptr+algb->inp[0].nc,(c_ptr+algb->inp[0].nc)->d_ptr+algb->inp[0].nz,1);
               if(!kz) cop=on_n[tip];
              }
//              ptrd1=(c_ptr+algb->inp[2].nc)->d_ptr+algb->inp[2].nz;
              if((tip==0&&ky==CL)||(tip!=0&&ky==OFF)) //{ptrd1->val_par=1; cop=of_n[tip];}
              {
               kz=SetDigVal(c_ptr+algb->inp[0].nc,(c_ptr+algb->inp[0].nc)->d_ptr+algb->inp[0].nz,0);
               if(!kz && stat&0x04) kz=SetDigVal(c_ptr+algb->inp[4].nc,(c_ptr+algb->inp[4].nc)->d_ptr+algb->inp[4].nz,0);
               if(!kz) kz=SetDigVal(c_ptr+algb->inp[2].nc,(c_ptr+algb->inp[2].nc)->d_ptr+algb->inp[2].nz,1);
               if(!kz) cop=of_n[tip];
              }
             }
             else
             {
              ptrd1=(c_ptr+algb->inp[0].nc)->d_ptr+algb->inp[0].nz;
              if((tip==0&&ky==OP)||(tip!=0&&ky==ON)) //{ptrd1->val_par=1; cop=on_n[tip];}
               if(!SetDigVal(c_ptr+algb->inp[0].nc,ptrd1,1)) cop=on_n[tip];
              if((tip==0&&ky==CL)||(tip!=0&&ky==OFF)) //{ptrd1->val_par=0; cop=of_n[tip];}
               if(!SetDigVal(c_ptr+algb->inp[0].nc,ptrd1,0)) cop=of_n[tip];
             }
            if(algb->inp[4].tip==DIGIT&&tip==0&&ky==STP)
            {
             ptrd1=(c_ptr+algb->inp[4].nc)->d_ptr+algb->inp[4].nz;
//             ptrd1->val_par=1; cop=st_n[tip];
             if(!SetDigVal(c_ptr+algb->inp[4].nc,ptrd1,1)) cop=st_n[tip];
            }
            if(algb->inp[5].tip==DIGIT && ky==STP)
            {
              ptrd1=(c_ptr+algb->inp[5].nc)->d_ptr+algb->inp[5].nz;
              if(!ptrd1->val_par == SetDigVal(c_ptr+algb->inp[5].nc,ptrd1,!ptrd1->val_par) )
                if(ptrd1->val_par) cop="БЛОК"; else cop="ДЕБЛОК";
            }
           }
          }
          p_d[nscr]->nolog=1;
          #if (PROTOC)
          if(cop!=NULL) arc_op1("%s - %s",p_d[nscr]->cipher,cop);
          #endif
          if(cop!=NULL) p_d[nscr]->dif_out=1;
          dinam_digit(p_d[nscr],i_par[nscr],nscr);
          p_d[nscr]->nolog = 0;
          return;
        case 2:                                        /* ДБЛК , ВКЛ  */
        case 3:
          if(ky==STP || ky==OP || ky==CL || p_d[nscr]->nom_dout == -1 ||
             ky==ON && p_d[nscr]->val_out || ky==OFF && !p_d[nscr]->val_out) return;
          if(ky==ON) if(p_d[nscr]->nom_dout) kf=4096;  else kf=-4096;
          else kf=0;                            /* CL */
          p_d[nscr]->nolog=1;
          #if (PROTOC)
          if(p_d[nscr]->type_par==2) if(ky==ON) cop=" БЛК"; else cop="ДБЛК"; /*БЛК,ДБЛК*/
          else                       if(ky==ON) cop=" ВКЛ"; else cop="ВЫКЛ"; /*ВКЛ,ВЫКЛ*/
          arc_op1("%s - %s",p_d[nscr]->cipher,cop);
          #endif
          p_d[nscr]->val_out=!p_d[nscr]->val_out; p_d[nscr]->dif_out=1;
          dinam_digit(p_d[nscr],i_par[nscr],nscr);
          p_d[nscr]->nolog = 0;
          return;
        case 4:                                            /* Насос */
          if(ky==STP || ky==OP || ky==CL || ky==ON && (p_d[nscr]->nom_dout == -1) ||
             ky==OFF && (p_d[nscr]->nom_dot2 == -1))  return;
          p_d[nscr]->nolog=1;
          if(ky==ON)
          {if(p_d[nscr]->nom_dout) kf=4096;  else kf=-4096;
           ab=p_d[nscr]->nom_ab;
          }
          else
          {if(p_d[nscr]->nom_dot2) kf=4096;  else kf=-4096;
           ab=p_d[nscr]->nom_a2;
          }
          #if (PROTOC)
          if(ky==ON) cop="ПУСК"; else cop="СТОП"; /*ПУСК,СТОП*/
          arc_op1("%s - %s",p_d[nscr]->cipher,cop);
          #endif
          p_d[nscr]->val_out=0; p_d[nscr]->dif_out=1;
          p_d[nscr]->val_ot2=0; p_d[nscr]->dif_ot2=1;
          if(ky==ON) p_d[nscr]->val_out=1; else p_d[nscr]->val_ot2=1;
          dinam_digit(p_d[nscr],i_par[nscr],nscr);
          p_d[nscr]->nolog = 0;
          return;
        case 5:                                            /* Задвижка */
          if(ky==ON || ky==OFF || ky==STP && (/*p_d[nscr]->type_com==2 ||*/
             p_d[nscr]->nom_dot3==-1) ||
             ky==OP && (p_d[nscr]->nom_dout==-1) ||
             ky==CL && (p_d[nscr]->nom_dot2==-1))  return;
          p_d[nscr]->nolog=1;
          if(ky==OP)
          {if(p_d[nscr]->nom_dout) kf=4096;  else kf=-4096;
           ab=p_d[nscr]->nom_ab;
          }
          else if(ky==CL)
          {if(p_d[nscr]->nom_dot2) kf=4096;  else kf=-4096;
           ab=p_d[nscr]->nom_a2;
          }
          else                                      /* STP */
          {if(p_d[nscr]->nom_dot3) kf=4096;  else kf=-4096;
           ab=p_d[nscr]->nom_a3;
          }
          #if (PROTOC)
          if(ky==OP) cop="ОТКР"; else if(ky==CL) cop="ЗАКР";  /* ОТКР,ЗАКР */
          else cop="СТОП";                                /* СТОП */
          arc_op1("%s - %s",p_d[nscr]->cipher,cop);
          #endif
          p_d[nscr]->val_out=0; p_d[nscr]->dif_out=1;
          p_d[nscr]->val_ot2=0; p_d[nscr]->dif_ot2=1;
          p_d[nscr]->val_ot3=0; p_d[nscr]->dif_ot3=1;
          if(ky==OP) p_d[nscr]->val_out=1;
          else if(ky==CL) p_d[nscr]->val_ot2=1;
          else p_d[nscr]->val_ot3=1;
          dinam_digit(p_d[nscr],i_par[nscr],nscr);
          p_d[nscr]->nolog = 0;
          return;
  }
}
/*-------------------------------------------------------------------*/

void varcod(word_s keycod, word_s *pc, word_s nscr)
{
  word_s delta;

  if(cur_so[nscr] == M_INP) delta=6; else delta=8;

  if(keycod==MORE) {*pc=*pc+delta; goto m4;}
  if(keycod==QMORE) {*pc=*pc+delta*20; goto m4;}
  if(keycod==LESS) {*pc=*pc-delta; goto m4;}
  if(keycod==QLESS) *pc=*pc-delta*20;

m4:;
  if(cur_so[nscr] != M_INP)
  {
   if(keycod != LESS) *pc+=delta;
   *pc=*pc/K_R110; *pc=*pc*K_R110;
  }
  if(*pc < 0) *pc=0; else if(*pc > ADC_SC) *pc = ADC_SC;
}
/*-------------------------------------------------------------------*/

void varpuls(word_s keycod, word_s *pc)
{
  if(keycod==MORE) {*pc = ADC_SC/4; return;}
  if(keycod==QMORE) {*pc = ADC_SC; return;}
  if(keycod==LESS) {*pc = -ADC_SC/4; return;}
  if(keycod==QLESS) {*pc = -ADC_SC; return;}
}
/*-------------------------------------------------------------------*/


void inform(word_s help,word_s nscr)
{
 extern char typc[][5];


 if(!info[nscr] && !help) return;
 info[nscr] = help;
 request_resource(ekran, 0*HZ);
 bar_(0,0,127,639,140);
 if(info[nscr] == 0) { release_resource(ekran); return; }

 _settextcolor(GREEN_);
 gprintf(HELP_L,2,"%s-#%d",typc[p_c[nscr]->typcontr],p_c[nscr]->nomcontr);

 if(p_grc[nscr]->type_sert[i_par[nscr]] == ANALOG)
 {
  gprintf(HELP_L,14,"Ш%1d=%.1f-%.1f  РГ=%.1f-%.1f  АГ=%.1f-%.1f  ",
  p_a[nscr]->type_sc+1,p_a[nscr]->min_sc,p_a[nscr]->max_sc,
  valtec(p_a[nscr],p_a[nscr]->min_reg)+0.049,valtec(p_a[nscr],p_a[nscr]->max_reg)+0.049,
  valtec(p_a[nscr],p_a[nscr]->min_al)+0.049,valtec(p_a[nscr],p_a[nscr]->max_al)+0.049);
 }
 ext_help_contr(p_grc[nscr]->type_sert[i_par[nscr]],nscr);

 release_resource(ekran);
}
/*-------------------------------------------------------------------*/

word_s lenbar(analog *ptr, word_s cod)
{
  if(ptr->type_sc == SC_SQRT) return (word_s)((float)sqrt((double)cod) * K_BAR1);
  else return  (word_s)((float)cod * K_BAR0);
}
/*-------------------------------------------------------------------*/

char * formt()
{
  static char frmt[6]="%8.2f";

  /*frmt[3]=(6-(char)ceil(log10(fabs(ptr->max_sc)+1.1))) | '0';*/
  /*-frmt[3]=(6-(char)ceil(log10(fabs(ptr->var_tech)+1.1))) | '0';*/

  return frmt;
}
/*-------------------------------------------------------------------*/

char * formtalg(analog *ptr)
{
  static char frmt[6]="%8.2f";

  frmt[3]=(6-(char)ceil(log10(fabs(ptr->max_sc)+1.1))) | '0';
  /*-frmt[3]=(6-(char)ceil(log10(fabs(ptr->var_tech)+1.1))) | '0';*/

  return frmt;
}
/*-------------------------------------------------------------------*/
void  sav_parm(analog *ptra)
{
  word_s h, i, nf, zk;
  par_man *pf, *p_mem;

  if(!model_save) return;

  h=sopen(NameFile[24],O_BINARY|O_RDWR,SH_DENYNO,S_IREAD|S_IWRITE);
  p_mem=pf = (par_man *)calloc(1,filelength(h));
  if(pf==NULL) { eprintf(RED_,"Нет памяти для РУЧ. ВВОДА"); close(h); return; }
  read(h, p_mem, (unsigned)filelength(h));
  nf = filelength(h) / sizeof(par_man);

  for(i=0;  i < nf; i++, pf++)
        if((zk=strncmp(ptra->cipher,pf->cipher,9)) == 0) break;
  if(!zk) pf->var_cod=ptra->var_cod;
  lseek(h,0L,SEEK_SET);
  write(h, p_mem, (unsigned)filelength(h));

  free(p_mem);
  close(h);
}
/*-------------------------------------------------------------------*/