mirror of
https://github.com/h2zero/esp-nimble-cpp.git
synced 2024-11-22 13:10:55 +01:00
Add NimBLEHIDDevice class
This commit is contained in:
parent
22103af037
commit
8e7fcafa9e
3 changed files with 319 additions and 1 deletions
|
@ -37,7 +37,7 @@ NimBLE2904::NimBLE2904(NimBLECharacteristic* pCharacterisitic)
|
||||||
m_data.m_unit = 0;
|
m_data.m_unit = 0;
|
||||||
m_data.m_description = 0;
|
m_data.m_description = 0;
|
||||||
setValue((uint8_t*) &m_data, sizeof(m_data));
|
setValue((uint8_t*) &m_data, sizeof(m_data));
|
||||||
} // BLE2902
|
} // BLE2904
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
233
src/NimBLEHIDDevice.cpp
Normal file
233
src/NimBLEHIDDevice.cpp
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
/*
|
||||||
|
* NimBLEHIDDevice.cpp
|
||||||
|
*
|
||||||
|
* Created: on Oct 06 2020
|
||||||
|
* Author wakwak-koba
|
||||||
|
*
|
||||||
|
* Originally:
|
||||||
|
*
|
||||||
|
* BLEHIDDevice.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jan 03, 2018
|
||||||
|
* Author: chegewara
|
||||||
|
*/
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#if defined(CONFIG_BT_ENABLED)
|
||||||
|
|
||||||
|
#include "nimconfig.h"
|
||||||
|
#if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
|
||||||
|
|
||||||
|
#include "NimBLEHIDDevice.h"
|
||||||
|
#include "NimBLE2904.h"
|
||||||
|
|
||||||
|
NimBLEHIDDevice::NimBLEHIDDevice(NimBLEServer* server) {
|
||||||
|
/*
|
||||||
|
* Here we create mandatory services described in bluetooth specification
|
||||||
|
*/
|
||||||
|
m_deviceInfoService = server->createService(NimBLEUUID((uint16_t) 0x180a));
|
||||||
|
m_hidService = server->createService(NimBLEUUID((uint16_t) 0x1812), 40);
|
||||||
|
m_batteryService = server->createService(NimBLEUUID((uint16_t) 0x180f));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mandatory characteristic for device info service
|
||||||
|
*/
|
||||||
|
m_pnpCharacteristic = m_deviceInfoService->createCharacteristic((uint16_t) 0x2a50, NIMBLE_PROPERTY::READ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mandatory characteristics for HID service
|
||||||
|
*/
|
||||||
|
m_hidInfoCharacteristic = m_hidService->createCharacteristic((uint16_t) 0x2a4a, NIMBLE_PROPERTY::READ);
|
||||||
|
m_reportMapCharacteristic = m_hidService->createCharacteristic((uint16_t) 0x2a4b, NIMBLE_PROPERTY::READ);
|
||||||
|
m_hidControlCharacteristic = m_hidService->createCharacteristic((uint16_t) 0x2a4c, NIMBLE_PROPERTY::WRITE_NR);
|
||||||
|
m_protocolModeCharacteristic = m_hidService->createCharacteristic((uint16_t) 0x2a4e, NIMBLE_PROPERTY::WRITE_NR | NIMBLE_PROPERTY::READ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mandatory battery level characteristic with notification and presence descriptor
|
||||||
|
*/
|
||||||
|
m_batteryLevelCharacteristic = m_batteryService->createCharacteristic((uint16_t) 0x2a19, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
|
||||||
|
NimBLE2904* batteryLevelDescriptor = (NimBLE2904*)m_batteryLevelCharacteristic->createDescriptor((uint16_t) 0x2904);
|
||||||
|
batteryLevelDescriptor->setFormat(NimBLE2904::FORMAT_UINT8);
|
||||||
|
batteryLevelDescriptor->setNamespace(1);
|
||||||
|
batteryLevelDescriptor->setUnit(0x27ad);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This value is setup here because its default value in most usage cases, its very rare to use boot mode
|
||||||
|
* and we want to simplify library using as much as possible
|
||||||
|
*/
|
||||||
|
const uint8_t pMode[] = { 0x01 };
|
||||||
|
protocolMode()->setValue((uint8_t*) pMode, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
NimBLEHIDDevice::~NimBLEHIDDevice() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
void NimBLEHIDDevice::reportMap(uint8_t* map, uint16_t size) {
|
||||||
|
m_reportMapCharacteristic->setValue(map, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief This function suppose to be called at the end, when we have created all characteristics we need to build HID service
|
||||||
|
*/
|
||||||
|
void NimBLEHIDDevice::startServices() {
|
||||||
|
m_deviceInfoService->start();
|
||||||
|
m_hidService->start();
|
||||||
|
m_batteryService->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Create manufacturer characteristic (this characteristic is optional)
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::manufacturer() {
|
||||||
|
m_manufacturerCharacteristic = m_deviceInfoService->createCharacteristic((uint16_t) 0x2a29, NIMBLE_PROPERTY::READ);
|
||||||
|
return m_manufacturerCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Set manufacturer name
|
||||||
|
* @param [in] name manufacturer name
|
||||||
|
*/
|
||||||
|
void NimBLEHIDDevice::manufacturer(std::string name) {
|
||||||
|
m_manufacturerCharacteristic->setValue(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
void NimBLEHIDDevice::pnp(uint8_t sig, uint16_t vid, uint16_t pid, uint16_t version) {
|
||||||
|
uint8_t pnp[] = { sig, (uint8_t) (vid >> 8), (uint8_t) vid, (uint8_t) (pid >> 8), (uint8_t) pid, (uint8_t) (version >> 8), (uint8_t) version };
|
||||||
|
m_pnpCharacteristic->setValue(pnp, sizeof(pnp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
void NimBLEHIDDevice::hidInfo(uint8_t country, uint8_t flags) {
|
||||||
|
uint8_t info[] = { 0x11, 0x1, country, flags };
|
||||||
|
m_hidInfoCharacteristic->setValue(info, sizeof(info));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Create input report characteristic that need to be saved as new characteristic object so can be further used
|
||||||
|
* @param [in] reportID input report ID, the same as in report map for input object related to created characteristic
|
||||||
|
* @return pointer to new input report characteristic
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::inputReport(uint8_t reportID) {
|
||||||
|
NimBLECharacteristic* inputReportCharacteristic = m_hidService->createCharacteristic((uint16_t) 0x2a4d, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
|
||||||
|
NimBLEDescriptor* inputReportDescriptor = inputReportCharacteristic->createDescriptor((uint16_t) 0x2908);
|
||||||
|
|
||||||
|
uint8_t desc1_val[] = { reportID, 0x01 };
|
||||||
|
inputReportDescriptor->setValue((uint8_t*) desc1_val, 2);
|
||||||
|
|
||||||
|
return inputReportCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Create output report characteristic that need to be saved as new characteristic object so can be further used
|
||||||
|
* @param [in] reportID Output report ID, the same as in report map for output object related to created characteristic
|
||||||
|
* @return Pointer to new output report characteristic
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::outputReport(uint8_t reportID) {
|
||||||
|
NimBLECharacteristic* outputReportCharacteristic = m_hidService->createCharacteristic((uint16_t) 0x2a4d, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR | NIMBLE_PROPERTY::READ_ENC | NIMBLE_PROPERTY::WRITE_ENC);
|
||||||
|
NimBLEDescriptor* outputReportDescriptor = outputReportCharacteristic->createDescriptor((uint16_t) 0x2908);
|
||||||
|
|
||||||
|
uint8_t desc1_val[] = { reportID, 0x02 };
|
||||||
|
outputReportDescriptor->setValue((uint8_t*) desc1_val, 2);
|
||||||
|
|
||||||
|
return outputReportCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Create feature report characteristic that need to be saved as new characteristic object so can be further used
|
||||||
|
* @param [in] reportID Feature report ID, the same as in report map for feature object related to created characteristic
|
||||||
|
* @return Pointer to new feature report characteristic
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::featureReport(uint8_t reportID) {
|
||||||
|
NimBLECharacteristic* featureReportCharacteristic = m_hidService->createCharacteristic((uint16_t) 0x2a4d, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::READ_ENC | NIMBLE_PROPERTY::WRITE_ENC);
|
||||||
|
NimBLEDescriptor* featureReportDescriptor = featureReportCharacteristic->createDescriptor((uint16_t) 0x2908);
|
||||||
|
|
||||||
|
uint8_t desc1_val[] = { reportID, 0x03 };
|
||||||
|
featureReportDescriptor->setValue((uint8_t*) desc1_val, 2);
|
||||||
|
|
||||||
|
return featureReportCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::bootInput() {
|
||||||
|
return m_hidService->createCharacteristic((uint16_t) 0x2a22, NIMBLE_PROPERTY::NOTIFY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::bootOutput() {
|
||||||
|
return m_hidService->createCharacteristic((uint16_t) 0x2a32, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::hidControl() {
|
||||||
|
return m_hidControlCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
NimBLECharacteristic* NimBLEHIDDevice::protocolMode() {
|
||||||
|
return m_protocolModeCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NimBLEHIDDevice::setBatteryLevel(uint8_t level) {
|
||||||
|
m_batteryLevelCharacteristic->setValue(&level, 1);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* @brief Returns battery level characteristic
|
||||||
|
* @ return battery level characteristic
|
||||||
|
*//*
|
||||||
|
BLECharacteristic* BLEHIDDevice::batteryLevel() {
|
||||||
|
return m_batteryLevelCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BLECharacteristic* BLEHIDDevice::reportMap() {
|
||||||
|
return m_reportMapCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLECharacteristic* BLEHIDDevice::pnp() {
|
||||||
|
return m_pnpCharacteristic;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BLECharacteristic* BLEHIDDevice::hidInfo() {
|
||||||
|
return m_hidInfoCharacteristic;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
NimBLEService* NimBLEHIDDevice::deviceInfo() {
|
||||||
|
return m_deviceInfoService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
NimBLEService* NimBLEHIDDevice::hidService() {
|
||||||
|
return m_hidService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief
|
||||||
|
*/
|
||||||
|
NimBLEService* NimBLEHIDDevice::batteryService() {
|
||||||
|
return m_batteryService;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #if defined(CONFIG_BT_NIMBLE_ROLE_PERIPHERAL)
|
||||||
|
#endif // #if defined(CONFIG_BT_ENABLED)
|
85
src/NimBLEHIDDevice.h
Normal file
85
src/NimBLEHIDDevice.h
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* NimBLEHIDDevice.h
|
||||||
|
*
|
||||||
|
* Created: on Oct 06 2020
|
||||||
|
* Author wakwak-koba
|
||||||
|
*
|
||||||
|
* Originally:
|
||||||
|
*
|
||||||
|
* BLEHIDDevice.h
|
||||||
|
*
|
||||||
|
* Created on: Jan 03, 2018
|
||||||
|
* Author: chegewara
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BLEHIDDEVICE_H_
|
||||||
|
#define _BLEHIDDEVICE_H_
|
||||||
|
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#if defined(CONFIG_BT_ENABLED)
|
||||||
|
|
||||||
|
#include "nimconfig.h"
|
||||||
|
#if defined(CONFIG_BT_NIMBLE_ROLE_BROADCASTER)
|
||||||
|
|
||||||
|
#include "NimBLECharacteristic.h"
|
||||||
|
#include "NimBLEService.h"
|
||||||
|
#include "NimBLEDescriptor.h"
|
||||||
|
#include "HIDTypes.h"
|
||||||
|
|
||||||
|
#define GENERIC_HID 0x03C0
|
||||||
|
#define HID_KEYBOARD 0x03C1
|
||||||
|
#define HID_MOUSE 0x03C2
|
||||||
|
#define HID_JOYSTICK 0x03C3
|
||||||
|
#define HID_GAMEPAD 0x03C4
|
||||||
|
#define HID_TABLET 0x03C5
|
||||||
|
#define HID_CARD_READER 0x03C6
|
||||||
|
#define HID_DIGITAL_PEN 0x03C7
|
||||||
|
#define HID_BARCODE 0x03C8
|
||||||
|
|
||||||
|
class NimBLEHIDDevice {
|
||||||
|
public:
|
||||||
|
NimBLEHIDDevice(NimBLEServer*);
|
||||||
|
virtual ~NimBLEHIDDevice();
|
||||||
|
|
||||||
|
void reportMap(uint8_t* map, uint16_t);
|
||||||
|
void startServices();
|
||||||
|
|
||||||
|
NimBLEService* deviceInfo();
|
||||||
|
NimBLEService* hidService();
|
||||||
|
NimBLEService* batteryService();
|
||||||
|
|
||||||
|
NimBLECharacteristic* manufacturer();
|
||||||
|
void manufacturer(std::string name);
|
||||||
|
//NimBLECharacteristic* pnp();
|
||||||
|
void pnp(uint8_t sig, uint16_t vid, uint16_t pid, uint16_t version);
|
||||||
|
//NimBLECharacteristic* hidInfo();
|
||||||
|
void hidInfo(uint8_t country, uint8_t flags);
|
||||||
|
//NimBLECharacteristic* batteryLevel();
|
||||||
|
void setBatteryLevel(uint8_t level);
|
||||||
|
|
||||||
|
|
||||||
|
//NimBLECharacteristic* reportMap();
|
||||||
|
NimBLECharacteristic* hidControl();
|
||||||
|
NimBLECharacteristic* inputReport(uint8_t reportID);
|
||||||
|
NimBLECharacteristic* outputReport(uint8_t reportID);
|
||||||
|
NimBLECharacteristic* featureReport(uint8_t reportID);
|
||||||
|
NimBLECharacteristic* protocolMode();
|
||||||
|
NimBLECharacteristic* bootInput();
|
||||||
|
NimBLECharacteristic* bootOutput();
|
||||||
|
|
||||||
|
private:
|
||||||
|
NimBLEService* m_deviceInfoService; //0x180a
|
||||||
|
NimBLEService* m_hidService; //0x1812
|
||||||
|
NimBLEService* m_batteryService = 0; //0x180f
|
||||||
|
|
||||||
|
NimBLECharacteristic* m_manufacturerCharacteristic; //0x2a29
|
||||||
|
NimBLECharacteristic* m_pnpCharacteristic; //0x2a50
|
||||||
|
NimBLECharacteristic* m_hidInfoCharacteristic; //0x2a4a
|
||||||
|
NimBLECharacteristic* m_reportMapCharacteristic; //0x2a4b
|
||||||
|
NimBLECharacteristic* m_hidControlCharacteristic; //0x2a4c
|
||||||
|
NimBLECharacteristic* m_protocolModeCharacteristic; //0x2a4e
|
||||||
|
NimBLECharacteristic* m_batteryLevelCharacteristic; //0x2a19
|
||||||
|
};
|
||||||
|
#endif // CONFIG_BT_NIMBLE_ROLE_BROADCASTER
|
||||||
|
#endif // CONFIG_BT_ENABLED
|
||||||
|
#endif /* _BLEHIDDEVICE_H_ */
|
Loading…
Reference in a new issue