From 7e4cfad53699fabbecb6696508e5addcffc1b095 Mon Sep 17 00:00:00 2001 From: krolyxon Date: Sat, 20 Jun 2026 00:24:34 +0530 Subject: restructure to use rust source tree primarily --- lib-arduino/BleMouse/BleConnectionStatus.cpp | 17 +++ lib-arduino/BleMouse/BleConnectionStatus.h | 20 ++++ lib-arduino/BleMouse/BleMouse.cpp | 165 +++++++++++++++++++++++++++ lib-arduino/BleMouse/BleMouse.h | 52 +++++++++ 4 files changed, 254 insertions(+) create mode 100644 lib-arduino/BleMouse/BleConnectionStatus.cpp create mode 100644 lib-arduino/BleMouse/BleConnectionStatus.h create mode 100644 lib-arduino/BleMouse/BleMouse.cpp create mode 100644 lib-arduino/BleMouse/BleMouse.h (limited to 'lib-arduino/BleMouse') diff --git a/lib-arduino/BleMouse/BleConnectionStatus.cpp b/lib-arduino/BleMouse/BleConnectionStatus.cpp new file mode 100644 index 0000000..83d3539 --- /dev/null +++ b/lib-arduino/BleMouse/BleConnectionStatus.cpp @@ -0,0 +1,17 @@ +#include "BleConnectionStatus.h" + +BleConnectionStatus::BleConnectionStatus(void) {} + +void BleConnectionStatus::onConnect(BLEServer *pServer) { + this->connected = true; + BLE2902 *desc = (BLE2902 *)this->inputMouse->getDescriptorByUUID( + BLEUUID((uint16_t)0x2902)); + desc->setNotifications(true); +} + +void BleConnectionStatus::onDisconnect(BLEServer *pServer) { + this->connected = false; + BLE2902 *desc = (BLE2902 *)this->inputMouse->getDescriptorByUUID( + BLEUUID((uint16_t)0x2902)); + desc->setNotifications(false); +} diff --git a/lib-arduino/BleMouse/BleConnectionStatus.h b/lib-arduino/BleMouse/BleConnectionStatus.h new file mode 100644 index 0000000..45b7185 --- /dev/null +++ b/lib-arduino/BleMouse/BleConnectionStatus.h @@ -0,0 +1,20 @@ +#ifndef ESP32_BLE_CONNECTION_STATUS_H +#define ESP32_BLE_CONNECTION_STATUS_H +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + +#include "BLE2902.h" +#include "BLECharacteristic.h" +#include + +class BleConnectionStatus : public BLEServerCallbacks { + public: + BleConnectionStatus(void); + bool connected = false; + void onConnect(BLEServer *pServer); + void onDisconnect(BLEServer *pServer); + BLECharacteristic *inputMouse; +}; + +#endif // CONFIG_BT_ENABLED +#endif // ESP32_BLE_CONNECTION_STATUS_H diff --git a/lib-arduino/BleMouse/BleMouse.cpp b/lib-arduino/BleMouse/BleMouse.cpp new file mode 100644 index 0000000..8f5c16e --- /dev/null +++ b/lib-arduino/BleMouse/BleMouse.cpp @@ -0,0 +1,165 @@ +#include "BLE2902.h" +#include "BLEHIDDevice.h" +#include "HIDKeyboardTypes.h" +#include "HIDTypes.h" +#include "sdkconfig.h" +#include +#include +#include +#include + +#include "BleConnectionStatus.h" +#include "BleMouse.h" + +#if defined(CONFIG_ARDUHAL_ESP_LOG) +#include "esp32-hal-log.h" +#define LOG_TAG "" +#else +#include "esp_log.h" +static const char *LOG_TAG = "BLEDevice"; +#endif + +static const uint8_t _hidReportDescriptor[] = { + USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop) + USAGE(1), 0x02, // USAGE (Mouse) + COLLECTION(1), 0x01, // COLLECTION (Application) + USAGE(1), 0x01, // USAGE (Pointer) + COLLECTION(1), 0x00, // COLLECTION (Physical) + // ------------------------------------------------- Buttons (Left, Right, + // Middle, Back, Forward) + USAGE_PAGE(1), 0x09, // USAGE_PAGE (Button) + USAGE_MINIMUM(1), 0x01, // USAGE_MINIMUM (Button 1) + USAGE_MAXIMUM(1), 0x05, // USAGE_MAXIMUM (Button 5) + LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0) + LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) + REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) + REPORT_COUNT(1), 0x05, // REPORT_COUNT (5) + HIDINPUT(1), 0x02, // INPUT (Data, Variable, Absolute) ;5 button bits + // ------------------------------------------------- Padding + REPORT_SIZE(1), 0x03, // REPORT_SIZE (3) + REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) + HIDINPUT(1), + 0x03, // INPUT (Constant, Variable, Absolute) ;3 bit padding + // ------------------------------------------------- X/Y position, Wheel + USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop) + USAGE(1), 0x30, // USAGE (X) + USAGE(1), 0x31, // USAGE (Y) + USAGE(1), 0x38, // USAGE (Wheel) + LOGICAL_MINIMUM(1), 0x81, // LOGICAL_MINIMUM (-127) + LOGICAL_MAXIMUM(1), 0x7f, // LOGICAL_MAXIMUM (127) + REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) + REPORT_COUNT(1), 0x03, // REPORT_COUNT (3) + HIDINPUT(1), + 0x06, // INPUT (Data, Variable, Relative) ;3 bytes (X,Y,Wheel) + // ------------------------------------------------- Horizontal wheel + USAGE_PAGE(1), 0x0c, // USAGE PAGE (Consumer Devices) + USAGE(2), 0x38, 0x02, // USAGE (AC Pan) + LOGICAL_MINIMUM(1), 0x81, // LOGICAL_MINIMUM (-127) + LOGICAL_MAXIMUM(1), 0x7f, // LOGICAL_MAXIMUM (127) + REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) + REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) + HIDINPUT(1), 0x06, // INPUT (Data, Var, Rel) + END_COLLECTION(0), // END_COLLECTION + END_COLLECTION(0) // END_COLLECTION +}; + +BleMouse::BleMouse(std::string deviceName, std::string deviceManufacturer, + uint8_t batteryLevel) + : _buttons(0), hid(0) { + this->deviceName = deviceName; + this->deviceManufacturer = deviceManufacturer; + this->batteryLevel = batteryLevel; + this->connectionStatus = new BleConnectionStatus(); +} + +void BleMouse::begin(void) { + xTaskCreate(this->taskServer, "server", 20000, (void *)this, 5, NULL); +} + +void BleMouse::end(void) {} + +void BleMouse::click(uint8_t b) { + _buttons = b; + move(0, 0, 0, 0); + _buttons = 0; + move(0, 0, 0, 0); +} + +void BleMouse::move(signed char x, signed char y, signed char wheel, + signed char hWheel) { + if (this->isConnected()) { + uint8_t m[5]; + m[0] = _buttons; + m[1] = x; + m[2] = y; + m[3] = wheel; + m[4] = hWheel; + this->inputMouse->setValue(m, 5); + this->inputMouse->notify(); + } +} + +void BleMouse::buttons(uint8_t b) { + if (b != _buttons) { + _buttons = b; + move(0, 0, 0, 0); + } +} + +void BleMouse::press(uint8_t b) { buttons(_buttons | b); } + +void BleMouse::release(uint8_t b) { buttons(_buttons & ~b); } + +bool BleMouse::isPressed(uint8_t b) { + if ((b & _buttons) > 0) + return true; + return false; +} + +bool BleMouse::isConnected(void) { return this->connectionStatus->connected; } + +void BleMouse::setBatteryLevel(uint8_t level) { + this->batteryLevel = level; + if (hid != 0) + this->hid->setBatteryLevel(this->batteryLevel); +} + +void BleMouse::taskServer(void *pvParameter) { + BleMouse *bleMouseInstance = + (BleMouse *)pvParameter; // static_cast(pvParameter); + BLEDevice::init(std::string(bleMouseInstance->deviceName.c_str())); + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(bleMouseInstance->connectionStatus); + + bleMouseInstance->hid = new BLEHIDDevice(pServer); + bleMouseInstance->inputMouse = bleMouseInstance->hid->inputReport( + 0); // <-- input REPORTID from report map + bleMouseInstance->connectionStatus->inputMouse = + bleMouseInstance->inputMouse; + + bleMouseInstance->hid->manufacturer()->setValue( + std::string(bleMouseInstance->deviceManufacturer.c_str())); + + bleMouseInstance->hid->pnp(0x02, 0xe502, 0xa111, 0x0210); + bleMouseInstance->hid->hidInfo(0x00, 0x02); + + BLESecurity *pSecurity = new BLESecurity(); + + pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND); + + bleMouseInstance->hid->reportMap((uint8_t *)_hidReportDescriptor, + sizeof(_hidReportDescriptor)); + bleMouseInstance->hid->startServices(); + + bleMouseInstance->onStarted(pServer); + + BLEAdvertising *pAdvertising = pServer->getAdvertising(); + pAdvertising->setAppearance(HID_MOUSE); + pAdvertising->addServiceUUID( + bleMouseInstance->hid->hidService()->getUUID()); + pAdvertising->start(); + bleMouseInstance->hid->setBatteryLevel(bleMouseInstance->batteryLevel); + + ESP_LOGD(LOG_TAG, "Advertising started!"); + vTaskDelay(portMAX_DELAY); // delay(portMAX_DELAY); +} diff --git a/lib-arduino/BleMouse/BleMouse.h b/lib-arduino/BleMouse/BleMouse.h new file mode 100644 index 0000000..4468189 --- /dev/null +++ b/lib-arduino/BleMouse/BleMouse.h @@ -0,0 +1,52 @@ +#ifndef ESP32_BLE_MOUSE_H +#define ESP32_BLE_MOUSE_H +#include "sdkconfig.h" +#if defined(CONFIG_BT_ENABLED) + +#include "BLECharacteristic.h" +#include "BLEHIDDevice.h" +#include "BleConnectionStatus.h" + +#define MOUSE_LEFT 1 +#define MOUSE_RIGHT 2 +#define MOUSE_MIDDLE 4 +#define MOUSE_BACK 8 +#define MOUSE_FORWARD 16 +#define MOUSE_ALL \ + (MOUSE_LEFT | MOUSE_RIGHT | \ + MOUSE_MIDDLE) #For compatibility with the Mouse library + +class BleMouse { + private: + uint8_t _buttons; + BleConnectionStatus *connectionStatus; + BLEHIDDevice *hid; + BLECharacteristic *inputMouse; + void buttons(uint8_t b); + void rawAction(uint8_t msg[], char msgSize); + static void taskServer(void *pvParameter); + + public: + BleMouse(std::string deviceName = "ESP32 Bluetooth Mouse", + std::string deviceManufacturer = "Espressif", + uint8_t batteryLevel = 100); + void begin(void); + void end(void); + void click(uint8_t b = MOUSE_LEFT); + void move(signed char x, signed char y, signed char wheel = 0, + signed char hWheel = 0); + void press(uint8_t b = MOUSE_LEFT); // press LEFT by default + void release(uint8_t b = MOUSE_LEFT); // release LEFT by default + bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default + bool isConnected(void); + void setBatteryLevel(uint8_t level); + uint8_t batteryLevel; + std::string deviceManufacturer; + std::string deviceName; + + protected: + virtual void onStarted(BLEServer *pServer) {}; +}; + +#endif // CONFIG_BT_ENABLED +#endif // ESP32_BLE_MOUSE_H -- cgit v1.2.3