#include <16F887.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)

#include <stdlibm.h>    //to use malloc()
#define char byte       //define byte data type


#define BYTE_START   0xFF     //start's byte
#define ADDR_SLAVE   0x01     //Slave Address
#define LONG_INT16   0x00     //how many int16 to send
#define LONG_FLOAT   0x04     //how many float to send

#define SIZE_INT16   0x02     //size of int16 data type
#define SIZE_FLOAT   0x04     //size of float data type

#define CONFIG_BYTES 0x04     //how many config bytes

#define SIZE_INT16_MSG  LONG_INT16*SIZE_INT16
#define SIZE_FLOAT_MSG  LONG_FLOAT*SIZE_FLOAT

#define LENGTH_MSG (SIZE_INT16_MSG + SIZE_FLOAT_MSG + CONFIG_BYTES)

byte *msgTotal;
byte *auxMsg, *aux_rf;

unsigned int16 *int_to_send;
float *float_to_send;



//prototypes

void initArrays(void){
   msgTotal = malloc(LENGTH_MSG);
   auxMsg = malloc(SIZE_FLOAT_MSG);
   aux_rf=malloc(SIZE_FLOAT);
   int_to_send = malloc(SIZE_INT16_MSG);
   float_to_send = malloc(SIZE_FLOAT_MSG);
   
   msgTotal[0] = ADDR_SLAVE;
   msgTotal[1] = LONG_INT16;
   msgTotal[2] = LONG_FLOAT;
   msgTotal[3] = LENGTH_MSG;
}

void buildArrayMsg(){
   byte i=0,j=0,k=0;

   for (i=CONFIG_BYTES, j=0; j < LONG_INT16+CONFIG_BYTES; i+=SIZE_INT16, j++){
      auxMsg = (byte*) &int_to_send[j];   
      for(k = 0; k < SIZE_INT16; k++){
         msgTotal[i+k] = auxMsg[k];
      }
   }

   for (i=SIZE_INT16_MSG+CONFIG_BYTES, j=0; j < LONG_FLOAT; i+=SIZE_FLOAT, j++){
      auxMsg = (byte*) &float_to_send[j];
      for(k = 0; k < SIZE_FLOAT; k++){
         msgTotal[i+k] = auxMsg[k];
      }
   }
}

void sendMsg(void){//funcion que envia el mensaje
   byte check = 0;
   byte i=0;

   buildArrayMsg();

   putc(BYTE_START);
   putc(BYTE_START);

   for(i =0; i< LENGTH_MSG; i++){
      putc(msgTotal[i]);
      check ^= msgTotal[i];
   }
   putc(check);
}


float bytesTofloat(byte *flotantes)//funcion para convertir la union de los 4bytes a flotantes 
{
union uflotant{
byte dato[4];
float float_rcv;

} u;
   for (int i=0;i<4;i++)
   {
   u.dato[i]=flotantes[i];
   }
   return u.float_rcv;
}

