/* 
 * File:   main.c
 * Author: Martin
 *
 * Created on 1. 5. 2013, 8:32
 */

#include <stdio.h>
#include <stdlib.h>
#include <uart.h>
#include <i2c.h>
#include <spi.h>
#include "p33ep128gp504.h"
//#include "config.h"
#include "periferal.h"
#include "sserial.h"

/*
 * 
 */

extern int processU1, processU2;
extern char DAC_ready;
extern unsigned char OUTPUT[4];

/*
unsigned char txtest[512];
int pTXtest;
unsigned char rxtest[512];
int pRXtest;
*/

//int RXbyte;


/*
char INP0_7;
char OUT0_7;
char ANOUT1, ANIN1;
*/

int errorTest;



/*
    SSerial 1

    84 bit? out    (6 x 14bit DAC),
    16 bit? in     (2 x 8bit ADC)

    100

    SSerial 2

    6 bit? out     (analog EN)
    5 bit? out     (uversal)
    18 bit? out    (drivers)
    24 bit? in     (drivers)
    21 bit? in     (13 x limit + 8 x universal)

    74
*/


unsigned char CRC_table[256] =     {0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
                                    157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
                                    35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
                                    190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
                                    70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
                                    219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
                                    101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
                                    248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
                                    140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
                                    17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
                                    175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
                                    50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
                                    202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
                                    87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
                                    233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
                                    116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};



int CalcCRC(unsigned char data_byte, unsigned char crc);
void UART_send_buf(unsigned long ulBase, unsigned char* buf, int num);


void InitSystem(void)
{
   

}

void InitGPIO(void)
{
    TRISA = 0xFFFF;
    TRISB = 0xF4FF;     // RB8 - IO_CLR_, RB9 - DAC_CLR_, RB11 - SS_
    PORTB = 0x0B00;
    TRISC = 0xFF7F;     // RC7 - SYNC_
    PORTC = 0x0080;

    // UART
    /*
    RPINR18bits.U1RXR = 0x19;    // U1RX -> RPI51
    RPINR19bits.U2RXR = 0x33;    // U2RX -> RPI25
    RPOR1bits.RP36R = 0x03;      // U1TX -> RP36
    RPOR0bits.RP20R = 0x01;      // U2TX -> RP20
    */
    __builtin_write_OSCCONL(OSCCON & 0xbf);

    
    RPINR18bits.U1RXR = 0x33;    // U1RX -> RPI51
    RPINR19bits.U2RXR = 0x19;    // U2RX -> RPI25
    RPOR1bits.RP36R = 0x01;      // U1TX -> RP36
    RPOR0bits.RP20R = 0x03;      // U2TX -> RP20

    /*
    RPINR18bits.U1RXR = 0x19;    // U1RX -> RPI51
    RPINR19bits.U2RXR = 0x33;    // U2RX -> RPI25
    RPOR1bits.RP36R = 0x03;      // U1TX -> RP36
    RPOR0bits.RP20R = 0x01;      // U2TX -> RP20
    */
    // SPI
    RPINR22bits.SDI2R = 0x2E;    // SDI2 -> RPI46
    RPOR6bits.RP57R   = 0x08;    // SDO2 -> RP57
    RPOR4bits.RP42R   = 0x09;    // SCK2 -> RP42

    __builtin_write_OSCCONL(OSCCON | 0x40);
}


int CalcCRC(unsigned char data_byte, unsigned char crc)
{
    /*
    unsigned char bit_mask = 0, carry_check = 0, temp_data = 0;

    temp_data = data_byte & 0x00FF;
    for ( bit_mask = 0; bit_mask <= 7; bit_mask ++) {
        data_byte = data_byte ^ crc;
        crc = crc / 2;
        temp_data = temp_data / 2;
        carry_check = data_byte & 0x01;
        if (carry_check) {
                crc = crc ^ 0x8C;
        }
        data_byte = temp_data;
    }
    return crc;
    */
    return  CRC_table[crc ^ data_byte];
}

void  UARTCharPut(int UARTBase, char data)
{
    switch (UARTBase) {
        case 1: while(BusyUART1());
                WriteUART1(data);
                //txtest[pTXtest] = data;
                //if (pTXtest < 1023) pTXtest++;
                break;
        case 2: while(BusyUART2());
                WriteUART2(data);
                break;
        default: break;
    }
}

void UART_send_buf(unsigned long ulBase, unsigned char* buf, int num)
{
    int i;

    for(i = 0; i < num; i++) {
        UARTCharPut(ulBase, buf[i]);

    }
}

char UARTCharGetX(int UARTBase)
{
    char data;

    switch (UARTBase) {
        case 1: while(!DataRdyUART1());
                data = ReadUART1();
                /*
                rxtest[pRXtest] = data;
                if (pRXtest < 1023) pRXtest++;
                */
                break;
        case 2: while(!DataRdyUART2());
                data = ReadUART2();
                break;
        default: break;
    }
    return data;
}

char UART_RX[128];
int p_UART_RX;


char XXX1, XXX2, XXX3;


/*
// Select Internal FRC at POR
_FOSCSEL(FNOSC_FRC & IESO_OFF);
// Enable Clock Switching and Configure POSC in XT mode
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);

*/





_FOSCSEL(FNOSC_FRC & IESO_OFF);

_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_EC);

_FPOR(ALTI2C1_OFF & ALTI2C2_ON);

int test[2];



int main(int argc, char** argv) {
    int i;

    // Configure PLL prescaler, PLL postscaler, PLL divisor
    PLLFBD = 46;              // M = 48, 240MHz
    CLKDIVbits.PLLPOST = 0;   // N2 = 2, 120MHz
    CLKDIVbits.PLLPRE = 0;    // N1 = 2, 5MHz
    // Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011)
    __builtin_write_OSCCONH(0x03);
    __builtin_write_OSCCONL(OSCCON | 0x01);
    // Wait for Clock switch to occur
    while (OSCCONbits.COSC != 0b011);
    // Wait for PLL to lock
    while (OSCCONbits.LOCK!= 1);

    errorTest = 0;

    /*
    for (i = 0; i < 512; i++) {
        rxtest[i] = 0;
        txtest[i] = 0;
    }
    */
    
    InitSystem();
    InitGPIO();
    InitUARTs();
    InitSPI();    
    InitI2C();
    Init9670();
    InitADC();
    /*
    pTXtest = 0;
    pRXtest = 0;
    */

    
    InitDACs();
/*
    for (i = 0; i < 512; i++) {
        rxtest[i] = 0;
        txtest[i] = 0;
    }

    UARTCharPut(2, 0xDF);
    UARTCharPut(2, 0x16);
    UARTCharPut(2, 0xEB);
    UARTCharPut(2, 0x28);
*/
    //ReadSPI2();

    /*
    DAC[3] = 0x7FFC;
    DAC[4] = 0x7FFC;
    DAC[5] = 0x7FFC;
    DAC[0] = 0x8000;
    DAC[1] = 0x8000;
    DAC[2] = 0x8000;
    */

    
    for ( ; ; ) {
        if (processU1 == 1) ZpracujU1();
        if (processU2 == 1) ZpracujU2();
        if (DAC_ready == 3) {
            LoadDAC();
            Write9670(3, OUTPUT[0]);
            Write9670(1, OUTPUT[1]);
            Write9670(0, OUTPUT[2]);
            Write9670(2, OUTPUT[3]);
            SampleData();
            DAC_ready = 0;
        
        }
    }

    return (EXIT_SUCCESS);
}
