/*          § ¤ ç  ®¯p®á  ˜711           */
#include  "complex.h"
#include  "screen.h"

resourceptr rest711;            /* 㪠§ â¥«ì ­  p¥áãpá ¢®ááâ ­®¢«¥­¨ï ˜711 */

typedef struct            /* áâpãªâãp  ®¡p §  ˜711 */
  {
     float    parm[60];                       /* ¬ áᨢ §­ ç¥­¨© ¯ p ¬. */

  } imS711;

word_s scanS711(controller *ptr_c,byte *masask,word_s lask,byte *answ,word_s *mlansw);

extern void v24_sendask(sioptr port,byte *masask,word_s lask);
extern void init_Serial(int tip_C, char len_b, char len_can);
byte askp[] = "\x03tmr";

extern word_s endrun;
char no_mem_tasks711[] = "TASKS711.C - Œ «® ¯ ¬ïâ¨";
/*-------------------------------------------------------------------*/

void taskS711(controller *ptr_c)
{
  word_s kz, begin, i, j, k, val;
  word_s lans;
  analog *ptr_a;
  byte bufff[10];
  byte *answ;
  imS711 *S;
  float sqrt_val;

  answ = (byte *)calloc(1,900);
  S = (imS711 *)calloc(1,sizeof(imS711));
  if(answ == NULL || S == NULL) {
    eprintf(RED_,no_mem_tasks711);
    return;
  }

  begin = 1;
/*------------           –¨ª«  ®¯p®á        --------------------*/

  while(!endrun) {

    wait_flag_set(ptr_c->flag, 0L);
    clear_flag(ptr_c->flag);

    for(i=0; i<60; i++) S->parm[i] = 100010.0;
    for(i=0; i < 900; i++) answ[i]=0x00;
    lans=849;

    request_resource(ptr_c->port_rsc,0L);     /* § å¢ â ¯®pâ -p¥áãàá  */
    kz = scanS711(ptr_c,askp,strlen(askp),answ,&lans);
    release_resource(ptr_c->port_rsc);       /* ®á¢®¡.¯®pâ -p¥áãpá  */

    if(!kz) {
      for(i=1; ; i++) {
        while(answ[i] != 0x1b && i+10 < lans) i++;
        if(answ[i] != 0x1b || i+10 >= lans) break;

        if(answ[i+1] != 0x59) continue;
        if(answ[i+2] < 0x20 || answ[i+2] > 0x2e) continue;
        if(answ[i+3] != 0x23 && answ[i+3] != 0x37 &&
           answ[i+3] != 0x4b && answ[i+3] != 0x5f) continue;

        k=answ[i+2]-32+(answ[i+3]-35)/20*15;

        if(k < 0 || k > 59) continue;
        if(answ[i+4] != '+' && answ[i+4] != '-') continue;
        if(answ[i+5] < '0' || answ[i+5] > '9') continue;
        if(answ[i+10] != ' ' && (answ[i+10] < '0' || answ[i+10] > '9')) continue;

        val=0;
        for(j=i+6; j <= i+9; j++) {
          if(answ[j] == '.') val++;
          else if(answ[j] < '0' || answ[j] > '9') val+=2;
        }
        if(val > 1) continue;

        memcpy(bufff,answ+i+4,7); bufff[7]=0;
        S->parm[k] = (float)atof(bufff);
      }
    }
/* ---              …‚ˆ—€Ÿ  ށ€Ž’Š€  ˆ”ސŒ€–ˆˆ             ----*/

    for(i=0, ptr_a=ptr_c->a_ptr; i < ptr_c->num_ap; i++, ptr_a++) {
      if(ptr_a->mod_cod==M_INP) continue;
      if(ptr_a->nolog) continue;    /* ¥á«¨ «®£¨ç. § ¯p¥â ®¡p ¡. */

      if(kz || ptr_a->nomin_var>59 || S->parm[ptr_a->nomin_var] > 100000.0)
        { ptr_a->novalid=1;  continue; }

      ptr_a->novalid = 0;                         /* ¤®á⮢¥p­®áâì ¥áâì */

      if(ptr_a->type_sc == SC_SQRT) {
        if(S->parm[ptr_a->nomin_var] < 0.0 ||
          (ptr_a->max_sc-ptr_a->min_sc) < 0.0 ||
           !ptr_a->k_scale) { ptr_a->novalid = 1; continue; }
        sqrt_val=(float)sqrt((double)
          (S->parm[ptr_a->nomin_var])*(double)(ptr_a->max_sc-ptr_a->min_sc));
        val=pow((sqrt_val-ptr_a->min_sc)/ptr_a->k_scale,2);
      }
      else {
        if(S->parm[ptr_a->nomin_var] > ptr_a->max_sc)
          { val=ADC_SC; ptr_a->novalid = 1; }
        else if(S->parm[ptr_a->nomin_var] < ptr_a->min_sc)
          { val=0; ptr_a->novalid = 1; }
        else val=(float)ADC_SC*(S->parm[ptr_a->nomin_var]-ptr_a->min_sc)/
                                            (ptr_a->max_sc-ptr_a->min_sc);
      }

      if(val < 0) val=0; else if(val > ADC_SC) val=ADC_SC;

      if(abs(ptr_a->var_cod - val) > ADC_SC*0.1) ptr_a->novalid = 1; // !!!

      ptr_a->dif_var = 1;
      ptr_a->var_cod = val;

      if(ptr_a->type_sc == SC_SQRT)  ptr_a->var_tech = sqrt_val;
      else   ptr_a->var_tech = S->parm[ptr_a->nomin_var];

      if(ptr_a->min_reg && val < ptr_a->min_reg) ptr_a->bound_reg = 1;
      else if(ptr_a->max_reg && val > ptr_a->max_reg) ptr_a->bound_reg = 2;
      else ptr_a->bound_reg = 0;
      if(ptr_a->min_al && val < ptr_a->min_al) ptr_a->bound_al = 1;
      else if(ptr_a->max_al && val > ptr_a->max_al) ptr_a->bound_al = 2;
      else ptr_a->bound_al = 0;
/*
      if(ptr_a->var_cod < 20 || ptr_a->var_cod > ADC_SC-20) ptr_a->novalid=1;
*/
    }
    if(!kz) begin = 0;
  }
}
/*-----------------------------------------------------------------*/

word_s scanS711(controller *ptr_c,byte *masask,word_s lask,byte *answ,word_s *mlansw)
{
  word_s i, kz, rept;
  funcptr send;
  fptr receive;

  if(ptr_c->nomport < 0x80) { send = ad8_send;    receive = ad8_receive; }
  else                      { send = v24_sendask; receive = v24_receive; }

  rept=3;
BEGIN:
  if(ptr_c->nomport < 0x80) tsk_outp(ptr_c->basaddr+1,0x14); //®âª.¯à.¯® ¢¢®¤ã
  i=900; while(receive(ptr_c->port,4L) != -1 && i--);
  rept--;
  if(rept==-1) { kz=-1; goto END; }
  i=900; while((kz=receive(ptr_c->port, 40L)) != 0x1b && kz != -1 && i--);
  if(kz != 0x1b) goto BEGIN;
  answ[0]=kz;
  kz=receive(ptr_c->port, 4L);
  if(kz != 0x59) goto BEGIN;
  answ[1]=kz;
  kz=receive(ptr_c->port, 4L);
  if(kz != 0x34) goto BEGIN;
  answ[2]=kz;
  kz=receive(ptr_c->port, 4L);
  if(kz != 0x4b) goto BEGIN;
  answ[3]=kz;
  for(i=4; (kz=receive(ptr_c->port,4L)) != -1 && i<*mlansw; i++) answ[i]=kz;

  if(answ[9] != 0x1b || answ[10] != 0x59) goto BEGIN;
  else { kz = 0; *mlansw=i; }

END:
    if(kz==-1) {
      for(i=0; i<lask; i++) {
        send(ptr_c->port, masask+i, 1);
        t_delay(2L);
      }
      ptr_c->cref++;

#if(RES711)
      if(ptr_c->cref==7 || ptr_c->cref==14 || ptr_c->cref==21) {
        request_resource(rest711,0L);
        tsk_outp(0x2a8, (byte)(1<<((ptr_c->basaddr-0x300)/2)));
        t_delay(2L);
        tsk_outp(0x2a8,0);
        release_resource(rest711);
      }
#endif

    }
    else ptr_c->cref=0;

  ptr_c->kz=kz;
  return kz;
}

//--------------------- ‚ª«î祭¨¨¥ ª®­â஫«¥à  ----------------------
void enable_S711(void)
{
 rest711 = create_resource(NULL,"REST711");
 tsk_outp(0x2a8,0); tsk_nop();

 init_Serial(S711,7,900);
}
//--------------------- ‚몫î祭¨¨¥ ª®­â஫«¥à  ----------------------
void disable_S711(void)
{
  tsk_outp(0x2a8,0);
}
//--------------------------  áè¨à¥­­ ï ¯®¬®éì ¤«ï ª®­â஫«¥à  -----------------------
void ext_help_S711(byte tip,word_s nscr)
{
 gprintf(HELP_L,9,"-K%d",(p_c[nscr]->basaddr & 0x1f)/2+1);
 gprintf(HELP_L,64,"Š ­ « %2d",p_a[nscr]->nomin_var+1);
}
//-------------------------- „®£à㧪   ­ «®£®¢ëå ¯ à ¬¥â஢ -----------------------
void insert_A_S711(analog * a_ptr,char *Basa)
{

}