/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

   FILL_API_PACKET

   :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
void fill_api_packet( byte *p, int size )
{
   for( int i = 1; i < size; i++ )
      p[ i ] = Serial.read();
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

   PRINT_API_PACKET

   :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
void print_api_packet( byte *packet, int size )
{
   if( size == 0 )
      return;
   else
   {
      Serial.print( "0x" );
      Serial.print( packet[ 0 ], HEX );

      for( int i = 1; i < size; i++ )
      {
         Serial.print( " + 0x" );
         Serial.print( packet[ i ], HEX );
      }
   }
   
   Serial.print( "\r\n" );
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

   GET SERIAL DATA FROM

   :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
inline int get_serial_data_from( byte *a )
{
   return ( int ) a[ IO_DATA_SAMPLE_API_PACKET_SIZE - 3 ] + 
          ( int ) a[ IO_DATA_SAMPLE_API_PACKET_SIZE - 2 ];
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

   CONFIRM CHECKSUM

   :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
int checksum_confirmed_in( byte *p )
{
   static byte my_checksum;
   static byte xbee_checksum;
   static byte full_checksum;
   static byte data_between_length_and_last;

   static int i;
   static int size;
   static int analog_sample;
   static int state;

   size = ( int ) p[ LENGTH_LSB ];

   for( i = 0, data_between_length_and_last = 0; i < size; i++ )
      data_between_length_and_last += p[ LENGTH_LSB + 1 + i ];

   my_checksum = 
      0xFF & ( 0xFF - data_between_length_and_last );

   xbee_checksum = 
      0xFF & p[ ( IO_DATA_SAMPLE_API_PACKET_SIZE - 1 ) ];

   full_checksum = 
      0xFF & 
      ( data_between_length_and_last + 
      p[ ( IO_DATA_SAMPLE_API_PACKET_SIZE - 1 ) ] );

   state = ( ( my_checksum == xbee_checksum ) && 
             ( full_checksum == CHECKSUM ) ) ? VALID : INVALID;

   return state;
}