⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.c

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 C
📖 第 1 页 / 共 2 页
字号:
{
    PhysicalTxPkt(ctrlPktPt,ctrlPktLen );		// 调用物理层发送接口发送数据包
	radioState = RADIO_TX;
	state = TX_PKT;
}



/*************************************************************************
*功能描述:物理层发送完成,通知MAC
*参数说明:包地址
*返回值:  
**************************************************************************/
result_t MACPhysicalTxPktDone(void* packet)
{   
	char pktType;
	
	if (packet == 0 || state != TX_PKT) {
		MACTxReset();
		return FAIL;  
		}

	pktType = *((char*)packet + 1);
	switch (pktType) { 
	case RTS_PKT:
	    break;
	case CTS_PKT:  
		break;
	case DATA_PKT:
		if (((OSMACMsgPtr)packet)->toAddr == OS_BCAST_ADDR) {	// 发广播完成
		    MACTxReset();
            TransmitDone(dataPkt);
        } 
		else													// 发单播完成
		{
			if(ACK_ON == 1){
			//县设置等待时间实现mac的隔离
			SetWaitTime();
			MACTxReset();
			} else {
			MACTxReset();
			TransmitDone(dataPkt);
			}
			
        }
		break;
	case ACK_PKT:										// ACK发送完成,进入空闲
	    MACTxReset();
	    break;
	default: MACTxReset();
	}
	return SUCCESS;
}


/*************************************************************************
*功能描述:物理层调用,通知MAC层信道忙,MAC转入空闲态,可以接收数据
*参数说明:
*返回值:  执行结果
**************************************************************************/
result_t MACChannelBusy()
{
	MACTxReset();
	return SUCCESS;
}

/*************************************************************************
*功能描述:物理层调用,通知MAC层信道闲,根据发送方式发送数据包
*参数说明:
*返回值:  执行结果
**************************************************************************/
result_t MACChannelIdle()
{   //有可能同时进行载波监听和接受,在载波监听的时候,接受有效,state改为BACKOFF
	if (state != CARR_SENSE) {
		return FAIL;
		}
	if (howToSend == BCAST_DATA) {
		startBcast();
	}

	return SUCCESS;
}                                                  

/*************************************************************************
*功能描述:物理层调用,检测到起始字符,通知MAC准备接收数据包
*参数说明:
*返回值:  执行结果
**************************************************************************/
result_t MACStartSymDetected(void* pkt)
{
	radioState = RADIO_RX;
	//
	if (state == IDLE || state == CARR_SENSE) {
	    oldstate = state;
        state = BACKOFF;
	}
	return SUCCESS;
}

/*************************************************************************
*功能描述:处理错误数据包,进入睡眠
*参数说明:
*返回值:  执行结果
**************************************************************************/
static void handleErrPkt(void)
{

    MACTxReset();

}

/*************************************************************************
*功能描述:物理层调用,对已经接收到的数据包根据包类型调用相就的处理函数
*参数说明:包地址 接收出错标志
*返回值:  执行结果
**************************************************************************/
void* MACPhysicalRxPktDone(void* packet, char error)
{
	char pktType;

	radioState = RADIO_IDLE;
	
	if (error) {					// 接收到错误包,有碰撞发生
		handleErrPkt();
		return packet;
	}
   // MACTxReset();
	pktType = *((char*)packet + 1);
	if (pktType == DATA_PKT) {
		return handleDATA(packet);
	} else if (pktType == RTS_PKT) {
		handleRTS(packet);
	} else if (pktType == CTS_PKT) {
		handleCTS(packet);
	} else if (pktType == ACK_PKT) {
		handleACK(packet);
	} else {  
		handleErrPkt();
	} 
	return packet;
}

/*************************************************************************
*功能描述:对接收到的RTS数据包进行处理
*参数说明:包地址
*返回值:  
**************************************************************************/
static void handleRTS(void* pkt)
{

}

/*************************************************************************
*功能描述:对接收到的CTS数据包进行处理
*参数说明:包地址
*返回值:  
**************************************************************************/
static void handleCTS(void* pkt)
{

}

/*************************************************************************
*功能描述:对接收到的DATA数据包进行处理
*参数说明:包地址
*返回值:  包地址
**************************************************************************/
static void* handleDATA(void* pkt)
{  
	void* tmp = pkt;
	OSMACMsgPtr packet = (OSMACMsgPtr)pkt;
	
	if (packet->toAddr == OS_BCAST_ADDR) {  
		if (state == BACKOFF) {state = oldstate;oldstate = IDLE;}
		ReceiveDone(pkt);
		return tmp;
	} else if (packet->toAddr == OS_LOCAL_ADDRESS) {
		// 处理单播数据包
		if (state == BACKOFF)  {state = oldstate;oldstate = IDLE;}
		///加入检测是否缓冲队列是否有空的检查
		if((ACK_ON == 1)&&(GetFreeQueueLength() > 0)) {
           sendACK(packet->fromAddr);
		   ReceiveDone(packet);
		 } else if( ACK_ON == 0 )  {		 
		                ReceiveDone(packet);
		              }
		return tmp;
	} else { 
		//MACTxReset();
		{state = oldstate;oldstate = IDLE;}
	}
	return pkt;
}

/*************************************************************************
*功能描述:对接收到的ACK数据包进行处理
*参数说明:包地址
*返回值:  
**************************************************************************/
static void handleACK(void* pkt)
{
     char intEnabled;
	 OSMACMsgPtr packet = (OSMACMsgPtr)pkt;
	 if (state == BACKOFF) {state = oldstate;oldstate = IDLE;}
	 if (packet->toAddr == OS_LOCAL_ADDRESS){
	  LedYellowToggle(); 
	 if(AckWaitTime > 0) {
	    // 设置发送请求标识
	    intEnabled = inp(SREG) & 0x80;
	    cli();
		AckWaitTime = 0;
		if (intEnabled) sei();
		}
	TransmitDone(dataPkt);
	 } else {
	 state = oldstate;
	 oldstate = IDLE;
	 }
}

/*************************************************************************
*功能描述:设置RTS帧,发送RTS数据包
*参数说明:
*返回值:  
**************************************************************************/
/*
static void sendRTS()
{
}
*/
/*************************************************************************
*功能描述:设置CTS帧,发送CTS数据包
*参数说明:
*返回值:  
**************************************************************************/
/*
static void sendCTS()
{
}
*/
/*************************************************************************
*功能描述:设置DATA帧,发送数据包
*参数说明:
*返回值:  
**************************************************************************/
/*
static void sendDATA()
{
}
*/

/*************************************************************************
*功能描述:设置ACk等待时间
*参数说明:
*返回值:
*************************************************************************/
static void SetWaitTime(void){
    char intEnabled;
	intEnabled = inp(SREG) & 0x80;
	cli();
    AckWaitTime = ACKTIME;
	if (intEnabled) sei();
}

/************************************************************************
*功能描述:MACClock时钟中断响应
*参数说明:
*返回值:
*************************************************************************/
void MACClockFire(void){
    if( AckWaitTime > 0 ) {
	AckWaitTime = AckWaitTime - 1;
	    if( AckWaitTime == 0 ) {
              SendFail(dataPkt);
				 }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -