From 965ac81f1fdbdbf875826817dc9ee9189ccf9ff5 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 2 Sep 2026 22:11:30 +0200 Subject: [PATCH 1/4] =?UTF-8?q?W=C3=A4hlen=20funktioniert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pio/build/project.checksum | 2 +- platformio.ini | 2 +- src/main.cpp | 218 ++++++++++++++++++++---------------- 3 files changed, 125 insertions(+), 97 deletions(-) diff --git a/.pio/build/project.checksum b/.pio/build/project.checksum index 632145f..d7cefc2 100644 --- a/.pio/build/project.checksum +++ b/.pio/build/project.checksum @@ -1 +1 @@ -c1b704a06958664cdd86ed07b79b2a04332e2c72 \ No newline at end of file +ee4a55eacb7a28959a3c3df9f700b6996855c849 \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 46c1854..13a69bc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,5 +1,5 @@ [env:esp32dev] -platform = espressif32 +platform = espressif32 @ 6.5.0 board = esp32dev framework = arduino monitor_speed = 115200 diff --git a/src/main.cpp b/src/main.cpp index df7ca0e..0f026f0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,162 +2,190 @@ #include // --- Pin-Definitionen --- -#define PIN_HOOK 18 // GRÜN: HIGH = Hörer abgehoben, LOW = aufgelegt -#define PIN_DIAL 19 // WEISS: HIGH bei Drehung, fallende Flanken = Impulse +#define PIN_NSA 18 // Nummernschalter-Arbeitskontakt (HIGH wenn Scheibe gedreht) +#define PIN_NSI 19 // Nummernschalter-Impulskontakt (Pulst während des Ablaufs) +#define PIN_HOOK 21 // Gabelumschalter (HIGH = Hörer abgehoben, LOW = aufgelegt) -// --- Hardware & Timing-Konstanten --- -#define DEBOUNCE_MS 30 // Entprellzeit für Impulse (ms) -#define DIGIT_TIMEOUT_MS 350 // Pause nach Drehung, bis Ziffer erkannt ist (ms) -#define COMPLETE_DIAL_TIMEOUT 2500 // Pause nach letzter Ziffer, bis Rufnummer komplett ist (ms) +#define NSI_DEBOUNCE_MS 15 // Entprellung für die Impulse +#define COMPLETE_DIAL_TIMEOUT 2500 // 2,5 Sekunden Pause nach letzter Ziffer bis zum Enter -// --- BLE Keyboard Instanz --- -BleKeyboard bleKeyboard("FeTAp 791 Telefon", "Deutsche Bundespost", 100); +BleKeyboard bleKeyboard("FeTAp 791", "Deutsche Bundespost", 100); -// --- Interrupt-Variablen (müssen volatile sein!) --- -volatile int pulseCount = 0; -volatile unsigned long lastPulseTime = 0; -volatile bool isDialing = false; - -// --- Hauptprogramm-Variablen --- +// --- Status-Variablen --- bool bleConnectedLastState = false; -bool hookLastState = false; +bool hookLastState = LOW; +unsigned long hookDebounceTime = 0; +// NSA (Arbeitskontakt) +bool lastNsaState = LOW; + +// NSI (Impulskontakt) +bool lastNsiState = LOW; +bool stableNsiState = LOW; +unsigned long lastNsiDebounceTime = 0; + +int pulseCount = 0; String dialedNumber = ""; unsigned long lastDigitCompletedTime = 0; bool waitingForCompleteNumber = false; -// ------------------------------------------------------------------- -// Interrupt Service Routine (ISR) für die fallende Flanke -// ------------------------------------------------------------------- -// 'IRAM_ATTR' sorgt dafür, dass dieser Code im schnellen RAM des ESP32 liegt -void IRAM_ATTR handleDialPulse() { - unsigned long currentMillis = millis(); - - // Entprellung direkt im Interrupt: - // Nur zählen, wenn der letzte Impuls länger als DEBOUNCE_MS her ist - if ((currentMillis - lastPulseTime) > DEBOUNCE_MS) { - pulseCount++; - isDialing = true; - lastPulseTime = currentMillis; - } -} - void setup() { Serial.begin(115200); delay(1000); + Serial.println("\n======================================================="); + Serial.println("FeTAp 791 - ESC bei jedem Auflegen aktiv"); + Serial.println("======================================================="); - Serial.println("\n========================================="); - Serial.println("FeTAp 791 - ESP32 mit Hardware-Interrupt"); - Serial.println("========================================="); - + pinMode(PIN_NSA, INPUT_PULLDOWN); + pinMode(PIN_NSI, INPUT_PULLDOWN); pinMode(PIN_HOOK, INPUT_PULLDOWN); - pinMode(PIN_DIAL, INPUT_PULLDOWN); - - // --- Hardware-Interrupt konfigurieren --- - // Löst 'handleDialPulse()' EXAKT beim Übergang von HIGH nach LOW aus! - attachInterrupt(digitalPinToInterrupt(PIN_DIAL), handleDialPulse, FALLING); - + bleKeyboard.begin(); - Serial.println("[BLE] Warte auf Verbindung zum iPhone..."); } -void triggerIphoneShortcut(String number) { +void triggerShortcut() { if (!bleKeyboard.isConnected()) { - Serial.println("[BLE] Nicht verbunden – Kurzbefehl kann nicht gesendet werden!"); + Serial.println("[BLE] Nicht verbunden - Shortcut kann nicht gesendet werden."); return; } - Serial.printf("[Kurzbefehl] Starte Aktion für Rufnummer: %s\n", number.c_str()); - - // Nummer eintippen und mit 'Enter' bestätigen - bleKeyboard.print(number); + Serial.println("[Shortcut] Sende Option + Command + C an iPhone..."); + + bleKeyboard.press(KEY_LEFT_ALT); + bleKeyboard.press(KEY_LEFT_GUI); + bleKeyboard.press('c'); delay(100); - bleKeyboard.write(KEY_RETURN); + bleKeyboard.releaseAll(); } -void processDialedDigit(int pulses) { +void sendCancel() { + if (!bleKeyboard.isConnected()) return; + + Serial.println("[Abbruch] Sende ESC (Cancel) an iPhone..."); + bleKeyboard.write(KEY_ESC); +} + +void processDigit(int rawPulses) { char digitChar; - if (pulses == 10) { - digitChar = '0'; - } else if (pulses >= 1 && pulses <= 9) { - digitChar = '0' + pulses; - } else { - Serial.printf("[Wahl] Ungültige Impulsanzahl (%d) ignoriert.\n", pulses); + if (rawPulses == 10) digitChar = '0'; + else if (rawPulses >= 1 && rawPulses <= 9) digitChar = '0' + rawPulses; + else { + Serial.printf("[Fehler] Ungültige Pulsanzahl: %d\n", rawPulses); return; } dialedNumber += digitChar; + + // Ziffer sofort ans iPhone senden + if (bleKeyboard.isConnected()) { + Serial.printf("[Wahl] Ziffer %c erkannt und sofort an iPhone gesendet.\n", digitChar); + bleKeyboard.print(digitChar); + } else { + Serial.printf("[Wahl] Ziffer %c erkannt, aber nicht verbunden.\n", digitChar); + } + + // Timer für das abschließende Enter starten lastDigitCompletedTime = millis(); waitingForCompleteNumber = true; - - Serial.printf("[Wahl] Ziffer: %c | Aktuelle Nummer: %s\n", digitChar, dialedNumber.c_str()); } void loop() { unsigned long currentMillis = millis(); - // 1. Bluetooth-Verbindungsstatus + // 1. Bluetooth Status überwachen bool isConnectedNow = bleKeyboard.isConnected(); - if (isConnectedNow && !bleConnectedLastState) { - Serial.println("\n[BLE] >>> iPhone erfolgreich VERBUNDEN! <<<"); - bleConnectedLastState = true; - } else if (!isConnectedNow && bleConnectedLastState) { - Serial.println("\n[BLE] >>> Verbindung zum iPhone VERLOREN! <<<"); - bleConnectedLastState = false; + if (isConnectedNow != bleConnectedLastState) { + bleConnectedLastState = isConnectedNow; + Serial.println(isConnectedNow ? "\n[BLE] iPhone VERBUNDEN!" : "\n[BLE] Verbindung VERLOREN!"); } - // 2. Gabelumschalter (Hook) + // 2. Gabelumschalter (Hook) auf PIN 21 auswerten bool currentHookState = digitalRead(PIN_HOOK); if (currentHookState != hookLastState) { - delay(20); // Entprellen der Gabel - currentHookState = digitalRead(PIN_HOOK); - - if (currentHookState != hookLastState) { + if ((currentMillis - hookDebounceTime) > 50) { hookLastState = currentHookState; + hookDebounceTime = currentMillis; - if (currentHookState == HIGH) { + if (hookLastState == HIGH) { Serial.println("\n[Hörer] ABGEHOBEN"); dialedNumber = ""; waitingForCompleteNumber = false; - // Interrupt aktivieren / Zähler nullen - pulseCount = 0; - isDialing = false; + // Shortcut beim Abheben ausführen + triggerShortcut(); } else { Serial.println("\n[Hörer] AUFGELEGT"); + + // Bei jedem Auflegen ESC senden, um das Eingabefenster (egal ob leer oder teilgewählt) zu schließen + sendCancel(); + dialedNumber = ""; waitingForCompleteNumber = false; - pulseCount = 0; - isDialing = false; } } } - // 3. Auswertung der Ziffern & Rufnummer (nur bei abgehobenem Hörer) + // 3. Wählscheibe NUR auswerten, wenn der Hörer abgehoben ist if (hookLastState == HIGH) { - // A) Ist die Ziffern-Drehung beendet? (Timeout seit letztem Interrupt-Impuls) - if (isDialing && (currentMillis - lastPulseTime > DIGIT_TIMEOUT_MS)) { - - // Für die sichere Übergabe aus der ISR kurz Interrupts pausieren oder Wert kopieren - noInterrupts(); - int currentPulses = pulseCount; - pulseCount = 0; - isDialing = false; - interrupts(); + // A) NSA auswerten (Das "Fenster" für eine Ziffer) + bool currentNsaState = digitalRead(PIN_NSA); + if (currentNsaState != lastNsaState) { + delay(15); // Kurzes Entprellen des Arbeitskontakts + if (digitalRead(PIN_NSA) == currentNsaState) { + lastNsaState = currentNsaState; - if (currentPulses > 0) { - processDialedDigit(currentPulses); + if (currentNsaState == HIGH) { + Serial.println("\n[NSA] Scheibe aufgezogen - beginne Messung..."); + pulseCount = 0; + } else { + Serial.println("[NSA] Scheibe steht - werte Impulse aus..."); + if (pulseCount > 0) { + processDigit(pulseCount); + pulseCount = 0; + } + } } } - // B) Ist die komplette Rufnummer fertig gewählt? (Pause nach letzter Ziffer) - if (waitingForCompleteNumber && (currentMillis - lastDigitCompletedTime > COMPLETE_DIAL_TIMEOUT)) { - waitingForCompleteNumber = false; - Serial.printf("\n[Wahl abgeschlossen] Vollständige Nummer: %s\n", dialedNumber.c_str()); - - // Kurzbefehl am iPhone ausführen - triggerIphoneShortcut(dialedNumber); + // B) NSI auswerten (Impulse zählen während NSA = HIGH) + if (lastNsaState == HIGH) { + bool currentNsiState = digitalRead(PIN_NSI); + + if (currentNsiState != lastNsiState) { + lastNsiDebounceTime = millis(); + } + lastNsiState = currentNsiState; + + if ((millis() - lastNsiDebounceTime) > NSI_DEBOUNCE_MS) { + if (currentNsiState != stableNsiState) { + stableNsiState = currentNsiState; + + if (stableNsiState == LOW) { + pulseCount++; + Serial.printf(" --> Puls %d registriert\n", pulseCount); + } + } + } + } + + // C) Enter nach 2,5 Sekunden Inaktivität senden + if (waitingForCompleteNumber) { + unsigned long elapsed = millis() - lastDigitCompletedTime; + + if (elapsed > COMPLETE_DIAL_TIMEOUT) { + waitingForCompleteNumber = false; + + if (bleKeyboard.isConnected() && dialedNumber.length() > 0) { + Serial.printf("\n[Wahl abgeschlossen] Sende Enter (KEY_RETURN) für Nummer: %s\n", dialedNumber.c_str()); + bleKeyboard.write(KEY_RETURN); + } else { + Serial.println("\n[Fehler] Entweder nicht verbunden oder Puffer leer."); + } + + // Puffer für die nächste Wahl leeren + dialedNumber = ""; + } } } } \ No newline at end of file From 8d572e2ac6e417cf8f5acc1511cabf365b5023cc Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 2 Sep 2026 22:16:03 +0200 Subject: [PATCH 2/4] .pio Ordner aus Repository entfernt --- .pio/build/project.checksum | 1 - .../esp32dev/ESP32 BLE Keyboard/.piopm | 1 - .../ESP32 BLE Keyboard/BleKeyboard.cpp | 546 ------------------ .../esp32dev/ESP32 BLE Keyboard/BleKeyboard.h | 183 ------ .../esp32dev/ESP32 BLE Keyboard/README.md | 162 ------ .../SendKeyStrokes/SendKeyStrokes.ino | 46 -- .../esp32dev/ESP32 BLE Keyboard/keywords.txt | 24 - .../ESP32 BLE Keyboard/library.properties | 9 - .pio/libdeps/esp32dev/integrity.dat | 1 - 9 files changed, 973 deletions(-) delete mode 100644 .pio/build/project.checksum delete mode 100644 .pio/libdeps/esp32dev/ESP32 BLE Keyboard/.piopm delete mode 100644 .pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.cpp delete mode 100644 .pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.h delete mode 100644 .pio/libdeps/esp32dev/ESP32 BLE Keyboard/README.md delete mode 100644 .pio/libdeps/esp32dev/ESP32 BLE Keyboard/examples/SendKeyStrokes/SendKeyStrokes.ino delete mode 100644 .pio/libdeps/esp32dev/ESP32 BLE Keyboard/keywords.txt delete mode 100644 .pio/libdeps/esp32dev/ESP32 BLE Keyboard/library.properties delete mode 100644 .pio/libdeps/esp32dev/integrity.dat diff --git a/.pio/build/project.checksum b/.pio/build/project.checksum deleted file mode 100644 index d7cefc2..0000000 --- a/.pio/build/project.checksum +++ /dev/null @@ -1 +0,0 @@ -ee4a55eacb7a28959a3c3df9f700b6996855c849 \ No newline at end of file diff --git a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/.piopm b/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/.piopm deleted file mode 100644 index 83d5c7f..0000000 --- a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/.piopm +++ /dev/null @@ -1 +0,0 @@ -{"type": "library", "name": "ESP32 BLE Keyboard", "version": "0.3.2", "spec": {"owner": "t-vk", "id": 6749, "name": "ESP32 BLE Keyboard", "requirements": null, "uri": null}} \ No newline at end of file diff --git a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.cpp b/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.cpp deleted file mode 100644 index 0d043f4..0000000 --- a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.cpp +++ /dev/null @@ -1,546 +0,0 @@ -#include "BleKeyboard.h" - -#if defined(USE_NIMBLE) -#include -#include -#include -#include -#else -#include -#include -#include -#include "BLE2902.h" -#include "BLEHIDDevice.h" -#endif // USE_NIMBLE -#include "HIDTypes.h" -#include -#include "sdkconfig.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 - - -// Report IDs: -#define KEYBOARD_ID 0x01 -#define MEDIA_KEYS_ID 0x02 - -static const uint8_t _hidReportDescriptor[] = { - USAGE_PAGE(1), 0x01, // USAGE_PAGE (Generic Desktop Ctrls) - USAGE(1), 0x06, // USAGE (Keyboard) - COLLECTION(1), 0x01, // COLLECTION (Application) - // ------------------------------------------------- Keyboard - REPORT_ID(1), KEYBOARD_ID, // REPORT_ID (1) - USAGE_PAGE(1), 0x07, // USAGE_PAGE (Kbrd/Keypad) - USAGE_MINIMUM(1), 0xE0, // USAGE_MINIMUM (0xE0) - USAGE_MAXIMUM(1), 0xE7, // USAGE_MAXIMUM (0xE7) - LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0) - LOGICAL_MAXIMUM(1), 0x01, // Logical Maximum (1) - REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) - REPORT_COUNT(1), 0x08, // REPORT_COUNT (8) - HIDINPUT(1), 0x02, // INPUT (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) - REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) ; 1 byte (Reserved) - REPORT_SIZE(1), 0x08, // REPORT_SIZE (8) - HIDINPUT(1), 0x01, // INPUT (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) - REPORT_COUNT(1), 0x05, // REPORT_COUNT (5) ; 5 bits (Num lock, Caps lock, Scroll lock, Compose, Kana) - REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) - USAGE_PAGE(1), 0x08, // USAGE_PAGE (LEDs) - USAGE_MINIMUM(1), 0x01, // USAGE_MINIMUM (0x01) ; Num Lock - USAGE_MAXIMUM(1), 0x05, // USAGE_MAXIMUM (0x05) ; Kana - HIDOUTPUT(1), 0x02, // OUTPUT (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - REPORT_COUNT(1), 0x01, // REPORT_COUNT (1) ; 3 bits (Padding) - REPORT_SIZE(1), 0x03, // REPORT_SIZE (3) - HIDOUTPUT(1), 0x01, // OUTPUT (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) - REPORT_COUNT(1), 0x06, // REPORT_COUNT (6) ; 6 bytes (Keys) - REPORT_SIZE(1), 0x08, // REPORT_SIZE(8) - LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM(0) - LOGICAL_MAXIMUM(1), 0x65, // LOGICAL_MAXIMUM(0x65) ; 101 keys - USAGE_PAGE(1), 0x07, // USAGE_PAGE (Kbrd/Keypad) - USAGE_MINIMUM(1), 0x00, // USAGE_MINIMUM (0) - USAGE_MAXIMUM(1), 0x65, // USAGE_MAXIMUM (0x65) - HIDINPUT(1), 0x00, // INPUT (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) - END_COLLECTION(0), // END_COLLECTION - // ------------------------------------------------- Media Keys - USAGE_PAGE(1), 0x0C, // USAGE_PAGE (Consumer) - USAGE(1), 0x01, // USAGE (Consumer Control) - COLLECTION(1), 0x01, // COLLECTION (Application) - REPORT_ID(1), MEDIA_KEYS_ID, // REPORT_ID (3) - USAGE_PAGE(1), 0x0C, // USAGE_PAGE (Consumer) - LOGICAL_MINIMUM(1), 0x00, // LOGICAL_MINIMUM (0) - LOGICAL_MAXIMUM(1), 0x01, // LOGICAL_MAXIMUM (1) - REPORT_SIZE(1), 0x01, // REPORT_SIZE (1) - REPORT_COUNT(1), 0x10, // REPORT_COUNT (16) - USAGE(1), 0xB5, // USAGE (Scan Next Track) ; bit 0: 1 - USAGE(1), 0xB6, // USAGE (Scan Previous Track) ; bit 1: 2 - USAGE(1), 0xB7, // USAGE (Stop) ; bit 2: 4 - USAGE(1), 0xCD, // USAGE (Play/Pause) ; bit 3: 8 - USAGE(1), 0xE2, // USAGE (Mute) ; bit 4: 16 - USAGE(1), 0xE9, // USAGE (Volume Increment) ; bit 5: 32 - USAGE(1), 0xEA, // USAGE (Volume Decrement) ; bit 6: 64 - USAGE(2), 0x23, 0x02, // Usage (WWW Home) ; bit 7: 128 - USAGE(2), 0x94, 0x01, // Usage (My Computer) ; bit 0: 1 - USAGE(2), 0x92, 0x01, // Usage (Calculator) ; bit 1: 2 - USAGE(2), 0x2A, 0x02, // Usage (WWW fav) ; bit 2: 4 - USAGE(2), 0x21, 0x02, // Usage (WWW search) ; bit 3: 8 - USAGE(2), 0x26, 0x02, // Usage (WWW stop) ; bit 4: 16 - USAGE(2), 0x24, 0x02, // Usage (WWW back) ; bit 5: 32 - USAGE(2), 0x83, 0x01, // Usage (Media sel) ; bit 6: 64 - USAGE(2), 0x8A, 0x01, // Usage (Mail) ; bit 7: 128 - HIDINPUT(1), 0x02, // INPUT (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) - END_COLLECTION(0) // END_COLLECTION -}; - -BleKeyboard::BleKeyboard(std::string deviceName, std::string deviceManufacturer, uint8_t batteryLevel) - : hid(0) - , deviceName(std::string(deviceName).substr(0, 15)) - , deviceManufacturer(std::string(deviceManufacturer).substr(0,15)) - , batteryLevel(batteryLevel) {} - -void BleKeyboard::begin(void) -{ - BLEDevice::init(deviceName); - BLEServer* pServer = BLEDevice::createServer(); - pServer->setCallbacks(this); - - hid = new BLEHIDDevice(pServer); - inputKeyboard = hid->inputReport(KEYBOARD_ID); // <-- input REPORTID from report map - outputKeyboard = hid->outputReport(KEYBOARD_ID); - inputMediaKeys = hid->inputReport(MEDIA_KEYS_ID); - - outputKeyboard->setCallbacks(this); - - hid->manufacturer()->setValue(deviceManufacturer); - - hid->pnp(0x02, vid, pid, version); - hid->hidInfo(0x00, 0x01); - - -#if defined(USE_NIMBLE) - - BLEDevice::setSecurityAuth(true, true, true); - -#else - - BLESecurity* pSecurity = new BLESecurity(); - pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND); - -#endif // USE_NIMBLE - - hid->reportMap((uint8_t*)_hidReportDescriptor, sizeof(_hidReportDescriptor)); - hid->startServices(); - - onStarted(pServer); - - advertising = pServer->getAdvertising(); - advertising->setAppearance(HID_KEYBOARD); - advertising->addServiceUUID(hid->hidService()->getUUID()); - advertising->setScanResponse(false); - advertising->start(); - hid->setBatteryLevel(batteryLevel); - - ESP_LOGD(LOG_TAG, "Advertising started!"); -} - -void BleKeyboard::end(void) -{ -} - -bool BleKeyboard::isConnected(void) { - return this->connected; -} - -void BleKeyboard::setBatteryLevel(uint8_t level) { - this->batteryLevel = level; - if (hid != 0) - this->hid->setBatteryLevel(this->batteryLevel); -} - -//must be called before begin in order to set the name -void BleKeyboard::setName(std::string deviceName) { - this->deviceName = deviceName; -} - -/** - * @brief Sets the waiting time (in milliseconds) between multiple keystrokes in NimBLE mode. - * - * @param ms Time in milliseconds - */ -void BleKeyboard::setDelay(uint32_t ms) { - this->_delay_ms = ms; -} - -void BleKeyboard::set_vendor_id(uint16_t vid) { - this->vid = vid; -} - -void BleKeyboard::set_product_id(uint16_t pid) { - this->pid = pid; -} - -void BleKeyboard::set_version(uint16_t version) { - this->version = version; -} - -void BleKeyboard::sendReport(KeyReport* keys) -{ - if (this->isConnected()) - { - this->inputKeyboard->setValue((uint8_t*)keys, sizeof(KeyReport)); - this->inputKeyboard->notify(); -#if defined(USE_NIMBLE) - // vTaskDelay(delayTicks); - this->delay_ms(_delay_ms); -#endif // USE_NIMBLE - } -} - -void BleKeyboard::sendReport(MediaKeyReport* keys) -{ - if (this->isConnected()) - { - this->inputMediaKeys->setValue((uint8_t*)keys, sizeof(MediaKeyReport)); - this->inputMediaKeys->notify(); -#if defined(USE_NIMBLE) - //vTaskDelay(delayTicks); - this->delay_ms(_delay_ms); -#endif // USE_NIMBLE - } -} - -extern -const uint8_t _asciimap[128] PROGMEM; - -#define SHIFT 0x80 -const uint8_t _asciimap[128] = -{ - 0x00, // NUL - 0x00, // SOH - 0x00, // STX - 0x00, // ETX - 0x00, // EOT - 0x00, // ENQ - 0x00, // ACK - 0x00, // BEL - 0x2a, // BS Backspace - 0x2b, // TAB Tab - 0x28, // LF Enter - 0x00, // VT - 0x00, // FF - 0x00, // CR - 0x00, // SO - 0x00, // SI - 0x00, // DEL - 0x00, // DC1 - 0x00, // DC2 - 0x00, // DC3 - 0x00, // DC4 - 0x00, // NAK - 0x00, // SYN - 0x00, // ETB - 0x00, // CAN - 0x00, // EM - 0x00, // SUB - 0x00, // ESC - 0x00, // FS - 0x00, // GS - 0x00, // RS - 0x00, // US - - 0x2c, // ' ' - 0x1e|SHIFT, // ! - 0x34|SHIFT, // " - 0x20|SHIFT, // # - 0x21|SHIFT, // $ - 0x22|SHIFT, // % - 0x24|SHIFT, // & - 0x34, // ' - 0x26|SHIFT, // ( - 0x27|SHIFT, // ) - 0x25|SHIFT, // * - 0x2e|SHIFT, // + - 0x36, // , - 0x2d, // - - 0x37, // . - 0x38, // / - 0x27, // 0 - 0x1e, // 1 - 0x1f, // 2 - 0x20, // 3 - 0x21, // 4 - 0x22, // 5 - 0x23, // 6 - 0x24, // 7 - 0x25, // 8 - 0x26, // 9 - 0x33|SHIFT, // : - 0x33, // ; - 0x36|SHIFT, // < - 0x2e, // = - 0x37|SHIFT, // > - 0x38|SHIFT, // ? - 0x1f|SHIFT, // @ - 0x04|SHIFT, // A - 0x05|SHIFT, // B - 0x06|SHIFT, // C - 0x07|SHIFT, // D - 0x08|SHIFT, // E - 0x09|SHIFT, // F - 0x0a|SHIFT, // G - 0x0b|SHIFT, // H - 0x0c|SHIFT, // I - 0x0d|SHIFT, // J - 0x0e|SHIFT, // K - 0x0f|SHIFT, // L - 0x10|SHIFT, // M - 0x11|SHIFT, // N - 0x12|SHIFT, // O - 0x13|SHIFT, // P - 0x14|SHIFT, // Q - 0x15|SHIFT, // R - 0x16|SHIFT, // S - 0x17|SHIFT, // T - 0x18|SHIFT, // U - 0x19|SHIFT, // V - 0x1a|SHIFT, // W - 0x1b|SHIFT, // X - 0x1c|SHIFT, // Y - 0x1d|SHIFT, // Z - 0x2f, // [ - 0x31, // bslash - 0x30, // ] - 0x23|SHIFT, // ^ - 0x2d|SHIFT, // _ - 0x35, // ` - 0x04, // a - 0x05, // b - 0x06, // c - 0x07, // d - 0x08, // e - 0x09, // f - 0x0a, // g - 0x0b, // h - 0x0c, // i - 0x0d, // j - 0x0e, // k - 0x0f, // l - 0x10, // m - 0x11, // n - 0x12, // o - 0x13, // p - 0x14, // q - 0x15, // r - 0x16, // s - 0x17, // t - 0x18, // u - 0x19, // v - 0x1a, // w - 0x1b, // x - 0x1c, // y - 0x1d, // z - 0x2f|SHIFT, // { - 0x31|SHIFT, // | - 0x30|SHIFT, // } - 0x35|SHIFT, // ~ - 0 // DEL -}; - - -uint8_t USBPutChar(uint8_t c); - -// press() adds the specified key (printing, non-printing, or modifier) -// to the persistent key report and sends the report. Because of the way -// USB HID works, the host acts like the key remains pressed until we -// call release(), releaseAll(), or otherwise clear the report and resend. -size_t BleKeyboard::press(uint8_t k) -{ - uint8_t i; - if (k >= 136) { // it's a non-printing key (not a modifier) - k = k - 136; - } else if (k >= 128) { // it's a modifier key - _keyReport.modifiers |= (1<<(k-128)); - k = 0; - } else { // it's a printing key - k = pgm_read_byte(_asciimap + k); - if (!k) { - setWriteError(); - return 0; - } - if (k & 0x80) { // it's a capital letter or other character reached with shift - _keyReport.modifiers |= 0x02; // the left shift modifier - k &= 0x7F; - } - } - - // Add k to the key report only if it's not already present - // and if there is an empty slot. - if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && - _keyReport.keys[2] != k && _keyReport.keys[3] != k && - _keyReport.keys[4] != k && _keyReport.keys[5] != k) { - - for (i=0; i<6; i++) { - if (_keyReport.keys[i] == 0x00) { - _keyReport.keys[i] = k; - break; - } - } - if (i == 6) { - setWriteError(); - return 0; - } - } - sendReport(&_keyReport); - return 1; -} - -size_t BleKeyboard::press(const MediaKeyReport k) -{ - uint16_t k_16 = k[1] | (k[0] << 8); - uint16_t mediaKeyReport_16 = _mediaKeyReport[1] | (_mediaKeyReport[0] << 8); - - mediaKeyReport_16 |= k_16; - _mediaKeyReport[0] = (uint8_t)((mediaKeyReport_16 & 0xFF00) >> 8); - _mediaKeyReport[1] = (uint8_t)(mediaKeyReport_16 & 0x00FF); - - sendReport(&_mediaKeyReport); - return 1; -} - -// release() takes the specified key out of the persistent key report and -// sends the report. This tells the OS the key is no longer pressed and that -// it shouldn't be repeated any more. -size_t BleKeyboard::release(uint8_t k) -{ - uint8_t i; - if (k >= 136) { // it's a non-printing key (not a modifier) - k = k - 136; - } else if (k >= 128) { // it's a modifier key - _keyReport.modifiers &= ~(1<<(k-128)); - k = 0; - } else { // it's a printing key - k = pgm_read_byte(_asciimap + k); - if (!k) { - return 0; - } - if (k & 0x80) { // it's a capital letter or other character reached with shift - _keyReport.modifiers &= ~(0x02); // the left shift modifier - k &= 0x7F; - } - } - - // Test the key report to see if k is present. Clear it if it exists. - // Check all positions in case the key is present more than once (which it shouldn't be) - for (i=0; i<6; i++) { - if (0 != k && _keyReport.keys[i] == k) { - _keyReport.keys[i] = 0x00; - } - } - - sendReport(&_keyReport); - return 1; -} - -size_t BleKeyboard::release(const MediaKeyReport k) -{ - uint16_t k_16 = k[1] | (k[0] << 8); - uint16_t mediaKeyReport_16 = _mediaKeyReport[1] | (_mediaKeyReport[0] << 8); - mediaKeyReport_16 &= ~k_16; - _mediaKeyReport[0] = (uint8_t)((mediaKeyReport_16 & 0xFF00) >> 8); - _mediaKeyReport[1] = (uint8_t)(mediaKeyReport_16 & 0x00FF); - - sendReport(&_mediaKeyReport); - return 1; -} - -void BleKeyboard::releaseAll(void) -{ - _keyReport.keys[0] = 0; - _keyReport.keys[1] = 0; - _keyReport.keys[2] = 0; - _keyReport.keys[3] = 0; - _keyReport.keys[4] = 0; - _keyReport.keys[5] = 0; - _keyReport.modifiers = 0; - _mediaKeyReport[0] = 0; - _mediaKeyReport[1] = 0; - sendReport(&_keyReport); -} - -size_t BleKeyboard::write(uint8_t c) -{ - uint8_t p = press(c); // Keydown - release(c); // Keyup - return p; // just return the result of press() since release() almost always returns 1 -} - -size_t BleKeyboard::write(const MediaKeyReport c) -{ - uint16_t p = press(c); // Keydown - release(c); // Keyup - return p; // just return the result of press() since release() almost always returns 1 -} - -size_t BleKeyboard::write(const uint8_t *buffer, size_t size) { - size_t n = 0; - while (size--) { - if (*buffer != '\r') { - if (write(*buffer)) { - n++; - } else { - break; - } - } - buffer++; - } - return n; -} - -void BleKeyboard::onConnect(BLEServer* pServer) { - this->connected = true; - -#if !defined(USE_NIMBLE) - - BLE2902* desc = (BLE2902*)this->inputKeyboard->getDescriptorByUUID(BLEUUID((uint16_t)0x2902)); - desc->setNotifications(true); - desc = (BLE2902*)this->inputMediaKeys->getDescriptorByUUID(BLEUUID((uint16_t)0x2902)); - desc->setNotifications(true); - -#endif // !USE_NIMBLE - -} - -void BleKeyboard::onDisconnect(BLEServer* pServer) { - this->connected = false; - -#if !defined(USE_NIMBLE) - - BLE2902* desc = (BLE2902*)this->inputKeyboard->getDescriptorByUUID(BLEUUID((uint16_t)0x2902)); - desc->setNotifications(false); - desc = (BLE2902*)this->inputMediaKeys->getDescriptorByUUID(BLEUUID((uint16_t)0x2902)); - desc->setNotifications(false); - - advertising->start(); - -#endif // !USE_NIMBLE -} - -void BleKeyboard::onWrite(BLECharacteristic* me) { - uint8_t* value = (uint8_t*)(me->getValue().c_str()); - (void)value; - ESP_LOGI(LOG_TAG, "special keys: %d", *value); -} - -void BleKeyboard::delay_ms(uint64_t ms) { - uint64_t m = esp_timer_get_time(); - if(ms){ - uint64_t e = (m + (ms * 1000)); - if(m > e){ //overflow - while(esp_timer_get_time() > e) { } - } - while(esp_timer_get_time() < e) {} - } -} \ No newline at end of file diff --git a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.h b/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.h deleted file mode 100644 index 0736a02..0000000 --- a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/BleKeyboard.h +++ /dev/null @@ -1,183 +0,0 @@ -// uncomment the following line to use NimBLE library -//#define USE_NIMBLE - -#ifndef ESP32_BLE_KEYBOARD_H -#define ESP32_BLE_KEYBOARD_H -#include "sdkconfig.h" -#if defined(CONFIG_BT_ENABLED) - -#if defined(USE_NIMBLE) - -#include "NimBLECharacteristic.h" -#include "NimBLEHIDDevice.h" - -#define BLEDevice NimBLEDevice -#define BLEServerCallbacks NimBLEServerCallbacks -#define BLECharacteristicCallbacks NimBLECharacteristicCallbacks -#define BLEHIDDevice NimBLEHIDDevice -#define BLECharacteristic NimBLECharacteristic -#define BLEAdvertising NimBLEAdvertising -#define BLEServer NimBLEServer - -#else - -#include "BLEHIDDevice.h" -#include "BLECharacteristic.h" - -#endif // USE_NIMBLE - -#include "Print.h" - -#define BLE_KEYBOARD_VERSION "0.0.4" -#define BLE_KEYBOARD_VERSION_MAJOR 0 -#define BLE_KEYBOARD_VERSION_MINOR 0 -#define BLE_KEYBOARD_VERSION_REVISION 4 - -const uint8_t KEY_LEFT_CTRL = 0x80; -const uint8_t KEY_LEFT_SHIFT = 0x81; -const uint8_t KEY_LEFT_ALT = 0x82; -const uint8_t KEY_LEFT_GUI = 0x83; -const uint8_t KEY_RIGHT_CTRL = 0x84; -const uint8_t KEY_RIGHT_SHIFT = 0x85; -const uint8_t KEY_RIGHT_ALT = 0x86; -const uint8_t KEY_RIGHT_GUI = 0x87; - -const uint8_t KEY_UP_ARROW = 0xDA; -const uint8_t KEY_DOWN_ARROW = 0xD9; -const uint8_t KEY_LEFT_ARROW = 0xD8; -const uint8_t KEY_RIGHT_ARROW = 0xD7; -const uint8_t KEY_BACKSPACE = 0xB2; -const uint8_t KEY_TAB = 0xB3; -const uint8_t KEY_RETURN = 0xB0; -const uint8_t KEY_ESC = 0xB1; -const uint8_t KEY_INSERT = 0xD1; -const uint8_t KEY_PRTSC = 0xCE; -const uint8_t KEY_DELETE = 0xD4; -const uint8_t KEY_PAGE_UP = 0xD3; -const uint8_t KEY_PAGE_DOWN = 0xD6; -const uint8_t KEY_HOME = 0xD2; -const uint8_t KEY_END = 0xD5; -const uint8_t KEY_CAPS_LOCK = 0xC1; -const uint8_t KEY_F1 = 0xC2; -const uint8_t KEY_F2 = 0xC3; -const uint8_t KEY_F3 = 0xC4; -const uint8_t KEY_F4 = 0xC5; -const uint8_t KEY_F5 = 0xC6; -const uint8_t KEY_F6 = 0xC7; -const uint8_t KEY_F7 = 0xC8; -const uint8_t KEY_F8 = 0xC9; -const uint8_t KEY_F9 = 0xCA; -const uint8_t KEY_F10 = 0xCB; -const uint8_t KEY_F11 = 0xCC; -const uint8_t KEY_F12 = 0xCD; -const uint8_t KEY_F13 = 0xF0; -const uint8_t KEY_F14 = 0xF1; -const uint8_t KEY_F15 = 0xF2; -const uint8_t KEY_F16 = 0xF3; -const uint8_t KEY_F17 = 0xF4; -const uint8_t KEY_F18 = 0xF5; -const uint8_t KEY_F19 = 0xF6; -const uint8_t KEY_F20 = 0xF7; -const uint8_t KEY_F21 = 0xF8; -const uint8_t KEY_F22 = 0xF9; -const uint8_t KEY_F23 = 0xFA; -const uint8_t KEY_F24 = 0xFB; - -const uint8_t KEY_NUM_0 = 0xEA; -const uint8_t KEY_NUM_1 = 0xE1; -const uint8_t KEY_NUM_2 = 0xE2; -const uint8_t KEY_NUM_3 = 0xE3; -const uint8_t KEY_NUM_4 = 0xE4; -const uint8_t KEY_NUM_5 = 0xE5; -const uint8_t KEY_NUM_6 = 0xE6; -const uint8_t KEY_NUM_7 = 0xE7; -const uint8_t KEY_NUM_8 = 0xE8; -const uint8_t KEY_NUM_9 = 0xE9; -const uint8_t KEY_NUM_SLASH = 0xDC; -const uint8_t KEY_NUM_ASTERISK = 0xDD; -const uint8_t KEY_NUM_MINUS = 0xDE; -const uint8_t KEY_NUM_PLUS = 0xDF; -const uint8_t KEY_NUM_ENTER = 0xE0; -const uint8_t KEY_NUM_PERIOD = 0xEB; - -typedef uint8_t MediaKeyReport[2]; - -const MediaKeyReport KEY_MEDIA_NEXT_TRACK = {1, 0}; -const MediaKeyReport KEY_MEDIA_PREVIOUS_TRACK = {2, 0}; -const MediaKeyReport KEY_MEDIA_STOP = {4, 0}; -const MediaKeyReport KEY_MEDIA_PLAY_PAUSE = {8, 0}; -const MediaKeyReport KEY_MEDIA_MUTE = {16, 0}; -const MediaKeyReport KEY_MEDIA_VOLUME_UP = {32, 0}; -const MediaKeyReport KEY_MEDIA_VOLUME_DOWN = {64, 0}; -const MediaKeyReport KEY_MEDIA_WWW_HOME = {128, 0}; -const MediaKeyReport KEY_MEDIA_LOCAL_MACHINE_BROWSER = {0, 1}; // Opens "My Computer" on Windows -const MediaKeyReport KEY_MEDIA_CALCULATOR = {0, 2}; -const MediaKeyReport KEY_MEDIA_WWW_BOOKMARKS = {0, 4}; -const MediaKeyReport KEY_MEDIA_WWW_SEARCH = {0, 8}; -const MediaKeyReport KEY_MEDIA_WWW_STOP = {0, 16}; -const MediaKeyReport KEY_MEDIA_WWW_BACK = {0, 32}; -const MediaKeyReport KEY_MEDIA_CONSUMER_CONTROL_CONFIGURATION = {0, 64}; // Media Selection -const MediaKeyReport KEY_MEDIA_EMAIL_READER = {0, 128}; - - -// Low level key report: up to 6 keys and shift, ctrl etc at once -typedef struct -{ - uint8_t modifiers; - uint8_t reserved; - uint8_t keys[6]; -} KeyReport; - -class BleKeyboard : public Print, public BLEServerCallbacks, public BLECharacteristicCallbacks -{ -private: - BLEHIDDevice* hid; - BLECharacteristic* inputKeyboard; - BLECharacteristic* outputKeyboard; - BLECharacteristic* inputMediaKeys; - BLEAdvertising* advertising; - KeyReport _keyReport; - MediaKeyReport _mediaKeyReport; - std::string deviceName; - std::string deviceManufacturer; - uint8_t batteryLevel; - bool connected = false; - uint32_t _delay_ms = 7; - void delay_ms(uint64_t ms); - - uint16_t vid = 0x05ac; - uint16_t pid = 0x820a; - uint16_t version = 0x0210; - -public: - BleKeyboard(std::string deviceName = "ESP32 Keyboard", std::string deviceManufacturer = "Espressif", uint8_t batteryLevel = 100); - void begin(void); - void end(void); - void sendReport(KeyReport* keys); - void sendReport(MediaKeyReport* keys); - size_t press(uint8_t k); - size_t press(const MediaKeyReport k); - size_t release(uint8_t k); - size_t release(const MediaKeyReport k); - size_t write(uint8_t c); - size_t write(const MediaKeyReport c); - size_t write(const uint8_t *buffer, size_t size); - void releaseAll(void); - bool isConnected(void); - void setBatteryLevel(uint8_t level); - void setName(std::string deviceName); - void setDelay(uint32_t ms); - - void set_vendor_id(uint16_t vid); - void set_product_id(uint16_t pid); - void set_version(uint16_t version); -protected: - virtual void onStarted(BLEServer *pServer) { }; - virtual void onConnect(BLEServer* pServer) override; - virtual void onDisconnect(BLEServer* pServer) override; - virtual void onWrite(BLECharacteristic* me) override; - -}; - -#endif // CONFIG_BT_ENABLED -#endif // ESP32_BLE_KEYBOARD_H diff --git a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/README.md b/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/README.md deleted file mode 100644 index eac0d4e..0000000 --- a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/README.md +++ /dev/null @@ -1,162 +0,0 @@ -# ESP32 BLE Keyboard library - -This library allows you to make the ESP32 act as a Bluetooth Keyboard and control what it does. -You might also be interested in: -- [ESP32-BLE-Mouse](https://github.com/T-vK/ESP32-BLE-Mouse) -- [ESP32-BLE-Gamepad](https://github.com/lemmingDev/ESP32-BLE-Gamepad) - - -## Features - - - [x] Send key strokes - - [x] Send text - - [x] Press/release individual keys - - [x] Media keys are supported - - [ ] Read Numlock/Capslock/Scrolllock state - - [x] Set battery level (basically works, but doesn't show up in Android's status bar) - - [x] Compatible with Android - - [x] Compatible with Windows - - [x] Compatible with Linux - - [x] Compatible with MacOS X (not stable, some people have issues, doesn't work with old devices) - - [x] Compatible with iOS (not stable, some people have issues, doesn't work with old devices) - -## Installation -- (Make sure you can use the ESP32 with the Arduino IDE. [Instructions can be found here.](https://github.com/espressif/arduino-esp32#installation-instructions)) -- [Download the latest release of this library from the release page.](https://github.com/T-vK/ESP32-BLE-Keyboard/releases) -- In the Arduino IDE go to "Sketch" -> "Include Library" -> "Add .ZIP Library..." and select the file you just downloaded. -- You can now go to "File" -> "Examples" -> "ESP32 BLE Keyboard" and select any of the examples to get started. - -## Example - -``` C++ -/** - * This example turns the ESP32 into a Bluetooth LE keyboard that writes the words, presses Enter, presses a media key and then Ctrl+Alt+Delete - */ -#include - -BleKeyboard bleKeyboard; - -void setup() { - Serial.begin(115200); - Serial.println("Starting BLE work!"); - bleKeyboard.begin(); -} - -void loop() { - if(bleKeyboard.isConnected()) { - Serial.println("Sending 'Hello world'..."); - bleKeyboard.print("Hello world"); - - delay(1000); - - Serial.println("Sending Enter key..."); - bleKeyboard.write(KEY_RETURN); - - delay(1000); - - Serial.println("Sending Play/Pause media key..."); - bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE); - - delay(1000); - - // - // Below is an example of pressing multiple keyboard modifiers - // which by default is commented out. - // - /* Serial.println("Sending Ctrl+Alt+Delete..."); - bleKeyboard.press(KEY_LEFT_CTRL); - bleKeyboard.press(KEY_LEFT_ALT); - bleKeyboard.press(KEY_DELETE); - delay(100); - bleKeyboard.releaseAll(); - */ - - } - Serial.println("Waiting 5 seconds..."); - delay(5000); -} -``` - -## API docs -The BleKeyboard interface is almost identical to the Keyboard Interface, so you can use documentation right here: -https://www.arduino.cc/reference/en/language/functions/usb/keyboard/ - -Just remember that you have to use `bleKeyboard` instead of just `Keyboard` and you need these two lines at the top of your script: -``` -#include -BleKeyboard bleKeyboard; -``` - -In addition to that you can send media keys (which is not possible with the USB keyboard library). Supported are the following: -- KEY_MEDIA_NEXT_TRACK -- KEY_MEDIA_PREVIOUS_TRACK -- KEY_MEDIA_STOP -- KEY_MEDIA_PLAY_PAUSE -- KEY_MEDIA_MUTE -- KEY_MEDIA_VOLUME_UP -- KEY_MEDIA_VOLUME_DOWN -- KEY_MEDIA_WWW_HOME -- KEY_MEDIA_LOCAL_MACHINE_BROWSER // Opens "My Computer" on Windows -- KEY_MEDIA_CALCULATOR -- KEY_MEDIA_WWW_BOOKMARKS -- KEY_MEDIA_WWW_SEARCH -- KEY_MEDIA_WWW_STOP -- KEY_MEDIA_WWW_BACK -- KEY_MEDIA_CONSUMER_CONTROL_CONFIGURATION // Media Selection -- KEY_MEDIA_EMAIL_READER - -There is also Bluetooth specific information that you can set (optional): -Instead of `BleKeyboard bleKeyboard;` you can do `BleKeyboard bleKeyboard("Bluetooth Device Name", "Bluetooth Device Manufacturer", 100);`. (Max lenght is 15 characters, anything beyond that will be truncated.) -The third parameter is the initial battery level of your device. To adjust the battery level later on you can simply call e.g. `bleKeyboard.setBatteryLevel(50)` (set battery level to 50%). -By default the battery level will be set to 100%, the device name will be `ESP32 Bluetooth Keyboard` and the manufacturer will be `Espressif`. -There is also a `setDelay` method to set a delay between each key event. E.g. `bleKeyboard.setDelay(10)` (10 milliseconds). The default is `8`. -This feature is meant to compensate for some applications and devices that can't handle fast input and will skip letters if too many keys are sent in a small time frame. - -## NimBLE-Mode -The NimBLE mode enables a significant saving of RAM and FLASH memory. - -### Comparison (SendKeyStrokes.ino at compile-time) - -**Standard** -``` -RAM: [= ] 9.3% (used 30548 bytes from 327680 bytes) -Flash: [======== ] 75.8% (used 994120 bytes from 1310720 bytes) -``` - -**NimBLE mode** -``` -RAM: [= ] 8.3% (used 27180 bytes from 327680 bytes) -Flash: [==== ] 44.2% (used 579158 bytes from 1310720 bytes) -``` - -### Comparison (SendKeyStrokes.ino at run-time) - -| | Standard | NimBLE mode | difference -|---|--:|--:|--:| -| `ESP.getHeapSize()` | 296.804 | 321.252 | **+ 24.448** | -| `ESP.getFreeHeap()` | 143.572 | 260.764 | **+ 117.192** | -| `ESP.getSketchSize()` | 994.224 | 579.264 | **- 414.960** | - -## How to activate NimBLE mode? - -### ArduinoIDE: -Uncomment the first line in BleKeyboard.h -```C++ -#define USE_NIMBLE -``` - -### PlatformIO: -Change your `platformio.ini` to the following settings -```ini -lib_deps = - NimBLE-Arduino - -build_flags = - -D USE_NIMBLE -``` - -## Credits - -Credits to [chegewara](https://github.com/chegewara) and [the authors of the USB keyboard library](https://github.com/arduino-libraries/Keyboard/) as this project is heavily based on their work! -Also, credits to [duke2421](https://github.com/T-vK/ESP32-BLE-Keyboard/issues/1) who helped a lot with testing, debugging and fixing the device descriptor! -And credits to [sivar2311](https://github.com/sivar2311) for adding NimBLE support, greatly reducing the memory footprint, fixing advertising issues and for adding the `setDelay` method. diff --git a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/examples/SendKeyStrokes/SendKeyStrokes.ino b/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/examples/SendKeyStrokes/SendKeyStrokes.ino deleted file mode 100644 index 03d1e70..0000000 --- a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/examples/SendKeyStrokes/SendKeyStrokes.ino +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This example turns the ESP32 into a Bluetooth LE keyboard that writes the words, presses Enter, presses a media key and then Ctrl+Alt+Delete - */ -#include - -BleKeyboard bleKeyboard; - -void setup() { - Serial.begin(115200); - Serial.println("Starting BLE work!"); - bleKeyboard.begin(); -} - -void loop() { - if(bleKeyboard.isConnected()) { - Serial.println("Sending 'Hello world'..."); - bleKeyboard.print("Hello world"); - - delay(1000); - - Serial.println("Sending Enter key..."); - bleKeyboard.write(KEY_RETURN); - - delay(1000); - - Serial.println("Sending Play/Pause media key..."); - bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE); - - delay(1000); - - // - // Below is an example of pressing multiple keyboard modifiers - // which by default is commented out. - /* - Serial.println("Sending Ctrl+Alt+Delete..."); - bleKeyboard.press(KEY_LEFT_CTRL); - bleKeyboard.press(KEY_LEFT_ALT); - bleKeyboard.press(KEY_DELETE); - delay(100); - bleKeyboard.releaseAll(); - */ - } - - Serial.println("Waiting 5 seconds..."); - delay(5000); -} diff --git a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/keywords.txt b/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/keywords.txt deleted file mode 100644 index 0aa35b7..0000000 --- a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/keywords.txt +++ /dev/null @@ -1,24 +0,0 @@ -####################################### -# Syntax Coloring Map For ESP32 BLE Keyboard -####################################### -# Class -####################################### - -BleKeyboard KEYWORD1 - -####################################### -# Methods and Functions -####################################### - -begin KEYWORD2 -end KEYWORD2 -write KEYWORD2 -press KEYWORD2 -release KEYWORD2 -releaseAll KEYWORD2 -setBatteryLevel KEYWORD2 -isConnected KEYWORD2 - -####################################### -# Constants -####################################### diff --git a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/library.properties b/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/library.properties deleted file mode 100644 index 263a10f..0000000 --- a/.pio/libdeps/esp32dev/ESP32 BLE Keyboard/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=ESP32 BLE Keyboard -version=0.3.2 -author=T-vK -maintainer=T-vK -sentence=Bluetooth LE Keyboard library for the ESP32. -paragraph=Bluetooth LE Keyboard library for the ESP32. -category=Communication -url=https://github.com/T-vK/ESP32-BLE-Keyboard -architectures=esp32 diff --git a/.pio/libdeps/esp32dev/integrity.dat b/.pio/libdeps/esp32dev/integrity.dat deleted file mode 100644 index b79c43e..0000000 --- a/.pio/libdeps/esp32dev/integrity.dat +++ /dev/null @@ -1 +0,0 @@ -t-vk/ESP32 BLE Keyboard @ ^0.3.2 \ No newline at end of file From ef627acd6ff47ee4c5ed1655fc9c36bc1d6ee88d Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 2 Sep 2026 22:19:43 +0200 Subject: [PATCH 3/4] =?UTF-8?q?Anschl=C3=BCsse=20in=20Reamde.MD=20beschrei?= =?UTF-8?q?ben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 41edcf4..49ab519 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ # RetroCallBLE -Altes Wählscheibentelefon mit BLE am iPhone verwenden \ No newline at end of file +Altes Wählscheibentelefon mit BLE am iPhone verwenden + +Anschluss: +eine Seite auf 3,3V andere Seite auf Pin... + +Wählscheibe: +ws-bn = Wählscheibe dreht (nsa / Pin 18) +ge-gn = Impulse (nsi /Pin 19) + +Anschlusskabel: +gn-bn = Gabelumschalter (Pin 21) \ No newline at end of file From ad26ee85ff5d7f3232401f8c6bc54dca88f32966 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 2 Sep 2026 22:22:01 +0200 Subject: [PATCH 4/4] Readme --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 49ab519..a18bf59 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,13 @@ Altes Wählscheibentelefon mit BLE am iPhone verwenden -Anschluss: +## Anschluss: eine Seite auf 3,3V andere Seite auf Pin... -Wählscheibe: +### Wählscheibe: ws-bn = Wählscheibe dreht (nsa / Pin 18) + ge-gn = Impulse (nsi /Pin 19) -Anschlusskabel: +### Anschlusskabel: gn-bn = Gabelumschalter (Pin 21) \ No newline at end of file