/* 
 * File:   MainBrain.h
 * Author: Antimatter
 *
 * Created on May 27, 2023, 1:07 PM
 */

#ifndef MAINBRAIN_H
#define	MAINBRAIN_H
#include "usb.h"

#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    

#define _ON               1
#define _OFF              0
#define SRAM_FAIL         0
#define SRAM_PASS         1

//Control Byte
typedef union {
  struct {
    uint8_t run:1;
    uint8_t dir:1;
    uint8_t b2:1;
    uint8_t b3:1;
    uint8_t b4:1;
    uint8_t b5:1;
    uint8_t b6:1;
    uint8_t b7:1;
  };
  struct {
    uint8_t byte:8;
  };
}CONTROL_BITS;

//Status Byte
typedef union {
  struct {
    uint8_t ready:1;
    uint8_t run:1;
    uint8_t dir:1;
    uint8_t b3:1;
    uint8_t b4:1;
    uint8_t b5:1;
    uint8_t b6:1;
    uint8_t b7:1;
  };
  struct {
    uint8_t byte:8;
  };
}STATUS_BITS;

void MotionInterface(void);
void SetMotorSpeed(uint8_t MotorSpeed);
void DisplayUSBData(void);
void DisplayMotionData(void);

extern char ProcessorArray[18];
extern char SRAMsize[10];
extern char FlashSize[13];
extern char USBver[8];
extern unsigned char back_level;
extern int fore_color;
extern volatile uint16_t back_color;
extern unsigned hchar;
extern unsigned vchar;
extern unsigned Display_Read;
extern unsigned row_start;
extern unsigned row_end;
extern unsigned col_start;
extern unsigned col_end;
extern unsigned ascii_char;
extern unsigned i_hex;
extern unsigned char usbInBuffer[64];
extern int SRAMposition;

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

//ADC
void ADC_Init(void);

//PMP
void PMP_Init(void);

//CourierNew16
extern int courier_new_16pt_bold[];
extern int lut[];

//LED Port
extern uint8_t led_port_data;
void LED_Port(unsigned led_data);
void LED_Port_Init(void);

//RTC
void RTC_Init(void);

//Interrupts
void InterruptsInit(void);

//Delay
void Delay(int delay_us);
void LongDelay(int delay_s);
extern volatile unsigned RTC_delay_counter;

//Binary2ASCIIHex
void Binary2ASCIIHex(int i_hex);
extern int d_hex[8];

//Binary2ASCIIBCD
void Binary2ASCIIBCD(int bcd);
extern int d0, d1, d2, d3, d4, d5, d6, d7;
extern int bcd;

//Display
#define black   0x0000
#define white   0xffff
#define red     0xA186
#define blue    0x32b2
#define green   0x3546
#define gray    0x6B6E

typedef enum
{
    MAIN =             0x00,
    DUMP_BDT =         0x01,
    DUMP_MEM =         0x02,
    CLOCK =            0x03,
    DUMP_SRAM =        0x04,
    MOTION =           0x05,
    //EXIT =             0x06,
}DISPLAY_STATE;    

extern DISPLAY_STATE displayState;

extern int MemoryAddress;
void getDevMem(int address);
void DumpSRAM(void);
void DumpMemory(void);
void SystemReset(void);
void setTime(void);

extern char SRAM_Block;

extern const uint16_t SplashImage[48000];
void ShowSplashScreen(void);
void Clock(int ClockData);
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(volatile uint16_t back_color);
void WriteChar(unsigned col_start, unsigned row_start, unsigned ascii_char, int fore_color);
void WriteString(unsigned col_start, unsigned row_start, char array_name[], int fore_color);
void HX8357B_PLTAR(unsigned SR_HI, unsigned SR_LO, unsigned ER_HI, unsigned ER_LO);
void Backlight_Control(unsigned char back_level);

//Flash
void Flash_Init(void);

//SRAM
extern int sram_test_data[8192];
extern int sram_test;
extern volatile uint8_t mdata_70V05;
extern unsigned address_70V05;
void REN70V05_Init(void);
uint16_t REN70V05_RD(uint32_t address_70V05);
bool REN70V05_WR(uint32_t address_70V05, volatile uint8_t mdata_70V05);

#endif	/* MAINBRAIN_H */

