Пример #1
0
/*---------------------------------------------------------------------------*/
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;
}
Пример #2
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();
}
Пример #3
0
/*---------------------------------------------------------------------------*/
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;
}
Пример #4
0
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;
}
Пример #5
0
/*---------------------------------------------------------------------------*/
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);
}
Пример #6
0
/*---------------------------------------------------------------------------*/
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;
}
Пример #7
0
/*---------------------------------------------------------------------------*/
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;
}
Пример #8
0
void radio_rfOn() {
  radio_on();
}
Пример #9
0
void start_radio_on(void)
{
	radio_on(-1);
}
Пример #10
0
void start_radio_on_1(void)
{
	radio_on(1);
}
Пример #11
0
void start_radio_on_0(void)
{
	radio_on(0);
}