http://code.google.com/p/tinyos-main/

Jan

On Thu, Aug 26, 2010 at 10:12 AM, annalisa asta <[email protected]> wrote:
> Hi,
> I believe to have an old version of tkn154 library, so I ask you if
> someone could send me the last version where the file IndirectTxP.nc
> is updated. Or someone send me the link of repository.
> My version is this. It's the last?
> /*
>  * 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: 1.2 $
>  * $Date: 2008/06/25 10:19:03 $
>  * @author Jan Hauer <[email protected]>
>  * ========================================================================
>  */
>
> module IndirectTxP
> {
>   provides
>   {
>     interface Init as Reset;
>     interface FrameTx[uint8_t client];
>     interface WriteBeaconField as PendingAddrWrite;
>     interface Notify<bool> as PendingAddrSpecUpdated;
>     interface Purge;
>   }
>   uses
>   {
>     interface FrameTx as CoordCapTx;
>     interface FrameRx as DataRequestRx;
>     interface MLME_GET;
>     interface FrameUtility;
>     interface Timer<TSymbolIEEE802154> as IndirectTxTimeout;
>     interface TimeCalc;
>     interface Leds;
>     interface Ieee802154Debug as Debug;
>   }
> }
> implementation
> {
>   enum {
>     SEND_THIS_FRAME = 0x80,
>     NUM_MAX_PENDING = 7,
>   };
>
>   ieee154_txframe_t *m_txFrameTable[NUM_MAX_PENDING];
>   ieee154_txframe_t *m_pendingTxFrame;
>   uint8_t m_client;
>   uint8_t m_numTableEntries;
>   uint8_t m_numShortPending;
>   uint8_t m_numExtPending;
>   task void tryCoordCapTxTask();
>   void tryCoordCapTx();
>
>   command error_t Reset.init()
>   {
>     uint8_t i;
>     // CAP/Queue component is always reset first, i.e. there
>     // should be no outstanding frames
>     call IndirectTxTimeout.stop();
>     for (i=0; i<NUM_MAX_PENDING; i++)
>       if (m_txFrameTable[i] != NULL)
>         signal
> FrameTx.transmitDone[m_txFrameTable[i]->client](m_txFrameTable[i],
> IEEE154_TRANSACTION_OVERFLOW);
>     for (i=0; i<NUM_MAX_PENDING; i++)
>       m_txFrameTable[i] = NULL; // empty slot
>     m_pendingTxFrame = NULL;
>     m_numTableEntries = 0;
>     m_numShortPending = 0;
>     m_numExtPending = 0;
>     return SUCCESS;
>   }
>
>   uint32_t getPersistenceTime()
>   {
>     uint32_t persistenceTime;
>     persistenceTime = call MLME_GET.macTransactionPersistenceTime();
>     persistenceTime *= IEEE154_aBaseSuperframeDuration;
>     persistenceTime *= ((uint16_t) 1) << call MLME_GET.macBeaconOrder();
>     return persistenceTime;
>   }
>
>   command ieee154_status_t Purge.purge(uint8_t msduHandle)
>   {
>     return IEEE154_INVALID_HANDLE; // TODO
>   }
>
>   command uint8_t PendingAddrWrite.write(uint8_t *pendingAddrField, uint8_t
> maxlen)
>   {
>     // write the pending addr field (inside the beacon frame)
>     uint8_t i, j, k=0;
>     uint8_t *longAdrPtr[NUM_MAX_PENDING];
>     nxle_uint16_t *adrPtr;
>     ieee154_txframe_t *txFrame;
>     uint8_t len = call PendingAddrWrite.getLength();
>
>     if (len > maxlen)
>       return 0;
>     pendingAddrField[0] = 0;
>     adrPtr = (nxle_uint16_t *) &pendingAddrField[1];
>     for (i=0; i<NUM_MAX_PENDING; i++){
>       if (!m_txFrameTable[i])
>         continue;
>       txFrame = m_txFrameTable[i];
>       if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) ==
> FC2_DEST_MODE_SHORT){
>         *adrPtr++ = *((nxle_uint16_t*)
> &txFrame->header->mhr[MHR_INDEX_ADDRESS + sizeof(ieee154_macPANId_t)]);
>       } else if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK)
> == FC2_DEST_MODE_EXTENDED)
>         longAdrPtr[k++] = &(txFrame->header->mhr[MHR_INDEX_ADDRESS +
> sizeof(ieee154_macPANId_t)]);
>     }
>     for (i=0; i<m_numExtPending; i++)
>       for (j=0; j<8; j++)
>         pendingAddrField[1 + 2*m_numShortPending + i*8 + j] =
> longAdrPtr[i][j];
>     pendingAddrField[0] = m_numShortPending | (m_numExtPending << 4);
>     call Debug.log(LEVEL_INFO, IndirectTxP_BEACON_ASSEMBLY, len,0,0);
>     return len;
>   }
>
>   command uint8_t PendingAddrWrite.getLength()
>   {
>     return 1 + m_numShortPending * 2 + m_numExtPending * 8;
>   }
>
>   command ieee154_status_t FrameTx.transmit[uint8_t
> client](ieee154_txframe_t *txFrame)
>   {
>     // send a frame through indirect transmission
>     uint8_t i;
>     if (m_numTableEntries >= NUM_MAX_PENDING){
>       call Debug.log(LEVEL_IMPORTANT, IndirectTxP_OVERFLOW, 0,0,0);
>       return IEEE154_TRANSACTION_OVERFLOW;
>     }
>     txFrame->client = client;
>     txFrame->metadata->timestamp = call IndirectTxTimeout.getNow();
>     for (i=0; i<NUM_MAX_PENDING; i++)
>       if (!m_txFrameTable[i]) // there must be an empty slot
>         break;
>     m_txFrameTable[i] = txFrame;
>     m_numTableEntries += 1;
>     if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) ==
> FC2_DEST_MODE_SHORT)
>       m_numShortPending++;
>     else if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) ==
> FC2_DEST_MODE_EXTENDED)
>       m_numExtPending++;
>     if (!call IndirectTxTimeout.isRunning())
>       call IndirectTxTimeout.startOneShot(getPersistenceTime());
>     call Debug.log(LEVEL_INFO, IndirectTxP_NOTIFIED, 0,0,0);
>     signal PendingAddrSpecUpdated.notify(TRUE);
>     return IEEE154_SUCCESS;
>   }
>
>   event message_t* DataRequestRx.received(message_t* frame)
>   {
>     uint8_t i, j, srcAddressMode, dstAddressMode, *src;
>     uint8_t *mhr = MHR(frame);
>     uint8_t destMode = (mhr[1] & FC2_DEST_MODE_MASK);
>
>     // received a data request frame from a device
>     // have we got some pending data for it ?
>     if (!m_numTableEntries)
>       return frame;
>     srcAddressMode = (mhr[1] & FC2_SRC_MODE_MASK);
>     if (!(srcAddressMode & FC2_SRC_MODE_SHORT))
>       return frame;  // no source address
>     src = mhr + MHR_INDEX_ADDRESS;
>     if (destMode == FC2_DEST_MODE_SHORT)
>       src += 4;
>     else if (destMode == FC2_DEST_MODE_EXTENDED)
>       src += 10;
>     if (!((mhr[0] & FC1_PAN_ID_COMPRESSION) && (mhr[1] &
> FC2_DEST_MODE_SHORT)))
>       src += 2;
>     for (i=0; i<NUM_MAX_PENDING; i++){
>       if (!m_txFrameTable[i])
>         continue;
>       else {
>         dstAddressMode = (m_txFrameTable[i]->header->mhr[1] &
> FC2_DEST_MODE_MASK);
>         if ((dstAddressMode << 4) != srcAddressMode)
>           continue;
>         else {
>           // we know: dstAddressMode IN [2,3]
>           uint8_t *dst =
> &(m_txFrameTable[i]->header->mhr[MHR_INDEX_ADDRESS]) + 2;
>           uint8_t len = ((srcAddressMode == FC2_SRC_MODE_SHORT) ? 2 : 8);
>           for (j=0; j<len; j++)
>             if (*dst != *src)
>               break;
>           if (j==len)
>             break; // match! break from outer loop
>         }
>       }
>     }
>     call Debug.log(LEVEL_INFO, IndirectTxP_REQUESTED,
> NUM_MAX_PENDING-i,i,*src);
>     if (i != NUM_MAX_PENDING){
>       // found a matching frame, mark it for transmission
>       m_txFrameTable[i]->client |= SEND_THIS_FRAME;
>       post tryCoordCapTxTask();
>     } else {
>       // TODO: send an empty data frame to the device
>     }
>     return frame;
>   }
>
>   void tryCoordCapTx()
>   {
>     // iterate over the queued frames and transmit them in the CAP
>     // (if they are marked for transmission)
>     uint8_t i;
>     if (!m_pendingTxFrame && m_numTableEntries){
>       for (i=0; i<NUM_MAX_PENDING; i++)
>         if (m_txFrameTable[i] && (m_txFrameTable[i]->client &
> SEND_THIS_FRAME)){
>           // TODO: set frame pending bit, if there's more data for this
> destination
>           m_pendingTxFrame = m_txFrameTable[i];
>           m_client = m_txFrameTable[i]->client;
>           if (call CoordCapTx.transmit(m_txFrameTable[i]) ==
> IEEE154_SUCCESS){
>             call Debug.log(LEVEL_INFO, IndirectTxP_SEND_NOW, 0,0,0);
>           } else {
>             m_pendingTxFrame = 0;
>             post tryCoordCapTxTask();
>           }
>           return; // done - wait for txDone
>         }
>     }
>   }
>
>   task void tryCoordCapTxTask()
>   {
>     tryCoordCapTx();
>   }
>
>   event void IndirectTxTimeout.fired()
>   {
>     // a transaction has expired
>     uint32_t now = call IndirectTxTimeout.getNow(), dt=0;
>     uint32_t persistenceTime = getPersistenceTime();
>     uint8_t i;
>
>     for (i=0; i<NUM_MAX_PENDING; i++)
>       if (m_txFrameTable[i] && m_txFrameTable[i] != m_pendingTxFrame){
>         if (call TimeCalc.hasExpired(m_txFrameTable[i]->metadata->timestamp,
> persistenceTime)){
>           ieee154_txframe_t *txFrame = m_txFrameTable[i];
>           txFrame->client &= ~SEND_THIS_FRAME;
>           m_txFrameTable[i] = NULL;
>           m_numTableEntries -= 1;
>           if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) ==
> FC2_DEST_MODE_SHORT)
>             m_numShortPending--;
>           else if ((txFrame->header->mhr[MHR_INDEX_FC2] &
> FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED)
>             m_numExtPending--;
>           signal FrameTx.transmitDone[txFrame->client](txFrame,
> IEEE154_TRANSACTION_EXPIRED);
>           signal PendingAddrSpecUpdated.notify(TRUE);
>         } else if (call
> TimeCalc.timeElapsed(m_txFrameTable[i]->metadata->timestamp, now) > dt){
>           dt = call
> TimeCalc.timeElapsed(m_txFrameTable[i]->metadata->timestamp, now);
>         }
>       }
>     if (dt != 0){
>       if (dt > persistenceTime)
>         dt = persistenceTime;
>       call IndirectTxTimeout.startOneShot(persistenceTime - dt);
>     }
>   }
>
>   event void CoordCapTx.transmitDone(ieee154_txframe_t *txFrame,
> ieee154_status_t status)
>   {
>     uint8_t i;
>     // TODO: if CSMA-CA algorithm failed, then frame shall remain in
> transaction queue
>     for (i=0; i<NUM_MAX_PENDING; i++)
>       if (m_txFrameTable[i] == txFrame){
>         m_txFrameTable[i] = NULL; // slot is now empty
>         break;
>       }
>     signal PendingAddrSpecUpdated.notify(TRUE);
>     m_pendingTxFrame = NULL;
>     txFrame->client = m_client;
>     txFrame->client &= ~SEND_THIS_FRAME;
>     m_numTableEntries -= 1;
>     if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) ==
> FC2_DEST_MODE_SHORT)
>       m_numShortPending--;
>     else if ((txFrame->header->mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) ==
> FC2_DEST_MODE_EXTENDED)
>       m_numExtPending--;
>     signal FrameTx.transmitDone[txFrame->client](txFrame, status);
>     post tryCoordCapTxTask();
>     call Debug.log(LEVEL_INFO, IndirectTxP_SEND_DONE,
> status,m_numTableEntries,0);
>   }
>
>   command error_t PendingAddrSpecUpdated.enable(){return FAIL;}
>   command error_t PendingAddrSpecUpdated.disable(){return FAIL;}
>   default event void FrameTx.transmitDone[uint8_t client](ieee154_txframe_t
> *txFrame, ieee154_status_t status){}
> }
>
>
>
>
> Thanks
>
> Annalisa
>
> _______________________________________________
> Tinyos-help mailing list
> [email protected]
> https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
>

_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to