diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 00000000..cffc2173 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,9 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check/.codespellrc +# See: https://github.com/codespell-project/codespell#using-a-config-file +[codespell] +# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: +ignore-words-list = , +skip = ./.git,./.licenses,__pycache__,node_modules,./go.mod,./go.sum,./package-lock.json,./poetry.lock,./yarn.lock,./extras/test +builtin = clear,informal,en-GB_to_en-US +check-filenames = +check-hidden = diff --git a/.github/workflows/spell-check.yml b/.github/workflows/spell-check.yml index 94b57020..6faf09c8 100644 --- a/.github/workflows/spell-check.yml +++ b/.github/workflows/spell-check.yml @@ -1,16 +1,25 @@ +# Source: https://github.com/per1234/.github/blob/main/workflow-templates/spell-check.md name: Spell Check -on: [push, pull_request] +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch new misspelling detections resulting from dictionary updates. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: jobs: - build: + spellcheck: runs-on: ubuntu-latest + permissions: + contents: read steps: - - name: Checkout + - name: Checkout repository uses: actions/checkout@v4 - name: Spell check - uses: arduino/actions/libraries/spell-check@master - with: - skip-paths: ./extras/test \ No newline at end of file + uses: codespell-project/actions-codespell@v2 diff --git a/CHANGELOG b/CHANGELOG index a29f8598..d8a84716 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,7 +2,7 @@ ArduinoBLE ?.?.? - ????.??.?? ArduinoBLE 1.1.2 - 2019.11.12 -* cordio: switch to lower power when polling with timeout +* cordio: switch to lower power when polling with timeout * Fixed issue with wrong types for disconnection event handling. Thanks @cparata ArduinoBLE 1.1.1 - 2019.09.05 diff --git a/README.md b/README.md index 6808502c..b0027583 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ [![Compile Examples Status](https://github.com/arduino-libraries/ArduinoBLE/workflows/Compile%20Examples/badge.svg)](https://github.com/arduino-libraries/ArduinoBLE/actions?workflow=Compile+Examples) [![Spell Check Status](https://github.com/arduino-libraries/ArduinoBLE/workflows/Spell%20Check/badge.svg)](https://github.com/arduino-libraries/ArduinoBLE/actions?workflow=Spell+Check) -Enables Bluetooth® Low Energy connectivity on the Arduino MKR WiFi 1010, Arduino UNO WiFi Rev.2, Arduino Nano 33 IoT, Arduino Nano 33 BLE, Arduino Portenta H7, Arduino Giga R1 and Arduino UNO R4 WiFi. +Enables Bluetooth® Low Energy connectivity on the Arduino MKR WiFi 1010, Arduino UNO WiFi Rev2, Arduino Nano 33 IoT, Arduino Nano 33 BLE, Arduino Portenta H7, Arduino Giga R1 and Arduino UNO R4 WiFi. This library supports creating a Bluetooth® Low Energy peripheral & central mode. -For the Arduino MKR WiFi 1010, Arduino UNO WiFi Rev.2, and Arduino Nano 33 IoT boards, it requires the NINA module to be running [Arduino NINA-W102 firmware](https://github.com/arduino/nina-fw) v1.2.0 or later. +For the Arduino MKR WiFi 1010, Arduino UNO WiFi Rev2, and Arduino Nano 33 IoT boards, it requires the NINA module to be running [Arduino NINA-W102 firmware](https://github.com/arduino/nina-fw) v1.2.0 or later. For the Arduino UNO R4 WiFi, it requires the ESP32-S3 module to be running [firmware](https://github.com/arduino/uno-r4-wifi-usb-bridge) v0.2.0 or later. diff --git a/docs/api.md b/docs/api.md index 636fe52c..c9f41840 100644 --- a/docs/api.md +++ b/docs/api.md @@ -80,7 +80,7 @@ Poll for Bluetooth® Low Energy radio events and handle them. #### Syntax ``` -BLE.poll() +BLE.poll() BLE.poll(timeout) ``` @@ -100,7 +100,6 @@ Nothing BLE.setEventHandler(BLEConnected, blePeripheralConnectHandler); BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler); - BLE.poll(); @@ -142,7 +141,6 @@ Nothing. BLE.setEventHandler(BLEConnected, blePeripheralConnectHandler); BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler); - void blePeripheralConnectHandler(BLEDevice central) { @@ -176,7 +174,7 @@ BLE.connected() None #### Returns -- **true** if another Bluetooth® Low Energy device is connected, +- **true** if another Bluetooth® Low Energy device is connected, - otherwise **false**. #### Example @@ -208,7 +206,7 @@ BLE.disconnect() None #### Returns -- **true** if any Bluetooth® Low Energy device that was previously connected was disconnected, +- **true** if any Bluetooth® Low Energy device that was previously connected was disconnected, - otherwise **false**. #### Example @@ -216,8 +214,6 @@ None ```arduino if (BLE.connected()) { - - BLE.disconnect(); } @@ -246,9 +242,9 @@ None ```arduino - **String** address = BLE.address(); + String address = BLE.address(); - Serial.print(“Local address is: “); + Serial.print("Local address is: "); Serial.println(address); @@ -277,9 +273,7 @@ None ```arduino if (BLE.connected()) { - - - Serial.print(“RSSI = “); + Serial.print("RSSI = "); Serial.println(BLE.rssi()); } @@ -315,9 +309,9 @@ Nothing while (1); } - BLE.setAdvertisedServiceUuid(“19B10000-E8F2-537E-4F6C-D104768A1214"); + BLE.setAdvertisedServiceUuid("19B10000-E8F2-537E-4F6C-D104768A1214"); - // ... + // ... // start advertising BLE.advertise(); @@ -360,7 +354,7 @@ BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Lo BLE.setAdvertisedService(ledService); - // ... + // ... // start advertising BLE.advertise(); @@ -402,7 +396,7 @@ Nothing BLE.setManufacturerData(data, 5); - // ... + // ... // start advertising BLE.advertise(); @@ -442,7 +436,7 @@ Nothing BLE.setLocalName("LED"); - // ... + // ... // start advertising BLE.advertise(); @@ -453,7 +447,7 @@ Nothing ### `BLE.setDeviceName()` -Set the device name in the built in device name characteristic. If not set, the value defaults “Arduino”. +Set the device name in the built in device name characteristic. If not set, the value defaults to “Arduino”. #### Syntax @@ -482,7 +476,7 @@ Nothing BLE.setDeviceName("LED"); - // ... + // ... // start advertising BLE.advertise(); @@ -493,7 +487,7 @@ Nothing ### `BLE.setAppearance()` -Set the appearance in the built in appearance characteristic. If not set, the value defaults 0x0000. +Set the appearance in the built in appearance characteristic. If not set, the value defaults to 0x0000. #### Syntax @@ -522,7 +516,7 @@ Nothing BLE.setAppearance(0x8000); - // ... + // ... // start advertising BLE.advertise(); @@ -568,7 +562,7 @@ BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Lo BLE.addService(ledService); - // ... + // ... ``` @@ -607,7 +601,7 @@ None BLE.advertise(); - // ... + // ... ``` @@ -645,7 +639,7 @@ Nothing BLE.advertise(); - // ... + // ... BLE.stopAdvertise(); @@ -682,8 +676,6 @@ None Serial.print("Connected to central: "); // print the central's MAC address: Serial.println(central.address()); - - } @@ -820,7 +812,7 @@ BLE.scan(withDuplicates) - **withDuplicates:** optional, defaults to **false**. If **true**, advertisements received more than once will not be filtered #### Returns -- 1 on success, +- 1 on success, - 0 on failure. #### Example @@ -839,7 +831,6 @@ BLE.scan(withDuplicates) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -887,7 +878,6 @@ BLE.scanForName(name, withDuplicates) // start scanning for peripheral BLE.scanForName("LED"); - BLEDevice peripheral = BLE.available(); @@ -916,7 +906,7 @@ BLE.scanForAddress(address, withDuplicates) - **withDuplicates:** optional, defaults to **false**. If **true**, advertisements received more than once will not be filtered #### Returns -- 1 on success, +- 1 on success, - 0 on failure. #### Example @@ -935,7 +925,6 @@ BLE.scanForAddress(address, withDuplicates) // start scanning for peripheral BLE.scanForAddress("aa:bb:cc:ee:dd:ff"); - BLEDevice peripheral = BLE.available(); @@ -983,7 +972,6 @@ BLE.scanForUuid(uuid, withDuplicates) // start scanning for peripheral BLE.scanForUuid("aa10"); - BLEDevice peripheral = BLE.available(); @@ -1028,7 +1016,6 @@ Nothing // start scanning for peripheral BLE.scan(); - BLE.stopScan(); @@ -1068,7 +1055,6 @@ Nothing // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1111,8 +1097,6 @@ Nothing // if a central is connected to peripheral: if (central) { - - central.poll(); // ... @@ -1182,7 +1166,6 @@ None // listen for Bluetooth® Low Energy centrals to connect: BLEDevice central = BLE.central(); - central.disconnect(); @@ -1219,8 +1202,6 @@ None Serial.print("Connected to central: "); // print the central's MAC address: Serial.println(central.address()); - - . } @@ -1249,9 +1230,7 @@ None ```arduino if (bleDevice.connected()) { - - - Serial.print(“RSSI = “); + Serial.print("RSSI = "); Serial.println(bleDevice.rssi()); } @@ -1295,7 +1274,6 @@ bleDevice.characteristic(uuid, index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1321,9 +1299,9 @@ bleDevice.characteristic(uuid, index) return; } - BLECharacteristic batteryLevelCharacterisic = peripheral.characteristic("2a19"); + BLECharacteristic batteryLevelCharacteristic = peripheral.characteristic("2a19"); - if (batteryLevelCharacterisic) { + if (batteryLevelCharacteristic) { // use the characteristic } else { Serial.println("Peripheral does NOT have battery level characteristic"); @@ -1351,7 +1329,7 @@ bleDevice.discoverAttributes() None #### Returns -- **true**, if successful, +- **true**, if successful, - **false** on failure. #### Example @@ -1370,7 +1348,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1437,7 +1414,6 @@ bleDevice.discoverService(serviceUuid) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1503,7 +1479,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1577,7 +1552,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1651,7 +1625,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1725,7 +1698,6 @@ bleDevice.hasService(uuid, index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1798,7 +1770,6 @@ bleDevice.service(uuid, index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1872,7 +1843,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1901,7 +1871,7 @@ None int characteristicCount = peripheral.characteristicCount(); Serial.print(characteristicCount); - Serial.println(" characteristis discovered"); + Serial.println(" characteristics discovered"); // ... } @@ -1927,7 +1897,7 @@ bleDevice.hasCharacteristic(uuid, index) - **index**: optional, index of characteristic to check if the device provides more than on. Defaults to 0, if not provided. #### Returns -- **true**, if the device provides the characteristic, +- **true**, if the device provides the characteristic, - **false** otherwise. #### Example @@ -1946,7 +1916,6 @@ bleDevice.hasCharacteristic(uuid, index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -1998,7 +1967,7 @@ bleDevice.hasLocalName() Nothing #### Returns -- **true**, if the device is advertising a local name, +- **true**, if the device is advertising a local name, - **false** otherwise. #### Example @@ -2017,7 +1986,6 @@ Nothing // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2053,7 +2021,7 @@ bleDevice.hasAdvertisedServiceUuid(index) - **index**: optional, defaults to 0, the index of the service UUID, if the device is advertising more than one. #### Returns -- **true**, if the device is advertising a service UUID, +- **true**, if the device is advertising a service UUID, - **false** otherwise. #### Example @@ -2072,7 +2040,6 @@ bleDevice.hasAdvertisedServiceUuid(index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2129,7 +2096,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2186,7 +2152,6 @@ Nothing // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2240,7 +2205,6 @@ bleDevice.advertisedServiceUuid(index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2279,7 +2243,7 @@ bleDevice.connect() None #### Returns -- **true**, if the connection was successful, +- **true**, if the connection was successful, - **false** otherwise. #### Example @@ -2298,7 +2262,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2376,7 +2339,7 @@ None BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Low Energy LED Service -Serial.print(“LED service UUID = “); +Serial.print("LED service UUID = "); Serial.println(ledService.uuid()); @@ -2385,7 +2348,7 @@ Serial.println(ledService.uuid()); ### `bleService.addCharacteristic()` -Add a BLECharateristic to the Bluetooth® Low Energy service. +Add a BLECharacteristic to the Bluetooth® Low Energy service. #### Syntax @@ -2454,7 +2417,6 @@ None // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2535,7 +2497,6 @@ bleService.hasCharacteristic(uuid, index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); if (peripheral) { @@ -2614,7 +2575,6 @@ bleService.characteristic(uuid, index) // start scanning for peripheral BLE.scan(); - BLEDevice peripheral = BLE.available(); @@ -2644,9 +2604,9 @@ bleService.characteristic(uuid, index) if (batteryService) { // use the service - BLECharacteristic batteryLevelCharacterisic = peripheral.characteristic("2a19"); + BLECharacteristic batteryLevelCharacteristic = peripheral.characteristic("2a19"); - if (batteryLevelCharacterisic) { + if (batteryLevelCharacteristic) { // use the characteristic } else { Serial.println("Peripheral does NOT have battery level characteristic"); @@ -2739,7 +2699,7 @@ None BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); -Serial.print(“Switch characteristic UUID = “); +Serial.print("Switch characteristic UUID = "); Serial.println(switchCharacteristic.uuid()); @@ -2812,7 +2772,7 @@ BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214 -Serial.print(“value size = “); +Serial.print("value size = "); Serial.println(switchCharacteristic.valueSize()); @@ -2845,13 +2805,13 @@ BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214 - if (switchCharacteristic.value()) { // any value other than 0 - Serial.println("LED on"); - digitalWrite(ledPin, HIGH); // will turn the LED on - } else { // a 0 value - Serial.println(F("LED off")); - digitalWrite(ledPin, LOW); // will turn the LED off - } + if (switchCharacteristic.value()) { // any value other than 0 + Serial.println("LED on"); + digitalWrite(ledPin, HIGH); // will turn the LED on + } else { // a 0 value + Serial.println(F("LED off")); + digitalWrite(ledPin, LOW); // will turn the LED off + } @@ -2884,7 +2844,7 @@ BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214 -Serial.print(“value length = “); +Serial.print("value length = "); Serial.println(switchCharacteristic.valueLength()); @@ -2904,7 +2864,7 @@ bleCharacteristic.readValue(value) #### Parameters -- **buffer:** byte array to read value into length: size of buffer argument in bytes +- **buffer:** byte array to read value into length: size of buffer argument in bytes - **value**: variable to read value into (by reference) #### Returns @@ -2958,7 +2918,7 @@ bleCharacteristic.writeValue(value) - **value**: value to write #### Returns -- 1 on success, +- 1 on success, - 0 on failure #### Example @@ -3001,7 +2961,7 @@ bleCharacteristic.setEventHandler(eventType, callback) #### Parameters -- **eventType**: event type (BLESubscribed, BLEUnsubscribed, BLERead, BLEWritten) +- **eventType**: event type (BLESubscribed, BLEUnsubscribed, BLERead, BLEWritten) - **callback**: function to call when the event occurs #### Returns @@ -3035,7 +2995,6 @@ void switchCharacteristicWritten(BLEDevice central, BLECharacteristic characteri } } - ``` @@ -3324,7 +3283,7 @@ bleCharacteristic.canRead() None #### Returns -- **true**, if characteristic is readable, +- **true**, if characteristic is readable, - **false** otherwise #### Example @@ -3354,7 +3313,7 @@ bleCharacteristic.read() None #### Returns -- **true**, if successful, +- **true**, if successful, - **false** on failure #### Example @@ -3669,7 +3628,7 @@ None BLEDescriptor millisLabelDescriptor("2901", "millis"); -Serial.print(“millis label descriptor UUID = “); +Serial.print("millis label descriptor UUID = "); Serial.println(millisLabelDescriptor.uuid()); @@ -3701,7 +3660,7 @@ None BLEDescriptor millisLabelDescriptor("2901", "millis"); -Serial.print(“millis label descriptor value size = “); +Serial.print("millis label descriptor value size = "); Serial.println(millisLabelDescriptor.valueSize()); @@ -3819,7 +3778,7 @@ bleDescriptor.readValue(value) byte value = 0; - /get the value, descriptor is 1 byte so use byte value + // get the value, descriptor is 1 byte so use byte value descriptor.readValue(value); diff --git a/docs/readme.md b/docs/readme.md index 5ba0dfb4..b584d71e 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,6 +1,6 @@ # ArduinoBLE library -This library supports all the Arduino boards that have the hardware enabled for Bluetooth® Low Energy and Bluetooth® 4.0 and above; these include Nano 33 BLE, Arduino NANO 33 IoT, Uno WiFi Rev 2, MKR WiFi 1010, Nicla Sense ME. +This library supports all the Arduino boards that have the hardware enabled for Bluetooth® Low Energy and Bluetooth® 4.0 and above; these include Nano 33 BLE, Arduino NANO 33 IoT, Uno WiFi Rev2, MKR WiFi 1010, Nicla Sense ME. To use this library ``#include `` @@ -9,7 +9,7 @@ To use this library Bluetooth® 4.0 includes both traditional Bluetooth®, now labeled "Bluetooth® Classic", and the Bluetooth® Low Energy. Bluetooth® Low Energy is optimized for low power use at low data rates, and was designed to operate from simple lithium coin cell batteries. -Unlike standard Bluetooth® communication basically based on an asynchronous serial connection (UART) a Bluetooth® LE radio acts like a community bulletin board. The computers that connect to it are like community members that read the bulletin board. Each radio acts as either the bulletin board or the reader. If your radio is a bulletin board (called a peripheral device in Bluetooth® LE parlance) it posts data for all radios in the community to read. If your radio is a reader (called a central device in Blueooth LE terms) it reads from any of the bulletin boards (peripheral devices) that have information about which it cares. You can also think of peripheral devices as the servers in a client-server transaction, because they contain the information that reader radios ask for. Similarly, central devices are the clients of the Bluetooth® LE world because they read information available from the peripherals. +Unlike standard Bluetooth® communication basically based on an asynchronous serial connection (UART) a Bluetooth® LE radio acts like a community bulletin board. The computers that connect to it are like community members that read the bulletin board. Each radio acts as either the bulletin board or the reader. If your radio is a bulletin board (called a peripheral device in Bluetooth® LE parlance) it posts data for all radios in the community to read. If your radio is a reader (called a central device in Bluetooth LE terms) it reads from any of the bulletin boards (peripheral devices) that have information about which it cares. You can also think of peripheral devices as the servers in a client-server transaction, because they contain the information that reader radios ask for. Similarly, central devices are the clients of the Bluetooth® LE world because they read information available from the peripherals. ![Communication between central and peripheral devices](https://raw.githubusercontent.com/arduino-libraries/ArduinoBLE/master/docs/assets/ble-bulletin-board-model.png) @@ -19,7 +19,7 @@ The information presented by a peripheral is structured as **services**, each of ## Notify -The Bluetooth® LE specification includes a mechanism known as **notify** that lets you know when data's changed. When notify on a characteristic is enabled and the sender writes to it, the new value is automatically sent to the receiver, without the receiver explicitly issuing a read command. This is commonly used for streaming data such as accelerometer or other sensor readings. There's a variation on this specification called **indicate** which works similarly, but in the indicate specification, the reader sends an acknowledgement of the pushed data. +The Bluetooth® LE specification includes a mechanism known as **notify** that lets you know when data's changed. When notify on a characteristic is enabled and the sender writes to it, the new value is automatically sent to the receiver, without the receiver explicitly issuing a read command. This is commonly used for streaming data such as accelerometer or other sensor readings. There's a variation on this specification called **indicate** which works similarly, but in the indicate specification, the reader sends an acknowledgment of the pushed data. The client-server structure of Bluetooth® LE, combined with the notify characteristic, is generally called a **publish-and-subscribe model**. @@ -58,7 +58,7 @@ You could also combine readings into a single characteristic, when a given senso |Motor Speed, Direction|150,1| |Accelerometer X, Y, Z|200,133,150| -This is more efficient, but you need to be careful not to exceed the 512-byte limit. The accelerometer characteristic above, for example, takes 11 bytes as a ASCII-encoded string. +This is more efficient, but you need to be careful not to exceed the 512-byte limit. The accelerometer characteristic above, for example, takes 11 bytes as an ASCII-encoded string. ## Read/write/notify/indicate diff --git a/examples/Central/SensorTagButton/SensorTagButton.ino b/examples/Central/SensorTagButton/SensorTagButton.ino index a56504f6..27c421fe 100644 --- a/examples/Central/SensorTagButton/SensorTagButton.ino +++ b/examples/Central/SensorTagButton/SensorTagButton.ino @@ -114,7 +114,7 @@ void monitorSensorTagButtons(BLEDevice peripheral) { if (simpleKeyCharacteristic.valueUpdated()) { // yes, get the value, characteristic is 1 byte so use byte value byte value = 0; - + simpleKeyCharacteristic.readValue(value); if (value & 0x01) { diff --git a/examples/Peripheral/Advertising/RawDataAdvertising/RawDataAdvertising.ino b/examples/Peripheral/Advertising/RawDataAdvertising/RawDataAdvertising.ino index d025dd62..5e7ba7f3 100644 --- a/examples/Peripheral/Advertising/RawDataAdvertising/RawDataAdvertising.ino +++ b/examples/Peripheral/Advertising/RawDataAdvertising/RawDataAdvertising.ino @@ -4,7 +4,7 @@ BLEService myService("fff0"); BLEIntCharacteristic myCharacteristic("fff1", BLERead | BLEBroadcast); // Advertising parameters should have a global scope. Do NOT define them in 'setup' or in 'loop' -const uint8_t completeRawAdvertisingData[] = {0x02,0x01,0x06,0x09,0xff,0x01,0x01,0x00,0x01,0x02,0x03,0x04,0x05}; +const uint8_t completeRawAdvertisingData[] = {0x02,0x01,0x06,0x09,0xff,0x01,0x01,0x00,0x01,0x02,0x03,0x04,0x05}; void setup() { Serial.begin(9600); @@ -21,7 +21,7 @@ void setup() { // Build advertising data packet BLEAdvertisingData advData; // If a packet has a raw data parameter, then all the other parameters of the packet will be ignored - advData.setRawData(completeRawAdvertisingData, sizeof(completeRawAdvertisingData)); + advData.setRawData(completeRawAdvertisingData, sizeof(completeRawAdvertisingData)); // Copy set parameters in the actual advertising packet BLE.setAdvertisingData(advData); @@ -30,7 +30,7 @@ void setup() { scanData.setLocalName("Test advertising raw data"); // Copy set parameters in the actual scan response packet BLE.setScanResponseData(scanData); - + BLE.advertise(); Serial.println("advertising ..."); diff --git a/examples/Peripheral/BatteryMonitor/BatteryMonitor.ino b/examples/Peripheral/BatteryMonitor/BatteryMonitor.ino index f013c6f5..0d786627 100644 --- a/examples/Peripheral/BatteryMonitor/BatteryMonitor.ino +++ b/examples/Peripheral/BatteryMonitor/BatteryMonitor.ino @@ -73,11 +73,11 @@ void loop() { // turn on the LED to indicate the connection: digitalWrite(LED_BUILTIN, HIGH); - // check the battery level every 200ms + // check the battery level every 200 ms // while the central is connected: while (central.connected()) { long currentMillis = millis(); - // if 200ms have passed, check the battery level: + // if 200 ms have passed, check the battery level: if (currentMillis - previousMillis >= 200) { previousMillis = currentMillis; updateBatteryLevel(); diff --git a/examples/Peripheral/CallbackLED/CallbackLED.ino b/examples/Peripheral/CallbackLED/CallbackLED.ino index 23f67bc3..59bda5ed 100644 --- a/examples/Peripheral/CallbackLED/CallbackLED.ino +++ b/examples/Peripheral/CallbackLED/CallbackLED.ino @@ -28,7 +28,7 @@ const int ledPin = LED_BUILTIN; // pin to use for the LED void setup() { Serial.begin(9600); while (!Serial); - + pinMode(ledPin, OUTPUT); // use the LED pin as an output // begin initialization diff --git a/examples/Peripheral/EncryptedBatteryMonitor/EncryptedBatteryMonitor.ino b/examples/Peripheral/EncryptedBatteryMonitor/EncryptedBatteryMonitor.ino index 9f9d453b..dfc9f4a0 100644 --- a/examples/Peripheral/EncryptedBatteryMonitor/EncryptedBatteryMonitor.ino +++ b/examples/Peripheral/EncryptedBatteryMonitor/EncryptedBatteryMonitor.ino @@ -54,7 +54,7 @@ void setup() { Serial.println("Serial connected"); - + // Callback function with confirmation code when new device is pairing. BLE.setDisplayCode([](uint32_t confirmCode){ Serial.println("New device pairing request."); @@ -63,7 +63,7 @@ void setup() { sprintf(code, "%06d", confirmCode); Serial.println(code); }); - + // Callback to allow accepting or rejecting pairing BLE.setBinaryConfirmPairing([&acceptOrReject](){ Serial.print("Should we confirm pairing? "); @@ -98,7 +98,7 @@ void setup() { (*BDaddrTypes)[0] = 0; // Type 0 is for pubc address, type 1 is for static random - (*BDAddrs)[0] = new uint8_t[6]; + (*BDAddrs)[0] = new uint8_t[6]; (*IRKs)[0] = new uint8_t[16]; memcpy((*IRKs)[0] , device1IRK,16); memcpy((*BDAddrs)[0], device1Mac, 6); @@ -124,7 +124,7 @@ void setup() { uint8_t device1LTK[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t device2Mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uint8_t device2LTK[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - + if(memcmp(device1Mac, address, 6) == 0) { memcpy(LTK, device1LTK, 16); @@ -159,7 +159,7 @@ void setup() { } Serial.println("BT init"); delay(200); - + /* Set a local name for the BLE device This name will appear in advertising packets and can be used by remote devices to identify this BLE device @@ -180,16 +180,16 @@ void setup() { stringCharValue = "string"; stringcharacteristic.writeValue(stringCharValue); secretValue.writeValue(0); - + delay(1000); // prevent pairing until button is pressed (will show a pairing rejected message) BLE.setPairable(false); - + /* Start advertising BLE. It will start continuously transmitting BLE advertising packets and will be visible to remote BLE central devices until it receives a new connection */ - + // start advertising if(!BLE.advertise()){ Serial.println("failed to advertise bluetooth."); @@ -214,13 +214,13 @@ void loop() { if (!BLE.pairable() && digitalRead(PAIR_BUTTON) == LOW){ pairingStarted = millis(); BLE.setPairable(Pairable::ONCE); - Serial.println("Accepting pairing for 30s"); + Serial.println("Accepting pairing for 30 s"); } else if (BLE.pairable() && millis() > pairingStarted + PAIR_INTERVAL){ BLE.setPairable(false); Serial.println("No longer accepting pairing"); } // Make LED blink while pairing is allowed - digitalWrite(PAIR_LED, (BLE.pairable() ? (millis()%400)<200 : BLE.paired()) ? PAIR_LED_ON : !PAIR_LED_ON); + digitalWrite(PAIR_LED, (BLE.pairable() ? (millis()%400)<200 : BLE.paired()) ? PAIR_LED_ON : !PAIR_LED_ON); // if a central is connected to the peripheral: @@ -246,7 +246,7 @@ void loop() { Serial.print("Disconnected from central: "); Serial.println(central.address()); } - + } void updateBatteryLevel() { diff --git a/examples/Peripheral/LED/LED.ino b/examples/Peripheral/LED/LED.ino index 2e6d6db9..65b88605 100644 --- a/examples/Peripheral/LED/LED.ino +++ b/examples/Peripheral/LED/LED.ino @@ -48,7 +48,7 @@ void setup() { // add service BLE.addService(ledService); - // set the initial value for the characeristic: + // set the initial value for the characteristic: switchCharacteristic.writeValue(0); // start advertising diff --git a/library.properties b/library.properties index 543998b7..6e248f5f 100644 --- a/library.properties +++ b/library.properties @@ -2,7 +2,7 @@ name=ArduinoBLE version=1.3.7 author=Arduino maintainer=Arduino -sentence=Enables Bluetooth® Low Energy connectivity on the Arduino MKR WiFi 1010, Arduino UNO WiFi Rev.2, Arduino Nano 33 IoT, Arduino Nano 33 BLE, Nicla Sense ME and UNO R4 WiFi. +sentence=Enables Bluetooth® Low Energy connectivity on the Arduino MKR WiFi 1010, Arduino UNO WiFi Rev2, Arduino Nano 33 IoT, Arduino Nano 33 BLE, Nicla Sense ME and UNO R4 WiFi. paragraph=This library supports creating a Bluetooth® Low Energy peripheral & central mode. category=Communication url=https://www.arduino.cc/en/Reference/ArduinoBLE diff --git a/src/utility/HCI.cpp b/src/utility/HCI.cpp index e9743758..fb30b3ca 100644 --- a/src/utility/HCI.cpp +++ b/src/utility/HCI.cpp @@ -137,7 +137,7 @@ void HCIClass::poll(unsigned long timeout) while (HCITransport.available()) { byte b = HCITransport.read(); - + if (_recvIndex >= sizeof(_recvBuffer)) { _recvIndex = 0; if (_debug) { @@ -161,7 +161,7 @@ void HCIClass::poll(unsigned long timeout) handleAclDataPkt(pktLen, &_recvBuffer[1]); #ifdef ARDUINO_AVR_UNO_WIFI_REV2 - digitalWrite(NINA_RTS, LOW); + digitalWrite(NINA_RTS, LOW); #endif } } else if (_recvBuffer[0] == HCI_EVENT_PKT) { @@ -363,7 +363,7 @@ int HCIClass::leSetAdvertiseEnable(uint8_t enable) return sendCommand(OGF_LE_CTL << 10 | OCF_LE_SET_ADVERTISE_ENABLE, sizeof(enable), &enable); } -int HCIClass::leSetScanParameters(uint8_t type, uint16_t interval, uint16_t window, +int HCIClass::leSetScanParameters(uint8_t type, uint16_t interval, uint16_t window, uint8_t ownBdaddrType, uint8_t filter) { struct __attribute__ ((packed)) HCILeSetScanParameters { @@ -437,7 +437,7 @@ int HCIClass::leCancelConn() return sendCommand(OGF_LE_CTL << 10 | OCF_LE_CANCEL_CONN, 0, NULL); } -int HCIClass::leConnUpdate(uint16_t handle, uint16_t minInterval, uint16_t maxInterval, +int HCIClass::leConnUpdate(uint16_t handle, uint16_t minInterval, uint16_t maxInterval, uint16_t latency, uint16_t supervisionTimeout) { struct __attribute__ ((packed)) HCILeConnUpdateData { @@ -464,7 +464,7 @@ void HCIClass::saveNewAddress(uint8_t addressType, uint8_t* address, uint8_t* pe if(_storeIRK!=0){ _storeIRK(address, peerIrk); } - // Again... this should work + // Again... this should work // leAddResolvingAddress(addressType, address, peerIrk, localIrk); } void HCIClass::leAddResolvingAddress(uint8_t addressType, uint8_t* peerAddress, uint8_t* peerIrk, uint8_t* localIrk){ @@ -490,7 +490,7 @@ void HCIClass::leAddResolvingAddress(uint8_t addressType, uint8_t* peerAddress, btct.printBytes(addDevice.peerIRK,16); Serial.print("localIRK :"); btct.printBytes(addDevice.localIRK,16); - sendCommand(OGF_LE_CTL << 10 | 0x27, sizeof(addDevice), &addDevice); + sendCommand(OGF_LE_CTL << 10 | 0x27, sizeof(addDevice), &addDevice); leStartResolvingAddresses(); } @@ -509,7 +509,7 @@ int HCIClass::leReadPeerResolvableAddress(uint8_t peerAddressType, uint8_t* peer } request; request.addressType = peerAddressType; for(int i=0; i<6; i++) request.identityAddress[5-i] = peerIdentityAddress[i]; - + int res = sendCommand(OGF_LE_CTL << 10 | 0x2B, sizeof(request), &request); Serial.print("res: 0x"); @@ -604,7 +604,7 @@ int HCIClass::tryResolveAddress(uint8_t* BDAddr, uint8_t* address){ delete BADDRs; delete[] (*IRKs); delete IRKs; - + if(foundMatch){ return 1; } @@ -688,7 +688,6 @@ int HCIClass::sendCommand(uint16_t opcode, uint8_t plen, void* parameters) for(int i=0; i< sizeof(pktHdr) + plen;i++){ Serial.print(" 0x"); Serial.print(txBuffer[i],HEX); - } Serial.println(""); #endif @@ -758,7 +757,7 @@ void HCIClass::handleAclDataPkt(uint8_t /*plen*/, uint8_t pdata[]) } } else if (aclHdr->cid == SIGNALING_CID) { #ifdef _BLE_TRACE_ - Serial.println("Signalling"); + Serial.println("Signaling"); #endif L2CAPSignaling.handleData(aclHdr->handle & 0x0fff, aclHdr->len, &_recvBuffer[1 + sizeof(HCIACLHdr)]); } else if (aclHdr->cid == SECURITY_CID){ @@ -853,7 +852,7 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) } // From page 1681 bluetooth standard - order matters if(ATT.localKeyDistribution.IdKey()){ - /// We shall distribute IRK and address using identity information + /// We shall distribute IRK and address using identity information { uint8_t response[17]; response[0] = CONNECTION_IDENTITY_INFORMATION; // Identity information. @@ -1002,7 +1001,7 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) uint16_t supervisionTimeout; uint8_t masterClockAccuracy; } *leConnectionComplete = (EvtLeConnectionComplete*)&pdata[sizeof(HCIEventHdr) + sizeof(LeMetaEventHeader)]; - + if (leConnectionComplete->status == 0x00) { ATT.addConnection(leConnectionComplete->handle, leConnectionComplete->role, @@ -1051,7 +1050,7 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) uint16_t supervisionTimeout; uint8_t masterClockAccuracy; } *leConnectionComplete = (EvtLeConnectionComplete*)&pdata[sizeof(HCIEventHdr) + sizeof(LeMetaEventHeader)]; - + if (leConnectionComplete->status == 0x00) { ATT.addConnection(leConnectionComplete->handle, leConnectionComplete->role, @@ -1127,7 +1126,7 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) uint8_t resolvableAddr[6]; uint8_t foundLTK; ATT.getPeerAddrWithType(ltkRequest->connectionHandle, peerAddr); - + if((ATT.getPeerEncryption(ltkRequest->connectionHandle) & PEER_ENCRYPTION::PAIRING_REQUEST)>0){ // Pairing request - LTK is one in buffer already foundLTK = 1; @@ -1207,7 +1206,7 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) Serial.print("Timeout : "); btct.printBytes((uint8_t*)&remoteConnParamReq->timeOut,2); #endif - + struct __attribute__ ((packed)) RemoteConnParamReqReply { uint16_t connectionHandle; uint16_t intervalMin; @@ -1253,13 +1252,13 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) HCI.sendAclPkt(connectionHandle,SECURITY_CID,sizeof(PairingPublicKey),&pairingPublicKey); uint8_t encryption = ATT.getPeerEncryption(connectionHandle) | PEER_ENCRYPTION::SENT_PUBKEY; ATT.setPeerEncryption(connectionHandle, encryption); - + uint8_t Z = 0; - + HCI.leRand(Nb); HCI.leRand(&Nb[8]); - + #ifdef _BLE_TRACE_ Serial.print("nb: "); btct.printBytes(Nb, 16); @@ -1271,16 +1270,16 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) uint8_t Z; } f4Params = {0,0,Z}; for(int i=0; i<32; i++){ - f4Params.U[31-i] = pairingPublicKey.publicKey[i]; + f4Params.U[31-i] = pairingPublicKey.publicKey[i]; f4Params.V[31-i] = HCI.remotePublicKeyBuffer[i]; } - + struct __attribute__ ((packed)) PairingConfirm { uint8_t code; uint8_t cb[16]; } pairingConfirm = {CONNECTION_PAIRING_CONFIRM,0}; - + btct.AES_CMAC(Nb,(unsigned char *)&f4Params,sizeof(f4Params),pairingConfirm.cb); #ifdef _BLE_TRACE_ @@ -1297,7 +1296,7 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) // Send Pairing confirm response HCI.sendAclPkt(connectionHandle, SECURITY_CID, sizeof(pairingConfirm), &pairingConfirm); - + HCI.sendCommand( (OGF_LE_CTL << 10) | LE_COMMAND::GENERATE_DH_KEY_V1, sizeof(HCI.remotePublicKeyBuffer), HCI.remotePublicKeyBuffer); }else{ #ifdef _BLE_TRACE_ @@ -1329,8 +1328,8 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) #endif break; } - - + + for(int i=0; i<32; i++) DHKey[31-i] = evtLeDHKeyComplete->DHKey[i]; #ifdef _BLE_TRACE_ @@ -1345,7 +1344,7 @@ void HCIClass::handleEventPkt(uint8_t /*plen*/, uint8_t pdata[]) Serial.println("Received DHKey check already so calculate f5, f6 now."); #endif L2CAPSignaling.smCalculateLTKandConfirm(connectionHandle, HCI.remoteDHKeyCheckBuffer); - + }else{ #ifdef _BLE_TRACE_ Serial.println("Waiting on other DHKey check before calculating."); @@ -1382,7 +1381,7 @@ int HCIClass::leEncrypt(uint8_t* key, uint8_t* plaintext, uint8_t* status, uint8 leEncryptCommand.key[15-i] = key[i]; leEncryptCommand.plaintext[15-i] = plaintext[i]; } - + int res = sendCommand(OGF_LE_CTL << 10 | LE_COMMAND::ENCRYPT, 32, &leEncryptCommand); if(res == 0){ #ifdef _BLE_TRACE_