/*     ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»   
       º    rdmn4	  4/20/05            º   from 4axtst14.c
		 ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼ first interface for time-based
                                        ribbondance  

	rdance4.prj=rdmn4, rdif4, rdfn4, rdance4.h
to add:
repeat path option
accel input
	 											
*/
																									 
#include "rdance4.h"

FILE  *in;
char filename[40];
struct move {float x,y,u,v;};
struct move huge *rammove;

unsigned long  basedrag,drag, drag1,drag2, zz, maxdrag, jdrag;
unsigned long i,imax,loops, l, j, jmax;
long xctr,yctr, segctr;
float slope, intercept, rate, rate1, rate2, mag=1;
float spradx,sprady, spradu,spradv,a, vel;
int pport,dx, dy, du, dv, ex, ey, eu, ev;
int xdir,ydir, accelflag, abortflag, halted;
unsigned char outbyte, dirbits;
char cmd;
 /******************************************************/

main()
{                     	 
  textbackground(BLACK);	textcolor(LIGHTGRAY); clrscr();
#if (DEBUG)

   if((rammove= farcalloc(30,sizeof(struct move))) == NULL) /*5 min. worth*/
	{	printf("Memory allocation failed"); getch();exit(1);	}	
	printf("  RDANCE4  4/20/05   DEBUG mode 	   Remaining RAM= %uK", farcoreleft()>>10);
#else  
   if((rammove= farcalloc(30000,sizeof(struct move))) == NULL) /*5 min. worth*/
	{	printf("Memory allocation failed"); getch();exit(1);	}	
	printf("  RDANCE4 4/20/05      Remaining RAM= %uK", farcoreleft()>>10);
#endif
   
  spradx=SPR_X/6.28319; sprady=SPR_Y/6.28319;
  spradu=SPR_U/6.28319;  spradv=SPR_V/6.28319;

  pport=0x300;
#if (!DEBUG)
  calibrate();
#endif  
  pport=*(unsigned int far *)MK_FP(0x0040,8); /*find printer port address*/
//  printf("\n\n  Printer port detected at address %d ",pport);

  a= 500000; /*accel is faster now!50K old*/
  vel=100000;  basedrag= (1/vel-intercept)/slope; 
  jmax=vel*vel/(2*a*1000); maxdrag= basedrag * sqrt(jmax);
  drag=basedrag; 

  window(1,2,80,25); clrscr();
  do_interface();

  while(1)
  {
   abortflag=0; halted=0;
	status_win();
	textbackground(BLUE);	textcolor(LIGHTGRAY);
	gotoxy(2,2); 	cprintf("Enter command -->");

	cmd=toupper(getch());
	delline(); goto_win(2); gotoxy(2,2); 
	switch(cmd)
	{
		case 'Q': cprintf("Exit? <N>");
					 if(toupper(getch())!='Y') break;
					 else {gotoxy(2,2);
				 	 farfree((struct move far *)rammove);  
					 printf(" Later..."); 
					 window(1,1,80,25);clrscr();exit(1);}

		case 'L': loadrd(); break;

		case 'P': position();break;

		case 'D': goto_win(2); clrscr(); gotoxy(2,2);
                cprintf("Confirm by hitting D again:");
                cmd=toupper(getch());
                if(cmd!='D') break;
                if(imax==0)
                {cprintf("  No dance loaded!"); beep(); delay(2000); break;}
                segctr=0; accelflag=1; xctr=yctr=0;
                clrscr(); gotoxy(20,1); 
                cprintf("DANCING-- space bar to interupt...");
                while(1) 
                { if (abortflag) break;
                  dance();
                }
                break;

		case 'V': clrscr(); cprintf("Enter velocity (steps/sec)");
					 scanf("%f",&vel); defaults_win(); 
                basedrag= (1/vel-intercept)/slope; 
                jmax=vel*vel/(2*a*1000);
                maxdrag= basedrag * sqrt(jmax);
                drag=basedrag;  segctr=jmax; break;       

		case 'M': clrscr();
					 cprintf("Enter magnification factor: ");
					 scanf("%f",&mag);
                vel/=mag;
                basedrag= (1/vel-intercept)/slope; 
                jmax=vel*vel/(2*a*1000);
                maxdrag= basedrag * sqrt(jmax);
                drag=basedrag;  segctr=jmax;    
					 cadfile_win();defaults_win(); break;

//		case 'A': /*accel_entry();*/ defaults_win(); status_win(); break;

		default : beep();  
					 
	}/*end switch*/
  }/*end while   */             
} /*end main()*/

/******************************************************/
void dance()
{
  int oldx, oldy, oldu, oldv, newx, newy, newu, newv, sx, sy, su, sv;

  oldx=mag*spradx*rammove[0].x; oldy=mag*sprady*(rammove[0].y+rammove[0].x);
  oldu=mag*spradu*rammove[0].u; oldv=mag*spradv*(rammove[0].v+rammove[0].u);

  if(abortflag) return;
  
  for(i=1; i<=imax; i++)
   { 
    if(kbhit()) 
    {
      cmd=toupper(getch());
      switch(cmd)
      { case 32:  accelflag=-1; break; /*space bar*/

        case '+': vel+=5000; defaults_win();
                  basedrag= (1/vel-intercept)/slope;
                  jmax=vel*vel/(2*a*1000);
                  maxdrag= basedrag * sqrt(jmax);
                  drag=basedrag;  segctr=jmax; break;

        case '-': vel-=5000; defaults_win();
                  basedrag= (1/vel-intercept)/slope;
                  jmax=vel*vel/(2*a*1000);
                  maxdrag= basedrag * sqrt(jmax);
                  drag=basedrag;  segctr=jmax; break;

        default:  break;
      } // end switch
    }// end if kbhit
    if(accelflag==1)
      if(segctr<jmax) {segctr++; drag=maxdrag*pow(segctr,-0.5);}
      else {accelflag=0; drag=basedrag;}

    else if(accelflag==-1)
      if(segctr>1) {segctr--; drag=maxdrag*pow(segctr,-0.5);}
      else {accelflag=0; do_halt();}

    if(abortflag) return;
                                                               /*diff comp*/
    newx=mag*spradx*rammove[i].x; newy=mag*sprady*(rammove[i].y+rammove[i].x);
    newu=mag*spradu*rammove[i].u; newv=mag*spradv*(rammove[i].v+rammove[i].u);

    sx=newx-oldx; sy=newy-oldy; su=newu-oldu; sv=newv-oldv;

    oldx=newx; oldy=newy; oldu=newu; oldv=newv; 

    move(sx,sy,su,sv);
   }
}

/******************************************************/

void loadrd()
{
   float x,y; /*,u,v*/

	cprintf("\nEnter name of *.RD file to load--> ");
	scanf("%s",&filename);	strcat(filename,".RD");

   if ((in = fopen(filename, "rb"))	 == NULL)
	{	printf("\nCannot open input file.");
		delay(1500); delline(); return ; }
   gotoxy(2,3);
   cprintf("LOADING DATA...");
   i=0;

   while(fscanf(in,"%f %f",&x,&y)!=EOF)   /*just x and y for now*/    
  {
     rammove[i].x=x;rammove[i].y=y; /*rammove[i].u=u;rammove[i].v=v;*/
     i++;
  }

   fclose(in);     
   imax=i-1;    /***needed!****/

 do_interface();
	
}

/******************************************************/

void beep()
{
	sound(880); delay(111);	nosound();
}
/******************************************************/


