X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=apps%2Ftests%2Ftkn154%2Fbeacon-enabled%2FTestIndirect%2Fdevice%2FTestDeviceReceiverC.nc;fp=apps%2Ftests%2Ftkn154%2Fbeacon-enabled%2FTestIndirect%2Fdevice%2FTestDeviceReceiverC.nc;h=dc2482d3954c746eb8e2746bde15e132cb39e497;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=0000000000000000000000000000000000000000;hpb=adf1de6c009d13b7b52e68535c63b28f59c97400;p=tinyos-2.x.git diff --git a/apps/tests/tkn154/beacon-enabled/TestIndirect/device/TestDeviceReceiverC.nc b/apps/tests/tkn154/beacon-enabled/TestIndirect/device/TestDeviceReceiverC.nc new file mode 100644 index 00000000..dc2482d3 --- /dev/null +++ b/apps/tests/tkn154/beacon-enabled/TestIndirect/device/TestDeviceReceiverC.nc @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2008, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ +#include "TKN154.h" +#include "app_profile.h" +module TestDeviceReceiverC +{ + uses { + interface Boot; + interface MCPS_DATA; + interface MLME_RESET; + interface MLME_SET; + interface MLME_GET; + interface MLME_SCAN; + interface MLME_SYNC; + interface MLME_BEACON_NOTIFY; + interface MLME_SYNC_LOSS; + interface IEEE154BeaconFrame as BeaconFrame; + interface Leds; + } +} implementation { + + ieee154_address_t m_coordAddress; + uint8_t m_coordAddressMode; + ieee154_macPANId_t m_coordPANID; + ieee154_PANDescriptor_t m_PANDescriptor; + bool m_wasScanSuccessful; + void startApp(); + + event void Boot.booted() { + call MLME_RESET.request(TRUE); + } + + event void MLME_RESET.confirm(ieee154_status_t status) + { + if (status == IEEE154_SUCCESS) + startApp(); + } + + void startApp() + { + ieee154_phyChannelsSupported_t channel; + uint8_t scanDuration = BEACON_ORDER; + + // in this application the coordinator assumes that + // the device has a certain short address + call MLME_SET.macShortAddress(DEVICE_ADDRESS); + channel = ((uint32_t) 1) << RADIO_CHANNEL; + + // we want all received beacons to be signalled + // through the MLME_BEACON_NOTIFY interface, i.e. + // we set the macAutoRequest attribute to FALSE + call MLME_SET.macAutoRequest(FALSE); + m_wasScanSuccessful = FALSE; + call MLME_SCAN.request ( + PASSIVE_SCAN, // ScanType + channel, // ScanChannels + scanDuration, // ScanDuration + 0x00, // ChannelPage + 0, // EnergyDetectListNumEntries + NULL, // EnergyDetectList + 0, // PANDescriptorListNumEntries + NULL, // PANDescriptorList + 0 // security + ); + } + + event message_t* MLME_BEACON_NOTIFY.indication (message_t* frame) + { + // received a beacon frame during SCAN + ieee154_phyCurrentPage_t page = call MLME_GET.phyCurrentPage(); + + if (!m_wasScanSuccessful && call BeaconFrame.parsePANDescriptor( + frame, RADIO_CHANNEL, page, &m_PANDescriptor) == SUCCESS){ + // let's see if the beacon is from our coordinator... + if (m_PANDescriptor.CoordAddrMode == ADDR_MODE_SHORT_ADDRESS && + m_PANDescriptor.CoordPANId == PAN_ID && + m_PANDescriptor.CoordAddress.shortAddress == COORDINATOR_ADDRESS){ + // wait until SCAN is finished, then syncronize to beacons + m_wasScanSuccessful = TRUE; + } + } + return frame; + } + + event void MLME_SCAN.confirm ( + ieee154_status_t status, + uint8_t ScanType, + uint8_t ChannelPage, + uint32_t UnscannedChannels, + uint8_t EnergyDetectListNumEntries, + int8_t* EnergyDetectList, + uint8_t PANDescriptorListNumEntries, + ieee154_PANDescriptor_t* PANDescriptorList + ) + { + if (m_wasScanSuccessful){ + // set the macAutoRequest attribute to TRUE, so indirect + // transmissions are automatically carried through + call MLME_SET.macAutoRequest(TRUE); + call MLME_SET.macCoordShortAddress(m_PANDescriptor.CoordAddress.shortAddress); + call MLME_SET.macPANId(m_PANDescriptor.CoordPANId); + call MLME_SYNC.request(m_PANDescriptor.LogicalChannel, m_PANDescriptor.ChannelPage, TRUE); + } else + startApp(); + } + + event void MCPS_DATA.confirm( + message_t *msg, + uint8_t msduHandle, + ieee154_status_t status, + uint32_t Timestamp + ) + { + } + + event void MLME_SYNC_LOSS.indication( + ieee154_status_t lossReason, + uint16_t PANId, + uint8_t LogicalChannel, + uint8_t ChannelPage, + ieee154_security_t *security) + { + call Leds.led1Off(); + } + + event message_t* MCPS_DATA.indication (message_t* frame) + { + call Leds.led1Toggle(); + return frame; + } +}