aboutsummaryrefslogtreecommitdiffstats
path: root/arduino/libraries/Bluefruit52Lib/examples/DualRoles/dual_bleuart/dual_bleuart.ino
diff options
context:
space:
mode:
Diffstat (limited to 'arduino/libraries/Bluefruit52Lib/examples/DualRoles/dual_bleuart/dual_bleuart.ino')
-rwxr-xr-xarduino/libraries/Bluefruit52Lib/examples/DualRoles/dual_bleuart/dual_bleuart.ino212
1 files changed, 212 insertions, 0 deletions
diff --git a/arduino/libraries/Bluefruit52Lib/examples/DualRoles/dual_bleuart/dual_bleuart.ino b/arduino/libraries/Bluefruit52Lib/examples/DualRoles/dual_bleuart/dual_bleuart.ino
new file mode 100755
index 0000000..236dd02
--- /dev/null
+++ b/arduino/libraries/Bluefruit52Lib/examples/DualRoles/dual_bleuart/dual_bleuart.ino
@@ -0,0 +1,212 @@
+/*********************************************************************
+ This is an example for our nRF52 based Bluefruit LE modules
+
+ Pick one up today in the adafruit shop!
+
+ Adafruit invests time and resources providing this open source code,
+ please support Adafruit and open-source hardware by purchasing
+ products from Adafruit!
+
+ MIT license, check LICENSE for more information
+ All text above, and the splash screen below must be included in
+ any redistribution
+*********************************************************************/
+
+/*
+ * This sketch demonstrate how to run both Central and Peripheral roles
+ * at the same time. It will act as a relay between an central (mobile)
+ * to another peripheral using bleuart service.
+ *
+ * Mobile <--> DualRole <--> peripheral Ble Uart
+ */
+#include <bluefruit.h>
+
+// Peripheral uart service
+BLEUart bleuart;
+
+// Central uart client
+BLEClientUart clientUart;
+
+void setup()
+{
+ Serial.begin(115200);
+ while ( !Serial ) delay(10); // for nrf52840 with native usb
+
+ Serial.println("Bluefruit52 Dual Role BLEUART Example");
+ Serial.println("-------------------------------------\n");
+
+ // Initialize Bluefruit with max concurrent connections as Peripheral = 1, Central = 1
+ // SRAM usage required by SoftDevice will increase with number of connections
+ Bluefruit.begin(1, 1);
+ // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
+ Bluefruit.setTxPower(4);
+ Bluefruit.setName("Bluefruit52 duo");
+
+ // Callbacks for Peripheral
+ Bluefruit.setConnectCallback(prph_connect_callback);
+ Bluefruit.setDisconnectCallback(prph_disconnect_callback);
+
+ // Callbacks for Central
+ Bluefruit.Central.setConnectCallback(cent_connect_callback);
+ Bluefruit.Central.setDisconnectCallback(cent_disconnect_callback);
+
+ // Configure and Start BLE Uart Service
+ bleuart.begin();
+ bleuart.setRxCallback(prph_bleuart_rx_callback);
+
+ // Init BLE Central Uart Serivce
+ clientUart.begin();
+ clientUart.setRxCallback(cent_bleuart_rx_callback);
+
+
+ /* Start Central Scanning
+ * - Enable auto scan if disconnected
+ * - Interval = 100 ms, window = 80 ms
+ * - Filter only accept bleuart service
+ * - Don't use active scan
+ * - Start(timeout) with timeout = 0 will scan forever (until connected)
+ */
+ Bluefruit.Scanner.setRxCallback(scan_callback);
+ Bluefruit.Scanner.restartOnDisconnect(true);
+ Bluefruit.Scanner.setInterval(160, 80); // in unit of 0.625 ms
+ Bluefruit.Scanner.filterUuid(bleuart.uuid);
+ Bluefruit.Scanner.useActiveScan(false);
+ Bluefruit.Scanner.start(0); // 0 = Don't stop scanning after n seconds
+
+ // Set up and start advertising
+ startAdv();
+}
+
+void startAdv(void)
+{
+ // Advertising packet
+ Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
+ Bluefruit.Advertising.addTxPower();
+
+ // Include bleuart 128-bit uuid
+ Bluefruit.Advertising.addService(bleuart);
+
+ // Secondary Scan Response packet (optional)
+ // Since there is no room for 'Name' in Advertising packet
+ Bluefruit.ScanResponse.addName();
+
+ /* Start Advertising
+ * - Enable auto advertising if disconnected
+ * - Interval: fast mode = 20 ms, slow mode = 152.5 ms
+ * - Timeout for fast mode is 30 seconds
+ * - Start(timeout) with timeout = 0 will advertise forever (until connected)
+ *
+ * For recommended advertising interval
+ * https://developer.apple.com/library/content/qa/qa1931/_index.html
+ */
+ Bluefruit.Advertising.restartOnDisconnect(true);
+ Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
+ Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
+ Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
+}
+
+void loop()
+{
+ // do nothing, all the work is done in callback
+}
+
+/*------------------------------------------------------------------*/
+/* Peripheral
+ *------------------------------------------------------------------*/
+void prph_connect_callback(uint16_t conn_handle)
+{
+ char peer_name[32] = { 0 };
+ Bluefruit.Gap.getPeerName(conn_handle, peer_name, sizeof(peer_name));
+
+ Serial.print("[Prph] Connected to ");
+ Serial.println(peer_name);
+}
+
+void prph_disconnect_callback(uint16_t conn_handle, uint8_t reason)
+{
+ (void) conn_handle;
+ (void) reason;
+
+ Serial.println();
+ Serial.println("[Prph] Disconnected");
+}
+
+void prph_bleuart_rx_callback(void)
+{
+ // Forward data from Mobile to our peripheral
+ char str[20+1] = { 0 };
+ bleuart.read(str, 20);
+
+ Serial.print("[Prph] RX: ");
+ Serial.println(str);
+
+ if ( clientUart.discovered() )
+ {
+ clientUart.print(str);
+ }else
+ {
+ bleuart.println("[Prph] Central role not connected");
+ }
+}
+
+/*------------------------------------------------------------------*/
+/* Central
+ *------------------------------------------------------------------*/
+void scan_callback(ble_gap_evt_adv_report_t* report)
+{
+ // Since we configure the scanner with filterUuid()
+ // Scan callback only invoked for device with bleuart service advertised
+ // Connect to the device with bleuart service in advertising packet
+ Bluefruit.Central.connect(report);
+}
+
+void cent_connect_callback(uint16_t conn_handle)
+{
+ char peer_name[32] = { 0 };
+ Bluefruit.Gap.getPeerName(conn_handle, peer_name, sizeof(peer_name));
+
+ Serial.print("[Cent] Connected to ");
+ Serial.println(peer_name);;
+
+ if ( clientUart.discover(conn_handle) )
+ {
+ // Enable TXD's notify
+ clientUart.enableTXD();
+ }else
+ {
+ // disconect since we couldn't find bleuart service
+ Bluefruit.Central.disconnect(conn_handle);
+ }
+}
+
+void cent_disconnect_callback(uint16_t conn_handle, uint8_t reason)
+{
+ (void) conn_handle;
+ (void) reason;
+
+ Serial.println("[Cent] Disconnected");
+}
+
+/**
+ * Callback invoked when uart received data
+ * @param cent_uart Reference object to the service where the data
+ * arrived. In this example it is clientUart
+ */
+void cent_bleuart_rx_callback(BLEClientUart& cent_uart)
+{
+ char str[20+1] = { 0 };
+ cent_uart.read(str, 20);
+
+ Serial.print("[Cent] RX: ");
+ Serial.println(str);
+
+ if ( bleuart.notifyEnabled() )
+ {
+ // Forward data from our peripheral to Mobile
+ bleuart.print( str );
+ }else
+ {
+ // response with no prph message
+ clientUart.println("[Cent] Peripheral role not connected");
+ }
+}