aboutsummaryrefslogtreecommitdiffstats
path: root/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts_oled
diff options
context:
space:
mode:
authorClyne Sullivan <tullivan99@gmail.com>2019-02-28 17:04:22 -0500
committerClyne Sullivan <tullivan99@gmail.com>2019-02-28 17:04:22 -0500
commitd6869d1ec4bd24cd2c3eafa534f0849b25ec5607 (patch)
tree79e54ed27b39c31864895535d11399708d5a45c0 /arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts_oled
parent614ee97bf3a2270c413527a7f35c54cbecd9e601 (diff)
added basic code
Diffstat (limited to 'arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts_oled')
-rwxr-xr-xarduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts_oled/client_cts_oled.ino193
1 files changed, 193 insertions, 0 deletions
diff --git a/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts_oled/client_cts_oled.ino b/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts_oled/client_cts_oled.ino
new file mode 100755
index 0000000..f9a220c
--- /dev/null
+++ b/arduino/libraries/Bluefruit52Lib/examples/Peripheral/client_cts_oled/client_cts_oled.ino
@@ -0,0 +1,193 @@
+/*********************************************************************
+ 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.
+ *
+ * This sketch is similar to client_cts but also uses a Feather OLED Wing
+ * to display time https://www.adafruit.com/product/2900
+ *
+ * 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>
+#include <Adafruit_GFX.h>
+#include <Adafruit_SSD1306.h>
+
+#define OLED_RESET 4
+Adafruit_SSD1306 oled(OLED_RESET);
+
+// BLE Client Current Time Service
+BLEClientCts bleCTime;
+
+void setup()
+{
+ // init with the I2C addr 0x3C (for the 128x32) and show splashscreen
+ oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
+ oled.display();
+
+ oled.setTextSize(1);// max is 4 line, 21 chars each
+ oled.setTextColor(WHITE);
+
+ // 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();
+
+ // Set up and start advertising
+ startAdv();
+
+ // splash screen effect
+ delay(100);
+
+ oled.clearDisplay();
+ oled.setCursor(0, 0);
+ oled.println("Waiting to connect");
+ oled.display();
+}
+
+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();
+ bleCTime.getLocalTimeInfo();
+
+ printTime();
+
+ delay(1000);
+}
+
+void connect_callback(uint16_t conn_handle)
+{
+ oled.clearDisplay();
+ oled.setCursor(0, 0);
+ oled.println("Connected.");
+ oled.print("Discovering ... ");
+ oled.display();
+
+ if ( bleCTime.discover(conn_handle) )
+ {
+ oled.println("OK");
+
+ // ANCS requires pairing to work
+ oled.print("Paring ... ");
+
+ oled.display();
+
+ if ( Bluefruit.requestPairing() )
+ {
+ oled.println("OK");
+
+ bleCTime.enableAdjust();
+
+ oled.println("Receiving Time...");
+ bleCTime.getCurrentTime();
+ bleCTime.getLocalTimeInfo();
+ }
+ }
+
+ oled.display();
+}
+
+void printTime(void)
+{
+ const char * day_of_week_str[] = { "n/a", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
+ const char * month_str[] = { "na", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+ oled.clearDisplay();
+ oled.setCursor(0, 0);
+
+ oled.print(day_of_week_str[bleCTime.Time.weekday]);
+ oled.printf(" %s %02d %04d\n", month_str[bleCTime.Time.month], bleCTime.Time.day, bleCTime.Time.year);
+
+
+ oled.setTextSize(2);
+ oled.printf(" %02d:%02d:%02d\n", bleCTime.Time.hour, bleCTime.Time.minute, bleCTime.Time.second);
+
+ int utc_offset = bleCTime.LocalInfo.timezone*15; // in 15 minutes unit
+
+ oled.setTextSize(1);
+ oled.printf("UTC %+d:%02d, ", utc_offset/60, utc_offset%60);
+ oled.printf("DST %+.1f", ((float) bleCTime.LocalInfo.dst_offset*15)/60 );
+ oled.println();
+
+ oled.display();
+}
+
+/**
+ * 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;
+
+ oled.clearDisplay();
+ oled.setCursor(0, 0);
+ oled.println("Waiting to connect");
+ oled.display();
+}