HID scanner demo
Dependencies: BLE_API WIFI_API_32kRAM nRF51822 mbed
BLE HID function in this demo is temporary working with Android phone ONLY. Will be fixed to support iOS device in next update.
Diff: HIDService.h
- Revision:
- 0:b0fc0661c081
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HIDService.h Thu Jul 02 01:35:08 2015 +0000
@@ -0,0 +1,124 @@
+#ifndef __BLE_HID_SERVICE_H__
+#define __BLE_HID_SERVICE_H__
+
+#include "BLE.h"
+/**
+* @class Human Interface Device Service
+* @brief BLE Human Interface Device Service. This service displays the Glucose measurement value represented as a 16bit Float format.<br>
+* @Author: Marco.Hsu
+* @Email: marco.missyou@gmail.com
+*/
+
+extern const uint8_t KeyboardReportMap[76];
+
+class HIDService {
+public:
+ HIDService(BLEDevice &_ble, const uint8_t* key = &KeyboardReportMap[0]):
+ ble(_ble),
+ protocol_modeValue(1), // Report Protocol Mode(1), Boot Protocol Mode(0)
+ KeyboardMap(key),
+ Protocol_Mode(GattCharacteristic::UUID_PROTOCOL_MODE_CHAR, &protocol_modeValue, 1, 1, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
+ ReportMap(GattCharacteristic::UUID_REPORT_MAP_CHAR, KeyboardMap.getPointer(), 76, sizeof(KeyboardMap), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
+ Report(GattCharacteristic::UUID_REPORT_CHAR, reportValue.getPointer(), 8, 8, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
+ HID_Information(GattCharacteristic::UUID_HID_INFORMATION_CHAR, hidInformation.getPointer(), 4, 4, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
+ HID_Control_Point(GattCharacteristic::UUID_HID_CONTROL_POINT_CHAR, &hidcontrolPointer, 1, 1, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE)
+ {
+ static bool serviceAdded = false; /* We should only ever need to add the heart rate service once. */
+ if (serviceAdded) {
+ return;
+ }
+ //Report.requireSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK);
+ GattCharacteristic *charTable[] = {&Protocol_Mode, &ReportMap, &Report, &HID_Information, &HID_Control_Point};
+ GattService HIDGattService(GattService::UUID_HUMAN_INTERFACE_DEVICE_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
+ ble.addService(HIDGattService);
+ serviceAdded = true;
+ ble.onDataWritten(this, &HIDService::onDataWritten);
+ }
+public:
+ void updateReport(uint8_t modifydata, uint8_t data) {
+ reportValue.updateReportValue(modifydata, data);
+ ble.updateCharacteristicValue(Report.getValueAttribute().getHandle(), reportValue.getPointer(), 8);
+ }
+
+ virtual void onDataWritten(const GattWriteCallbackParams *params) {
+ if (params->handle == HID_Control_Point.getValueAttribute().getHandle()) {
+ uint16_t bytesRead = params->len;
+ if (bytesRead == 1) {
+ memcpy(&hidcontrolPointer, params->data, bytesRead);
+ }
+ }
+ if (params->handle == Report.getValueAttribute().getHandle()) {
+ uint16_t bytesRead = params->len;
+ if (bytesRead <= 4) {
+ memcpy(&reportValue, params->data, bytesRead);
+ }
+ }
+ }
+
+private:
+ struct ReportMapStructure{
+ uint8_t KeyboardMap[76];
+ ReportMapStructure(const uint8_t* data): KeyboardMap() {
+ memcpy(&KeyboardMap[0], data, 76);
+ }
+ uint8_t *getPointer(void) {
+ return KeyboardMap;
+ }
+ };
+
+private:
+ struct ReportStructure {
+ // Initial setting report value
+ ReportStructure(): reportValue() {
+ uint8_t data= 0x00;
+ updateReportValue(data, data);
+ }
+
+ void updateReportValue(uint8_t modifyKey, uint8_t data){
+ memset(&reportValue[0], 0 ,8);
+ memcpy(&reportValue[0], &modifyKey, 1);
+ memcpy(&reportValue[2], &data, 1);
+ }
+
+ uint8_t *getPointer(void) {
+ return reportValue;
+ }
+
+ uint8_t reportValue[8];
+ };
+
+private:
+ struct HIDInforStructure{
+ uint16_t bcdHID;
+ uint8_t bCountryCode;
+ uint8_t Flags;
+
+ HIDInforStructure():bcdHID(0),bCountryCode(0),Flags(0){
+ memcpy(&hidInformation[0], &bcdHID, 2);
+ memcpy(&hidInformation[2], &bCountryCode, 1);
+ memcpy(&hidInformation[3], &Flags, 1);
+ }
+ uint8_t *getPointer(void) {
+ return hidInformation;
+ }
+
+ uint8_t hidInformation[4];
+ };
+
+private:
+ BLEDevice &ble;
+ uint8_t protocol_modeValue;
+ ReportStructure reportValue;
+ uint8_t hidcontrolPointer;
+ ReportMapStructure KeyboardMap;
+ HIDInforStructure hidInformation;
+ GattCharacteristic Protocol_Mode;
+ GattCharacteristic ReportMap;
+ GattCharacteristic Report;
+// ReadOnlyGattCharacteristic Boot_Keyboard_Input_Report;
+// ReadWriteGattCharacteristic Boot_Keyboard_Output_Report;
+// ReadOnlyGattCharacteristic Boot_Mouse_Input_Report;
+ GattCharacteristic HID_Information;
+ GattCharacteristic HID_Control_Point;
+};
+#endif /* #ifndef __BLE_GLUCOSE_SERVICE_H__*/
\ No newline at end of file