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.

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?

UserRevisionLine numberNew 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 }