#ifndef MAIN_H        /*prevent duplicated includes*/
#define MAIN_H

#include "projectglobals.h"

const char DEL=8;
																											
const char CLEARSCREEN[]={"\f"};
const char LINEFEED[]={"\n"};
const char CARRIAGERETURN[]={"\r"};

const char COLUMN[]={"[60C"};
const char BALL=233;
const char PADDLE1=177;
const char PADDLE2=178;
const char BEL=7;

const signed int TOPLIMIT=1;
const signed int BOTTOMLIMIT=24;//24 
const signed int LEFTLIMIT=1;
const signed int RIGHTLIMIT=79;//79
const signed int PADDLEWIDTH=5;
const signed int MAXmV=4896; 
const signed int PADDLESCALE=MAXmV/(BOTTOMLIMIT-TOPLIMIT-PADDLEWIDTH+1);
const signed int INCREASEX=1;
const signed int INCREASEY=10;
const signed int WAIT_COUNT_DEC=5000;
const signed int WAIT_COUNT_MIN=10000;
const signed int XSCALELIMITRIGHT=30;
const signed int YSCALELIMITBOTTOM=30;
const signed int XSCALELIMITLEFT=-30;
const signed int YSCALELIMITTOP=-30;
const signed int VELOCITYSCALE=10;

signed int PADDLE1Y=BOTTOMLIMIT;						 //holds the height of bottom of paddle 1
signed int PADDLE2Y=BOTTOMLIMIT;						 //holds the height of bottom of paddle 2
signed int BALLPOSITIONY=(BOTTOMLIMIT-TOPLIMIT)/2;//holds X postition of ball
signed int BALLPOSITIONX=(RIGHTLIMIT-LEFTLIMIT)/2;//holds holds channel being looked at
signed int BALLPOSITIONYOLD=(BOTTOMLIMIT-TOPLIMIT)/2;//holds X postition of ball
signed int BALLPOSITIONXOLD=(RIGHTLIMIT-LEFTLIMIT)/2;//holds holds channel being looked at
signed long COUNT=1;						 //holds number of cycles waited
unsigned long WAIT_COUNT=30000;       //number of cycles to wait before updating
unsigned int i=0;
unsigned int j=0;
unsigned int k=0;
unsigned int l=0;

signed int XVELOCITYSCALE=10;
signed int YVELOCITYSCALE=10;
signed int XVELOCITY=1;					   //holds ball velocity in X direction
signed int YVELOCITY=1;					   //holds ball velocity in Y direction



void printball(){  
  (void) printf("%c[%i;%iH",ESC,BALLPOSITIONY,BALLPOSITIONX);		 //returns cursor to home
  BALLPOSITIONXOLD=BALLPOSITIONX;
  BALLPOSITIONYOLD=BALLPOSITIONY;
  (void) printf("%c",BALL);
}

extern atd;
extern int voltA;
extern int voltB;
void paddle(){
  _asm{
    JSR atd
  }
  PADDLE1Y=(voltA/PADDLESCALE)+TOPLIMIT;
  PADDLE2Y=(voltB/PADDLESCALE)+TOPLIMIT;
  
  for(i=0;i<5;i++){
    (void) printf("%c[%i;%iH",ESC,PADDLE1Y+i,LEFTLIMIT);		 //returns cursor to home
    (void) printf("%c",PADDLE1);
  }
  for(j=0;j<5;j++){
    (void) printf("%c[%i;%iH",ESC,PADDLE2Y+j,RIGHTLIMIT);		 //returns cursor to home
    (void) printf("%c",PADDLE2);
  }
}

void display(){						  			 //codes runs the display
  (void) printf("\f");
  (void) printball();
  (void) paddle();
}

void ballpositionUpdate(){
  if(COUNT>=WAIT_COUNT){
   if(YVELOCITYSCALE>YSCALELIMITBOTTOM){
      YVELOCITYSCALE=YSCALELIMITBOTTOM;
   }
   if(YVELOCITYSCALE<YSCALELIMITTOP){
      YVELOCITYSCALE=YSCALELIMITTOP;
   }
   if(XVELOCITYSCALE>XSCALELIMITRIGHT){
      XVELOCITYSCALE=XSCALELIMITRIGHT;
   }
   if(XVELOCITYSCALE<XSCALELIMITLEFT){
      XVELOCITYSCALE=XSCALELIMITLEFT;
   }   
    if(BALLPOSITIONY<=TOPLIMIT||BALLPOSITIONY>=BOTTOMLIMIT){
      if(BALLPOSITIONY<TOPLIMIT){
        BALLPOSITIONY=TOPLIMIT;
      }
      if(BALLPOSITIONY>BOTTOMLIMIT){
        BALLPOSITIONY=BOTTOMLIMIT;
      }
      YVELOCITY=(-1)*YVELOCITY;
      (void) printf("%c",BEL);
    }
    if(BALLPOSITIONX>=RIGHTLIMIT-1||BALLPOSITIONX<=LEFTLIMIT+1){
      if(WAIT_COUNT<=WAIT_COUNT_MIN){
        WAIT_COUNT=WAIT_COUNT_MIN;
      } else {
      WAIT_COUNT-=WAIT_COUNT_DEC;
      }
      if(BALLPOSITIONX>RIGHTLIMIT-1){
        BALLPOSITIONX=RIGHTLIMIT-1;
      }
      if(BALLPOSITIONX<LEFTLIMIT+1){
        BALLPOSITIONX=LEFTLIMIT+1;
      }
      (void) printf("%c",BEL);
      if(BALLPOSITIONX==RIGHTLIMIT-1){
        for(k=0;k<PADDLEWIDTH;k++){
          if(BALLPOSITIONY==PADDLE2Y+k){
            XVELOCITYSCALE+=INCREASEX;
            XVELOCITY=(-1)*(XVELOCITYSCALE)/VELOCITYSCALE;
           // while(1){
           //   printf("%i %i ",YVELOCITY,YVELOCITYSCALE);
           // }
            YVELOCITYSCALE+=INCREASEY*(k-(PADDLEWIDTH-1)/2);
            YVELOCITY=(YVELOCITYSCALE)/VELOCITYSCALE;
            BALLPOSITIONX+=XVELOCITY;
          }
        }
      }
      if(BALLPOSITIONX==LEFTLIMIT+1){
        for(l=0;l<PADDLEWIDTH;l++){
          if(BALLPOSITIONY==PADDLE1Y+l){
            XVELOCITYSCALE+=INCREASEX;
            XVELOCITY=(XVELOCITYSCALE)/VELOCITYSCALE;
            YVELOCITYSCALE+=INCREASEY*(l-(PADDLEWIDTH-1)/2);
            YVELOCITY=(YVELOCITYSCALE)/VELOCITYSCALE;
            BALLPOSITIONX+=XVELOCITY;
          }
        }
      }
    if(BALLPOSITIONX==RIGHTLIMIT-1){
      while(1){
        (void) printf("%c[%i;%iH",ESC,(BOTTOMLIMIT-TOPLIMIT)/2,(RIGHTLIMIT-LEFTLIMIT)/4);		 //returns cursor to home
        (void) printf("Player 1 Wins!");
      }
    }
    if(BALLPOSITIONX==LEFTLIMIT+1){
      while(1){
        (void) printf("%c[%i;%iH",ESC,(BOTTOMLIMIT-TOPLIMIT)/2,(RIGHTLIMIT-LEFTLIMIT)/4);		 //returns cursor to home
        (void) printf("Player 2 Wins!");
      }
    }  
  }
  BALLPOSITIONX+=XVELOCITY;
  BALLPOSITIONY+=YVELOCITY;
  COUNT=1;
  } else { 
    COUNT+=1;
  }
  if(COUNT==1){
    (void) display();
  }
}

extern atd;				//Defines external ATD
extern int voltA;
extern int voltB;
void Voltage(unsigned int *VoltA, unsigned int *VoltB){		//calls ATD channel A if button A is pushed
 _asm
{
 JSR atd;
}
 *VoltA=voltA;
 *VoltB=voltB;
}

#endif /*MAIN_H*/