/*----------------------------------------------------------------------------*/ 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(); } }
//============================================= 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; } }