JPEG compressor

Dependencies:   SDL_lib SX1276Lib mbed

Committer:
miruga27
Date:
Wed Jan 11 20:20:00 2017 +0000
Revision:
2:f256eebcade8
Parent:
1:f0c646dfe574
JPEG Compressor and SX1276 transmitter

Who changed what in which revision?

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