// turn on RDC layer static int on(void) { PRINTF("turn on RDC layer\n"); #ifdef SF_MOTE_TYPE_AP rtimer_set(&BSTimer,RTIMER_NOW()+segment_period,0,TDMA_BS_send,NULL); return NETSTACK_RADIO.on(); #else // SF_MOTE_TYPE_SENSOR TDMA_SN_listen(); return 1; #endif }
// receives packet -- called in radio.c,radio.h static void input(void) { if(NETSTACK_FRAMER.parse() < 0) printf("Incorrect decode frame\n"); #ifdef SF_MOTE_TYPE_SENSOR /*-------------SN CODE----------------------*/ ctimer_stop(&SN_sleep_timer); ctimer_stop(&SN_listen_timer); //check if the packet is from BS if (!rimeaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_SENDER),&rimeaddr_null)) { printf("Packet is not from base station, rejected!\n"); incorrect_rx_counter++; if (incorrect_rx_counter < TOTAL_TS*2) { TDMA_SN_listen(); } else { TDMA_SN_sleep(); } return; } uint8_t *rx_pkt = (uint8_t *)packetbuf_dataptr(); uint16_t rx_pkt_len = packetbuf_datalen(); //turn off radio -- save power if(NETSTACK_RADIO.off() != 1) { printf("TDMA RDC: SN fails to turn off radio"); } SN_RX_start_time = packetbuf_attr(PACKETBUF_ATTR_TIMESTAMP); /*--------from BS------------*/ if (packetbuf_attr(PACKETBUF_ATTR_PACKET_TYPE) == PACKETBUF_ATTR_PACKET_TYPE_CMD) { //skip this period for TX rtimer_clock_t next_bkn_time = SN_RX_start_time + SEGMENT_PERIOD - GRD_PERIOD; rtimer_set(&SNTimer,next_bkn_time,0,NETSTACK_RADIO.on,NULL); #ifdef SF_FEATURE_SHELL_OPT char command_string[128]; strncpy(command_string,rx_pkt,rx_pkt_len); command_string[rx_pkt_len] = (uint8_t)'\0'; PRINTF("RX Command: %s %d\n",command_string,strlen(command_string)); //process_post(&remote_shell_process,remote_command_event_message,command_string); remote_shell_input(); return; #endif /* SF_FEATURE_SHELL_OPT */ } else if(packetbuf_attr(PACKETBUF_ATTR_PACKET_TYPE) == PACKETBUF_ATTR_PACKET_TYPE_DATA) { //schedule for TX if (sf_tdma_slot_num != -1) { //PRINTF("Schedule for TX at Slot %d\n",my_slot); rtimer_clock_t SN_TX_time = SN_RX_start_time + (BS_period+TS_period * (sf_tdma_slot_num-1))-GRD_PERIOD+33;//20 might need to be changed later, do better calibration, increase to 33 if timing problems rtimer_set(&SNTimer,SN_TX_time,0,TDMA_SN_send,NULL); } } app_conn_input(); //For debugging timing #endif /* SF_MOTE_TYPE_SENSOR */ #ifdef SF_MOTE_TYPE_AP /*-----------------BS CODE---------------*/ rimeaddr_t *sent_sn_addr = packetbuf_addr(PACKETBUF_ADDR_SENDER); uint8_t sent_sn_id = sent_sn_addr->u8[0]; rtimer_clock_t relFrameTime =(rtimer_clock_t)((packetbuf_attr(PACKETBUF_ATTR_TIMESTAMP)-radio_TX_time)%segment_period); uint16_t current_TS = (uint16_t)((relFrameTime-BS_period)/TS_period )+1; uint8_t packet_id = packetbuf_attr(PACKETBUF_ATTR_PACKET_ID); //set flag in pkt for TS occupancy /* if(node_list[current_TS-1] == FREE_SLOT_CONST) //collision -- ask the node to find a new available slot { //node_list[current_TS] = rx_pkt[NODE_INDEX]; node_list[current_TS-1] = sent_sn_id; } */ PRINTF("[Sensor: %u] [Slot: %u] [Seq: %u]\n", sent_sn_id,current_TS,packetbuf_attr(PACKETBUF_ATTR_PACKET_ID)); PRINTF("Channel: %d;", cc2420_get_channel()); PRINTF("RSSI: %d\n", cc2420_last_rssi-45); if(packetbuf_attr(PACKETBUF_ATTR_PACKET_TYPE) == PACKETBUF_ATTR_PACKET_TYPE_DATA) { // callback to application layer app_conn_input(); } #endif /*SF_MOTE_TYPE_AP */ }