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

📄 mac_scan.c

📁 ucos在NEC平台下的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************************************
 *                                                                                                     *
 *        **********                                                                                   *
 *       ************                                                                                  *
 *      ***        ***                                                                                 *
 *      ***   +++   ***                                                                                *
 *      ***   + +   ***                                                                                *
 *      ***   +                         CHIPCON CC2420 INTEGRATED 802.15.4 MAC AND PHY                 *
 *      ***   + +   ***                                 Scan Functions                                 *
 *      ***   +++   ***                                                                                *
 *      ***        ***                                                                                 *
 *       ************                                                                                  *
 *        **********                                                                                   *
 *                                                                                                     *
 *******************************************************************************************************
 * CONFIDENTIAL                                                                                        *
 * The use of this file is restricted by the signed MAC software license agreement.                    *
 *                                                                                                     *
 * Copyright Chipcon AS, 2004                                                                          *
 *******************************************************************************************************
 * This module contains the scan state machine, and transmissin of scan-related packets.               *
 *******************************************************************************************************
 * Compiler: AVR-GCC                                                                                   *
 * Target platform: CC2420DB, CC2420 + any ATMEGA MCU                                                  *
 *******************************************************************************************************
 * The revision history is located at the bottom of this file                                          *
 *******************************************************************************************************/
#pragma SFR
#pragma NOP
#pragma STOP
#pragma HALT
#pragma DI
#pragma EI
#pragma  section @@DATA scan at 0xE800///
#include "mac_headers.h"


//-------------------------------------------------------------------------------------------------------
// Variables related to channel scanning (state machine and results)
MAC_SCAN_INFO mscInfo;
//-------------------------------------------------------------------------------------------------------
int		UART_StartTx(char *buffer);///

//-------------------------------------------------------------------------------------------------------
// Internal functions
BOOL mscSetNextChannel(void);
BOOL mscTransmitOrphanNotification(void);
//-------------------------------------------------------------------------------------------------------




/*******************************************************************************************************
 *******************************************************************************************************
 **************************         SCAN-RELATED PACKET TRANSMISSIONS         **************************
 *******************************************************************************************************
 *******************************************************************************************************/




//-------------------------------------------------------------------------------------------------------
//  BOOL mscTransmitBeacon(void)
//
//  DESCRIPTION:
//      Used by a coordinator in a non-beacon network to transmit a single beacon upon a beacon request.
//      Unlike the beacon transmission in mac_beacon_handler.c, this beacon is transmitted as a regular 
//      packet, and does not involve timing adjustments, etc.
//
//  RETURN VALUE:
//      BOOL
//          The transmission was initiated
//-------------------------------------------------------------------------------------------------------
#if MAC_OPT_FFD
BOOL mscTransmitBeacon(void) {
    MAC_TX_PACKET *pPacket;
    UINT8 taskNumber;
    
    // Try to reserve a packet 
    pPacket = mtxpReservePacket();
    if (!pPacket) return FALSE;
    
    // Try to reserve a transmission task
    taskNumber = mschReserveTask();
    if (taskNumber == NO_TASK) {
        mtxpReleasePacket(pPacket);
        return FALSE;
    }
    
    // Prepare the packet structure
    mbcnPrepareBeacon(pPacket);
    pPacket->txMode = MTX_MODE_FORCE_UNSLOTTED_BM | MTX_MODE_USE_CSMACA_BM; // This function is only used in non-beacon networks
    
    // Initiate the transmission
    mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
    return TRUE;
    
} // mscTransmitBeacon
#endif




//-------------------------------------------------------------------------------------------------------
//  BOOL mscTransmitBeaconRequest(void)
//
//  DESCRIPTION:
//      Transmits a beacon request during active scan.
//
//  RETURN VALUE:
//      BOOL
//          The transmission was initiated
//-------------------------------------------------------------------------------------------------------
BOOL mscTransmitBeaconRequest(void) {
    MAC_TX_PACKET *pPacket;
    UINT8 taskNumber;
    WORD broadcast = 0xFFFF;
        
    // Try to reserve a packet 
    pPacket = mtxpReservePacket();
    if (!pPacket) return FALSE;
    
    // Try to reserve a transmission task
    taskNumber = mschReserveTask();
    if (taskNumber == NO_TASK) {
        mtxpReleasePacket(pPacket);
        return FALSE;
    }

    // TX mode
    pPacket->txMode = MTX_MODE_USE_CSMACA_BM | MTX_MODE_SCAN_RELATED_BM;
    pPacket->retriesLeft = aMaxFrameRetries;  
  
    // Generate the packet header
    msupPrepareHeader(pPacket, FT_MAC_COMMAND, DEST_ADDR_SHORT, broadcast, (ADDRESS*) &broadcast, broadcast, (ADDRESS*) &broadcast, TX_OPT_NONE);
    
    // Generate the packet payload
    pPacket->pPayload[0] = CMD_BEACON_REQUEST;
    
    // Store the command type
    pPacket->mc.commandType = CMD_BEACON_REQUEST;///
    
    // Calculate and set the total packet length
    pPacket->length = pPacket->headerLength + CMD_BEACON_REQUEST_PAYLOAD_LENGTH + MAC_FCS_LENGTH;

    // Calculate the packet duration (including ack. and IFS)
    pPacket->duration = msupCalcPacketDuration(pPacket->length, FALSE);

    // Initiate the transmission
    mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
    
    return TRUE;
        
} // mipTransmitDataRequest




//-------------------------------------------------------------------------------------------------------
//  BOOL mscTransmitOrphanNotification(void)
//
//  DESCRIPTION:
//      Transmits an orphan notification during orphan scan.
//
//  RETURN VALUE:
//      BOOL
//          The transmission was initiated
//-------------------------------------------------------------------------------------------------------
BOOL mscTransmitOrphanNotification(void) {
    MAC_TX_PACKET *pPacket;
    UINT8 taskNumber;
    WORD broadcast = 0xFFFF;
        
    // Try to reserve a packet 
    pPacket = mtxpReservePacket();
    if (!pPacket) return FALSE;
    
    // Try to reserve a transmission task
    taskNumber = mschReserveTask();
    if (taskNumber == NO_TASK) {
        mtxpReleasePacket(pPacket);
        return FALSE;
    }

    // TX mode
    pPacket->txMode = MTX_MODE_USE_CSMACA_BM | MTX_MODE_FORCE_UNSLOTTED_BM | MTX_MODE_SCAN_RELATED_BM;
    pPacket->retriesLeft = aMaxFrameRetries;  
  
    // Generate the packet header
    msupPrepareHeader(pPacket, FT_MAC_COMMAND, DEST_ADDR_SHORT | SRC_ADDR_EXT, broadcast, (ADDRESS*) &aExtendedAddress, broadcast, (ADDRESS*) &broadcast, TX_OPT_NONE);
    
    // Generate the packet payload
    pPacket->pPayload[0] = CMD_ORPHAN_NOTIFICATION;
    
    // Store the command type
    pPacket->mc.commandType = CMD_ORPHAN_NOTIFICATION;///
    
    // Calculate and set the total packet length
    pPacket->length = pPacket->headerLength + CMD_ORPHAN_NOTIFICATION_PAYLOAD_LENGTH + MAC_FCS_LENGTH;

    // Calculate the packet duration (including ack. and IFS)
    pPacket->duration = msupCalcPacketDuration(pPacket->length, FALSE);

    // Initiate the transmission
    mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
    
    return TRUE;
        
} // mscTransmitOrphanNotification




/*******************************************************************************************************
 *******************************************************************************************************
 **************************        CHANNEL SCANNING + SUPPORT FUNCTIONS       **************************
 *******************************************************************************************************
 *******************************************************************************************************/




//-------------------------------------------------------------------------------------------------------
//  BOOL mscPanDescriptorExists(PAN_DESCRIPTOR *pPanDescriptor)
//
//  DESCRIPTION:
//      Used by a scanning device (active or passive scan) to determine whether or not the PAN descriptor
//      from a received beacon already exists in the scan result list. The function returns TRUE if
//      there's a match on coordinator PAN ID + address, and the logical channel.
//
//  ARGUMENTS:
//      PAN_DESCRIPTOR *pPanDescriptor
//          A pointer to the new PAN descriptor 
//
//  RETURN VALUE:
//      BOOL
//          The PAN descriptor pointed to by pPanDescriptor already exists in the result list.
//-------------------------------------------------------------------------------------------------------
BOOL mscPanDescriptorExists(PAN_DESCRIPTOR *pPanDescriptor) {
    UINT8 n;
    PAN_DESCRIPTOR *pExistingPanDesc;
    MAC_SCAN_RESULT *pScanResult = mscInfo.pScanResult;
    
    // Search for duplicates
    for (n = 0; n < pScanResult->resultListSize; n++) {
        pExistingPanDesc = &pScanResult->sf.pPANDescriptorList[n];///
        if ((pPanDescriptor->coordAddrMode  == pExistingPanDesc->coordAddrMode ) &&
            (pPanDescriptor->coordPanId     == pExistingPanDesc->coordPanId ) &&
            (pPanDescriptor->logicalChannel == pExistingPanDesc->logicalChannel)) {

            if (pPanDescriptor->coordAddrMode == AM_EXTENDED_64) {
                if (msupCompareQword(&pPanDescriptor->coordAddress.Extended, &pExistingPanDesc->coordAddress.Extended)) return TRUE;
            } else {
                if (pPanDescriptor->coordAddress.Short == pExistingPanDesc->coordAddress.Short) return TRUE;
            }
        }
    }
    
    // No match
    return FALSE;
       
} // mscPanDescriptorExists




//-------------------------------------------------------------------------------------------------------
//  BOOL mscSetNextChannel(void)
//
//  DESCRIPTION:
//      Finds the next valid channel during scan (changes the mscInfo.currentChannel variable), and 
//      updates the unscanned channels mask.
//
//  RETURN VALUE:
//      BOOL
//          FALSE when there are no more channels to scan.
//-------------------------------------------------------------------------------------------------------
BOOL mscSetNextChannel(void) {
    UINT8 n;
    DWORD bitmask = 0x00000001;
    
    // Go through the channels 
    mscInfo.currentChannel++;
    for (n = 0; n < 27; n++) {
        if (n >= mscInfo.currentChannel) {
            if (bitmask & mscInfo.scanChannels) {
                mscInfo.currentChannel = n;
                mscInfo.pScanResult->unscannedChannels &= ~bitmask;
                return TRUE;
            }
        }

⌨️ 快捷键说明

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