H261 decoder

Dependencies:   SDL_lib2 SX1276Lib mbed

Committer:
miruga27
Date:
Thu Sep 22 00:04:30 2016 +0000
Revision:
0:5bd441b8ab2d
Child:
1:1ed97958d0f3
JPEG uncompressor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miruga27 0:5bd441b8ab2d 1 //Author: Miguel Ruiz García
miruga27 0:5bd441b8ab2d 2 //Company: University of Cantabria. 2016
miruga27 0:5bd441b8ab2d 3 //mail: mrg47@alumnos.unican.es
miruga27 0:5bd441b8ab2d 4 //code for TX & RX
miruga27 0:5bd441b8ab2d 5 #include "mbed.h"
miruga27 0:5bd441b8ab2d 6 #include "lora2.h"
miruga27 0:5bd441b8ab2d 7 #include "sx1276-hal.h"
miruga27 0:5bd441b8ab2d 8 #include "debug.h"
miruga27 0:5bd441b8ab2d 9 //#include "functions.h"
miruga27 0:5bd441b8ab2d 10 /* Set this flag to '1' to display debug messages on the console */
miruga27 0:5bd441b8ab2d 11 #define DEBUG_MESSAGE 1
miruga27 0:5bd441b8ab2d 12
miruga27 0:5bd441b8ab2d 13
miruga27 0:5bd441b8ab2d 14 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
miruga27 0:5bd441b8ab2d 15 #define USE_MODEM_LORA 1
miruga27 0:5bd441b8ab2d 16 #define USE_MODEM_FSK !USE_MODEM_LORA
miruga27 0:5bd441b8ab2d 17
miruga27 0:5bd441b8ab2d 18 #define RF_FREQUENCY 869000000 // Hz
miruga27 0:5bd441b8ab2d 19 #define TX_OUTPUT_POWER 14 // 14 dBm
miruga27 0:5bd441b8ab2d 20
miruga27 0:5bd441b8ab2d 21 #if USE_MODEM_LORA == 1
miruga27 0:5bd441b8ab2d 22
miruga27 0:5bd441b8ab2d 23 #define LORA_BANDWIDTH 1 // [0: 125 kHz,
miruga27 0:5bd441b8ab2d 24 // 1: 250 kHz,
miruga27 0:5bd441b8ab2d 25 // 2: 500 kHz,
miruga27 0:5bd441b8ab2d 26 // 3: Reserved]
miruga27 0:5bd441b8ab2d 27 #define LORA_SPREADING_FACTOR 10 // [SF7..SF12]
miruga27 0:5bd441b8ab2d 28 #define LORA_CODINGRATE 1 // [1: 4/5,
miruga27 0:5bd441b8ab2d 29 // 2: 4/6,
miruga27 0:5bd441b8ab2d 30 // 3: 4/7,
miruga27 0:5bd441b8ab2d 31 // 4: 4/8]
miruga27 0:5bd441b8ab2d 32 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
miruga27 0:5bd441b8ab2d 33 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
miruga27 0:5bd441b8ab2d 34 #define LORA_FIX_LENGTH_PAYLOAD_ON false
miruga27 0:5bd441b8ab2d 35 #define LORA_FHSS_ENABLED true
miruga27 0:5bd441b8ab2d 36 #define LORA_NB_SYMB_HOP 4
miruga27 0:5bd441b8ab2d 37 #define LORA_IQ_INVERSION_ON false
miruga27 0:5bd441b8ab2d 38 #define LORA_CRC_ENABLED true
miruga27 0:5bd441b8ab2d 39
miruga27 0:5bd441b8ab2d 40 #elif USE_MODEM_FSK == 1
miruga27 0:5bd441b8ab2d 41
miruga27 0:5bd441b8ab2d 42 #define FSK_FDEV 25000 // Hz
miruga27 0:5bd441b8ab2d 43 #define FSK_DATARATE 19200 // bps
miruga27 0:5bd441b8ab2d 44 #define FSK_BANDWIDTH 50000 // Hz
miruga27 0:5bd441b8ab2d 45 #define FSK_AFC_BANDWIDTH 83333 // Hz
miruga27 0:5bd441b8ab2d 46 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
miruga27 0:5bd441b8ab2d 47 #define FSK_FIX_LENGTH_PAYLOAD_ON false
miruga27 0:5bd441b8ab2d 48 #define FSK_CRC_ENABLED true
miruga27 0:5bd441b8ab2d 49
miruga27 0:5bd441b8ab2d 50 #else
miruga27 0:5bd441b8ab2d 51 #error "Please define a modem in the compiler options."
miruga27 0:5bd441b8ab2d 52 #endif
miruga27 0:5bd441b8ab2d 53
miruga27 0:5bd441b8ab2d 54 #define RX_TIMEOUT_VALUE 3500000 // in us
miruga27 0:5bd441b8ab2d 55 #define BUFFER_SIZE 255 // Define the payload size here [min:1 max:255]
miruga27 0:5bd441b8ab2d 56
miruga27 0:5bd441b8ab2d 57 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
miruga27 0:5bd441b8ab2d 58 DigitalOut led(LED2);
miruga27 0:5bd441b8ab2d 59 #else
miruga27 0:5bd441b8ab2d 60 DigitalOut led(LED1);
miruga27 0:5bd441b8ab2d 61 #endif
miruga27 0:5bd441b8ab2d 62
miruga27 0:5bd441b8ab2d 63
miruga27 0:5bd441b8ab2d 64 /*
miruga27 0:5bd441b8ab2d 65 * Global variables declarations
miruga27 0:5bd441b8ab2d 66 */
miruga27 0:5bd441b8ab2d 67 typedef enum
miruga27 0:5bd441b8ab2d 68 {
miruga27 0:5bd441b8ab2d 69 LOWPOWER = 0,
miruga27 0:5bd441b8ab2d 70 IDLE,
miruga27 0:5bd441b8ab2d 71
miruga27 0:5bd441b8ab2d 72 RX,
miruga27 0:5bd441b8ab2d 73 RX_TIMEOUT,
miruga27 0:5bd441b8ab2d 74 RX_ERROR,
miruga27 0:5bd441b8ab2d 75
miruga27 0:5bd441b8ab2d 76 TX,
miruga27 0:5bd441b8ab2d 77 TX_TIMEOUT,
miruga27 0:5bd441b8ab2d 78
miruga27 0:5bd441b8ab2d 79 CAD,
miruga27 0:5bd441b8ab2d 80 CAD_DONE
miruga27 0:5bd441b8ab2d 81 }AppStates_t;
miruga27 0:5bd441b8ab2d 82
miruga27 0:5bd441b8ab2d 83 volatile AppStates_t State = LOWPOWER;
miruga27 0:5bd441b8ab2d 84
miruga27 0:5bd441b8ab2d 85 /*!
miruga27 0:5bd441b8ab2d 86 * Radio events function pointer
miruga27 0:5bd441b8ab2d 87 */
miruga27 0:5bd441b8ab2d 88 static RadioEvents_t RadioEvents;
miruga27 0:5bd441b8ab2d 89
miruga27 0:5bd441b8ab2d 90 /*
miruga27 0:5bd441b8ab2d 91 * Global variables declarations
miruga27 0:5bd441b8ab2d 92 */
miruga27 0:5bd441b8ab2d 93 SX1276MB1xAS Radio( NULL );
miruga27 0:5bd441b8ab2d 94
miruga27 0:5bd441b8ab2d 95 const uint8_t PingMsg[] = "PING";
miruga27 0:5bd441b8ab2d 96 const uint8_t PongMsg[] = "PONG";
miruga27 0:5bd441b8ab2d 97 const uint8_t AckMsg[] = "ACK";
miruga27 0:5bd441b8ab2d 98 const uint8_t EOPMsg[] = "EOP";
miruga27 0:5bd441b8ab2d 99 const uint8_t RfSMsg[] = "RfS";
miruga27 0:5bd441b8ab2d 100 int py=0,pu=0,pv=0,py2=0,pu2=0,pv2=0;
miruga27 0:5bd441b8ab2d 101 int py_ant=0,pu_ant=0,pv_ant=0;
miruga27 0:5bd441b8ab2d 102 int flag_y=0,flag_u=0,flag_v=0;
miruga27 0:5bd441b8ab2d 103 uint16_t BufferSize = BUFFER_SIZE;
miruga27 0:5bd441b8ab2d 104 uint8_t Buffer[BUFFER_SIZE];
miruga27 0:5bd441b8ab2d 105 //uint8_t Buffer2[4];
miruga27 0:5bd441b8ab2d 106
miruga27 0:5bd441b8ab2d 107 int16_t RssiValue = 0.0;
miruga27 0:5bd441b8ab2d 108 int8_t SnrValue = 0.0;
miruga27 0:5bd441b8ab2d 109
miruga27 0:5bd441b8ab2d 110 bool first_y=true,first_u=true,first_v=true;
miruga27 0:5bd441b8ab2d 111 void lora(short int *temp1,short int index1,short int *temp2,short int index2,short int *temp3,short int index3)
miruga27 0:5bd441b8ab2d 112 {
miruga27 0:5bd441b8ab2d 113 //index1=300;index2=300;index3=300;
miruga27 0:5bd441b8ab2d 114 uint8_t i;
miruga27 0:5bd441b8ab2d 115 bool isMaster = false;//MASTER (TX) OR SLAVE(RX) ?
miruga27 0:5bd441b8ab2d 116
miruga27 0:5bd441b8ab2d 117 //pc.baud(BPS);
miruga27 0:5bd441b8ab2d 118 //pc.format (BITS,SerialBase::None, STOP_BITS) ;
miruga27 0:5bd441b8ab2d 119
miruga27 0:5bd441b8ab2d 120
miruga27 0:5bd441b8ab2d 121
miruga27 0:5bd441b8ab2d 122 //debug( "\n\n\r SX1276 Ping Pong Demo Application \n\n\r" );
miruga27 0:5bd441b8ab2d 123 //pc.printf("\n\n\r SX1276 Image transfer Application \n\n\r");
miruga27 0:5bd441b8ab2d 124
miruga27 0:5bd441b8ab2d 125 // Initialize Radio driver
miruga27 0:5bd441b8ab2d 126 RadioEvents.TxDone = OnTxDone;
miruga27 0:5bd441b8ab2d 127 RadioEvents.RxDone = OnRxDone;
miruga27 0:5bd441b8ab2d 128 RadioEvents.RxError = OnRxError;
miruga27 0:5bd441b8ab2d 129 RadioEvents.TxTimeout = OnTxTimeout;
miruga27 0:5bd441b8ab2d 130 RadioEvents.RxTimeout = OnRxTimeout;
miruga27 0:5bd441b8ab2d 131 RadioEvents.FhssChangeChannel = OnFhssChangeChannel;
miruga27 0:5bd441b8ab2d 132 Radio.Init( &RadioEvents );
miruga27 0:5bd441b8ab2d 133
miruga27 0:5bd441b8ab2d 134 // verify the connection with the board
miruga27 0:5bd441b8ab2d 135 goto start;
miruga27 0:5bd441b8ab2d 136 while( Radio.Read( REG_VERSION ) == 0x00 )
miruga27 0:5bd441b8ab2d 137 {
miruga27 0:5bd441b8ab2d 138 //debug( "Radio could not be detected!\n\r", NULL );
miruga27 0:5bd441b8ab2d 139 //pc.printf( "Radio could not be detected!\n\r", NULL );
miruga27 0:5bd441b8ab2d 140 wait( 1 );
miruga27 0:5bd441b8ab2d 141 }
miruga27 0:5bd441b8ab2d 142 start:
miruga27 0:5bd441b8ab2d 143 //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , "\n\r > Board Type: SX1276MB1LAS < \n\r" );
miruga27 0:5bd441b8ab2d 144 //debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , "\n\r > Board Type: SX1276MB1MAS < \n\r" );
miruga27 0:5bd441b8ab2d 145
miruga27 0:5bd441b8ab2d 146 Radio.SetChannel( HoppingFrequencies[0] );
miruga27 0:5bd441b8ab2d 147
miruga27 0:5bd441b8ab2d 148 #if USE_MODEM_LORA == 1
miruga27 0:5bd441b8ab2d 149
miruga27 0:5bd441b8ab2d 150 //debug_if( LORA_FHSS_ENABLED, "\n\n\r > LORA FHSS Mode < \n\n\r");
miruga27 0:5bd441b8ab2d 151 //debug_if( !LORA_FHSS_ENABLED, "\n\n\r > LORA Mode < \n\n\r");
miruga27 0:5bd441b8ab2d 152
miruga27 0:5bd441b8ab2d 153 Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
miruga27 0:5bd441b8ab2d 154 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
miruga27 0:5bd441b8ab2d 155 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
miruga27 0:5bd441b8ab2d 156 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
miruga27 0:5bd441b8ab2d 157 LORA_IQ_INVERSION_ON, 4000000 );
miruga27 0:5bd441b8ab2d 158
miruga27 0:5bd441b8ab2d 159 Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
miruga27 0:5bd441b8ab2d 160 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
miruga27 0:5bd441b8ab2d 161 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
miruga27 0:5bd441b8ab2d 162 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
miruga27 0:5bd441b8ab2d 163 LORA_IQ_INVERSION_ON, true );
miruga27 0:5bd441b8ab2d 164
miruga27 0:5bd441b8ab2d 165 #elif USE_MODEM_FSK == 1
miruga27 0:5bd441b8ab2d 166
miruga27 0:5bd441b8ab2d 167 debug("\n\n\r > FSK Mode < \n\n\r");
miruga27 0:5bd441b8ab2d 168 Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
miruga27 0:5bd441b8ab2d 169 FSK_DATARATE, 0,
miruga27 0:5bd441b8ab2d 170 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
miruga27 0:5bd441b8ab2d 171 FSK_CRC_ENABLED, 0, 0, 0, 3000000 );
miruga27 0:5bd441b8ab2d 172
miruga27 0:5bd441b8ab2d 173 Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
miruga27 0:5bd441b8ab2d 174 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
miruga27 0:5bd441b8ab2d 175 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
miruga27 0:5bd441b8ab2d 176 0, 0, false, true );
miruga27 0:5bd441b8ab2d 177
miruga27 0:5bd441b8ab2d 178 #else
miruga27 0:5bd441b8ab2d 179
miruga27 0:5bd441b8ab2d 180 #error "Please define a modem in the compiler options."
miruga27 0:5bd441b8ab2d 181
miruga27 0:5bd441b8ab2d 182 #endif
miruga27 0:5bd441b8ab2d 183
miruga27 0:5bd441b8ab2d 184 //debug_if( DEBUG_MESSAGE, "Starting image transmission loop\r\n" );
miruga27 0:5bd441b8ab2d 185 //pc.printf("Starting image transmission loop\r\n");
miruga27 0:5bd441b8ab2d 186
miruga27 0:5bd441b8ab2d 187 led = 0;
miruga27 0:5bd441b8ab2d 188
miruga27 0:5bd441b8ab2d 189 Radio.Rx( RX_TIMEOUT_VALUE );
miruga27 0:5bd441b8ab2d 190 State=RX;//Estado inicial para el receptor
miruga27 0:5bd441b8ab2d 191 while( 1 )
miruga27 0:5bd441b8ab2d 192 {
miruga27 0:5bd441b8ab2d 193 switch( State )
miruga27 0:5bd441b8ab2d 194 {
miruga27 0:5bd441b8ab2d 195 case RX:
miruga27 0:5bd441b8ab2d 196 if( isMaster == true )
miruga27 0:5bd441b8ab2d 197 {
miruga27 0:5bd441b8ab2d 198 //debug( "waiting for response....\r\n" );
miruga27 0:5bd441b8ab2d 199 if( BufferSize > 0 )
miruga27 0:5bd441b8ab2d 200 {
miruga27 0:5bd441b8ab2d 201
miruga27 0:5bd441b8ab2d 202 if( strncmp( ( const char* )Buffer, ( const char* )AckMsg, 3 ) != 0 )
miruga27 0:5bd441b8ab2d 203 {
miruga27 0:5bd441b8ab2d 204 led = !led;
miruga27 0:5bd441b8ab2d 205 //debug( "Packet acknoledged....\r\n" );
miruga27 0:5bd441b8ab2d 206 // pc.printf( "Packet acknoledged....\r\n" );
miruga27 0:5bd441b8ab2d 207 // Send the next frame
miruga27 0:5bd441b8ab2d 208 State = TX;
miruga27 0:5bd441b8ab2d 209 }
miruga27 0:5bd441b8ab2d 210
miruga27 0:5bd441b8ab2d 211 else if( strncmp( ( const char* )Buffer, ( const char* )RfSMsg, 3 ) == 0 ){
miruga27 0:5bd441b8ab2d 212
miruga27 0:5bd441b8ab2d 213 led = !led;
miruga27 0:5bd441b8ab2d 214 debug( "Retransmit packet....\r\n" );
miruga27 0:5bd441b8ab2d 215 // pc.printf( "Retransmit packet....\r\n" );
miruga27 0:5bd441b8ab2d 216 // Send the next frame
miruga27 0:5bd441b8ab2d 217 State = TX;
miruga27 0:5bd441b8ab2d 218 py=py_ant; pu=pu_ant; pv=pv_ant;//Si hay que reenviar el paquete se reestablecen los valores de punteros.
miruga27 0:5bd441b8ab2d 219 }
miruga27 0:5bd441b8ab2d 220
miruga27 0:5bd441b8ab2d 221 else // valid reception but neither a message
miruga27 0:5bd441b8ab2d 222 { // Set device as master ans start again
miruga27 0:5bd441b8ab2d 223 debug( "no message received...\r\n" );
miruga27 0:5bd441b8ab2d 224 // pc.printf( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 225 isMaster = true;//this intruction is DANGEROUS!!!!!!
miruga27 0:5bd441b8ab2d 226 Radio.Rx( RX_TIMEOUT_VALUE );
miruga27 0:5bd441b8ab2d 227 }
miruga27 0:5bd441b8ab2d 228 }
miruga27 0:5bd441b8ab2d 229 }
miruga27 0:5bd441b8ab2d 230 else
miruga27 0:5bd441b8ab2d 231 {
miruga27 0:5bd441b8ab2d 232 if( BufferSize > 0 )
miruga27 0:5bd441b8ab2d 233 {
miruga27 0:5bd441b8ab2d 234
miruga27 0:5bd441b8ab2d 235 led = !led;
miruga27 0:5bd441b8ab2d 236 debug( "Reading... \r\n" );
miruga27 0:5bd441b8ab2d 237 // pc.printf( "Reading... \r\n" );
miruga27 0:5bd441b8ab2d 238
miruga27 0:5bd441b8ab2d 239 int pointer=0;
miruga27 0:5bd441b8ab2d 240 int length_y=0,length_v=0,length_u=0;
miruga27 0:5bd441b8ab2d 241 for(pointer=0;pointer<254;pointer+=4){
miruga27 0:5bd441b8ab2d 242 if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
miruga27 0:5bd441b8ab2d 243 if(first_y == true) {//EL PRIMER DATO ES LA LONGITUD
miruga27 0:5bd441b8ab2d 244 length_y=0xff & Buffer[pointer+1];
miruga27 0:5bd441b8ab2d 245 length_y=length_y<<8;
miruga27 0:5bd441b8ab2d 246 length_y=length_y | Buffer[pointer];
miruga27 0:5bd441b8ab2d 247 first_y = false;
miruga27 0:5bd441b8ab2d 248 temp1=(short int *)malloc(sizeof(short int)*length_y);
miruga27 0:5bd441b8ab2d 249 pointer-=2;//this is to avoid lose the first byte of the component
miruga27 0:5bd441b8ab2d 250 //in the cycle 'pointer+=4' but in the first package of the component there´s no a pair [length,value]
miruga27 0:5bd441b8ab2d 251
miruga27 0:5bd441b8ab2d 252 }
miruga27 0:5bd441b8ab2d 253 else{
miruga27 0:5bd441b8ab2d 254 if(Buffer[pointer]!='\t'){//VERIFY the character is not EOC (end of component y u v)
miruga27 0:5bd441b8ab2d 255
miruga27 0:5bd441b8ab2d 256 short int num=0;
miruga27 0:5bd441b8ab2d 257 num=0xff & Buffer[pointer+1];
miruga27 0:5bd441b8ab2d 258 num=num<<8;
miruga27 0:5bd441b8ab2d 259 num=num | Buffer[pointer];
miruga27 0:5bd441b8ab2d 260 *(temp1+py2)=num;
miruga27 0:5bd441b8ab2d 261 py2++;
miruga27 0:5bd441b8ab2d 262
miruga27 0:5bd441b8ab2d 263 if (py2 > length_y) {flag_y=1;}
miruga27 0:5bd441b8ab2d 264
miruga27 0:5bd441b8ab2d 265 num=0xff & Buffer[pointer+3];
miruga27 0:5bd441b8ab2d 266 num=num<<8;
miruga27 0:5bd441b8ab2d 267 num=num | Buffer[pointer+2];
miruga27 0:5bd441b8ab2d 268 *(temp1+py2)=num;
miruga27 0:5bd441b8ab2d 269 py2++;
miruga27 0:5bd441b8ab2d 270
miruga27 0:5bd441b8ab2d 271 if (py2 > length_y) {flag_y=1;}//if all bytes of the component are read, indicator is raised
miruga27 0:5bd441b8ab2d 272 //originally designed with goto.
miruga27 0:5bd441b8ab2d 273 }
miruga27 0:5bd441b8ab2d 274 else {
miruga27 0:5bd441b8ab2d 275 flag_y=1;
miruga27 0:5bd441b8ab2d 276 }
miruga27 0:5bd441b8ab2d 277 }
miruga27 0:5bd441b8ab2d 278 }
miruga27 0:5bd441b8ab2d 279
miruga27 0:5bd441b8ab2d 280
miruga27 0:5bd441b8ab2d 281 else if(flag_u==0){
miruga27 0:5bd441b8ab2d 282 if(first_u == true) {
miruga27 0:5bd441b8ab2d 283 length_u=0xff & Buffer[pointer+1];
miruga27 0:5bd441b8ab2d 284 length_u=length_u<<8;
miruga27 0:5bd441b8ab2d 285 length_u=length_u | Buffer[pointer];
miruga27 0:5bd441b8ab2d 286 first_u = false;
miruga27 0:5bd441b8ab2d 287 temp2=(short int *)malloc(sizeof(short int)*length_u);
miruga27 0:5bd441b8ab2d 288 pointer-=2;
miruga27 0:5bd441b8ab2d 289 }
miruga27 0:5bd441b8ab2d 290 else{
miruga27 0:5bd441b8ab2d 291 if(Buffer[pointer]!='\t'){//VERIFY the character is not "end of component"
miruga27 0:5bd441b8ab2d 292
miruga27 0:5bd441b8ab2d 293 short int num=0;
miruga27 0:5bd441b8ab2d 294 num=0xff & Buffer[pointer+1];
miruga27 0:5bd441b8ab2d 295 num=num<<8;
miruga27 0:5bd441b8ab2d 296 num=num | Buffer[pointer];
miruga27 0:5bd441b8ab2d 297 *(temp2+pu2)=num;
miruga27 0:5bd441b8ab2d 298 pu2++;
miruga27 0:5bd441b8ab2d 299
miruga27 0:5bd441b8ab2d 300 if (pu2 > length_u) {flag_u=1;}
miruga27 0:5bd441b8ab2d 301
miruga27 0:5bd441b8ab2d 302 num=0xff & Buffer[pointer+3];
miruga27 0:5bd441b8ab2d 303 num=num<<8;
miruga27 0:5bd441b8ab2d 304 num=num | Buffer[pointer+2];
miruga27 0:5bd441b8ab2d 305 *(temp2+pu2)=num;
miruga27 0:5bd441b8ab2d 306 pu2++;
miruga27 0:5bd441b8ab2d 307
miruga27 0:5bd441b8ab2d 308 if (pu2 > length_u) {flag_u=1;}
miruga27 0:5bd441b8ab2d 309 }
miruga27 0:5bd441b8ab2d 310 else {
miruga27 0:5bd441b8ab2d 311 flag_u=1;
miruga27 0:5bd441b8ab2d 312 }
miruga27 0:5bd441b8ab2d 313 }
miruga27 0:5bd441b8ab2d 314 }
miruga27 0:5bd441b8ab2d 315
miruga27 0:5bd441b8ab2d 316 else{
miruga27 0:5bd441b8ab2d 317 if(first_v == true) {
miruga27 0:5bd441b8ab2d 318 length_v=0xff & Buffer[pointer+1];
miruga27 0:5bd441b8ab2d 319 length_v=length_v<<8;
miruga27 0:5bd441b8ab2d 320 length_v=length_v | Buffer[pointer];
miruga27 0:5bd441b8ab2d 321 first_v = false;
miruga27 0:5bd441b8ab2d 322 temp3=(short int *)malloc(sizeof(short int)*length_v);
miruga27 0:5bd441b8ab2d 323 pointer-=2;
miruga27 0:5bd441b8ab2d 324 }
miruga27 0:5bd441b8ab2d 325 else{
miruga27 0:5bd441b8ab2d 326 if(Buffer[pointer]!='\n'){//VERIFY the character is not EOT
miruga27 0:5bd441b8ab2d 327
miruga27 0:5bd441b8ab2d 328 short int num=0;
miruga27 0:5bd441b8ab2d 329 num=0xff & Buffer[pointer+1];
miruga27 0:5bd441b8ab2d 330 num=num<<8;
miruga27 0:5bd441b8ab2d 331 num=num | Buffer[pointer];
miruga27 0:5bd441b8ab2d 332 *(temp3+pv2)=num;
miruga27 0:5bd441b8ab2d 333 py2++;
miruga27 0:5bd441b8ab2d 334
miruga27 0:5bd441b8ab2d 335 if (pv2 > length_v) {flag_v=1;}
miruga27 0:5bd441b8ab2d 336
miruga27 0:5bd441b8ab2d 337 num=0xff & Buffer[pointer+3];
miruga27 0:5bd441b8ab2d 338 num=num<<8;
miruga27 0:5bd441b8ab2d 339 num=num | Buffer[pointer+2];
miruga27 0:5bd441b8ab2d 340 *(temp3+pv2)=num;
miruga27 0:5bd441b8ab2d 341 pv2++;
miruga27 0:5bd441b8ab2d 342
miruga27 0:5bd441b8ab2d 343 if (pv2 > length_v) {flag_v=1;}
miruga27 0:5bd441b8ab2d 344 }
miruga27 0:5bd441b8ab2d 345 else {
miruga27 0:5bd441b8ab2d 346 flag_v=1;
miruga27 0:5bd441b8ab2d 347 break;
miruga27 0:5bd441b8ab2d 348 }
miruga27 0:5bd441b8ab2d 349 }
miruga27 0:5bd441b8ab2d 350 }
miruga27 0:5bd441b8ab2d 351
miruga27 0:5bd441b8ab2d 352
miruga27 0:5bd441b8ab2d 353 }
miruga27 0:5bd441b8ab2d 354 if(flag_y==1 && flag_u==1 && flag_v ==1){
miruga27 0:5bd441b8ab2d 355 strcpy( ( char* )Buffer, ( char* )AckMsg );
miruga27 0:5bd441b8ab2d 356 // We fill the buffer with numbers for the payload
miruga27 0:5bd441b8ab2d 357 for( i = 4; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 358 {
miruga27 0:5bd441b8ab2d 359 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 360 }
miruga27 0:5bd441b8ab2d 361 wait_ms( 10 );
miruga27 0:5bd441b8ab2d 362 Radio.Send( Buffer, BufferSize );
miruga27 0:5bd441b8ab2d 363
miruga27 0:5bd441b8ab2d 364 first_y=true;first_u=true;first_v=true;
miruga27 0:5bd441b8ab2d 365
miruga27 0:5bd441b8ab2d 366 // debug( "Packet received \r\n" );
miruga27 0:5bd441b8ab2d 367 // pc.printf( "Packet received \r\n" );
miruga27 0:5bd441b8ab2d 368 State = LOWPOWER;
miruga27 0:5bd441b8ab2d 369 goto end;
miruga27 0:5bd441b8ab2d 370
miruga27 0:5bd441b8ab2d 371 }
miruga27 0:5bd441b8ab2d 372
miruga27 0:5bd441b8ab2d 373 State=TX;
miruga27 0:5bd441b8ab2d 374 }
miruga27 0:5bd441b8ab2d 375 }
miruga27 0:5bd441b8ab2d 376
miruga27 0:5bd441b8ab2d 377 break;
miruga27 0:5bd441b8ab2d 378 case TX:
miruga27 0:5bd441b8ab2d 379 led = !led;
miruga27 0:5bd441b8ab2d 380 if( isMaster == true )
miruga27 0:5bd441b8ab2d 381 {
miruga27 0:5bd441b8ab2d 382 //debug( "transmission of packet (320x8)...\r\n" );
miruga27 0:5bd441b8ab2d 383 //pc.printf( "transmission of packet (320x8)...\r\n" );
miruga27 0:5bd441b8ab2d 384 int pointer=0;
miruga27 0:5bd441b8ab2d 385
miruga27 0:5bd441b8ab2d 386
miruga27 0:5bd441b8ab2d 387 py_ant=py;pu_ant=pu;pv_ant=pv;
miruga27 0:5bd441b8ab2d 388 for(pointer=0;pointer<254;pointer+=2){
miruga27 0:5bd441b8ab2d 389
miruga27 0:5bd441b8ab2d 390 if(flag_y==0) {//se comprueba si se ha cargado en el buffer de transmisión cada una de las componentes
miruga27 0:5bd441b8ab2d 391 if(first_y == true) {//en primer lugar se manda la longitud de la componente y u v despues del rlc
miruga27 0:5bd441b8ab2d 392 Buffer[pointer]=index1&0xff;
miruga27 0:5bd441b8ab2d 393 Buffer[pointer+1]=(index1>>8)&0xff;
miruga27 0:5bd441b8ab2d 394 first_y = false;
miruga27 0:5bd441b8ab2d 395 //debug( "transmitting y length...\r\n" );
miruga27 0:5bd441b8ab2d 396 }
miruga27 0:5bd441b8ab2d 397 else{
miruga27 0:5bd441b8ab2d 398 Buffer[pointer]=*(temp1+py) & 0x00ff;
miruga27 0:5bd441b8ab2d 399 Buffer[pointer+1]=(*(temp1+py)>>8) & 0x00ff;
miruga27 0:5bd441b8ab2d 400 py++;
miruga27 0:5bd441b8ab2d 401 // debug( "transmitting y data..\r\n" );
miruga27 0:5bd441b8ab2d 402 if(py >= index1) {
miruga27 0:5bd441b8ab2d 403 flag_y=1;
miruga27 0:5bd441b8ab2d 404 Buffer[pointer+2]='\t';
miruga27 0:5bd441b8ab2d 405 pointer+=2;
miruga27 0:5bd441b8ab2d 406 }
miruga27 0:5bd441b8ab2d 407 }
miruga27 0:5bd441b8ab2d 408 }
miruga27 0:5bd441b8ab2d 409 else if(flag_u==0){
miruga27 0:5bd441b8ab2d 410 if(first_u == true) {
miruga27 0:5bd441b8ab2d 411 Buffer[pointer]=index2&0xff;
miruga27 0:5bd441b8ab2d 412 Buffer[pointer+1]=(index2>>8)&0xff;
miruga27 0:5bd441b8ab2d 413 first_u = false;
miruga27 0:5bd441b8ab2d 414 //debug( "transmitting u length...\r\n" );
miruga27 0:5bd441b8ab2d 415 }
miruga27 0:5bd441b8ab2d 416 else{
miruga27 0:5bd441b8ab2d 417 Buffer[pointer]=*(temp2+pu) & 0x00ff;
miruga27 0:5bd441b8ab2d 418 Buffer[pointer+1]=(*(temp2+pu)>>8) & 0x00ff;
miruga27 0:5bd441b8ab2d 419 pu++;
miruga27 0:5bd441b8ab2d 420 //debug( "transmitting u data...\r\n" );
miruga27 0:5bd441b8ab2d 421 if(pu>= index2) {
miruga27 0:5bd441b8ab2d 422 flag_u=1;
miruga27 0:5bd441b8ab2d 423 Buffer[pointer+2]='\t';
miruga27 0:5bd441b8ab2d 424 pointer+=2;
miruga27 0:5bd441b8ab2d 425 }
miruga27 0:5bd441b8ab2d 426 }
miruga27 0:5bd441b8ab2d 427 }
miruga27 0:5bd441b8ab2d 428
miruga27 0:5bd441b8ab2d 429 else{
miruga27 0:5bd441b8ab2d 430 if(first_v == true) {
miruga27 0:5bd441b8ab2d 431 Buffer[pointer]=index2&0xff;
miruga27 0:5bd441b8ab2d 432 Buffer[pointer+1]=(index2>>8)&0xff;
miruga27 0:5bd441b8ab2d 433 first_v = false;
miruga27 0:5bd441b8ab2d 434 //debug( "transmitting v length...\r\n" );
miruga27 0:5bd441b8ab2d 435 }
miruga27 0:5bd441b8ab2d 436 else{
miruga27 0:5bd441b8ab2d 437 Buffer[pointer]=*(temp3+pv) & 0x00ff;
miruga27 0:5bd441b8ab2d 438 Buffer[pointer+1]=(*(temp3+pv)>>8) & 0x00ff;
miruga27 0:5bd441b8ab2d 439 pv++;
miruga27 0:5bd441b8ab2d 440 //debug( "transmitting v data ...\r\n" );
miruga27 0:5bd441b8ab2d 441 if(pv >= index3) {
miruga27 0:5bd441b8ab2d 442 flag_v=1;
miruga27 0:5bd441b8ab2d 443 Buffer[pointer+2]='\n';//salto de línea es EOT
miruga27 0:5bd441b8ab2d 444 pointer+=2;
miruga27 0:5bd441b8ab2d 445 break;
miruga27 0:5bd441b8ab2d 446 }
miruga27 0:5bd441b8ab2d 447 }
miruga27 0:5bd441b8ab2d 448 }
miruga27 0:5bd441b8ab2d 449
miruga27 0:5bd441b8ab2d 450
miruga27 0:5bd441b8ab2d 451 }
miruga27 0:5bd441b8ab2d 452
miruga27 0:5bd441b8ab2d 453 if(flag_y==1 && flag_u==1 && flag_v==1){
miruga27 0:5bd441b8ab2d 454 Buffer[pointer]='\n';//salto de línea es EOT
miruga27 0:5bd441b8ab2d 455 flag_y=0;flag_u=0;flag_v=0;
miruga27 0:5bd441b8ab2d 456 //debug( "finished transmission ...\r\n" );
miruga27 0:5bd441b8ab2d 457 first_y=true;first_u=true;first_v=true;
miruga27 0:5bd441b8ab2d 458 goto end;
miruga27 0:5bd441b8ab2d 459 for( i = Buffer[pointer]; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 460 {
miruga27 0:5bd441b8ab2d 461 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 462 }
miruga27 0:5bd441b8ab2d 463 }
miruga27 0:5bd441b8ab2d 464 else{
miruga27 0:5bd441b8ab2d 465 for( i = Buffer[pointer]; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 466 {
miruga27 0:5bd441b8ab2d 467 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 468 }
miruga27 0:5bd441b8ab2d 469 }
miruga27 0:5bd441b8ab2d 470
miruga27 0:5bd441b8ab2d 471
miruga27 0:5bd441b8ab2d 472
miruga27 0:5bd441b8ab2d 473 wait_ms( 10 );
miruga27 0:5bd441b8ab2d 474 //debug( "Sending packet...\r\n" );
miruga27 0:5bd441b8ab2d 475 Radio.Send( Buffer, BufferSize );
miruga27 0:5bd441b8ab2d 476
miruga27 0:5bd441b8ab2d 477 // pc.printf( "Sending packet...\r\n" );
miruga27 0:5bd441b8ab2d 478 }
miruga27 0:5bd441b8ab2d 479
miruga27 0:5bd441b8ab2d 480 else
miruga27 0:5bd441b8ab2d 481 {
miruga27 0:5bd441b8ab2d 482 //debug( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 483 //pc.printf( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 484 strcpy( ( char* )Buffer, ( char* )AckMsg );
miruga27 0:5bd441b8ab2d 485 for( i = 4; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 486 {
miruga27 0:5bd441b8ab2d 487 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 488 }
miruga27 0:5bd441b8ab2d 489 wait_ms( 10 );
miruga27 0:5bd441b8ab2d 490 Radio.Send( Buffer, BufferSize );
miruga27 0:5bd441b8ab2d 491 Radio.Rx( RX_TIMEOUT_VALUE );
miruga27 0:5bd441b8ab2d 492 }
miruga27 0:5bd441b8ab2d 493
miruga27 0:5bd441b8ab2d 494 State = RX;
miruga27 0:5bd441b8ab2d 495 break;
miruga27 0:5bd441b8ab2d 496 case RX_TIMEOUT:
miruga27 0:5bd441b8ab2d 497 if( isMaster == true )
miruga27 0:5bd441b8ab2d 498 {
miruga27 0:5bd441b8ab2d 499 //debug( "hola rx_timeout...\r\n" );
miruga27 0:5bd441b8ab2d 500 //pc.printf( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 501 // Send the next PING frame
miruga27 0:5bd441b8ab2d 502 strcpy( ( char* )Buffer, ( char* )RfSMsg );
miruga27 0:5bd441b8ab2d 503 for( i = 4; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 504 {
miruga27 0:5bd441b8ab2d 505 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 506 }
miruga27 0:5bd441b8ab2d 507 wait_ms( 10 );
miruga27 0:5bd441b8ab2d 508 Radio.Send( Buffer, BufferSize );
miruga27 0:5bd441b8ab2d 509 }
miruga27 0:5bd441b8ab2d 510 else
miruga27 0:5bd441b8ab2d 511 {
miruga27 0:5bd441b8ab2d 512 //debug( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 513 //pc.printf( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 514 strcpy( ( char* )Buffer, ( char* )RfSMsg );
miruga27 0:5bd441b8ab2d 515 for( i = 4; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 516 {
miruga27 0:5bd441b8ab2d 517 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 518 }
miruga27 0:5bd441b8ab2d 519 wait_ms( 10 );
miruga27 0:5bd441b8ab2d 520 Radio.Send( Buffer, BufferSize );
miruga27 0:5bd441b8ab2d 521 Radio.Rx( RX_TIMEOUT_VALUE );
miruga27 0:5bd441b8ab2d 522 }
miruga27 0:5bd441b8ab2d 523 State = LOWPOWER;
miruga27 0:5bd441b8ab2d 524 break;
miruga27 0:5bd441b8ab2d 525
miruga27 0:5bd441b8ab2d 526 case RX_ERROR:
miruga27 0:5bd441b8ab2d 527 // We have received a Packet with a CRC error, request packet again.
miruga27 0:5bd441b8ab2d 528 if( isMaster == true )
miruga27 0:5bd441b8ab2d 529 {
miruga27 0:5bd441b8ab2d 530
miruga27 0:5bd441b8ab2d 531 //debug( "hola rx_error...\r\n" );
miruga27 0:5bd441b8ab2d 532 //pc.printf( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 533 strcpy( ( char* )Buffer, ( char* )RfSMsg);
miruga27 0:5bd441b8ab2d 534 for( i = 4; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 535 {
miruga27 0:5bd441b8ab2d 536 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 537 }
miruga27 0:5bd441b8ab2d 538
miruga27 0:5bd441b8ab2d 539 wait_ms( 10 );
miruga27 0:5bd441b8ab2d 540 Radio.Send( Buffer, BufferSize );
miruga27 0:5bd441b8ab2d 541 State = LOWPOWER;
miruga27 0:5bd441b8ab2d 542 }
miruga27 0:5bd441b8ab2d 543 else
miruga27 0:5bd441b8ab2d 544 {
miruga27 0:5bd441b8ab2d 545 //debug( "hola ...\r\n" );
miruga27 0:5bd441b8ab2d 546 //pc.printf( "hola...\r\n" );
miruga27 0:5bd441b8ab2d 547 // Send the RfS again
miruga27 0:5bd441b8ab2d 548 strcpy( ( char* )Buffer, ( char* )RfSMsg);
miruga27 0:5bd441b8ab2d 549 for( i = 4; i < BufferSize; i++ )
miruga27 0:5bd441b8ab2d 550 {
miruga27 0:5bd441b8ab2d 551 Buffer[i] = i - 4;
miruga27 0:5bd441b8ab2d 552 }
miruga27 0:5bd441b8ab2d 553 py=py_ant;pu=pu_ant;pv=pv_ant;
miruga27 0:5bd441b8ab2d 554 wait_ms( 10 );
miruga27 0:5bd441b8ab2d 555 Radio.Send( Buffer, BufferSize );
miruga27 0:5bd441b8ab2d 556 State = LOWPOWER;
miruga27 0:5bd441b8ab2d 557 }
miruga27 0:5bd441b8ab2d 558 //State = LOWPOWER;
miruga27 0:5bd441b8ab2d 559 break;
miruga27 0:5bd441b8ab2d 560 case TX_TIMEOUT:
miruga27 0:5bd441b8ab2d 561 Radio.Rx( RX_TIMEOUT_VALUE );
miruga27 0:5bd441b8ab2d 562 State = LOWPOWER;
miruga27 0:5bd441b8ab2d 563 break;
miruga27 0:5bd441b8ab2d 564 case LOWPOWER:
miruga27 0:5bd441b8ab2d 565 break;
miruga27 0:5bd441b8ab2d 566 default:
miruga27 0:5bd441b8ab2d 567 State = LOWPOWER;
miruga27 0:5bd441b8ab2d 568 break;
miruga27 0:5bd441b8ab2d 569 }
miruga27 0:5bd441b8ab2d 570 }
miruga27 0:5bd441b8ab2d 571 end:
miruga27 0:5bd441b8ab2d 572 int a;
miruga27 0:5bd441b8ab2d 573 }
miruga27 0:5bd441b8ab2d 574
miruga27 0:5bd441b8ab2d 575 void OnTxDone( void )
miruga27 0:5bd441b8ab2d 576 {
miruga27 0:5bd441b8ab2d 577 Radio.SetChannel( HoppingFrequencies[0] );
miruga27 0:5bd441b8ab2d 578 Radio.Sleep( );
miruga27 0:5bd441b8ab2d 579 State = TX;
miruga27 0:5bd441b8ab2d 580 debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" );
miruga27 0:5bd441b8ab2d 581 }
miruga27 0:5bd441b8ab2d 582
miruga27 0:5bd441b8ab2d 583 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
miruga27 0:5bd441b8ab2d 584 {
miruga27 0:5bd441b8ab2d 585 Radio.SetChannel( HoppingFrequencies[0] );
miruga27 0:5bd441b8ab2d 586 Radio.Sleep( );
miruga27 0:5bd441b8ab2d 587 BufferSize = size;
miruga27 0:5bd441b8ab2d 588 memcpy( Buffer, payload, BufferSize );
miruga27 0:5bd441b8ab2d 589 RssiValue = rssi;
miruga27 0:5bd441b8ab2d 590 SnrValue = snr;
miruga27 0:5bd441b8ab2d 591 State = RX;
miruga27 0:5bd441b8ab2d 592 debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" );
miruga27 0:5bd441b8ab2d 593 }
miruga27 0:5bd441b8ab2d 594
miruga27 0:5bd441b8ab2d 595 void OnTxTimeout( void )
miruga27 0:5bd441b8ab2d 596 {
miruga27 0:5bd441b8ab2d 597 Radio.SetChannel( HoppingFrequencies[0] );
miruga27 0:5bd441b8ab2d 598 Radio.Sleep( );
miruga27 0:5bd441b8ab2d 599 State = TX_TIMEOUT;
miruga27 0:5bd441b8ab2d 600 //debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
miruga27 0:5bd441b8ab2d 601 }
miruga27 0:5bd441b8ab2d 602
miruga27 0:5bd441b8ab2d 603 void OnRxTimeout( void )
miruga27 0:5bd441b8ab2d 604 {
miruga27 0:5bd441b8ab2d 605 Radio.SetChannel( HoppingFrequencies[0] );
miruga27 0:5bd441b8ab2d 606 Radio.Sleep( );
miruga27 0:5bd441b8ab2d 607 Buffer[ BufferSize ] = 0;
miruga27 0:5bd441b8ab2d 608 State = RX_TIMEOUT;
miruga27 0:5bd441b8ab2d 609 //debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
miruga27 0:5bd441b8ab2d 610 }
miruga27 0:5bd441b8ab2d 611
miruga27 0:5bd441b8ab2d 612 void OnRxError( void )
miruga27 0:5bd441b8ab2d 613 {
miruga27 0:5bd441b8ab2d 614 Radio.SetChannel( HoppingFrequencies[0] );
miruga27 0:5bd441b8ab2d 615 Radio.Sleep( );
miruga27 0:5bd441b8ab2d 616 State = RX_ERROR;
miruga27 0:5bd441b8ab2d 617 debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
miruga27 0:5bd441b8ab2d 618 }
miruga27 0:5bd441b8ab2d 619
miruga27 0:5bd441b8ab2d 620 void OnFhssChangeChannel( uint8_t channelIndex )
miruga27 0:5bd441b8ab2d 621 {
miruga27 0:5bd441b8ab2d 622 Radio.SetChannel( HoppingFrequencies[channelIndex] );
miruga27 0:5bd441b8ab2d 623 debug_if( DEBUG_MESSAGE, "F%d-", channelIndex);
miruga27 0:5bd441b8ab2d 624 }