aboutsummaryrefslogtreecommitdiffstats
path: root/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts/client_cts.ino
diff options
context:
space:
mode:
Diffstat (limited to 'arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts/client_cts.ino')
-rwxr-xr-xarduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts/client_cts.ino176
1 files changed, 176 insertions, 0 deletions
diff --git a/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts/client_cts.ino b/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts/client_cts.ino
new file mode 100755
index 0000000..ca145b1
--- /dev/null
+++ b/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts/client_cts.ino
@@ -0,0 +1,176 @@
+/*********************************************************************
+ 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 demonstrates the client Current Time Service using the
+ * BLEClientCts API(). After uploading, go to iOS setting and connect
+ * to Bluefruit52, and then press PAIR.
+ *
+ * Note: Currently only iOS act as a CTS server, Android does not. The
+ * easiest way to test this sketch is using an iOS device.
+ *
+ * Current Time Service info:
+ * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.service.current_time.xml
+ * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.current_time.xml
+ * https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.local_time_information.xml
+ */
+
+#include <bluefruit.h>
+
+// BLE Client Current Time Service
+BLEClientCts bleCTime;
+
+void setup()
+{
+ Serial.begin(115200);
+ while ( !Serial ) delay(10); // for nrf52840 with native usb
+
+ Serial.println("Bluefruit52 BLE Client Current Time Example");
+ Serial.println("-------------------------------------------\n");
+
+ Serial.println("Go to iOS's Bluetooth settings and connect to Bluefruit52");
+ Serial.println("It may appear up as 'Accessory' depending on your iOS version.");
+
+ // Config the peripheral connection with maximum bandwidth
+ // more SRAM required by SoftDevice
+ // Note: All config***() function must be called before begin()
+ Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
+
+ Bluefruit.begin();
+ // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
+ Bluefruit.setTxPower(4);
+ Bluefruit.setName("Bluefruit52");
+ Bluefruit.setConnectCallback(connect_callback);
+ Bluefruit.setDisconnectCallback(disconnect_callback);
+
+ // Configure CTS client
+ bleCTime.begin();
+
+ // Callback invoked when iOS device time changes
+ // To test this go to Setting -> Date & Time -> Toggle Time Zone "Set Automatically"
+ // Or change the time manually etc ...
+ bleCTime.setAdjustCallback(cts_adjust_callback);
+
+ // 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();
+ Bluefruit.Advertising.addAppearance(BLE_APPEARANCE_GENERIC_CLOCK);
+
+ // Include CTS client UUID
+ Bluefruit.Advertising.addService(bleCTime);
+
+ // Includes name
+ Bluefruit.Advertising.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()
+{
+ // If service is not yet discovered
+ if ( !bleCTime.discovered() && !Bluefruit.connPaired() ) return;
+
+ // Get Time from iOS once per second
+ // Note it is not advised to update this quickly
+ // Application should use local clock and update time after
+ // a long period (e.g an hour or day)
+ bleCTime.getCurrentTime();
+
+ printTime();
+
+ delay(1000);
+}
+
+void connect_callback(uint16_t conn_handle)
+{
+ Serial.println("Connected");
+
+ Serial.print("Discovering CTS ... ");
+ if ( bleCTime.discover(conn_handle) )
+ {
+ Serial.println("Discovered");
+
+ // iOS requires pairing to work, it makes sense to request security here as well
+ Serial.print("Attempting to PAIR with the iOS device, please press PAIR on your phone ... ");
+ if ( Bluefruit.requestPairing() )
+ {
+ Serial.println("Done");
+ Serial.println("Enabling Time Adjust Notify");
+ bleCTime.enableAdjust();
+
+ Serial.print("Get Current Time chars value");
+ bleCTime.getCurrentTime();
+
+ Serial.print("Get Local Time Info chars value");
+ bleCTime.getLocalTimeInfo();
+
+ Serial.println();
+ }
+
+ Serial.println();
+ }
+}
+
+void cts_adjust_callback(uint8_t reason)
+{
+ const char * reason_str[] = { "Manual", "External Reference", "Change of Time Zone", "Change of DST" };
+
+ Serial.println("iOS Device time changed due to ");
+ Serial.println( reason_str[reason] );
+}
+
+void printTime(void)
+{
+ const char * day_of_week_str[] = { "n/a", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
+
+ Serial.printf("%04d-%02d-%02d ", bleCTime.Time.year, bleCTime.Time.month, bleCTime.Time.day);
+ Serial.printf("%02d:%02d:%02d ", bleCTime.Time.hour, bleCTime.Time.minute, bleCTime.Time.second);
+ Serial.print(day_of_week_str[bleCTime.Time.weekday]);
+
+ int utc_offset = bleCTime.LocalInfo.timezone*15; // in 15 minutes unit
+ Serial.printf(" (UTC %+d:%02d, ", utc_offset/60, utc_offset%60);
+ Serial.printf("DST %+.1f)", ((float) bleCTime.LocalInfo.dst_offset*15)/60 );
+ Serial.println();
+}
+
+/**
+ * Callback invoked when a connection is dropped
+ * @param conn_handle connection where this event happens
+ * @param reason is a BLE_HCI_STATUS_CODE which can be found in ble_hci.h
+ * https://github.com/adafruit/Adafruit_nRF52_Arduino/blob/master/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/ble_hci.h
+ */
+void disconnect_callback(uint16_t conn_handle, uint8_t reason)
+{
+ (void) reason;
+
+ Serial.println();
+ Serial.println("Disconnected");
+}