/*********************************************************************
  File Information:
    FileName:     	MainBrain.h
    Dependencies:	See #includes
    Processor:		PIC32MX795F512
    Hardware:		MainBrain32 rev 0.10
    Complier:  	    XC32 4.35
    Author:         Larry Knight 2023
    
    Software License Agreement:
    
    Description:
  
    File Description:

    Change History:
/***********************************************************************/


#ifndef MAINBRAIN_H
#define	MAINBRAIN_H

//currently speeds 80 and 96 are supported
#define clock_speed 96

//Display Types
#define	ILI19488 1
#define HX8357B  2

//Display type selection for firmware
//#define DisplayType ILI19488
#define DisplayType HX8357B

#include <stdbool.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

struct _MotionStruct
{
    uint8_t num:8;
    uint8_t cmd:8;
    uint8_t runto_lo:8;
    uint8_t runto_hi:8;
    uint8_t runto_up:8;
    uint8_t runto_tp:8;
    uint8_t ramp:8;
    uint8_t dir:8;
    uint8_t speed:8;
    uint8_t endof:8;
};

//typedef union
//{
//        struct _MotionStruct
//    {
//        uint8_t num:8;
//        uint8_t cmd:8;
//        uint8_t runto_lo:8;
//        uint8_t runto_hi:8;
//        uint8_t runto_up:8;
//        uint8_t runto_tp:8;
//        uint8_t ramp:8;
//        uint8_t dir:8;
//        uint8_t speed:8;
//        uint8_t endof:8;
//    };
//
//    struct _MotionStruct32
//    {
//        uint16_t pad0:8;
//        uint32_t runto:32;
//        uint32_t pad1:32;
//    };
//};

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

void Get_x(void);
void Get_y(void);
void TouchDev(void);
extern int data_x;
extern int data_y;

//MISC
void SRAM_Semaphore_Test();
void MotionInterface(void);
void WriteSequencedata(void);
void SetMotorData(uint8_t MotorSpeed, uint8_t Acel);
void DisplayUSBData(void);
void DisplayMotionData(void);
void RunSequence(void);
void BuildSeqInterface(void);
void SRAM_Test(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 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 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
#if DisplayType == ILI19488
    #define black   0x0000
    #define white   0xffff
    #define red     0xA186
    #define blue    0x32b2
    #define green   0x3546
    #define gray    0x6B6E
    #define HeaderBarBackColor 0x2D1B
#endif

#if DisplayType == HX8357B
    #define black   (uint16_t) ~0x0000
    #define white   (uint16_t) ~0xffff
    #define red     (uint16_t) ~0xA186
    #define blue    (uint16_t) ~0x32b2
    #define green   (uint16_t) ~0x3546
    #define gray    (uint16_t) ~0x6B6E
    #define HeaderBarBackColor (uint16_t) ~0x2D1B
#endif

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

extern uint16_t SRAM_Block;
extern uint8_t back_level;

extern const uint16_t SplashImage[48000];
void ShowSplashScreen(void);
void Clock(int ClockData);
void Display_Init(void);
void Display_NOP(void);
void Display_SWRESET(void);
void Display_RDDPM(void);
void Display_RDDMADCTL(void);
void Display_RDDCOLMOD(void);
void Display_RDDIM(void);
void Display_RDDSM(void);
void Display_RDDSDR(void);
void Display_SLPIN(void);
void Display_SLPOUT(void);
void Display_PTLON(void);
void Display_NORON(void);
void Display_INVOFF(void);
void Display_INVON(void);
void Display_DISPOFF(void);
void Display_DISPON(void);
void Display_CASET(unsigned col_start, unsigned col_end);
void Display_RASET(unsigned row_start, unsigned row_end);
void Display_RAMWR(void);
void Display_RAMRD(void);
void Display_GETDEVICEID(void);
void Display_Rect(unsigned col_start, unsigned col_end, unsigned row_start, unsigned row_end, unsigned rect_color);
void Display_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 Display_PLTAR(unsigned SR_HI, unsigned SR_LO, unsigned ER_HI, unsigned ER_LO);

//Flash
void Flash_Init(void);
extern int Flash_DID;

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

#endif	/* MAINBRAIN_H */

