H261 decoder
Dependencies: SDL_lib2 SX1276Lib mbed
Revision 1:1ed97958d0f3, committed 2017-01-11
- Comitter:
- miruga27
- Date:
- Wed Jan 11 20:18:38 2017 +0000
- Parent:
- 0:5bd441b8ab2d
- Commit message:
- JPEG Compressor and SX1276 transmitter
Changed in this revision
diff -r 5bd441b8ab2d -r 1ed97958d0f3 functions_dec.h --- a/functions_dec.h Thu Sep 22 00:04:30 2016 +0000 +++ b/functions_dec.h Wed Jan 11 20:18:38 2017 +0000 @@ -25,6 +25,16 @@ #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 IDCT(int matrix[8][8][3],short int f[HEIGHT][WIDTH][3],int p_fil,int p_col){ int i=0,j=0,u,v; float cu=1,cv=1; @@ -45,7 +55,8 @@ float dato=0.0; float dato2=0.0; float dato3=0.0; - + + float acum0=0.0,acum1=0.0,acum2=0.0; for(u=0;u<8;u++){ @@ -59,26 +70,28 @@ } else cv=1.0; - dato=(float)(cos((float)((((+j-p_col)<<1)+1)*v*PI16))); - dato2=(float)(cos((float)((((i-p_fil)<<1)+1)*u*PI16))); + /*dato=(float)(cos((float)((((j-p_col)*2)+1)*v*PI16))); + dato2=(float)(cos((float)((((i-p_fil)*2)+1)*u*PI16)));*/ + dato=coeff[j-p_col][v];//(float)(cos((float)((((j-p_col)*2)+1)*v*PI16))); + dato2=coeff[i-p_fil][u];//(float)(cos((float)((((i-p_fil)*2)+1)*u*PI16))); dato3=(float)((cu*cv)/4); - f[i][j][0]+=(short int)(dato*dato2*(matrix[u][v][0]))*dato3;//crominancia - f[i][j][1]+=(short int)(dato*dato2*(matrix[u][v][1]))*dato3;//crominancia - f[i][j][2]+=(short int)(dato*dato2*(matrix[u][v][2]))*dato3;//luminancia + acum0+=(float)(dato*dato2*(matrix[u][v][0]))*dato3;//crominancia + acum1+=(float)(dato*dato2*(matrix[u][v][1]))*dato3;//crominancia + acum2+=(float)(dato*dato2*(matrix[u][v][2]))*dato3;//luminancia } } - - - + + f[i][j][0]=(short int)acum0; + f[i][j][1]=(short int)acum1; + f[i][j][2]=(short int)acum2; } } - } void yuv_to_rgb(short int f[HEIGHT][WIDTH][3]){ @@ -87,7 +100,7 @@ int i=0,j=0; float r=0.0,g=0.0,b=0.0; - char cad[180]; + int cont; @@ -96,16 +109,16 @@ - b=(f[i][j][2]-16)*1.164+(f[i][j][1]-128)*2.017; - g=(f[i][j][2]-16)*1.164-(f[i][j][0]-128)*0.813-(f[i][j][1]-128)*0.392; - r=((f[i][j][2])-16)*1.164+((f[i][j][0])-128)*1.596; + b=(f[i][j][0])+(f[i][j][1]-128)*1.765; + g=(f[i][j][0])-(f[i][j][2]-128)*0.711-(f[i][j][1]-128)*0.343; + r=((f[i][j][0]))+((f[i][j][2])-128)*1.400; /* r=(*(pixel+2)-16)*1.164+(*(pixel)-128)*1.793; g=(*(pixel+2)-16)*1.164-(*(pixel+1)-128)*0.213-(*(pixel)-128)*0.533; b=(*(pixel+2)-16)*1.164+((*(pixel+1))-128)*2.112;*/ - if(r>255) r=255; + if(b>255) r=255; if(g>255) g=255; - if(b>255) b=255; + if(r>255) b=255; if(r<0) r=0; if(g<0) g=0; @@ -189,9 +202,9 @@ for(j=0;j<WIDTH;j+=8) for(x_block=i; x_block<i+8 ;x_block++){ for(y_block=j; y_block<j+8 ;y_block++){ - mat[x_block][y_block][2]*=luma[x_block-i][y_block-j]; + mat[x_block][y_block][0]*=luma[x_block-i][y_block-j]; mat[x_block][y_block][1]*=croma[x_block-i][y_block-j]; - mat[x_block][y_block][0]*=croma[x_block-i][y_block-j]; + mat[x_block][y_block][2]*=croma[x_block-i][y_block-j]; } } }
diff -r 5bd441b8ab2d -r 1ed97958d0f3 lora.h --- a/lora.h Thu Sep 22 00:04:30 2016 +0000 +++ b/lora.h Wed Jan 11 20:18:38 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,19 +45,18 @@ #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 9500000 // 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 + * Global variables declarations */ typedef enum { @@ -79,82 +73,80 @@ 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 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; +short int length_y=0,length_u=0,length_v=0; uint16_t BufferSize = BUFFER_SIZE; uint8_t Buffer[BUFFER_SIZE]; //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,short int acumulador[3]) { - //index1=300;index2=300;index3=300; uint8_t i; - bool isMaster = false;//MASTER (TX) OR SLAVE(RX) ? + bool isMaster = false; - //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 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 +155,12 @@ LORA_IQ_INVERSION_ON, true ); #elif USE_MODEM_FSK == 1 - - debug("\n\n\r > FSK Mode < \n\n\r"); + + //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 +168,19 @@ 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"); led = 0; - + flag_y=0,flag_u=0,flag_v=0; + int finish=0; + first_y=true,first_u=true,first_v=true; Radio.Rx( RX_TIMEOUT_VALUE ); - State=RX;//Estado inicial para el receptor + while( 1 ) { switch( State ) @@ -195,34 +188,118 @@ 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=20;index2=20;index3=20; + int pointer=0; + for(pointer=2;pointer<BufferSize;pointer+=2){ - else if( strncmp( ( const char* )Buffer, ( const char* )RfSMsg, 3 ) == 0 ){ + 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" ); + } + 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; + break; + //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; + break; + } + } + } - 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. - } + else{ + if(first_v == true) { + Buffer[pointer]=index3&0xff; + Buffer[pointer+1]=(index3>>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; + } + } + } + + + } - else // valid reception but neither a message + //debug( "end of cycle..\r\n" ); + int finish=0; + 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; + finish=1; + + + } + else{ + 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!!!!!! + isMaster = true; Radio.Rx( RX_TIMEOUT_VALUE ); } } @@ -231,85 +308,139 @@ { if( BufferSize > 0 ) { - + if( strncmp( ( const char* )Buffer, ( const char* )InitMsg, 4 ) == 0 ) + { led = !led; - debug( "Reading... \r\n" ); - // pc.printf( "Reading... \r\n" ); + // debug( "...Init received gfd\r\n" ); + short int num=0; + num=0xff & Buffer[5]; + num=num<<8; + num=num | (Buffer[4] & 0xff); + // debug( "py = %i\r\n",num ); + + py=num; + + num=0; + num=0xff & Buffer[7]; + num=num<<8; + num=num | (Buffer[6] & 0xff); + // debug( "pu = %i\r\n",num ); + pu=num; + num=0; + num=0xff & Buffer[9]; + num=num<<8; + num=num | (Buffer[8] & 0xff); + // debug( "pv = %i\r\n",num ); + + pv=num; + //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; + } + - int pointer=0; - int length_y=0,length_v=0,length_u=0; - for(pointer=0;pointer<254;pointer+=4){ + // Send the reply to the PING string + strcpy( ( char* )Buffer, ( char* )AckMsg ); + // We fill the buffer with numbers for the payload + for( i = 3; i < BufferSize; i++ ) + { + Buffer[i] = i - 4; + } + wait_ms( 10 ); + Radio.Send( Buffer, BufferSize ); + } + else if( strncmp( ( const char* )Buffer, ( const char* )PaqMsg, 2 ) == 0 ) + { // A master already exists then become a slave + + // debug( "...Receiving data TX \r\n" ); + led = !led; + 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) {//EL PRIMER DATO ES LA LONGITUD length_y=0xff & Buffer[pointer+1]; length_y=length_y<<8; - length_y=length_y | Buffer[pointer]; + length_y=length_y | (Buffer[pointer] & 0xff); 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] - + + acumulador[0]=length_y; + // debug("length_y = %i \r\n",length_y); } else{ - if(Buffer[pointer]!='\t'){//VERIFY the character is not EOC (end of component y u v) + //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=num | (Buffer[pointer] & 0xff); + *(temp1+py)=num; + py++; - num=0xff & Buffer[pointer+3]; - num=num<<8; - num=num | Buffer[pointer+2]; - *(temp1+py2)=num; - py2++; + // debug("valor py = %i \r\n",py); + // debug("num = %i \r\n",num); + if (py >= length_y) { + flag_y=1; + //acumulador[0]=py; + // debug("valor py = %i \r\n",py); + break; + } + + - if (py2 > length_y) {flag_y=1;}//if all bytes of the component are read, indicator is raised + //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]; + length_u=length_u | (Buffer[pointer] & 0xff); + acumulador[1]=length_u; first_u = false; - temp2=(short int *)malloc(sizeof(short int)*length_u); - pointer-=2; + + // debug("length_u = %i \r\n",length_u); } 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=num | (Buffer[pointer] & 0xff); + *(temp2+pu)=num; + pu++; + // debug("valor pu = %i \r\n",pu); + // debug("num = %i \r\n",num); + if (pu >= length_u) { + flag_u=1; + //acumulador[1]=pu; + break; + } - 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; - } + + } } @@ -317,245 +448,190 @@ if(first_v == true) { length_v=0xff & Buffer[pointer+1]; length_v=length_v<<8; - length_v=length_v | Buffer[pointer]; + length_v=length_v | (Buffer[pointer] & 0xff); + acumulador[2]=length_v; first_v = false; - temp3=(short int *)malloc(sizeof(short int)*length_v); - pointer-=2; + + // debug("length_v = %i \r\n",length_v); + + } else{ - if(Buffer[pointer]!='\n'){//VERIFY the character is not EOT + //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=num | (Buffer[pointer] & 0xff); + *(temp3+pv)=num; + pv++; + // debug("valor pv = %i \r\n",pv); + // debug("num = %i \r\n",num); + if (pv >= length_v) { + flag_v=1; + //acumulador[2]=pv; + break;} - 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){ + py=0;pu=0;pv=0; + //py_ant=0;pu_ant=0;pv_ant=0; + //flag_y=0;flag_u=0;flag_v=0; + //first_y=true;first_u=true;first_v=true; + + // debug( "Packet received (final de imagen)\r\n" ); + + State = LOWPOWER; + //goto end; + finish=1; + + + } + strcpy( ( char* )Buffer, ( char* )AckMsg ); // We fill the buffer with numbers for the payload - for( i = 4; i < BufferSize; i++ ) + for( i = 4; i < 32; i++ ) { Buffer[i] = i - 4; } wait_ms( 10 ); + + // debug( "Packet received \r\n" ); + Radio.Send( Buffer, BufferSize ); + if(finish==1) { + py_ant=0;pu_ant=0;pv_ant=0; + flag_y=0;flag_u=0;flag_v=0; + first_y=true;first_u=true;first_v=true; + goto end; + } + } + else // valid reception but not a PAQ or init as expected (Request for send) + { // Set device as master and start again + //isMaster = true; + + strcpy( ( char* )Buffer, ( char* )AckMsg ); + // We fill the buffer with numbers for the payload + for( i = 4; i < 32; i++ ) + { + Buffer[i] = i - 4; + } + wait_ms( 10 ); + + // debug( "RfS received \r\n" ); Radio.Send( Buffer, BufferSize ); - first_y=true;first_u=true;first_v=true; + } + - // debug( "Packet received \r\n" ); - // pc.printf( "Packet received \r\n" ); - State = LOWPOWER; - goto end; - - } - - State=TX; + } } - + 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 despues del rlc - 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" ); } - else { - //debug( "hola...\r\n" ); - //pc.printf( "hola...\r\n" ); - strcpy( ( char* )Buffer, ( char* )AckMsg ); + // debug( "ACK RX...\r\n" ); + + } + Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; + break; + case RX_TIMEOUT: + if( isMaster == true ) + { + + strcpy( ( char* )Buffer, ( char* )InitMsg ); for( i = 4; i < BufferSize; i++ ) { Buffer[i] = i - 4; } wait_ms( 10 ); Radio.Send( Buffer, BufferSize ); - Radio.Rx( RX_TIMEOUT_VALUE ); - } - - State = RX; - break; - case RX_TIMEOUT: - if( isMaster == true ) - { - //debug( "hola rx_timeout...\r\n" ); - //pc.printf( "hola...\r\n" ); - // Send the next PING frame - strcpy( ( char* )Buffer, ( char* )RfSMsg ); - for( i = 4; i < BufferSize; i++ ) - { - Buffer[i] = i - 4; - } - wait_ms( 10 ); - Radio.Send( Buffer, BufferSize ); + //debug("start!\r\n");//empezamos aqui } else { - //debug( "hola...\r\n" ); - //pc.printf( "hola...\r\n" ); - strcpy( ( char* )Buffer, ( char* )RfSMsg ); + // debug("RX_TIMEOUT... \r\n"); + wait(3); + /*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 ); + 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. + // We have received a Packet with a CRC error, send reply as if packet was correct if( isMaster == true ) { - - //debug( "hola rx_error...\r\n" ); - //pc.printf( "hola...\r\n" ); - strcpy( ( char* )Buffer, ( char* )RfSMsg); + // Send the next PING frame + strcpy( ( char* )Buffer, ( char* )InitMsg ); 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); + // Send the next PONG frame + // debug("CRC ERROR... \r\n"); + //wait(3); + + + /*while(1){ + led=!led; + wait(1); + }*/ + const uint8_t RfSY[] = "RfSy"; + const uint8_t RfSU[] = "RfSu"; + const uint8_t RfSV[] = "RfSv"; + + if(py < acumulador[0]) { + // debug("sent RFSY message \r\n"); + strcpy( ( char* )Buffer, ( char* )RfSY ); + + + } + else if(pu < acumulador[1]) { + // debug("sent RFSu message \r\n"); + strcpy( ( char* )Buffer, ( char* )RfSU ); + + + } + else { + // debug("sent RFSV message \r\n"); + strcpy( ( char* )Buffer, ( char* )RfSV ); + + + + } 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 +647,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 +665,26 @@ 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); -}
diff -r 5bd441b8ab2d -r 1ed97958d0f3 main.cpp --- a/main.cpp Thu Sep 22 00:04:30 2016 +0000 +++ b/main.cpp Wed Jan 11 20:18:38 2017 +0000 @@ -1,3 +1,4 @@ + /* @@ -15,11 +16,12 @@ #include "mbed.h" #include "functions_dec.h" #include "lora.h" +//#include "debug.h" #define BPS 128000 #define BITS 8 #define STOP_BITS 1 - +//DigitalOut myled(LED1); int main(int argc, char *argv[]){ Serial pc(USBTX, USBRX); @@ -27,50 +29,98 @@ pc.format (BITS,SerialBase::None, STOP_BITS) ; int i=0,j=0,p_x=0,p_y=0,k=0; - + //myled=1; short int m[HEIGHT][WIDTH][3]; short int *matriz=(short int *)malloc(sizeof(short int)*WIDTH*HEIGHT*3); - + short int index1,index2,index3; short int acumulador[3]={0,0,0}; +int veces=0; + +for(veces=0; veces < 30;veces++){ short int *temp1,*temp2,*temp3;//these are vectors. Memory allocations are done at lora function. - lora(temp1,acumulador[0],temp2,acumulador[1],temp3,acumulador[2]);//acumulador tells the length of the respective vector(acumulador[0] -> temp1,...) + temp3=(short int *)malloc(sizeof(short int)*380); + temp2=(short int *)malloc(sizeof(short int)*300); + temp1=(short int *)malloc(sizeof(short int)*300); +//debug("lora\r\n"); + lora(temp1,index1,temp2,index2,temp3,index3,acumulador);//acumulador tells the length of the respective vector(acumulador[0] -> temp1,...) int indice=0; - + // debug("paquete numero %i\r\n",veces+1); //We must "unroll" the vectors after being processed with the RLC (in the encoder) - for(i=0;i<acumulador[0]>>1;i++){ - for(j=k;j<*(temp1+indice)+k;j++){ - *(matriz+j*3)=*(temp1+indice+1); + +/* debug("return from lora function...\r\n"); + debug("acumulador[0]= %i\r\n",acumulador[0]); + debug("acumulador[0]= %i\r\n",acumulador[1]); + debug("acumulador[0]= %i\r\n",acumulador[2]); + debug("Paquete numero %i\r\n",veces+1);*/ + k=0; + short int acc1=0,acc2=0,acc3=0; + for(i=0;i<acumulador[0]/2;i++){//Se divide entre 2 poque se cuentan por pares (longitud,valor). + for(j=k;j<(*(temp1+indice)*3+k);j+=3){ + + *(matriz+j)=*(temp1+indice+1); + acc1++; + if(j>HEIGHT*WIDTH*3) break; + //debug("iteracion\r\n"); + } + k=j; + indice+=2; + + } + for(i=(acc1-1)*3;i<HEIGHT*WIDTH*3;i++){ + *(matriz+i)=0; + + } + +//debug("*(temp1+indice)= %i\r\n",*(temp1+0)); + indice=0; + k=0; + for(i=0;i<acumulador[1]/2;i++){ + + for(j=k;j<(*(temp2+indice)*3+k);j+=3){ + + *(matriz+j+1)=*(temp2+indice+1); + acc2++; + if(j>HEIGHT*WIDTH*3) break; } k=j; indice+=2; } + for(i=(acc2-1)*3;i<HEIGHT*WIDTH*3;i++){ + *(matriz+i+1)=0; + } + +//debug("*(temp2+indice)= %i\r\n",*(temp2+indice)); indice=0; k=0; - for(i=0;i<acumulador[1]>>1;i++){ - for(j=k;j<*(temp2+indice)+k;j++){ - *(matriz+j*3+1)=*(temp2+indice+1); + for(i=0;i<acumulador[2]/2;i++){ + for(j=k;j<(*(temp3+indice)*3+k);j+=3){ + + *(matriz+j+2)=*(temp3+indice+1); + acc3++; + if(j>HEIGHT*WIDTH*3) break; } k=j; indice+=2; } - indice=0; - k=0; - for(i=0;i<acumulador[2]>>1;i++){ - for(j=k;j<*(temp3+indice)+k;j++){ - *(matriz+j*3+2)=*(temp3+indice+1); - } - k=j; - indice+=2; + for(i=(acc3-1)*3;i<HEIGHT*WIDTH*3;i++){ + *(matriz+i+2)=0; } - - + + + free(temp1); + free(temp2); + free(temp3); + //debug("zig-zag\r\n"); + zig_zag_dec(m,matriz); + //debug("acumulador\r\n"); cuantizador_dec(m); + - + //debug("idct\r\n"); int matrix[8][8][3]; for(i=0;i<HEIGHT;i+=8){ for(j=0;j<WIDTH;j+=8){ @@ -97,7 +147,7 @@ int bpp=3; - for(i=0;i<HEIGHT;i++){ +/* for(i=0;i<HEIGHT;i++){ for(j=0;j<WIDTH;j++){ if(m[i][j][0]>235) m[i][j][0]=235; @@ -108,22 +158,131 @@ if(m[i][j][1]<16) m[i][j][1]=16; if(m[i][j][2]<16) m[i][j][2]=16; } + }*/ +//debug("yuv\r\n"); + yuv_to_rgb(m); + unsigned char var; +/* for(i=0;i<HEIGHT;i++){ + for(j=0;j<WIDTH;j++){ + while(!pc.writeable()); + pc.printf("%c",(char)m[i][j][0]); } - - yuv_to_rgb(m); +}*/ for(i=0;i<8;i++){ for(j=0;j<320;j++){ + + var=0xff & m[i][j][0]; + if(j>311){ + while(!pc.writeable()); + pc.printf("%c",(char)m[i][j-8][0]); - while(!pc.writeable()); - pc.printf("%u",(unsigned char)m[i][j][0]); - - while(!pc.writeable()); - pc.printf("%u",(unsigned char)m[i][j][1]); - while(!pc.writeable()); - pc.printf("%u",(unsigned char)m[i][j][2]); + + while(!pc.writeable()); + pc.printf("%c",(char)m[i][j-8][1]); + + + while(!pc.writeable()); + pc.printf("%c",(char)m[i][j-8][2]); + } + else{ + while(!pc.writeable()); + pc.printf("%c",(char)m[i][j][0]); + + + while(!pc.writeable()); + pc.printf("%c",(char)m[i][j][1]); + + + while(!pc.writeable()); + pc.printf("%c",(char)m[i][j][2]); + } + + //var=255; + } } + + while(!pc.writeable()); + pc.printf("2");//OJO con ponerlo aqui arriba + + + char h; + h=acc1&0xff; + + while(!pc.writeable()); + pc.printf("%c",h); + + h=(acc1>>8) & 0xff; + + while(!pc.writeable()); + pc.printf("%c",h); + + + + h=acc2&0xff; + + while(!pc.writeable()); + pc.printf("%c",h); + + h=(acc2>>8)&0xff; + + while(!pc.writeable()); + pc.printf("%c",h); + + + h=acc3&0xff; + + while(!pc.writeable()); + pc.printf("%c",h); + + h=(acc3>>8)&0xff; + + while(!pc.writeable()); + pc.printf("%c",h); + /* 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);*/ +} + + DigitalOut led(LED1); + while(1){ + + led=1; + wait(0.5); + led=0; + wait(0.5); + } return 0; }