Пример #1
0
/*----------------------------------------------------------------------------*/
  void 
  test_neighbor_table(void)
  {
    address_t addr1;
    addr1.u8[0] = 1;
    addr1.u8[1] = 1;
    uint8_t rssi1 = 100;

    address_t addr3;
    addr3.u8[0] = 1;
    addr3.u8[1] = 1;
    uint8_t rssi3 = 50;

    address_t addr2;
    addr2.u8[0] = 2;
    addr2.u8[1] = 2;
    uint8_t rssi2 = 200;

    if (!list_length(neighbor_table)){
      add_neighbor(&addr1,rssi1);
      add_neighbor(&addr2,rssi2);
      add_neighbor(&addr3,rssi3);
      print_neighbor_table();
    }else{
      purge_neighbor_table();
      print_neighbor_table();
    }
  }
Пример #2
0
//=============================================
void gradient_wakeup_timer()
{
  uint8_t next_hop_addr;
  mrfiPacket_t packetToSend;
  switch (gradient_state) {
  //--------------------------------------- transmitter
  case (GRADIENT_IDLE):                                   //wake_up timer
    /* stop preamble sampling */
    wor_stop(IS_SINK_NODE);
    /* stop possible timers */
    stop_timer();
    /* check that there is data to send */
    dataToSend = QgetInUseSlot(OUTQ);
    if (!dataToSend) {
      gradient_end_txrx();
      print_debug("\r\nno data to send",17);
      return;
    }
    /* TODO. check that the medium is free */
    set_timer(UF_PERIOD);                                  //wake_up timer
    /* send first uF */
    gradient_set_state(GRADIENT_TXUF);
    uf_counter = NUMBER_UF-1;
    gradient_build_UF(&packetToSend, uf_counter);
    MRFI_justTransmit(&packetToSend);
    break;
  case (GRADIENT_TXUF):                                   //wake_up timer
    if (uf_counter > 0) {
      uf_counter--;
      /* send uF */
      gradient_build_UF(&packetToSend, uf_counter);
      MRFI_justTransmit(&packetToSend);
    } else {
      stop_timer();
      /* send CW */
      gradient_set_state(GRADIENT_TXCW);
      gradient_build_CW(&packetToSend, CW_LENGTH);
      MRFI_justTransmit(&packetToSend);
      /* wait for ACK */
      gradient_set_state(GRADIENT_RXACK);
      gradient_init_neighbor_table();
      MRFI_RxOn();
      set_timer(CW_LENGTH);
    }
    break;
  case (GRADIENT_RXACK):                                  //wake_up timer
    stop_timer();
    print_neighbor_table(neighbors);
    gradient_update_height();
    print_height(myAddr,myHeight);
    next_hop_addr = gradient_next_hop();
    if (next_hop_addr==0) {
      gradient_end_txrx();
      print_fail("\r\nTX failed: no neighbor",24);
    } else {
      /* send DATA */
      gradient_set_state(GRADIENT_TXDATA);
      //if mine, complete with current neighbor list and empty hop count
      if ( (&(dataToSend->mrfiPkt))->frame[F_SRC]==myAddr) {
        gradient_build_DATA_headers(dataToSend);
      }
      (&(dataToSend->mrfiPkt))->frame[F_DATA_NEXT_HOP]=next_hop_addr;
      MRFI_justTransmit(&(dataToSend->mrfiPkt));
      /* wait for FIN */
      gradient_set_state(GRADIENT_RXFIN);
      MRFI_RxOn();
      set_timer(TIMEOUT_FIN);
    }
    break;
  case (GRADIENT_RXFIN):                                  //wake_up timer
    gradient_end_txrx();
    print_fail("\r\nTX failed: no FIN",19);
    break;
  //--------------------------------------- receiver
  case (GRADIENT_RXUF):                                   //wake_up timer
    stop_timer();
    /* wait for CW */
    gradient_set_state(GRADIENT_RXCW);
    MRFI_RxOn();
    set_timer(TIMEOUT_CW);
    break;
  case (GRADIENT_RXCW):                                   //wake_up timer
    gradient_end_txrx();
    print_fail("\r\nRX failed: no CW",18);
    break;
  case (GRADIENT_BACKOFFACK):                             //wake_up timer
    stop_second_random_timer();
    /* send ACK */
    gradient_set_state(GRADIENT_TXACK);
    gradient_build_ACK(&packetToSend, addr_initiator);
    MRFI_justTransmit(&packetToSend);
    gradient_set_state(GRADIENT_SENTACK);
    MRFI_RxIdle();
    break;
  case (GRADIENT_SENTACK):                                //wake_up timer
    stop_timer();
    /* wait for DATA */
    gradient_set_state(GRADIENT_RXDATA);
    MRFI_RxOn();
    set_timer(TIMEOUT_DATA);
    break;
  case (GRADIENT_RXDATA):                                 //wake_up timer
    gradient_end_txrx();
    print_fail("\r\nRX failed: no DATA",20);
    break;
  case (GRADIENT_TXFIN):                                  //wake_up timer
    stop_timer();
    /* send FIN */
    gradient_build_FIN(&packetToSend, addr_initiator);
    MRFI_justTransmit(&packetToSend);
    print_success("\r\nRX successful",15);
    print_DATA(&lastData, myAddr);
    gradient_end_txrx();
    break;
  }
}