/********************************************************************/
/********************************************************************/
/*****                                                          *****/
/*****        P A N E L   L E D   8 0 X 7  D I S P L A Y        *****/
/*****                                                          *****/
/*****                                                          *****/
/*****                                                          *****/
/*****                       Main Header                        *****/
/*****                                                          *****/
/********************************************************************/
/********************************************************************/

typedef unsigned char uchar;
typedef unsigned short sint;
typedef unsigned int uint;
typedef unsigned long ulong;

// Declaracion de funciones
void init_pic(void);
void init_attribute(void);
void load_msg_from_i2c(void);
void save_msg_to_i2c(void);
void fill_buffer(void);
void fill_buffer_for_vertical_scroll_anim(sint, sint, sint);
void clear_regs(void);
void clear_latch();
void screen_frame(void);
void Init_Rd(unsigned short, unsigned short);
void Fin_Rd(void);
void Init_Wr(unsigned short, unsigned short);
void Fin_Wr(void);
void param_reset(void);
void cls(void);
unsigned short int ack_wait(void);
unsigned short int read_wait(void);

#define SN_H        255  // Serial electronico Hight Byte
#define SN_L        000  // Serial electronico Low Byte


// Constants:
#define TRUE  1
#define FALSE 0
#define ON    1
#define OFF   0
#define YES   1
#define NO    0
#define OK    0
#define ERR   -1

#define VUD   0
#define VDU   1

// Animation Mask
#define HLRSCROLL_MASK       1    // Horizontal Left-Right
#define HRLSCROLL_MASK       2    // Horizontal Right-Left
#define VUDSCROLL_MASK       4    // Vertical Up-Down
#define VDUSCROLL_MASK       8    // Vertical Down-Up
#define CENTER_MASK          16   // Centro de la pantalla sin animacion
#define NONE_MASK            32   // Sin ninguna animacion, alineado a la izquierda
#define CHLR_MASK            64   // Cortina Horizontal Left-Right (Muestra)
#define CHRL_MASK            128  // Cortina Horizontal Right-Left (Oculta)

// Flags Mask
#define ANIMIN_MASK     1
#define ANIMOUT_MASK    2
#define SCROLLON_MASK   4
#define BLINKON_MASK    8
#define SHOW_MASK       16   // Indica si el MENSAJE va hacer mostrado o no

// Timers
#define TIMER_SCROLL    1
#define TIMER_BLINK     2
#define TIMER_LED       35
#define UPDATE_SYNC     10   // funciona como un prescaler

// Atributos de texto y pantalla
#define ASCIILEN         96                  // longitud del mensaje en ascii
#define ASCIILEN_PIXEL   (ASCIILEN*8)        // longitud maxima en pixel del mensaje
#define ROW              7                   // Alto en pixel de la pantalla
#define SCREENWIDTH      40                  // Tamano en pixel de la pantalla
#define CHARWIDTH        8                   // Ancho en pixel de cada caracter
#define CHARHEIGTH       7                   // Alto en pixel de cada caracter
#define BLINKFLAGSLEN    12
#define MSGINRAMMAX      25                  // Mensajes maximos cargados en RAM para mostrar

// Comandos PC-Panel
#define PCLINK           0x24              // (36) Solicitud de Conexion a PC
#define FINISH           0x80              // (128)
#define TOTAL            0xFD              // (253)
#define ACK              0xFC              // (252)
#define SENDALLMSG       0xFB              // (251)
#define STARTDATA        0xFA              // (250)
#define STOPDATA         0xF9              // (249)
#define GETALLMSG        0xF8              // (248)
#define CONNECTOK        0x40              // (64)

typedef struct {
        sint addrh;
        sint addrl;
        sint flags;              // Determina el comportamiento general del mensaje a mostrar
                                 // Bit 0: Habilitada efecto de entrada si = 1
                                 // Bit 1: Habilitada efecto de salida si = 1 (si = 0 sale con el mismo efecto que entro)
                                 // Bit 2: Habilita Scroll Horizontal
                                 // Bit 3: Habilita Blink de Caracteres
        sint efecin;
        sint efecout;
        sint scroll_setpoint;    // Velocidad del desplazamiento de texto
        sint blink_setpoint;     // Velocidad del blink
        sint delay_setpoint;     // Tiempo de retardo entre la animacion de entrada y salida
        sint stringlen;          // longitud en caracter alfanumericos 0-ASCIILEN
        uchar ascii[ASCIILEN];
        sint blink[BLINKFLAGSLEN];  // Indica que letra tiene blinking activado, ejemplo el texto: "Hola Mundo" si quiero que parpadee "Mundo" es asi:
                                    // Hola Mundo
                                    // 0000011111000000 -> los dos primeros byte
                                    //   0x07   0xC0
}MENSAJE; // sizeof(MENSAJE) = 117 byte

const register unsigned short int PINCLOCK = 0;
const register unsigned short int PINDATA = 1;
const register unsigned short int PINCLEAR = 2;
const register unsigned short int PINSTCLOCK = 0;
sbit  PINCLOCK_bit at PORTE.B0;
sbit  PINDATA_bit at PORTE.B1;
sbit  PINCLEAR_bit at PORTE.B2;
sbit  PINSTCLOCK_bit at PORTA.B0;
