?? mftmac.c.bak
字號:
/*********************************************************************
*
* MFT MAC layer
*
*********************************************************************
* FileName: mftMAC.c
* Dependencies:
* Processor: c51
* Company: chengdu MFT, Inc.
*
* Software License Agreement
*
*
* Author Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* jiangchao 5/09/05 Rel 0.1
********************************************************************/
// Association State Machine states.
#pragma DATA_SEG MY_ZEROPAGE
// Number of coordinators found operating in radius.
BYTE PANDescCount=0;
// Current channel of operation.
BYTE macCurrentChannel=0;
// Length of transmit packet that is being current loaded.
BYTE macPacketLen=0;
// Length of transmit packet that is being current loaded.
BYTE macRecLen=0;
// MAC address info.
NODE_INFO macInfo;
// Current MAC frame header.
MAC_HEADER macCurrentFrame;
//current mac state
// MAC_STATE macState;
BYTE macKbLedState=0; //led state of kb
BYTE macKbPassFlag=0; //pass led state to kb
// Tick value used to calculate timeout conditions.
unsigned int macStartTick=0;
unsigned int macMsTick=0;
unsigned int macKbTick=0;
//unsigned int macJk1Tick=0;
//unsigned int macJk2Tick=0;
//unsigned int macWarnTick=0;
BYTE beaconflag=0;
//---------------------------------------------------------
//mac state
BYTE bIsAssociated=0 ; // '1' if this node is associated
BYTE bIsEnabled=0 ; // '1' if current tx packet should be put in stage
//BYTE bIsTest=0 ;//'1' if current state is in test mode
BYTE bmode=0; //'1' no beacon 0 becon
BYTE bIsScan =0; //1 now is scan channel
BYTE bIsGetReady =0; //mac received data
BYTE bPhyGetReady=0; //phy receive data
BYTE bIsMap =0; //map jk to keyboard
BYTE bmsIsMap =0; ;//map mouse key
BYTE bchanlost=0; //when save channel should change.1
//BYTE bledGaptime=1; //the time period when led light and close
BYTE bkbounce=0; //keboard bounce flag
BYTE macWarncode=0; //device warn code
//BYTE macScndtick=0; //second tick counter
//------------------------------------------------------------
MAC_BEACON macBeaon ;
// Tick value used to calculate repeat send timeout conditions.
BYTE macNewKeyMode =0;
BYTE macNewKey = 0;
BYTE macNewKeyLength = 0;
BYTE macmsMapKey = 0; //mouse map key
//BYTE macDataRate = 0;
unsigned int macTickDiff=0;
//unsigned int macAckTick;
BYTE macMsOldKey=0;
BYTE macBeaconTick=0;
BYTE bBeaconReady;
BYTE bdevtrans=0;
//Static Rx Frame Buffer
BYTE FrameRXBuffer[MAC_FRAME_LENGTH];
//-------------------------------------------------
BYTE JKeyBuffer[MAC_JKTRSLENGTH];//josytick key changed buffer.
BYTE JkeyMapId=0; //0.no data map.1 joystick data.2,mouse map data.3 keyboard map data
BYTE JmacroKey=0;
//BYTE JkchannelId=MAC_DEVICE_JOYSTICK0;
//---------------------------------------------------
//Rx Buffer information
volatile RX_BUFFER RXBuffer[1];
//Current Send Frame
//beacon control
//--------------------------------------------
static BYTE sendFlag=0;
static BYTE ledDataFlag=0;
static BYTE downFlash=0;
static BYTE downLength=0;
BYTE TXBUFFER[MAXDEVLENGTH];
BYTE DeviceBuffer[KbPassLength];
#define RANDOM_LSB (T1CNTL)
#define NODATA 0xff
#pragma DATA_SEG DEFAULT
BYTE Joystick=0;
BYTE phyTransmitPower=0;
//BYTE phyChannelMaxSupport=0;
BYTE MACSndDataLength=0;
BYTE MsMode=0;
BYTE jk1mode=0;
BYTE jk2mode=0;
/*MAC_JKDev macJkDev[2]=
{
0xFF,MAC_DEVICE_JOYSTICK0,
0xFF,MAC_DEVICE_JOYSTICK1,
};*/
BYTE DeviceDataLength;
BYTE macRandom=0;
//mouse data format:0:(key,01 left.right 01). 1~4:x,y. 5:scroll
extern unsigned char mose_buffer[KbLength]; //他們分別是放:鼠標數據,遙感(4/8)鍵時的x,y值,鍵盤數據
//keyboard data format: 0:id=0x01,1:modify...
extern unsigned char kb_buffer[KbLength];
extern unsigned char joystick_buffer[KbLength];//send data id is seted by mac
#define RomBitNumber 5
//BYTE Groupbit[RomBitNumber]={0x01,0x02,0x04,0x08,0x10,0x20};
//-------------------------------------------------------------------------------------------------------------
void MACPutHeader(BYTE flength,BYTE desAddr);
BYTE MACSaveAppData(unsigned char *buffer,unsigned char length);
static BYTE MACGetHeader(void);
static void MACSendAck(BYTE *Buffer,BYTE length);
//static void TransmitIt(void);
static void MACReqNetState();
static void MACSendNetState(void);
//static BYTE PerformCCA(void);
static BYTE MACProcessBeacon(void);
static void MACSendBeacon(void);
static void MACPreBeacon(void);
static void MACSendAssociateResponse(void);
//static void MACProcessGTS(void);
static void MACBufferPacket(void);
//static void MACTestSendAck();
static void MACDiscardRx(void) ;
static BYTE MACProcessNetState(void) ;
void MACPassDeviceData(BYTE deviceid,BYTE *buffer,BYTE length);
//void MACUpdateLedState(BYTE type,BYTE ledflag);
void MACKeyBufferInit()
{
BYTE i;
for(i=0;i<MAC_MSKEY_NUMBER;i++)
{
msRamMapIndex[i].length =0;
msRamMapIndex[i].address = NULL;
// msRamMapIndex[i].keyNumber = i;
}
}
/*void MACJKdevBufferInit()
{
macJkDev[0].devAddress =0xff;
macJkDev[0].devID = MAC_DEVICE_JOYSTICK0;
macJkDev[1].devAddress =0xff;
macJkDev[1].devID = MAC_DEVICE_JOYSTICK1;
}*/
BYTE MACGetBitNumber1(BYTE cmd)
{
BYTE i;
for(i=0;i<8;i++)
{
if(cmd&Groupbit[i])
{
return i;
}
}
return NODATA;
}
//return channelID of joystick device.
BYTE MACGetJkChannelId(void)
{
if(macCurrentFrame.sndAddress==MAC_DEVICE_JOYSTICK0)//channel 0
{
Joystick=1;
return MAC_DEVICE_JOYSTICK0;
}
Joystick=2;
return MAC_DEVICE_JOYSTICK1;
}
/*********************************************************************
* Function: void MACInit(void)
*
* PreCondition: macInfo.longAddr must be initialized with
* desired MAC address.
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Initializes data variables used by MAC module.
*
* Note: None
********************************************************************/
void MACInit(void)
{
// BYTE i;
bIsEnabled =FALSE;
bIsScan =FALSE;
bBeaconReady = FALSE;
//bIsTest = FALSE;
bIsGetReady = FALSE;
bIsMap= FALSE;
bmsIsMap = FALSE;
// Also initialize frame DSN queue buffer.
bIsAssociated = FALSE;
macStartTick = TickGet();//synchrounous system tick
// Clear all mac state flags.
macCurrentFrame.frameLength = 0x00;
macCurrentFrame.frameCtrl.Control.Val = 0x00;
// JkchannelId=MAC_DEVICE_JOYSTICK0;
// On start, set device id.
RXBuffer[0].head = NULL;
RXBuffer[0].databuffer = NULL;
RXBuffer[0].length = 0;
RXBuffer[0].lqi = 0;
Joystick = 0;
macPacketLen =0;
macRecLen =0;
beaconflag=0;
macBeaconTick = 0;
macKbLedState = 0;
macKbPassFlag = 0;
// macJk1Tick = 0;
// macJk2Tick = 0;
macTickDiff = 0;
JkeyMapId = 0;
macMsOldKey = 0;
JmacroKey = 0; //record macro key number
bchanlost=0;
// bledGaptime =2; //2.5s
// macScndtick=0;
bkbounce=1;
macWarncode =0;
// bwarnflag=0;
macMsTick = 0;
macKbTick=0;
// macWaitTick=0;
// pmacDownBuffer = &Ram_Key[DATA_HEAD];
//------------------------------------------
Joystick_KeyInit();
Joystick_DevInit();
// MACJKdevBufferInit();
//----------------------------------------
}
//search jk key map index,then put flash address index into ram
//input : flashAddress:flash map area of jk.
//flashDataLength:Flash map length.keyMap:ram index of flash key.
//KeyMapLength: ram index buffer length
//output: if search jk flash map success.return 1.else return 0
BYTE Modify_KeyMapIndex(BYTE const * flashAddress,unsigned int flashDataLength,RamMapIndex * keyMap,BYTE KeyMapLength)
{
unsigned char i,flashDataL;
unsigned int length_check=0;
flashDataL=*flashAddress; //Key1…Keyn映射數據的總長度
if(flashDataLength<flashDataL)
return FALSE;
flashAddress+=2; //指向Key1映射數據的數據長度
for(i=0;i<KeyMapLength;i++)
{
// keyMap[i].keyNumber=i;
keyMap[i].length=*flashAddress;
flashAddress++; //指向數據首地址
keyMap[i].address=(byte*)flashAddress;
flashAddress+=keyMap[i].length; //數據長度
if(*flashAddress!=KBDATAEND) //結束符
return FALSE;
flashAddress++; //JUMP結束符
length_check=2+keyMap[i].length+length_check;
if(length_check>=flashDataLength)
return TRUE;
}
return TRUE;
}
/*********************************************************************
* Function: void MACEnable(void)
*
* PreCondition: macInfo.longAddr must be initialized with
* desired MAC address.
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Enables PHY regulator and registers.
*
* Note: None
********************************************************************/
void MACEnable(void)
{
BYTE phyParameter=0;
// Initialize the PHY's registers/wait for it's oscillator to
// become stable. In the event the PHY malfunctions for too long
// the watchdog timer will cause a reset to occur here.
macCurrentChannel=FIRSTCHAN;
MsMode=0;
bPhyGetReady=FALSE;
//-------------------------------------------------------------------
if( !PHYInit(macCurrentChannel,0))
{
//printf("init PHY error!\n");
return;
}
if(PHYGetPIB(PhyCurrentPower,&phyParameter))
{
phyTransmitPower=phyParameter;
}
/*if(PHYGetPIB(PhyChannelMaxSupport,&phyParameter))
{
if(phyParameter<MAC_SCAN_MAX_CHANNEL)
phyChannelMaxSupport = phyParameter;
else
phyChannelMaxSupport = MAC_SCAN_MAX_CHANNEL;
}*/
//-------------------------------------------------------
ReadFlash((byte const *)FLASH_ADDRESS[0],KEYMAPMAXSIZE,Ram_Key); //read pan id address from rom and mouse key map
if( Modify_KeyMapIndex((BYTE const *)FLASH_ADDRESS[0],KEYMAPMAXSIZE,msRamMapIndex,MAC_MSKEY_NUMBER)) ;
{
phyParameter = msRamMapIndex[0].address[MAC_PAN_ID];
macCurrentChannel = msRamMapIndex[0].address[MAC_CHNL_ID];
}
if( Modify_KeyMapIndex((BYTE const *)FLASH_ADDRESS_JK1[0],PAGESIZE,jk1RamMapIndex,MAC_JKKEY_NUMBER)) ;
if( Modify_KeyMapIndex((BYTE const *)FLASH_ADDRESS_JK2[0],PAGESIZE,jk2RamMapIndex,MAC_JKKEY_NUMBER)) ;
//-------------------------------------------------------------
MACSetDeviceID(MY_DEVICEID);
// By default, PAN is assumed to be not assigned.
macInfo.devAddress=phyParameter;
macInfo.panId=phyParameter;
if( !PHYInit(macCurrentChannel,phyParameter))
{
return;
}
bIsEnabled = TRUE;
macBeaon.Control.Val = 0x00;
//bmode = MAC_MODE_NORMAL;
bmode =MAC_MODE_BEACON;
macBeaon.Control.bits.bmode = bmode;
// PHYSetTRXState(PHY_TRX_RX_ON);
}
//transfer jk combin key to map key
BYTE GetKeyMapNumber(byte bkey)
{
byte tkey = bkey>>1;
tkey+=JK_MSTART;
if(tkey>MAC_JKKEY_NUMBER)
return 0;
return tkey;
}
//according bkey number,judge whether key is pressed or loose.and output key class
BYTE GetJkeyMode(BYTE *bkey,BYTE *bmode,BYTE *bflag)
{
byte tkey = *bkey>>1;
byte tlength;
byte tmode;
byte tdata;
byte tkflag;
*bflag = *bkey%2;
if(tkey>MAC_JKKEY_NUMBER)
return 0;
tkflag = 0;
*bkey = tkey;
if(tkey>=LJK_NUMBER&&tkey<LJK_NUMBER+8)//ljoystick key
{
if(bdevtrans==MAC_DEVICE_JOYSTICK0)
{
tmode = jk1RamMapIndex[LJK_INDEX].address[0];
}
else if(bdevtrans==MAC_DEVICE_JOYSTICK1)
{
tmode = jk2RamMapIndex[LJK_INDEX].address[0];
}
if(tmode!=Key_mode)
{
*bkey=LJK;
}
else
{
tkflag=1;
}
}
else if(tkey>=RJK_NUMBER&&tkey<RJK_NUMBER+8)//rjoystick key
{
if(bdevtrans==MAC_DEVICE_JOYSTICK0)
tmode = jk1RamMapIndex[RJK_INDEX].address[0];
else if(bdevtrans==MAC_DEVICE_JOYSTICK1)
tmode = jk2RamMapIndex[RJK_INDEX].address[0];
if(tmode!=Key_mode)
{
*bkey=RJK;
}
else
{
tkflag=1;
}
}
else if(tkey>=HAT_NUMBER&&tkey<HAT_NUMBER+4)//hat key
{
if(bdevtrans==MAC_DEVICE_JOYSTICK0)
tmode = jk1RamMapIndex[CAPJK_INDEX].address[0];
else if(bdevtrans==MAC_DEVICE_JOYSTICK1)
tmode = jk2RamMapIndex[CAPJK_INDEX].address[0];
if(tmode!=Key_mode)
tmode+=Hat_mode;
else
{
tkflag=1;
}
}
else
{
tkflag=1;
}
if( tkflag==1)//KEY MAP
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -