#include <stdio.h>
#include <math.h>
#include <time.h>
time_t *tt;
FILE *fp,*fp1;
float a_ra,a_dec,a_ep;
int  nsc,nsr;
int  filtx=0;
main(ac,av)
int ac; char *av[];
{
  char a[120],send[60];
  char bf[2000][120];
  int i,j,ij,nj,ii;
  int frames;

  char mon[12][3]={"Jan","Feb","Mar","Apr","May","Jun",
                   "Jul","Aug","Sep","Oct","Nov","Dec"};
  tt=time(0); strcpy(a,asctime(localtime(&tt)));
  for(i=0;i<12;i++)
    if(a[4]==mon[i][0] && a[5]==mon[i][1] && a[6]==mon[i][2])break;
  sscanf(&a[8],"%d",&j);
  sscanf(&a[20],"%d",&ij);
  a_ep=ij+(i*30.25+j)/366.;
  i=a_ep*10+0.5; a_ep=i/10.;

  printf("\n\n\t************** SMT BATCH ***************\n\n");
  if(ac<2){
    printf("\t\tUsage: smtobs batch_file \n\n");
    printf("\t\t if frame by frame < 2 pixels, not move\n\n");
    printf("\t\t\tjiang 2003,11,18\n\n");
    exit(0);
  }
  checkfilexist();
  system("/u/ccdev/jiang/tdbset v1 0");
  system("/u/ccdev/jiang/unix_n3 & ");
  checkiflinkpc();
  //  checkbase();
  fp=fopen(av[1],"r");
  if(fp==0){ printf("batch_file not found!\n"); exit(0); }
    system("/u/ccdev/jiang/tdbset pp 00");  // clear SMT buf;
  nj=0;
l10:
  fgets(a,120,fp); if(feof(fp)!=0)goto l20;
  strcpy(&bf[nj][0],a);
  printf("%2d: %s",++nj,a);
  if(nj==2000){ nj--; printf("Warning: file limited 2000 lines!!!\n"); }
  goto l10;
l20:
  fclose(fp); 
  ij=1;
  if(nj>1) printf("Begin number: ");
  else goto l21;
  gets(a);  fflush(stdin);
  sscanf(a,"%d",&ij); 
l21:
  ij--;
//  for(i=0;i<ij;i++) fgets(a,120,fp1);
  for(i=ij;i<nj;i++){
    strcpy(a,&bf[i][0]);
    if(a[2]==32)continue;                  // do ready
    j=strlen(a);
        while(a[j-2]==32){a[j-2]=a[j-1]; a[j-1]=a[j]; j--; }
    if(nj!=1)printf("%2d: %s",i+1,a);      // show jobs
     fp=fopen("/u/ccdev/status/nowjob.txt","w");
     fprintf(fp,"%s",a);
     fclose(fp); 
    write2log(a);
    setpar(a);                    // set exp,nr,nc,sr,sc,bin,speed,object
    getfiltframe(a,send,&frames); // get filter
    if(send[0]!=32)sendpc(send,1);// filt: wait for answer
    for(j=0;j<frames;j++){        // if j==0, check if dome move
      getradec(a,send,j);         // get ra+dra, dec+ddec
      ii=jrd();
	printf("-----------%d\n",ii);
      if(a[0]=='C')if(ii>100)sendpc(send,j);
      if(a[0]!='C')if(ii>10 )sendpc(send,j);
      exposure(a);                // produce exp.dat; exp; wait wantfile; addfit
    }
    strcpy(&bf[i][0],"v   ");
    strcat(&bf[i][4],a);
    fp1=fopen(av[1],"w");
    for(j=0;j<nj;j++)fprintf(fp1,"%s",&bf[j][0]);
    fclose(fp1);
  }
}

write2log(a)
char a[];
{
  FILE *fp;
  fp=fopen("n0.tmp","w");
  fprintf(fp,"%s\n",a);
  fclose(fp);
  system("cat n0.tmp >> /u/ccdev/smtlib/obs.log");
}

exposure(a)
char *a;
{
  int  ip=0,obsnum,etime;
  char wantfile[30],bb[60];
  FILE *fp0;
  producexpdat(a,&obsnum,&etime);     // produce exp.dat
      
  sprintf(wantfile,"d%d.ccd",obsnum);
  strcpy(bb,"rm /data/"); strcat(bb,wantfile); system(bb); // del revious
  system("/u/ccdev/jiang/fff");
    printf("wantfile: %s\n",wantfile);
  sleep(5+etime);                                // exposure is working
  strcpy(bb,"/data/"); strcat(bb,wantfile);
l10:
  fp0=fopen(bb,"r");
  if(fp0==0){ ip++; sleep(1); goto l10; }
  fclose(fp0);
  printf("-------produced file %s\n",wantfile);
  system("/u/ccdev/jiang/addfit0 &");
}

jrd()                // if v1 != a_ra, a_dec  return !0
{                    // > 3" 
  char s[80],c;
  int i1,i2,j1,j2,j3;
  float x1,ra,dec;
  getvar2("smt","v1",s);
  c=s[30];
  s[22]=s[25]=s[30]=s[33]=s[36]=s[39]=32;
  sscanf(&s[20],"%d %d %f %d %d %d",&i1,&i2,&x1,&j1,&j2,&j3);
  ra=i1+i2/60.+x1/3600.;
  dec=j1+j2/60.+j3/3600.;  
  if(c=='-')dec=-dec;
  x1=cos(dec*3.14196265/180.)*15.;
  ra=(ra-a_ra)*x1*3600.;
  dec=(dec-a_dec)*3600.;
  x1=ra*ra+dec*dec;
  if(x1>900)x1=900;
  i1=x1;
  return i1;
}
  
producexpdat(a,obsnum,etime)
char *a; int *obsnum,*etime;
{
  char ss[80],c;
  FILE *fp0;
  unsigned int i,j;
  fp0=fopen("/u/ccdev/jiang/exp.dat","w");
  getvar2("variables","obsnum",ss);  
  sscanf(ss,"%d",&j); *obsnum=j;
  fprintf(fp0,"%s",ss);                           // obsnum
lfilter:  
  getvar2("smt","v1",ss);
   if(ss[56]=='_' && filtx==0 ){ sleep(1); goto lfilter; }
  ss[60]=0; fprintf(fp0,"%s\n",&ss[50]);          // dome_.filt
  fprintf(fp0,"%c%c%c%c\n",a[0],a[1],a[2],a[3]);  // area
  c=ss[30];
  ss[30]=0; fprintf(fp0,"%s\n",&ss[20]);          // R.A.
  ss[30]=c;
  ss[40]=0; fprintf(fp0,"%s\n",&ss[30]);          // Dec.
  for(i=0;i<strlen(a);i++)if(a[i]==' ')j=i;
  fprintf(fp0,"%s",&a[j+1]);                        // object
  fprintf(fp0,"%d %d",nsc,nsr);                   // sc,sr
  fclose(fp0);
  sscanf(&a[5],"%s%d",ss,&j); *etime=j;
}

sendpc(send,domemv)
char *send; int domemv;
{
  char bb[80],bs[80],bm[80],b0[3],b0save;
  int i,ip=0;
l05:
  write2log(send);
  strcpy(bb,"/u/ccdev/jiang/tdbshow ss");
  fp=popen(bb,"r"); fread(bs,1,80,fp); pclose(fp);
  bs[0]++;     bs[0]&=0x33; bs[2]=0; 
  b0[0]=bs[0]; b0[1]=32;    b0[2]=0;
  strcpy(bb,"/u/ccdev/jiang/tdbset s"); strcat(bb,b0); strcat(bb,send);
  system(bb);
  strcpy(bb,"/u/ccdev/jiang/tdbset ss "); strcat(bb,bs);
  system(bb);

    sleep(1);
    strcpy(bb,"/u/ccdev/jiang/tdbshow pp");
    fp=popen(bb,"r"); fread(bs,1,80,fp); pclose(fp);
    b0save=bs[0];

l10:                                       // wait signal here:
  sleep(2); ip++;
  if(ip>45){
    if(domemv==0){
      strcpy(bb,"/u/ccdev/jiang/tdbshow v1");
      fp=popen(bb,"r"); fread(bs,1,80,fp); pclose(fp);
      sleep(4);
      fp=popen(bb,"r"); fread(bm,1,80,fp); pclose(fp);
      if(bm[52]==bs[52] && bm[53]==bs[53] &&                    // dome "  ??"
         bm[26]==bs[26] && bm[37]==bs[37] ) goto l30;           // ra,dec "::? "
      ip=40;
      goto l10;
    }
    goto l30;
  }
  strcpy(bb,"/u/ccdev/jiang/tdbshow pp");
  fp=popen(bb,"r"); fread(bs,1,80,fp); pclose(fp);

    if(b0save!=bs[0])goto l20;

  if(bs[0]==bs[1])goto l10;
l20:
//  bs[1]++;    should be this line;

    if(bs[0]!=bs[1])bs[1]++;      // sometime lib error, bs[1]++ automatic

  bs[1]&=0x33; bs[2]=0;
  b0[0]=bs[1]; b0[1]=32;    b0[2]=0;
  strcpy(bb,"/u/ccdev/jiang/tdbshow p");  strcat(bb,b0);
  fp=popen(bb,"r"); fread(bm,1,80,fp); pclose(fp);
  for(i=0;i<80;i++)if(bm[i]<32)bm[i]=0;
  if(bs[0]!=bs[1])goto l20;
  strcpy(bb,"/u/ccdev/jiang/tdbset pp "); strcat(bb,bs); 
  system(bb);
  printf("************* %s\n",bm);
  if(bm[14]!='e')return;
l30:
  printf("----------what can I do: quit, wait, re_do, ignore <cr=wait>  ");
//  system("beep &");
  b0[0]=0; ip=0;
  gets(b0); fflush(stdin);
  if(b0[0]==0 || b0[0]=='w')goto l10;
  if(b0[0]=='q')exit(0);
  if(b0[0]=='r')goto l05;
  if(b0[0]=='i')return;
  goto l30;
}

char  filt1[30];
short filt2[30],filt3;
getfiltframe(a,send,frames)
char *a,*send; int *frames;
{
  char t1[5],t2[5],t3[5],ss[80];
  int  i,k;
  sscanf(a,"%s%s%s%d",t1,t2,t3,&i);
  *frames=i;
// check filter name?
  k=0; if(strlen(t2)>1)sscanf(t2,"%d",&k);
  for(i=0;i<filt3;i++)
  if(k==0){ if(t2[0]==filt1[i]){ k=filt2[i]; goto l10; } }
  else if(k==filt2[i])goto l10;
  printf("ERROR: filter not defined in inputfile !!!\n\n");
  exit(0);
l10:
  filtx=0; if(t2[0]==120)filtx=1;
  sprintf(send,"filt_%s\0",t2);
  getvar2("smt","v1",ss);
        ss[60]=0;
  sscanf(&ss[56],"%d",&i);
  if(i==k || t2[0]==120 )send[0]=32;
}

setpar(a)
char *a;
{
  float x;
  int j;
  FILE *fp0;
  char b[30];
  char t1[5],t2[5],t3[5],t4[3],t5[13],t6[13],t7[7],t8[5],t9[5];
  char t10[5],t11[5],t12[2],t13[2],t14[30];
  sscanf(a,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
        t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14);
//  printf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
//      t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14);
  fp0=fopen("/u/ccdev/jiang/fff.dat","w");
  sscanf(t3,"%f",&x); x*=100.; x+=0.5; j=x;
  fprintf(fp0,"%d\n",j);
  j=strlen( t8);  t8[j]=0;  fprintf(fp0,"%s\n",t8);
  j=strlen( t9);  t9[j]=0;  fprintf(fp0,"%s\n",t9);
  j=strlen(t10); t10[j]=0;  fprintf(fp0,"%s\n",t10);  sscanf(t10,"%d",&nsc);
  j=strlen(t11); t11[j]=0;  fprintf(fp0,"%s\n",t11);  sscanf(t11,"%d",&nsr);
  j=0; if(t12[0]!='1')j=2;  fprintf(fp0,"%d\n",j);
  strcpy(b,"Slow"); if(t13[0]=='f')strcpy(b,"Fast");
                    if(t13[0]=='m')strcpy(b,"Medium");
  fprintf(fp0,"%s\n",b);
  j=strlen(t14); t14[j]=0;  fprintf(fp0,"%s\n",t14);
  fclose(fp0);
}

short dx[18]={0,5,-5,-2,3, 1,-4, 6, 4,-1,-6,-8,-9,-7,-3,2,7,8};
short dy[18]={0,0, 0, 4,4,-4,-4,-4,-8,-8,-8,-4, 0, 4, 8,8,4,0};
short dmov=3;
getradec(a,move,j)
char *a,*move; int j;
{
  unsigned int i,k=0;
  char ac[13],dc[13];
  int i1,i2; float x;
  float ra,dec,epoch;
  float ramov,decmov,ra1,dec1;
  for(i=0;i<20;i++){ if(a[i]==' ')k++; if(k==4)break; } 
  sscanf(&a[i],"%s  %s %f",ac,dc,&epoch);
  for(i=0;i<strlen(ac);i++)if(ac[i]==':')ac[i]=32;
  i2=0; x=0.;
  sscanf(ac,"%d%d%f",&i1,&i2,&x);
  ra=i1+i2/60.+x/3600.;
  for(i=0;i<strlen(dc);i++)if(dc[i]==':')dc[i]=32;
  i2=0; x=0.;
  sscanf(dc,"%d%d%f",&i1,&i2,&x);
  if(i1<0)i1=-i1;
  dec=i1+i2/60.+x/3600.;
  if(dc[0]=='-' || dc[1]=='-')dec=-dec;

  i=j%18;
  decmov=dmov/2048.*58./60.;
  ramov=dec; if(ramov>89.9)ramov=89.9;
  ramov=decmov/15./cos(ramov*3.141592654/180.);
  if(a[0]!='C')ra+=dx[i]*ramov;
  if(ra>24.)ra-=24.;
  if(ra< 0.)ra+=24.;
  if(a[0]!='C')dec+=dy[i]*decmov;
  toms1(ra,ac,1);         toms1(dec,dc,0);
  astprs(ra,dec,epoch,&a_ra,&a_dec,a_ep);
  sprintf(move,"move_%s_%s_%6.1f\0",ac,dc,epoch);
}

checkbase()
{
  showvar2("variables","obsnum");
  showvar2("binning","0");       // 0,1,2  (1,2,4)        
  showvar2("nc","0");
  showvar2("nr","0");
  showvar2("object","0");
  showvar2("readspeed","0");     // Fast Medium Slow
  showvar2("sc","0");
  showvar2("sr","0");
  showvar2("flags","windowset"); // 1 after set par
  showvar2("exposure","0");      // 200    (2.0 seccend)
  showvar2("flags","start");     // 1   after all start exp.
}

getvar2(s1,s2,ss)
char *s1,*s2,*ss;
{
  char bin[80];
  int k;
  strcpy(bin,"/u/ccdev/jiang/vdbshow ");
  strcat(bin,s1);   strcat(bin," ");   strcat(bin,s2);
  fp=popen(bin,"r"); k=fread(bin,1,80,fp); pclose(fp);
  bin[k]=0;   strcpy(ss,bin);
}

showvar2(s1,s2)
char *s1,*s2;
{
  char bin[80];
  int k;
  strcpy(bin,"/u/ccdev/jiang/vdbshow ");
  strcat(bin,s1);   strcat(bin," ");   strcat(bin,s2);
  fp=popen(bin,"r"); k=fread(bin,1,80,fp); pclose(fp);
  bin[k]=0;   printf("%s_%s: %s",s1,s2,bin);
}

setvar1(s1,s2)
char *s1,*s2;
{
  char bou[80];
  strcpy(bou,"/u/ccdev/jiang/vdbset ");
  strcat(bou,s1); strcat(bou," "); strcat(bou,s2);
  system(bou);
}

setvar2(s1,s2,s3)
char *s1,*s2,*s3;
{
  char bou[80];
  strcpy(bou,"/u/ccdev/jiang/vdbset ");
  strcat(bou,s1); strcat(bou," "); strcat(bou,s2);
                  strcat(bou," "); strcat(bou,s3);
  system(bou);
}

checkiflinkpc()
{
  int i,k;
  char bin[80];
  for(i=0;i<5;i++){
    strcpy(bin,"/u/ccdev/jiang/tdbshow v1"); 
    fp=popen(bin,"r"); k=fread(bin,1,80,fp); pclose(fp);
    if(k==68){ printf("SMT talk with PC OK !\n"); return; }
    sleep(2);
  }
  printf("\n\tERROR: SMT cannot talk with PC !!!\n\n"); exit(0);
}

checkfilexist()
{
  char f1[60],dummy[60];
  char obsdate[9];
  int i;

  system("ps -ax |grep smt2pc>/u/ccdev/jiang/n4.tmp");
  fp=fopen("/u/ccdev/jiang/n4.tmp","r");
  fgets(dummy,60,fp);
  if(dummy[27]=='w'){ printf("ERROR: please close smt2pc !\n\n"); exit(0); }
  fclose(fp);

  system("/u/ccdev/jiang/getjd");
  fp=fopen("/u/ccdev/jd.tmp","r");
  fscanf(fp,"%s",obsdate);  fclose(fp);

  strcpy(f1,"/u/ccdev/"); strcat(f1,"obs");
  strcat(f1,obsdate);    strcat(f1,".txt");
  fp=fopen(f1,"r");
  if(fp==0){
    printf("\n\tWarnning: %s not existed!\n\n",f1); 
    printf("input observers: ");
    gets(dummy); fflush(stdin);
    fp=fopen(f1,"w");
    fprintf(fp,"%s",dummy);
  } else {
    fgets(dummy,60,fp);
    printf("%s: %s\n\n",f1,dummy);
  }
  fclose(fp);

  fp=fopen("/u/ccdev/RUN_NUMBER","r");
  if(fp==0){ printf("\n\tERROR: cannot found file: RUN_NUMBER\n\n"); exit(0); }
  fclose(fp);

  fp=fopen("/u/ccdev/FILTER","r");
  if(fp==0){ printf("\n\tERROR: cannot found file: FILTER\n\n"); exit(0); }
  i=0;
l10:
  fscanf(fp,"%c %d\n",&filt1[i],&filt2[i]); if(feof(fp)!=0)goto l11;
  i++; if(i<30)goto l10;
l11:
  if(i!=30)filt3=i+1;
  fclose(fp);

  fp=fopen("/u/ccdev/smtlib/obs.log","r");
  if(fp==0) system("date > /u/ccdev/smtlib/obs.log");
  else fclose(fp);
}

toms1(aa,cc,k)
/*
 hour or degree to char_line
 if k=1 (hour case) in **:**:**.*
    k=0 (degree       -**:**:**
*/
char *cc;
float aa;
int k;
{
  int i,j,m,n;
  float a,x;
  a=aa; if(a < 0.)a=-a;
  i=a; x=(a-i)*60.;
  j=x; x=(x-j)*60.;
  m=x;
  if(k!=0){ n=(x-m)*10.+0.5; if(n >= 10) { m++;  n=0; } }
  else if(x-m >0.5) m++;  
  if(m == 60) { j++;  m=0; }
  if(j == 60) { i++;  j=0; }
  if(k ==1)sprintf(cc,"%02d:%02d:%02d.%d\0",i,j,m,n);
  if(k ==0){
    if(aa<0.)sprintf(cc,"-%02d:%02d:%02d\0",i,j,m);
    else sprintf(cc,"%02d:%02d:%02d\0",i,j,m);
  }
}
astprs (ra1, dec1, ep1, ra2, dec2, ep2)
/* alpha in hour, decl.in degree*/
float ra1,dec1,ep1,*ra2,*dec2,ep2;
{
  double epoch1,epoch2,r0[3],r1[3],p[3][3],arc;
  float r2,d2;
  epoch1=ep1; epoch2=ep2;
  arc=45./atan(1.);
  *ra2=ra1; *dec2=dec1;
  if(epoch1 == epoch2)return;
  r2 =ra1*15./arc; d2 =dec1/arc;
  r0[0]=cos(r2)*cos(d2); r0[1]=sin(r2)*cos(d2); r0[2]=sin(d2);
  if(epoch1 != 2000){
   astrox(epoch1, p);
   r1[0] = p[0][0] * r0[0] + p[0][1] * r0[1] + p[0][2] * r0[2];
   r1[1] = p[1][0] * r0[0] + p[1][1] * r0[1] + p[1][2] * r0[2];
   r1[2] = p[2][0] * r0[0] + p[2][1] * r0[1] + p[2][2] * r0[2];
   r0[0] = r1[0]; r0[1] = r1[1]; r0[2] = r1[2];
  }
  if(epoch2 != 2000){
    astrox(epoch2, p);
    r1[0] = p[0][0] * r0[0] + p[1][0] * r0[1] + p[2][0] * r0[2];
    r1[1] = p[0][1] * r0[0] + p[1][1] * r0[1] + p[2][1] * r0[2];
    r1[2] = p[0][2] * r0[0] + p[1][2] * r0[1] + p[2][2] * r0[2];
    r0[0] = r1[0];    r0[1] = r1[1];    r0[2] = r1[2];
  }
  *ra2  = atan2(r0[1], r0[0])/15.*arc;
  *dec2 = asin(r0[2])*arc;
  if(*ra2<0)*ra2+=24;
}

astrox (epoch, p)
double epoch,p[3][3];
{
  double t,a,b,c,ca,cb,cc,sa,sb,sc,arc;
  arc=45./atan(1.);
  astjuy(epoch,&t);
  t = (t - 2451545.0) / 36525.;
  a = t * (0.6406161 + t * (0.0000839 + t * 0.0000050));
  b = t * (0.6406161 + t * (0.0003041 + t * 0.0000051));
  c = t * (0.5567530 - t * (0.0001185 + t * 0.0000116));
  ca = cos (a/arc);
  sa = sin (a/arc);
  cb = cos (b/arc);
  sb = sin (b/arc);
  cc = cos (c/arc);
  sc = sin (c/arc);
  p[0][0] = ca * cb * cc - sa * sb;
  p[1][0] = -sa * cb * cc - ca * sb;
  p[2][0] = -cb * sc;
  p[0][1] = ca * sb * cc + sa * cb;
  p[1][1] = -sa * sb * cc + ca * cb;
  p[2][1] = -sb * sc;
  p[0][2] = ca * sc;
  p[1][2] = -sa * sc;
  p[2][2] = cc;
}

astjuy (epoch,t)
double epoch,*t;
{
  double jd;
  int year,centuy;
  year = epoch - 1;
  centuy = year / 100;
  jd =1721425.5+365.*year-centuy+ year/4 + centuy/4;
  year=epoch;
  *t= jd + (epoch - year) * 365.25;
}
