// Output Pins to Shift Register 74HC595
#define latchOutPin 10 // STCP (pin 12)
#define clockOutPin 12 // SHCP (pin 11)
#define dataOutPin 11 // DS (pin 14)


boolean shiftFlag = false;

char keymapToUse[132];

const char keymap[] = {
  '0',   '1',   '2',   '3',   '4',   '5',   '6',   '7',
  '8',   '9',   '0',  '1',  '1',  '1',  '`',  '1',
  '1',  '1',  '1',  '1',  '2',  'q',  '1',  '2',
  '2',  '2',  'z',  's',  'a',  'w',  '2',  '3',
  '3',  'c',  'x',  'd',  'e',  '4',  '3',  '3',
  '4',  '4',  'v',  'f',  't',  'r',  '5',  '4',
  '4',  'n',  'b',  'h',  'g',  'y',  '6',  '5',
  '5',  '5',  'm',  'j',  'u',  '7',  '8',  '6',
  '6',  ',',  'k',  'i',  'o',  '0',  '9',  '7',
  '7',  '.',  '/',  'l',  ';', 'p',  '-',  '7',
  '8',  '8',  '\'',  '8',  '[',  '=',  '8',  '8',
  '8',  '8',  '9',  ']',  '9',  '\\',  '9',  '9',
  '9',  '\\',  '9',  '9',  '1', '1', '1', '1',
  '1', '1', '1', '4', '7', '1', '1', '1',
  '0', '.', '2', '5', '6', '8', '1', '1',
  '1', '+', '3', '-', '*', '9', '1', '1',
  '1', '1', '1', '1'
};
const char keymapShift[] = {
  '0',   '1',   '2',   '3',   '4',   '5',   '6',   '7',
  '8',   '9',   '0',  '1',  '1',  '1',  '`',  '1',
  '1',  '1',  '1',  '1',  '2',  'q',  '1',  '2',
  '2',  '2',  'z',  's',  'A',  'w',  '2',  '3',
  '3',  'c',  'x',  'd',  'e',  '4',  '3',  '3',
  '4',  '4',  'v',  'f',  't',  'r',  '5',  '4',
  '4',  'n',  'b',  'h',  'g',  'y',  '6',  '5',
  '5',  '5',  'm',  'j',  'u',  '7',  '8',  '6',
  '6',  ',',  'k',  'i',  'o',  '0',  '9',  '7',
  '7',  '.',  '/',  'l',  ';', 'p',  '-',  '7',
  '8',  '8',  '\'',  '8',  '[',  '=',  '8',  '8',
  '8',  '8',  '9',  ']',  '9',  '\\',  '9',  '9',
  '9',  '\\',  '9',  '9',  '1', '1', '1', '1',
  '1', '1', '1', '4', '7', '1', '1', '1',
  '0', '.', '2', '5', '6', '8', '1', '1',
  '1', '+', '3', '-', '*', '9', '1', '1',
  '1', '1', '1', '1'
};


uint8_t lastscan = 0x1C;

void setup() {
  // put your setup code here, to run once:
  // key up F0 {1,0,0,0,0,1,1,1,1};
  // a 1C {1,0,0,1,1,1,0,0,0};
  // special E0 {1,0,0,0,0,0,1,1,1};
  // lshfit {1,0,1,0,0,1,0,0,0};
  int bits[] = {1,0,0,1,1,1,0,0,0};

  Serial.begin(115200);

  // Setup 74HC595 connections
  pinMode(latchOutPin, OUTPUT);
  pinMode(clockOutPin, OUTPUT);
  pinMode(dataOutPin, OUTPUT);
  
  uint16_t scanval = 0;
  for(int i = 0; i<11; i++) {
    scanval |= bits[i] << i;
    
  }

  Serial.print("scanval = ");
  Serial.println(scanval, BIN);

  scanval >>= 1;

  Serial.print("scanval >>= 1 = ");
  Serial.println(scanval, BIN);

  scanval &= 0xFF;

  Serial.print("scanval &= 0xFF = ");
  Serial.println(scanval, BIN);

  Serial.print("scanval HEX = ");
  Serial.println(scanval, HEX);


  if (lastscan != 0xF0 && scanval != 0xF0) {
    if (scanval == 0x12 || scanval == 0x59) {
      shiftFlag = true;
    } else if (scanval == 0xE0) {
    } else {

      if (shiftFlag) {
        memcpy(keymapToUse, keymapShift, sizeof(keymapShift));   
      } else {
        memcpy(keymapToUse, keymap, sizeof(keymap));
      }

      Serial.println(keymapToUse[scanval]);
      sendOutputByte(keymapToUse[scanval]);
    }
  } else if (lastscan == 0xF0 && (scanval == 0x12 || scanval == 0x59)) {
    shiftFlag = false;
  }
  lastscan = scanval;
}

void loop() {
  // put your main code here, to run repeatedly:

}



void sendOutputByte( byte outputByte ) {
  digitalWrite(latchOutPin, LOW);
  shiftOut(dataOutPin, clockOutPin, MSBFIRST, outputByte);
  digitalWrite(latchOutPin, HIGH);
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
bargraph1:A1
bargraph1:A2
bargraph1:A3
bargraph1:A4
bargraph1:A5
bargraph1:A6
bargraph1:A7
bargraph1:A8
bargraph1:A9
bargraph1:A10
bargraph1:C1
bargraph1:C2
bargraph1:C3
bargraph1:C4
bargraph1:C5
bargraph1:C6
bargraph1:C7
bargraph1:C8
bargraph1:C9
bargraph1:C10
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC