bleSDK_expansion_board/ble/api/task.h

221 lines
6.9 KiB
C
Raw Permalink Normal View History

/**
****************************************************************************************
*
* @file task.h
*
* @brief Task Definitions
*
****************************************************************************************
*/
#ifndef _TASK_H_
#define _TASK_H_
/*
* INCLUDE FILES
****************************************************************************************
*/
#include <stdint.h>
#include <stdbool.h>
#include "list.h"
#include "utils.h"
#include "blelib.h"
/*
* DEFINITIONS
****************************************************************************************
*/
/// Type ID: 0~255(Group)
typedef uint8_t tid_t;
/// State
typedef uint8_t state_t;
/**
* Task Identifier bit field
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
* | Instance Index | Task Type(Group ID) |
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
*
* Bit [0-7] : task type (Group ID, @see enum TASK_TYPE)
* Bit [8-15]: instance index(single or multi-instantiated task)
*/
typedef uint16_t task_id_t;
/// Builds task identifier from 'task' and 'index'.
#define TASK_BUILD(task, index) ((uint16_t)(((index) << 8) | (task)))
/// Builds task identifier from 'type'(TASK_xxxx) and 'index'.
#define TASK_ID(type, index) ((uint16_t)(((index) << 8) | (TASK_ ## type)))
/// Retrieves task type from 'task_id'.
#define TASK_TYPE(task_id) ((task_id) & 0xFF)
/// Retrieves task index number from 'task_id'.
#define TASK_IDX(task_id) (((task_id) >> 8) & 0xFF)
/// Invalid task
#define TASK_INVALID (0xFFFF)
/**
* Message Identifier bit field
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
* | Msg Type(Task Base) | Msg Index(Offset) |
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
*
* Bit [0-7] : message index(no more than 255 messages per task)
* Bit [8-15]: message type (no more than 255 tasks support)
*/
typedef uint16_t msg_id_t;
/// Build message identifier from 'type_id' and 'index'.
#define MSG_BUILD(tid, index) ((uint16_t)((tid) << 8) | (index))
/// Build message identifier from 'type'(TID_xxxx) and 'index'.
#define MSG_ID(type, index) ((uint16_t)((TID_ ## type) << 8) | (index))
/// Retrieves message type from 'msg_id'.
#define MSG_TYPE(msg_id) (((uint16_t)msg_id) >> 8)
/// Retrieves message index from 'msg_id'.
#define MSG_IDX(msg_id) ((msg_id) & 0xFF)
/// Default Message(to handle several message type in same handler).
#define MSG_DEFAULT (0xFFFF)
/// Message to get Task State Pointer
#define MSG_TASK_STATE (0x0000)
/// Format of task dispatch function type
typedef void* (*task_func_t)(msg_id_t msgid, uint8_t task_idx);
/// Format of message handler function type
typedef int (*msg_func_t)(msg_id_t msgid, const void *param, \
task_id_t dest_id, task_id_t src_id);
/// Macro for message handler function definition
#define MSG_HANDLER(msg_name, param_struct) \
static int msg_name##_handler(msg_id_t msgid, param_struct const *param, \
task_id_t dest_id, task_id_t src_id)
/// Macro for message handlers table definition
#define MSG_HANDLER_TAB(task) const struct msg_handler task##_msg_handler_tab[] =
/// Status returned by Message Handler
enum msg_status
{
MSG_STATUS_FREE = 0, ///< consumed, msg and ext are freed by the kernel
MSG_STATUS_NO_FREE = 1, ///< consumed, nothing is freed by the kernel
MSG_STATUS_SAVED = 2, ///< not consumed, will be pushed in the saved queue
};
/// Status returned by task API functions
enum task_status
{
TASK_OK = 0,
TASK_FAIL = 1,
TASK_ERR_UNKNOWN = 2,
TASK_ERR_EXCEEDED = 3,
TASK_ERR_EXISTS = 4,
};
/// Element of a message handler table.
struct msg_handler
{
msg_id_t id; ///< Id of the handled message.
msg_func_t func; ///< Pointer to the handler function.
};
/// Message Element.
struct msg_elem
{
list_hdr_t hdr; ///< List header for chaining
msg_id_t msgid; ///< Message id.
task_id_t dest_id; ///< Destination kernel identifier.
task_id_t src_id; ///< Source kernel identifier.
uint16_t param_len; ///< Parameter embedded struct length.
uint32_t param[]; ///< Parameter embedded struct. Must be word-aligned.
};
/// Tasks types definition
enum task_type
{
/******** Low Layer Tasks ********/
// Link Layer Controller Task
TASK_LLC = 0x01,
// HCI Test & Debug Task
TASK_HCI = 0x02,
/******** App Layer Tasks ********/
// Application Main Task
TASK_APP = 0x03,
/******** Host Layer Tasks ********/
// L2CAP Controller Task
// - handles L2CAP attribute and security block.
TASK_L2CC = 0x04,
// Generic Attribute Profile Task
// - includes services and characteristic discovery, configuration exchanges
// - and attribute value access operations(reading, writing, notification and indication).
TASK_GATT = 0x05,
// Generic Access Profile Manager Task
// - manage all non connected stuff, configuring device mode(discoverable, connectable, etc.)
// - and perform required actions(scanning, connection, etc.)
// - and manage GAP Controller state according to corresponding BLE connection states.
TASK_GAPM = 0x06,
// Generic Access Profile Controller Task
// - perform GAP action related to a BLE connection(pairing, update parameters, disconnect, etc.)
// - GAP controller is multi-instantiated, one task instance per BLE connection.
TASK_GAPC = 0x07,
// Maximum number of tasks
TASK_MAX,
// MACRO of Invalid Task
TASK_NONE = 0xFF,
};
/// Type ID for identifying Group(Messages and Profiles)
enum type_id
{
/******** Low Layer Identifiers ********/
TID_LLC = 1, // LL Controller
TID_LLD = 2, // LL Driver
TID_HCI = 3, // HCI
/******** Host Layer Identifiers ********/
TID_L2CC = 4, // L2CAP Controller
TID_GATT = 5, // Generic Attribute Profile
TID_GAPM = 6, // Generic Access Profile Manager
TID_GAPC = 7, // Generic Access Profile Controller
/******** App Layer Identifiers ********/
TID_APP = 9, // Application Task
TID_MESH = 10, // Mesh Reserved 10~15
/******** PRF Layer Identifiers ********/
/* User customize */
/* End customize */
// MACRO of Invalid Identifier
TID_INVALID = 0xFF,
};
#endif //_TASK_H_