#include "main.h"
#include "i2cmaster.h"
#include <util/delay.h>

#define PCA9536_I2C_ADR 0x82
#define PCF8574_I2C_ADR 0x40

#define PCA9536_INPUT_REG    0x00
#define PCA9536_OUTPUT_REG   0x01
#define PCA9536_POLARITY_REG 0x02
#define PCA9536_CONFIG_REG   0x03

int8_t Abfrage_Bus(uint8_t slave_adresse) { 
    uint8_t ret;

    ret = i2c_start(slave_adresse);
    i2c_stop();
    return ret;
}

void PCA9536_Write(uint8_t slave_addresse, uint8_t cfg_reg, uint8_t data) {
    i2c_start(slave_addresse);
    i2c_write(cfg_Reg);
    i2c_write(data);
    i2c_stop();
}

void PCA9536_Read(uint8_t slave_adresse,  uint8_t cfg_reg, uint8_t* data) {
    i2c_start(slave_adresse);
    i2c_write(cfg_reg);
    i2c_start(slave_adresse|0x01);
    *data=i2c_readNak();
    i2c_stop();
}

void PCF8574_Write(uint8_t slave_adresse, uint8_t data) {
    i2c_start(slave_adresse);
    i2c_write(data);
    i2c_stop();
} 
  
void PCF8574_Read(uint8_t slave_adresse, uint8_t* data) {
    i2c_start(slave_adresse|0x01);
    *data=i2c_readNak();
    i2c_stop();
}

int main(void) {
    uint8_t Tasten_A, Tasten_B;
    uint8_t pcf8574_buffer=0xFF;

    i2c_init();
    DDRC=0x20;                                // Status LEDs am Prozessor

    // Prüfe I2C Slaves auf Vorhandensein

    if (Abfrage_Bus(PCA9536_I2C_ADR)) {
        PORTC |= (1<<PC5);          // error
        while(1);                   // stop
    }

    if (Abfrage_Bus(PCF8574_I2C_ADR)) {
        PORTC |= (1<<PC5);          // error
        while(1);                   // stop
    }

    // PCA9536 P0-P2 auf OUTPUT umstellen, P3 Input

    PCA9536_Write(PCA9536_I2C_ADR, PCA9536_CONFIG_REG, 0x08);     
  
    while(1) {                                          // Hauptschleife    
    
        PCF8574_Read(PCF8574_I2C_ADR, &Tasten_A);       // Lesezugriff P11
        PCA9536_Read(PCA9536_I2C_ADR, PCA9536_INPUT_REG, &Tasten_B);       // Lesezugriff Abfrage WTMA

        if(~Tasten_B & 0x08) {                          // Taste 4 kopieren
            pcf8574_buffer &= ~0x80;
        } else {
            pcf8574_buffer |=  0x80;
        }
          
        if (~Taste_A & 0x08) {                          // Taste 1 kopieren
           pcf8574_buffer &= ~0x10;
        } else {
           pcf8574_buffer |=  0x10; 
        }

        PCF8574_Write(PCF8574_I2C_ADR, pcf8574_buffer);
        PCA9536_Write(PCA9536_I2C_ADR, PCA9536_OUTPUT_REG, Taste_A & 0x07);
    }
}