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

📄 mac_scan.c

📁 zigbee location examples
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************************************
 *                                                                                                     *
 *        **********                                                                                   *
 *       ************                                                                                  *
 *      ***        ***                                                                                 *
 *      ***   +++   ***                                                                                *
 *      ***   + +   ***                                                                                *
 *      ***   +                         CHIPCON CC2430 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, 2005                                                                          *
 *******************************************************************************************************
 * This module contains the scan state machine, and transmissin of scan-related packets.               *
 *******************************************************************************************************/
#include <mac_headers.h>


//-------------------------------------------------------------------------------------------------------
// Variables related to channel scanning (state machine and results)
__no_init MAC_SCAN_INFO   mscInfo @ "PM0_XDATA";

//-------------------------------------------------------------------------------------------------------




/*******************************************************************************************************
 *******************************************************************************************************
 **************************         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
ROOT 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;

    // 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
//-------------------------------------------------------------------------------------------------------
ROOT 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->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
//-------------------------------------------------------------------------------------------------------
ROOT 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->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.
//-------------------------------------------------------------------------------------------------------
ROOT 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->list.pPANDescriptorList[n];
        if ((pPanDescriptor->coordAddrMode  == pExistingPanDesc->coordAddrMode ) &&
            (pPanDescriptor->coordPanId     == pExistingPanDesc->coordPanId ) &&
            (pPanDescriptor->logicalChannel == pExistingPanDesc->logicalChannel)) {

            if (pPanDescriptor->coordAddrMode == AM_EXTENDED_64) {
                if (msupCompareExtendedAddress(&pPanDescriptor->coordAddress, &pExistingPanDesc->coordAddress)) return TRUE;
            } else {
                if (pPanDescriptor->coordAddress.Short == pExistingPanDesc->coordAddress.Short) return TRUE;
            }
        }
    }

⌨️ 快捷键说明

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