123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525 |
- /***************************************************************************************************
- Filename: MT.c
- Revised: $Date: 2011-06-07 12:12:44 -0700 (Tue, 07 Jun 2011) $
- Revision: $Revision: 26238 $
- Description: MonitorTest Event Loop functions.
- Everything in the MonitorTest Task (except the serial driver).
- Copyright 2007-2011 Texas Instruments Incorporated. All rights reserved.
- IMPORTANT: Your use of this Software is limited to those specific rights
- granted under the terms of a software license agreement between the user
- who downloaded the software, his/her employer (which must be your employer)
- and Texas Instruments Incorporated (the "License"). You may not use this
- Software unless you agree to abide by the terms of the License. The License
- limits your use, and you acknowledge, that the Software may not be modified,
- copied or distributed unless embedded on a Texas Instruments microcontroller
- or used solely and exclusively in conjunction with a Texas Instruments radio
- frequency transceiver, which is integrated into your product. Other than for
- the foregoing purpose, you may not use, reproduce, copy, prepare derivative
- works of, modify, distribute, perform, display or sell this Software and/or
- its documentation for any purpose.
- YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
- PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
- INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
- NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
- TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
- NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
- LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
- INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
- OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
- OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
- (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
- Should you have any questions regarding your right to use this Software,
- contact Texas Instruments Incorporated at www.TI.com.
- **************************************************************************************************/
- /**************************************************************************************************
- * INCLUDES
- **************************************************************************************************/
- #include "ZComDef.h"
- #include "MT.h"
- #include "MT_APP.h"
- #include "MT_DEBUG.h"
- #include "MT_UTIL.h"
- #include "MT_SYS.h"
- #include "OnBoard.h"
- #include "OSAL.h"
- #include "OSAL_Memory.h"
- #include "OSAL_Nv.h"
- #include "DebugTrace.h"
- #include "ZMAC.h"
- #if !defined ( NONWK )
- #include "NLMEDE.h"
- #include "nwk_bufs.h"
- #include "ZDObject.h"
- #include "ssp.h"
- #include "nwk_util.h"
- #include "AF.h"
- #include "MT_SAPI.h"
- #endif
- #if defined( MT_MAC_FUNC ) || defined( MT_MAC_CB_FUNC )
- #include "MT_MAC.h"
- #endif
- #if defined( MT_NWK_FUNC ) || defined( MT_NWK_CB_FUNC )
- #include "MT_NWK.h"
- #include "nwk.h"
- #include "nwk_bufs.h"
- #endif
- #if defined( MT_AF_FUNC ) || defined( MT_AF_CB_FUNC )
- #include "MT_AF.h"
- #endif
- #if defined( MT_USER_TEST_FUNC )
- #include "AF.h"
- #endif
- #if defined( MT_ZDO_FUNC )
- #include "MT_ZDO.h"
- #endif
- #if defined (MT_SAPI_FUNC)
- #include "MT_SAPI.h"
- #endif
- #if defined (MT_OTA_FUNC)
- #include "MT_OTA.h"
- #endif
- #if defined( APP_TP )
- #include "TestProfile.h"
- #endif
- #if defined( APP_TP2 )
- #include "TestProfile2.h"
- #endif
- #if defined(APP_TGEN)
- #include "TrafficGenApp.h"
- #endif
- #if defined(APP_DEBUG)
- #include "DebugApp.h"
- #endif
- #if defined (NWK_TEST)
- #include "HWTTApp.h"
- #endif
- /* HAL */
- #include "hal_uart.h"
- #include "hal_led.h"
- #include "hal_key.h"
- #include "MT_UART.h"
- /**************************************************************************************************
- * CONSTANTS
- **************************************************************************************************/
- mtProcessMsg_t mtProcessIncoming[] =
- {
- NULL,
- #if defined (MT_SYS_FUNC)
- MT_SysCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_MAC_FUNC)
- MT_MacCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_NWK_FUNC)
- MT_NwkCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_AF_FUNC)
- MT_AfCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_ZDO_FUNC)
- MT_ZdoCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_SAPI_FUNC)
- MT_SapiCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_UTIL_FUNC)
- MT_UtilCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_DEBUG_FUNC)
- MT_DebugCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_APP_FUNC)
- MT_AppCommandProcessing,
- #else
- NULL,
- #endif
- #if defined (MT_OTA_FUNC)
- MT_OtaCommandProcessing,
- #else
- NULL,
- #endif
- };
- /**************************************************************************************************
- * GLOBAL VARIABLES
- **************************************************************************************************/
- byte debugThreshold;
- byte debugCompId;
- /**************************************************************************************************
- * LOCAL FUNCTIONS
- **************************************************************************************************/
- void MT_MsgQueueInit( void );
- void MT_ResetMsgQueue( void );
- byte MT_QueueMsg( byte *msg , byte len );
- void MT_ProcessQueue( void );
- #if defined ( MT_USER_TEST_FUNC )
- void MT_ProcessAppUserCmd( byte *pData );
- #endif
- /**************************************************************************************************
- * @fn MT_Init
- *
- * @brief This function is the secondary initialization that resolves conflicts during
- * osalInitTasks(). For example, since MT is the highest priority task, and
- * specifically because the MT task is initialized before the ZDApp task, if MT_Init()
- * registers anything with ZDO_RegisterForZdoCB(), it is wiped out when ZDApp task
- * initialization invokes ZDApp_InitZdoCBFunc().
- * There may be other existing or future such races, so try to do all possible
- * MT initialization here vice in MT_TaskInit().
- *
- * input parameters
- *
- * None.
- *
- * output parameters
- *
- * None.
- *
- * @return None.
- **************************************************************************************************
- */
- void MT_Init(void)
- {
- #if defined (MT_ZDO_FUNC)
- MT_ZdoInit();
- #endif
- MT_SysResetInd();
- }
- /***************************************************************************************************
- * @fn MT_BuildSPIMsg
- *
- * @brief
- *
- * Format an SPI message.
- *
- * @param UINT16 cmd - command id
- * @param byte *msg - pointer to message buffer
- * @param byte dataLen - length of data field
- * @param byte *pData - pointer to data field
- *
- * @return void
- ***************************************************************************************************/
- void MT_BuildSPIMsg( uint8 cmdType, uint8 cmdId, byte *msg, byte dataLen, byte *pData )
- {
- /* Fill in the CMD and Data Length */
- *msg++ = dataLen;
- *msg++ = cmdType;
- *msg++ = cmdId;
- /* Fill in the data */
- if ( pData )
- {
- osal_memcpy( msg, pData, dataLen );
- }
- }
- /***************************************************************************************************
- * @fn MT_BuildAndSendZToolResponse
- *
- * @brief Build and send a ZTOOL msg
- * @param uint8 cmdType - include type and subsystem
- * uint8 cmdId - command ID
- * byte dataLen
- * byte *pData
- *
- * @return void
- ***************************************************************************************************/
- void MT_BuildAndSendZToolResponse(uint8 cmdType, uint8 cmdId, uint8 dataLen, uint8 *pData)
- {
- uint8 *msg_ptr;
- /* Allocate memory including SOP and FCS */
- msg_ptr = MT_TransportAlloc((mtRpcCmdType_t)(cmdType & 0xE0), dataLen);
- if (msg_ptr)
- {
- /* Build the message */
- MT_BuildSPIMsg(cmdType, cmdId, msg_ptr, dataLen, pData);
- /* Send out the msg */
- MT_TransportSend(msg_ptr);
- }
- }
- /***************************************************************************************************
- * @fn MT_ProcessIncoming
- *
- * @brief Process Incoming Message.
- *
- * @param byte *pBuf - pointer to event message
- *
- * @return void
- ***************************************************************************************************/
- void MT_ProcessIncoming(uint8 *pBuf)
- {
- mtProcessMsg_t func;
- uint8 rsp[MT_RPC_FRAME_HDR_SZ];
- /* pre-build response message: | status | cmd0 | cmd1 | */
- rsp[1] = pBuf[MT_RPC_POS_CMD0];
- rsp[2] = pBuf[MT_RPC_POS_CMD1];
- /* check length */
- if (pBuf[MT_RPC_POS_LEN] > MT_RPC_DATA_MAX)
- {
- rsp[0] = MT_RPC_ERR_LENGTH;
- }
- /* check subsystem range */
- else if ((rsp[1] & MT_RPC_SUBSYSTEM_MASK) < MT_RPC_SYS_MAX)
- {
- /* look up processing function */
- func = mtProcessIncoming[rsp[1] & MT_RPC_SUBSYSTEM_MASK];
- if (func)
- {
- /* execute processing function */
- rsp[0] = (*func)(pBuf);
- }
- else
- {
- rsp[0] = MT_RPC_ERR_SUBSYSTEM;
- }
- }
- else
- {
- rsp[0] = MT_RPC_ERR_SUBSYSTEM;
- }
- /* if error and this was an SREQ, send error message */
- if ((rsp[0] != MT_RPC_SUCCESS) && ((rsp[1] & MT_RPC_CMD_TYPE_MASK) == MT_RPC_CMD_SREQ))
- {
- MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_RES0), 0,
- MT_RPC_FRAME_HDR_SZ, rsp);
- }
- }
- /***************************************************************************************************
- * @fn MTProcessAppRspMsg
- *
- * @brief Process the User App Response Message
- *
- * @param data - output serial buffer. The first byte must be the
- * endpoint that send this message.
- * @param len - data length
- *
- * @return none
- ***************************************************************************************************/
- void MTProcessAppRspMsg( byte *pData, byte len )
- {
- /* Send out Reset Response message */
- MT_BuildAndSendZToolResponse( ((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_APP), MT_APP_RSP, len, pData );
- }
- /***************************************************************************************************
- * @fn MT_ReverseBytes
- *
- * @brief
- *
- * Reverses bytes within an array
- *
- * @param data - ptr to data buffer to reverse
- * @param len - number of bytes in buffer
- *
- * @return void
- ***************************************************************************************************/
- void MT_ReverseBytes( byte *pData, byte len )
- {
- byte i,j;
- byte temp;
- for ( i = 0, j = len-1; len > 1; len-=2 )
- {
- temp = pData[i];
- pData[i++] = pData[j];
- pData[j--] = temp;
- }
- }
- /***************************************************************************************************
- * @fn MT_Word2Buf
- *
- * @brief Copy a uint16 array to a byte array, little endian.
- *
- * @param pBuf - byte array
- * @param pWord - uint16 array
- * @param len - length of uint16 array
- *
- * @return pointer to end of byte array
- ***************************************************************************************************/
- uint8 *MT_Word2Buf( uint8 *pBuf, uint16 *pWord, uint8 len )
- {
- while ( len-- > 0 )
- {
- *pBuf++ = LO_UINT16( *pWord );
- *pBuf++ = HI_UINT16( *pWord );
- pWord++;
- }
- return pBuf;
- }
- #if !defined(NONWK)
- /***************************************************************************************************
- * @fn MT_BuildEndpointDesc
- *
- * @brief Build endpoint descriptor and simple descriptor structure from incoming buffer
- *
- * @param pBuf - byte array
- *
- * @return epDesc - pointer to the endpoint descriptor
- ***************************************************************************************************/
- uint8 MT_BuildEndpointDesc( uint8 *pBuf, void *param )
- {
- uint8 i;
- uint8 ret = ZSuccess;
- endPointDesc_t *epDesc;
- epDesc = (endPointDesc_t *)param;
- /* check if this endpoint is already registered */
- if ( afFindEndPointDesc( *pBuf ) != NULL )
- {
- ret = ZApsDuplicateEntry;
- }
- else if ( epDesc )
- {
- epDesc->endPoint = *pBuf;
- /* Ignore the latency reqs */
- epDesc->latencyReq = noLatencyReqs;
- /* allocate memory for the simple descriptor */
- epDesc->simpleDesc = (SimpleDescriptionFormat_t *) osal_mem_alloc(sizeof(SimpleDescriptionFormat_t));
- if (epDesc->simpleDesc)
- {
- /* Endpoint */
- epDesc->simpleDesc->EndPoint = *pBuf++;
- /* AppProfId */
- epDesc->simpleDesc->AppProfId = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += sizeof(uint16);
- /* AppDeviceId */
- epDesc->simpleDesc->AppDeviceId = BUILD_UINT16(pBuf[0],pBuf[1]);
- pBuf += sizeof(uint16);
- /* AppDevVer */
- epDesc->simpleDesc->AppDevVer = (*pBuf++) & AF_APP_DEV_VER_MASK ;
- /* LatencyReq */
- pBuf++;
- /* AppNumInClusters */
- epDesc->simpleDesc->AppNumInClusters = *pBuf++;
- if (epDesc->simpleDesc->AppNumInClusters)
- {
- epDesc->simpleDesc->pAppInClusterList = (uint16 *)
- osal_mem_alloc((epDesc->simpleDesc->AppNumInClusters)*sizeof(uint16));
- if ( epDesc->simpleDesc->pAppInClusterList )
- {
- for (i=0; i<(epDesc->simpleDesc->AppNumInClusters); i++)
- {
- epDesc->simpleDesc->pAppInClusterList[i] = BUILD_UINT16(*pBuf, *(pBuf+1));
- pBuf += 2;
- }
- }
- else
- {
- ret = ZMemError;
- }
- }
- /* AppNumOutClusters */
- epDesc->simpleDesc->AppNumOutClusters = *pBuf++;
- if (epDesc->simpleDesc->AppNumOutClusters)
- {
- epDesc->simpleDesc->pAppOutClusterList = (uint16 *)
- osal_mem_alloc((epDesc->simpleDesc->AppNumOutClusters)*sizeof(uint16));
- if (epDesc->simpleDesc->pAppOutClusterList)
- {
- for (i=0; i<(epDesc->simpleDesc->AppNumOutClusters); i++)
- {
- epDesc->simpleDesc->pAppOutClusterList[i] = BUILD_UINT16(*pBuf, *(pBuf+1));
- pBuf += 2;
- }
- }
- else
- {
- ret = ZMemError;
- }
- }
- /* if any list cannot be allocated...free all */
- if ( ret == ZMemError )
- {
- if (epDesc->simpleDesc->pAppInClusterList)
- {
- osal_mem_free(epDesc->simpleDesc->pAppInClusterList);
- }
- if (epDesc->simpleDesc->AppNumOutClusters)
- {
- osal_mem_free(epDesc->simpleDesc->pAppOutClusterList);
- }
- osal_mem_free(epDesc->simpleDesc);
- }
- }
- else
- {
- ret = ZMemError;
- }
- }
- return ret;
- }
- #endif
- /***************************************************************************************************
- ***************************************************************************************************/
|