initial commit

This commit is contained in:
2022-10-23 23:45:43 -07:00
commit e190fa5193
6450 changed files with 8626944 additions and 0 deletions
@@ -0,0 +1,206 @@
/*************************************************************************************************/
/*!
* \file
*
* \brief Asset Tracking profile client.
*
* Copyright (c) 2018-2019 Arm Ltd.
*
* Copyright (c) 2019 Packetcraft, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*************************************************************************************************/
#ifndef ATPC_API_H
#define ATPC_API_H
#include "att_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/*! \addtogroup ASSET_TRACKING_PROFILE_CLIENT
* \{ */
/**************************************************************************************************
Macros
**************************************************************************************************/
/*! \brief Enumeration of handle indexes of characteristics to be discovered. */
enum
{
ATPC_CTE_ENABLE_HDL, /*!< \brief Constant Tone Extension enable. */
ATPC_CTE_MIN_LEN_HDL, /*!< \brief Constant Tone Extension minimum length. */
ATPC_CTE_ADV_MIN_TX_CNT_HDL, /*!< \brief Constant Tone Extension minimum transmit count. */
ATPC_CTE_ADV_TX_DURATION_HDL, /*!< \brief Constant Tone Extension transmit duration. */
ATPC_CTE_ADV_INTERVAL_HDL, /*!< \brief Constant Tone Extension interval. */
ATPC_CTE_ADV_EXT_PHY_HDL, /*!< \brief Constant Tone Extension PHY. */
ATPC_CTE_HDL_LIST_LEN, /*!< \brief Handle list length. */
};
/**************************************************************************************************
Function Declarations
**************************************************************************************************/
/*************************************************************************************************/
/*!
* \brief Perform service and characteristic discovery for Constant Tone Extension service.
* Parameter pHdlList must point to an array of length \ref ATPC_CTE_HDL_LIST_LEN.
* If discovery is successful the handles of discovered characteristics and
* descriptors will be set in pHdlList.
*
* \param connId Connection identifier.
* \param pHdlList Characteristic handle list.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteDiscover(dmConnId_t connId, uint16_t *pHdlList);
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension enable attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param enable Enable.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteEnable(dmConnId_t connId, uint16_t handle, uint8_t enable);
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension minimum length attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param minLen Minimum length.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteMinLen(dmConnId_t connId, uint16_t handle, uint8_t minLen);
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension minimum transmit count attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param txCount Minimum transmit count.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteMinTxCount(dmConnId_t connId, uint16_t handle, uint8_t txCount);
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension transmit duration attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param duration Transmit duration.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteTxDuration(dmConnId_t connId, uint16_t handle, uint8_t duration);
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension interval attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param interval Interval.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteInterval(dmConnId_t connId, uint16_t handle, uint16_t interval);
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension PHY attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param phy PHY.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWritePhy(dmConnId_t connId, uint16_t handle, uint8_t phy);
/*************************************************************************************************/
/*!
* \brief Set the antenna identifiers for a connection ID.
*
* \param connId Connection identifier.
* \param numAntenna Number of antenna and len of pAntennaIds in bytes.
* \param pAntennaIds Array containing identifiers of antenna for this connection.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcSetAntennaIds(dmConnId_t connId, uint8_t numAntenna, uint8_t *pAntennaIds);
/*************************************************************************************************/
/*!
* \brief Enable AoA CTE Rx request over ACL.
*
* \param connId Connection identifier.
* \param handle CTE enable attribute handle.
* \param length Request length.
* \param interval Request interval.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteAclEnableReq(dmConnId_t connId, uint16_t handle, uint8_t length, uint16_t interval);
/*************************************************************************************************/
/*!
* \brief Disable AoA CTE Rx request over ACL.
*
* \param connId Connection identifier.
* \param handle CTE enable attribute handle.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteAclDisableReq(dmConnId_t connId, uint16_t handle);
/*************************************************************************************************/
/*!
* \brief Called by application to notify the ATPC of System Events.
*
* \param pEvt Pointer to the Event.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcProcMsg(wsfMsgHdr_t *pEvt);
/*! \} */ /* ASSET_TRACKING_PROFILE_CLIENT */
#ifdef __cplusplus
};
#endif
#endif /* ATPC_API_H */
@@ -0,0 +1,418 @@
/*************************************************************************************************/
/*!
* \file
*
* \brief Asset Tracking profile client.
*
* Copyright (c) 2018-2019 Arm Ltd.
*
* Copyright (c) 2019 Packetcraft, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*************************************************************************************************/
#include <string.h>
#include "wsf_types.h"
#include "wsf_assert.h"
#include "wsf_trace.h"
#include "util/bstream.h"
#include "app_api.h"
#include "atpc_api.h"
#include "svc_cte.h"
/**************************************************************************************************
Macros
**************************************************************************************************/
/*! Asset tracking profile connection states. */
#define ATPC_CONN_STATE_ENABLING 0
#define ATPC_CONN_STATE_DISABLING 1
/**************************************************************************************************
Local Variables
**************************************************************************************************/
/*! Asset Tracking Profile Client connection control block. */
typedef struct
{
uint16_t enableHandle; /*! CTE enable attribute handle. */
uint8_t state; /*! Connection state. */
uint8_t length; /*! Min CTE length. */
uint16_t interval; /*! CTE interval. */
bool_t numAntenna; /*! Number of antenna and len of pAntennaIds in bytes. */
uint8_t *pAntennaIds; /*! Array containing identifiers of antenna for this connection. */
} atpcConnCb_t;
/*! Asset Tracking Profile Server control block. */
typedef struct
{
atpcConnCb_t connCb[DM_CONN_MAX]; /*! Connection control block. */
uint8_t switchSampleRates; /*! Supported Switching Sampling Rates. */
uint8_t switchPatternMaxLen; /*! Max Length of Switching Pattern. */
uint8_t numAntennae; /*! Number of Antennae. */
uint8_t cteMaxLen; /*! Max CTE Length. */
} atpcCb_t;
static atpcCb_t atpcCb;
/*! Constant Tone Extension enable. */
static const attcDiscChar_t atpcCteEnable =
{
attCteEnChUuid,
ATTC_SET_REQUIRED
};
/*! Constant Tone Extension minimum length. */
static const attcDiscChar_t atpcCteMinLen =
{
attCteMinLenChUuid,
ATTC_SET_REQUIRED
};
/*! Constant Tone Extension minimum transmit count. */
static const attcDiscChar_t atpcCteTxCnt =
{
attCteTxCntChUuid,
ATTC_SET_REQUIRED
};
/*! Constant Tone Extension transmit duration. */
static const attcDiscChar_t atpcCteDurationc =
{
attCteTxDurChUuid,
ATTC_SET_REQUIRED
};
/*! Constant Tone Extension interval. */
static const attcDiscChar_t atpcCteInterval =
{
attCteIntChUuid,
ATTC_SET_REQUIRED
};
/*! Constant Tone Extension PHY. */
static const attcDiscChar_t atpcCtePhy =
{
attCtePhyChUuid,
ATTC_SET_REQUIRED
};
/*! List of characteristics to be discovered; order matches handle index enumeration. */
static const attcDiscChar_t *atpcCteDiscCharList[] =
{
&atpcCteEnable, /*! Constant Tone Extension enable. */
&atpcCteMinLen, /*! Constant Tone Extension minimum length. */
&atpcCteTxCnt, /*! Constant Tone Extension minimum transmit count. */
&atpcCteDurationc, /*! Constant Tone Extension transmit duration. */
&atpcCteInterval, /*! Constant Tone Extension interval. */
&atpcCtePhy, /*! Constant Tone Extension PHY. */
};
/*! sanity check: make sure handle list length matches characteristic list length. */
WSF_CT_ASSERT(ATPC_CTE_HDL_LIST_LEN == ((sizeof(atpcCteDiscCharList) / sizeof(attcDiscChar_t *))));
/*************************************************************************************************/
/*!
* \brief Called by application to notify the profile of System Events.
*
* \param pEvt Pointer to the Event.
*
* \return None.
*/
/*************************************************************************************************/
static void atpcProcWriteRsp(attEvt_t *pEvt)
{
dmConnId_t connId = (dmConnId_t) pEvt->hdr.param;
if ((pEvt->hdr.status == ATT_SUCCESS) && (pEvt->handle == atpcCb.connCb[connId-1].enableHandle))
{
atpcConnCb_t *pCcb = &atpcCb.connCb[connId-1];
switch (pCcb->state)
{
case ATPC_CONN_STATE_ENABLING:
DmConnCteRxSampleStart(connId, HCI_CTE_SLOT_DURATION_2_US, pCcb->numAntenna, pCcb->pAntennaIds);
break;
case ATPC_CONN_STATE_DISABLING:
DmConnCteRxSampleStop(connId);
break;
default:
break;
}
}
}
/*************************************************************************************************/
/*!
* \brief Perform service and characteristic discovery for Constant Tone Extension service.
* Parameter pHdlList must point to an array of length \ref ATPC_CTE_HDL_LIST_LEN.
* If discovery is successful the handles of discovered characteristics and
* descriptors will be set in pHdlList.
*
* \param connId Connection identifier.
* \param pHdlList Characteristic handle list.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteDiscover(dmConnId_t connId, uint16_t *pHdlList)
{
AppDiscFindService(connId, ATT_16_UUID_LEN, (uint8_t *) attCteSvcUuid,
ATPC_CTE_HDL_LIST_LEN, (attcDiscChar_t **) atpcCteDiscCharList, pHdlList);
}
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension enable attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param enable Enable.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteEnable(dmConnId_t connId, uint16_t handle, uint8_t enable)
{
WSF_ASSERT(handle != ATT_HANDLE_NONE);
AttcWriteReq(connId, handle, sizeof(uint8_t), &enable);
}
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension minimum length attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param minLen Minimum length.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteMinLen(dmConnId_t connId, uint16_t handle, uint8_t minLen)
{
WSF_ASSERT(handle != ATT_HANDLE_NONE);
AttcWriteReq(connId, handle, sizeof(uint8_t), &minLen);
}
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension minimum transmit count attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param txCount Minimum transmit count.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteMinTxCount(dmConnId_t connId, uint16_t handle, uint8_t txCount)
{
WSF_ASSERT(handle != ATT_HANDLE_NONE);
AttcWriteReq(connId, handle, sizeof(uint8_t), &txCount);
}
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension transmit duration attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param duration Transmit duration.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteTxDuration(dmConnId_t connId, uint16_t handle, uint8_t duration)
{
WSF_ASSERT(handle != ATT_HANDLE_NONE);
AttcWriteReq(connId, handle, sizeof(uint8_t), &duration);
}
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension interval attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param interval Interval.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWriteInterval(dmConnId_t connId, uint16_t handle, uint16_t interval)
{
WSF_ASSERT(handle != ATT_HANDLE_NONE);
uint8_t buf[ATT_DEFAULT_PAYLOAD_LEN];
uint8_t *p = buf;
UINT16_TO_BSTREAM(p, interval);
AttcWriteReq(connId, handle, sizeof(uint16_t), buf);
}
/*************************************************************************************************/
/*!
* \brief Write to the Constant Tone Extension PHY attribute.
*
* \param connId Connection identifier.
* \param handle Attribute handle.
* \param phy PHY.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteWritePhy(dmConnId_t connId, uint16_t handle, uint8_t phy)
{
WSF_ASSERT(handle != ATT_HANDLE_NONE)
AttcWriteReq(connId, handle, sizeof(uint8_t), &phy);
}
/*************************************************************************************************/
/*!
* \brief Enable AoA CTE Rx request over ACL.
*
* \param connId Connection identifier.
* \param handle CTE enable attribute handle.
* \param length Request length.
* \param interval Request interval.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteAclEnableReq(dmConnId_t connId, uint16_t handle, uint8_t length, uint16_t interval)
{
atpcConnCb_t *pCcb;
WSF_ASSERT((connId > DM_CONN_ID_NONE) && (connId <= DM_CONN_MAX));
WSF_ASSERT(handle != ATT_HANDLE_NONE)
/* Store the enable handle and CTE configuration */
pCcb = &atpcCb.connCb[connId-1];
pCcb->enableHandle = handle;
pCcb->length = length;
pCcb->interval = interval;
pCcb->state = ATPC_CONN_STATE_ENABLING;
AtpcCteWriteEnable(connId, handle, CTE_ENABLE_ACL_BIT);
}
/*************************************************************************************************/
/*!
* \brief Disable AoA CTE Rx request over ACL.
*
* \param connId Connection identifier.
* \param handle CTE enable attribute handle.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcCteAclDisableReq(dmConnId_t connId, uint16_t handle)
{
atpcConnCb_t *pCcb;
WSF_ASSERT((connId > DM_CONN_ID_NONE) && (connId <= DM_CONN_MAX));
WSF_ASSERT(handle != ATT_HANDLE_NONE)
/* Set the enableHandle to ATT_HANDLE_NONE to prevent CTE rx req on ATTC_WRITE_RSP. */
pCcb = &atpcCb.connCb[connId-1];
pCcb->enableHandle = handle;
pCcb->state = ATPC_CONN_STATE_DISABLING;
AtpcCteWriteEnable(connId, handle, CTE_ENABLE_NONE);
}
/*************************************************************************************************/
/*!
* \brief Set the antenna identifiers for a connection ID.
*
* \param connId Connection identifier.
* \param numAntenna Number of antenna and len of pAntennaIds in bytes.
* \param pAntennaIds Array containing identifiers of antenna for this connection.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcSetAntennaIds(dmConnId_t connId, uint8_t numAntenna, uint8_t *pAntennaIds)
{
atpcConnCb_t *pCcb;
WSF_ASSERT((connId > DM_CONN_ID_NONE) && (connId <= DM_CONN_MAX));
WSF_ASSERT(numAntenna <= atpcCb.numAntennae);
pCcb = &atpcCb.connCb[connId-1];
pCcb->numAntenna = numAntenna;
pCcb->pAntennaIds = pAntennaIds;
}
/*************************************************************************************************/
/*!
* \brief Called by application to notify the ATPC of System Events.
*
* \param pEvt Pointer to the Event.
*
* \return None.
*/
/*************************************************************************************************/
void AtpcProcMsg(wsfMsgHdr_t *pEvt)
{
atpcConnCb_t *pCcb = &atpcCb.connCb[pEvt->param - 1];
dmEvt_t *pDmEvt = (dmEvt_t*) pEvt;
switch (pEvt->event)
{
case DM_RESET_CMPL_IND:
DmReadAntennaInfo();
break;
case DM_READ_ANTENNA_INFO_IND:
atpcCb.cteMaxLen = pDmEvt->readAntennaInfo.cteMaxLen;
atpcCb.switchSampleRates = pDmEvt->readAntennaInfo.switchSampleRates;
atpcCb.numAntennae = pDmEvt->readAntennaInfo.numAntennae;
atpcCb.switchPatternMaxLen = pDmEvt->readAntennaInfo.switchPatternMaxLen;
break;
case ATTC_WRITE_RSP:
atpcProcWriteRsp((attEvt_t *)pEvt);
break;
case DM_CONN_CTE_RX_SAMPLE_START_IND:
if ((pEvt->status == HCI_SUCCESS) && (pCcb->state == ATPC_CONN_STATE_ENABLING))
{
DmConnCteReqStart((dmConnId_t) pEvt->param, pCcb->interval, pCcb->length, HCI_CTE_TYPE_REQ_AOA);
}
break;
case DM_CONN_CTE_RX_SAMPLE_STOP_IND:
if ((pEvt->status == HCI_SUCCESS) && (pCcb->state == ATPC_CONN_STATE_DISABLING))
{
DmConnCteReqStop((dmConnId_t) pEvt->param);
}
break;
case DM_CTE_REQ_FAIL_IND:
break;
default:
break;
}
}