#ifndef SYSTEM_H
#define SYSTEM_H

#include <xc.h>
#include <stdbool.h>
#include <stdint.h>
#include "io_mapping.h"
#include "fixed_address_memory.h"
#include "usb_config.h"

#define _XTAL_FREQ          48000000

//Indicator LEDs
#define LED_1              LATCbits.LATC1
#define LED_1_TRIS         TRISCbits.TRISC1
#define LED_2              LATCbits.LATC3
#define LED_2_TRIS         TRISCbits.TRISC3

//GestIC (MGC3030)
#define MGC_MCLR        LATCbits.LATC6
#define MGC_MCLR_PORT   PORTCbits.RC6
#define MGC_MCLR_TRIS   TRISCbits.TRISC6

#define MGC_TS_LAT      LATCbits.LATC0
#define MGC_TS_PORT     PORTCbits.RC0
#define MGC_TS_TRIS     TRISCbits.TRISC0
#define MGC_TS_IF       INTCONbits.INTF
#define MGC_TS_IE       INTCONbits.INTE

#define MGC_SCL         LATBbits.LATB6
#define MGC_SCL_TRIS    TRISBbits.TRISB6

#define MGC_SDA_LAT     LATBbits.LATB4
#define MGC_SDA_PORT    PORTBbits.RB4
#define MGC_SDA_TRIS    TRISBbits.TRISB4

#define MGC_SSPCON1_REG         SSPCON1
#define MGC_SSPCON1_BITS        SSPCON1bits
#define MGC_SSPCON2_REG         SSPCON2
#define MGC_SSPCON2_BITS        SSPCON2bits
#define MGC_SSPCON3_REG         SSPCON3
#define MGC_SSPCON3_BITS        SSPCON3bits
#define MGC_SSPSTAT_REG         SSPSTAT
#define MGC_SSPSTAT_BITS        SSPSTATbits
#define MGC_SSPMSK_REG          SSPMSK
#define MGC_SSPMSK_BITS         SSPMSKbits
#define MGC_SSPADD_REG          SSPADD
#define MGC_SSPADD_BITS         SSPADDbits
#define MGC_SSPBUF_REG          SSPBUF
#define MGC_SSP_IE              PIE1bits.SSPIE
#define MGC_SSP_IF              PIR1bits.SSPIF
#define MGC_SSP_BCL_IE          PIE2bits.BCLIE
#define MGC_SSP_BCL_IF          PIR2bits.BCLIF

#define GESTIC_IN_RESET()       (MGC_MCLR_PORT == 0)

#define mgc_checkSSPint()       (MGC_SSP_IE && MGC_SSP_IF)
#define mgc_clrSSPint()         (MGC_SSP_IF = 0)

#define mgc_checkTSint()        (MGC_TS_IE && MGC_TS_IF)
#define mgc_clrTSint()          (MGC_TS_IF = 0)

#define mgc_checkBCLint()       (MGC_SSP_BCL_IE && MGC_SSP_BCL_IF)
#define mgc_clrBCLint()         (MGC_SSP_BCL_IF = 0)

#define i2cTmr_checkInterrupt() (INTCONbits.TMR0IE && INTCONbits.TMR0IF) // (PIE1bits.TMR1IE && PIR1bits.TMR1IF)
#define i2cTmr_clrInt()         INTCONbits.TMR0IF = 0;
#define i2cTmr_Int_enable()     INTCONbits.T0IE = 1;	
#define i2cTmr_stop()           (T0CONbits.TMR0ON = 0)
#define i2cTmr_start()          (T0CONbits.TMR0ON = 1)
#define i2cTmr_reset()          do {T0CONbits.TMR0ON = 0; \
                                TMR0H = 0xFF; TMR0L = 0xEA;} while(0)       //stop timer, reset counter

// ISR rutine flags
extern volatile uint8_t mgcSSPintFlag,
                        mgcBCLintFlag,
                        i2cTimerIntFlag;

// ISR rutine wait timers for i2c
extern uint8_t countDownReset,
               countDownI2C,
               waitTSline;

void SYSTEM_Init();
void MGC_Init();
void interrupt isr(void);

#endif