HID-over-GATT implementation with the BLE API. This library allows to create devices such as mouse, keyboard or joystick, over Bluetooth Low Energy.
Dependents: Seeed_Tiny_BLE_FTHR_Peripheral
Fork of BLE_HID by
HIDServiceBase.h
- Committer:
- Jean-Philippe Brucker
- Date:
- 2015-10-07
- Revision:
- 1:7a6c2e2c9371
- Parent:
- 0:cfd70fa91663
- Child:
- 3:4f8429a1905b
File content as of revision 1:7a6c2e2c9371:
/* mbed Microcontroller Library * Copyright (c) 2015 ARM Limited * * 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. */ #ifndef HID_SERVICE_BASE_H_ #define HID_SERVICE_BASE_H_ #include "mbed.h" #include "ble/BLE.h" #include "HID_types.h" #define BLE_UUID_DESCRIPTOR_REPORT_REFERENCE 0x2908 typedef const uint8_t report_map_t[]; typedef const uint8_t * report_t; typedef struct { uint16_t bcdHID; uint8_t bCountryCode; uint8_t flags; } HID_information_t; enum ReportType { INPUT_REPORT = 0x1, OUTPUT_REPORT = 0x2, FEATURE_REPORT = 0x3, }; enum ProtocolMode { BOOT_PROTOCOL = 0x0, REPORT_PROTOCOL = 0x1, }; typedef struct { uint8_t ID; uint8_t type; } report_reference_t; class HIDServiceBase { public: /** * Constructor * * @param _ble * BLE object to add this service to * @param reportMap * Byte array representing the input/output report formats. In USB HID jargon, it * is called "HID report descriptor". * @param reportMapLength * Size of the reportMap array * @param outputReportLength * Maximum length of a sent report (up to 64 bytes) (default: 64 bytes) * @param inputReportLength * Maximum length of a received report (up to 64 bytes) (default: 64 bytes) * @param inputReportTickerDelay * Delay between input report notifications, in ms. Acceptable values depend directly on * GAP's connInterval parameter, so it shouldn't be less than 12ms * Preferred GAP connection interval is set after this value, in order to send * notifications as quick as possible: minimum connection interval will be set to * (inputReportTickerDelay / 2) */ HIDServiceBase(BLE &_ble, report_map_t reportMap, uint8_t reportMapLength, report_t inputReport, report_t outputReport, report_t featureReport, uint8_t inputReportLength = 0, uint8_t outputReportLength = 0, uint8_t featureReportLength = 0, uint8_t inputReportTickerDelay = 50); /** * Send Report * * @param report Report to send. Must be of size @ref inputReportLength * @return The write status * * @note Don't call send() directly for multiple reports! Use reportTicker for that, in order * to avoid overloading the BLE stack, and let it handle events between each report. */ virtual ble_error_t send(const report_t report); /** * Read Report * * @param report Report to fill. Must be of size @ref outputReportLength * @return The read status */ virtual ble_error_t read(report_t report); virtual void onConnection(const Gap::ConnectionCallbackParams_t *params); virtual void onDisconnection(const Gap::DisconnectionCallbackParams_t *params); virtual bool isConnected(void) { return connected; } protected: /** * Called by BLE API when data has been successfully sent. * * @param count Number of reports sent * * @note Subclasses can override this to avoid starting the report ticker when there is nothing * to send */ virtual void onDataSent(unsigned count); /** * Start the ticker that sends input reports at regular interval * * @note reportTickerIsActive describes the state of the ticker and can be used by HIDS * implementations. */ virtual void startReportTicker(void); /** * Stop the input report ticker */ virtual void stopReportTicker(void); /** * Called by input report ticker at regular interval (reportTickerDelay). This must be * overriden by HIDS implementations to call the @ref send() with a report, if necessary. */ virtual void sendCallback(void) = 0; /** * Create the Gatt descriptor for a report characteristic */ GattAttribute** inputReportDescriptors(); GattAttribute** outputReportDescriptors(); GattAttribute** featureReportDescriptors(); /** * Create the HID information structure */ HID_information_t* HIDInformation(); protected: BLE &ble; bool connected; int reportMapLength; report_t inputReport; report_t outputReport; report_t featureReport; uint8_t inputReportLength; uint8_t outputReportLength; uint8_t featureReportLength; uint8_t controlPointCommand; uint8_t protocolMode; report_reference_t inputReportReferenceData; report_reference_t outputReportReferenceData; report_reference_t featureReportReferenceData; GattAttribute inputReportReferenceDescriptor; GattAttribute outputReportReferenceDescriptor; GattAttribute featureReportReferenceDescriptor; // Optional gatt characteristics: GattCharacteristic protocolModeCharacteristic; // Report characteristics (each sort of optional) GattCharacteristic inputReportCharacteristic; GattCharacteristic outputReportCharacteristic; GattCharacteristic featureReportCharacteristic; // Required gatt characteristics: Report Map, Information, Control Point GattCharacteristic reportMapCharacteristic; ReadOnlyGattCharacteristic<HID_information_t> HIDInformationCharacteristic; GattCharacteristic HIDControlPointCharacteristic; Ticker reportTicker; uint32_t reportTickerDelay; bool reportTickerIsActive; }; #endif /* !HID_SERVICE_BASE_H_ */