I’m trying to write an ESP32 lib that is compatible with the Arduino IDE and uses classes, but I’m getting the following error:
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp: In member function 'void BleMouse::init()':
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:19:57: error: invalid use of non-static member function
xTaskCreate(taskServer, "server", 20000, NULL, 5, NULL);
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp: In member function 'void BleMouse::taskServer(void*)':
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:80:12: error: 'LOG_TAG' was not declared in this scope
ESP_LOGD(LOG_TAG, "Advertising started!");
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:80:43: error: 'ESP_LOGD' was not declared in this scope
ESP_LOGD(LOG_TAG, "Advertising started!");
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:81:22: error: 'delay' was not declared in this scope
delay(portMAX_DELAY);
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp: In function 'void rawAction(uint8_t, char)':
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:89:3: error: invalid use of 'this' in non-member function
this->inputMouse->setValue(msg, msgSize);
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:90:3: error: invalid use of 'this' in non-member function
this->inputMouse->notify();
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp: In member function 'void BleMouse::scrollDown(char)':
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:95:47: error: narrowing conversion of '-(int)unit' from 'int' to 'uint8_t {aka unsigned char}' inside { } [-Werror=narrowing]
uint8_t msg[] = { 0x00, 0x00, 0x00, -unit };
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:96:27: error: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]
this->rawAction(msg, 4);
^
In file included from /home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:12:0:
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.h:18:8: note: initializing argument 1 of 'void BleMouse::rawAction(uint8_t, char)'
void rawAction(uint8_t msg, char msgSize);
^
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp: In member function 'void BleMouse::scrollUp(char)':
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:103:27: error: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]
this->rawAction(msg, 4);
^
In file included from /home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.cpp:12:0:
/home/fedora/Arduino/libraries/ESP32-BLE-Mouse/BleMouse.h:18:8: note: initializing argument 1 of 'void BleMouse::rawAction(uint8_t, char)'
void rawAction(uint8_t msg, char msgSize);
^
cc1plus: some warnings being treated as errors
Using library ESP32-BLE-Mouse at version 1.0 in folder: /home/fedora/Arduino/libraries/ESP32-BLE-Mouse
Using library BLE at version 1.0.1 in folder: /home/fedora/.arduino15/packages/esp32/hardware/esp32/1.0.2/libraries/BLE
exit status 1
Error compiling for board ESP32 Dev Module.
when I try to compile this:
/**
* This example turns the ESP32 into a Bluetooth LE mouse that scrolls down every 2 seconds.
*/
#include <BleMouse.h>
BleMouse bleMouse;
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE work!");
bleMouse.init();
}
void loop() {
if(bleMouse.isConnected()) {
Serial.println("Scroll Down by 1 unit");
bleMouse.scrollDown(1);
}
delay(2000);
}
The code for the BleMouse and BleConnectionStatus classes can be found in my Github repo, but I also include it in this post in case that’s easier:
BleMouse.h
#ifndef ESP32_BLE_MOUSE_H
#define ESP32_BLE_MOUSE_H
#include "sdkconfig.h"
#if defined(CONFIG_BT_ENABLED)
#include "BleConnectionStatus.h"
#include "BLEHIDDevice.h"
#include "BLECharacteristic.h"
class BleMouse {
public:
BleMouse();
void init();
bool isConnected();
void scrollDown(char units);
void scrollUp(char units);
void rawAction(uint8_t msg, char msgSize);
private:
BleConnectionStatus* connectionStatus;
BLEHIDDevice* hid;
BLECharacteristic* inputMouse;
void taskServer(void*);
};
#endif // CONFIG_BT_ENABLED
#endif // ESP32_BLE_MOUSE_H
BleMouse.cpp
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include "BLE2902.h"
#include "BLEHIDDevice.h"
#include "HIDTypes.h"
#include "HIDKeyboardTypes.h"
#include <driver/adc.h>
#include "sdkconfig.h"
#include "BleConnectionStatus.h"
#include "BleMouse.h"
BleMouse::BleMouse() {
this->connectionStatus = new BleConnectionStatus(this->inputMouse);
}
void BleMouse::init() {
xTaskCreate(this->taskServer, "server", 20000, NULL, 5, NULL);
}
void BleMouse::taskServer(void*) {
BLEDevice::init("ESP32-BLE-Mouse");
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(this->connectionStatus);
this->hid = new BLEHIDDevice(pServer);
this->inputMouse = this->hid->inputReport(1); // <-- input REPORTID from report map
std::string name = "chegewara";
this->hid->manufacturer()->setValue(name);
this->hid->pnp(0x02, 0xe502, 0xa111, 0x0210);
this->hid->hidInfo(0x00,0x02);
BLESecurity *pSecurity = new BLESecurity();
pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND);
const uint8_t reportMapMouse[] = {
USAGE_PAGE(1), 0x01,
USAGE(1), 0x02,
COLLECTION(1), 0x01,
REPORT_ID(1), 0x01,
USAGE(1), 0x01,
COLLECTION(1), 0x00,
USAGE_PAGE(1), 0x09,
USAGE_MINIMUM(1), 0x1,
USAGE_MAXIMUM(1), 0x3,
LOGICAL_MINIMUM(1), 0x0,
LOGICAL_MAXIMUM(1), 0x1,
REPORT_COUNT(1), 0x3,
REPORT_SIZE(1), 0x1,
0x80|0x01, 0x2, // (Data, Variable, Absolute), ;3 button bits
REPORT_COUNT(1), 0x1,
REPORT_SIZE(1), 0x5,
0x80|0x01, 0x1, //(Constant), ;5 bit padding
USAGE_PAGE(1), 0x1, //(Generic Desktop),
USAGE(1), 0x30,
USAGE(1), 0x31,
USAGE(1), 0x38,
LOGICAL_MINIMUM(1), 0x81,
LOGICAL_MAXIMUM(1), 0x7f,
REPORT_SIZE(1), 0x8,
REPORT_COUNT(1), 0x3,
0x80|0x01, 0x6, //(Data, Variable, Relative), ;2 position bytes (X & Y)
END_COLLECTION(0),
END_COLLECTION(0)
};
this->hid->reportMap((uint8_t*)reportMapMouse, sizeof(reportMapMouse));
this->hid->startServices();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->setAppearance(HID_MOUSE);
pAdvertising->addServiceUUID(this->hid->hidService()->getUUID());
pAdvertising->start();
this->hid->setBatteryLevel(7);
ESP_LOGD(LOG_TAG, "Advertising started!");
delay(portMAX_DELAY);
}
bool BleMouse::isConnected() {
return this->connectionStatus->connected;
}
void rawAction(uint8_t msg, char msgSize) {
this->inputMouse->setValue(msg, msgSize);
this->inputMouse->notify();
}
void BleMouse::scrollDown(char unit) {
if(this->isConnected()) {
uint8_t msg[] = { 0x00, 0x00, 0x00, -unit };
this->rawAction(msg, 4);
}
}
void BleMouse::scrollUp(char unit) {
if(this->isConnected()) {
uint8_t msg[] = { 0x00, 0x00, 0x00, unit };
this->rawAction(msg, 4);
}
}
BleConnectionStatus.h
#ifndef ESP32_BLE_CONNECTION_STATUS_H
#define ESP32_BLE_CONNECTION_STATUS_H
#include "sdkconfig.h"
#if defined(CONFIG_BT_ENABLED)
#include <BLEServer.h>
#include "BLE2902.h"
#include "BLECharacteristic.h"
class BleConnectionStatus : public BLEServerCallbacks {
public:
BleConnectionStatus(BLECharacteristic* inputMouse);
bool connected = false;
void onConnect(BLEServer* pServer);
void onDisconnect(BLEServer* pServer);
private:
BLECharacteristic* inputMouse;
};
#endif // CONFIG_BT_ENABLED
#endif // ESP32_BLE_CONNECTION_STATUS_H
BleConnectionStatus.cpp:
#include "BleConnectionStatus.h"
BleConnectionStatus::BleConnectionStatus(BLECharacteristic* inputMouse) {
this->inputMouse = inputMouse;
}
void BleConnectionStatus::onConnect(BLEServer* pServer) {
this->connected = true;
BLE2902* desc = (BLE2902*)inputMouse->getDescriptorByUUID(BLEUUID((uint16_t)0x2902));
desc->setNotifications(true);
}
void BleConnectionStatus::onDisconnect(BLEServer* pServer) {
this->connected = false;
BLE2902* desc = (BLE2902*)inputMouse->getDescriptorByUUID(BLEUUID((uint16_t)0x2902));
desc->setNotifications(false);
}
Before I turned everything into classes, it worked and looked like this