// Pin assignments
// DS1307 - RTC (wire library)
#define PIN_RTC_SDA	A4
#define PIN_RTC_SCL	A5

// 74HC595 - LED driver
#define PIN_LEDS_DS	8
#define PIN_LEDS_ST	9
#define PIN_LEDS_SH	10

// 74HC165 - Switch driver
#define PIN_BTN_Q7	A0
#define PIN_BTN_CP	13
#define PIN_BTN_PL	12

// LEDS - direct connection
#define PIN_LED_INP	A1
#define PIN_LED_ADR	A2
#define	PIN_LED_MEM	A3
#define PIN_LED_RUN	11

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LEDS_DS, OUTPUT);
  pinMode(PIN_LEDS_ST, OUTPUT);
  pinMode(PIN_LEDS_SH, OUTPUT);
  pinMode(PIN_LED_INP, OUTPUT);
  pinMode(PIN_LED_ADR, OUTPUT);
  pinMode(PIN_LED_MEM, OUTPUT);
  pinMode(PIN_LED_RUN, OUTPUT);
  LEDsOut(0,LOW,LOW,LOW,LOW);

  pinMode(PIN_BTN_PL, OUTPUT);
  pinMode(PIN_BTN_CP, OUTPUT); 
  pinMode(PIN_BTN_Q7, INPUT);
}

void loop() {
  LEDsCycle();
  LEDsCycle();
  LEDsCycle();
  while(1){
    ReadButtons();
    delay(100);
  };
}

void LEDsOut(byte LEDs, bool LEDimp, bool LEDadr, bool LEDmem, bool LEDrun)
{
  digitalWrite(PIN_LEDS_ST, LOW);
  // shift out the bits:
  shiftOut(PIN_LEDS_DS, PIN_LEDS_SH, LSBFIRST, LEDs);  
  //take the latch pin high so the LEDs will light up:
  digitalWrite(PIN_LEDS_ST, HIGH);
  digitalWrite(PIN_LED_INP, LEDimp);
  digitalWrite(PIN_LED_ADR, LEDadr);
  digitalWrite(PIN_LED_MEM, LEDmem);
  digitalWrite(PIN_LED_RUN, LEDrun);
}

void LEDsCycle(){
  for(int i=0;i<8;i++){
    delay(100);
    LEDsOut((1<<i),LOW,LOW,LOW,LOW);
  }
  delay(100);
  LEDsOut(0,HIGH,LOW,LOW,LOW);
  delay(100);
  LEDsOut(0,LOW,HIGH,LOW,LOW);
  delay(100);
  LEDsOut(0,LOW,LOW,HIGH,LOW);
  delay(100);
  LEDsOut(0,LOW,LOW,LOW,HIGH);
  delay(100);
  LEDsOut(0,LOW,LOW,LOW,LOW);
}

void ReadButtons(){
  char buffer[40];
  digitalWrite(PIN_BTN_CP, HIGH); 
  digitalWrite(PIN_BTN_PL, LOW);  
  digitalWrite(PIN_BTN_PL, HIGH);  
  
  byte ButByte1  = shiftIn(PIN_BTN_Q7, PIN_BTN_CP, MSBFIRST);
  byte ButByte2 = shiftIn(PIN_BTN_Q7, PIN_BTN_CP, MSBFIRST);

  sprintf(buffer, "Buttons: %u%u%u%u%u%u%u%u : %u%u%u%u%u%u%u", 
    ((ButByte1&1<<3)>>3),
    ((ButByte1&1<<2)>>2),
    ((ButByte1&1<<5)>>5),
    ((ButByte1&1<<4)>>4),
    ((ButByte1&1<<7)>>7),
    ((ButByte1&1<<6)>>6),
    ((ButByte1&1<<1)>>1),
    ((ButByte1&1<<0)>>0),
    ((ButByte2&1<<3)>>3),
    ((ButByte2&1<<4)>>4),
    ((ButByte2&1<<5)>>5),
    ((ButByte2&1<<6)>>6),
    ((ButByte2&1<<7)>>7),
    ((ButByte2&1<<1)>>1),
    ((ButByte2&1<<0)>>0));
  Serial.println(buffer);
}


