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

📄 mftmac.c.bak

📁 motorola jw32 usb 源码
💻 BAK
📖 第 1 页 / 共 5 页
字号:
 * Overview:        Fetches rx frame one byte at a time and validates
 *                  as per 802.15.4 spec.
 *
 * Note:            This is private function, called MAC module only.
 ********************************************************************/
 //#define debug_MACGetHeader
static BYTE MACGetHeader(void)
{
    BYTE temp,address;

	if(RXBuffer[0].head == NULL)
		  return FALSE;
    // Make sure that this is a valid length
    if ((RXBuffer[0].length==0)||(RXBuffer[0].length>MAC_FRAME_LENGTH))
    {
        goto DiscardAndReturn;
    }
    macCurrentFrame.frameLength = RXBuffer[0].length;
	macRecLen=0;
	//-------------------------------------
	//for debug in 2401
	address = MACGet();  //send address

	//-------------------------------------
  // Get frame control field - LSB.
  temp = MACGet();
	macCurrentFrame.frameCtrl.Control.Val=temp;
	//temp =  MACGet();  //device ADDRESS
	macCurrentFrame.sndAddress = macCurrentFrame.frameCtrl.Control.fields.devId;  //device ADDRESS
	if((!bIsAssociated)||(address!=macInfo.panId))
	{
		if(macCurrentFrame.frameCtrl.Control.fields.type==MAC_FRAME_NETST
		//||macCurrentFrame.frameCtrl.Control.fields.type==MAC_FRAME_TEST||
		//macCurrentFrame.frameCtrl.Control.fields.type==MAC_FRAME_CHKNET||
		||macCurrentFrame.frameCtrl.Control.fields.type==MAC_FRAME_BEACON)//only receive beacon frame
			return TRUE;
	}
	else if(macCurrentFrame.frameCtrl.Control.fields.type<=MAC_FRAME_WARN)
	{
		if(macCurrentFrame.frameCtrl.Control.fields.type!=MAC_FRAME_WARN)
		{
					 LED_DATA=LED_LIGHT;
					 //LED_PWRLOW=LED_CLOSE;
		}
		return TRUE;
	}

//TODO(DF) - this is not the correct way to get rid of a packet.  This will also destroy any other packets in FIFO???
DiscardAndReturn:
    RXBuffer[0].head=NULL;
    return FALSE;
}
/*********************************************************************
 * Function:        static BYTE MACProcessNetState(void)
 *
 * PreCondition:    MACGetHeader() is called and a valid beacon
 *                  frame was detected.
 *
 * Input:           None
 *
 *
 * Side Effects:    None
 *
 * Overview:        check net state.decide to join net or exit net
 *
 * Note:            None
 ********************************************************************/
static BYTE MACProcessNetState(void)
{
   BYTE phyParameter=0;
   
	if(PHYGetPIB(PhyCurrentChannel,&phyParameter))  ;
  if(bIsScan)
 	{
          PANDescCount=1;
          PhyRecordExChannel();               
    }
    	macCurrentFrame.sndAddress = MACGet();  //send address
     if(macCurrentFrame.sndAddress==macInfo.devAddress)//find same pandid.should change???
     {
						macWarncode|=WARN_PANIDLOST;
     }
    if(phyParameter==macCurrentChannel)//channel same
     {
          		bchanlost=1;
          		macWarncode|=WARN_CHANLOST;
     }
	return TRUE;

}
/*********************************************************************
Function:   BYTE MACGetData()
功能:  取MAC一帧数据
//
输出: SUCCESS 1: fail :0
描述:上层调用此函数接收MAC数据帧,数据为MAC数据包
 ********************************************************************/
BYTE MACGetData()
 {
 BYTE i;
 BYTE length;
 BYTE dataHead;
 BYTE *pmapAddr=&dataHead;
 if(macCurrentFrame.frameLength==0)
 			return 0;
   if(RXBuffer[0].head == NULL)
   		 return 0;

  if(bmsIsMap)
  {
  	if(macCurrentFrame.frameCtrl.Control.fields.devId==MAC_DEVICE_MOUSE)//mouse map
  	{
			  	length = msRamMapIndex[macmsMapKey].length;
			  	if(length>MAC_KEYMAPLEN)
			  			return 0;
					dataHead = msRamMapIndex[macmsMapKey].address[0];
			  	if(dataHead<MAC_DEVICE_MOUSE||dataHead>MAC_DEVICE_JOYSTICK1)
			  	{
			  		return 0;
			  	}
			  	if(macmsMapKey==0)
			  		return 0;
			  	if(dataHead==MAC_DEVICE_MOUSE)
			  	{
			  		if(length<MOUSELENGTH+3)
			  		{
			  			if(Groupbit[macmsMapKey-1]&RXBuffer[0].databuffer[macRecLen])//pressed
			  			{
			  				if(macCurrentFrame.frameLength>(MAXDEVLENGTH-1))
											macCurrentFrame.frameLength = MAXDEVLENGTH-1;
								for(i=0;i<macCurrentFrame.frameLength;i++) {
		 								TXBUFFER[i]	=RXBuffer[0].databuffer[macRecLen+i] ;
		 						}
		 						TXBUFFER[0]=msRamMapIndex[macmsMapKey].address[1];
			  				//if(PutUsbData(&msRamMapIndex[macmsMapKey].address[1],MOUSELENGTH,MAC_DEVICE_MOUSE)) ;
			  				if(PutUsbData(TXBUFFER,MOUSELENGTH,MAC_DEVICE_MOUSE)) ;
			  			}
			  			else //loose
			  			{
			  					for(i=0;i<MOUSELENGTH;i++)
									{
										TXBUFFER[i]	= 0x00;
									}
			  				if(PutUsbData(TXBUFFER,MOUSELENGTH,MAC_DEVICE_MOUSE)) {
			  						bmsIsMap = FALSE;
			  						macmsMapKey=0;
			  				}
			  			}
							macMsOldKey = TXBUFFER[0];
			  			return 1;
			  		}
			  	}
			  if(Groupbit[macmsMapKey-1]&RXBuffer[0].databuffer[macRecLen])
		  	{
				  	pmapAddr = msRamMapIndex[macmsMapKey].address;
						if(APPMACPutBuffer(pmapAddr,length))
						{
							macmsMapKey=0;
							bmsIsMap = FALSE;
						}
				}
				else
				{
					bmsIsMap = FALSE;
						macmsMapKey=0;
				}
		}  //MOUSE MAP
	}
	 if(bIsMap)
  {
  	bIsMap = FALSE;
		if(macCurrentFrame.frameCtrl.Control.fields.devId==MAC_DEVICE_JOYSTICK0||macCurrentFrame.frameCtrl.Control.fields.devId==MAC_DEVICE_JOYSTICK1)
		{
				//bdevtrans=MACGetJkChannelId();
				if(JkeyMapId&JOYSTICK_MAP)//have jk data map
				{
					if(bdevtrans==MAC_DEVICE_JOYSTICK0)
					{
						for(i=0;i<KbLength;i++)
						{
							TXBUFFER[i+1]	= joystick_buffer1[i];
						}
					}
					else
					{
							for(i=0;i<KbLength;i++)
						{
							TXBUFFER[i+1]	= joystick_buffer2[i];
						}
					}
						TXBUFFER[0]=bdevtrans;
						//TXBUFFER[1]=MAC_JK0MAPHEAD;
						//TXBUFFER[i+1]	=KBDATAEND;
						JkeyMapId&=~JOYSTICK_MAP;
					//if(APPMACPutBuffer(TXBUFFER,KbLength+2,LOOSE)) ;
						if(PutUsbData(TXBUFFER,7,bdevtrans)) ;
				}
					if(JkeyMapId&KEYBOARD_MAP)//have keyboard data map
					{
							for(i=0;i<KbLength;i++)
							{
								TXBUFFER[i+1]	= kb_buffer[i];
							}
							TXBUFFER[0]=MAC_KBMAPHEAD;
							//TXBUFFER[i+2]	=KBDATAEND;
							JkeyMapId&=~KEYBOARD_MAP;
							//if(APPMACPutBuffer(TXBUFFER,KbLength+2,PRESSED)) ;
								if(PutUsbData(TXBUFFER,KEYBOARDLENGTH,MAC_DEVICE_KEYBOARD)) ;
					}
					if(JkeyMapId&MOUSE_MAP)//have mouse data map
					{
							for(i=0;i<KbLength;i++)
							{
								TXBUFFER[i]	= mose_buffer[i];
							}
							//TXBUFFER[0]=MAC_DEVICE_MOUSE;

						JkeyMapId&=~MOUSE_MAP;
						//if(APPMACPutBuffer(TXBUFFER,KbLength+1,LOOSE)) ;
						TXBUFFER[0]|=macMsOldKey;
						if(PutUsbData(TXBUFFER,MOUSELENGTH,MAC_DEVICE_MOUSE)) ;
					}

				if(JmacroKey!=0)
				{
                    if(bdevtrans==MAC_DEVICE_JOYSTICK0)
					        length = jk1RamMapIndex[JmacroKey].length;
					else
					        length = jk2RamMapIndex[JmacroKey].length;
				  	if(length>MAC_KEYMAPLEN)
				  	{
				  		JmacroKey = 0;
				  			return 0;
				  		}
				  		 if(bdevtrans==MAC_DEVICE_JOYSTICK0)
				  		 {
						        dataHead = jk1RamMapIndex[JmacroKey].address[0];
						        pmapAddr = jk1RamMapIndex[JmacroKey].address;
						    }
						 else
						 {
						        dataHead = jk2RamMapIndex[JmacroKey].address[0];
						        pmapAddr = jk2RamMapIndex[JmacroKey].address;
						    }
				  	if(dataHead<MAC_DEVICE_MOUSE||dataHead>MAC_DEVICE_JOYSTICK1)
				  	{
				  		JmacroKey = 0;
				  		return 0;
				  	}

				  	JmacroKey = 0;
					if(APPMACPutBuffer(pmapAddr,length)) ;
				}
		}

  }
  else
  {
	 		if(macCurrentFrame.frameLength>(MAXDEVLENGTH-1))
					macCurrentFrame.frameLength = MAXDEVLENGTH-1;
			dataHead= macCurrentFrame.frameCtrl.Control.fields.devId;//who send the data,should tell app
			if(dataHead==MAC_DEVICE_MOUSE)
			{
				macMsOldKey = RXBuffer[0].databuffer[macRecLen];
			}
			for(i=0;i<macCurrentFrame.frameLength;i++) {
		 				TXBUFFER[i]	=RXBuffer[0].databuffer[macRecLen+i] ;

		 }
		if(PutUsbData(TXBUFFER,macCurrentFrame.frameLength,dataHead)) ;
	}
	return 1;
 }
/*********************************************************************
 * Function:        void MACAcceptCurrentPAN(void)
 *
 * PreCondition:    MACIsScanComplete() = TRUE and there is no
 *                  ERROR.
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        record current channel parameter
 ********************************************************************/
BYTE  MACAcceptCurrentPAN(void)
{
    BYTE phyParameter;
	if(PHYGetPIB(PhyCurrentChannel,&phyParameter))
	{
		macCurrentChannel = phyParameter;
		return TRUE;
	}
	return FALSE;
}

/*********************************************************************
 * Function:        static  void MACSendNetState(void)
 *
 * Overview:        Sends net state frame in response to net check
 *                  frame.
 *
 * Note:            This is a private function
 ********************************************************************/
static void MACSendNetState(void)
{
	 FRAME_CONTROL framectrl;
	 NET_STATE     netState;
	 if(bBeaconReady)
				 return;
    framectrl.Control.Val						=	0x00;
    framectrl.Control.fields.type				= MAC_FRAME_NETST;
    framectrl.Control.fields.devId			= macInfo.devId;
    netState.Control.Val						=	0x00;
//    netState.Control.fields.bdataRate = macDataRate;
    netState.Control.fields.mode =  bmode;
    MACPutHeader(4,macCurrentFrame.sndAddress);//broadcast address 0
    // put frame control
	 	MACPut(framectrl.Control.Val);
	 	//put device address
	 	MACPut(macInfo.panId);

	 	//put game data rate
	 	MACPut(netState.Control.Val);
	 	MACSndDataLength =MAC_FRAME_HEAD+1;
	 	delayms(1);
   PHYDataRequest(MACSndDataLength,TXBUFFER);

}

#if defined(I_AM_COORDINATOR)

/*********************************************************************
 * Function:        void MACSendAssociateResponse()
 *
                    send associate command to device,let device join network
 *
 *
 * Overview:        Creates and sends valid association response frame
 *                  as per IEEE spec.
 *
 * Note:            Available to coordinator only.
 ********************************************************************/
static void MACSendAssociateResponse()
{
	 FRAME_CONTROL framectrl;
	JNCTRL paninfo;
	uchar  udevaddress;
	//	static uchar jkgtsFlag=0x00;
    // For broadcast, do not request ack.
    if(bBeaconReady)
    	return;
   	framectrl.Control.Val					 =	0x00;
		paninfo.Control.Val						 =	0x00;
    framectrl.Control.fields.type	 = 			MAC_FRAME_JNETACK;
    framectrl.Control.fields.devId = 			macInfo.devId;
    paninfo.Control.fields.channel =    	macCurrentChannel-71;
    paninfo.Control.fields.power  =      phyTransmitPower;
   	if(macCurrentFrame.frameCtrl.Control.fields.devId!=MAC_DEVICE_MOUSE)
   	{
   		bmode       = MAC_MODE_BEACON;
	    macBeaon.Control.bits.bmode 					=  bmode;
    }
    if(macCurrentFrame.frameCtrl.Control.fields.devId==MAC_DEVICE_KEYBOARD)
    {
    	macKbPassFlag =1;
    }
    paninfo.Control.fields.mode  =       bmode;
    MACPutHeader(5,macCurrentFrame.sndAddress);//broadcast address 0
    //MACPutHeader(3,0);//broadcast address 0
    // put frame control
 		MACPut(framectrl.Control.Val);
 		//put allocate device
 		udevaddress = macCurrentFrame.sndAddress;
		if(macCurrentFrame.sndAddress==0x00)//should allocate device address
 				udevaddress= RANDOM_LSB;
 		/*if(macCurrentFrame.frameCtrl.Control.fields.devId==MAC_DEVICE_JOYSTICK0)
 		{
 			if(macCurrentFrame.sndAddress!=macJkDev[0].devAddress)
 			{
 				if(macCurrentFrame.sndAddress!=macJkDev[1].devAddress)
 				{

 					if(macJkDev[1].devAddress==0xff&&macJkDev[0].devAddress!=0xff)// 1 channel free
 					{
 							if(macCurrentFrame.sndAddress==0x00)//first join net
 					    {
 					    	 udevaddress|=0x01;               //Occupy channel 1
 					    }
 					    //else let it be alone.
 					}
 					else if(macJkDev[0].devAddress==0xff&&macJkDev[1].devAddress!=0xff)// 0channel free
 					{
 							if(macCurrentFrame.sndAddress==0x00)//first join net
 					    {
 					    	 udevaddress&=0xFE;               //Occupy channel 0
 					    }
 					    //else let it be alone.
 					}
 		
 					else//two channel occupied,share with channel 0.o address
 					{
 						  udevaddress&=0xFE;
 					}
        }
      }
    }*/
 		MACPut(udevaddress);
 			//put panid
		MACPut(macInfo.panId);
		//put channel and power
		MACPut(paninfo.Control.Val);

 		MACSndDataLength  = MAC_FRAME_HEAD+2;
 	  			//---------------------------------------------
		// Send data use csma
		delayms(1);
		PHYDataRequest(MACSndDataLength,TXBUFFER);
		//TransmitIt();
    //----------------------------------------------

}
#endif
/*********************************************************************
 * Function:       void MACReqNetState(void)
 * Description :   send check net state request to controller.if controller
 	                 response.device will receive net state ack.or esle
 	                 device will again scan channel and join a new pan net
 *
 * Overview:        check pan net state,see whether pan net is still
 										active
 *********************************************************************/
/*static void MACReqNetState()
{
    FRAME_CONTROL framectrl;
    framectrl.Control.Val			=	0x00;
    framectrl.Control.fields.type	= MAC_FRAME_CHKNET;
    framectrl.Control.fields.devId	= macInfo.devId;;
    TXBUFFER[0]= 3;
    TXBUFFER[1]= BROADADDRESS;
    // put frame control
    TXBUFFER[2]= framectrl.Control.Val;
    // put device address
    TXBUFFER[3]= BROADADDRESS;

   MACSndDataLength  = MAC_FRAME_HEAD;
   PHYDataRequest(MACSndDataLength,TXBUFFER);
  // PHYSetTRXState(PHY_TRX_RX_ON);

⌨️ 快捷键说明

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