txrx_gnutella.c 18.1 KB
Newer Older
1 2 3 4 5

/* ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 *   ADAPTATION DU PROTOCOLE Gnutella POUR CAPTEURS MSP430-CC2500
 * ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
 * Utilise mrfi et bsp
6 7
 *
 * code fortement inspiré des travaux de Thomas Watteyne
8
 * https://cnx.org/contents/NUQaoek8@10.6:f0_AL5uL@3/4-2-Simple-Tx-Rx
9
 *
10 11
 * Gnutella original
 * https://courses.cs.washington.edu/courses/cse522/05au/gnutella_protocol_0.4.pdf
12
 *
13 14 15 16 17
 */

#include <mrfi.h>
//#include <radios/family1/mrfi_spi.h>
#include <bsp_leds.h>
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
18
#include <stdlib.h>
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

uint8_t *Flash_Addr = (uint8_t *)0x10F0;
static uint8_t Mac_Address[MRFI_ADDR_SIZE];

//===================================================================
//                        MACROS UTILES
//===================================================================

#define TURN_OFF_LEDS() P1OUT &= ~0x03 /* turn off LEDs */
#define TURN_OFF_RED_LED() P1OUT &= ~0x01
#define TURN_OFF_GREEN_LED() P1OUT &= ~0x02
#define TURN_ON_LEDS() P1OUT |= 0x03
#define TURN_ON_RED_LED() P1OUT |= 0x01
#define TURN_ON_GREEN_LED() P1OUT |= 0x02
#define WAIT_() for (uint16_t i = 0; i < 65535; i++){__no_operation();}

//===================================================================
//                        CONSTANTES UTILES
//===================================================================

39
// byte index of 'total length' field
Michel Yoeung's avatar
Michel Yoeung committed
40

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#define TOTAL_LENGTH_BYTE 0
// starting byte index of 'source address' field
#define SRC_ADDR_BYTE_START (TOTAL_LENGTH_BYTE+1)
// ending byte index of 'source address' field
#define SRC_ADDR_BYTE_END (SRC_ADDR_BYTE_START+MRFI_ADDR_SIZE-1)
// starting byte index of 'destination address' field
#define DST_ADDR_BYTE_START (SRC_ADDR_BYTE_END+1)
// ending byte index of 'destination address' field
#define DST_ADDR_BYTE_END (DST_ADDR_BYTE_START+MRFI_ADDR_SIZE-1)
// byte index of 'flag' field
#define FLAG_BYTE (DST_ADDR_BYTE_END+1)
// byte index of 'time to live' field
#define TTL_BYTE (FLAG_BYTE+1)
// byte index of 'hops' field
#define HOPS_BYTE (TTL_BYTE+1)
// byte index of 'descriptor id' field
#define SEQUENCE_ID_BYTE (HOPS_BYTE+1)
// starting byte index of 'payload' field
#define PAYLOAD_BYTE_START (SEQUENCE_ID_BYTE+1)
Michel Yoeung's avatar
Michel Yoeung committed
60 61
// ending byte index of 'payload' field
#define PAYLOAD_BYTE_END 28
62

63 64 65 66 67
#define MAX_PEERS 8
#define PING 0 // flag ping
#define PONG 1 // flag pong
#define QUERY 2 // flag query
#define QUERY_HIT 3 // flag query hit
Michel Yoeung's avatar
Michel Yoeung committed
68

69 70 71 72
// ttl
#define TTL 3
// history size
#define HISTORY_SIZE 20
73

Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
74 75
#define DELAY 50

76 77 78 79
//===================================================================
//                        VARIABLES GLOBALES
//===================================================================

80
 // table des adresses
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
81
uint8_t Peers[MAX_PEERS + 1][4] = {{0, 0, 0, 0},
82 83 84 85 86 87 88 89
                                    {0, 0, 0, 0},
                                    {0, 0, 0, 0},
                                    {0, 0, 0, 0},
                                    {0, 0, 0, 0},
                                    {0, 0, 0, 0},
                                    {0, 0, 0, 0},
                                    {0, 0, 0, 0},
                                    {0, 0, 0, 0}};
90
//indice du peer à qui le packet doit être envoyé
91
uint8_t peer_index = 0;
92
// packet qui contient la data pour le query
93
mrfiPacket_t packetSearch;
94
// debut du bit output
95 96 97
uint8_t index_output = 13;
// valeur à changer (ou pas) à chaque fois qu'on flash un capteur, pour simuler une donnée
uint8_t myData[] = "DAAAAAAAAAAAAAAA";
98 99 100 101 102 103 104 105 106 107


// historique des sequence ID messages recus
uint8_t history_id[HISTORY_SIZE];
// historique des adresses sources des messages recus
uint8_t* history_addr[HISTORY_SIZE];
// indice de l'id d'historique en cours (historique = tableau cyclique)
uint8_t history_index = 0;
// sequence id
uint8_t sequence_id = 1;
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
//===================================================================
//                        FONCTIONS UTILES
//===================================================================

/**
    Actually retrieve Device unique identifier written on Flash
**/
void retrieve_mac_address(){
    uint8_t *dst = Mac_Address;
	uint8_t *src = Flash_Addr;
	uint8_t len = sizeof(Mac_Address);
	while(len--) {
		*dst++ = *src++; // Back up default MAC address data in RAM
	}
}
/**
    Affiche une chaîne de caractère sur le port série
    @param string : la chaîne à afficher
    @param length : la longueur de la chaîne
**/
void TXString(char *string, int length)
{
    int pointer;
    for (pointer = 0; pointer < length; pointer++)
    {
        UCA0TXBUF = string[pointer];
        while (!(IFG2 & UCA0TXIFG))
            ; // USCI_A0 TX buffer ready?
    }
}

/**
Jean-Charles Mugnier's avatar
Jean-Charles Mugnier committed
140 141
    Affiche un entier (uint8_t) sur le port série
    @param nbr : l'entier à afficher
142 143 144 145 146 147 148 149 150
**/
void TXInt(uint8_t nbr)
{
    UCA0TXBUF = nbr;
    while (!(IFG2 & UCA0TXIFG))
        ; // USCI_A0 TX buffer ready?
}

/**
151 152
 Compare deux pointeurs de uint8_t. retourne 1 si ils sont égaux, 0 sinon.
 peut être utilisé pour comparer des adresses mac par exemple
153 154 155
 @param addr1 : la première adresse
 @param addr2 : la 2e adresse
**/
156
uint8_t compare(uint8_t* addr1, uint8_t* addr2){
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
157 158 159 160
    uint8_t len = 4;
    for (uint8_t i = 0; i < len; i++)
    {
        if(addr1[i] != addr2[i]){
161
            return 0;
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
162
        }
163
    }
164

165 166
    return 1;
}
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
167 168

/**
169
 * Affiche la table des adresses du capteur (Peers)
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
170 171
 **/
void print_addr_table() {
172

Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
173
    for (uint8_t i = 0; i <= MAX_PEERS; i++)
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
174 175 176 177 178 179 180
    {
        TXString((char*){" "},1);
        TXString((char*)Peers[i], 4);
        TXString((char*){"\n\r"},2);
    }
}

181 182 183 184
/**
 * retourne true si l'addr passé en param existe dans la table des adresses connues (Peers)
 **/
uint8_t addr_exists_in_table(uint8_t *addr) {
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
185
    for (uint8_t i = 0; i <= MAX_PEERS; i++)
186
    {
187
        if(compare(addr, Peers[i]))
188 189 190
            return 1;
    }

191
    return 0;
192 193
}

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
/**
 * Ajoute une adresse dans la table des adresses
**/
void add_addr_in_table(uint8_t *addr) {
    peer_index++;
    //print_peer_index(); debug
    for (uint8_t i = 0; i < MRFI_ADDR_SIZE; i++)
    {
        Peers[peer_index][i] = addr[i];
    }
}

/**
 * Met à jour l'historique des adresses recus
*/
void update_history(uint8_t *addr, uint8_t seq_id){
    // mise a jour de l historique
    history_id[history_index] = seq_id;
    history_addr[history_index] = addr;
    history_index = (history_index+1)%HISTORY_SIZE;
}

216 217 218 219 220 221 222
/**
 * retourne 1 si le message est present dans l historique, sinon 0
 * pour avoir un ID unique, on concatene l adresse source avec le numero de sequence recu
 **/
uint8_t message_in_history(uint8_t *addr, uint8_t id)
{
    for (uint8_t i = 0; i < HISTORY_SIZE; i++)
223
        if(compare(addr, history_addr[i]) && (id == history_id[i]))
224 225 226 227
            return 1;
    return 0;
}

228 229 230
/**
 * Fait clignoter les leds. 
 **/
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
void blink_init(void)
{
    uint16_t i, j;
    TURN_OFF_LEDS();
    for (j = 0; j < 5; j++)
    { /* blink LEDs alternatively */
        P1OUT ^= 0x01;
        for (i = 0; i < 65535; i++)
        {
            __no_operation();
        }
        P1OUT ^= 0x02;
        for (i = 0; i < 65535; i++)
        {
            __no_operation();
        }
    }
    TURN_OFF_LEDS();
}

251 252 253 254
/**
 * Permet au capteur d'attendre un temps aléatoire
 **/

Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
255 256 257 258 259 260 261 262
void wait_random() {
    uint8_t nb = rand()%(MAX_PEERS*4);
    for (uint8_t j = 0; j < nb; j++)
    {
        for (uint8_t k = 0; k < 3; k++)
        {
            WAIT_();
        }
263
    }
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
264 265
}

266 267 268 269 270 271 272 273
/**
 * permet de préparer un paquet pour l'envoi
 **/
void prepare_packet(mrfiPacket_t *packet, uint8_t flag, uint8_t *dest_addr) {
    // la taille du packet mrfi
    packet->frame[0] = PAYLOAD_BYTE_END;
    //mon adresse comme adresse source
    for ( uint8_t i = SRC_ADDR_BYTE_START; i <= SRC_ADDR_BYTE_END; i++)
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
274
    {
275
        packet->frame[i] =  Mac_Address[i-SRC_ADDR_BYTE_START];
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
276
    }
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
    // si il y a une adresse dest, la mettre dans le packet
    if(dest_addr != NULL) {
        for ( uint8_t i = DST_ADDR_BYTE_START; i <= DST_ADDR_BYTE_END; i++)
        {
            packet->frame[i] =  dest_addr[i-(MRFI_ADDR_SIZE + 1)];
        }
    }
    // le FLAG
    packet->frame[FLAG_BYTE] = flag;
    // le ttl
    packet->frame[TTL_BYTE] = TTL;
    // le hop
    packet->frame[HOPS_BYTE] = 0;
    // sequence id
    packet->frame[SEQUENCE_ID_BYTE] = sequence_id;
    sequence_id++;
    if(sequence_id >= 255) {
        sequence_id = 0;
    }
    //mise à jour de l'historique des messages
297
    //update_history(Mac_Address, sequence_id);
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
298 299
}

300 301 302 303 304 305 306 307 308 309 310 311 312 313
//===================================================================
//                        MAIN
//===================================================================

int main(void)
{
    BSP_Init();
    blink_init();
    retrieve_mac_address();
    //Initilisation du port série pour l'entrée sortie
    P3SEL    |= 0x30;     // P3.4,5 = USCI_A0 TXD/RXD
    UCA0CTL1  = UCSSEL_2; // SMCLK
    UCA0BR0   = 0x41;     // 9600 from 8Mhz
    UCA0BR1   = 0x3;
314
    UCA0MCTL  = UCBRS_2;
315 316 317 318
    UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine
    //Interuption pour les entrées sur le terminal
    // A activer pour mettre des inputs si besoin
    IE2      |= UCA0RXIE; // Enable USCI_A0 RX interrupt
319

320
    // initialisation de la payload du packet
Michel Yoeung's avatar
Michel Yoeung committed
321
    for (uint8_t i = PAYLOAD_BYTE_START; i <= PAYLOAD_BYTE_END; i++)
322 323
    {
        packetSearch.frame[i] = ' ';
324
    }
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
325

Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
326
    // notre adresse mac dans la table d'adresses
Michel Yoeung's avatar
Michel Yoeung committed
327
    for (uint8_t i = 0; i < MRFI_ADDR_SIZE; i++)
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
328 329 330
    {
        Peers[0][i] = Mac_Address[i];
    }
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
331 332 333 334 335

    //seed
    int seed = Mac_Address[0];
    seed = (seed >> 8) | Mac_Address[1];
    srand(seed);
336

Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
337

338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
    P1DIR &= ~0x04;
    P1REN |= 0x04;
    P1OUT |= 0x04;
    P1IE  |= 0x04;
    MRFI_Init();
    MRFI_SetLogicalChannel(2); // mrfiSpiWriteReg(CHANNR,0x10);
    MRFI_WakeUp();
    MRFI_RxOn();
    __bis_SR_register(GIE);
    return 0;
}

//===================================================================
//                       RECEPTION D'UN PAQUET
//===================================================================

void MRFI_RxCompleteISR()
355
{
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
356
    //print de mon addresse
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
357
    TXString((char*){"MY ADDR : "}, 10);
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
358
    TXString((char*)Mac_Address, 4);
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
359
    TXString((char*){"\n\r"}, 2);
Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
360

361
    mrfiPacket_t packet;
362 363 364 365 366
    uint8_t flag;
    uint8_t ttl;
    uint8_t hops;
    uint8_t _sequence_id;
    // recup du packet;
367 368 369
    MRFI_Receive(&packet);
    uint8_t src_addr[MRFI_ADDR_SIZE];

370
    // recup de l'adresse source du packet
Michel Yoeung's avatar
Michel Yoeung committed
371
    for (uint8_t i = SRC_ADDR_BYTE_START; i <= SRC_ADDR_BYTE_END; i++)
372
    {
Michel Yoeung's avatar
Michel Yoeung committed
373
        src_addr[i-SRC_ADDR_BYTE_START] = packet.frame[i];
374
    }
375 376 377 378 379 380 381
    //recup du flag, ttl, hops, seq id
    flag = packet.frame[FLAG_BYTE];
    ttl = packet.frame[TTL_BYTE];
    hops = packet.frame[HOPS_BYTE];
    _sequence_id = packet.frame[SEQUENCE_ID_BYTE];
    ttl--; hops++;

382
    if(ttl > 0 && !message_in_history(src_addr, _sequence_id)) {
383
        // mise à jour de l'historique des messages reçus
384
        //update_history(src_addr, _sequence_id);
385 386 387 388
        // differents traitement selon du flag
        if(flag == PING){
            /*
            si on recoit un ping, on regarde si l'adresse source du packet est dans notre table
389
            - si oui, on ne fait rien
390 391 392 393 394 395
            - si il n'y a plus de place dans la table, on ne fait rien
            - sinon , (on broadcast le message et) on save l'addr source dans la table et on envoi
                                                        un pong à destination de l'emetteur
            */
            if(!addr_exists_in_table(src_addr) && peer_index < MAX_PEERS) {
                TXString((char*){"PING\n\r"}, 6);
396 397 398
                // ajout de l'adresse source du packet à la table des adresses
                add_addr_in_table(src_addr);
                //print de ma table d'addrs 
399 400
                print_addr_table();

401
                mrfiPacket_t packet_to_send;
402
                prepare_packet(&packet_to_send, PONG, src_addr);
403 404 405 406
                //envoi du pong
                wait_random();
                MRFI_Transmit(&packet_to_send, MRFI_TX_TYPE_FORCED);
                //forward du ping recu
407
                TXString((char*){"FORWARD\n\r"}, 9);
408 409 410 411
                wait_random();
                packet.frame[TTL_BYTE] = ttl;
                MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED);

Valderane Potong Mboucheko's avatar
test  
Valderane Potong Mboucheko committed
412
            }
413
            else if (addr_exists_in_table(src_addr))
414
            {
415
                TXString((char*){"ADDRESS EXISTS\n\r"}, 16);
416
                TXString((char*){"DROP\n\r"}, 6);
417
            }
418
            else {
419
                TXString((char*){"NOT ENOUGH SPACE IN TABLE\n\r"}, 27);
420
                TXString((char*){"DROP\n\r"}, 6);
421 422 423
            }

        }
424

425
        else if (flag == PONG)
426
        {
427 428 429 430 431
            /*
            Si l'addr dest du pong nous est destiné, on enregistre l'addr source dans notre table
            sinon on fait rien (on forward juste)
            */
            TURN_ON_GREEN_LED();
432

433
            uint8_t dest_addr[MRFI_ADDR_SIZE];
Michel Yoeung's avatar
Michel Yoeung committed
434
            for ( uint8_t i = DST_ADDR_BYTE_START; i <= DST_ADDR_BYTE_END; i++)
435
            {
Michel Yoeung's avatar
Michel Yoeung committed
436
                dest_addr[i-DST_ADDR_BYTE_START] = packet.frame[i];
437
            }
438
            if(compare(dest_addr, Mac_Address) && !addr_exists_in_table(src_addr) &&
439
                                                                peer_index < MAX_PEERS) {
440
                TXString((char*){"PONG\n\r"}, 6);
441
                add_addr_in_table(src_addr);
442 443
                //print de ma table d'addrs
                print_addr_table();
444 445 446
            }
            else {
                //forward du pong recu
447
                TXString((char*){"FORWARD\n\r"}, 9);
448 449 450 451 452
                wait_random();
                packet.frame[TTL_BYTE] = ttl;
                MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED);
            }
            TURN_OFF_GREEN_LED();
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
453
        }
454

455
        else if (flag == QUERY)
456
        {
457 458
            /*
            Si on a la ressource de la payload, répondre à celui qui envoi avec un QUERY_HIT
459
            /!\ l'addr source doit être connue du capteur
460 461 462 463 464 465
            Si on a pas la ressource on forward
            */
            mrfiPacket_t packet;
            MRFI_Receive(&packet);
            uint8_t data[] = {"                   "};
            // recup de la payload
Michel Yoeung's avatar
Michel Yoeung committed
466
            for (uint8_t i = PAYLOAD_BYTE_START; i <= PAYLOAD_BYTE_END; i++)
467
            {
Michel Yoeung's avatar
Michel Yoeung committed
468
                data[i-PAYLOAD_BYTE_START] = packet.frame[i];
469
            }
470

471
            if(addr_exists_in_table(src_addr) && compare(data, myData)) { // TODO changer le nom de cette fct de comparaison
472 473
                // j'ai la data, je send un query hit
                TXString((char*){"QUERY_HIT\n\r"}, 11);
474
                prepare_packet(&packet, QUERY_HIT, src_addr);
475
                //envoi
476
                wait_random();
477 478 479 480 481
                MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED);

            }
            else if(!addr_exists_in_table(src_addr)) {
                TXString((char*){"UNKNOWN\n\r"}, 9);
482
                TXString((char*){"DROP\n\r"}, 6);
483
            }
484
            else if(!compare(data, myData)) {
485
                TXString((char*){"NO DATA\n\r"}, 9);
486
                TXString((char*){"FORWARD\n\r"}, 9);
487 488 489 490
                //forward du query recu
                wait_random();
                packet.frame[TTL_BYTE] = ttl;
                MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED);
491 492
            }
        }
493

494 495
        else if (flag == QUERY_HIT)
        {
496
            /*
497 498 499 500
            Si on est le destinataire du message, on affiche la payload sur minicom
            sinon on forward
            */
            uint8_t dest_addr[MRFI_ADDR_SIZE];
Michel Yoeung's avatar
Michel Yoeung committed
501
            for ( uint8_t i = DST_ADDR_BYTE_START; i <= DST_ADDR_BYTE_END; i++)
502
            {
Michel Yoeung's avatar
Michel Yoeung committed
503
                dest_addr[i-DST_ADDR_BYTE_START] = packet.frame[i];
504
            }
505
            if(compare(dest_addr, Mac_Address)) {
506
                char output[] = {"                   \n\r"};
Michel Yoeung's avatar
Michel Yoeung committed
507
                for (uint8_t i = PAYLOAD_BYTE_START; i <= PAYLOAD_BYTE_END; i++)
508
                {
Michel Yoeung's avatar
Michel Yoeung committed
509
                    output[i-PAYLOAD_BYTE_START] = packet.frame[i];
510
                }
511
                wait_random();
512
                TXString((char*){"RECEIVED : "}, 11);
513 514 515 516
                TXString(output, sizeof(output));
            }
            else {
                //forward du query recu
517
                TXString((char*){"FORWARD\n\r"}, 9);
518 519 520 521
                wait_random();
                packet.frame[TTL_BYTE] = ttl;
                MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED);
            }
522

523
        }
524
    }
525
    else if(ttl <= 0){
526 527 528
        TXString((char*){"TTL <= 0\n\r"}, 10);
        TXString((char*){"DROP\n\r"}, 6);
    }
529 530 531 532
    else if(message_in_history(src_addr, _sequence_id)){
        TXString((char*){"MESSAGE ALREADY RECEIVED\n\r"}, 26);
        TXString((char*){"DROP\n\r"}, 6);
    }
533 534 535 536 537 538 539 540 541 542 543 544 545 546

}

//===================================================================
//                        APPUI SUR BOUTON
//===================================================================

__attribute__((interrupt(PORT1_VECTOR))) void Port_1(void)
{
    // envoi d'un packet soit en broadcast, soit à une adresse
    P1IFG &= ~0x04;
    mrfiPacket_t packet;
    packet.frame[0] = 8 + 20;
    //mon adresse comme adresse source
Michel Yoeung's avatar
Michel Yoeung committed
547
    for ( uint8_t i = SRC_ADDR_BYTE_START; i <= SRC_ADDR_BYTE_END; i++)
548
    {
Michel Yoeung's avatar
Michel Yoeung committed
549
        packet.frame[i] =  Mac_Address[i-SRC_ADDR_BYTE_START];
550 551 552
    }

    //specifier qu'on fait un ping
Michel Yoeung's avatar
Michel Yoeung committed
553
    packet.frame[FLAG_BYTE] = PING;
554 555 556 557 558 559 560 561
    //packet.frame[10] = 15; //TTL
    MRFI_Transmit(&packet, MRFI_TX_TYPE_FORCED);
}

//===================================================================
//                        SAISIE SUR MINICOM
//===================================================================

Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
562 563 564
__attribute__((interrupt(USCIAB0RX_VECTOR))) void USCI0RX_ISR(void)
{
    /*
565
    TODO
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
566 567 568 569
    quand on appui sur entrée (\r) envoyer un paquet avec :
    - adresse source : Mac_adress
    - adresse destination : vide
    - FLAG : QUERY
570 571 572
    - TTL
    - HOPS
    - numéro de séquence
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
573 574 575 576 577 578 579 580 581
    - payload : le truc saisi
    */

    char rx = UCA0RXBUF;
    uint8_t i;
    packetSearch.frame[index_output] = rx;
    index_output++;
    if (rx == '\r' || index_output == 29)
    {
582
        prepare_packet(&packetSearch, QUERY, NULL);
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
583 584
        TXString((char*){"\n\rQUERY\n\r"}, 9);
        MRFI_Transmit(&packetSearch, MRFI_TX_TYPE_FORCED);
585
        index_output = 13;
Michel Yoeung's avatar
Michel Yoeung committed
586
        for (i = PAYLOAD_BYTE_START; i <= PAYLOAD_BYTE_END; i++)
Valderane Potong Mboucheko's avatar
Valderane Potong Mboucheko committed
587 588 589 590 591
        {
            packetSearch.frame[i] = ' ';
        }
    }
    TXString(&rx, 1);
592
}