?? mftmac.c.bak
字號:
* 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一幀數(shù)據(jù)
//
輸出: SUCCESS 1: fail :0
描述:上層調(diào)用此函數(shù)接收MAC數(shù)據(jù)幀,數(shù)據(jù)為MAC數(shù)據(jù)包
********************************************************************/
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);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -