#include "keyboard.h"
#include <io.h>
#include <system.h>
#include <stdio.h>
#include <alt_types.h>

// Function for key entry (keys are based on makecodes and only 0-9,A-F,Backspace,
// and Enter are valid
unsigned char checkKey(unsigned char makecode)
{
    unsigned char result = 0;
    int notDone = 0;
    
    // printf("Make Code %X : /n", makecode);
    
    while (notDone == 0)
    {
        
        makecode = KEYBOARD_READ();
                
        while (makecode == 0xF0)
        {
            notDone = 1;
            makecode = KEYBOARD_READ();
                    
        }
        
    }            
     
    switch(makecode)
    {
    
        // A
        case 0x1C :
            result = 65;
            break;
        // B
        case 0x32 :
            result = 66;
            break;
        // C
        case 0x21 :
            result = 67;
            break;
        // D
        case 0x23 :
            result = 68;
            break;
        // E
        case 0x24 :
            result = 69;
            break;
        // F
        case 0x2B :
            result = 70;
            break;
        // 0
        case 0x45 :
            result = 48;
            break;
        // 1
        case 0x16 :
            result = 49;
            break;
        // 2
        case 0x1E :
            result = 50;
            break;
        // 3
        case 0x26 :
            result = 51;
            break;
        // 4
        case 0x25 :
            result = 52;
            break;
        // 5
        case 0x2E :
            result = 53;
            break;
        // 6
        case 0x36 :
            result = 54;
            break;
        // 7
        case 0x3D :
            result = 55;
            break;
        // 8
        case 0x3E :
            result = 56;
            break;
        // 9
        case 0x46 :
            result = 57;
            break;
        // Enter
        case 0x5A :
            result = 1;
            break;
        // Backspace
        case 0x66 :
            result = 2;
            break;
                   
            
        default :
            break;
            
    }
        
    return result;
    
}

// Function for writing a character to the key board
void writeToLCD(unsigned char letter, int position)
{

    int x = position;
    int y = 1;
    unsigned char temp[1];
    
    temp[0] = letter;
    
    if (position >= 16)
    {
        x = position - 16;
        y = 2;
    }
    
    
    alt_up_character_lcd_write(temp,1);
    
    if (position == 15)
    {
        alt_up_character_lcd_set_cursor_pos(0,2);
    }
    
}

void backSpace(int position)
{
 
    int x = position;
    int y = 1;
    
    unsigned char temp[1];
    
    temp[0] = 32;
    
    if (position >= 16)
    {
        x = position - 16;
        y = 2;
    }
    
    alt_up_character_lcd_set_cursor_pos(x,y);
    //alt_up_character_lcd_write(temp,1);
    
    
    if (position == 16)
    {
        alt_up_character_lcd_set_cursor_pos(15,1);
    }
    else
    {
        alt_up_character_lcd_set_cursor_pos(x-1,y);
    }
    alt_up_character_lcd_write(temp,1);
    if (position == 16)
    {
        alt_up_character_lcd_set_cursor_pos(15,1);
    }
    else
    {
        alt_up_character_lcd_set_cursor_pos(x-1,y);
    }
    alt_up_character_lcd_set_cursor_pos(x-1,y);
    
    
}

unsigned short *getKey()
{
 
  unsigned char makecode = 0;
  unsigned char letter = 0;
  int q = 0;
  unsigned char aes_key[33];
  unsigned short *hex_key = (unsigned short *) malloc(sizeof(unsigned short));
  
    
  alt_up_character_lcd_init();
  alt_up_character_lcd_set_cursor_pos(0,1);

  
  for( q=0; q<33; q++)
  {
        
        while(!KEYBOARD_READY());
        //letter = translate_make_code();   //Get one byte (character)
        makecode = KEYBOARD_READ();
        
        // printf(" %X \n",makecode);
        
        letter = checkKey(makecode);
        
        // Delay for keyboard
            
        //Check if the letter entered is within bounds (0-9,a-f) or if it is BCKSPACE or ENTER
        if( letter >= 48 && letter <= 57 && q < 32)
        {
             //printf("%c %d\n",letter, q);
             aes_key[q] = letter;
             writeToLCD(letter,q);
             
             hex_key[q] = letter - 48;
        }
        else if( letter >= 65 && letter <= 70 && q < 32)     // A-F letter
        {
             //printf("%c %d\n",letter, q);
             aes_key[q] = letter;
             writeToLCD(letter,q);
             
             hex_key[q] = letter - 55;
        }
        // If Backspace go back a character
        else if( letter == 2 && q > 0)
        {
             //printf("Backspace\n");
             backSpace(q);
             q=q-2;
        }
        // If Enter and last character return string
        else if( letter == 1 && q == 32)
        {
             //printf("Enter\n");
             aes_key[q] = 0;
        }
        else        //It's neither!
             q--;
        
  }
  
  alt_up_character_lcd_init();
  alt_up_character_lcd_set_cursor_pos(0,1);
  alt_up_character_lcd_write("Key Entered.",12);
  alt_up_character_lcd_set_cursor_pos(0,2);
  alt_up_character_lcd_write("Processing...",13);
  alt_up_character_lcd_set_cursor_pos(13,2);
  
  printf("\nDECRYPTION KEY ENTERED - %s",aes_key);
  printf("\nThank you. Beginning decryption.");  
  
  return hex_key;  
  
}