예제 #1
0
/*------------------------------------------------------------------------------
 * MRFI Rx interrupt service routine
 *----------------------------------------------------------------------------*/
void MRFI_RxCompleteISR( void ) {
  mrfiPacket_t rx_packet;

  /* Grab packet from buffer */
  MRFI_Receive(&rx_packet);
  
  /* Send packet off to be processed in another thread */
  ProcessPacket(rx_packet);
}
예제 #2
0
/******************************************************************************
* @fn          MRFI_RxCompleteISR
*
* @brief       This function is called by the ISR of MRFI at RF receive and MUST
*              be included in all applications. It should be as short as possible
*              to avoid lengthy processing in the ISR.
*
* @param       none
*
* @return      void
*/
void MRFI_RxCompleteISR()
{
    uint8 pktType;

    MRFI_Receive(&pkt);
    pktType= MRFI_P_PAYLOAD(&pkt)[1];

    if (MRFI_GET_PAYLOAD_LEN(&pkt)==2 && pktType==MRFI_LINK_ACK) {
        fAckRdy= TRUE;
    } else if (pktType==MRFI_LINK_DATA) {
        mrfiPktRdy= TRUE;
    }
}
예제 #3
0
/******************************************************************************
 * @fn          MRFI_RxCompleteISR
 *
 * @brief       Here on Rx interrupt from radio. Process received frame from the
 *              radio Rx FIFO.
 *
 * input parameters
 *
 * output parameters
 *
 * @return      void
 */
void MRFI_RxCompleteISR()
{
  frameInfo_t  *fInfoPtr;

  /* room for more? */
  if (fInfoPtr=nwk_QfindSlot(INQ))
  {
    MRFI_Receive(&fInfoPtr->mrfiPkt);

    dispatchFrame(fInfoPtr);
  }

  return;
}
예제 #4
0
void MRFI_RxCompleteISR()
{
  mrfiPacket_t packet;
  stop_fast_timeout();
  stop_slow_timeout();
  MRFI_Receive(&packet);
  if (packet.frame[9]<4) {
    print_counter(packet.frame[9]);
    start_slow_timeout();
  } else {
    MRFI_WakeUp();
    MRFI_RxOn();
  }
}
예제 #5
0
void MRFI_RxCompleteISR()
{
  BSP_TOGGLE_LED1();
  MRFI_Receive(&inBuffer);
  uint8_t pkt_type = GET_FROM_FRAME(MRFI_P_PAYLOAD(&inBuffer), F_TYPE);
  switch (pkt_type) {
  case (F_TYPE_UF):
#ifdef PRINT_UF
    print_time();
    print_UF(&inBuffer);
#endif
    break;
  case (F_TYPE_CW):
#ifdef PRINT_CW
    print_time();
    print_CW(&inBuffer);
#endif
    break;
  case (F_TYPE_ACK):
#ifdef PRINT_ACK
    print_time();
    print_ACK(&inBuffer);
#endif
    break;
  case (F_TYPE_DATA):
#ifdef PRINT_DATA
    print_time();
    print_DATA(&inBuffer);
#endif
    break;
  case (F_TYPE_FIN):
#ifdef PRINT_FIN
    print_time();
    print_FIN(&inBuffer);
#endif
    break;
  default:
    print_time();
    print_debug("\r\nError: Unrecognized packet format",35);
  }
  BSP_TOGGLE_LED1();
}
예제 #6
0
파일: swap.c 프로젝트: abdul/OpenChronos
/**
 * MRFI_RxCompleteISR
 *
 * Callback function called whenever a new wireless packet is received
 */
void MRFI_RxCompleteISR(void)
{
  SWPACKET swPacket;
  mrfiPacket_t mPacket;

  MRFI_Receive(&mPacket);

  swPacket.value.length = mPacket.frame[0] - SWAP_DATA_HEAD_LEN;
  swPacket.destAddr = mPacket.frame[1];
  swPacket.srcAddr = mPacket.frame[2];
  swPacket.hop = (mPacket.frame[3] >> 4) & 0x0F;
  swPacket.security = mPacket.frame[3] & 0x0F;
  swPacket.nonce = mPacket.frame[4];
  swPacket.function = mPacket.frame[5];
  swPacket.regAddr = mPacket.frame[6];
  swPacket.regId = mPacket.frame[7];
  swPacket.value.data = mPacket.frame + 8;

  dispatchSwapPacket(&swPacket);

  return;
}
예제 #7
0
void MRFI_RxCompleteISR()
{
  P1OUT |= 0x02;
  P2OUT |= 0x04;
  uint8_t erase_me=0;
  uint8_t channel;
  MRFI_Receive(&packet);
  channel = (uint8_t)((packet.frame[9]-'0')*10+(packet.frame[10]-'0'));
  erase_me++;
  if (channel>=11 && channel<=26) {
     /* set timer */
     BCSCTL3 |= LFXT1S_2;
     TACCR0=1000; //~.1sec
     TACTL=TASSEL_1+MC_1;
     TACCTL0=CCIE;
     /* set frequency */
     MRFI_RxIdle();
     switch(channel) {
        case 11: mrfiSpiWriteReg(CHANNR,0x00); break;
        case 12: mrfiSpiWriteReg(CHANNR,0x0D); break;
        case 13: mrfiSpiWriteReg(CHANNR,0x19); break;
        case 14: mrfiSpiWriteReg(CHANNR,0x26); break;
        case 15: mrfiSpiWriteReg(CHANNR,0x32); break;
        case 16: mrfiSpiWriteReg(CHANNR,0x3F); break;
        case 17: mrfiSpiWriteReg(CHANNR,0x4B); break;
        case 18: mrfiSpiWriteReg(CHANNR,0x58); break;
        case 19: mrfiSpiWriteReg(CHANNR,0x64); break;
        case 20: mrfiSpiWriteReg(CHANNR,0x71); break;
        case 21: mrfiSpiWriteReg(CHANNR,0x7D); break;
        case 22: mrfiSpiWriteReg(CHANNR,0x8A); break;
        case 23: mrfiSpiWriteReg(CHANNR,0x96); break;
        case 24: mrfiSpiWriteReg(CHANNR,0xA3); break;
        case 25: mrfiSpiWriteReg(CHANNR,0xAF); break;
        case 26: mrfiSpiWriteReg(CHANNR,0xBC); break;
     }
  }
  P2OUT &= ~0x04;
  P1OUT &= ~0x02;
}
예제 #8
0
파일: synchrone.c 프로젝트: seaguest/Sensor
void MRFI_RxCompleteISR()
{
	mrfiPacket_t PacketRecieved;
	mPacket Packet;
	char rssi ;

	uint8_t ID_Network_tmp, ID_Beacon_tmp ,src ,i ,data;
	uint32_t voisin_voisin;					//the voisin of voisin

	MRFI_Receive(&PacketRecieved);
	RecievemPacket(&PacketRecieved ,&Packet);

	if(Packet.flag == FBEACON){	
		etat.Surveille_Cnt = ( etat.Surveille_Cnt + 1 )%65535;

		ID_Network_tmp = Packet.payload.beacon.ID_Network;
		ID_Beacon_tmp  = Packet.payload.beacon.ID_Slot;
		src  = Packet.src;
		voisin_voisin = Packet.payload.beacon.Voisin;
		rssi = PacketRecieved.rxMetrics[0]; 
		if(rssi > -84){			//seuil avec pwr(0) ,distance 70cm
			etat.check[src-1] = (etat.check[src-1] + 1)%65535;	//make sure if the voisin is there
			Add_router(&etat , src, voisin_voisin);		//every time it recieve the beacon , update the route table
		}
/*
		print_8b(ID_Network_tmp);
		print_8b(ID_Beacon_tmp);
		print(" ");
		print_8b(-rssi);
		print("\n\r");
*/

		if(rssi < -84 && etat.ID_Beacon == ID_Beacon_tmp && etat.ID_Beacon !=0 && etat.HOST == IS_NOT_CREATER){ //if the beacon source go far , choose another
			Stop_Timer();
		}else{
			if(etat.synchrone == 0 && etat.HOST == IS_NOT_CREATER){	
				Stop_Timer();
				etat.ID_Network = ID_Network_tmp;		 
				etat.ID_Beacon  = ID_Beacon_tmp;
			 	etat.synchrone = 1;			 

				if(etat.MAC > etat.ID_Beacon ){
					etat.state = WAIT_BEACON ;	//change the state
					timer_send_beacon(&etat);	
				}else{
					etat.state = WAIT_SYNCHRONE ;	//change the state
					timer_synchrone(&etat);
				}	
			} 
			if(ID_Network_tmp < etat.ID_Network){			//if there is 2 network collision
				if(etat.HOST == IS_CREATER){
					etat.HOST = IS_NOT_CREATER;
					P1OUT ^= 0x02;   			//jaune led
				}	
				Stop_Timer();
				etat.ID_Network = ID_Network_tmp;		 
				etat.ID_Beacon  = ID_Beacon_tmp;
			 	etat.synchrone = 1;			 

				if(etat.MAC > etat.ID_Beacon ){
					etat.state = WAIT_BEACON;	//change the state
					timer_send_beacon(&etat);	
				}else{
					etat.state = WAIT_SYNCHRONE ;	//change the state
					timer_synchrone(&etat);
				}			
			}
		}
	}else if(Packet.flag == FDATA){
		if(Packet.payload.data.Next_hop == etat.MAC){ 	//if next hop is him, relay and change the next hop
			if(Packet.dst == etat.MAC){			//if it is really for me
				etat.Dst = Packet.src;
				if(UART_MODE!=2){			//change mode to type if recieve a paquet
					UART_MODE = 2;
					print("\n\rRecieved message from: ");
					print_8b(etat.Dst);
					print("\n\r");
				}
				for (i=0;i<Packet.length-11;i++) {
					data = Packet.payload.data.data[i];
					EnQueue(&etat.FIFO_Recieve,data);
				}
			}else{						//if it just nedd relay
				P1OUT ^= 0x02; 
				PacketRecieved.frame[10] = Find_next_hop(&etat , Packet.dst);
				MRFI_Transmit(&PacketRecieved, MRFI_TX_TYPE_CCA);
				//MRFI_Transmit(&PacketRecieved, MRFI_TX_TYPE_FORCED);	
			}
		}
		if(Packet.dst == BROADCAST){				//if it is message broadcast
			for (i=0;i<Packet.length-11;i++) {
				data = Packet.payload.data.data[i];
				EnQueue(&etat.FIFO_Recieve,data);
			}
		}
	}else if(Packet.flag == FRIP){		//recieve the packet of rip then update the router table
		Update_rip(&etat ,&Packet);
	}
}
예제 #9
0
//=============================================
void gradient_wakeup_rx()
{
  mrfiPacket_t packetReceived;
  frameInfo_t * freeSlot;
  MRFI_Receive(&packetReceived);
  uint8_t pkt_next_hop;
  uint8_t pkt_type = packetReceived.frame[F_TYPE];
  switch (gradient_state) {
  //--------------------------------------- transmitter
  case (GRADIENT_RXACK):                                  //rx
    pkt_next_hop = packetReceived.frame[F_ACK_NEXT_HOP];
    if (pkt_type==F_TYPE_ACK && pkt_next_hop==myAddr) {
      gradient_add_neighbor(&packetReceived);
    }
    break;
  case (GRADIENT_RXFIN):                                  //rx
    pkt_next_hop = packetReceived.frame[F_FIN_NEXT_HOP];
    if (pkt_type==F_TYPE_FIN && pkt_next_hop==myAddr) {
      stop_timer();
      print_success("\r\nTX successful",15);
      QfreeSlot(dataToSend);
      gradient_end_txrx();
    }
    break;
  //--------------------------------------- receiver
  case (GRADIENT_IDLE):                                   //rx
    if (pkt_type==F_TYPE_UF) {
      /* stop preamble sampling */
      wor_stop(IS_SINK_NODE);
      /* stop possible timers (if OUTQ not empty) */
      stop_timer();
      gradient_set_state(GRADIENT_RXUF);
      addr_initiator = packetReceived.frame[F_SRC];
      MRFI_RxIdle();
      set_timer((packetReceived.frame[F_UF_COUNTER])*UF_PERIOD-GUARD_CW);
    }
    break;
  case (GRADIENT_RXCW):                                   //rx
    if (pkt_type==F_TYPE_CW) {
      stop_timer();
      gradient_set_state(GRADIENT_BACKOFFACK);
      MRFI_RxIdle();
      /* second timer to send my ACK */
      set_second_random_timer((packetReceived.frame[F_CW_CWDURATION])-GUARD_DATA-ACK_DURATION);
      /* main timer at the end of CW */
      set_timer((packetReceived.frame[F_CW_CWDURATION])-GUARD_DATA);
    } else if (pkt_type==F_TYPE_UF) {
      set_timer(TIMEOUT_CW);
    }
    break;
  case (GRADIENT_RXDATA):                                 //rx
    pkt_next_hop = packetReceived.frame[F_DATA_NEXT_HOP];
    if (pkt_type==F_TYPE_DATA && pkt_next_hop==myAddr) {
      stop_timer();
      gradient_build_DATA_path(&packetReceived); //add myAddr to packet
      if (myHeight!=0) { //I'm not a sink
        /* add packet to outQ for later relaying if not sink */
        print_debug("\r\nQueued for relay",18);
        freeSlot = QfindFreeSlot(OUTQ);
        if (freeSlot) {
          freeSlot->mrfiPkt = packetReceived;
        }
      } else {       //I'm a sink
        /* process incoming packet through INQ */
        frameInfo_t * freeSlot = QfindFreeSlot(INQ);
        if (freeSlot) {
          freeSlot->mrfiPkt = packetReceived;
          lastData = packetReceived;
          QfreeSlot(freeSlot);
        }
      }
      /* delay before sending FIN */      
      gradient_set_state(GRADIENT_TXFIN);
      MRFI_RxIdle();
      set_timer(DELAY_FIN);
    }
    break;
  }
}