//-------------------------------------------------------------------------------------------------------
// Title          : DA
//-------------------------------------------------------------------------------------------------------
// Funktion       : LED Beleuchtungskzept
// Schaltung      : Beleuchtung
// Datei          : PCA9635.c
//-------------------------------------------------------------------------------------------------------
// Prozessor      : ATmega8
// Takt           : 1 MHz
// Sprache        : C
// letzte Änderung: 04.06.2014
// Autor          : Kay Ulbricht
//-------------------------------------------------------------------------------------------------------

#include <stdio.h>
#include <avr/interrupt.h>

#include "General.h"
#include "TWI_Master.h"
#include "PCA9635.h"


void Variablen_Init(void)
{
	//Reg 0x01 = MODE2 - set to 0xFF - noninverted logic state, open-drain
	MODE2 = 0x02;	
	
	// Set all Output of 0x00(0)
	LED0 = 0x00;
	LED1 = 0x00;
	LED2 = 0x00;
	LED3 = 0x00;
	LED4 = 0x00;
	LED5 = 0x00;
	LED6 = 0x00;
	LED7 = 0x00;
	LED8 = 0x00;
	LED9 = 0x00;
	LED10 = 0x00;
	LED11 = 0x00;
	LED12 = 0x00;
	LED13 = 0x00;
	LED14 = 0x00;
	LED15 = 0x00;
	LED16 = 0x00;
	LED17 = 0x00;
	LED18 = 0x00;
	LED19 = 0x00;
	LED20 = 0x00;
	LED21 = 0x00;
	LED22 = 0x00;
	LED23 = 0x00;
	LED24 = 0x00;
	LED25 = 0x00;
	LED26 = 0x00;
	
	//LED_OFF:
	LED_OFF = 0x00;

	//Reg 0x12 - Group PWM - Variablen
	GROUP_PWM = 0x00;

	//Reg 0x13 - Group Freq - Variablen
	GROUP_FREQ = 0x00;

	//Reg 0x14-0x17 - LED Output State Control - Variablen
	LED_OUTPUT0 = 0xAA;
	LED_OUTPUT1 = 0xAA;
	LED_OUTPUT2 = 0xAA;
	LED_OUTPUT3 = 0xAA;
}
void Full_Output(void)
{
	//Set all Outputs of 0xFF(255 - FULL ON)
	//RGB_LED0:
	LED0 = 0xFF;
	LED1 = 0xFF;
	LED2 = 0xFF;
	//RGB_LED1:
	LED3 = 0xFF;
	LED4 = 0xFF;
	LED5 = 0xFF;
	//RGB_LED2:
	LED6 = 0xFF;
	LED7 = 0xFF;
	LED8 = 0xFF;
	//RGB_LED3:
	LED9 = 0xFF;
	LED10 = 0xFF;
	LED11 = 0xFF;
	//RGB_LED4:
	LED12 = 0xFF;
	LED13 = 0xFF;
	LED14 = 0xFF;
	//RGB_LED5:
	LED15 = 0xFF;
	LED16 = 0xFF;
	LED17 = 0xFF;
	//RGB_LED6:
	LED18 = 0xFF;
	LED19 = 0xFF;
	LED20 = 0xFF;
	//RGB_LED7:
	LED21 = 0xFF;
	LED22 = 0xFF;
	LED23 = 0xFF;
	//RGB_LED8:
	LED24 = 0xFF;
	LED25 = 0xFF;
	LED26 = 0xFF;
}
void PCA9635(void)
{
	//Erster TLC59116 Chip:
	TWIM_Start (PCA9635_ADD1, TWIM_WRITE);

	//Autoincrement ALL registers, start at reg 0 - we're initting
	TWIM_Write(AUTO_INCREMENT_ALL_REGISTERS);		//Write 0x80

	//Reg 0x00 = MODE1 - set to 0x80 - autoincrement enabled (this is readonly?), do not respond to subaddresses or allcall
	TWIM_Write(AUTO_INCREMENT_ALL_REGISTERS);		//Write 0x80

	//Reg 0x01 = MODE2 - set to 0xFF - noninverted logic state, open-drain
	TWIM_Write(0x02);			

	//Reg 0x02-0x11 - PWM0-15 - LED Helligkeit
	//RGB_LED1:
	TWIM_Write(LED0);						//OUT0 - R
	TWIM_Write(LED1);						//OUT1 - G
	TWIM_Write(LED2);						//OUT2 - B

	//RGB_LED2:
	TWIM_Write(LED3);						//OUT3 - R
	TWIM_Write(LED4);						//OUT4 - G
	TWIM_Write(LED5);						//OUT5 - B
	
	//Freier Ausgang!
	TWIM_Write(LED_OFF);					//OUT6 
	TWIM_Write(LED_OFF);					//OUT7

	//RGB_LED3:
	TWIM_Write(LED6);						//OUT8  - R
	TWIM_Write(LED7);						//OUT9  - G
	TWIM_Write(LED8);						//OUT10 - B

	//RGB_LED4:
	TWIM_Write(LED9);						//OUT11 - R
	TWIM_Write(LED10);						//OUT12 - G
	TWIM_Write(LED11);						//OUT13 - B

	//Freier Ausgang!
	TWIM_Write(LED_OFF);					//OUT14
	TWIM_Write(LED_OFF);					//OUT15

	//Reg 0x12 - Group PWM - should not matter
	TWIM_Write(GROUP_PWM);

	//Reg 0x13 - Group Freq - should not matter
	TWIM_Write(GROUP_FREQ);

	//Reg 0x14-0x17 - LED Output State Control - all 0xAA (output state for each LED = 0x2)
	TWIM_Write(LED_OUTPUT0);
	TWIM_Write(LED_OUTPUT1);
	TWIM_Write(LED_OUTPUT2);
	TWIM_Write(LED_OUTPUT3);


	//Zweiter TLC59116 Chip
	TWIM_Start (PCA9635_ADD2, TWIM_WRITE);

	//Autoincrement ALL registers, start at reg 0 - we're initting
	TWIM_Write(AUTO_INCREMENT_ALL_REGISTERS);		//Write 0x80

	//Reg 0x00 = MODE1 - set to 0x80 - autoincrement enabled (this is readonly?), do not respond to subaddresses or allcall
	TWIM_Write(AUTO_INCREMENT_ALL_REGISTERS);		//Write 0x80

	//Reg 0x01 = MODE2 - set to 0x02 - noninverted logic state, open-drain
	TWIM_Write(0x02);			//verstehe ich noch nicht ganz aber es geht erstmal

	//Reg 0x02-0x11 - PWM0-15 - LED Helligkeit
	//RGB_LED5:(der Zeit defekt :( )
	TWIM_Write(LED12);					//OUT0 - R
	TWIM_Write(LED13);					//OUT1 - G
	TWIM_Write(LED14);					//OUT2 - B

	//RGB_LED6:
	TWIM_Write(LED15);					//OUT3 - R
	TWIM_Write(LED16);					//OUT4 - B
	TWIM_Write(LED17);					//OUT5 - G

	//PGB_LEB7:
	TWIM_Write(LED18);					//OUT6 - R
	TWIM_Write(LED19);					//OUT7 - G
	TWIM_Write(LED20);					//OUT8 - B

	//RGB_LED8:
	TWIM_Write(LED21);					//OUT9  - R
	TWIM_Write(LED22);					//OUT10 - G
	TWIM_Write(LED23);					//OUT11 - B

	//RGB_LED9:
	TWIM_Write(LED24);					//OUT12 - R
	TWIM_Write(LED25);					//OUT13 - B
	TWIM_Write(LED26);					//OUT14 - G

	//Freier Ausgang!
	TWIM_Write(LED_OFF);				//OUT15

	//Reg 0x12 - Group PWM - should not matter
	TWIM_Write(GROUP_PWM);

	//Reg 0x13 - Group Freq - should not matter
	TWIM_Write(GROUP_FREQ);

	//Reg 0x14-0x17 - LED Output State Control - all 0xAA (output state for each LED = individuell)
	TWIM_Write(LED_OUTPUT0);
	TWIM_Write(LED_OUTPUT1);
	TWIM_Write(LED_OUTPUT2);
	TWIM_Write(LED_OUTPUT3);


	//Reg 0x18-0x1b - Subaddressing stuff, doesn't matter, just stop the xfer
	TWIM_Stop();
}
// Turn the LEDs on or off. LEDs is a 16-bit int corresponding to OUT0 (LSB) to OUT15 (MSB)
//void setLEDs(int LEDs)
//{
//int registerVal=0;
//int registerIncrement = LED_OUTPUT_GROUP;
//
//TWIM_Start(ADDRESS_PWM1, TWIM_WRITE);
//// Write to consecutive registers, starting with LEDOUT0
//TWIM_Write(AUTO_INCREMENT_ALL_REGISTERS + TLC59116_LEDOUT0);
//
//// Write the value for LEDs
//for (int i=0; i< 16; i++) {
//if (LEDs & 0x01)
//registerVal += registerIncrement;
//// Move to the next LED
//LEDs >>= 1;
//// Are 4 LED values in the register now?
//if (registerIncrement == LED_OUTPUT_GROUP<<6) {
//// The register can be written out now
//TWIM_Write(registerVal);
//registerVal = 0;
//registerIncrement = LED_OUTPUT_GROUP;
//}
//else {
//// Move to the next increment
//registerIncrement <<= 2;
//}
//}
//TWIM_Stop();
//}


// Set the brightness from 0 to 0xFF
//void setBrightness(int brightness)
//{
//TWIM_Start(ADDRESS_PWM1,TWIM_WRITE);
//// Write to the GRPPWM register
//TWIM_Write(NO_AUTO_INCREMENT + TLC59116_GRPPWM);
//TWIM_Write(brightness);
//TWIM_Stop();
//}