You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
6.7 KiB
176 lines
6.7 KiB
// HIDDeviceInfo - Simple HID device example
|
|
//
|
|
// This Simple test sketch is setup to print out HID information about a device
|
|
// The other two tabs are a simple C++ subclass of the USBHIDInput class that is part
|
|
// of the USBHost_t36 library.
|
|
//
|
|
// This subclass simply tries to connect to each different HID object and
|
|
// the only thing it does is to try to print out all of the data it receives
|
|
// in a reasonable way.
|
|
//
|
|
// The idea is that with the output from this sketch we can hopefully add support
|
|
// for some additional devices that are not currently supported or allows you to
|
|
// develop your own.
|
|
//
|
|
// You can use Serial Input to control how much data is displayed per each HID packet
|
|
// received by the sketch.
|
|
//
|
|
// By Default it displays both the RAW (Hex dump) of the data received, as well
|
|
// as the data as the HID interpreter walks through the data into the individual
|
|
// fields, which we then print out.
|
|
//
|
|
// There are options to turn off some of this output, also an option that you can
|
|
// toggle on or off (C) to only try to show the changed fields.
|
|
//
|
|
// This example is in the public domain
|
|
|
|
#include <USBHost_t36.h>
|
|
#include "BTHIDDumper.h"
|
|
#include "USBDeviceInfo.h"
|
|
|
|
USBHost myusb;
|
|
USBHub hub1(myusb);
|
|
USBHub hub2(myusb);
|
|
USBDeviceInfo dinfo(myusb); // will never claim anything...
|
|
//BluetoothController bluet(myusb, false, "0000", true); // Version does pairing to device
|
|
BluetoothController bluet(myusb); // version assumes it already was paired
|
|
|
|
BTHIDDumpController hdc1(myusb, 1);
|
|
BTHIDDumpController hdc2(myusb, 2);
|
|
|
|
USBDriver *drivers[] = { &hub1, &hub2, &bluet };
|
|
#define CNT_DEVICES (sizeof(drivers) / sizeof(drivers[0]))
|
|
const char *driver_names[CNT_DEVICES] = { "Hub1", "Hub2", "BT" };
|
|
bool driver_active[CNT_DEVICES] = { false, false, false };
|
|
|
|
BTHIDDumpController *bthiddrivers[] = { &hdc1, &hdc2 };
|
|
#define CNT_BTHIDDEVICES (sizeof(bthiddrivers) / sizeof(bthiddrivers[0]))
|
|
const char *bthid_driver_names[CNT_BTHIDDEVICES] = { "HDC1", "HDC2" };
|
|
bool bthid_driver_active[CNT_BTHIDDEVICES] = { false, false };
|
|
|
|
|
|
|
|
bool show_changed_only = false;
|
|
void setup() {
|
|
Serial1.begin(2000000);
|
|
while (!Serial)
|
|
; // wait for Arduino Serial Monitor
|
|
if (CrashReport) Serial.print(CrashReport);
|
|
Serial.println("\n\nUSB HID Device Info Program");
|
|
Serial.println("\nThis Sketch shows information about plugged in HID devices");
|
|
Serial.println("\n*** You can control the output by simple character input to Serial ***");
|
|
Serial.println("R - Turns on or off showing the raw data");
|
|
Serial.println("C - Toggles showing changed data only on or off");
|
|
Serial.println("A - Try connecting and printing SDP data again");
|
|
Serial.println("P - Start a normal Pairing operation with 0000");
|
|
Serial.println("S - Start an SDP pairing operation");
|
|
Serial.println("E - Erase Key pairing information");
|
|
|
|
|
|
Serial.println("<anything else> - toggles showing the Hid formatted breakdown of the data\n");
|
|
|
|
myusb.begin();
|
|
}
|
|
|
|
|
|
void loop() {
|
|
myusb.Task();
|
|
|
|
if (Serial.available()) {
|
|
int ch = Serial.read(); // get the first char.
|
|
while (Serial.read() != -1)
|
|
;
|
|
if (ch == 'r' || (ch == 'R')) {
|
|
if (BTHIDDumpController::show_raw_data) {
|
|
BTHIDDumpController::show_raw_data = false;
|
|
BTHIDDumpController::show_formated_data = true;
|
|
Serial.println("\n*** Turn off RAW output formatted data is on ***\n");
|
|
} else {
|
|
BTHIDDumpController::show_raw_data = true;
|
|
Serial.println("\n*** Turn on RAW output ***\n");
|
|
}
|
|
} else if (ch == 'a' || (ch == 'A')) {
|
|
Serial.println("\n>>>>>>>>>> Try to decode SDP Data <<<<<<<<<<");
|
|
if (hdc1) hdc1.decode_SDP_Data(true);
|
|
if (hdc2) hdc2.decode_SDP_Data(true);
|
|
|
|
} else if (ch == 'C' || (ch == 'c')) {
|
|
if (BTHIDDumpController::changed_data_only) {
|
|
BTHIDDumpController::changed_data_only = false;
|
|
Serial.println("***\n Now Showing all data ***\n");
|
|
} else {
|
|
BTHIDDumpController::changed_data_only = true;
|
|
Serial.println("***\n Now Showing changed data only ***\n");
|
|
}
|
|
} else if (ch == 'P') {
|
|
if (bluet.startDevicePairing("0000", false)) {
|
|
Serial.println("Pairing operation started with SSP false");
|
|
|
|
} else {
|
|
Serial.println("Staring of Pairing operation failed");
|
|
}
|
|
|
|
} else if (ch == 'S') {
|
|
if (bluet.startDevicePairing("0000", true)) {
|
|
Serial.println("Pairing operation started with SSP true");
|
|
|
|
} else {
|
|
Serial.println("Staring of Pairing operation failed");
|
|
}
|
|
} else if (ch == 'E') {
|
|
Serial.println("Erase Pairing Link Keys");
|
|
bluet.writeLinkKey(nullptr, nullptr); // which should clear all of them. W
|
|
} else {
|
|
if (BTHIDDumpController::show_formated_data) {
|
|
BTHIDDumpController::show_formated_data = false;
|
|
BTHIDDumpController::show_raw_data = true; // At least make sure raw raw data is output
|
|
Serial.println("\n*** Turn off formatted output formated HID data is on ***\n");
|
|
} else {
|
|
BTHIDDumpController::show_formated_data = true;
|
|
Serial.println("\n*** Turn on formated output ***\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
for (uint8_t i = 0; i < CNT_DEVICES; i++) {
|
|
if (*drivers[i] != driver_active[i]) {
|
|
if (driver_active[i]) {
|
|
Serial.printf("*** Device %s - disconnected ***\n", driver_names[i]);
|
|
driver_active[i] = false;
|
|
} else {
|
|
Serial.printf("*** Device %s %x:%x - connected ***\n", driver_names[i], drivers[i]->idVendor(), drivers[i]->idProduct());
|
|
driver_active[i] = true;
|
|
|
|
const uint8_t *psz = drivers[i]->manufacturer();
|
|
if (psz && *psz) Serial.printf(" manufacturer: %s\n", psz);
|
|
psz = drivers[i]->product();
|
|
if (psz && *psz) Serial.printf(" product: %s\n", psz);
|
|
psz = drivers[i]->serialNumber();
|
|
if (psz && *psz) Serial.printf(" Serial: %s\n", psz);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Then Bluetooth devices
|
|
for (uint8_t i = 0; i < CNT_BTHIDDEVICES; i++) {
|
|
if (*bthiddrivers[i] != bthid_driver_active[i]) {
|
|
if (bthid_driver_active[i]) {
|
|
Serial.printf("*** BTHID Device %s - disconnected ***\n", bthid_driver_names[i]);
|
|
bthid_driver_active[i] = false;
|
|
} else {
|
|
Serial.printf("*** BTHID Device %s %x:%x - connected ***\n", bthid_driver_names[i], bthiddrivers[i]->idVendor(), bthiddrivers[i]->idProduct());
|
|
|
|
bthid_driver_active[i] = true;
|
|
const uint8_t *psz = bthiddrivers[i]->manufacturer();
|
|
if (psz && *psz) Serial.printf(" manufacturer: %s\n", psz);
|
|
psz = bthiddrivers[i]->product();
|
|
if (psz && *psz) Serial.printf(" product: %s\n", psz);
|
|
psz = bthiddrivers[i]->serialNumber();
|
|
if (psz && *psz) Serial.printf(" Serial: %s\n", psz);
|
|
|
|
// lets dump the SDP data
|
|
bthiddrivers[i]->decode_SDP_Data(false);
|
|
}
|
|
}
|
|
}
|
|
} |