Files
flipper-bluepp/ble_hid_host/hid_decode.c
T
andy b1efa9cd4e Add BLE HID Host app; share the central layer via libble/
Extract the reusable BLE central/GATT client and name/value decoders into
libble/ (moved out of bt_inspector). build.sh now stages libble/*.{c,h}
into each app dir at build time and builds every app in APPS=(...).

New app ble_hid_host: connects to a BLE keyboard or mouse, discovers the
HID service (0x1812), sets protocol mode (boot when offered, else report),
subscribes to the input-report characteristics, and decodes keyboard
(modifiers + key names) and mouse (buttons + dx/dy/wheel) reports live.
Events scroll on screen and are logged with raw bytes to
apps_data/ble_hid_host/. No pairing, so encryption-gated keyboards stay
silent; open devices and most mice work. Both faps build and pass APPCHK.
2026-09-11 13:14:57 +01:00

75 lines
2.1 KiB
C

#include "hid_decode.h"
// USB HID Usage Table (keyboard/keypad page 0x07), common subset.
const char* hid_key_name(uint8_t u) {
static char one[2];
if(u >= 0x04 && u <= 0x1D) { // a-z
one[0] = 'a' + (u - 0x04);
one[1] = 0;
return one;
}
if(u >= 0x1E && u <= 0x26) { // 1-9
one[0] = '1' + (u - 0x1E);
one[1] = 0;
return one;
}
switch(u) {
case 0x27: return "0";
case 0x28: return "Enter";
case 0x29: return "Esc";
case 0x2A: return "Bksp";
case 0x2B: return "Tab";
case 0x2C: return "Space";
case 0x2D: return "-";
case 0x2E: return "=";
case 0x2F: return "[";
case 0x30: return "]";
case 0x31: return "\\";
case 0x33: return ";";
case 0x34: return "'";
case 0x35: return "`";
case 0x36: return ",";
case 0x37: return ".";
case 0x38: return "/";
case 0x39: return "Caps";
case 0x3A: return "F1";
case 0x3B: return "F2";
case 0x3C: return "F3";
case 0x3D: return "F4";
case 0x3E: return "F5";
case 0x3F: return "F6";
case 0x40: return "F7";
case 0x41: return "F8";
case 0x42: return "F9";
case 0x43: return "F10";
case 0x44: return "F11";
case 0x45: return "F12";
case 0x46: return "PrtSc";
case 0x47: return "ScrLk";
case 0x48: return "Pause";
case 0x49: return "Ins";
case 0x4A: return "Home";
case 0x4B: return "PgUp";
case 0x4C: return "Del";
case 0x4D: return "End";
case 0x4E: return "PgDn";
case 0x4F: return "Right";
case 0x50: return "Left";
case 0x51: return "Down";
case 0x52: return "Up";
case 0x53: return "NumLk";
default: return NULL;
}
}
void hid_mods_str(FuriString* out, uint8_t m) {
if(m & 0x01) furi_string_cat_str(out, "LCtrl+");
if(m & 0x02) furi_string_cat_str(out, "LShift+");
if(m & 0x04) furi_string_cat_str(out, "LAlt+");
if(m & 0x08) furi_string_cat_str(out, "LGui+");
if(m & 0x10) furi_string_cat_str(out, "RCtrl+");
if(m & 0x20) furi_string_cat_str(out, "RShift+");
if(m & 0x40) furi_string_cat_str(out, "RAlt+");
if(m & 0x80) furi_string_cat_str(out, "RGui+");
}