/*---------------------------------------------------------------------------*/ static char plb_send_strobe(rimeaddr_t *dst, int *acked, uint8_t type) { PRINTF("plb_send_strobe [dst: %u.%u] [type: %x]\n",dst->u8[0],dst->u8[1],type); uint8_t strobe[MAX_STROBE_SIZE]; int strobe_len = 0; rtimer_clock_t wt; // Make PLB header packetbuf_clear(); if( (strobe_len = plb_create_header(dst,type)) < 0 ){ return -1; } // Make packet -> strobe strobe_len = strobe_len +1; // assign space for packet type if( strobe_len > (int)sizeof(strobe)) { /* Failed to send */ PRINTF("plb: send failed, too large header\n"); return -1; } memcpy(strobe, packetbuf_hdrptr(), strobe_len); /* Send beacon and wait ack : STROBE_NUM_MAX times */ int strobe_num = 0; radio_on(); while((strobe_num < STROBE_NUM_MAX) && ((*acked) == 0)){ PRINTF("plb_send_strobe : strobe %d\n",strobe_num); #if DEBUG_PACKET print_packet(strobe, strobe_len); #endif if(NETSTACK_RADIO.send(strobe, strobe_len) != RADIO_TX_OK){ return -1; } strobe_num ++; (*acked) = plb_wait_ack(type); if(*acked){ PRINTF("ack! return: %d\n", *acked); } } radio_off(); return 0; }
void nrf_tx(char data) { char tmp = nrf_read(NRF_FIFO_STATUS); if(tmp & NRF_STAT_TX_FULL) { return; } radio_on(); spi_csl(); spi_send(NRF_TX); spi_send(data); spi_csh(); nrf_ceh(); //start transmission (pulse CE > 10us) __delay_cycles(20); nrf_cel(); __delay_cycles(1000); radio_off(); }
/*---------------------------------------------------------------------------*/ static void plb_send_ack(uint8_t type){ uint8_t ack[MAX_ACK_SIZE]; int ack_len = 0; //set address from input packet addr_ack.u8[0]=packetbuf_addr(PACKETBUF_ADDR_SENDER)->u8[0]; addr_ack.u8[1]=packetbuf_addr(PACKETBUF_ADDR_SENDER)->u8[1]; PRINTF("plb_send_ack [dst: %u.%u] [type: %x]\n", addr_ack.u8[0], addr_ack.u8[1], type); packetbuf_clear(); if ((ack_len = plb_create_header(&addr_ack, type)) < 0) { PRINTF("ERROR: plb_create_header "); return; } ack_len++; //Make ack frame// if (ack_len > (int) sizeof(ack)) { // Failed to send // PRINTF("plb: send failed, too large header\n"); return; } memcpy(ack, packetbuf_hdrptr(), ack_len); // Send beacon and wait ack : STROBE_NUM_MAX times // radio_on(); #if DEBUG_PACKET print_packet(ack, ack_len); #endif if (NETSTACK_RADIO.send(ack, ack_len) != RADIO_TX_OK) { PRINTF("ERROR: plb ack send"); return; } radio_off(); return; }
void radio_setFrequency(uint8_t frequency) { // change state radio_vars.state = RADIOSTATE_SETTING_FREQUENCY; radio_off(); // configure the radio to the right frequecy if((frequency < CC2538_RF_CHANNEL_MIN) || (frequency > CC2538_RF_CHANNEL_MAX)) { while(1); return; } /* Changes to FREQCTRL take effect after the next recalibration */ HWREG(RFCORE_XREG_FREQCTRL) = (CC2538_RF_CHANNEL_MIN + (frequency - CC2538_RF_CHANNEL_MIN) * CC2538_RF_CHANNEL_SPACING); radio_on(); // change state radio_vars.state = RADIOSTATE_FREQUENCY_SET; }
/*---------------------------------------------------------------------------*/ static char plb_powercycle(void) { PRINT_P("plb_powercycle [sr:%d cw:%d]\n",send_req,c_wait); PT_BEGIN(&pt); while(1) { // check on/send state if(send_req == 1 && c_wait==1){ PRINTF("plb_powercycle send DATA <start>\n"); send_req = 0; //avoid repeat sending plb_send_data(sent_callback, sent_ptr); PRINTF("plb_powercycle send DATA <end>\n"); radio_off(); NETSTACK_MAC.input(); } /* on */ radio_on(); rtimer_set(&rt, RTIMER_NOW() + PC_ON_TIME, 1, (void (*)(struct rtimer *, void *))plb_powercycle, NULL); PT_YIELD(&pt); /* off */ if(wait_packet == 0){ radio_off(); } else if (wait_packet > 0) { wait_packet = 0; } rtimer_set(&rt, RTIMER_NOW() + PC_OFF_TIME, 1, (void (*)(struct rtimer *, void *))plb_powercycle, NULL); PT_YIELD(&pt); } PT_END(&pt); }
/*---------------------------------------------------------------------------*/ static int plb_send_sync(uint8_t type) //kdw sync { PRINTF("(sync) plb_send_sync [type : %x]\n",type); wait_packet = 2; //wait_packet: sync uint8_t sync[MAX_SYNC_SIZE]; int sync_len = 0; int sync_data_len = 1; //1 byte for app check int sync_hdr_len = 0; rimeaddr_t * temp_addr; if (type == SYNC_REQ){ temp_addr = &addr_next; // put data // sync_data_len += len_clock * 1; } else if (type == SYNC_ACK) { temp_addr = &addr_prev; // put data // sync_data_len += len_clock * 3; } else if (type == SYNC_END){ temp_addr = &addr_next; } else //error { PRINTF("ERROR: plb_create_header "); return -1; } PRINTF("[sync] plb_send_sync| type: %x dst: %u.%u\n",type, temp_addr->u8[0], temp_addr->u8[1]); if ((sync_hdr_len = plb_create_header(temp_addr, type)) < 0) { PRINTF("ERROR: plb_create_header "); return -1; } sync_len = sync_hdr_len + sync_data_len; if (sync_len > (int) sizeof(sync)) { // Failed to send // PRINTF("plb: send failed, too large header\n"); return -1; } memcpy(sync, packetbuf_hdrptr(), sync_hdr_len); // Send sync// radio_on(); PRINTF("[sync] send strobe ack \n"); #if DEBUG_PACKET print_packet(sync, sync_len); #endif if (NETSTACK_RADIO.send(sync, sync_len) != RADIO_TX_OK) { PRINTF("ERROR: plb ack send"); return -1; } // radio_off(); return type; }
/*---------------------------------------------------------------------------*/ static int plb_send_data(mac_callback_t sent, void *ptr) { PRINTF("plb_send_data\n"); int ret; //what is it? JJH int last_sent_ok = 0; int acked; int temp=0; acked = 0; if(packetbuf_attr(PACKETBUF_ATTR_PACKET_TYPE)==0) //if packet_type ==0, DATA JJH_START { plb_send_strobe(packetbuf_addr(PACKETBUF_ADDR_NEXT),&acked,PREAMBLE); if(acked==1) { PRINTF("plb_send_data DATA_PREAMBLE_ACKED!\n"); packetbuf_clear(); packetbuf_copyfrom(dataptr_temp,temp_len); if (plb_create_header(packetbuf_addr(PACKETBUF_ADDR_NEXT),DATA) < 0) { PRINTF("ERROR: plb_create_header "); return -1; //ERROR case : -1 } // hold_time(INTER_PACKET_INTERVAL * 5000); //future radio_on(); PRINTF("plb_send_data send DATA packet\n"); print_packet(packetbuf_hdrptr(), packetbuf_totlen()); if(NETSTACK_RADIO.send(packetbuf_hdrptr(), packetbuf_totlen())!=RADIO_TX_OK) { PRINTF("plb_send_data DATA error!\n"); return -1; //ERROR case ret = MAC_TX_ERR; } acked=plb_wait_data_ack(DATA); //just once? if(acked==1) //data ack received { PRINTF("plb_send_data DATA_ACKED!\n"); last_sent_ok=1; ret=MAC_TX_OK; } else if(!acked) { PRINTF("plb_send_data DATA error: no ack!\n"); ret=MAC_TX_ERR; } //sent connect mac_call_sent_callback(sent, ptr, ret, 1); radio_off(); packetbuf_clear(); // add kdw return last_sent_ok; } else if(acked==2)//if receive preamble ack data { PRINTF("PREAMBLE ACK DATA RECEIVED!\n"); } else//do not receive any ack, do nothing { PRINTF("DO NOT RECEIVED PREAMBLE ACK : error!!!\n"); } }//JJH_END return 0; }
void radio_rfOn() { radio_on(); }
void start_radio_on(void) { radio_on(-1); }
void start_radio_on_1(void) { radio_on(1); }
void start_radio_on_0(void) { radio_on(0); }