#include "CubeRegister.h"

CubeRegister CubeRegisterPortB;

void CubeRegister::reset() {
  // Port B Pin 8 - 13
  //Serial.println("reset");
  DDRB |= _SER;   // _SER als Output
  DDRB |= _OE;    // _OE als Output
  DDRB |= _RCLK;  // _RCLK als Output
  DDRB |= _SRCLK; // _SRCLK als Output
  DDRB |= _SRCLR; // _SRCLR als Output

  output_disable();
  clear_register();
  register_to_output();
  //  Serial.println(PORTB);
};

void CubeRegister::output_enable() {
  // OUTPUT für OE auf 0 setzen
  PORTB &= ~_OE; // -> LOW
};
void CubeRegister::output_disable() {
  // OUTPUT für OE auf 1 setzen
  PORTB |= _OE; //-> HIGH
};

void CubeRegister::clear_register() {
  PORTB |= _SRCLR;  // -> HIGH
  PORTB &= ~_SRCLK; // -> LOW
  PORTB &= ~_RCLK; // -> LOW
  PORTB &= ~_SRCLR; // -> LOW
  PORTB &= ~_SRCLR; // -> LOW
  PORTB |= _SRCLR;  // -> HIGH
};

void CubeRegister::shift_bit(bool bit) {
  //
  // copy bit to SER (input) of shift regitster
  if (bit == LOW) {
    PORTB &= ~_SER; // -> LOW
  } else {
    PORTB |= _SER; // -> HIGH
  }
  // clock signal for shift registers
  PORTB |= _SRCLK;  // -> HIGH
  PORTB &= ~_SRCLK; // -> LOW
};

// copy shift registers to output registers
void CubeRegister::register_to_output() {
  // clock signal for output registers
  PORTB |= _RCLK;  // -> HIGH
  PORTB &= ~_RCLK; // -> LOW
};
