JPEG compressor

Dependencies:   SDL_lib SX1276Lib mbed

Files at this revision

API Documentation at this revision

Comitter:
miruga27
Date:
Wed Jan 11 20:20:00 2017 +0000
Parent:
1:f0c646dfe574
Commit message:
JPEG Compressor and SX1276 transmitter

Changed in this revision

encoder.cpp Show annotated file Show diff for this revision Revisions of this file
functions.h Show annotated file Show diff for this revision Revisions of this file
lora2.h Show annotated file Show diff for this revision Revisions of this file
lora_tansc.h Show annotated file Show diff for this revision Revisions of this file
--- a/encoder.cpp	Thu Sep 22 00:01:55 2016 +0000
+++ b/encoder.cpp	Wed Jan 11 20:20:00 2017 +0000
@@ -8,34 +8,36 @@
 #include <math.h>
 #include "SDL_lib/SDL.h"
 #include "functions.h"
-//#include "lora2.h"
+#include "lora2.h"
+//#include "sx1276-hal.h"
+//#include "debug.h"
 #include "lora_tansc.h"
 
-DigitalOut myled(LED1);
+//DigitalOut led(LED1);
 DigitalIn button(PC_13);
 
-Serial uart(PA_2, PA_3);
+//Serial uart(PA_2, PA_3);
 
 #define BPS 128000
 #define BITS 8
 #define STOP_BITS 1
  
 
-
 int main(int argc, char *argv[]){
     Serial pc(USBTX, USBRX);
     pc.baud(BPS);
     pc.format (BITS,SerialBase::None, STOP_BITS) ;
+
+    /*led=1;
     
-    myled=1;
-    wait (5);
-    myled=0;
+    wait (2);
+    led=!led;*/
     short int m[HEIGHT][WIDTH][3];
     int i,j,veces=0;
+    //debug( "start of transmission...\r\n" );
+for(veces=0;veces<30;veces++){
     
-for(veces=0;veces<120;veces++){
-    
-    myled=0;
+    //myled=0;
     for(i=0;i<8;i++){
        for(j=0;j<320;j++){
                 
@@ -49,15 +51,15 @@
         
         }
     }
-        
+    
         
-    myled=1;
+    //myled=1;
 
 
     rgb_to_yuv(m);
     
 
- 
+     //debug( "DCT...\r\n" );
     int mat[8][8][3];
     for(i=0;i<HEIGHT;i+=8){
         for(j=0;j<WIDTH;j+=8){
@@ -79,51 +81,89 @@
             }
             
             DCT(mat,m,i,j);// 'i' 'j' índices de los pixeles en x e y del macrobloque
-
+ 
         }
     
     }
 
-   
+    //debug( "CUANTIZAR...\r\n" );   
     cuantizador(m);
 
    
     short int *matriz =(short int *) malloc(sizeof(short int)*HEIGHT*WIDTH*3);
-
+    //debug( "zig-zag...\r\n" );
     zig_zag(m,matriz);//OJO!!!!!
-
-    short int acumulador[3]={0,0,0};
+    //debug( "rlc...\r\n" );
+    short int acumulador[3]={0x0000,0x0000,0x0000};
     RLC(matriz,acumulador);
     
     
     short int * temp1= (short int *) malloc(sizeof(short int)*acumulador[0]);//reserva de memoria exacta para cada una de las componenetes y u v
-    short int * temp2= (short int *) malloc(sizeof(short int)*acumulador[1]);
-    short int * temp3= (short int *) malloc(sizeof(short int)*acumulador[2]);
+    short int * temp2= (short int *) malloc(sizeof(short int)*acumulador[1]);//U
+    short int * temp3= (short int *) malloc(sizeof(short int)*acumulador[2]);//V
+
     RLC2(matriz,temp1,temp2,temp3);
     free(matriz);
 
+    /*acumulador[0]=20;
+    acumulador[1]=20;
+    acumulador[2]=20;*/
     lora(temp1,acumulador[0],temp2,acumulador[1],temp3,acumulador[2]);
-    
+    //debug( "end of transmission...\r\n" );
+
+
     
     free(temp1);
     free(temp2);
     free(temp3);
+    
     while(!pc.writeable());
-    pc.printf("1");//OJO con ponerlo aqui arriba
+    pc.printf("1");//OJO con ponerlo aqui arriba*/
+    
+    char h;
+    h=acumulador[0]&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acumulador[0]>>8) & 0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+
 
 
+    h=acumulador[1]&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acumulador[1]>>8)&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    
+    h=acumulador[2]&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);
+    
+    h=(acumulador[2]>>8)&0xff;
+    
+    while(!pc.writeable());
+    pc.printf("%c",h);//OJO con ponerlo aqui arriba
 }
-
+fuera:
 
  //http://www.martin-gardner.co.uk/how-to-connect-your-old-sd-card-to-an-arduino/
+    DigitalOut led(LED1);
     while(1){
         
-        myled=1;
-        wait(0.2);
-        myled=0;
-        wait(0.2);
+        led=1;
+        wait(0.5);
+        led=0;
+        wait(0.5);
     }
     
-    
 }
-
--- a/functions.h	Thu Sep 22 00:01:55 2016 +0000
+++ b/functions.h	Wed Jan 11 20:20:00 2017 +0000
@@ -9,6 +9,15 @@
 #define DEPTH 24
 #define RAIZ2 1.414214
 #define PI16 0.19635
+const float coeff[8][8]={
+        {1.000, 0.980658, 0.923381, 0.830384, 0.705265, 0.552863, 0.379075, 0.190623},
+        {1.000000, 0.830384, 0.379075, -0.200829, -0.712605, -0.982642, -0.919336, -0.544161},
+        {1.000000, 0.552863, -0.388685, -0.982642, -0.697848, 0.211013, 0.931171, 0.818607},
+        {1.000000, 0.190623, -0.927326, -0.544161, 0.719867, 0.818607, -0.407777, -0.974070},
+        {1.000000, -0.200829, -0.919336, 0.570086, 0.690356, -0.847373, -0.350003, 0.987954},
+        {1.000000, -0.561505, -0.369424, 0.976372, -0.727052, -0.159885, 0.906605, -0.858241},
+        {1.000000, -0.836138, 0.398253, 0.170150, -0.682790, 0.971663, -0.942098, 0.603785},
+        {1.000000, -0.982642, 0.931171, -0.847373, 0.734158, -0.595456, 0.436082, -0.261569} };
 
 
 void DCT(int matrix[8][8][3],short int f[HEIGHT][WIDTH][3],int p_fil,int p_col){
@@ -44,8 +53,11 @@
 
                 for(j=0;j<8;j++){
 
-                    dato=(float)(cos((float)(((j*2)+1)*(v-p_col)*PI16)));
-                    dato2=(float)(cos((float)(((i*2)+1)*(u-p_fil)*PI16)));
+                    /*dato=(float)(cos((float)(((j*2)+1)*(v-p_col)*PI16)));
+                    dato2=(float)(cos((float)(((i*2)+1)*(u-p_fil)*PI16)));*/
+                    
+                    dato=coeff[j][v-p_col];//(float)(cos((float)(((j*2)+1)*(v-p_col)*PI16)));//
+                    dato2=coeff[i][u-p_fil];
 
                     acum0+=(float)(dato*dato2*(matrix[i][j][0]));//crominancia V
                     acum1+=(float)(dato*dato2*(matrix[i][j][1]));//crominancia U
@@ -197,10 +209,10 @@
 
     int i,k=0,acum_y=0,acum_u=0,acum_v=0;
     short int y,u,v,y_ant=0,u_ant=0,v_ant=0,flag=0;
-    int cont[3]={1,1,1};
-    acumulador[0]=0;
-    acumulador[1]=0;
-    acumulador[2]=0;
+    short int cont[3]={1,1,1};
+    acumulador[0]=0x0000;
+    acumulador[1]=0x0000;
+    acumulador[2]=0x0000;
 
     int index=0;
     for(i=0;i<WIDTH*HEIGHT*3;i+=3){
--- a/lora2.h	Thu Sep 22 00:01:55 2016 +0000
+++ b/lora2.h	Wed Jan 11 20:20:00 2017 +0000
@@ -115,4 +115,3 @@
 
 #endif // __MAIN_H__
 
-int lora(short int *m,int *cont_y,int *cont_u,int *cont_v)  ;
\ No newline at end of file
--- a/lora_tansc.h	Thu Sep 22 00:01:55 2016 +0000
+++ b/lora_tansc.h	Wed Jan 11 20:20:00 2017 +0000
@@ -1,30 +1,25 @@
-//Author: Miguel Ruiz García
-//Company: University of Cantabria. 2016
-//mail: mrg47@alumnos.unican.es
-//code for TX & RX
 #include "mbed.h"
 #include "lora2.h"
 #include "sx1276-hal.h"
 #include "debug.h"
-//#include "functions.h"
+ 
 /* Set this flag to '1' to display debug messages on the console */
-#define DEBUG_MESSAGE   1
-
-
+#define DEBUG_MESSAGE   0
+ 
 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
 #define USE_MODEM_LORA  1
 #define USE_MODEM_FSK   !USE_MODEM_LORA
-
-#define RF_FREQUENCY                                    869000000 // Hz
-#define TX_OUTPUT_POWER                                 14        // 14 dBm
-
+ 
+#define RF_FREQUENCY                                    868000000 // Hz
+#define TX_OUTPUT_POWER                                 20        // 14 dBm
+ 
 #if USE_MODEM_LORA == 1
-
-    #define LORA_BANDWIDTH                              1         // [0: 125 kHz,
+ 
+    #define LORA_BANDWIDTH                              2         // [0: 125 kHz,
                                                                   //  1: 250 kHz,
                                                                   //  2: 500 kHz,
                                                                   //  3: Reserved]
-    #define LORA_SPREADING_FACTOR                       10         // [SF7..SF12]
+    #define LORA_SPREADING_FACTOR                       7        // [SF7..SF12]
     #define LORA_CODINGRATE                             1         // [1: 4/5,
                                                                   //  2: 4/6,
                                                                   //  3: 4/7,
@@ -32,13 +27,13 @@
     #define LORA_PREAMBLE_LENGTH                        8         // Same for Tx and Rx
     #define LORA_SYMBOL_TIMEOUT                         5         // Symbols
     #define LORA_FIX_LENGTH_PAYLOAD_ON                  false
-    #define LORA_FHSS_ENABLED                           true  
+    #define LORA_FHSS_ENABLED                           false  
     #define LORA_NB_SYMB_HOP                            4     
     #define LORA_IQ_INVERSION_ON                        false
     #define LORA_CRC_ENABLED                            true
     
 #elif USE_MODEM_FSK == 1
-
+ 
     #define FSK_FDEV                                    25000     // Hz
     #define FSK_DATARATE                                19200     // bps
     #define FSK_BANDWIDTH                               50000     // Hz
@@ -50,17 +45,16 @@
 #else
     #error "Please define a modem in the compiler options."
 #endif
-
-#define RX_TIMEOUT_VALUE                                3500000   // in us
-#define BUFFER_SIZE                                     255        // Define the payload size here [min:1 max:255]
-
+ 
+#define RX_TIMEOUT_VALUE                                7500000   // in us
+#define BUFFER_SIZE                                     32       // Define the payload size here
+ 
 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
 DigitalOut led(LED2);
 #else
 DigitalOut led(LED1);
 #endif
-
-
+ 
 /*
  *  Global variables declarations
  */
@@ -79,82 +73,86 @@
     CAD,
     CAD_DONE
 }AppStates_t;
-
+ 
 volatile AppStates_t State = LOWPOWER;
-
+ 
 /*!
  * Radio events function pointer
  */
 static RadioEvents_t RadioEvents;
-
+ 
 /*
  *  Global variables declarations
  */
 SX1276MB1xAS Radio( NULL );
-
+ 
 const uint8_t PingMsg[] = "PING";
 const uint8_t PongMsg[] = "PONG";
+ 
+
 const uint8_t AckMsg[] = "ACK";
 const uint8_t EOPMsg[] = "EOP";
 const uint8_t RfSMsg[] = "RfS";
+
+const uint8_t RfSY[] = "RfSy";
+const uint8_t RfSU[] = "RfSu";
+const uint8_t RfSV[] = "RfSv";
+const uint8_t InitMsg[] = "INIT";
+const uint8_t PaqMsg[] = "\t\n";
+
 int py=0,pu=0,pv=0,py2=0,pu2=0,pv2=0;
 int py_ant=0,pu_ant=0,pv_ant=0;
 int flag_y=0,flag_u=0,flag_v=0;
 uint16_t BufferSize = BUFFER_SIZE;
 uint8_t Buffer[BUFFER_SIZE];
+int empezar=0;
 //uint8_t Buffer2[4];
-
+int init=0;
 int16_t RssiValue = 0.0;
 int8_t SnrValue = 0.0;
-
+short int init_packet=0;
+int start=0;
 bool first_y=true,first_u=true,first_v=true;
-void lora(short int *temp1,short int index1,short int *temp2,short int index2,short int *temp3,short int index3) 
+ 
+void lora(short int *temp1,short int index1,short int *temp2,short int index2,short int *temp3,short int index3)
 {
-    //index1=300;index2=300;index3=300;
     uint8_t i;
-    bool isMaster = true;//MASTER (TX) OR SLAVE(RX) ?
+    bool isMaster = true;
     
-    //pc.baud(BPS);
-    //pc.format (BITS,SerialBase::None, STOP_BITS) ;
-   
 
-    
-    //debug( "\n\n\r     SX1276 Ping Pong Demo Application \n\n\r" );
-    //pc.printf("\n\n\r     SX1276 Image transfer Application \n\n\r");
-
+//    debug( "\n\n\r     SX1276 JPEG Compressor Application \n\n\r" );
+ 
     // Initialize Radio driver
     RadioEvents.TxDone = OnTxDone;
     RadioEvents.RxDone = OnRxDone;
     RadioEvents.RxError = OnRxError;
     RadioEvents.TxTimeout = OnTxTimeout;
     RadioEvents.RxTimeout = OnRxTimeout;
-    RadioEvents.FhssChangeChannel = OnFhssChangeChannel;
     Radio.Init( &RadioEvents );
     
     // verify the connection with the board
-    goto start;
     while( Radio.Read( REG_VERSION ) == 0x00  )
     {
-        //debug( "Radio could not be detected!\n\r", NULL );
-        //pc.printf( "Radio could not be detected!\n\r", NULL );
+        
+        debug( "Radio could not be detected!\n\r", NULL );
         wait( 1 );
     }
-    start:        
+            
     //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , "\n\r > Board Type: SX1276MB1LAS < \n\r" );
     //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , "\n\r > Board Type: SX1276MB1MAS < \n\r" );
     
-    Radio.SetChannel( HoppingFrequencies[0] ); 
-
+    Radio.SetChannel( RF_FREQUENCY ); 
+ 
 #if USE_MODEM_LORA == 1
     
-    //debug_if( LORA_FHSS_ENABLED, "\n\n\r             > LORA FHSS Mode < \n\n\r");
+//    debug_if( LORA_FHSS_ENABLED, "\n\n\r             > LORA FHSS Mode < \n\n\r");
     //debug_if( !LORA_FHSS_ENABLED, "\n\n\r             > LORA Mode < \n\n\r");
-
+ 
     Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                          LORA_SPREADING_FACTOR, LORA_CODINGRATE,
                          LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
                          LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 
-                         LORA_IQ_INVERSION_ON, 4000000 );
+                         LORA_IQ_INVERSION_ON, 2000000 );
     
     Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
                          LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
@@ -163,12 +161,12 @@
                          LORA_IQ_INVERSION_ON, true );
                          
 #elif USE_MODEM_FSK == 1
-
+ 
     debug("\n\n\r              > FSK Mode < \n\n\r");
     Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
                          FSK_DATARATE, 0,
                          FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
-                         FSK_CRC_ENABLED, 0, 0, 0, 3000000 );
+                         FSK_CRC_ENABLED, 0, 0, 0, 2000000 );
     
     Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
                          0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
@@ -176,18 +174,20 @@
                          0, 0, false, true );
                          
 #else
-
+ 
 #error "Please define a modem in the compiler options."
-
+ 
 #endif
-    
-    //debug_if( DEBUG_MESSAGE, "Starting image transmission loop\r\n" ); 
-    //pc.printf("Starting image transmission loop\r\n");
+     
+    //debug_if( DEBUG_MESSAGE, "Starting Ping-Pong loop\r\n" ); 
         
     led = 0;
-   
+    flag_y=0,flag_u=0,flag_v=0;
+    first_y=true,first_u=true,first_v=true;
+    
+    int finish=0,start=0;
     Radio.Rx( RX_TIMEOUT_VALUE );
-    State=TX;
+    
     while( 1 )
     {
         switch( State )
@@ -195,35 +195,190 @@
         case RX:
             if( isMaster == true )
             {
-                //debug( "waiting for response....\r\n" );
                 if( BufferSize > 0 )
                 {
                     
-                    if( strncmp( ( const char* )Buffer, ( const char* )AckMsg, 3 ) != 0 )
+                    if( strncmp( ( const char* )Buffer, ( const char* )AckMsg, 3 ) == 0 )
                     {
                         led = !led;
-                        //debug( "Packet acknoledged....\r\n" );
-      //                  pc.printf( "Packet acknoledged....\r\n" );
-                        // Send the next  frame            
-                        State = TX;
+ //                       debug( "...Ack RX\r\n" );
+                        
+                        Buffer[0]='\t';
+                        Buffer[1]='\n';
+                        //index1=22;index2=25;index3=25;
+                        int pointer=0;
+                        py_ant=py;pu_ant=pu;pv_ant=pv;
+                        for(pointer=2;pointer<BufferSize;pointer+=2){
+                    
+                            if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
+                                if(first_y == true) {//en primer lugar se manda la longitud de la componente y u v 
+                                    Buffer[pointer]=index1&0xff;//Se carga la parte baja del short int y en el siguiente byte se carga la parte alta.
+                                    Buffer[pointer+1]=(index1>>8)&0xff;
+   //                                 debug("%c %c \r\n",Buffer[pointer],Buffer[pointer+1]);
+                                    first_y = false;
+   //                                  debug( "transmitting y length...\r\n" );
+   //                                  debug( " %u %u ...\r\n",Buffer[pointer],Buffer[pointer+1]);
+                                }
+                                 else{
+   //                                 debug( "py= %i..\r\n",py );
+                                    Buffer[pointer]=*(temp1+py) & 0xff;
+                                    
+                                    Buffer[pointer+1]=(*(temp1+py)>>8) & 0xff;
+                                    py++;
+   //                                 debug( "transmitting y data %i..\r\n",py );
+                                    if(py >= index1) {
+   //                                     debug( "py final = %i...\r\n",py );
+                                        flag_y=1;
+                                        
+                                        break;
+
+                                    }
+                                }
+                            }
+                            else if(flag_u==0){
+                                if(first_u == true) {
+   //                                 debug( "pu= %i..\r\n",pu );
+                                    Buffer[pointer]=index2&0xff;
+                                    Buffer[pointer+1]=(index2>>8)&0xff;
+                                    first_u = false;
+   //                                 debug( "transmitting u length...\r\n" );
+   //                                 debug( " %u %u ...\r\n",Buffer[pointer],Buffer[pointer+1]);
+                                }
+                                else{
+                                
+                                    Buffer[pointer]=*(temp2+pu) & 0xff;
+                                    Buffer[pointer+1]=(*(temp2+pu)>>8) & 0xff;
+                                    pu++;
+   //                                debug( "transmitting u data...\r\n" );
+                                    if(pu>= index2) {
+                                        flag_u=1;
+                                        
+                                        break;
+                                    }
+                                } 
+                            }
+                        
+                            else{
+                                if(first_v == true) {
+                                    Buffer[pointer]=index3&0xff;
+                                    Buffer[pointer+1]=(index3>>8)&0xff;
+                                    first_v = false;
+   //                                 debug( "transmitting v length...\r\n" );
+   //                                 debug( " %u %u ...\r\n",Buffer[pointer],Buffer[pointer+1]);
+                                }
+                                else{
+   //                                 debug( "pv= %i..\r\n",pv );
+                                    Buffer[pointer]=*(temp3+pv) & 0xff;
+                                    Buffer[pointer+1]=(*(temp3+pv)>>8) & 0xff;
+                                    pv++;
+   //                                 debug( "transmitting v data ...\r\n" );
+                                    if(pv >= index3) {
+                                        flag_v=1;
+                                        
+                                        break;
+                                    }
+                                }
+                            }
+                        
+                        
+                        }
+                    if(finish==1){
+                        flag_y=0;flag_u=0;flag_v=0;
+                        py=0;pu=0;pv=0;
+                        first_y=true;first_u=true;first_v=true;
+                        start=0;
+                        goto end;
                     }
-                    
-                    else if( strncmp( ( const char* )Buffer, ( const char* )RfSMsg, 3 ) == 0 ){
                         
-                            led = !led;
-                            debug( "Retransmit packet....\r\n" );
-        //                    pc.printf( "Retransmit packet....\r\n" );
-                            // Send the next  frame            
-                            State = TX;
-                            py=py_ant; pu=pu_ant; pv=pv_ant;//Si hay que reenviar el paquete se reestablecen los valores de punteros.
-                    }                        
+                    //debug( "end of cycle..\r\n" );
                     
-                    else // valid reception but neither a  message
+                    if(flag_y==1 && flag_u==1 && flag_v==1){ 
+                        //flag_y=0;flag_u=0;flag_v=0;
+                        //py_ant=0;pu_ant=0;pv_ant=0;
+                        py=0;pu=0;pv=0;
+                        //start=0;
+   //                     debug( "finished transmission ...\r\n" );
+                        //first_y=true;first_u=true;first_v=true;
+                        finish=1;
+                        
+
+                    }
+
+
+                
+                    for( i = pointer; i < BufferSize; i++ )
+                        {
+                            Buffer[i] = i - 4;
+                        }
+                    wait_ms( 10 );                
+   //                 debug( "Sending packet...\r\n" );
+                    Radio.Send( Buffer, BufferSize );
+                    //if(finish==1) goto end;
+                    }
+
+                    else // valid reception but neither a PING or a PONG message
                     {    // Set device as master ans start again
-                      debug( "no message received...\r\n" );
-          //          pc.printf( "hola...\r\n" );
-                        isMaster = true;//this intruction is DANGEROUS!!!!!!
-                        Radio.Rx( RX_TIMEOUT_VALUE );
+                        isMaster = true;
+  //                      debug("RfS received...\r\n");
+                        if(strncmp( ( const char* )Buffer, ( const char* )RfSY, 4 ) == 0 ) {
+                                    
+                                    py=py_ant;
+                                    //py-=15;
+                                    /*py=0xff & Buffer[6];
+                                    py=py<<8;
+                                    py=py | (Buffer[5] & 0xff);*/
+                                    flag_y=0;
+                                    if(py<=0) {
+                                       first_y=true;
+                                       py=0;
+                                    }
+                                       
+                        }
+                        else if(strncmp( ( const char* )Buffer, ( const char* )RfSU, 4 ) == 0) {
+                                    pu=pu_ant;
+                                    //pu-=15;
+                                   /* pu=0xff & Buffer[6];
+                                    pu=pu<<8;
+                                    pu=pu | (Buffer[5] & 0xff);*/
+                                    flag_u=0;
+                                    if(pu<=0) {
+                                       first_u=true;
+                                       pu=0;
+                                    }
+                                       
+                        }
+                        else {
+                                    pv=pv_ant;
+                                    //pv-=15;
+                                    /*pv=0xff & Buffer[6];
+                                    pv=pv<<8;
+                                    pv=pv | (Buffer[5] & 0xff);*/
+                                    
+                                    flag_v=0;
+                                    if(pv<=0) {
+                                       first_v=true;
+                                       pv=0;
+                                    }
+                                       
+                        }
+                        
+                        strcpy( ( char* )Buffer, ( char* )InitMsg );
+                        Buffer[4]=py&0xff;
+                        Buffer[5]=(py>>8)&0xff;
+                        
+                        Buffer[6]=pu&0xff;
+                        Buffer[7]=(pu>>8)&0xff;
+                        Buffer[8]=pv&0xff;
+                        Buffer[9]=(pv>>8)&0xff;
+                        // We fill the buffer with numbers for the payload 
+                        for( i = 10; i < BufferSize; i++ )
+                        {
+                            Buffer[i] = i - 4;
+                        }
+                        wait_ms( 10 );  
+                        Radio.Send( Buffer, BufferSize );
+                        
+
                     }    
                 }
             }
@@ -231,331 +386,145 @@
             {
                 if( BufferSize > 0 )
                 {
-                    
+                    if( strncmp( ( const char* )Buffer, ( const char* )InitMsg, 4 ) == 0 )
+                    {
                         led = !led;
-                        debug( "Reading... \r\n" );
-            //            pc.printf( "Reading... \r\n" );
-                        
-                    int pointer=0;
-                    int length_y=0,length_v=0,length_u=0;
-                    for(pointer=0;pointer<254;pointer+=4){
-                        if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
-                            if(first_y == true) {//EL PRIMER DATO ES LA LONGITUD
-                                length_y=0xff & Buffer[pointer+1];
-                                length_y=length_y<<8;
-                                length_y=length_y | Buffer[pointer];
-                                first_y = false;
-                                temp1=(short int *)malloc(sizeof(short int)*length_y);
-                                pointer-=2;//this is to avoid lose the first byte of the component
-                                //in the cycle 'pointer+=4' but in the first package of the component there´s no a pair [length,value]
-                                
-                            }
-                            else{
-                                if(Buffer[pointer]!='\t'){//VERIFY the character is not EOC (end of component y u v)
-                        
-                                    short int num=0;
-                                    num=0xff & Buffer[pointer+1];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer];
-                                    *(temp1+py2)=num;
-                                    py2++;
-                                    
-                                    if (py2 > length_y) {flag_y=1;}
-                                    
-                                    num=0xff & Buffer[pointer+3];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer+2];
-                                    *(temp1+py2)=num;
-                                     py2++;
-                                     
-                                     if (py2 > length_y) {flag_y=1;}//if all bytes of the component are read, flag raised
-                                     //originally designed with goto.
-                                }
-                                else {
-                                    flag_y=1;
-                                }
-                            }
-                        }
-                            
-                        
-                        else if(flag_u==0){
-                            if(first_u == true) {
-                                length_u=0xff & Buffer[pointer+1];
-                                length_u=length_u<<8;
-                                length_u=length_u | Buffer[pointer];
-                                first_u = false;
-                                temp2=(short int *)malloc(sizeof(short int)*length_u);
-                                pointer-=2;
-                            }
-                            else{
-                                if(Buffer[pointer]!='\t'){//VERIFY the character is not "end of component"
-                        
-                                    short int num=0;
-                                    num=0xff & Buffer[pointer+1];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer];
-                                    *(temp2+pu2)=num;
-                                    pu2++;
-                                    
-                                    if (pu2 > length_u) {flag_u=1;}
-                                    
-                                    num=0xff & Buffer[pointer+3];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer+2];
-                                    *(temp2+pu2)=num;
-                                     pu2++;
-                                     
-                                     if (pu2 > length_u) {flag_u=1;}
-                                }
-                                else {
-                                    flag_u=1;
-                                }
-                            }
-                        }
-                        
-                        else{
-                            if(first_v == true) {
-                                length_v=0xff & Buffer[pointer+1];
-                                length_v=length_v<<8;
-                                length_v=length_v | Buffer[pointer];
-                                first_v = false;
-                                temp3=(short int *)malloc(sizeof(short int)*length_v);
-                                pointer-=2;
-                            }
-                            else{
-                                if(Buffer[pointer]!='\n'){//VERIFY the character is not EOT
-                        
-                                    short int num=0;
-                                    num=0xff & Buffer[pointer+1];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer];
-                                    *(temp3+pv2)=num;
-                                    py2++;
-                                    
-                                    if (pv2 > length_v) {flag_v=1;}
-                                    
-                                    num=0xff & Buffer[pointer+3];
-                                    num=num<<8;
-                                    num=num | Buffer[pointer+2];
-                                    *(temp3+pv2)=num;
-                                     pv2++;
-                                     
-                                     if (pv2 > length_v) {flag_v=1;}
-                                }
-                                else {
-                                    flag_v=1;
-                                    break;
-                                }
-                            }
-                        }
-         
-                        
-                    }
-                    if(flag_y==1 && flag_u==1 && flag_v ==1){ 
+           //             debug( "...Init received\r\n" );
+                        // Send the reply to the PING string
                         strcpy( ( char* )Buffer, ( char* )AckMsg );
                         // We fill the buffer with numbers for the payload 
-                            for( i = 4; i < BufferSize; i++ )
-                            {
+                        for( i = 3; i < BufferSize; i++ )
+                        {
                             Buffer[i] = i - 4;
-                            }
+                        }
                         wait_ms( 10 );  
                         Radio.Send( Buffer, BufferSize );
-                        
-                        first_y=true;first_u=true;first_v=true;
+                    }
+                    else if( strncmp( ( const char* )Buffer, ( const char* )PaqMsg, 2 ) == 0 )
+                    { // A master already exists then become a slave
                         
-                       // debug( "Packet received \r\n" );
-              //          pc.printf( "Packet received \r\n" );
-                        State = LOWPOWER;
-                        goto end;
-                       
+           //             debug( "...Receiving data TX \r\n" );
+                        led = !led;
+                        //isMaster = false;
+                        // Send the next PONG frame            
+                        strcpy( ( char* )Buffer, ( char* )AckMsg );
+                        // We fill the buffer with numbers for the payload 
+                        for( i = 4; i < BufferSize; i++ )
+                        {
+                            Buffer[i] = i - 4;
+                        }
+                        wait_ms( 10 ); 
+                        Radio.Send( Buffer, BufferSize );
                     }
-                    
-                    State=TX;
+                    else // RfS
+                    {    // Set device as master and start again
+
+                        Radio.Rx( RX_TIMEOUT_VALUE );
+                    }    
                 }
             }
-            
+            State = LOWPOWER;
             break;
         case TX:    
             led = !led; 
             if( isMaster == true )  
             {
-                //debug( "transmission of packet (320x8)...\r\n" );
-                //pc.printf( "transmission of packet (320x8)...\r\n" );
-                int pointer=0;
                 
-                
-                    py_ant=py;pu_ant=pu;pv_ant=pv;
-                    for(pointer=0;pointer<254;pointer+=2){
-                    
-                        if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
-                            if(first_y == true) {//en primer lugar se manda la longitud de la componente y u v 
-                                Buffer[pointer]=index1&0xff;
-                                Buffer[pointer+1]=(index1>>8)&0xff;
-                                first_y = false;
-                                 //debug( "transmitting y length...\r\n" );
-                            }
-                            else{
-                                Buffer[pointer]=*(temp1+py) & 0x00ff;
-                                Buffer[pointer+1]=(*(temp1+py)>>8) & 0x00ff;
-                                py++;
-                                // debug( "transmitting y data..\r\n" );
-                                if(py >= index1) {
-                                    flag_y=1;
-                                    Buffer[pointer+2]='\t';
-                                    pointer+=2;
-                                }
-                            }
-                        }
-                        else if(flag_u==0){
-                            if(first_u == true) {
-                                Buffer[pointer]=index2&0xff;
-                                Buffer[pointer+1]=(index2>>8)&0xff;
-                                first_u = false;
-                                //debug( "transmitting u length...\r\n" );
-                            }
-                            else{
-                                Buffer[pointer]=*(temp2+pu) & 0x00ff;
-                                Buffer[pointer+1]=(*(temp2+pu)>>8) & 0x00ff;
-                                pu++;
-                                //debug( "transmitting u data...\r\n" );
-                                if(pu>= index2) {
-                                    flag_u=1;
-                                    Buffer[pointer+2]='\t';
-                                    pointer+=2;
-                                }
-                            }
-                        }
-                        
-                        else{
-                            if(first_v == true) {
-                                Buffer[pointer]=index2&0xff;
-                                Buffer[pointer+1]=(index2>>8)&0xff;
-                                first_v = false;
-                                //debug( "transmitting v length...\r\n" );
-                            }
-                            else{
-                                Buffer[pointer]=*(temp3+pv) & 0x00ff;
-                                Buffer[pointer+1]=(*(temp3+pv)>>8) & 0x00ff;
-                                pv++;
-                                //debug( "transmitting v data ...\r\n" );
-                                if(pv >= index3) {
-                                    flag_v=1;
-                                    Buffer[pointer+2]='\n';//salto de línea es EOT  
-                                    pointer+=2;
-                                    break;
-                                }
-                            }
-                        }
-                        
-                        
-                    }
-                    
-                    if(flag_y==1 && flag_u==1 && flag_v==1){
-                        Buffer[pointer]='\n';//salto de línea es EOT  
-                        flag_y=0;flag_u=0;flag_v=0;
-                        //debug( "finished transmission ...\r\n" );
-                        first_y=true;first_u=true;first_v=true;
-                        goto end;
-                        for( i = Buffer[pointer]; i < BufferSize; i++ )
-                        {
-                            Buffer[i] = i - 4;
-                        }
-                    }
-                    else{
-                        for( i = Buffer[pointer]; i < BufferSize; i++ )
-                        {
-                            Buffer[i] = i - 4;
-                        }
-                    }
-
-                
-
-                wait_ms( 10 ); 
-                //debug( "Sending packet...\r\n" );
-                Radio.Send( Buffer, BufferSize );
-                
-               // pc.printf( "Sending packet...\r\n" );
+  //              debug( "Iransmitting packet TX...\r\n" );
+                    //if(finish==1) goto end;
             }
-                
             else
             {
-                //debug( "hola...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                strcpy( ( char* )Buffer, ( char* )AckMsg );
-                for( i = 4; i < BufferSize; i++ )
-                {
-                    Buffer[i] = i - 4;
-                }
-                wait_ms( 10 ); 
-                Radio.Send( Buffer, BufferSize );
-                Radio.Rx( RX_TIMEOUT_VALUE );  
-            }  
-            
-            State = RX;
+  //              debug( "ACK RX...\r\n" );
+            }
+            Radio.Rx( RX_TIMEOUT_VALUE );
+            State = LOWPOWER;
             break;
         case RX_TIMEOUT:
             if( isMaster == true )
             {
-                //debug( "hola rx_timeout...\r\n" );
-                //pc.printf( "hola...\r\n" );
+                // Send the next PING frame
+                
+                    
+  //                  debug("start!\r\n");//empezamos aqui
+                    //py-=15;pu-=15;pv-=15;
+                    if(start==0) {
+                        py=0;pu=0;pv=0;
+                        start=1;
+                    }
+                    else{
+                            py=py_ant;pu=pu_ant;pv=pv_ant;
+                                    
+                                    if(pv<=0) {
+                                       flag_v=0;
+                                       first_v=true;
+                                       pv=0;
+                                    }
+                                    if(pu<=0) {
+                                       flag_u=0;
+                                       first_v=true;
+                                       pu=0;
+                                    }
+                                    if(py<=0) {
+                                       flag_y=0;
+                                       first_v=true;
+                                       py=0;
+                                    }
+                    }                
+                    strcpy( ( char* )Buffer, ( char* )InitMsg );
+                                            Buffer[4]=py&0xff;
+                        Buffer[5]=(py>>8)&0xff;
+                        
+                                                Buffer[6]=pu&0xff;
+                        Buffer[7]=(pu>>8)&0xff;
+                                                Buffer[8]=pv&0xff;
+                        Buffer[9]=(pv>>8)&0xff;
+                    for( i = 10; i < BufferSize; i++ )
+                    {
+                        Buffer[i] = i - 4;
+                    }
+                    
+                    wait_ms( 10 ); 
+                    Radio.Send( Buffer, BufferSize );
+                
+
+                Radio.Rx( RX_TIMEOUT_VALUE );
+            }
+            else
+            {
+                Radio.Rx( RX_TIMEOUT_VALUE );  
+            }             
+            State = LOWPOWER;
+            break;
+        case RX_ERROR:
+            // We have received a Packet with a CRC error, send reply as if packet was correct
+            if( isMaster == true )
+            {
                 // Send the next PING frame
                 strcpy( ( char* )Buffer, ( char* )RfSMsg );
                 for( i = 4; i < BufferSize; i++ )
                 {
                     Buffer[i] = i - 4;
                 }
-                wait_ms( 10 ); 
+  //             debug("CRC error!\r\n");//empezamos aqui
+                //py=py_ant;pu=pu_ant;pv=pv_ant;
+                wait_ms( 10 );  
                 Radio.Send( Buffer, BufferSize );
+
+                
             }
             else
             {
-                //debug( "hola...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                strcpy( ( char* )Buffer, ( char* )RfSMsg );
+                // Send the next PONG frame
+                strcpy( ( char* )Buffer, ( char* )AckMsg );
                 for( i = 4; i < BufferSize; i++ )
                 {
                     Buffer[i] = i - 4;
                 }
-                wait_ms( 10 ); 
-                Radio.Send( Buffer, BufferSize );
-                Radio.Rx( RX_TIMEOUT_VALUE );  
-            }             
-            State = LOWPOWER;
-            break;
-
-        case RX_ERROR:
-            // We have received a Packet with a CRC error, request packet again.
-            if( isMaster == true )
-            {
-                
-                //debug( "hola rx_error...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                strcpy( ( char* )Buffer, ( char* )RfSMsg);
-                for( i = 4; i < BufferSize; i++ )
-                {
-                    Buffer[i] = i - 4;
-                }
-                
                 wait_ms( 10 );  
                 Radio.Send( Buffer, BufferSize );
-                State = LOWPOWER;
             }
-            else
-            {
-                //debug( "hola ...\r\n" );
-                //pc.printf( "hola...\r\n" );
-                // Send the RfS again
-                strcpy( ( char* )Buffer, ( char* )RfSMsg);
-                for( i = 4; i < BufferSize; i++ )
-                {
-                    Buffer[i] = i - 4;
-                }
-                py=py_ant;pu=pu_ant;pv=pv_ant;
-                wait_ms( 10 );  
-                Radio.Send( Buffer, BufferSize );
-                State = LOWPOWER;
-            }
-            //State = LOWPOWER;
+            State = LOWPOWER;
             break;
         case TX_TIMEOUT:
             Radio.Rx( RX_TIMEOUT_VALUE );
@@ -571,18 +540,16 @@
     end:
     int a;
 }
-
+ 
 void OnTxDone( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     State = TX;
     debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" );
 }
-
+ 
 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     BufferSize = size;
     memcpy( Buffer, payload, BufferSize );
@@ -591,34 +558,25 @@
     State = RX;
     debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" );
 }
-
+ 
 void OnTxTimeout( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     State = TX_TIMEOUT;
-    //debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
+    debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
 }
-
+ 
 void OnRxTimeout( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     Buffer[ BufferSize ] = 0;
     State = RX_TIMEOUT;
-    //debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
+    debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
 }
-
+ 
 void OnRxError( void )
 {
-    Radio.SetChannel( HoppingFrequencies[0] );
     Radio.Sleep( );
     State = RX_ERROR;
     debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
 }
-
-void OnFhssChangeChannel( uint8_t channelIndex )
-{
-    Radio.SetChannel( HoppingFrequencies[channelIndex] );
-    debug_if( DEBUG_MESSAGE, "F%d-", channelIndex);
-}