#include "pinout.h"
#include "print.h"
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>

const unsigned char number_Font[10]  = {  0b11011110, //0
                                          0b00000110, //1
                                          0b11101010, //2
                                          0b01101110, //3
                                          0b00110110, //4
                                          0b01111100, //5
                                          0b11111100, //6
                                          0b00001110, //7
                                          0b11111110, //8
                                          0b01111110  //9
                                       };
const unsigned char character_Font[26] = {0b10111110, //A
                                          0b11110100, //b
                                          0b11100000, //c
                                          0b11100110, //d
                                          0b11111000, //e
                                          0b10111000, //F
                                          0b11011100, //G
                                          0b10110100, //h
                                          0b00000100, //i
                                          0b01000110, //J
                                          0b10111100, //K
                                          0b11010000, //L
                                          0b10011110, //M
                                          0b10100100, //n
                                          0b11100100, //o
                                          0b10111010, //P
                                          0b00111110, //q
                                          0b10100000, //r
                                          0b01111100, //S
                                          0b11110000, //t
                                          0b11000100, //u
                                          0b11000100, //v
                                          0b11010110, //W
                                          0b10110110, //X
                                          0b01110110, //Y
                                          0b11100110 //Z
                                         };
const unsigned char blank =           0b00000000; //zeigt nichts an
const unsigned char minus =           0b00100000; //zeigt '-' an
const unsigned char dot =             0b00000001; //aktiviert Dezimalpunkt
unsigned char SR_Buffer[6] = {0b11100110,
							  0b11100110,
							  0b11100110,
							  0b11100110,
							  0b11100110,
							  0b11100110};



void clear_SR_Buffer() {
  for (uint8_t i = 0; i < 6; i++) {
    SR_Buffer[i] = blank;
  }
}

void add_Decimal_Point_to_SR_Buffer(int pos){
	SR_Buffer[pos-1] += dot;
}

void print_SR_Buffer() {
  PORTC &= ~(LATCH_SR);
  
  for (int i = 0; i < 6; i++) {
    SPDR = SR_Buffer[i];
    //SPDR = 0b11100110;
    //_delay_us(100);
    while (!(SPSR & (1 << SPIF))); //warten auf transferabschluss
  }
  PORTC |= LATCH_SR;
  //_delay_ms(1);
  //PORTC &= ~(LATCH_SR);
}

void print_String(char* string){
	for(int i = 0; i < 6; i++){
		add_ASCII_to_SR_Buffer(string[i],i);
	}
	print_SR_Buffer();
}


void add_ASCII_to_SR_Buffer(unsigned char character, int pos) {
  int ascii_offset = 0;
  
  if((character > 46) && (character < 57)){ //Char ist Zahl
	ascii_offset = 48;
	SR_Buffer[pos] = number_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Zahl mit Font Index übereinstimmen
  }else if (character > 95 && character < 122) { //Buchstabe ist kleiner Buchstabe
    ascii_offset = 97;
    SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen
  } else if (character > 64 && character < 91){   //Buchstabe groß Buchstabe
    ascii_offset = 65;
    SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen
  } else if (character == 32){ //Charakter ist Blank ' '
	SR_Buffer[pos] = blank;
  } else if (character == 45){ //Charakter ist Minus -
	SR_Buffer[pos] = minus;  
  }
  
}

void add_Character_to_SR_Buffer(unsigned char character, int pos) {
  int ascii_offset = 0;
  
  if (character > 96 && character < 122) { //Buchstabe ist kleiner Buchstabe
    ascii_offset = 97;
    SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen
  } else if (character > 65 && character < 91){   //Buchstabe groß Buchstabe
    ascii_offset = 65;
    SR_Buffer[pos] = character_Font[character - ascii_offset]; //Zieht ASCII-Offset ab, sodass Buchstaben mit Font Index übereinstimmen
  }
  
}

void add_Number_to_SR_Buffer(int number, int pos) {
  SR_Buffer[pos-1] = number_Font[number];
}
