233 lines
12 KiB
C
233 lines
12 KiB
C
//*****************************************************************************
|
|
//
|
|
// ancc_api.h
|
|
//! @file
|
|
//!
|
|
//! @brief apple notification center service client.
|
|
//
|
|
//*****************************************************************************
|
|
|
|
//*****************************************************************************
|
|
//
|
|
// Copyright (c) 2020, Ambiq Micro
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are met:
|
|
//
|
|
// 1. Redistributions of source code must retain the above copyright notice,
|
|
// this list of conditions and the following disclaimer.
|
|
//
|
|
// 2. 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.
|
|
//
|
|
// 3. Neither the name of the copyright holder nor the names of its
|
|
// contributors may be used to endorse or promote products derived from this
|
|
// software without specific prior written permission.
|
|
//
|
|
// Third party software included in this distribution is subject to the
|
|
// additional license terms as defined in the /docs/licenses directory.
|
|
//
|
|
// 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 HOLDER 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.
|
|
//
|
|
// This is part of revision 2.4.2 of the AmbiqSuite Development Package.
|
|
//
|
|
//*****************************************************************************
|
|
|
|
#ifndef ANCC_API_H
|
|
#define ANCC_API_H
|
|
|
|
#include "att_api.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**************************************************************************************************
|
|
Macros
|
|
**************************************************************************************************/
|
|
/* ANCS Service */ // 7905F431-B5CE-4E99-A40F-4B1E122D00D0
|
|
#define ATT_UUID_ANCS_SERVICE 0xd0, 0x00, 0x2d, 0x12, 0x1e, 0x4b, 0x0f, 0xa4,\
|
|
0x99, 0x4e, 0xce, 0xb5, 0x31, 0xf4, 0x05, 0x79
|
|
/* ANCS characteristics */
|
|
// 9FBF120D-6301-42D9-8C58-25E699A21DBD
|
|
#define ATT_UUID_NOTIFICATION_SOURCE 0xbd, 0x1d, 0xa2, 0x99, 0xe6, 0x25, 0x58, 0x8c, \
|
|
0xd9, 0x42, 0x01, 0x63, 0x0d, 0x12, 0xbf, 0x9f
|
|
|
|
//69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9
|
|
#define ATT_UUID_CTRL_POINT 0xd9, 0xd9, 0xaa, 0xfd, 0xbd, 0x9b, 0x21, 0x98,\
|
|
0xa8, 0x49, 0xe1, 0x45, 0xf3, 0xd8, 0xd1, 0x69
|
|
|
|
// 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB
|
|
#define ATT_UUID_DATA_SOURCE 0xfb, 0x7b, 0x7c, 0xce, 0x6a, 0xb3, 0x44, 0xbe,\
|
|
0xb5, 0x4b, 0xd6, 0x24, 0xe9, 0xc6, 0xea, 0x22
|
|
|
|
#define ANCC_LIST_ELEMENTS 64
|
|
#define ANCC_APP_IDENTIFIER_SIZE_BYTES 64
|
|
#define ANCC_ATTRI_BUFFER_SIZE_BYTES 512
|
|
|
|
/**@brief Category IDs for iOS notifications. */
|
|
typedef enum
|
|
{
|
|
BLE_ANCS_CATEGORY_ID_OTHER, /**< The iOS notification belongs to the "other" category. */
|
|
BLE_ANCS_CATEGORY_ID_INCOMING_CALL, /**< The iOS notification belongs to the "Incoming Call" category. */
|
|
BLE_ANCS_CATEGORY_ID_MISSED_CALL, /**< The iOS notification belongs to the "Missed Call" category. */
|
|
BLE_ANCS_CATEGORY_ID_VOICE_MAIL, /**< The iOS notification belongs to the "Voice Mail" category. */
|
|
BLE_ANCS_CATEGORY_ID_SOCIAL, /**< The iOS notification belongs to the "Social" category. */
|
|
BLE_ANCS_CATEGORY_ID_SCHEDULE, /**< The iOS notification belongs to the "Schedule" category. */
|
|
BLE_ANCS_CATEGORY_ID_EMAIL, /**< The iOS notification belongs to the "E-mail" category. */
|
|
BLE_ANCS_CATEGORY_ID_NEWS, /**< The iOS notification belongs to the "News" category. */
|
|
BLE_ANCS_CATEGORY_ID_HEALTH_AND_FITNESS, /**< The iOS notification belongs to the "Health and Fitness" category. */
|
|
BLE_ANCS_CATEGORY_ID_BUSINESS_AND_FINANCE, /**< The iOS notification belongs to the "Buisness and Finance" category. */
|
|
BLE_ANCS_CATEGORY_ID_LOCATION, /**< The iOS notification belongs to the "Location" category. */
|
|
BLE_ANCS_CATEGORY_ID_ENTERTAINMENT /**< The iOS notification belongs to the "Entertainment" category. */
|
|
} ancc_category_id_values_t;
|
|
|
|
/**@brief Event IDs for iOS notifications. */
|
|
typedef enum
|
|
{
|
|
BLE_ANCS_EVENT_ID_NOTIFICATION_ADDED, /**< The iOS notification was added. */
|
|
BLE_ANCS_EVENT_ID_NOTIFICATION_MODIFIED, /**< The iOS notification was modified. */
|
|
BLE_ANCS_EVENT_ID_NOTIFICATION_REMOVED /**< The iOS notification was removed. */
|
|
} ancc_evt_id_values_t;
|
|
|
|
/**@brief Control point command IDs that the Notification Consumer can send to the Notification Provider. */
|
|
typedef enum
|
|
{
|
|
BLE_ANCS_COMMAND_ID_GET_NOTIF_ATTRIBUTES, /**< Requests attributes to be sent from the NP to the NC for a given notification. */
|
|
BLE_ANCS_COMMAND_ID_GET_APP_ATTRIBUTES, /**< Requests attributes to be sent from the NP to the NC for a given iOS App. */
|
|
BLE_ANCS_COMMAND_ID_GET_PERFORM_NOTIF_ACTION, /**< Requests an action to be performed on a given notification, for example dismiss an alarm. */
|
|
} ancc_command_id_values_t;
|
|
|
|
/**@brief IDs for iOS notification attributes. */
|
|
typedef enum
|
|
{
|
|
BLE_ANCS_NOTIF_ATTR_ID_APP_IDENTIFIER, /**< Identifies that the attribute data is of an "App Identifier" type. */
|
|
BLE_ANCS_NOTIF_ATTR_ID_TITLE, /**< Identifies that the attribute data is a "Title". Needs to be followed by a 2-bytes max length parameter*/
|
|
BLE_ANCS_NOTIF_ATTR_ID_SUBTITLE, /**< Identifies that the attribute data is a "Subtitle". Needs to be followed by a 2-bytes max length parameter*/
|
|
BLE_ANCS_NOTIF_ATTR_ID_MESSAGE, /**< Identifies that the attribute data is a "Message". Needs to be followed by a 2-bytes max length parameter*/
|
|
BLE_ANCS_NOTIF_ATTR_ID_MESSAGE_SIZE, /**< Identifies that the attribute data is a "Message Size". */
|
|
BLE_ANCS_NOTIF_ATTR_ID_DATE, /**< Identifies that the attribute data is a "Date". */
|
|
BLE_ANCS_NOTIF_ATTR_ID_POSITIVE_ACTION_LABEL, /**< The notification has a "Positive action" that can be executed associated with it. */
|
|
BLE_ANCS_NOTIF_ATTR_ID_NEGATIVE_ACTION_LABEL, /**< The notification has a "Negative action" that can be executed associated with it. */
|
|
} ancc_notif_attr_id_values_t;
|
|
|
|
/**@brief ActionID values. */
|
|
typedef enum
|
|
{
|
|
BLE_ANCS_NOTIF_ACTION_ID_POSITIVE,
|
|
BLE_ANCS_NOTIF_ACTION_ID_NEGATIVE,
|
|
} ancc_notif_action_id_values_t;
|
|
|
|
|
|
/**@brief Typedef for iOS notifications. */
|
|
typedef struct
|
|
{
|
|
uint8_t event_id; /**< This field informs the accessory whether the given iOS notification was added, modified, or removed. The enumerated values for this field are defined in EventID Values.. */
|
|
uint8_t event_flags; /**< A bitmask whose set bits inform an NC of specificities with the iOS notification. */
|
|
uint8_t category_id; /**< A numerical value providing a category in which the iOS notification can be classified. */
|
|
uint8_t category_count; /**< The current number of active iOS notifications in the given category. */
|
|
uint32_t notification_uid; /**< A 32-bit numerical value that is the unique identifier (UID) for the iOS notification. */
|
|
bool_t noti_valid; /**< A flag to indicate whether the notification is still valid in the list. */
|
|
} ancc_notif_t;
|
|
|
|
/*! ancs client enumeration of handle indexes of characteristics to be discovered */
|
|
enum
|
|
{
|
|
ANCC_NOTIFICATION_SOURCE_HDL_IDX, // ANCC Notification Source Handle
|
|
ANCC_NOTIFICATION_SOURCE_CCC_HDL_IDX, // ANCC Notification Source CCC Handle
|
|
ANCC_CONTROL_POINT_HDL_IDX, // ANCC Control Point Handle
|
|
ANCC_DATA_SOURCE_HDL_IDX, // ANCC Data Source Handle
|
|
ANCC_DATA_SOURCE_CCC_HDL_IDX, // ANCC Data Source CCC Handle
|
|
ANCC_HDL_LIST_LEN /*! Handle list length */
|
|
};
|
|
|
|
/*! Configurable parameters */
|
|
typedef struct
|
|
{
|
|
wsfTimerTicks_t period; /*! action timer expiration period in ms */
|
|
} anccCfg_t;
|
|
|
|
typedef enum
|
|
{
|
|
NOTI_ATTR_NEW_NOTIFICATION = 0,
|
|
NOTI_ATTR_NEW_ATTRIBUTE,
|
|
NOTI_ATTR_RECEIVING_ATTRIBUTE
|
|
} enum_active_state_t;
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t handle; // handle to indicate the current active notification in the list
|
|
enum_active_state_t attrState;
|
|
uint16_t bufIndex;
|
|
uint16_t parseIndex;
|
|
uint16_t attrLength;
|
|
uint8_t attrId;
|
|
uint16_t attrCount;
|
|
uint8_t commandId;
|
|
uint32_t notiUid;
|
|
uint8_t appId[ANCC_APP_IDENTIFIER_SIZE_BYTES];
|
|
uint8_t attrDataBuf[ANCC_ATTRI_BUFFER_SIZE_BYTES];
|
|
} active_notif_t;
|
|
|
|
/*! Application data reception callback */
|
|
typedef void (*anccAttrRecvCback_t)(active_notif_t* pAttr);
|
|
typedef void (*anccNotiCmplCback_t)(active_notif_t* pAttr, uint32_t notiUid);
|
|
|
|
/*! Application notify remove callback */
|
|
typedef void (*anccNotiRemoveCback_t)(ancc_notif_t* pAttr);
|
|
typedef struct
|
|
{
|
|
dmConnId_t connId;
|
|
uint16_t* hdlList;
|
|
anccCfg_t cfg;
|
|
wsfTimer_t actionTimer; // perform actions with proper delay
|
|
wsfTimer_t discoverTimer; // perform service discovery delay
|
|
ancc_notif_t anccList[ANCC_LIST_ELEMENTS]; // buffer size = MAX_LIST_ELEMENTS*sizeof(ancc_notif_t)
|
|
active_notif_t active;
|
|
anccAttrRecvCback_t attrCback;
|
|
anccNotiCmplCback_t notiCback;
|
|
anccNotiRemoveCback_t rmvCback;
|
|
} anccCb_t;
|
|
|
|
/**************************************************************************************************
|
|
Function Prototypes
|
|
**************************************************************************************************/
|
|
// operation interfaces
|
|
void AncsPerformNotiAction(uint16_t *pHdlList, uint32_t notiUid, ancc_notif_action_id_values_t actionId);
|
|
void AncsGetAppAttribute(uint16_t *pHdlList, uint8_t* appId);
|
|
void AnccGetNotificationAttribute(uint16_t *pHdlList, uint32_t notiUid);
|
|
|
|
// initialization interfaces
|
|
void AnccInit(wsfHandlerId_t handlerId, anccCfg_t* cfg, uint8_t disctimer_event);
|
|
void AnccCbackRegister(anccAttrRecvCback_t attrCback, anccNotiCmplCback_t notiCback, anccNotiRemoveCback_t rmvCback);
|
|
|
|
// app routines
|
|
void AnccNtfValueUpdate(uint16_t *pHdlList, attEvt_t * pMsg, uint8_t actionTimerEvt);
|
|
void AnccActionHandler(uint8_t actionTimerEvt);
|
|
void AnccActionStop(void);
|
|
void AnccActionStart(uint8_t timerEvt);
|
|
void AnccConnClose(void);
|
|
void AnccConnOpen(dmConnId_t connId, uint16_t* hdlList);
|
|
void AnccSvcDiscover(dmConnId_t connId, uint16_t *pHdlList);
|
|
bool_t AnccStartServiceDiscovery(void);
|
|
|
|
/* Global variable */
|
|
extern anccCb_t anccCb;
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif /* ANCC_API_H */
|