#include "keyboard_ctrl.h"
#include "time.h"
#include "vga_update.h"

extern int buf1_e;
extern int buf2_e;

void reset_buffer( int *time, int *keybuffer, int* bufEnd )
  {
   int i; 
   for (i=0; i<=10 ;i++)
    {  keybuffer[i]=0;  time[i]=0; }
   *bufEnd = 0;
  }    
  
void update_buffer( int *time, int *keybuffer, int timeVal, int keyVal, int* bufEnd)
  {
   int i; 
   for (i=0; i<=10 ;i++)
    {  keybuffer[i]=0;  time[i]=0; }
    keybuffer[0]=keyVal;
    time[0]=timeVal;
    *bufEnd = 1;
  } 

  
void comb_judg(int *keybuffer, int *time, int* bufEnd, int* key, int dir )
{
  
   
  if ( time[3] == 0 && time[0] != 0 && time[1] != 0 && time[2] != 0 
                          && time[1]-time[0]<=2 && time[2]-time[1]<=2 && keybuffer[2]>4)   // internal time of 3 keys are short enough
     { 
        if ( ( (keybuffer[0] == 2 && keybuffer[1] == 4 && dir==0) || (keybuffer[0] == 2 && keybuffer[1] == 3 && dir==1) )&& ( keybuffer[2] == 5 || keybuffer[2] == 6 )  ) // determine if it is one of the combinations (DRP)
        
          { 
                 *key = 9;
                DRP_flag=1;
              reset_buffer(time , keybuffer, bufEnd);
              printf( "DRP_flag" );
             // printf("buffer end is %d n",*bufEnd);
          }
         else if ( ((keybuffer[0] == 2 && keybuffer[1] == 3 && dir==0) || (keybuffer[0] == 2 && keybuffer[1] == 4 && dir==1) )
                                               && ( keybuffer[2] == 7 || keybuffer[2] == 8 )) // determine if it is one of the combinations (DLK)
        
          { 
                 *key = 10;
              
              reset_buffer(time , keybuffer, bufEnd);
             printf( "DLK_flag" );
          }
         else   // internal time is short enough while combinations of keys do not match
          {
             
              reset_buffer(time , keybuffer, bufEnd);
             // printf( "Not a comb" ); 
          }
     }    
  else if ( time[4] == 0 && time[0] != 0 && time[1] != 0 && time[2] != 0 && time[3] != 0 
         && time[1]-time[0]<=2 && time[2]-time[1]<=2 && time[3]-time[2]<=2 && keybuffer[3]>4)  // internal time of 4 keys are short enough
        {
            if ( ( ( keybuffer[0] == 4 && keybuffer[1] == 2 && keybuffer[2] == 3 && dir==0) || ( keybuffer[0] == 3 && keybuffer[1] == 2 && keybuffer[2] == 4 && dir==1) )
                                          && ( keybuffer[3] == 7 || keybuffer[3] == 8 ) ) // determine if it is one of the combinations (RDLK)
        
             { 
                 *key = 11;
              
               reset_buffer(time , keybuffer, bufEnd);
               printf( "RDLK_flag" );
             }
            
         else if ( ( ( keybuffer[0] == 3 && keybuffer[1] == 2 && keybuffer[2] == 4 && dir==0 ) || ( keybuffer[0] == 4 && keybuffer[1] == 2 && keybuffer[2] == 3 && dir==1 ) )
                                                && ( keybuffer[3] == 5 || keybuffer[3] == 6 ) ) // determine if it is one of the combinations (LDRP)
        
            { 
                 *key = 12;
               
               reset_buffer(time , keybuffer, bufEnd);
               printf( "LDRP_flag" ); 
            }
          else  // internal time is short enough while combinations of keys do not match
          {
             
              reset_buffer(time , keybuffer, bufEnd);
             // printf("Not a comb" ); 
          }
        }          
  else if ( time[0] != 0 && time[1] != 0 && time[2] != 0 && time[3] != 0 && time[4] != 0
         && time[1]-time[0]<=2 && time[2]-time[1]<=2 && time[3]-time[2]<=2 && time[4]-time[3]<=2 ) // internal time of 5 keys are short enough
       {
            if ( ( (keybuffer[0] == 2 && keybuffer[1] == 4 && keybuffer[2] == 2 && keybuffer[3] == 4 && dir==0) || (keybuffer[0] == 2 && keybuffer[1] == 3 && keybuffer[2] == 2 && keybuffer[3] == 3 && dir==1) )
                              &&( keybuffer[4] == 5 || keybuffer[4] == 6 ) ) // determine if it is one of the combinations (DRDRP)
             { 
                *key = 13;
             
              reset_buffer(time , keybuffer, bufEnd); 
             printf(" DRDRP_flag " ); 
             }
            else  // internal time is short enough while combinations of keys do not match
             {
              
              reset_buffer(time , keybuffer, bufEnd);
            //  printf("Not a comb" ); 
             }
       } 
       
   // cases where  previous internal time is short enouth 
   // while time between last key and current key is too long  
  
 
   else if ( ( time[0] != 0 || keybuffer[0]!=0 ) && time[1] != 0 && time[2] == 0 
                                     && time[1]-time[0]>2 ) 
       {
            if ( keybuffer[0] != 0 && keybuffer[1] != 0 && keybuffer[2] == 0 ) 
             { 
              
              //reset_buffer(time , key); 
              update_buffer(time , keybuffer, time[1], keybuffer[1], bufEnd);
             // printf("Not a comb" ); 
             }
       } 
   else if ( time[3] == 0 && time[0] != 0 && time[1] != 0 && time[2] != 0 
                          && time[1]-time[0]<=2 && time[2]-time[1]>2 ) 
       {
            if ( keybuffer[0] != 0 && keybuffer[1] != 0 && keybuffer[2] != 0 && keybuffer[3] == 0) 
             { 
              
              //reset_buffer(time , keybuffer); 
              update_buffer(time , keybuffer, time[2], keybuffer[2], bufEnd);
             //printf("Not a comb" ); 
             }
       }                           

   else if ( time[4] == 0 && time[0] != 0 && time[1] != 0 && time[2] != 0 && time[3] != 0
                          && time[1]-time[0]<=2 && time[2]-time[1]<=2 && time[3]-time[2]>2) 
       {
            if ( keybuffer[0] != 0 && keybuffer[1] != 0 && keybuffer[2] != 0 && keybuffer[3] != 0 && keybuffer[4] == 0) 
             { 
              
              //reset_buffer(time , key); 
              update_buffer(time , keybuffer, time[3], keybuffer[3], bufEnd);
             // printf("Not a comb" ); 
             }
       }   
   else if (time[0] != 0 && time[1] != 0 && time[2] != 0 && time[3] != 0 && time[4] != 0
                          && time[1]-time[0]<=2 && time[2]-time[1]<=2 && time[3]-time[2]<=2 && time[4]-time[3]>2) 
       {
            if ( keybuffer[0] != 0 && keybuffer[1] != 0 && keybuffer[2] != 0 && keybuffer[3] != 0 && keybuffer[4] != 0 ) 
             { 
              
              //reset_buffer(time , key); 
              update_buffer(time , keybuffer, time[4], keybuffer[4], bufEnd);
             // printf("Not a comb" ); 
             }
       }                          
}


