a59eafbc9d
* fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * Initial add of @stickbreaker i2c * Add log_n * fix warnings when log is off * i2c code clean up and reorganization * add flags to interrupt allocator * fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * fix errors with latest IDF * fix debug optimization (#1365) incorrect optimization for debugging tick markers. * Fix some missing BT header * Change BTSerial log calls * Update BLE lib * Arduino-ESP32 release management scripted (#1515) * Calculate an absolute path for a custom partitions table (#1452) * * Arduino-ESP32 release management scripted (ready-to-merge) * * secure env for espressif/arduino-esp32 * * build tests enabled * gitter webhook enabled * * gitter room link fixed * better comment * * filepaths fixed * BT Serial adjustments * * don't run sketch builds & tests for tagged builds * Return false from WiFi.hostByName() if hostname is not resolved * Free BT Memory when BT is not used * WIFI_MODE_NULL is not supported anymore * Select some key examples to build with PlatformIO to save some time * Update BLE lib * Fixed BLE lib * Major WiFi overhaul - auto reconnect on connection loss now works - moved to event groups - some code clean up and procedure optimizations - new methods to get a more elaborate system ststus * Add cmake tests to travis * Add initial AsyncUDP * Add NetBIOS lib and fix CMake includes * Add Initial WebServer * Fix WebServer and examples * travis not quiting on build fail * Try different travis build * Update IDF to aaf1239 * Fix WPS Example * fix script permission and add some fail tests to sketch builder * Add missing space in WiFiClient::write(Stream &stream)
266 lines
7.6 KiB
C
266 lines
7.6 KiB
C
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
|
//
|
|
// 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 "prf_defs.h"
|
|
|
|
#if (HIDD_LE_PROFILE_CFG)
|
|
#include "bta_gatts_int.h"
|
|
#include "stack/bt_types.h"
|
|
#include "bta/bta_api.h"
|
|
#include "stack/gatt_api.h"
|
|
#include "bt_app_api.h"
|
|
|
|
/// Maximal number of HIDS that can be added in the DB
|
|
#ifndef USE_ONE_HIDS_INSTANCE
|
|
#define HIDD_LE_NB_HIDS_INST_MAX (2)
|
|
#else
|
|
#define HIDD_LE_NB_HIDS_INST_MAX (1)
|
|
#endif
|
|
|
|
// Number of HID reports defined in the service
|
|
#define HID_NUM_REPORTS 9
|
|
|
|
|
|
#define ATT_SVC_HID 0x1812
|
|
|
|
/// Maximal number of Report Char. that can be added in the DB for one HIDS - Up to 11
|
|
#define HIDD_LE_NB_REPORT_INST_MAX (5)
|
|
|
|
/// Maximal length of Report Char. Value
|
|
#define HIDD_LE_REPORT_MAX_LEN (45)
|
|
/// Maximal length of Report Map Char. Value
|
|
#define HIDD_LE_REPORT_MAP_MAX_LEN (512)
|
|
|
|
/// Length of Boot Report Char. Value Maximal Length
|
|
#define HIDD_LE_BOOT_REPORT_MAX_LEN (8)
|
|
|
|
/// Boot KB Input Report Notification Configuration Bit Mask
|
|
#define HIDD_LE_BOOT_KB_IN_NTF_CFG_MASK (0x40)
|
|
/// Boot KB Input Report Notification Configuration Bit Mask
|
|
#define HIDD_LE_BOOT_MOUSE_IN_NTF_CFG_MASK (0x80)
|
|
/// Boot Report Notification Configuration Bit Mask
|
|
#define HIDD_LE_REPORT_NTF_CFG_MASK (0x20)
|
|
|
|
|
|
/* HID information flags */
|
|
#define HID_FLAGS_REMOTE_WAKE 0x01 // RemoteWake
|
|
#define HID_FLAGS_NORMALLY_CONNECTABLE 0x02 // NormallyConnectable
|
|
|
|
/* Control point commands */
|
|
#define HID_CMD_SUSPEND 0x00 // Suspend
|
|
#define HID_CMD_EXIT_SUSPEND 0x01 // Exit Suspend
|
|
|
|
/* HID protocol mode values */
|
|
#define HID_PROTOCOL_MODE_BOOT 0x00 // Boot Protocol Mode
|
|
#define HID_PROTOCOL_MODE_REPORT 0x01 // Report Protocol Mode
|
|
|
|
/* Attribute value lengths */
|
|
#define HID_PROTOCOL_MODE_LEN 1 // HID Protocol Mode
|
|
#define HID_INFORMATION_LEN 4 // HID Information
|
|
#define HID_REPORT_REF_LEN 2 // HID Report Reference Descriptor
|
|
#define HID_EXT_REPORT_REF_LEN 2 // External Report Reference Descriptor
|
|
|
|
// HID feature flags
|
|
#define HID_KBD_FLAGS HID_FLAGS_REMOTE_WAKE
|
|
|
|
|
|
/// HID Service Attributes Indexes
|
|
enum {
|
|
HIDD_LE_IDX_SVC,
|
|
|
|
// Included Service
|
|
HIDD_LE_IDX_INCL_SVC,
|
|
|
|
// HID Information
|
|
HIDD_LE_IDX_HID_INFO_CHAR,
|
|
HIDD_LE_IDX_HID_INFO_VAL,
|
|
|
|
// HID Control Point
|
|
HIDD_LE_IDX_HID_CTNL_PT_CHAR,
|
|
HIDD_LE_IDX_HID_CTNL_PT_VAL,
|
|
|
|
// Report Map
|
|
HIDD_LE_IDX_REPORT_MAP_CHAR,
|
|
HIDD_LE_IDX_REPORT_MAP_VAL,
|
|
HIDD_LE_IDX_REPORT_MAP_EXT_REP_REF,
|
|
|
|
// Protocol Mode
|
|
HIDD_LE_IDX_PROTO_MODE_CHAR,
|
|
HIDD_LE_IDX_PROTO_MODE_VAL,
|
|
|
|
// Boot Keyboard Input Report
|
|
HIDD_LE_IDX_BOOT_KB_IN_REPORT_CHAR,
|
|
HIDD_LE_IDX_BOOT_KB_IN_REPORT_VAL,
|
|
HIDD_LE_IDX_BOOT_KB_IN_REPORT_NTF_CFG,
|
|
|
|
// Boot Keyboard Output Report
|
|
HIDD_LE_IDX_BOOT_KB_OUT_REPORT_CHAR,
|
|
HIDD_LE_IDX_BOOT_KB_OUT_REPORT_VAL,
|
|
|
|
// Boot Mouse Input Report
|
|
HIDD_LE_IDX_BOOT_MOUSE_IN_REPORT_CHAR,
|
|
HIDD_LE_IDX_BOOT_MOUSE_IN_REPORT_VAL,
|
|
HIDD_LE_IDX_BOOT_MOUSE_IN_REPORT_NTF_CFG,
|
|
|
|
// Report
|
|
HIDD_LE_IDX_REPORT_CHAR,
|
|
HIDD_LE_IDX_REPORT_VAL,
|
|
HIDD_LE_IDX_REPORT_REP_REF,
|
|
HIDD_LE_IDX_REPORT_NTF_CFG,
|
|
|
|
HIDD_LE_IDX_NB,
|
|
};
|
|
|
|
|
|
/// Attribute Table Indexes
|
|
enum {
|
|
HIDD_LE_INFO_CHAR,
|
|
HIDD_LE_CTNL_PT_CHAR,
|
|
HIDD_LE_REPORT_MAP_CHAR,
|
|
HIDD_LE_REPORT_CHAR,
|
|
HIDD_LE_PROTO_MODE_CHAR,
|
|
HIDD_LE_BOOT_KB_IN_REPORT_CHAR,
|
|
HIDD_LE_BOOT_KB_OUT_REPORT_CHAR,
|
|
HIDD_LE_BOOT_MOUSE_IN_REPORT_CHAR,
|
|
HIDD_LE_CHAR_MAX //= HIDD_LE_REPORT_CHAR + HIDD_LE_NB_REPORT_INST_MAX,
|
|
};
|
|
|
|
///att read event table Indexs
|
|
enum {
|
|
HIDD_LE_READ_INFO_EVT,
|
|
HIDD_LE_READ_CTNL_PT_EVT,
|
|
HIDD_LE_READ_REPORT_MAP_EVT,
|
|
HIDD_LE_READ_REPORT_EVT,
|
|
HIDD_LE_READ_PROTO_MODE_EVT,
|
|
HIDD_LE_BOOT_KB_IN_REPORT_EVT,
|
|
HIDD_LE_BOOT_KB_OUT_REPORT_EVT,
|
|
HIDD_LE_BOOT_MOUSE_IN_REPORT_EVT,
|
|
|
|
HID_LE_EVT_MAX
|
|
};
|
|
|
|
/// Client Characteristic Configuration Codes
|
|
enum {
|
|
HIDD_LE_DESC_MASK = 0x10,
|
|
|
|
HIDD_LE_BOOT_KB_IN_REPORT_CFG = HIDD_LE_BOOT_KB_IN_REPORT_CHAR | HIDD_LE_DESC_MASK,
|
|
HIDD_LE_BOOT_MOUSE_IN_REPORT_CFG = HIDD_LE_BOOT_MOUSE_IN_REPORT_CHAR | HIDD_LE_DESC_MASK,
|
|
HIDD_LE_REPORT_CFG = HIDD_LE_REPORT_CHAR | HIDD_LE_DESC_MASK,
|
|
};
|
|
|
|
/// Features Flag Values
|
|
enum {
|
|
HIDD_LE_CFG_KEYBOARD = 0x01,
|
|
HIDD_LE_CFG_MOUSE = 0x02,
|
|
HIDD_LE_CFG_PROTO_MODE = 0x04,
|
|
HIDD_LE_CFG_MAP_EXT_REF = 0x08,
|
|
HIDD_LE_CFG_BOOT_KB_WR = 0x10,
|
|
HIDD_LE_CFG_BOOT_MOUSE_WR = 0x20,
|
|
};
|
|
|
|
/// Report Char. Configuration Flag Values
|
|
enum {
|
|
HIDD_LE_CFG_REPORT_IN = 0x01,
|
|
HIDD_LE_CFG_REPORT_OUT = 0x02,
|
|
//HOGPD_CFG_REPORT_FEAT can be used as a mask to check Report type
|
|
HIDD_LE_CFG_REPORT_FEAT = 0x03,
|
|
HIDD_LE_CFG_REPORT_WR = 0x10,
|
|
};
|
|
|
|
/// Pointer to the connection clean-up function
|
|
#define HIDD_LE_CLEANUP_FNCT (NULL)
|
|
|
|
/*
|
|
* TYPE DEFINITIONS
|
|
****************************************************************************************
|
|
*/
|
|
|
|
/// HIDD Features structure
|
|
typedef struct {
|
|
/// Service Features
|
|
uint8_t svc_features;
|
|
/// Number of Report Char. instances to add in the database
|
|
uint8_t report_nb;
|
|
/// Report Char. Configuration
|
|
uint8_t report_char_cfg[HIDD_LE_NB_REPORT_INST_MAX];
|
|
} hidd_feature_t;
|
|
|
|
|
|
typedef struct {
|
|
BOOLEAN in_use;
|
|
BOOLEAN congest;
|
|
uint16_t conn_id;
|
|
BOOLEAN connected;
|
|
BD_ADDR remote_bda;
|
|
uint32_t trans_id;
|
|
uint8_t cur_srvc_id;
|
|
|
|
} hidd_clcb_t;
|
|
|
|
// HID report mapping table
|
|
typedef struct {
|
|
uint16_t handle; // Handle of report characteristic
|
|
uint16_t cccdHandle; // Handle of CCCD for report characteristic
|
|
uint8_t id; // Report ID
|
|
uint8_t type; // Report type
|
|
uint8_t mode; // Protocol mode (report or boot)
|
|
} hidRptMap_t;
|
|
|
|
|
|
typedef struct {
|
|
/// hidd profile id
|
|
uint8_t app_id;
|
|
/// Notified handle
|
|
uint16_t ntf_handle;
|
|
///Attribute handle Table
|
|
uint16_t att_tbl[HIDD_LE_CHAR_MAX];
|
|
/// Supported Features
|
|
hidd_feature_t hidd_feature[HIDD_LE_NB_HIDS_INST_MAX];
|
|
/// Current Protocol Mode
|
|
uint8_t proto_mode[HIDD_LE_NB_HIDS_INST_MAX];
|
|
/// Number of HIDS added in the database
|
|
uint8_t hids_nb;
|
|
uint8_t pending_evt;
|
|
uint16_t pending_hal;
|
|
} hidd_inst_t;
|
|
|
|
|
|
/* service engine control block */
|
|
typedef struct {
|
|
hidd_clcb_t hidd_clcb; /* connection link*/
|
|
esp_gatt_if_t gatt_if;
|
|
BOOLEAN enabled;
|
|
BOOLEAN is_primery;
|
|
hidd_inst_t hidd_inst;
|
|
uint8_t inst_id;
|
|
} hidd_le_env_t;
|
|
|
|
extern hidd_le_env_t hidd_le_env;
|
|
|
|
|
|
void hidd_le_create_service(BOOLEAN is_primary);
|
|
|
|
void hidd_rsp (uint32_t trans_id, uint16_t conn_id, uint8_t app_id,
|
|
esp_gatt_status_t status, uint8_t event, tGATTS_DATA *p_rsp);
|
|
|
|
void hidd_read_attr_value(tGATTS_DATA *p_data, uint32_t trans_id);
|
|
|
|
|
|
tGATT_STATUS hidd_le_init (void);
|
|
|
|
|
|
#endif ///HIDD_LE_PROFILE_CFG
|
|
|
|
|