/*
 * File:   main.c
 * Author: jeti1
 *
 * Created on March 4, 2016, 6:25 PM
 */

#define _XTAL_FREQ 4000000

#define i2c_data        rc4
#define i2c_clock       rc3
#define pwm_1           rc2
#define pwm_2           rc1
#define i2c_speed       100   

#fuses XT, NOPROTECT, BROWNOUT, PUT, NOWDT, NOLVP 
#use i2c(MASTER,sda=PIN_C4, scl=PIN_C3, FORCE_HW) 

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>
#include <pic.h>
#include <htc.h>
char Code_get = 2;

void setup_i2c()
{
    SSPSTAT = 0x80;
    SSPCON = 0x28;
    SSPADD = 0x03;
}

void setup_io()
{
    TRISA0 = 1;
    TRISA1 = 1;
    TRISA2 = 1;
    TRISA3 = 1;
    TRISA4 = 1;
    TRISA5 = 1;

    TRISB0 = 1;
    TRISB1 = 1;
    TRISB2 = 1;
    TRISB3 = 1;
    TRISB4 = 1;
    TRISB5 = 1;
    TRISB6 = 1;
    TRISB7 = 1;

    TRISC0 = 1;
    TRISC1 = 0;
    TRISC2 = 0;
    TRISC3 = 1;
    TRISC4 = 1;
    TRISC5 = 1;
    TRISC6 = 1;
    TRISC7 = 1;

    TRISD0 = 0;
    TRISD1 = 0;
    TRISD2 = 0;
    TRISD3 = 0;
    TRISD4 = 0;
    TRISD5 = 0;
    TRISD6 = 0;
    TRISD7 = 0;
    
    TRISE0 = 1;
    TRISE1 = 1;
    TRISE2 = 1;
    RD0 = 0;
}

void setup()
{
    setup_io();
    setup_i2c();
}

void i2c_Waiting()
{
    while ((SSPCON2 & 0x1F ) || ( SSPSTAT & 0x04 ) );
}


void i2c_Start()
{
    SEN = 1;
    i2c_Waiting();
    SSPIF = 0;
}

void i2c_Stop()
{
 PEN = 1; 
 while(!SSPIF);		
 i2c_Waiting();  
 SSPIF = 0;  
}

void i2c_Restart()
{
 RSEN = 1; /* Repeated start enabled */
 while(RSEN); /* wait for condition to finish */
 i2c_Waiting();  //<<----------------------------------------- Add
}

void i2c_Ack()
{
 ACKDT = 0; 
 ACKEN = 1; 
 i2c_Waiting(); 
 SSPIF = 0;	
}

void i2c_Nak()
{
 ACKDT = 0; 
 ACKEN = 1;
 i2c_Waiting();
 SSPIF = 0;
}

void i2c_Send(unsigned char dat)
{
 SSPBUF = dat;
 while(BF); 
 while(!SSPIF);	
 i2c_Waiting(); 
 SSPIF = 0;
}

unsigned char i2c_Read(void)
{
 unsigned char temp;
 RCEN = 1; 
 while(!BF);
 temp = SSPBUF; 
 i2c_Waiting(); 
 SSPIF = 0;
 return temp; 
}

void system_ready_check()
{
    //clear io
    RD0 = 1;
    i2c_Start();
    
}

void get_info_from_client(char address)
{
    i2c_Send(address);
    i2c_Send(1);
    int a = 0;
    i2c_Send(Code_get);
    /*
    while (a < 3)
    {
        
    }
    */
    i2c_Stop();
    i2c_Waiting();
}

void main(void) {
    setup();
    system_ready_check();
    
    while (1)
    {
        get_info_from_client(0x08);
    }
    
    return;
}
