#include "complex.h"
#include "gr_def.h"
#include "mnemos.h"
#include "screen.h"

statim *STATI;word_s KOLST;
dinami *DINA;word_s KOLDI;
domim  *DOMI;word_s KOLDO;
struct videoconfig vc;

#define DO  (DOMI+N_DO[nscr])->
#define ST   (STATI+N_S)->
#define DI   (DINA +N_D[nscr])->
#define BL   (o_ptr +N_B[nscr])->
#define KOLBL o_num
#define LPT2 1

word_s i_par_sav[DISPLAY], N_B[DISPLAY],FLU,PR_UPR[DISPLAY],T_N_K_,N_Z_K_,NOM_MN[DISPLAY],PERV[4]={0,0,0,0};
//void *O_UPRAV[DISPLAY];

extern word_s MaxColors;               /* The maximum # of colors available    */
extern word_s kolreg[];
extern word_s x_v[],T_DIN[],N_Z_K[],T_N_K[],N_DO[],flag_din[],P_P_Z;
//extern s_alg  *p_alg;

extern word_s tekygol[DISPLAY][16][5];

extern word_s regul(word_s nscr);
extern void stat_digit(digit *ptr,word_s nomc);
extern void switch_d(word_s ky,word_s nscr);
extern void OT_I_DO(word_s N_S,word_s K_S,word_s nscr);
extern void UST_N_UST(void);
extern void bar (short a,short b,short c,short d);
extern void setfillstyle  (word_s pat,word_s col);
extern void setlinestyle (word_s linestyle,word_s thickness);
extern void DINAM(word_s N_D,word_s K_D,word_s nscr);
extern void set_vso(word_s pos,word_s nscr);
extern word_s lock1(void);
extern word_s lock2(void);
extern word_s lock3(void);
extern void clear_fire(word_s nscr);
extern word_s klapan(word_s kodalg,word_s nscr);
extern void dinam_digit(digit *ptr,word_s nomc,word_s nscr);
void upr1(word_s nom,word_s nscr),upr2(word_s nom,word_s nscr);
void SET_KUR(word_s nscr);
//char mas_v1[580];            /* массив хpанения куpсоpа шифpа */
/* ЗАДАЧА ВЫВОДА МНЕМОСХЕМ И УПРАВЛЕНИЯ АНАЛОГ/ДИСКРЕТН ПАРАМЕТРАМИ */

word_s DEKODIR(word_s nscr);
word_s  POISK(word_s nscr);


word_s  mnemos(word_s kc,word_s nscr)
{
//Инициализация переменных требующих инициализации для текущего дисплея
   T_DIN[nscr]= -2;
   N_D[nscr]= 0;
//              -------------
  _getvideoconfig( &vc );
  MaxColors = vc.numcolors;
  setfillstyle(1,11);
  _setcolor(MaxColors-1);
  request_resource(ekran,0L);
  if(nscr!=screen) set_screen(nscr);

  x_v[nscr] = (CIPH_CO_C-1)*W_CH-1 + 7*DX;

  setfillstyle(1,0);//bar(566,324,638,333);

  if(nscr!=screen)set_screen(screen);
  release_resource(ekran);

  i_par_sav[nscr] = i_par[nscr];
  change_timer(period_tm[nscr], 1*HZ, 1);
  N_B[nscr]=o_curr[nscr];
  POISK(nscr);    /* поиск МС по номеРу гР. и номеРу в гР. */

  while(!endrun)
  {
   key[nscr] = read_wpipe(scr_chn[nscr],t_out_v*HZ);
   if(key[nscr]==kc) continue;                /* если вызов этой же задачи */

//   if(list_func(key[nscr]))
//   {                 /* если вызов другой задачи */
//          clear_fire(nscr);
//          i_par[nscr] = i_par_sav[nscr];
//          T_DIN[nscr]=-2;
//          return key[nscr];
//   }

   key[nscr]=DEKODIR(nscr); /* РаскРутка упРавляющего кода  */

   if(var_obj(key[nscr],nscr))
   {  /* если смена объекта */ /*УСТАНОВКА СТАТИКИ */
    clear_fire(nscr);
    N_B[nscr]=o_curr[nscr]; /* в пРиним.коде стаРш.байт- номеР гРуппы,младш.-скан код */
    T_DIN[nscr]=-2;
    POISK(nscr);    /* поиск МС по номеРу гР. и номеРу в гР. */
    clear_flag(period_fl[nscr]);
   }

   if(list_func(key[nscr]))
   {  /* если вызов другой задачи */
    i_par[nscr] = i_par_sav[nscr];
    T_DIN[nscr]=-2;
    return key[nscr];
   }

   if(check_flag(period_fl[nscr]))
   {
    clear_flag(period_fl[nscr]);
    request_resource(ekran,0L);
    if(nscr!=screen)set_screen(nscr);

    REPL(nscr);
    if(FLU!=0) UPRAVA(0,nscr);  /* выдача элемента динамики и упРавления */

    if(nscr!=screen)set_screen(screen);
    release_resource(ekran);
   }
   setfillstyle (1,0);
   setlinestyle(-1,1);
  }
return 0;
}
/*---------------------------------------------------------------------*/
    /* п/п выдачи на экРан элементов динамики и упРавления
    Имя Элемента упРавления выдается с изменяющимся цветом  */
void REPL(word_s nscr)
{
 if (FLU!=0)      /*ЭЛЕМЕНТ ДИНАМИКИ */
 {
  if(PR_UPR[nscr]==1)
  {
   N_D[nscr]=T_DIN[nscr];
   N_Z_K[nscr]= DI NOM_PAR;T_N_K[nscr]= DI N_KO;
  }
  N_D[nscr]=0; T_N_K_=T_N_K[nscr];N_Z_K_=N_Z_K[nscr];
  DINAM( DO N_D, DO K_D,nscr);T_N_K[nscr]=T_N_K_;
  setfillstyle(1,0);
  N_Z_K[nscr]=N_Z_K_;N_D[nscr]=T_DIN[nscr];
 }
}

/* п/п РеагиРования на поступающие упРавляющие коды из диспетчеРа задач
 если поступивший код END завеРшение задачи ина выходе из п/п -1 */
word_s DEKODIR(word_s nscr)
{
 word_s i,d;

 if(key[nscr]==PgUp && BL n_ms > 1)
 {  /* листание по гРуппе-пРедыдущая МС */
  clear_fire(nscr);
  T_DIN[nscr]=-2;NOM_MN[nscr]--;
  POISK(nscr);    /* поиск МС по номеРу гР. и номеРу в гР. */
  return(0);
 }

 if(key[nscr]==PgDn && BL n_ms > 1)
 {  /* листание по гРуппе- следующая МС */
  clear_fire(nscr);
  T_DIN[nscr]=-2;NOM_MN[nscr]++;
  POISK(nscr);    /* поиск МС по номеРу гР. и номеРу в гР. */
  return(0);
 }

if(FLU!=0)
 {
  if(key[nscr]==Up || key[nscr]==Left)
      {request_resource(ekran,0L);
       if(nscr!=screen)set_screen(nscr);
       UPRAVA(-1,nscr);
       if(nscr!=screen)set_screen(screen);
       release_resource(ekran);
       return(0);}
  if(key[nscr]==Right || key[nscr]==Down)
      {request_resource(ekran,0L);
       if(nscr!=screen)set_screen(nscr);
       UPRAVA(1,nscr);
       if(nscr!=screen)set_screen(screen);
       release_resource(ekran);
       return(0);}
  if(key[nscr]==K1){if(kolreg[nscr]>=1)upr1(1,nscr);return(0);}
  if(key[nscr]==K2){if(kolreg[nscr]>=2)upr1(2,nscr);return(0);}
  if(key[nscr]==K3){if(kolreg[nscr]>=3)upr1(3,nscr);return(0);}
  if(key[nscr]==K4){if(kolreg[nscr]>=4)upr1(4,nscr);return(0);}
  if(key[nscr]==K5){if(kolreg[nscr]>=5)upr1(5,nscr);return(0);}
  if(key[nscr]==K6){if(kolreg[nscr]>=6)upr1(6,nscr);return(0);}
  if(key[nscr]==K7){if(kolreg[nscr]>=7)upr1(7,nscr);return(0);}
  if(key[nscr]==K8){if(kolreg[nscr]>=8)upr1(8,nscr);return(0);}
  if(key[nscr]==S1){if(kolreg[nscr]>=9)upr1(9,nscr);return(0);}
  if(key[nscr]==S2){if(kolreg[nscr]>=10)upr1(10,nscr);return(0);}
  if(key[nscr]==S3){if(kolreg[nscr]>=11)upr1(11,nscr);return(0);}
  if(key[nscr]==S4){if(kolreg[nscr]>=12)upr1(12,nscr);return(0);}
  if(key[nscr]==S5){if(kolreg[nscr]>=13)upr1(13,nscr);return(0);}
  if(key[nscr]==S6){if(kolreg[nscr]>=14)upr1(14,nscr);return(0);}
  if(key[nscr]==S7){if(kolreg[nscr]>=15)upr1(15,nscr);return(0);}
  if(key[nscr]==S8){if(kolreg[nscr]>=16)upr1(16,nscr);return(0);}
  if(key[nscr]==ON || key[nscr]==OFF || key[nscr]==OP || key[nscr]==STP || key[nscr]==CL)
      {if(DI PR_UP==1 && PR_UPR[nscr]==1 && DI P_E==1) switch_d(key[nscr],nscr); return(0);}
  if(key[nscr]==MAN || key[nscr]==AUTO || key[nscr]==CAS)
      {if(DI PR_UP==1 && PR_UPR[nscr]==1 && DI P_E!=1) set_mode(key[nscr],nscr); return(0);}
  if(key[nscr]==MORE || key[nscr]==LESS || key[nscr]==QMORE || key[nscr]==QLESS)
      {if(DI PR_UP==1 && PR_UPR[nscr]==1) { if(cur_so[nscr]) set_so(key[nscr],nscr);} return(0);}
  if(key[nscr]==Tab)
      {if(DI PR_UP ==1 && PR_UPR[nscr]==1)
       {
        request_resource(ekran,0L);
        if(nscr!=screen)set_screen(nscr);
        switch_so(Tab,nscr);
        if(nscr!=screen)set_screen(screen);
        release_resource(ekran);
       } return(0);}
  if(key[nscr]==ENTER)
      {
       if(DI P_E==ANALOG && (p_a[nscr]->type_mech==NC || p_a[nscr]->type_mech==NO))
//       if(DI P_E==ANALOG && p_a[nscr]->type_mech && p_a[nscr]->mod_cod)
       {
        next:
        i=o_curr[nscr];
        key[nscr] = regul(nscr); d=0;
        if(key[nscr]==PgUp) d=-1;
        if(key[nscr]==PgDn) d=1;
        if(d)
        {
         do
         {
          T_DIN[nscr]+=d;
          if(T_DIN[nscr]> DO K_D)T_DIN[nscr]= DO N_D; if(T_DIN[nscr]< DO N_D)T_DIN[nscr]= DO K_D;
          N_D[nscr]=T_DIN[nscr];N_Z_K[nscr]= DI NOM_PAR;T_N_K[nscr] = DI N_KO;
          p_c[nscr]=c_ptr + T_N_K[nscr]; p_a[nscr]= AN_UP;
         }
         while(!(DI P_E==ANALOG && (p_a[nscr]->type_mech==NC || p_a[nscr]->type_mech==NO) && DI PR_UP)); goto next;
//         while(!(DI P_E==ANALOG && p_a[nscr]->type_mech && p_a[nscr]->mod_cod && DI PR_UP)); goto next;
        }
        o_curr[nscr]=i;
        if(var_obj(key[nscr],nscr)) {o_curr[nscr]=i; return key[nscr];}
        if(!list_func(key[nscr])) POISK(nscr);
        return key[nscr];
       }
       return(0);
      }
  if(key[nscr]==ENTER_S)
      {
       for(i=0;i<k_alg1;i++)
       {
        if(formuls1[p_alg1[i].form].tip==32 && p_alg1[i].inp[3].tip==ANALOG&&
           p_alg1[i].inp[3].nc==T_N_K[nscr]&&p_alg1[i].inp[3].nz==N_Z_K[nscr])
        {
          key[nscr]=klapan(i,nscr);
          return key[nscr];
        }
       }
      }
 }
 return key[nscr];
}

/**********************************************************************/
void upr1(word_s nom,word_s nscr)
 {word_s i,ii;
  for(i=DO N_D,ii=0;ii<nom;i++) if((DINA+i)->PR_UP==1 && (DINA+i)->PR_SIFR)ii++;

  request_resource(ekran,0L);
  if(nscr!=screen)set_screen(nscr);
  UPRAVA(i-T_DIN[nscr]-1,nscr);
  if(nscr!=screen)set_screen(screen);
  release_resource(ekran);
 }
/**********************************************************************/

/**********************************************************************/
  /* п/п создания на экРане блока упРавления аналоговыми и дискРетными
        паРаметРами ; NOM -номеР элемента динамики в файле-описателе  */

void UPRAVA(word_s NOM,word_s nscr)
{ word_s i;
  static word_s stat,st_time;

 if(PR_UPR[nscr]!=0)
 {if( DO N_D!=-1 && PERV[nscr]!=-1)
   {if(PERV[nscr]==0)
    {PERV[nscr]=1;
     for(i= DO N_D;i <= DO K_D;i++)
     {N_D[nscr]=i;_settextcolor(MaxColors-1);
      if(DI PR_UP==1) /* паpаметp упpавляемый */
      {PERV[nscr]=1;PR_UPR[nscr]=1;

       if(tekygol[nscr][o_curr[nscr]][NOM_MN[nscr]]==-1) T_DIN[nscr]= i;
       else T_DIN[nscr]=tekygol[nscr][o_curr[nscr]][NOM_MN[nscr]];
       tekygol[nscr][o_curr[nscr]][NOM_MN[nscr]]=T_DIN[nscr];

       if(T_DIN[nscr]==-2) T_DIN[nscr]= DO N_D;
       N_D[nscr]=T_DIN[nscr];N_Z_K[nscr]= DI NOM_PAR;
       T_N_K[nscr] = DI N_KO;

       if ( DI PR_SIFR==1 && (DI PR_UP!=1 || !DI P_E))on_of_cursor(DINA +N_D[nscr],AN_UP,1);      //_putimage( DI X_SIFR, DI Y_SIFR-2,mas_v1,XOR_PUT);
       O_UPRAV(DI X_KUR-4, DI Y_KUR-4,stat=1);       //_putimage( DI X_KUR-4, DI Y_KUR-4,O_UPRAV[nscr],XOR_PUT);
       schedule();

       SET_KUR(nscr);
       goto p1;
      }
     }
     PERV[nscr]=-1;PR_UPR[nscr]=0;return;
    }
    if(NOM!=0)
    {st_time=0;
     if ( DI PR_SIFR==1 && (DI PR_UP!=1 || !DI P_E))on_of_cursor(DINA +N_D[nscr],AN_UP,0);  //_putimage( DI X_SIFR, DI Y_SIFR-2,mas_v1,XOR_PUT);
     O_UPRAV(DI X_KUR-4, DI Y_KUR-4,stat=0);     //_putimage( DI X_KUR-4, DI Y_KUR-4,O_UPRAV[nscr],XOR_PUT);
     do
     {T_DIN[nscr]+=NOM;
      if(T_DIN[nscr]> DO K_D)T_DIN[nscr]= DO N_D;
      if(T_DIN[nscr]< DO N_D)T_DIN[nscr]= DO K_D;
      N_D[nscr]=T_DIN[nscr];
     } while( DI PR_UP!=1);
     tekygol[nscr][o_curr[nscr]][NOM_MN[nscr]]=T_DIN[nscr];
     SET_KUR(nscr);
     if( DI PR_SIFR==1 && (DI PR_UP!=1 || !DI P_E))on_of_cursor(DINA +N_D[nscr],AN_UP,1);  // _putimage( DI X_SIFR, DI Y_SIFR-2,mas_v1,XOR_PUT);
     O_UPRAV(DI X_KUR-4, DI Y_KUR-4,stat=1); //_putimage( DI X_KUR-4, DI Y_KUR-4,O_UPRAV[nscr],XOR_PUT);
    }
    else
     if((st_time++)>5) {if(stat) stat=0; else stat=1; O_UPRAV(DI X_KUR-4, DI Y_KUR-4,stat);}
p1:;
    if(DI P_E==0) dinam_analog( AN_UP ,i_par[nscr],nscr);
    else          dinam_digit ( DI_UP ,i_par[nscr],nscr);
   }
 }
}
/********************************************************************/

void SET_KUR(word_s nscr)
{
 N_D[nscr]=T_DIN[nscr];N_Z_K[nscr]= DI NOM_PAR;T_N_K[nscr] = DI N_KO;
 i_par[nscr]=7; _setcolor(0);
 _rectangle(_GFILLINTERIOR,x_v[nscr]+9*W_CH+1,(MEG_L-1)*H_CH-2,x_v[nscr]-1,y_v+H_CH-1);
 cur_so[nscr]=0;
 p_c[nscr]=c_ptr + T_N_K[nscr];

 if(DI P_E==0)
 {
  p_a[nscr]= AN_UP ; p_d[nscr]= NULL;
  set_vso(i_par[nscr],nscr);
  stat_analog( AN_UP ,i_par[nscr]);
  eprintf(GREEN_,p_a[nscr]->name);
 }
 else
 {
  p_d[nscr]= DI_UP; p_a[nscr]= NULL;
  stat_digit ( DI_UP ,i_par[nscr]);
  eprintf(GREEN_,p_d[nscr]->name);
 }

 image_cont(i_par[nscr],nscr);
 flag_din[nscr] = 1;

 if( DI P_E==0 ) dinam_analog( AN_UP ,i_par[nscr],nscr);
 else dinam_digit(DI_UP ,i_par[nscr],nscr);

 flag_din[nscr] = 0;
 if( DI P_E==0 && DI PR_UP==1) switch_so(p_a[nscr]->mod_cod,nscr);
}


/**********************************************************************/
/*  п/п поиска  по номеРу гРуппы N_B[nscr] и ее поРядковому номеРу
  в гРуппе имени МС а затем ее поиск в файле/стРуктуРе-описателе
  на выходе 0-МС существует и найдена иначе 1  */
word_s  POISK(word_s nscr)
{
  N_DO[nscr]=-1; PR_UPR[nscr]=0;
  if( BL n_ms ==0 || N_B[nscr] >= KOLBL )
  { eprintf(YELLOW_,"Блок МС не имеет  ");goto vozv; }
  eprintf(BLACK_,"");

  if( N_B[nscr] >=0 && N_B[nscr] <KOLBL)
  {
   if( NOM_MN[nscr]<0) NOM_MN[nscr]= BL n_ms-1;
   if( NOM_MN[nscr]>=BL n_ms ) NOM_MN[nscr]=0;

   if(*((o_ptr+N_B[nscr])->nom_gr_m+NOM_MN[nscr]) != -1)
   {
    N_DO[nscr] = *((o_ptr+N_B[nscr])->nom_gr_m+NOM_MN[nscr]);   //(o_ptr+N_B[nscr])->nom_gr_m[NOM_MN[nscr]];
    UST_N_UST();

    request_resource(ekran,0L);
    if(nscr!=screen)set_screen(nscr);

    OT_I_DO( DO N_S, DO K_S, nscr);
    ykstr(BL n_ms,NOM_MN[nscr]+1);
    if( DO N_D!=-1)FLU=1;else FLU=0;P_P_Z=0;
    PERV[nscr]=0;N_D[nscr]=T_DIN[nscr]; if(T_DIN[nscr]!=-1) PR_UPR[nscr]=1;
    REPL(nscr);
    if(FLU!=0) UPRAVA(0,nscr);  /* выдача элемента динамики и упРавления */

    if(nscr!=screen)set_screen(screen);
    release_resource(ekran);

    return(0);
   }
  }
  eprintf(RED_," МС  %s HЕТ ", (DOMI+ *((o_ptr+N_B[nscr])->nom_gr_m+NOM_MN[nscr]))->IMJ);  //(DOMI+(o_ptr+N_B[nscr])->nom_gr_m[NOM_MN[nscr]])->IMJ);

  vozv:  _setcolor(0);
  setfillstyle(1,0);
  ramka();
  FLU=0;return (1);
}
/*------------------------------------------------------------------*/
void O_UPRAV(word_s x,word_s y,byte oper)
{
 static int old_color=0;

 if(oper)
 {
  old_color=_getpixel(x+4,y+4);
  if(old_color!=0&&old_color!=15) ch_color(x+4,y+4,15);
  else
  {
   old_color=0;
   _setcolor(WHITE_BR_);
   _rectangle(_GFILLINTERIOR,x,y,x+8,y+8);
   _setcolor(CYAN_);
   _rectangle(_GBORDER,x,y,x+8,y+8);
  }
 }
 else
  if(old_color) ch_color(x+4,y+4,old_color);
  else
  {
   _setcolor(BLACK_);
   _rectangle(_GFILLINTERIOR,x,y,x+8,y+8);
  }
}
//-------------------------------------------------------------------
void on_of_cursor(dinami *obdin,analog *ptr, byte oper)
{
byte color;

 if(oper){_setcolor(WHITE_); color=GREEN_BR_;} else {_setcolor(BLACK_); color=GREEN_;}
 _rectangle(_GFILLINTERIOR,obdin->X_SIFR,obdin->Y_SIFR-2,obdin->X_SIFR+72,obdin->Y_SIFR+7);

 if(ptr->novalid) color=8;
 else
 {if(ptr->bound_al) color=LIGHTRED;
  else if(ptr->bound_reg) color=YELLOW;
 }
 fgtext(color,obdin->X_SIFR+1,obdin->Y_SIFR-2,"%s",ptr->cipher);
}