📄 mac.c
字号:
{
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 + -