JPEG compressor
Dependencies: SDL_lib SX1276Lib mbed
Revision 2:f256eebcade8, committed 2017-01-11
- 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
--- 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); -}