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.
main.cpp@0:b0fc0661c081, 2015-07-02 (annotated)
- Committer:
- Marcomissyou
- Date:
- Thu Jul 02 01:35:08 2015 +0000
- Revision:
- 0:b0fc0661c081
- Child:
- 1:51535675abf4
HID Keyboard with Bluetooth 4.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Marcomissyou | 0:b0fc0661c081 | 1 | #include "mbed.h" |
Marcomissyou | 0:b0fc0661c081 | 2 | #include "BLE.h" |
Marcomissyou | 0:b0fc0661c081 | 3 | #include "BatteryService.h" |
Marcomissyou | 0:b0fc0661c081 | 4 | #include "DeviceInformationService.h" |
Marcomissyou | 0:b0fc0661c081 | 5 | #include "HIDService.h" |
Marcomissyou | 0:b0fc0661c081 | 6 | |
Marcomissyou | 0:b0fc0661c081 | 7 | BLEDevice ble; |
Marcomissyou | 0:b0fc0661c081 | 8 | DigitalOut led01(LED1); |
Marcomissyou | 0:b0fc0661c081 | 9 | Serial uart(p25,p23); |
Marcomissyou | 0:b0fc0661c081 | 10 | |
Marcomissyou | 0:b0fc0661c081 | 11 | unsigned char keyData; |
Marcomissyou | 0:b0fc0661c081 | 12 | bool is_input = false; |
Marcomissyou | 0:b0fc0661c081 | 13 | static const char DEVICE_NAME[] = "HID_Keyboard"; |
Marcomissyou | 0:b0fc0661c081 | 14 | static const uint16_t uuid16_list[] = {GattService::UUID_HUMAN_INTERFACE_DEVICE_SERVICE}; |
Marcomissyou | 0:b0fc0661c081 | 15 | static volatile bool triggerSensorPolling = false; |
Marcomissyou | 0:b0fc0661c081 | 16 | |
Marcomissyou | 0:b0fc0661c081 | 17 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
Marcomissyou | 0:b0fc0661c081 | 18 | { |
Marcomissyou | 0:b0fc0661c081 | 19 | ble.startAdvertising(); // restart advertising |
Marcomissyou | 0:b0fc0661c081 | 20 | } |
Marcomissyou | 0:b0fc0661c081 | 21 | |
Marcomissyou | 0:b0fc0661c081 | 22 | |
Marcomissyou | 0:b0fc0661c081 | 23 | static uint8_t key_press_scan_buff[30]; |
Marcomissyou | 0:b0fc0661c081 | 24 | static uint8_t modifyKey[30]; |
Marcomissyou | 0:b0fc0661c081 | 25 | int main(void) |
Marcomissyou | 0:b0fc0661c081 | 26 | { uart.baud(9600); |
Marcomissyou | 0:b0fc0661c081 | 27 | uart.printf("Starting HID Service\n"); |
Marcomissyou | 0:b0fc0661c081 | 28 | //uart.attach(&uart_rx); |
Marcomissyou | 0:b0fc0661c081 | 29 | led01 = 1; |
Marcomissyou | 0:b0fc0661c081 | 30 | ble.init(); |
Marcomissyou | 0:b0fc0661c081 | 31 | bool enableBonding = false; |
Marcomissyou | 0:b0fc0661c081 | 32 | bool requireMITM = false; |
Marcomissyou | 0:b0fc0661c081 | 33 | ble.initializeSecurity(enableBonding, requireMITM); |
Marcomissyou | 0:b0fc0661c081 | 34 | ble.onDisconnection(disconnectionCallback); |
Marcomissyou | 0:b0fc0661c081 | 35 | |
Marcomissyou | 0:b0fc0661c081 | 36 | /* Setup primary service. */ |
Marcomissyou | 0:b0fc0661c081 | 37 | HIDService hidService(ble); |
Marcomissyou | 0:b0fc0661c081 | 38 | /* Setup auxiliary service. */ |
Marcomissyou | 0:b0fc0661c081 | 39 | DeviceInformationService deviceInfo(ble, "ARM", "CYNTEC", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); |
Marcomissyou | 0:b0fc0661c081 | 40 | /* Setup advertising. */ |
Marcomissyou | 0:b0fc0661c081 | 41 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
Marcomissyou | 0:b0fc0661c081 | 42 | ble.accumulateAdvertisingPayload(GapAdvertisingData::KEYBOARD); |
Marcomissyou | 0:b0fc0661c081 | 43 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
Marcomissyou | 0:b0fc0661c081 | 44 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
Marcomissyou | 0:b0fc0661c081 | 45 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
Marcomissyou | 0:b0fc0661c081 | 46 | ble.setAdvertisingInterval(1000); |
Marcomissyou | 0:b0fc0661c081 | 47 | ble.startAdvertising(); |
Marcomissyou | 0:b0fc0661c081 | 48 | uart.printf("Starting advertising\n"); |
Marcomissyou | 0:b0fc0661c081 | 49 | int index = 0; |
Marcomissyou | 0:b0fc0661c081 | 50 | while (1) { |
Marcomissyou | 0:b0fc0661c081 | 51 | if (uart.readable() == 1) { |
Marcomissyou | 0:b0fc0661c081 | 52 | keyData = uart.getc(); |
Marcomissyou | 0:b0fc0661c081 | 53 | uart.putc(keyData); |
Marcomissyou | 0:b0fc0661c081 | 54 | if(keyData <= 0x39 && keyData >= 0x30){ //number |
Marcomissyou | 0:b0fc0661c081 | 55 | if(keyData == 0x30){ |
Marcomissyou | 0:b0fc0661c081 | 56 | modifyKey[index] = 0x00; |
Marcomissyou | 0:b0fc0661c081 | 57 | key_press_scan_buff[index] = 0x27; |
Marcomissyou | 0:b0fc0661c081 | 58 | } else { |
Marcomissyou | 0:b0fc0661c081 | 59 | modifyKey[index] = 0x00; |
Marcomissyou | 0:b0fc0661c081 | 60 | key_press_scan_buff[index] = keyData-0x13; |
Marcomissyou | 0:b0fc0661c081 | 61 | } |
Marcomissyou | 0:b0fc0661c081 | 62 | } else if(keyData <= 0x7a && keyData >= 0x61 ){ //lowercase letters |
Marcomissyou | 0:b0fc0661c081 | 63 | modifyKey[index] = 0x00; |
Marcomissyou | 0:b0fc0661c081 | 64 | key_press_scan_buff[index] = keyData-0x5d; |
Marcomissyou | 0:b0fc0661c081 | 65 | } else if(keyData <= 0x5a && keyData >= 0x41){ //uppercase letters |
Marcomissyou | 0:b0fc0661c081 | 66 | modifyKey[index] = 0x02; |
Marcomissyou | 0:b0fc0661c081 | 67 | key_press_scan_buff[index] = keyData-0x3d; |
Marcomissyou | 0:b0fc0661c081 | 68 | } else if (keyData == 0x20) { |
Marcomissyou | 0:b0fc0661c081 | 69 | modifyKey[index] = 0x00; |
Marcomissyou | 0:b0fc0661c081 | 70 | key_press_scan_buff[index] = 0x2c; |
Marcomissyou | 0:b0fc0661c081 | 71 | } else { |
Marcomissyou | 0:b0fc0661c081 | 72 | modifyKey[index] = 0x00; |
Marcomissyou | 0:b0fc0661c081 | 73 | //key_press_scan_buff[index] = 0x28; |
Marcomissyou | 0:b0fc0661c081 | 74 | //key_press_scan_buff[index++] = 0x73; |
Marcomissyou | 0:b0fc0661c081 | 75 | key_press_scan_buff[index] = 0x73; |
Marcomissyou | 0:b0fc0661c081 | 76 | } |
Marcomissyou | 0:b0fc0661c081 | 77 | index++; |
Marcomissyou | 0:b0fc0661c081 | 78 | if(keyData == 0x0a && ble.getGapState().connected){ |
Marcomissyou | 0:b0fc0661c081 | 79 | for(int i = 0; i < index; i++){ |
Marcomissyou | 0:b0fc0661c081 | 80 | //uart.putc(key_press_scan_buff[i]); |
Marcomissyou | 0:b0fc0661c081 | 81 | hidService.updateReport(modifyKey[i], key_press_scan_buff[i]); |
Marcomissyou | 0:b0fc0661c081 | 82 | wait(0.1); |
Marcomissyou | 0:b0fc0661c081 | 83 | } |
Marcomissyou | 0:b0fc0661c081 | 84 | index = 0; |
Marcomissyou | 0:b0fc0661c081 | 85 | memset(modifyKey, 0, 30); |
Marcomissyou | 0:b0fc0661c081 | 86 | memset(key_press_scan_buff, 0, 30); |
Marcomissyou | 0:b0fc0661c081 | 87 | } |
Marcomissyou | 0:b0fc0661c081 | 88 | |
Marcomissyou | 0:b0fc0661c081 | 89 | } |
Marcomissyou | 0:b0fc0661c081 | 90 | } |
Marcomissyou | 0:b0fc0661c081 | 91 | } |