/********************************************/
/*MainBrain.h - Header file                   */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/
#include <stdint.h>
#include <sys/attribs.h>
#include <stddef.h>

#ifndef MAINBRAIN_H
#define	MAINBRAIN_H

//LED_Port
#define LED0    PORTBbits.RB7    
#define LED1    PORTBbits.RB6    
#define LED2    PORTGbits.RG13    
#define LED3    PORTDbits.RD2    
#define LED4    PORTCbits.RC1    
#define LED5    PORTCbits.RC2    
#define LED6    PORTCbits.RC3    
#define LED7    PORTCbits.RC4  

#define LED9    PORTFbits.RF8    
#define LED10    PORTFbits.RF2    


//Primary Oscillator Frequency
extern unsigned int PRI_FREQ;

//Secondary Oscillator Frequency
extern unsigned int SEC_FREQ;

//Size of Dual Port RAM
extern unsigned int RAM_SIZE;

extern int fore_color;
extern int back_color;
extern unsigned hchar;
extern unsigned vchar;
extern unsigned col_end;
extern unsigned row_end;
extern unsigned col_start;
extern unsigned row_start;
extern unsigned RX_Data[132];
extern int CorTimer_Compare;
extern int RTC_delay_counter;
extern unsigned data_x;
extern unsigned data_y;
extern uint8_t mdata_70V05;
extern int d_hex[8];
extern int d0, d1, d2, d3, d4, d5, d6, d7;

extern unsigned data_v;
extern unsigned data_i;
extern unsigned Display_Read;

extern int clock_on;
extern int sram_test;
extern unsigned address_70V05;
extern int sram_test_data[1024];
extern int Flash_DID;
extern int flash_size;
extern int Flash_MID;
extern unsigned long Bytes_used;
extern unsigned scrn_cnt;

void LED_Port_Init(void);
void LED_Port(uint8_t led_port_data);

//Timers
void Timer2_Init(void);
void Timer3_Init(void);
void Timer4_Init(void);
void Timer5_Init(void);

void DisplayData(void);

//ADC
void ADC_Init(void);

//Binary2ASCIIBCD
void Binary2ASCIIBCD(int bcd);

//Binary2ASCIIHex
void Binary2ASCIIHex(uint32_t i_hex);

//Commands
void Get_Display_DEVID(void);
void BUSY_Write_Test(void);
void BUSY_Read_Test(void);

//Delay
void Delay(int delay_us);
void LongDelay(int delay_s);

//Flash
void Flash_Init(void);
void Flash_GetMID(void);
void Flash_GetDID(void);
void Flash_RD(unsigned address_flash);
void Flash_WR(unsigned address_flash, uint8_t data_flash);
void Flash_Sector_Erase(int erase_sector);
void Flash_Chip_Erase(void);
void Flash_Get_Bytes_Used(void);

//HX8357B
void Backlight_Control(int back_level);
void Speaker_Control(unsigned freq);
void HX8357B_Init(void);
void HX8357B_NOP(void);
void HX8357B_SWRESET(void);
void HX8357B_RDDPM(void);
void HX8357B_RDDMADCTL(void);
void HX8357B_RDDCOLMOD(void);
void HX8357B_RDDIM(void);
void HX8357B_RDDSM(void);
void HX8357B_RDDSDR(void);
void HX8357B_SLPIN(void);
void HX8357B_SLPOUT(void);
void HX8357B_PTLON(void);
void HX8357B_NORON(void);
void HX8357B_INVOFF(void);
void HX8357B_INVON(void);
void HX8357B_DISPOFF(void);
void HX8357B_DISPON(void);
void HX8357B_CASET(unsigned col_start, unsigned col_end);
void HX8357B_RASET(unsigned row_start, unsigned row_end);
void HX8357B_RAMWR(void);
void HX8357B_RAMRD(void);
void HX8357B_GETDEVICEID(void);
void HX8357B_Rect(unsigned col_start, unsigned col_end, unsigned row_start, unsigned row_end, unsigned rect_color);
void HX8357B_CLRSCN(int back_color);
void Write_Char(unsigned col_start, unsigned row_start, uint8_t ascii_char, int fore_color);
void Write_String(unsigned col_start, unsigned row_start, int fore_color, int string_index, const unsigned char the_array[], const uint16_t array_offset[]);
void HX8357B_PLTAR(unsigned SR_HI, unsigned SR_LO, unsigned ER_HI, unsigned ER_LO);

//Interrupts
void Interrupts_Init(void);
void USB_init_endpoints(void);

//PMP
void PMP_Init(void);

//REN70V05
void REN70V05_Init(void);
void REN70V05_WR(unsigned address_70V05, uint8_t mdata_70V05);
void REN70V05_RD(unsigned address_70V05);
void memtest_70V05(void);

//RTC
void RTC_Init(void);

//Screens
void Write_Digit(int RTC_Data);
void Header(void);
void Home_Screen(void);
void Motion_Screen(void);
void Oscillator_Screen(void);
void Current_Screen(void);
void Display_Screen(void);
void RTC_Screen(void);
void SRAM_Screen(void);
void Flash_Screen(void);
void Oscillator_Screen(void);
void USB_Screen(void);
void Clock(void);

//CourierNew16
extern int courier_new_16pt_bold[];

extern int lut[];

//SplashImage
extern uint16_t SplashImage[];

//Strings
extern uint8_t SYSTEM_STRING[];
extern uint16_t SYSTEM_STRING_OFFSET[];

//CurrentArray
extern uint8_t CurrentString[];

//VoltageArray
extern uint8_t VoltageString[];

#endif /*MAINBRAIN_H_H*/
